1.1 原由html
今天在搜索关于Linux下的后门姿式时,发现一条命令以下:
软连接后门:linux
1
ln-sf/usr/sbin/sshd/tmp/su;/tmp/su-oPort=5555;
经典后门。直接对sshd创建软链接,以后用任意密码登陆便可。
ssh root@x.x.x.x -p 5555这个是你们也常常会用到的命令,可是在好奇心的驱使下,为何任意密码就能够了?
因而搜索了相关的资料,发现都是执行了这条命令就能够免密码登陆了,可是为何却没有一篇详细的解答。
1.2 调查git
首先测试一下这个命令:github
在A的机器上执行了以下命令:centos
1
ln-sf/usr/sbin/sshd/tmp/su;/tmp/su-oPort=5555;
在B机器SSH登陆A机器,输入任意密码,成功登陆。
先理解这条命令主要在作什么:
首先,作一个软连接,结果在/tmp/su 参数的意义: -o option -p port
这样就开启了一个端口为5555的服务:
测试过程当中发现,只容许命名为su,命名其余尝试登陆都不成功(/tmp/xxx)。
因而看了一下sshd相关的log,发现以下:
发现是基于pam认证的,使用了pam中的su,为了区分是否和/bin/中的su是否相关,作了测试以下:session
把/bin/su 从新命名为其余文件,发现依然可以任意密码登陆,又作了测试以下:ssh
1
cp/etc/pam.d/su/etc/pam.d/xxx
在此执行:测试
1
ln-sf/usr/sbin/sshd/tmp/xxx;/tmp/xxx-oPort=5555;
成功登陆,根据日志和实践如今确认调用的是/etc/pam.d/suui
1.3 疑问spa
如今确认了是pam中的su致使的,为何就不须要密码就能够登陆?
简单的diff了一下pam中的sshd和su的区别:
这里须要了解一下PAM中的控制标记:
sshd的pam认证使用了required和include,su使用了sufficient,在此就能够看出两者的区别了。
咱们发现su的认证使用了pam_rootok.so,他是如何验证的,为何致使咱们输入任何密码就经过。
因而查了下pam_rootok.so的相关信息:
他的认证模块是认证你的UID是否为0,他会return pam的结果。
再去看一下pam_rootok.so的源码,发现:
他先会调用getuid(),若是get的uid为0,他会检查selinux的root是否为0或是否启用selinux下为0,返回认证成功,不然认证失败。
那么getuid()是从哪里来的,查一下官网:
是根据进程来取得的,根据pam_rootok的文档,咱们也能够对su进行调试:
pam_rootok.so返回成功,依次向下执行so,都会成功,创建会话。
查看log:
第一条:
1
pam_rootok(su:auth):authentication succeeded
1.4 真相
至此也终于清楚了为何就能够输入任意密码进行登陆。
咱们从新捋一捋:
1.5 彩蛋
实际的真相就是在pam中的pam_rootok模块,pam_rootok经过了认证还会一次向下执行,可是下面的都会依赖于pam_rootok的认证,auth =>account =>session:
经过查找其实不仅仅是su存在pam_rootok,只要知足了上述的三个条件均可以进行”任意密码登陆”。
1.6 参考资料
https://linux.die.net/man/8/pam_rootok
https://fossies.org/dox/Linux-PAM-1.3.0/pam__rootok_8c_source.html
https://fossies.org/dox/Linux-PAM-1.3.0/pam__succeed__if_8c.html
https://fossies.org/dox/Linux-PAM-1.3.0/pam__succeed__if_8c_source.html
http://man7.org/linux/man-pages/man2/getuid.2.html
http://www.tuxradar.com/content/how-pam-works
http://www.centoscn.com/CentOS/help/2014/0504/2899.html