Peach3 元素详细解析(二)

4 状态模型

Peach 中有两个创建 fuzzer 的模型,DataModel 和 StateModel。StateModel 重新创建测 试一个协议所必须的基本状态机器逻辑。它定义了怎么给目标发送和接收数据。StateModel 的范围从非常简单到及其复杂。建议在开始时,保持状态模型简单,需要时再进行扩展。

4.1state

state 封装了一个为 Peach 工作的逻辑单元,进而来执行一个大的状态模型。 一些状态 模型仅需要一个状态,而另外一些状态模型则需要许多状态来创建复杂协议模型。state 由 action 组成。 每个 action 可以执行与单个状态如何封装逻辑相关的任务。

属性:
Name—必须的。State 的名字。
有效子元素:Action。

4.2 Action

Action 元素能在 StateModel 中执行多种操作。Action 是发送命令给 Publisher 的一种主 要方式,它能发送输出,接收输入或打开一个连接。Action 也能在 StateModel 中改为其他状态,在 DataModel 之间移动数据,调用被代理定义的方法。它是 state 元素的子元素。

(1)属性:
Name—可选的。action 的名字。
Type—必须的。action 类型。
When—只有在提供的表达式求值为 true 时才执行操作。
onComplete—表达式在完成操作后运行。
onStart—表达式在开始操作时运行。
Method—必须的。类型为 call。用来调用的方法。
Property—必须的。类型为 setproperty 或 getproperty。获取或者设置属性。
Setxpath—必须的。类型为 slurp,设置 Xpath 的值。
Value—值。类型为 slurp。
valueXpath—Xpath 的值。类型为 slurp。
Ref—更改为状态的引用。类型为 changestate。

(2)有效子元素:
DataModel、Data、Param。

(3)Action 类型:
1、start(隐式)
启动 Publisher,这是一个隐式的动作,一般不需要。

在这里插入图片描述
2、stop(隐式)
停止 Publisher,这是一个隐式的动作,一般不需要。

在这里插入图片描述
3、Open/connect(隐式的)
Open 和 connect 是彼此的别名,执行相同的操作,这个动作也是隐式的,对于文件来 说,文件必须被打开或者创建。对于 sockets 来说,应该打开一个连接。只有当需要特殊控 制的时候,才使用这个操作。

在这里插入图片描述
在这里插入图片描述
4、Close(隐式的)
Close 同样也是隐式的,一般不使用,除非需要特殊控制时使用。

在这里插入图片描述
5、Accept
接收一个连接。并不是所有的 Publisher 都支持这个操作类型。这个操作通常会堵塞直 到一个连接来到时可用。

在这里插入图片描述
6、Input 从 Publisher 中接收或者读取输入。需要一个指定 DataModel 来破解和包含到来的数据。

在这里插入图片描述
7、Output
通过 Publisher 发送或写 output 操作。需要一个 DataModel,可随意地提供一个的 Data 设置。

在这里插入图片描述
8、Call
调用一个被 Publisher 定义的方法,这个 Publisher 含有可选参数。并不是所有的 Publisher 都支持。

在这里插入图片描述
9、Setproperty
设置一个属性。并不是所有的 Publisher 都支持。

在这里插入图片描述
10、Getproperty
获取一个属性。并不是所有的 Publisher 都支持。

在这里插入图片描述
11、Slurp
Slurp 用于在两个 DataModel 之间移动数据。这些 DataModel 被分配给一个 StateModel 中的不同 action。一个标准的用例是在一个协议序列中。一个序列 ID 或者一个怀疑 ID 需要 被发送回服务器。Slurp 将从一个 action 复制数据到另外一个 action。从一个服务器输入, 输出到另外一个服务器。

在这里插入图片描述
12、Changestate
改变一个不同的状态。它被经常用于带有 when 属性的结合中。

在这里插入图片描述
13、When
执行一个基于表达式的 action。当表达式计算值为真时,action 被执行。

在这里插入图片描述
在这里插入图片描述

4.3 状态模型例子

(1)文件 fuzzing
当进行文件 fuzzing 的时候,Peach 把数据写进一个文件,然后调用目标进程打开上述的 文件。对于一个简单的文件模糊器,Peach 会用一个单独的 state 和三个 action。

在这里插入图片描述
(2)简单网络状态模型:
在这个状态模型中,Peach 将会发生和接收来自一个 TCP 端口的一系列包。

在这里插入图片描述
在这里插入图片描述

5 代理

