初探BooFuzz | 申博官网
登录
  • 欢迎进入申博官网!
  • 如果您觉得申博官网对你有帮助,那么赶紧使用Ctrl+D 收藏申博官网并分享出去吧
  • 这里是申博官方网!
  • 申博官网是菲律宾sunbet官网品牌平台!
  • 申博开户专业品牌平台!

初探BooFuzz

申博_安全防护 申博 196次浏览 未收录 0个评论

简介

Boofuzz是Sulley隐约测试框架的一个分支和继续者。除修复了很多毛病,boofuzz还提升了可扩大性。主要特征有以下几点:

  • 轻松疾速的数据天生体式格局;
  • 仪表板支撑AKA毛病检测;
  • 失利后的目的重置;
  • 纪录测试数据;
  • 在线文档;
  • 支撑恣意通讯序言;
  • 内置支撑串行隐约测试、以太网、IP层和UDP播送;
  • 更好地纪录测试数据——一致、完全、清楚;
  • 测试效果经由历程CSV导出;
  • 可扩大的仪器/毛病检测;
  • 轻易的装置体验;

Install

ubuntu;基于python2.x

sudo apt-get install python-pip
git clone https://github.com/jtpereyda/boofuzz.git
cd boofuzz
sudo pip install .

windows:

git clone https://github.com/jtpereyda/boofuzz.git
pip install .

模块剖析

Session

初探BooFuzz

pre_send() 发送数据后最先遍历Pgraph构造,并沿途fuzz每一个组件。这个例子以’helo’ requet开首,一旦完成,将最先fuzz “maiL from” request。它经由历程在每一个测试用例前面加上有效的“helo” request来完成。 接下来,将继续fuzz ‘rcpt to’ request。一样,这是经由历程在每一个测试用例前面加上有效的“helo”和“mail from” request来完成的。比及该历程一直到”data” request完成后,又转回到从”ehlo”最先。经由历程构建的Pgraph将协定分解为单个要求,并fuzz一切可以或许途径,使其fuzz能力非常的壮大。

每一个节点都衔接起来,构成一幅有状况的图,我们可以或许在图里的每一个节点举行操纵,同时也可以或许界说一些callback回调函数,以完成诸如质询相应体系之类的功用,回调要领必需遵照以下原型:

def callback(target, fuzz_data_logger, session, node, edge, *args, **kwargs)
'fuzz_data_logger'纪录测试搜检和经由历程/失利
'session'是一个指向会话实例的指针,它关于壅塞比方session.last_recv的数据很有效
'node'是要发送的节点
'edge'是以后fuzz到node的末了一条途径

我们每次建立测试剧本的时刻都邑运用Session,session.connect() 用来声明衔接,session.fuzz() 发送负载,和界说会话回折衷挑选的协定举行交互,比方

session = Session(   
        target=Target(
            connection=SocketConnection("127.0.0.1", 21, proto='tcp')))

  session.connect(s_get("xxx"))

  session.fuzz()

Static Protocol Definition

Request是信息,Blocks是音讯中的块,而Primitives是构成块/要求的元素(字节,字符串,数字,校验和等)。

Block和Group是Boofuzz从Sulley继续而来的壮大东西。Blocks将自力的primitives组建成有序的块。Groups 中包含了一些特定的primitives,一个Group和一个Block连系后,每次fuzzer挪用Block的时刻,都邑将Group中的数据轮回的掏出,构成分歧的Block。

Group许可你衔接一个块到指定的group原语,和一个组联络关系的block必需为每一个组中的值轮回穷尽该block的一切空间,比方,在透露表现一个有效的opcode列表或一些有雷同参数的行为时,组原语黑白常有效的,s_group界说一个组,并吸收两个必需的参数,第一个参数指定组称号,第二个参数指定一个须要迭代的原始值列表。

比方下面官方给出的http.py中的代码

s_initialize("HTTP VERBS")
s_group("verbs", values=["GET", "HEAD", "POST", "TRACE", "PUT", "DELETE"]) 
if s_block_start("body", group="verbs"): 
    s_delim(" ") 
    s_delim("/") 
    s_string("index.html ") 
    s_delim(" ") 
    s_string("HTTP") 
    s_delim("/") 
    s_string("1") 
    s_delim(".") 
    s_string("1") 
 s_block_end()

模块经常使用语法

s_initialize('grammar')#初始化块要求并定名
s_static("HELLO\r\n")#一直发送此信息
s_static("PROCESS")#在HELLO\r\n以后马上发送
s_delim("")# 运用s_delim()原语替代支解符
s_string("AAAA")# 这是我们的fuzz字符串
s_static("\r\n")# 通知效劳器“done”

