5G协议漏洞挖掘工具:5greplay --一款5G网络流量fuzz工具 使用教程(2)

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上网络安全知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注网络安全)
img

正文

(#em\_is\_search\_engine( http.user_agent ) == true)

其中http是协议名称,user_agent是属性名称(即数据包元数据)。
请参阅此处获取协议和属性的完整列表。(注释:这里非常类似wireshark里面的过滤器语法规则)
xml规则中使用的协议和属性名称区分大小写。它们通常是小写的。
为了避免混淆,新的嵌入函数名应该以前缀em_开头。

1. 特殊条款

true将被数字1代替。
例如:

#em\_check(tcp.src\_port)== true

false将替换为数字0。
例如:

#em\_check(tcp.src\_port)== false

2.实现一个新的嵌入式函数

在每个规则文件中,都有一个允许用户添加嵌入式功能的部分。

<embedded_functions><![CDATA[
//code C
static inline bool em\_check( double port ){
   if( port == 80 || port == 8080 )
      return true;
   return false;
}
]]></embedded_functions>

除了这个标签之外,还可以实现如下两个其他功能:
(1)void on_load(){ … }当xml文件中的规则被加载到5Greplay时被调用
(2)void on_unload(){ … }退出5Greplay时被调用
3.预安装嵌入式函数
在规则的布尔表达式中,可以使用一个或多个嵌入函数
(1)is_exist( proto.att ) 检查一个事件是否具有协议属性,例如is_exist( http.method ) 如果当前事件包含协议HTTP并且属性方法具有非空值,将会返回true,否则返回false
通常情况下,5Greplay 有一个过滤器,只有在其布尔表达式中使用的任何 proto.att 包含值时,才允许验证规则中的事件。如果其中一个不包含值,则不会验证该规则。这样可以减少布尔表达式的验证次数,从而提高性能。
例如,给定的事件具有以下布尔表达式:
((ip.src != ip.dst) && (#em_check_URI(http.uri) == 1))
只有当 ip.src 和 ip.dst 以及 http.uri 不为空时,才会验证该事件,因此只验证 HTTP 数据包(不会验证每个 IP 数据包)。
但是,如果使用下面的表达式,则与前一个表达式的含义完全相同:
((ip.src != ip.dst) && ((#is_exist(http.uri) == true ) && (#em_check_URI(http.uri) == 1)))
5Greplay 需要针对任何 IP 数据包验证该表达式, is_exist 会告诉 5Greplay 从其过滤器中排除 http.uri。
(2)is_null( proto.att ), 例如,#is_null(http.uri) 检查 http.uri 的值是否存在
(3)is_empty( proto.att ), 例如,#is_empty(http.uri) 检查值是否为空或字符串值是否为空,即长度是否为零。
(4)is_same_ipv4(const uint32_t*, const char *),例如,#is_same_ipv4(ip.src, “10.0.0.1”) 检查 ip.src 的值是否为 “10.0.0.1”。
(5)我们可以使用任何标准 C 函数作为嵌入函数,例如,(#strstr( http.user_agent, ‘robot’) != 0) 检查 http.user_agent 是否包含子字符串 “robot”。
请注意,在使用 C 语言函数之前,必须包含包含该嵌入函数的库。以下库已被预包含:

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "mmt\_lib.h"
#include "pre\_embedded\_functions.h"

因此,在使用未在这些库中定义的函数时,我们需要包含其库。例如

<embedded_functions><![CDATA[
#include <math.h>
static inline bool function em\_check( double port ){
    double x = sqrt( port );
    return x >= 5;
}
]]></embedded_functions>

(三)反应函数

反应函数允许我们在满足某个规则时执行某些操作。每次满足规则时,这些函数都会被调用。
要实现和使用反应式函数,我们需要:
在 <embedded_functions> 标签内实现一个 C 函数。
函数名称的前缀应为 em_,以避免与 5Greplay 内部已有的函数混淆。
函数的格式如下:

typedef void (\*mmt_rule_satisfied_callback)(
        const rule\_t \*rule,                  //rule being validated被验证的规则
        int verdict,                     //DETECTED, NOT\_RESPECTED
        uint64\_t timestamp,              //moment (by time) the rule is validated验证规则的时刻(按时间计算
        uint64\_t counter,                //moment (by order of message) the rule is validated验证规则的时刻(按报文顺序排列
        const mmt\_array\_t \* const trace  //historic of messages that validates the rule验证规则的消息历史记录
);

将函数名放入要反应的规则的 if_satisfied 属性中。例如:if_satisfied=“em_print_out”

<beginning>
<embedded_functions><![CDATA[
static void em\_print\_out(
      const rule\_info\_t \*rule, int verdict, uint64\_t timestamp,
      uint64\_t counter, const mmt\_array\_t \* const trace ){
   const char\* trace_str = mmt\_convert\_execution\_trace\_to\_json\_string( trace, rule );
   printf( "detect rule %d\n%s\n", rule->id, trace_str );
   //you can call a system command, for example:您可以调用系统命令,例如
   //char command[1001];
   //snprintf( command, 1000, "echo rule %d is validated by %s", rule->id, trace\_str );
   //system( command );
}
]]></embedded_functions>


<!-- Property 10: HTTP using a port different from 80 and 8080.-->
<property value="THEN" delay_units="s" delay_min="0" delay_max="0" property_id="10" type_property="EVASION"
    description="HTTP using a port different from 80 and 8080." if_satisfied="em\_print\_out">
    <event value="COMPUTE" event_id="1"
        description="HTTP packet using a port different from 80 and 8080"
           boolean_expression="((http.method != '')&amp;&amp;((tcp.dest\_port != 80)&amp;&amp;(tcp.dest\_port != 8080)))"/>
    <event value="COMPUTE" event_id="2"
           description="HTTP packet"
           boolean_expression="(ip.src != ip.dst)"/>
</property>
</beginning>

3.1 支持的功能

我们实现了多个功能,以支持修改协议属性值、丢弃数据包、转发数据包或将其复制到输出网卡。新函数将逐次实现和添加。
以下函数必须在反应函数内部调用。
1.get_numeric_value( proto_id, att_id, event_id, trace)
从满足条件的跟踪中返回事件 ID 的 proto_id.att_id 字段的 uint64_t 值。
2.set_numeric_value( proto_id, att_id, uin64_t )
标记用于将 proto_id.att_id 改为 uint64_t 值。只有在发送数据包时,例如通过显式调用 forward_packet 时,才会应用该更改。
3.forward_packet()
立即转发当前数据包
4.drop_packet()
不转发当前数据包
5.update_sctp_param( uint32_t ppid, uint32_t flags, uint16_t stream_no, uint32_t timetolive )
更新 sctp_sendmsg 函数中的参数,该函数用于在 5Grepay 与目标之间创建 SCTP 通信通道。

3.2预定义的反应式函数

以下函数已被定义
#drop() 用于丢弃当前数据包
#update( proto_id.att_id, expression ) 用于更改当前数据包,然后将其转发给发出的网卡。
proto_id 和 att_id 分别表示要更改的协议和属性
expression 为表达式格式,用于获取要分配给协议属性的值
示例
#update(ngap.ran_ue_id, (ngap.ran_ue_id + 100) 将使 ran_ue_id 增加 100
#update(ngap.ran_ue_id,(ngap.ran_ue_id.1 * 2) 将把当前数据包的 ran_ue_id 替换为 event_id=1 的数据包的 ran_ue_id 的两倍。
#fuzz(proto.att, proto.att, …)会更改当前数据包,然后将其副本转发到发出的网卡。
目前(2022 年 2 月 10 日)只支持数值
每个 proto.att 都将设置一个由 C random 函数生成的新随机值。请参阅 rules/7.fuzz-ngap.xml 中的示例,了解如何覆盖随机函数。

3.3示例

以下XML文件定义了3条规则:

<beginning>
<embedded_functions><![CDATA[

static void em\_modif\_then\_forward(
      const rule\_info\_t \*rule, int verdict, uint64\_t timestamp,
      uint64\_t counter, const mmt\_array\_t \* const trace ){
   const char\* trace_str = mmt\_convert\_execution\_trace\_to\_json\_string( trace, rule );
   //forward the original packet (without any modification)
   forward\_packet();
   //get old value ran\_ue\_id
   uint64\_t ran_ue_id = get\_numeric\_value( PROTO_NGAP, NGAP_ATT_RAN_UE_ID, 2, trace );

   //clone 9 times the current packet
   for( int i=1; i<10; i++ ){
      //increase ran\_ue\_id
      set\_numeric\_value( PROTO_NGAP, NGAP_ATT_RAN_UE_ID, ran_ue_id + i );
      //forward the packet having the modified ran\_ue\_id
      forward\_packet();
   }
}
]]></embedded_functions>

<property value="THEN"  delay_units="s" delay_min="0+" delay_max="1" property_id="100"
    description="Forwarding NAS security mode COMPLETE that answers to NAS security mode COMMAND "
    if_satisfied="em\_modif\_then\_forward">
    <event value="COMPUTE" event_id="1" description="NAS Security mode COMMAND"
           boolean_expression="(nas\_5g.message\_type == 93)"/>
    <event value="COMPUTE" event_id="2" description="NAS Security mode COMPLETE"
           boolean_expression="(nas\_5g.security\_type == 4)"/>
</property>

<property property_id="101" if_satisfied="#drop()"
    description="Do not forward any UDP packets having dest\_port other than 2152">
    <event event_id="1" description="From UE and GTP packets"
           boolean_expression="( (udp.dest\_port != 2152 ) )"/>
</property>

<property property_id="102" description="" if_satisfied="#update(ngap.procedure\_code, (ngap.procedure\_code.1 + 100))">
    <event event_id="1" description="having RAN UE ID"
           boolean_expression="(ngap.ran\_ue\_id != 0)"/>
</property>

规则 100 将匹配 2 个不同的数据包(因为它有 2 个事件和 delay_min=“0+”):
第一个数据包是 NAS 安全模式 COMMAND(nas_5g.message_type == 93)
第二个数据包是 NAS 安全模式 COMPLETE(nas_5g.message_type == 4)
在获取第二个数据包时,会调用 em_modif_then_forward 函数。在该函数中,我们可以修改第二个数据包的内容,然后将其注入到发出的网络中。该函数首先通过调用 forward_packet()转发第二个数据包,不做任何修改。然后调用 get_numeric_value 获取第二个数据包中 NGAP 协议 NGAP_ATT_RAN_UE 属性的当前值。然后通过调用 set_numeric_value 来标记该值的增加,并将变化范围内的数据包转发到网络。
注意:如果调用函数 set_numeric_value 两次来修改协议的同一属性,则只执行第二次调用。
规则 101 通过明确调用 drop() 函数,不转发 dest_port 不是 2152 的 UDP 数据包。
规则 102 检查数据包中是否包含不为零的 ngap ran_ue_id。如果是,则将 procedure_code 值增加 100。(默认情况下,它会将修改后的数据包转发到输出网卡)。

(四)编译规则

5Greplay 规则是以 XML 格式的纯文本指定的。这些规则需要编码成合适的格式,即动态 C 库,然后才能供 5Greplay 使用。
编译后的规则必须放在 ./rules 文件夹中。
5Greplay 提供了一个编译器来完成这样的任务。为此,我们需要事先安装 gcc,例如 sudo apt install gcc。
使用编译器编译 XML 文件中的规则。例如
./5greplay compile rules/1.so rules/1.xml
程序使用 3 个参数,格式为: output_file property_file [gcc 参数]
其中
output_file:是包含编译结果的文件路径,可以是 .c 文件或 .so 文件。
property_file:是可以找到属性文件的路径。
选项:
-c:只生成 C 代码。该选项允许在编译前手动修改生成的代码。生成 C 代码后,工具会打印出编译时需要执行的命令。
gcc 参数:用于生成 C 代码并编译以获得 .so 文件。这些参数将直接传送给 gcc 编译器,例如:-I /tmp -lmath

要获取编译规则的一些基本信息(如 ID、描述),我们可以使用 info 命令。默认情况下,工具会打印出所有规则的信息,例如

./5greplay info
mmt-5greplay: 5Greplay v0.0.1-5c9a333 using DPI v1.7.0.0 (a8ad3c2) is running on pid 24680
mmt-5greplay: Ignore duplicated rule id 103 (Inject only packet from UE -> Core but not inversed direction)
Found 3 rules.
1 - Rule id: 103
    - type            : DROP
    - events_count    : 2
    - variables_count : 2
    - variables       : sctp.ch_type (304.5), sctp.dest_port (304.2)
    - description     : Inject only SCTP packets from UE -> Core but not inversed direction
    - if_satisfied    : 0x7f84c2d95db5
    - version         : 0.0.1 (5c9a333 - 2021-9-9 11:36:44), dpi version 1.7.0.0 (a8ad3c2)


也可以使用该工具检查特定的编译规则,方法是将规则路径作为参数,例如

./5greplay info rules/forward-localhost.so
mmt-5greplay: 5Greplay v0.0.1-5c9a333 using DPI v1.7.0.0 (a8ad3c2) is running on pid 21983
Found 2 rules.
1 - Rule id: 103
    - type            : DROP
    - events_count    : 2
    - variables_count : 2
    - variables       : sctp.ch_type (304.5), sctp.dest_port (304.2)
    - description     : Inject only SCTP packets from UE -> Core but not inversed direction
    - if_satisfied    : 0x7f2925125db5
    - version         : 0.0.1 (5c9a333 - 2021-9-9 11:36:44), dpi version 1.7.0.0 (a8ad3c2)

与之前介绍命令章节中的info命令一致

(五)默认值

在规则的 XML 文件中,如果没有 XML 标记的属性,则默认设置其值:

  • property, operator:
  • type_property: FORWARD
  • value : COMPUTE (=> only one is required. Thus delay_min and delay_max must be 0)
  • delay_units: s
  • delay_min: 0
  • delay_max: 0

XML 规则描述的语义

5Greplay 规则用于正式指定网络上的事件,这些事件表示要转发、丢弃或修改的数据包。这些规则依赖于 LTL(线性时态逻辑),并以 XML 格式编写。这样做的好处是结构简单明了,便于工具进行验证和处理。在本文档中,我们交替使用属性和规则这两个术语。
定义规则时,用户必须在规则中指明
将处理哪个数据包(过滤)
使用哪种操作(丢弃、转发或修改)
如何修改数据包(如果要采取的操作是修改,则定义要更改的值)
…(未完待续)

转发数据包

介绍 5Greplay 如何转发数据包
5Greplay 可以使用 libpcap 或 DPDK(如果工具使用 DPDK 编译)将原始数据包原封不动地转发到输出网卡。
实现方法在 src/forward 文件夹中。
为了避免数据包被认为是重复的,从而被端点协议拒绝,5Greplay 支持在它和端点之间创建一个新的数据流,然后使用该数据流注入数据包的有效载荷。
目前,它支持 SCTP 和 UDP 流。端点信息通过配置文件提供,使用的参数如下:

  • forward.target-protocols: list of stream protocols, for example, {SCTP,UDP}
  • forward.target-hosts: IPs of the targets corresponding to each protocol
  • forward.target-ports: Port numbers of the targets corresponding to each protocol.
    例如:
    如果我们想使用新的 SCTP 连接来转发 SCTP 数据包的有效载荷,而其他数据包(包括 UDP 数据包)则按原样转发,那么我们可以使用以下配置:
forward
{
    enable     = true
    output-nic = "lo"
    nb-copies  = 1
    snap-len   = 0
    promisc    = 1
    default    = DROP
    target-protocols = { SCTP }
    target-hosts     = { "127.0.0.5" }
    target-ports     = { 38412 }
}

使用这些配置参数,所有 SCTP 数据包的有效载荷都将发送到端口 38412 的 127.0.0.5。其他数据包(不包括包含 SCTP 协议的数据包)将被注入 lo 网卡接口。
支持的协议及其属性
协议及其属性列表载于 protocols-attributes-list.txt。
我们也可以通过运行 ./5greplay list 来获取该列表。
例如

Protocol id 904      Name nas_5g
    - Attribute id 1,      Name protocol_discriminator 
    - Attribute id 2,      Name message_type 
    - Attribute id 3,      Name security_type 
    - Attribute id 4,      Name procedure_transaction_id 


### 一、网安学习成长路线图


网安所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/aa7be04dc8684d7ea43acc0151aebbf1.png)


### 二、网安视频合集


观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/f0aeee2eec7a48f4ad7d083932cb095d.png)


### 三、精品网安学习书籍


当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/078ea1d4cda342f496f9276a4cda5fcf.png)


### 四、网络安全源码合集+工具包


光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/e54c0bac8f3049928b488dc1e5080fc5.png)


### 五、网络安全面试题


最后就是大家最关心的网络安全面试题板块  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/15c1192cad414044b4dd41f3df44433d.png)![在这里插入图片描述](https://img-blog.csdnimg.cn/b07abbfab1fd4edc800d7db3eabb956e.png)  



**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注网络安全)**
![img](https://img-blog.csdnimg.cn/img_convert/0c9cd57b773c949c7cc790dab3f6f9d0.png)

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

后就是大家最关心的网络安全面试题板块  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/15c1192cad414044b4dd41f3df44433d.png)![在这里插入图片描述](https://img-blog.csdnimg.cn/b07abbfab1fd4edc800d7db3eabb956e.png)  



**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注网络安全)**
[外链图片转存中...(img-AA8G5jux-1713296061520)]

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 24
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
作者:k0shl ####一些环境说明: 编译环境:Windows 10 x64 build 1607 项目IDE:VS2013 测试环境:Windows 7 x86、Windows 10 x86 build 1607 参数介绍: "-l" :开启日志记录模式(不会影响主日志记录模块) "-s" :驱动枚举模块 "-d" :打开设备驱动的名称 "-i" :待Fuzz的ioctl code,默认从0xnnnn0000-0xnnnnffff "-n" :在探测阶段采用null pointer模式,该模式下极易fuzz 到空指针引用漏洞,不加则常规探测模式 "-r" :指定明确的ioctl code范围 "-u" :只fuzz -i参数给定的ioctl code "-f" :在探测阶段采用0x00填充缓冲区 "-q" :在Fuzz阶段不显示填充input buffer的数据内容 "-e" :在探测和fuzz阶段打印错误信息(如getlasterror()) "-h" :帮助信息 ####常用Fuzz命令实例: kDriver Fuzz.exe -s 进行驱动枚举,将CreateFile成功的驱动设备名称,以及部分受限的驱动设备名称打印并写入Enum Driver.txt文件中 kDriver Fuzz.exe -d X -i 0xaabb0000 -f -l 对X驱动的ioctl code 0xaabb0000-0xaabbffff范围进行探测及对可用的ioctl code进行fuzz,探测时除了正常探测外增加0x00填充缓冲区探测,开启数据日志记录(如增加-u参数,则只对ioctl code 0xaabb0000探测,若是有效ioctl code则进入fuzz阶段) kDriver Fuzz.exe -d X -r 0xaabb1122-0xaabb3344 -n -l 对X驱动的ioctl code 0xaabb1122-0xaabb3344范围内进行探测,探测时采用null pointer模式,并数据日志记录
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值