代理是特殊的 Peach 进程,它可以在本地或者远程运行。这些进程拥有一个或者多个监 视器,这些监视器可以执行加载调试器,查看内存消耗或者探测错误等操作。代理中的监视 器可以收集信息和代表 fuzzer 执行操作。通用的代理有:本地代理、TCP 远程代理、ZeroMQ、 REST Json 代理。

(1)本地代理:
Peach 运行时支持一个运行在进程中的本地代理。如果不指定的话,这是一个默认的代 理类型。配置一个本地代理如下:

<Agent name="LocalAgent">
	<!---Monitors-->
</Agent>

(2)TCP 远程代理:
这个代理存活在本地或远程机器的一个单独的进程中,通过 TCP 远程完成连接,是一种 被本地运行时支持的 RPC 形式。为了使用远程代理,代理进程必须首先运行起来。

在这里插入图片描述
(3)ZeroMQ 代理:
这个代理存活在本地或者远程机器的一个独立进程中。使用 ZeroMQ 完成连接。ZeroMQ 支持许多类型的语言。可以使用这个代理信道来执行一个非.net 代理(比如 Python 或者 ruby)。为了使用一个远程代理,代理进程必须首先运行起来。

在这里插入图片描述
(4)REST Json 代理:
这个代理被用来与用其他语言编写的自定义的远程代理进行通信。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6 监视器

主要有以下几种监视器:windows 监视器、OSX 监视器、Linux 监视器和跨平台监视器。

6.1 windows监视器

(1)Windows Debugger Monitor
WindowsDebugger 监视器控制了一个 windows 调试句柄。主要有以下用途:进程调试、 服务调试、内核调试。

必须参数:
⚫ Commandline—用逗号分隔的窗口名字。
⚫ Processname—当找到一个窗口的时候,触发错误,默认为假。
⚫ Kernelconnectionstring—内核调试的连接字符串。
⚫ Service—要挂载的 windows 服务名称。如果停止或者崩溃,服务将会被启动。

可选参数:
⚫ Symbolspath—符号表路径或者服务。默认为:SRV*http://msdl.microsoft.com/download/symbols”
⚫ Windbgpath—windbg 的安装路径。尽量在本地。
⚫ Noncrystalline—直到从状态模型的匹配调用完成时,debugger 才会被挂载。
⚫ Ignorefirstchanceguardpage—忽略第一个机会机会保护页面错误。这些有时是假阳性或 反调试错误。默认为假。
⚫ Ignoresecondchanceguardpage—忽略第二个机会保护页面错误。这些有时是假阳性或反 调试错误。默认为假。
⚫ Nocpukill—不要使用进程 CPU 使用率提前终止。默认为假。
⚫ Faultonearlyexit—如果进程存在,触发错误。默认为假。
⚫ Waitforexitoncall–如果时间间隔到了,-等待状态模型调用的进程退出和参数故障。
⚫ Waitforexittimeout—等待退出,timeout 值单位为微秒。(-1 位无穷大)默认位 10000。
⚫ Restaroneachtest—为每次迭代重启进程。默认为假。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(2)cleanup registry monitor
cleanup registry 监视器将移除一个注册表键或者它的子健。以下前缀键被用到:
⚫ HKCU—当前用户。
⚫ HKCC—当前配置。
⚫ HKLM—本地机器。
⚫ HKPD—性能数据。
⚫ HKU—用户。

参数:
Key—要移除的注册表键。
Childrenonly—仅有的清除子健。默认为假。
在这里插入图片描述
(3)pageheap 监视器(windows 系统)
Pageheap 监视器将使 pageheap 调试选项对可执行程序可用。
参数:
Executable—可执行程序名字。(没有路径)。
Windbgpath—windbg 安装路径。尽量在本地。

在这里插入图片描述
(4)PopupWatcher 监视器(windows) Popupwatcher 监视器能根据标题关闭窗口。
参数:
WindowNames—被逗号分隔的窗口名字。
Fault—当找到窗口时,触发错误。默认为假。

在这里插入图片描述
(5)windowsService 监视器。
WindowsService 监视器控制一个 windows 服务。
参数:
Service—系统服务的名字,也可以是服务显示的名字。
MachineName—服务存在的机器,可选,默认为本地机器。
FaultOnEarlyexit—如果服务提前存在,则为故障。
Restart—windows 服务要挂载的名字,如果停止或者崩溃,服务将重启。
StartTimeout—服务要挂载的名字,如果停止或者崩溃,服务将重启。

在这里插入图片描述

6.2 OSX监视器

