wafw00f源码及流量特征分析

news2024/10/3 10:36:34

wafw00f介绍

这不是本次的重点,相关介绍及使用方法相信大家已经了解,所以此处就直接引用其开发者对该工具的介绍。

1668779762_63778ef2c9b5f811b18aa.png!small?1668779761475

To do its magic, WAFW00F does the following:

  • Sends a normal HTTP request and analyses the response; this identifies a number of WAF solutions.

通过发送正常的HTTP请求并且分析其返回包,判断其是否使用 WAF ,若使用确认WAF类型

  • If that is not successful, it sends a number of (potentially malicious) HTTP requests and uses simple logic to deduce which WAF it is.

若是无法通过正常的HTTP请求结果分析出是否使用WAF以及其类型,则构造恶意的请求通过简单的逻辑再次进行判断

  • If that is also not successful, it analyses the responses previously returned and uses another simple algorithm to guess if a WAF or security solution is actively responding to our attacks.

如果这也不成功,它会分析之前返回的响应,并使用另一种简单的算法来猜测WAF或安全解决方案是否正在积极响应我们的攻击

使用场景/方法

这不是本次的重点,想要具体了解其用法去其github主页即可

https://github.com/EnableSecurity/wafw00f

本工具的作用上面已经很详细的描述出来了,概括一下很简单:
探测目标是否存在WAF,也可以说wafw00f是一个Web应用防火墙(WAF)指纹识别的工具。

使用方法不难,此处不做介绍,若想进一步了解见:WEB 防火墙探测工具 – wafw00f 使用教程 - General
的个人博客

wafw00f 源码解析

所谓源码解析并不会完整分析其源码中的所有功能,比如 日志、输出、展示 等功能不在我们分析的范围内,而其对 WAF 的检测逻辑
所发流量的特征WAF 识别的指纹 等将是重点要分析的地方。

流程:

  1. 解析源码含义,分析特征
  2. 抓包观察

源码文件结构

为了方便大家之后去看源码,此处简单描述一下源码的组成,其中没有描述的说明其用不大,大家自己去看就知道了,其中标注important是本工具的主要功能文件,后续将重点说明。

1668779769_63778ef9467c1c452a6b5.png!small?1668779767856

  • bin

  • lib

    • asciiarts.py
    • evillib.py用于向目标建立连接发起请求 ( important )
  • plugins 用于判断各个WAF的指纹 ( important )

    • aliyundun.py阿里云盾的特征值匹配文件
    • huaweicloud.py 华为云的特征值匹配文件
    • baidu.py百度云加速的特征匹配文件
    • ……

还有很多特征文件大家自己去看就好

  • __init__.py

  • main.py 该工具主要的检测、判断功能的类与函数都在该文件中实现( important )

  • manager.py加载plugins中的WAF指纹判断文件识别目标WAF类型

  • wafprio.py

上述非important的文件起到的作用多是一些起到 输出选项、连接 等功能的文件/函数,所以不做特殊介绍

基本流程

请求的流程并不复杂,和最开始介绍处的流程如出一辙:

  • 发送正常HTTP请求,并判断是否存在WAF若存在根据指纹判断其类型
  • 若正常HTTP检测不出WAF,则附加恶意的请求尝试出发WAF并分析其类型

最后所谓的根据算法猜测,流量特征不明显,不在此次分析的范围内,实际用处也不大。

