0x01 起因
某天 Sevck 在群里 发了一句在网上流传的后门:1
ln -sf /usr/sbin/sshd /tmp/su; /tmp/su -oPort=5555
命令的意思就是将sshd做个软连接新建到/tmp/su,之后开放5555端口。
通过ssh root@X.X.X.X -p 5555
随意输入密码 即可连接后门。
0x02 分析
于是在vps上从/var/log/secure
中获取ssh的日志,之后执行ln后门。
在分析过程中发现如果把后门命令中的/tmp/su中的su修改成任意其他名字就不能够进行后门连接。
具体可看日志:
可以发现在修改为tt之后远程无法进行连接。
sevck说是这个su是pam认证下的su1
在Linux中进行身份或是状态的验证程序是由PAM来进行的,PAM(Pluggable Authentication Modules)可动态加载验证模块,因为可以按需要动态的对验证的内容进行变更,所以可以大大提高验证的灵活性。
于是做了测试,把该目录下的su重命名为其他文件如tt,之后同样执行ln到/tmp/tt,发现连接后门成功了,说明重命名后su的确是调用/ect/pam.d/下的。
现在确认了是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:
第一条:
pam_rootok(su:auth): authentication succeeded
至此也终于清楚了为什么就可以输入任意密码进行登录。
我们重新捋一捋:
0x03 结果
实际的真相就是在pam中的pam_rootok模块,pam_rootok通过了认证还会一次向下执行,但是下面的都会依赖于pam_rootok的认证,auth =>account =>session:
通过查找其实不单单是su存在pam_rootok,只要满足了上述的三个条件都可以进行”任意密码登录”。