前言
从老外那新学一招: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
其中最后执行脚本的路径可以换,一定要放在第一行,有处理的优先级问题
然后在/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 -a
audit2allow -a -M local
semodule -i local.pp
来修改selinux规则,但是有些发行版默认不带audit2allow,所以自行取舍
问题二:判断密码正确
默认这个方案是扫描所有密码然后储存,无法区分哪个是正确哪个是错误。
Ippsec的方法是,把auth optional pam_exec.so quiet expose_authtok /tmp/sshd.sh
的expose_authtok约束删了,然后放在认证成功后面
这样子如果脚本接收到一个空字符的信号,就代表程序PAM已经走到密码已经通过验证的那个步骤,那么就代表上一次抓取的密码是正确的,这一步骤可能造成条件竞争?我不知道,但是它也是能工作的,所以从视频里可以看到ippsec用go代码实现了这个流程
要是换我的话可能会用另一个暴力方法实现,那就是直接读取/etc/shadow,用我们脚本手动验证一遍hash是否正确。当然这可能会有更大的延迟,但是也许不会有条件竞争,懒得写了,咕咕咕。用到再说吧
没了
这个也需要root权限呀,抓ssh密码方法很多的
渗透干了8年 不得成精了 ୧(๑•̀⌄•́๑)૭