请求运行流程( important

以第一次的正常HTTP请求探测为例(其余的都一致)。

1668779774_63778efe6b5b2740e1822.png!small?1668779773039

由于对 Python 并不是太了解,所以作用域的表示采用了C++中的::(若是不对请及时指出会做更改)。

main.py分析

完整的源码就不放在这占地方了,大家随时可到其github主页获取,此处直接分析其重点部分

由上述流程可以看出,所有的请求均是从class WAFW00F中发起,所以该类就是我们分析的重中之重!

请求的具体实现(比如请求中携带了哪些内容)将在分析evillib.py文件是分析, 此处主要分析何时要发出何种请求。

main()函数出发看其逻辑:(解析参数等功能将直接略过)

没有指定其余参数

  • 对输入的URL做相关处理后放到target中传入WAFW00F进行处理

    attacker = WAFW00F(target, debuglevel=options.verbose, path=path,followredirect=options.followredirect, extraheaders=extraheaders,proxies=proxies)
    

    若请求没有结果则说明目标网站或本地网络有问题

    if attacker.rq is None:
    log.error(‘Site %s appears to be down’ % hostname)
    continue

  • 由于第一次做的是常规探测,若此处就匹配到了WAF的指纹则输出结束即可,具体的输出等逻辑不是重点,略过;

  • 若无法分析出其是否存在WAF或匹配不出WAF则通过identwaf()函数进步拼凑恶意参数进行探测;

    waf = attacker.identwaf(options.findall)
    

    log.info(‘Identified WAF: %s’ % waf)

  • 进入identwaf()函数后,便会尝试匹配各个WAF的特征;

    def identwaf(self, findall=False):
    detected = list()
    try:
       self.attackres = self.performCheck(self.centralAttack)
    except RequestBlocked:
        return detected
    for wafvendor in self.checklist:
        self.log.info('Checking for %s' % wafvendor)
        if self.wafdetections[wafvendor](self):
            detected.append(wafvendor)
                if not findall:
                    break
        self.knowledge['wafname'] = detected
        return detected
    

这就是基本的流程。

解析来如果还没有确定出WAF便会进入其自己提供的一个算法,但这并不是我们对流量特征分析所要关注的地方,所以就不探讨了。

下面到了激动人心的时刻,WAFW00F类中到底是如何实现的呢?

class WAFW00F

一上来就中了大奖:

class WAFW00F(waftoolsengine):

    xsstring = '<script>alert("XSS");</script>'
    sqlistring = "UNION SELECT ALL FROM information_schema AND ' or SLEEP(5) or '"
    lfistring = '../../../../etc/passwd'
    rcestring = '/bin/cat /etc/passwd; ping 127.0.0.1; curl google.com'
    xxestring = '<!ENTITY xxe SYSTEM "file:///etc/shadow">]><pwn>&hack;</pwn>'

WAFW00F这个工具所要构造拼接的恶意代码在一开始就全部列出了,
而且在之后的使用中绝无变化,要构造恶意的请求就是从上述5个字符串中选择1个或多个直接使用。

可以看到改用据 用于判断是否存在WAF的语句就以下五类:

  • **XSS类 **<script>alert("XSS");</script>
  • **SQL注入类 **UNION SELECT ALL FROM information_schema AND ' or SLEEP(5) or '
  • **遍历类 **../../../../etc/passwd
  • **命令执行/拼接类 **/bin/cat /etc/passwd; ping 127.0.0.1; curl google.com
  • **XXE类 **<!ENTITY xxe SYSTEM "file:///etc/shadow">]><pwn>&hack;</pwn>

那么有了这些语句,WAFW00F又该如何拼接呢?

def normalRequest(self):
     return self.Request()

def customRequest(self, headers=None):
     return self.Request(headers=headers)

def nonExistent(self):
     return self.Request(path=self.path + str(random.randrange(100, 999)) + '.html')

def xssAttack(self):
     return self.Request(path=self.path, params= {'s': self.xsstring})

def xxeAttack(self):
     return self.Request(path=self.path, params= {'s': self.xxestring})

def lfiAttack(self):
     return self.Request(path=self.path + self.lfistring)

def centralAttack(self):
     return self.Request(path=self.path, params={'a': self.xsstring, 'b': self.sqlistring, 'c': self.lfistring})

def sqliAttack(self):
     return self.Request(path=self.path, params= {'s': self.sqlistring})

def oscAttack(self):
     return self.Request(path=self.path, params= {'s': self.rcestring})

具体逻辑并不难理解,拿出几种几个来说一下。

1:def xssAttack(self)

def xssAttack(self):
     return self.Request(path=self.path, params= {'s': self.xsstring})

例如给一个简单的例子:我们传给wafw00fURL为:http://127.0.0.1:9000则经过该参数拼接后的请求就为:

http://127.0.0.1:9000/?s=<script>alert("XSS");</script>URL编码前 )。

2: def centralAttack(self):

def centralAttack(self):
     return self.Request(path=self.path, params={'a': self.xsstring, 'b': self.sqlistring, 'c': self.lfistring})

例如给一个简单的例子:我们传给wafw00fURL为:http://127.0.0.1:9000则经过该参数拼接后的请求就为:

http://127.0.0.1:9000/?s=<script>alert("XSS");</script>&b=UNION SELECT ALL FROM information_schema AND ' or SLEEP(5) or '&c=../../../../etc/passwdURL编码前 )

从前面的流程可以看出,在def identwaf(self, findall=False):中调用的拼接的语句的方法就是本方法,拼接进三个语句,

其他的逻辑相同。

evillib.py分析

上面只是在上层对要拼接哪些参数进行构造,实际上组合成完整的 HTTP 报文调用requests.get()进行请求的是在该文件中。

wafw00f中若没有通过—headers指定头部的话,会使用自己默认的—headers这个默认的 headers 就定义在该文件中。

def_headers = {'Accept'         : 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3',
               'Accept-Encoding': 'gzip, deflate',
               'Accept-Language': 'en-US,en;q=0.9',
               'DNT'            : '1',  # Do Not Track request header
               'User-Agent'     : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3770.100 Safari/537.36',
               'Upgrade-Insecure-Requests': '1' #
        }

默认情况下,接下来通过requests.get()请求时便会使用该头部,

def Request(self, headers=None, path=None, params={}, delay=0, timeout=7):
    try:
       time.sleep(delay)
       if not headers:
           h = self.headers
       else: h = headers
       req = requests.get(self.target, proxies=self.proxies, headers=h, timeout=timeout,
                    allow_redirects=self.allowredir, params=params, verify=False)
       self.log.info('Request Succeeded')
       self.log.debug('Headers: %s\\n' % req.headers)
       self.log.debug('Content: %s\\n' % req.content)
       self.requestnumber += 1
       return req
     except requests.exceptions.RequestException as e:
            self.log.error('Something went wrong %s' % (e.__str__()))

指纹的识别

Huawei Cloud WAF的指纹来说

#!/usr/bin/env python
'''
Copyright (C) 2022, WAFW00F Developers.
See the LICENSE file for copying permission.
'''

NAME = 'Huawei Cloud Firewall (Huawei)'

def is_waf(self):
    schemes = [
				
				# 匹配 cookie
        self.matchCookie(r'^HWWAFSESID='),
				# 匹配 header 中的 Server
        self.matchHeader(('Server', r'HuaweiCloudWAF')),
				# 匹配 body
        self.matchContent(r'hwclouds\\.com'),
        self.matchContent(r'hws_security@')
    ]
    if any(i for i in schemes):
        return True
    return False

CSDN使用华为云防护

1668779785_63778f0905b4c22ca27ee.png!small?1668779783711

其余脚本见:wafw00f/wafw00f/plugins at master ·
EnableSecurity/wafw00f

wafw00f 流量

1668779788_63778f0ccb052e89a938d.png!small?1668779787707

1668779791_63778f0faeaf4c7812b12.png!small?1668779790449

CSDN使用华为云防护

[外链图片转存中…(img-2XUm2e6B-1676465985889)]

其余脚本见:wafw00f/wafw00f/plugins at master ·
EnableSecurity/wafw00f

wafw00f 流量

[外链图片转存中…(img-bvlVndeR-1676465985889)]

[外链图片转存中…(img-Dfxdushb-1676465985889)]

网络安全工程师企业级学习路线

这时候你当然需要一份系统性的学习路线

如图片过大被平台压缩导致看不清的话,可以在文末下载(无偿的),大家也可以一起学习交流一下。

一些我收集的网络安全自学入门书籍

一些我白嫖到的不错的视频教程:

上述资料【扫下方二维码】就可以领取了,无偿分享

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/347671.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(考研湖科大教书匠计算机网络)第四章网络层-第三节3、4:划分子网的IPv4地址和无分类IP地址