Connections

target = sessions.target("10.0.0.1", 5168)
target.netmon = pedrpc.client("10.0.0.1", 26001)
target.procmon = pedrpc.client("10.0.0.1", 26002)
target.vmcontrol = pedrpc.client("127.0.0.1", 26003)
target.procmon_options = \
{
"proc_name" : "SpntSvc.exe",
"stop_commands" : ['net stop "trend serverprotect"'],
"start_commands" : ['net start "trend serverprotect"'],
}
sess.add_target(target)
sess.fuzz()

起首是界说目的,到场会话

下面的netmon(收集监控署理) 、procmon(历程监控署理)、vmcontrol(VMware掌握署理)为3个agent的子模块,用来监测顺序

  • netmon子模块:netmon子模块主要卖力捕获收集的双向流量,并生存。 在向target发送数据之前,agent向target发送要求并纪录流量,数据传送胜利后,该署理子模块将纪录的流量存入磁盘。
  • procmon子模块:procmon子模块主要卖力检测fuzz历程当中发作的毛病。 在向target发送数据以后,boofuzz联络该署理以肯定是不是触发了毛病,若是发生毛病,关于毛病性子的hgih level信息将被传送回session。毛病信息会储存在名为”crash bin”的文件中,我们也可以或许在web监控效劳中看到发作crash时加载细致的crash信息。
  • vmcontrol子模块:vmcontrol子模块主要用来掌握虚拟机。一种罕见的用法是把Target目的放在虚拟机中,运用这个子模块来掌握虚拟机的启动、封闭、建立快照等,最主要的功用是能在目的涌现瓦解的时刻规复主机的状况。

下面简朴引见一下要求样例:

session.connect(s_get("user"))
    session.connect(s_get("user"), s_get("pass"))
    session.connect(s_get("pass"), s_get("stor"))
    session.connect(s_get("pass"), s_get("retr"))

衔接后,我们起首发送用户名要求
在发送用户名后,我们发送暗码
只要在发送暗码后我们能力发送stor或retr要求

Fuzzing Vulnserver

vulnserver

Vulnserver是一个多线程的基于Windows的TCP效劳器,它侦听端口9999上的客户端衔接(默许情况下),并许可用户运转很多分歧的敕令,这些敕令轻易遭到各种类型的可应用缓冲区溢出的进击。它在github的地点为https://github.com/stephenbradshaw/vulnserver

我们启动vulnserver

初探BooFuzz

我们运用nc敕令,衔接效劳端9999端口便可。发出HELP敕令(辨别大小写),检察顺序有哪些功用

内核漏洞挖掘技术系列(4)——syzkaller(3)

