反弹Shell执行pty泄露黑客命令记录?
python -c import pty; pty.spawn("/bin/bash")
做过渗透的小伙伴对这个命令都不会陌生,通常利用web漏洞进行反弹shell后,都会执行python的pty.spawn得到一个功能相对完善的伪终端,比如支持命令补全、使用vim等需要终端控制的程序。但是这也会导致攻击者执行过的命令被写入到当前用户的.bash_history中。
凭空出现的history

在今年的护网中,攻击队利用某组件的RCE漏洞拿到了云上服务器的权限,执行扫描的行为触发了主机安全的告警,联系客户后上机排查。
SSH登录后发现攻击队执行的所有命令记录都被写入到了history?
我们第一反应是攻击队通过漏洞拿到了权限后,进一步信息收集拿到SSH凭据后,直接通过SSH登录后执行的操作,但是还没有来得及清理痕迹就被关机了。
没有SSH登录记录?
初步推测攻击队如果是通过SSH登录操作的话,日志一定会有记录SSH的登录记录。


查看secure日志和last命令的记录,除了客户自己登录进行关机的操作,7月7号均未发现其他ip有登录过服务器的行为。
难道是攻击队定向删除过SSH的登录日志?我们又对全盘做了数据恢复,恢复出来的都是2023年的SSH日志,说明这段时间的SSH登录记录并没有被删除过。
为什么history凭空会记录攻击队执行过的命令记录?因为我们都知道正常的反弹shell后执行的命令是不会被记录的,那么究竟是如何触发的呢?
pty伪终端竟然会写入.bash_history?
为了找出凭空出现攻击队history的原因,我们又拉取了主机安全的高危命令告警进程树。
[ { "pid": 24846, "exe": "/www/server/logs/ns", "account": "root:root", "cmdline": "./ns -h 192.168.1.1/16 -o 192.txt -d", "ssh_service": "10.80.12.42:22", "ssh_source": "172.18.164.245:59590", "start_time": 1751878635, "type": 1 }, { "pid": 6980, "exe": "/usr/bin/bash", "account": "root:root", "cmdline": "/bin/bash", "ssh_service": "10.80.12.42:22", "ssh_source": "172.18.164.245:59590", "start_time": 1751874803, "type": 2 }, { "pid": 6979, "exe": "/usr/bin/python2.7", "account": "root:root", "cmdline": "python -c import pty; pty.spawn(\"/bin/bash\")", "ssh_service": "10.80.12.42:22", "ssh_source": "172.18.164.245:59590", "start_time": 1751874803, "type": 3 }, { "pid": 6977, "exe": "/usr/bin/bash", "account": "root:root", "cmdline": "/bin/bash", "ssh_service": "10.80.12.42:22", "ssh_source": "172.18.164.245:59590", "start_time": 1751874803, "type": 4 } ]
可以看到执行扫描动作的父父进程竟然是pty.spawn!说明攻击队拿到反弹shell后,通过执行pty.spawn后拿到功能完善的伪终端。在方便渗透的同时,伪终端也继承了父进程root用户的环境变量,将攻击队所有命令执行的记录写入到了.bash_history,即便没有用SSH登录过。
估计攻击队也没有预料到自己所有的命令记录会被写入到history中。
为什么主机安全记录的进程链会有ssh_source?
正常来说,反弹shell和SSH登录没有什么关系,为什么高危命令能够记录到ssh_source?
经过沟通后发现,被攻击的这个漏洞组件并不是通过系统服务systemd拉起的,而是客户SSH登录到服务器后用root用户手动运行的。
所以通过父进程的关联就能拿到初始的父进程是通过SSH执行的。不然很容易被父进程误导,误以为是攻击队是通过SSH登录进来后执行的 python -c import pty; pty.spawn(\"/bin/bash\")
。
探究:什么情况下pty会把命令记录写入history?
通过守护进程拉起

SSH登录后执行

而本文出现的恰好是第二种情况,其实是否记录还是取决于当前pty继承的环境变量。
赞赏微信赞赏
支付宝赞赏
发表评论