获取pdf&#xff1a;密码7281专栏目录首页&#xff1a;【专栏必读】考研湖科大教书匠计算机网络笔记导航 文章目录一&#xff1a;划分子网的IPv4地址&#xff08;1&#xff09;划分子网思想&#xff08;2&#xff09;子网掩码A&#xff1a;概述B&#xff1a;例子C&#xff1a;默…

Django 模型继承问题

文章目录Django 模型继承问题继承出现的情况Meta 和多表继承Meta 和多表继承继承与反向关系指定父类连接字段代理模型QuerySet 仍会返回请求的模型基类约束代理模型管理器代理继承和未托管的模型间的区别多重继承不能用字段名 "hiding"在一个包中管理模型Django 模型…

linux安装极狐gitlab

1. 官网寻找安装方式 不管我们使用任何软件&#xff0c;最靠谱的方式就是查看官方文档。gitlab提供了相应的安装文档&#xff0c;并且有对应的中文文档。地址如下&#xff1a; https://gitlab.cn/install/ 我在这里以CentOS作为安装示例&#xff0c;大家可根据自己的需要选择…

LabVIEW中ActiveX控件、ActiveX服务器和类型库注册

LabVIEW中ActiveX控件、ActiveX服务器和类型库注册如何在计算机上手动注册ActiveX控件&#xff08;.ocx &#xff09;、ActiveX服务器&#xff08;.DLL和.EXE&#xff09;以及类型库&#xff08;.TLB &#xff09;&#xff1f;在LabVIEW中打开ActiveX控件或类的引用时&#xff…

XCP实战系列介绍12-基于Vector_Davinci工具的XCP配置介绍(一)

本文框架 1.概述2. EcuC配置2.1 Pdu添加步骤2.2 配置项说明3. Can 模块配置4. CanIf 模块配置4.1 接收帧的Hardware Receive Object配置4.2 接收帧和发送帧的Pdu配置1.概述 在文章《看了就会的XCP协议介绍》中详细介绍了XCP的协议,在《XCP实战系列介绍01-测量与标定底层逻辑》…

ELK分布式日志收集快速入门-(二)kafka进阶-快速安装可视化管理界面-(单节点部署)

目录安装前准备安装中安装成功安装前准备 安装kafka-参考博客 (10条消息) ELK分布式日志收集快速入门-&#xff08;一&#xff09;-kafka单体篇_康世行的博客-CSDN博客 安装zk 参考博客 (10条消息) 快速搭建-分布式远程调用框架搭建-dubbozookperspringboot demo 演示_康世行的…

Python编程 动态爱心

作者简介&#xff1a;一名在校计算机学生、每天分享Python的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.所用库 1.random简介 2.math 简介 3.tkinter库的简介 二.实际图 三.…

OKR之剑·实战篇06:OKR致胜法宝-氛围业绩双轮驱动(下)

作者&#xff1a;vivo 互联网平台产品研发团队 本文是《OKR 之剑》系列之实战第 6 篇—— 本文介绍团队营造氛围的方法与实践、在业绩方面的探索与输出&#xff0c;在两方面分别总结了一些经验分享给大家。 一、我们营造氛围的方法与实践 先说说氛围。组织氛围的提出者库尔…

10分钟学会数据库压力测试,你敢信?

目录 前言 查看数据库版本 下载驱动&#xff1a; 菜单路径 配置 Variable Name Bound to Pool模块配置 Connection pool configuration模块配置 Database Connection Configuration模块配置 菜单路径 Variable Name Bound to Pool 脚本结构 脚本&#xff08;执行查询…

2.3 IS-IS认证

