周报
0x01
进度
做了一下春秋杯的题,发现还是有些新东西的,学会了orw之外的沙箱绕过,还有自己手写了一个单字节爆破的脚本,也算是锻炼了下我的编程水平
之外就是做了下buu的前面几道逆向题,学会了ida的一些快捷键,练习了ida动态调试,记忆最深刻的是迷宫题(当时还不知道叫这个名字),就一步步的硬调,最后调出来了,相当有成就感
还有就是学习了arm汇编,主要是跟着azeria-labs,熟悉了arm的寄存器,掌握了str和ldr两条相当重要的对内存操作的汇编以及初步学习了它的寻址方式(现在就看到立即数寻址)
思考
感觉自己逆向水平不足,需要锻炼逆向水平,现在的想法就是做一些逆向题来提高逆向水平
还有就是打一些国际赛,拓展一下见识,看看pwn题有什么新活
剩下的部分我的想法是学完arm汇编后,做一些arm-pwn巩固一下(发现了一个网站ropemporium,挺好的)
0x02
记录
复现一下cve,首先在官网下载固件
查看下文件类型是u-boot
使用binwalk提取文件系统
1 | binwalk -Me DIR-816.img |
-M
参数,递归扫描文件
-e
参数,提取固件中的文件
安装binwalk(推荐)
1 | git clone https://github.com/ReFirmLabs/binwalk.git |
如非必要不要选择下面的安装方式(笔者曾尝试过,这样会删除很多依赖,辛辛苦苦搭起来ubuntu环境全烂了)
1 | sudo apt install binwalk |
提取完后如图所示
接下来我们将goahead
的环境搭起来,goahead
在bin目录下
qemu启动goahead
1 | sudo qemu-mipsel -L ./ ./goahead |
看报错,缺少lib目录下ld,我们在当前目录下创建lib并将ld放在文件夹下即可
有很多缺少库的报错,我们根据报错将库放入即可
最后结构如图所示
qemu运行,然后不出意外的又失败了
可以看见goahead报错cannot open pid file,我们就去程序里找
ida搜索字符串
是无法fopenoff_480e50
发现是没有/var/run/goahead.pid,创建一个
又报错please execute nvram_daemon first!
发现缺失/var/run/nvramd.pid
报错failed to convert to binary ip data
定位到lan_ipaddr
卡住…
看见网上的办法都是ida远程调试hook掉,待我研究研究qemu远程调试
疑问
如何确定是哪个二进制文件?我看网上全是直接开始分析goahead,但是在漏洞挖掘中我们是不知道哪里有漏洞的,如何确定漏洞所在的文件?
0x03
记录
书接上回,让我们看看如何解决failed to convert to binary ip data报错
经过本人实测,远程调试patch是最可靠的方法
具体操作如下
1.虚拟机选择桥接
2.将在ida的dbgsrv
目录下linux_server
和linux_server64
文件复制到ubuntu下
3.赋予linux_server
和linux_server64
可执行权限
sudo chmod +x ./linux_server linux_server64
4.ifconfig
查看虚拟机ip
5.在ubuntu上运行linux_server
并运行goahead
sudo qemu-mipsel -g 1234 -L ./ ./bin/goahead
在ida里填好ip,端口
6.打断点,运行
7.修改v0的值为0,即可继续运行
打开http://192.168.0.105/dir_login.asp
,即可进入登陆界面(不能在ubuntu打开,困扰了我好久😢,用kali打开的,本机也可)
搭好之后我们要登录进去,我选择修改前端(也可以patch)
在_DIR-816.img.extracted/squashfs-root/etc_ro/web
中找到dir_login.asp
,注释掉禁止输入空字符的js即可
1 | function onlogin() { |
至于为什么这样做,主要是为了绕过登录代码
这个程序的登录逻辑是从nvram_bufget
获得用户名和密码放在v2,v3。用户输入的用户名和密码经过base64编码放在var和v7中,解码后的用户名和密码放在v10,v11中
v2,v3值为0,当v10,v11为0时即可绕过检查
访问http://192.168.0.5/d_wizard_step1_start.asp
找到漏洞点,ls
测试一下
不行,那用burp抓下包
在datetime处注入命令
发过去,success
详细看下代码,从web获得输入的datetime的值放在var
&unk_47c2b8
为date -s \"%s\"
,var可以由用户控制,存在命令注入
疑问
复现cve最大的感触是寻找漏洞才是最关键的,这个漏洞出现在cgi上,cgi更容易产生漏洞?
0x04
记录
准备复现一下小米路由器的cve
官网下载https://www1.miwifi.com/miwifi_download.html
下载稳定版
binwalk -Me miwifi_ra70_firmware_cc424_1.0.168.bin
解压
得到2B4.ubi
,需要ubi_reader
ubi_reader
下载
pip install --user ubi_reader
ubireader_extract_images 2B4.ubi
提取出ubifs-root
binwalk -Me img-870537086_vol-ubi_rootfs.ubifs
提取出squashfs-root
小米的前端是lua写的,但是只有编译好的字节码文件,没有源文件,所以我们要进行反编译
对lua进行反编译,我用的是unluac
反编译器,但不能对小米的程序进行反编译,所幸有的师傅出了专门的反编译工具unluac for MiWifi
我们首先安装反编译器(注意,需要有java环境)
1 | git clone https://github.com/NyaMisty/unluac_miwifi.git |
安装完后,对lua文件进行反编译
java -jar /home/tr0upe/tools/unluac_miwifi/build/unluac.jar xqdatacenter.lua > dis.lua
即可得到反编译后的文件
由于我没学过lua,分析了好久也没弄清楚,所以先搁置了,去搞环境搭建
这次环境搭建是系统仿真,之前没弄过,遇到了好多问题
arm64的系统仿真需要内核与磁盘镜像,我直接用的ZIKH26师傅的,感谢师傅
按照ZIKH26
师傅写的运行./net
发现网桥不存在
sudo apt install libvirt-daemon-system libvirt-clients virt-manager
安装 libvirt
相关包
error,依赖关系不满足
sudo apt-get update
试一下
怀疑是网络问题,ping一下试试
域名解析失败,应该是dns服务器的问题,换个dns试试
sudo vim /etc/resolv.conf
添加如下框住的dns
保存后重新ping一下
success,接下来起手
1 | sudo apt-get update |
然后sudo apt install libvirt-daemon-system libvirt-clients virt-manager
安装 libvirt
相关包
添加网桥brctl addbr virbr0
运行./net.sh
无报错,接着运行./start.sh
发现没有分配ipv4地址,不知道宿主机如何与qemu通信
重启了一下虚拟机,然后打不开了😭
疑问
对一个没学过的语言,逆向出来如何快速进行代码审计,还有就是qemu仿真太折磨人了,叕叕把我的虚拟机干爆了🤮