(1)CrashWrangler 监视器
CrashWangler 监视器将启动一个进程和监视器感兴趣的崩溃。这个监视器采用苹果系统 自带的 CrashWrangler 工具,这个工具能从开发者网站下载。为了该工具能够正常运行,它 必须在每个机器上进行编译。
参数:
Command—要执行的命令。
Arguments—命令行参数,可选,默认没有。
StartOnCall—状态模型调用的启动命令。可选,默认没有。
UseDebugMalloc—使用 OSX Debug Malloc(比较慢),可选默认为假。
ExecHandler—Crash Wrangler 执行处理程序,可选,默认为 exc_handler。
ExploitableReads—读 a / v 被认为是可利用的?可选,默认为假。
NoCpuKill—通过 CPU 使用禁用进程杀死。可选,默认为假。
CwLogFile—CrashWrangler 记录文件。可选,默认为 cw.log。
CwLockFile—CrashWrangler 锁文件,可选,默认为 cw.lock。
CwPidFile—CrashWrangler PID 文件,可选,默认为 cw.pid。

在这里插入图片描述
(2)CrashReporter Monitor(OSX)
CrashReporter 监视器将报告被 OSX 系统探测到的 Crash 报告。 参数: ProcessName—需要监视的进程名字。可选,默认为所有。

在这里插入图片描述

6.3 Linux监视器

LinuxCrash 监视器用一个脚本来捕捉错误进程,该脚本被内置在内核中。 参数: Executable—目标可执行程序,被用于过滤崩溃,可选的,默认为所有。 LogFolder—记录文件的文件夹。可选默认为“/var/peachcrash”。 Mono—mono 执行=程序所需的运行时的全路径。可选,默认为“/usr/bin/mono”。

在这里插入图片描述

6.4跨平台监视器

(1)canakit relay 监视器
它控制一组能够打开/关闭 AC 和 DC 线路的继电器。这对于在模糊运行期间打开和关闭 设备非常方便。 任何带有交流或直流电源线的设备都可以通过接线来控制。

参数:
Serialport—电路板上的串行端口。
RelayNumber—延迟触发。
ResetEveryIteration–在每次迭代时重启动电源,可选,默认为假。
OnOffPause—在开/关之间暂停,以微秒为单位,可选,默认为 0.5 秒。
ResetOnStart—在启动时,重置设备,可选,默认为假。
ReverseSwitch—当 NC 端口被用于电源时,切换命令的顺序。

在这里插入图片描述
(2)Cleanup Folder 监视器
Cleanup Folder 监视器在每次迭代时将会移除文件夹的内容,这用于清理后的目标。

参数:
Folder—要清理的文件夹

在这里插入图片描述
(3)IpPower9258 监视器
IpPower9258 监视器控制找一个联网的能量切换,它允许设备在 fuzzing 时被被关闭或者 开启。这个模型是“IP Power 9258”,特别是在购买 eaby 和亚马逊时有用。

参数:
Host—主机或者 IP 地址(能包含 http 接口端口,比如 8080)。
User—用户名。
Password—密码。
Port—重写设置的端口。
ResetEveryIteration—每次迭代时重启电源,可选,默认为假。
powerOnoffpause—在电源打开和关闭时暂停,以微秒为单位,可选,默认为 0.5 秒。

在这里插入图片描述
(4)内存监视器
内存监视器检查一个进程的内存使用情况,当它达到设置极限时抛出一个错误,在探测 无关的内存使用情况式非常有用。

参数:
Pid—监控的进程 ID。
Processname–监控的进程名字。
memoryLimit—发生错误时,内存的使用极限,可选,默认为 0MB。
Stoponfault—如果触发了一个错误,停止 fuzzing,可选的,默认为假。

在这里插入图片描述
(5)Pcap 监视器
Pcap 监视器在迭代时有一个网络捕获器,被捕获的数据是废弃的,在每次迭代时重写 捕获。如果发生错误,被捕获的数据被记录为一个 pcap 文件,pcap 文件 wireshark 和 tcpdump 兼容。

参数:
Device—捕获的设备名字。
Filter—pcap 类型过滤器,可选。

在这里插入图片描述
(6)Ping 监视器
Ping 监视器将阻塞,直到超时被触发。此监视器对于验证目标是否仍然正常并等待目标 重新启动非常有用。

参数:
Host—主机或者 IP 地址。
Timeout—时间间隔,微秒为单位,可选,默认为 1000。
Data—ping 包中要发生的数据,可选。
Faultonsuccess—如果 ping 成功了,出现错误,可选,默认为假。