2.2.3 实验三:IS-IS认证 1. 实验目的  实现IS-IS接口认证 实现IS-IS区域认证实验IS-IS路由域认证2. 实验拓扑 IS-IS认证的实验拓扑如图2-6 图2-6:IS-IS认证 3. 实验步骤 配置IP地址(此处略…

让ChatGPT做当年的高考现代文阅读

最近ChatGPT火出天际&#xff0c;我突发奇想&#xff0c;如果用ChatGPT来做高考现代文阅读会怎样。 于是找到了当年非常火的一篇文章&#xff0c;叫《一种美味》&#xff0c;这个名字大家可能不太熟&#xff0c;但是提到其中一句话&#xff0c;你可能立马就想起来了。 「眼里…

一些NLP术语

一些NLP术语pre-training&#xff08;预训练&#xff09;fine-tuning&#xff08;微调&#xff09;下游任务Few-shot Learning&#xff08;少样本学习&#xff09;Prompt&#xff1f;&#xff08;自然语言提示信息&#xff09;二级标题三级标题pre-training&#xff08;预训练&…

Redis第一讲

目录 一、Redis01 1.1 NoSql 1.1.1 NoSql介绍 1.1.2 NoSql起源 1.1.3 NoSql的使用 1.2 常见NoSql数据库介绍 1.3 Redis简介 1.3.1 Redis介绍 1.3.2 Redis数据结构的多样性 1.3.3 Redis应用场景 1.4 Redis安装、配置以及使用 1.4.1 Redis安装的两种方式 1.4.2 Redi…

字节软件测试岗:惨不忍睹的三面,幸好做足了准备,月薪15k,拿到offer

我今年25岁&#xff0c;专业是电子信息工程本科&#xff0c;19年年末的时候去面试&#xff0c;统一投了测试的岗位&#xff0c;软件硬件都有&#xff0c;那时候面试的两家公司都是做培训的&#xff0c;当初没啥钱&#xff0c;他们以面试为谎言再推荐去培训这点让我特别难受。 …

关于APP下载量提升的技巧

关于APP应用下载量提升&#xff0c;很多人都不是很了解。今天厦门巨神峰小编给大家说下关于APP下载量提升的几个技巧。 一、抓住流行趋势&#xff0c;提升APP下载量 1、利用社交媒体进行推广。社交媒体是当下最流行的推广手段&#xff0c;可以有效的将APP的消息传播到更多的用…

物联网对网页设计和开发的影响

当下从汽车、工业设备、家用电器到安全系统&#xff0c;越来越多的设备已经都连接到了互联网。与此同时&#xff0c;物联网在网页开发方面也有一些重大发展。因企业对于物联网应用需求不断增长&#xff0c;促使更多开发人员和设计人员从事物联网应用的开发和设计。下面我们将带…

Gotify消息推送系统搭建

昨天网友 sincoslong 提到了一个很好的建议&#xff1a; docker 注册表版本别选择 latest 选择具体版本号。 有的新版本&#xff0c;数据库、 php 各种依赖&#xff0c;都升级。小白如果选择最近更新的版本&#xff0c;估计写个 blog 都是记录如何失败的。 虽然有的人也会看…

STM32单片机超声波模块测距

OLED液晶接口电路图超声波模块接口电路图STM32单片机超声波模块测距程序源代码#include "sys.h"#define OLED_RST_Clr() PCout(13)0 //RST#define OLED_RST_Set() PCout(13)1 //RST#define OLED_RS_Clr() PBout(4)0 //DC#define OLED_RS_Set() PBout(4)1 //DC#define…

碰撞检测算法分类

包围形法粗糙检测, 包含以下两种类检测外接圆法轴对齐包围矩形&#xff0c; AABB 碰撞检测算法之包围形法分离轴精细检测 BOX vs PolygonOBBseparating Axis Theorem碰撞检测算法之分离轴定理GJKGJK&#xff08;Gilbert–Johnson–Keerthi&#xff09;, 相比 SAT 算法&#xff…

Ae 入门系列之一:软件界面与工作流程

Adobe After Efftects&#xff08;简称为 Ae &#xff09;可以帮助用户高效且精确地创建无数引人注目的动态图形和震撼人心的视觉效果。利用与其他 Adobe 软件紧密集成和高度灵活的二维和三维合成&#xff0c;并且提供数百种预设的效果和动画&#xff0c;可为影视特效、产品广告…