这篇文章从syz-manager入手分析,主要来看看crash复现的过程。syzkaller的使用是通过这条命令:./syz-manager -config=my.cfg syzkaller\pkg\mgrconfig\testdata目录下提供的示例qemu.cfg如下。 {
“target”: “linux/amd64”,
“http”: “myhost.com:56741”,
“workdir”: “/syzkaller/workdir”,
“kernel_obj”: “/linux/”,
“image”: “/linux_image/wheezy.img”,
“sshkey”: “/linux_image/ssh/id_rsa”,
“syzkaller”: “/syzkaller”,
“disable_syscalls”: [“keyctl”, “add_key”, “request_key”],
“suppressions”: [“some known bug”],
“procs”: 4,
“type”: “qemu”,
“vm”: {
“count”: 16,
“cpu”: 2,
“mem”: 2048,
“kernel”: “/linux/arch/x86/boot/bzImage”,
“initrd”: “linux/initrd”
}
} 这些参数的含义如下(有一些上面的示例中没有)。 http:显示正在运行的syz-manager进程信息的URL email_addrs:第一次出现bug时接收通知的电子邮件地址,只支持Mailx workdir:syz-manager进程的工作目录的位置。产生的文件包括: workdir/crashes/*:crash输出文件 workdir/corpus.db:包含一些程序

初探BooFuzz

Fuzzing

from boofuzz import *

def main():
    port = 9999
    host = '10.211.55.17'
    protocol = 'tcp'

    session = Session(
            target=Target(
                connection = SocketConnection(host, port, proto=protocol),
            ),
    )

    s_initialize("trun")
    s_string("TRUN", fuzzable=False)
    s_delim(" ", fuzzable=False)
    s_string("FUZZ")
    s_static("\r\n")

    session.connect(s_get("trun"))
    session.fuzz()

if __name__ == "__main__":
    main()

起首,我们先设置要求,然后界说敕令的称号,空格分隔符和参数,末了发送要求,最先fuzz

在fuzz的时刻我们可以或许翻开http://127.0.0.1:26000 上的Web界面中视察fuzz测试进度。这是一个boofuzz内部Web效劳器,向我们显现fuzz历程完全性和致使瓦解的输入文件。

初探BooFuzz

初探BooFuzz

我们可以或许看到顺序已瓦解,然则fuzz的剧本依旧在运转,并且没法精肯定位破绽

这时刻我们增添一个回调函数

session.connect(s_get("trun"), callback=get_banner)
def get_banner(target, my_logger, session, *args, **kwargs):
    banner_template = "Welcome to Vulnerable Server! Enter HELP for help."
    try:
        banner = target.recv(10000)
    except:
        print "Unable to connect. Target is down. Exiting."
        exit(1)

    my_logger.log_check('Receiving banner..')
    if banner_template in banner:
        my_logger.log_pass('banner received')
    else:
        my_logger.log_fail('No banner received')
        print "No banner received, exiting.."
        exit(1)

banner在每次fuzz吸收后实验吸收字符串,吸收不到报非常”Unable to connect. Target is down. Exiting.”,若是吸收到的字符可以或许与一般交互的字符串婚配上,我们纪录下然后返回fuzz继续测试,若是不婚配顺序完毕

初探BooFuzz

我们可以或许看出,在顺序瓦解后,fuzz住手,接下来我们实验纪录顺序瓦解,并找到缘由

我们先增添日记纪录,起首我们建立一个csv文件,然后建立一个my_logger对象,挪用FuzzloggerCsv()函数,Fuzz_loggers纪录测试数据和效果

csv_log = open('fuzz_results.csv', 'wb')
my_logger = [FuzzLoggerCsv(file_handle=csv_log)]
fuzz_loggers=my_logger,

我们起首在端口26002上侦听当地主机的历程,看管应用顺序,然后设置选项,我们把顺序和process_monitor.py放在统一目录下

须要注重的是process_monitor.py仅限于在windows运用(为Unix供应process_monitor_unix.py),并且须要装置pydasm和pydbg

procmon=pedrpc.Client(host, 26002),
        procmon_options = {
            "proc_name" : "vulnserver.exe",
            "stop_commands" : ['wmic process where (name="vulnserver") delete'],
            "start_commands" : ['vulnserver.exe'],
        }

我们运转起来process_monitor.py和fuzz剧本,我们发明EIP被41414141掩盖,并发作瓦解

初探BooFuzz

我们检察一下fuzz_result.csv文件,若是我们运用sulley我们须要找到存储流量的PCAP文件 ,并定位payload,而我们运用boofuzz直接检察csv文件就可以或许

初探BooFuzz

我们可以或许清楚的看到payload,我们可以或许用于复现和应用

下面是完全的fuzz代码:

from boofuzz import *
from sys import exit

def get_banner(target, my_logger, session, *args, **kwargs):
    banner_template = "Welcome to Vulnerable Server! Enter HELP for help."
    try:
        banner = target.recv(10000)
    except:
        print "Unable to connect. Target is down. Exiting."
        exit(1)

    my_logger.log_check('Receiving banner..')
    if banner_template in banner:
        my_logger.log_pass('banner received')
    else:
        my_logger.log_fail('No banner received')
        print "No banner received, exiting.."
        exit(1)

def main():
    port = 9999
    host = '127.0.0.1'
    protocol = 'tcp'

    s_initialize("Vulnserver")
    s_group("verbs", values=["TRUN", "GMON", "KSTET"])

    if s_block_start("test", group="verbs"):
        s_delim(" ")
        s_string("AAA")
        s_string("\r\n")

    s_block_end("test")

    csv_log = open('fuzz_results.csv', 'wb') 
    my_logger = [FuzzLoggerCsv(file_handle=csv_log)]   
    session = Session(
            target=Target(
                connection = SocketConnection(host, port, proto=protocol),
                procmon=pedrpc.Client(host, 26002),
                procmon_options = {
                        "proc_name" : "vulnserver.exe",
                        "stop_commands" : ['wmic process where (name="vulnserver") delete'],
                        "start_commands" : ['vulnserver.exe'],
                }
            ),
            fuzz_loggers=my_logger, 
            crash_threshold_element= 1,# Crash how much times until stop
    )

    session.connect(s_get("Vulnserver"), callback=get_banner)
    session.fuzz()


if __name__ == "__main__":
    main()

 

 


申博|网络安全巴士站声明:该文看法仅代表作者自己,与本平台无关。版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明初探BooFuzz
喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址