在这里插入图片描述
(7)进程监视器
进程监视器在 fuzzing 时控制了一个进程,它由许多特性:
⚫ 当进程死掉时,重启一个进程。
⚫ 如果一个进程已经退出了,记录一个错误。
⚫ 每次迭代时,重启一个进程。
⚫ 终止一个 cpu 使用率很低的进程。
⚫ 和 StateModel 相互影响,允许等待进程退出。
⚫ 和 StateModel 相互影响,允许延迟开始一个进程。

参数:
Executable—要激活的可执行程序。
Arguments—命令行参数,可选。
Restartoneachtest—每次迭代时重启进程,可选,默认为假。
Faultonearlyexit—如果进程退出,触发错误,可选,默认为假。
Nocpukill—当 cpu 使用率接近 0 时,禁用进程杀死,可选,默认为假。 Startoncall—当从 StateModel 中调用一个动作时,开始进程。这个值和方法值必须匹配, 可选。 Waitforexitoncall—在状态模型调用时,等待进程退出。这个值和方法值必须匹配,可选。
Waitforexittimeout—等待超时值。当超时时,触发错误,可选,默认禁用。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(8)Processkiller 监视器
在每次迭代后,Processkiller 监视器将会杀死(终结)指定进程。

参数:
Processnames—要杀死的进程名字,逗号分隔。

在这里插入图片描述
(9)保存文件监视器
当错误发生时,保存文件监视器将会保存一个指定的文件作为记录数据的一部分。

参数:
Filename—保存到记录数据的 文件。

在这里插入图片描述
(10)socket 监视器
Socket 监视器等待一个 TCP 或者 UDP 的连接。如果连接被接受了,发生错误时被触发。

参数:
Host—远程主机的 IP 地址,可选默认为空。
Interface—监听的 IP 地址接口,可选,默认为 0.0.0.0。
Port—监听端口,可选,默认为 8080。
Protocol—要监听的协议类型,可选,默认为 tcp。
Timeout—等待连接的时长,可选,默认为 1000ms。
Faultonsuccess—如果没有连接被记录,发生错误,可选,默认为假。

(11)ssh 监视器
Ssh 监视器通过 ssh 连接一个远程主机。监视器支持密码、键盘和私有密钥身份验证方法。监视器在一个远程系统上运行一个给定的命令。如果发生错误,一个正则表达式能被提 供给命令结果来确定。监视器在模糊运行过程中保持对系统开放的持久连接。

参数:
Host—ssh 连接的主机。
Usename—ssh 用户名。
Command—检查错误的命令。
Password—ssh 账户的密码,可选,默认为空。
Keypath—ssh key 的路径,可选默认为空。
checkValue—正则表达式匹配命令响应,可选,默认为空。
Faultonmatch—如果正则表达式匹配,触发错误,可选,默认为真。

在这里插入图片描述
(12)ssh 下载器监视器
Ssh 下载器监视器可以通过 ssh sftp 从远程主机上下载一个文件或者文件夹。这个监控 器支持密码、键盘、私有秘钥认证方法,有能力删除它下载的文件。

参数:
Host—ssh 主机。
Username—ssh 用户名
Password—ssh 账户密码,可选,默认为空。
Keypath—ssh key 路径,可选,默认为空。
File—要下载的文件,可选,默认为空。
Folder—下载的文件夹,可选,默认为空。
Remove—下载后,移除远程文件,可选,默认为真。

在这里插入图片描述
(13)vmware 监视器
Vmware 监视器能控制一个 wmware 虚拟机。监视器能启动一个虚拟机,在每次迭代时 重新设置一个快照。当一个错误发生时,它会重新设置一个指定的快照。

参数:
Vmx—虚拟机路径
Host—主机名字,可选。
Login—远程主机上认证用户名。可选。
Pasword—远程主机上的认证密码,可选。
Hosttype—远程主机类型,可选,默认为“default”。
Hostport—远程主机上的 TCP/IP 端口,可选。
Default—default。
VIserver—vCenter Server,ESX/ESXi 主机,VMWare Server 2.0。
Workstation—VMWare Workstation WorkstationShared—VMWare Workstation(shared 模式)。 Player—VMWare player。
Server—VMWare Server 1.0.x。
snapshotIndex—VM snapshot 索引,可选。
Snapshotname—VM snapshot 名字,可选。
ResetEveryIteration—每次迭代时,重新设置 VM 快照,可选,默认为假。 ResetonfaultBeforecollection—在数据收集期间,当探测到一个错误之后,重新设置 VM。
Waitfortoolsinguest—等待工具在客户机中启动,可选,默认为真。
Waittimeout—等待客户机工具多少秒,可选,默认为 600。

在这里插入图片描述


版权声明:本文为weixin_40563850原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。