boofuzz学习
常见的命令
创建虚拟环境
python3 -m venv env
启动虚拟环境
source env/bin/activate
安装 boofuzz
pip install boofuzz
文档
安装 boofuzz — boofuzz 0.4.2 文档
学习
让ai写一个简单的测试脚本
from boofuzz import *def main():session = Session(target=Target(connection=SocketConnection("127.0.0.1", 9999, proto="tcp")))# 定义一个消息:先发送 "HELLO ",然后变异后面的字段s_initialize("Request")if s_block_start("main"):s_static("HELLO ")# fuzz 一个长度可变的 ascii 字段s_string("WORLD", fuzzable=True)s_static("\r\n")s_block_end()session.connect(s_get("Request"))session.fuzz()if __name__ == "__main__":main()
然后再另外一个终端上nc -l 9999,效果如下。
callback=add_auth_callback
是用来设置钩子函数。
Vivotek摄像头固件栈溢出漏洞
固件下载地址:https://link.zhihu.com/?target=https%3A//github.com/mcw0/PoC/files/3128058/CC8160-VVTK-0100d.flash.zip
启动流程
linux
启动流程
/etc/inittab -> /etc/init.d/rcS
,根据注释这段代码是启动守护进程的,我们想要的 web
服务也是再守护进程的。
但是rcS
软连接到 ../mnt/flash/etc/rcS.d
但是找了一下发现为空,返回到 _31.extracted
这一级目录,搜索一下 rcS.d
发现里面是软连接,http
服务是启动 /etc/init.d/httpd
。
以httpd
服务为例,启动过程如下:
/etc/init.d/rcS -> /etc/rcS.d/S31httpd -> /etc/init.d/httpd -> /usr/sbin/httpd
漏洞点
报告上写的是在 Content-Length
字段存在漏洞,找到如下代码:
虽然使用的 strncpy
函数进行拷贝,但是 v34 - (v35 + 1)
并没有做任何限制。
仿真环境
直接使用用户态进行模拟
cp /usr/bin/qemu-arm-static Path_to/squashfs-root
sudo chroot ./ ./qemu-arm-static /usr/sbin/httpd
报错如下,结合上面的分析,这是因为在31.extracted/_rootfs.img.extracted/squashfs-root/etc
的 conf.d
是一个错误的软连接,解决也很好想重新在软连接一下,但是考虑等会我们要将 squashfs-root
作为根目录,当然也可以不将它作为根目录,但是直接将31.extracted/defconf/_CC8160.tar.bz2.extracted/_0.extracted/etc
中的全部文件复制到31.extracted/_rootfs.img.extracted/squashfs-root/etc
更方便
复制后的报错如下:
在程序中定位一下字符串gethostbyname
因该是配置文件中的主机名和 ip
不对应。
查看etc/init.d/httpd
发现还需要输入参数-c /etc/conf.d/boa -d
。
sudo chroot ./ ./qemu-arm-static /usr/sbin/httpd -c /etc/conf.d/boa -d
还需要将宿主机中/etc/hosts
文件夹中的内容全部复制到固件文件系统的/etc/hosts
文件中去。
成功启动
抓包
抓下包看下格式
GET /cgi-bin/admin/upgrade.cgi HTTP/1.1
Host: 127.0.0.1
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:136.0) Gecko/20100101 Firefox/136.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Cookie: webptzmode=continuous
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
Priority: u=0, i
脚本
from boofuzz import*
IP = "127.0.0.1"
PORT = 80def check_response(target,fuzz_data_logger,session,*args,**kwargs):fuzz_data_logger.log_info("Checking for response ...")try:response = target.recv(512)except:fuzz_data_logger.log_fail("Unable to connect ...")returnif not response:fuzz_data_logger.log_fail("Empty response ...")target.close()returnfuzz_data_logger.log_info("Start checking ...\n"+response.decode())target.close()returndef main():session = Session(target=Target(connection=SocketConnection(IP,PORT,proto="tcp"),),post_test_case_callbacks=[check_response],)s_initialize(name="FUZZ")with s_block("Request-Line"):# Methods_group("Method",["POST"])s_delim(" ",fuzzable=False)s_string("/cgi-bin/admin/upgrade.cgi ",fuzzable=False,name="URI")s_static("HTTP/1.1",name="Version")s_static("\r\n",name="CRLF")# Hosts_static("Host")s_delim(": ",fuzzable=False)s_string("127.0.0.1",fuzzable=False,name="IP")s_static("\r\n")# Connections_static("Connection")s_delim(": ",fuzzable=False)s_string("Close",fuzzable=False,name="Active")s_static("\r\n")# Content-Lengths_static("Content-Length")s_delim(": ", fuzzable=False)s_string("65", fuzzable=True)# Ends_static("\r\n")s_static("\r\n")session.connect(s_get("FUZZ"))session.fuzz()if __name__=="__main__":main()
运行效果
目标主机直接崩溃
可以访问http://localhost:26000/
看一下运行信息。
参考
BooFuzz入门-Vivotek摄像头栈溢出漏洞 - 0P1N