0x01

进度

做了一下春秋杯的题,发现还是有些新东西的,学会了orw之外的沙箱绕过,还有自己手写了一个单字节爆破的脚本,也算是锻炼了下我的编程水平

之外就是做了下buu的前面几道逆向题,学会了ida的一些快捷键,练习了ida动态调试,记忆最深刻的是迷宫题(当时还不知道叫这个名字),就一步步的硬调,最后调出来了,相当有成就感

还有就是学习了arm汇编,主要是跟着azeria-labs,熟悉了arm的寄存器,掌握了str和ldr两条相当重要的对内存操作的汇编以及初步学习了它的寻址方式(现在就看到立即数寻址)

思考

感觉自己逆向水平不足,需要锻炼逆向水平,现在的想法就是做一些逆向题来提高逆向水平

还有就是打一些国际赛,拓展一下见识,看看pwn题有什么新活

剩下的部分我的想法是学完arm汇编后,做一些arm-pwn巩固一下(发现了一个网站ropemporium,挺好的)

0x02

记录

复现一下cve,首先在官网下载固件

Snipaste_2024-07-19_18-22-56

查看下文件类型是u-boot

u-boot

使用binwalk提取文件系统

1
binwalk -Me DIR-816.img

-M 参数,递归扫描文件

-e 参数,提取固件中的文件

安装binwalk(推荐)

1
2
git clone https://github.com/ReFirmLabs/binwalk.git
python setup.py

如非必要不要选择下面的安装方式(笔者曾尝试过,这样会删除很多依赖,辛辛苦苦搭起来ubuntu环境全烂了)

1
sudo apt install binwalk

提取完后如图所示

bin

接下来我们将goahead的环境搭起来,goahead在bin目录下

qemu启动goahead

1
sudo qemu-mipsel -L ./ ./goahead

ld

看报错,缺少lib目录下ld,我们在当前目录下创建lib并将ld放在文件夹下即可

有很多缺少库的报错,我们根据报错将库放入即可

最后结构如图所示

tree

qemu运行,然后不出意外的又失败了

qemu

可以看见goahead报错cannot open pid file,我们就去程序里找

ida搜索字符串

string

是无法fopenoff_480e50

open

发现是没有/var/run/goahead.pid,创建一个

pid

又报错please execute nvram_daemon first!

nvram

发现缺失/var/run/nvramd.pid

nvramd

报错failed to convert to binary ip data

data

定位到lan_ipaddr

lan

卡住…

看见网上的办法都是ida远程调试hook掉,待我研究研究qemu远程调试

疑问

如何确定是哪个二进制文件?我看网上全是直接开始分析goahead,但是在漏洞挖掘中我们是不知道哪里有漏洞的,如何确定漏洞所在的文件?

0x03

记录

书接上回,让我们看看如何解决failed to convert to binary ip data报错

data

经过本人实测,远程调试patch是最可靠的方法

具体操作如下

1.虚拟机选择桥接

vm

2.将在ida的dbgsrv目录下linux_serverlinux_server64文件复制到ubuntu下

dbg

linux

3.赋予linux_serverlinux_server64可执行权限

sudo chmod +x ./linux_server linux_server64

4.ifconfig查看虚拟机ip

ip

5.在ubuntu上运行linux_server并运行goahead

sudo qemu-mipsel -g 1234 -L ./ ./bin/goahead

在ida里填好ip,端口

port

6.打断点,运行

jmp

7.修改v0的值为0,即可继续运行

v0

打开http://192.168.0.105/dir_login.asp,即可进入登陆界面(不能在ubuntu打开,困扰了我好久😢,用kali打开的,本机也可)

kali

搭好之后我们要登录进去,我选择修改前端(也可以patch)

_DIR-816.img.extracted/squashfs-root/etc_ro/web中找到dir_login.asp,注释掉禁止输入空字符的js即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function onlogin() {
/*
if (document.test.show_username.value.length <= 0) {
alert("请输入用户名!");
document.test.show_username.focus();
return false;
}
if (document.test.show_username.value != "")
{
document.test.username.value = Base64.Encode(document.test.show_username.value);
}
if ( document.test.password.value != "")
{
document.test.password.value = Base64.Encode(document.test.password.value);
}
document.test.show_username.disabled = true;
*/
return true;
}

至于为什么这样做,主要是为了绕过登录代码

这个程序的登录逻辑是从nvram_bufget获得用户名和密码放在v2,v3。用户输入的用户名和密码经过base64编码放在var和v7中,解码后的用户名和密码放在v10,v11中

v2,v3值为0,当v10,v11为0时即可绕过检查

login

访问http://192.168.0.5/d_wizard_step1_start.asp

set

找到漏洞点,ls测试一下

test

不行,那用burp抓下包

error

在datetime处注入命令

cmd

发过去,success

success

详细看下代码,从web获得输入的datetime的值放在var

&unk_47c2b8date -s \"%s\",var可以由用户控制,存在命令注入

code

疑问

复现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
2
3
4
5
git clone https://github.com/NyaMisty/unluac_miwifi.git
cd unluac_miwifi
mkdir build
javac -d build -sourcepath src src/unluac/*.java
jar -cfm build/unluac.jar src/META-INF/MANIFEST.MF -C build .

安装完后,对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
2
sudo apt-get update
sudo apt-get upgrade

然后sudo apt install libvirt-daemon-system libvirt-clients virt-manager安装 libvirt 相关包

添加网桥brctl addbr virbr0

运行./net.sh无报错,接着运行./start.sh

发现没有分配ipv4地址,不知道宿主机如何与qemu通信

重启了一下虚拟机,然后打不开了😭

疑问

对一个没学过的语言,逆向出来如何快速进行代码审计,还有就是qemu仿真太折磨人了,叕叕把我的虚拟机干爆了🤮