电脑疯子技术论坛|电脑极客社区

微信扫一扫 分享朋友圈

已有 1876 人浏览分享

waf指纹识别工具WAFW00F的原理,安装与使用

[复制链接]
1876 0
本帖最后由 zhaorong 于 2021-7-26 15:36 编辑

原理

发送正常的HTTP请求并分析响应;这确定了许多WAF方案解决
如果不成功则发送多个(可能是恶意的)HTTP请求并使用简单的逻辑来
。示例就是WAF则分析先前回复的响应并采用另一种简单的方法来抢救WAF或安
。解决全是否正在积极响应我们的请求

事实上它的核心就是其中的的main.py:
  1. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">#!/usr/bin/env python </font></font>
  2. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"># -*- coding: utf-8 -*- </font></font>
  3. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">'''</font></font>
  4. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">版权所有 (C) 2019,WAFW00F 开发人员。</font></font>
  5. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">有关复制权限,请参阅 LICENSE 文件。</font></font>
  6. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">''' </font></font>
  7. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">import csv </font></font>
  8. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">import io </font></font>
  9. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">import json </font></font>
  10. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">import logging </font></font>
  11. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">import os </font></font>
  12. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">import random </font></font>
  13. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">import re </font></font>
  14. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">import sys </font></font>
  15. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">from collections import defaultdict </font></font>
  16. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">from optparse import OptionParser </font></font>
  17. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">from wafw00f.lib.asciiarts import * </font></font>
  18. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">from wafw00f import __version__, __license__ </font></font>
  19. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">from wafw00f.manager import load_plugins </font></font>
  20. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">from wafw00f. wafprio</font></font>
  21. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">从 wafw00f.lib.evillib 导入 wafdetectionsprio 导入 urlParser、waftoolsengine、def_headers</font></font>
复制代码
  1. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">class WAFW00F(waftoolsengine): </font></font>

  2. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    xsstring = '<script>alert("XSS");</script>' </font></font>
  3. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    sqlistring = "UNION SELECT ALL FROM information_schema AND ' or SLEEP(5) or '" </font></font>
  4. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    lfistring = '../.. /../../etc/passwd' </font></font>
  5. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    rcestring = '/bin/cat /etc/passwd; </font><font style="vertical-align: inherit;">平 127.0.0.1; </font><font style="vertical-align: inherit;">curl google.com' </font></font>
  6. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    xxestring = '<!ENTITY xxe SYSTEM "file:///etc/shadow">]><pwn>&hack;</pwn>' </font></font>

  7. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    def __init__(self, target='www.example.com' , debuglevel=0, path='/', </font></font>
  8. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                 followredirect=True, extraheaders={}, proxies=None): </font></font>

  9. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        self.log = logging.getLogger('wafw00f') </font></font>
  10. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        self.attackres = None </font></font>
  11. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        waftoolsengine.__init__(self, target,</font></font>
  12. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        self.knowledge = dict(generic=dict(found=False, reason=''), wafname=list()) </font></font>

  13. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    def normalRequest(self): </font></font>
  14. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        return self.Request() </font></font>

  15. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    def customRequest(self, headers=None): </font></font>
  16. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        return self .Request(headers=headers) </font></font>

  17. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    def nonExistent(self): </font></font>
  18. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        return self.Request(path=self.path + str(random.randrange(100, 999)) + '.html') </font></font>

  19. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    def xssAttack(self): </font></font>
  20. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        return self. Request(path=self.path, params= {'s': self.xsstring}) </font></font>

  21. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    def xxeAttack(self): </font></font>
  22. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        return self.Request(path=self.path, params= {'s': self.xxestring}) </font></font>

  23. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    def lfiAttack(self): </font></font>
  24. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        return self.Request(path=self.path + self.lfistring) </font></font>

  25. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    def centralAttack(self):</font></font>
  26. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        return self.Request(path=self.path, params={'a': self.xsstring, 'b': self.sqlistring, 'c': self.lfistring}) </font></font>

  27. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    def sqliAttack(self): </font></font>
  28. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        return self.Request( path=self.path, params= {'s': self.sqlistring}) </font></font>

  29. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    def oscAttack(self): </font></font>
  30. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        return self.Request(path=self.path, params= {'s': self.rcestring}) </font></font>

  31. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    def performCheck( self, request_method): </font></font>
  32. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        r = request_method()</font></font>
  33. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        如果 r 是 None: </font></font>
  34. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            raise RequestBlocked() </font></font>
  35. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        return r</font></font>
复制代码
  1. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"># 用于检测 WAF 的最常见攻击</font></font>
  2. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    attcom = [xssAttack, sqliAttack, lfiAttack] Attack </font></font>
  3. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    = [xssAttack, xxeAttack, lfiAttack, sqliAttack, oscAttack] </font></font>
  4. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    def genericdetect(self): </font></font>
  5. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        reason = '' reason </font></font>
  6. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        = ['Blocking is being done at connection /packet level.', </font></font>
  7. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                   '检测到攻击时服务器标头不同。', </font></font>
  8. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                   '当使用攻击字符串时,服务器返回不同的响应代码。', </font></font>
  9. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                   '它关闭了正常请求的连接。', </font></font>
  10. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                   '当请求不是从浏览器发出时,响应是不同的。</font></font>
  11. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                ]</font></font>
复制代码
  1. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">try: </font></font>
  2. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            # 测试没有用户代理响应。</font><font style="vertical-align: inherit;">检测几乎所有的 WAF。</font></font>
  3. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            resp1 = self.performCheck(self.normalRequest) </font></font>
  4. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            if 'User-Agent' in self.headers: </font></font>
  5. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                del self.headers['User-Agent'] # 从对象中删除用户代理密钥不是字典。</font></font>
  6. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            resp3 = self.customRequest(headers=def_headers) </font></font>
  7. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            if resp1.status_code != resp3.status_code: </font></font>
  8. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                self.log.info('当请求不包含用户代理头时,服务器返回了不同的响应。') </font></font>
  9. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                reason = reason [4] </font></font>
  10. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                reason += '\r\n' </font></font>
  11. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                reason += '正常响应代码为“%s”,' % resp1.status_code</font></font>
  12. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                reason += ' 而修改请求的响应代码是 "%s"' % resp3.status_code </font></font>
  13. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                self.knowledge['generic']['reason'] = reason </font></font>
  14. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                self.knowledge['generic']['found'] = True </font></font>
  15. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                return True </font></font>

  16. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            # 发送 xss 攻击时测试状态码</font></font>
  17. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            resp2 = self.performCheck(self.xssAttack) </font></font>
  18. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            if resp1.status_code != resp2.status_code: </font></font>
  19. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                self.log.info('当 XSS 攻击时服务器返回不同的响应')</font></font>
  20. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                原因 = 原因 [2]</font></font>
  21. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                原因 += '\r\n'</font></font>
  22. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                原因 += '正常响应代码是 "%s",' % resp1.状态代码</font></font>
  23. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                reason += ' 而跨站脚本攻击的响应代码是 "%s"' % resp2.status_code </font></font>
  24. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                self.knowledge['generic']['reason'] = reason </font></font>
  25. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                self.knowledge['generic']['found '] = True </font></font>
  26. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                return True </font></font>

  27. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            # 发送 lfi 攻击时测试状态码</font></font>
  28. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            resp2 = self.performCheck(self.lfiAttack) </font></font>
  29. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            if resp1.status_code != resp2.status_code: </font></font>
  30. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                self.log.info('Server已尝试目录遍历。') </font></font>
  31. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                reason = reason[2] </font></font>
  32. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                reason += '\r\n' </font></font>
  33. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                reason += '正常响应代码是 "%s",' % resp1.status_code</font></font>
  34. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                reason += ' 而文件包含攻击的响应代码是 "%s"' % resp2.status_code </font></font>
  35. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                self.knowledge['generic']['reason'] = reason </font></font>
  36. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                self.knowledge['generic']['found' ] = True </font></font>
  37. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                return True </font></font>

  38. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            # 发送sqli攻击时测试状态码</font></font>
  39. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            resp2 = self.performCheck(self.sqliAttack) </font></font>
  40. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            if resp1.status_code != resp2.status_code: </font></font>
  41. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                self.log.info('当SQLi攻击时服务器返回不同的响应')</font></font>
  42. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                原因 = 原因 [2]</font></font>
  43. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                原因 += '\r\n'</font></font>
  44. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                原因 += '正常响应代码是 "%s",' % resp1。状态代码</font></font>
  45. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                reason += ' 而 SQL 注入攻击的响应代码是 "%s"' % resp2.status_code </font></font>
  46. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                self.knowledge['generic']['reason'] = reason </font></font>
  47. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                self.knowledge['generic']['found' ] = True </font></font>
  48. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                return True </font></font>

  49. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            # 发送恶意请求后检查服务器头</font></font>
  50. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            response = self.attackres </font></font>
  51. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            normalserver = resp1.headers.get('Server') </font></font>
  52. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            attackresponse_server = response.headers.get('Server') </font></font>
  53. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            if attackresponse_server: </font></font>
  54. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                if attackresponse_server ! = normalserver: </font></font>
  55. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                    self.log.info('服务器头改变,可能检测到WAF')</font></font>
  56. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                    self.log.debug('Attack response: %s' % attackresponse_server) </font></font>
  57. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                    self.log.debug('Normal response: %s' % normalserver) </font></font>
  58. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                    reason = </font><font style="vertical-align: inherit;">Reasons </font><font style="vertical-align: inherit;">[1] </font></font>
  59. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                    reason += '\r\n正常响应是 "%s", ' % normalserver </font></font>
  60. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                    reason += ' 而服务器标头对攻击的响应是 "%s",' % attackresponse_server </font></font>
  61. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                    self.knowledge['generic']['reason'] = reason </font></font>
  62. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                    self. Knowledge['generic']['found'] = True</font></font>
  63. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                    返回 True</font></font>
复制代码
  1. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"># 如果所有请求都没有通过,</font></font>
  2. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        除了 RequestBlocked 外</font><font style="vertical-align: inherit;">按 F </font><font style="vertical-align: inherit;">:</font></font>
  3. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            self.knowledge['generic']['reason'] = </font></font>
  4. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            Reasons[ </font><font style="vertical-align: inherit;">0] </font><font style="vertical-align: inherit;">self.knowledge['generic']['found'] = True </font></font>
  5. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            return True </font></font>
  6. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        return False </font></font>

  7. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    def matchHeader(self, headermatch,attack=False): </font></font>
  8. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        if attack: </font></font>
  9. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            r = self.attackres </font></font>
  10. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        else: r = rq </font></font>
  11. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        if r is None: </font></font>
  12. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            return </font></font>
  13. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        header, match = headermatch </font></font>
  14. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        headerval = r.headers.get(header) </font></font>
  15. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        if headerval : </font></font>
  16. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            # set-cookie 可以有多</font></font>
  17. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            个头</font><font style="vertical-align: inherit;">,python 给了我们</font><font style="vertical-align: inherit;"># 用逗号连接</font></font>
  18. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            if header == 'Set-Cookie': </font></font>
  19. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                headervals = headerval.split(', ') </font></font>
  20. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            else: </font></font>
  21. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                headervals = [headerval] </font></font>
  22. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            for headervals: </font></font>
  23. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                if re.search(match, headerval, re.I): </font></font>
  24. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                    return True </font></font>
  25. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        return False </font></font>

  26. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    def matchStatus(self, statuscode, attack=True): </font></font>
  27. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        if attack: </font></font>
  28. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            r = self.attackres </font></font>
  29. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        else: r = rq </font></font>
  30. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        if r is None: </font></font>
  31. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            return </font></font>
  32. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        if r.status_code == statuscode: </font></font>
  33. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            return True </font></font>
  34. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        return False</font></font>
复制代码
  1. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">def matchCookie(self, match,attack=False): </font></font>
  2. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        return self.matchHeader(('Set-Cookie', match),attack=attack) </font></font>

  3. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    def matchReason(self, reasoncode,attack=True): </font></font>
  4. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        if attack: </font></font>
  5. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            r = self. attackres </font></font>
  6. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        else: r = rq </font></font>
  7. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        if r is None: </font></font>
  8. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            return </font></font>
  9. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        # 我们可能需要在响应体中匹配多行上下文</font></font>
  10. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        if str(r.reason) == reasoncode: </font></font>
  11. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            return True </font></font>
  12. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        return False </font></font>

  13. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    def matchContent(self, regex, attack=True):</font></font>
  14. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        如果攻击:</font></font>
  15. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            r = self.attackres </font></font>
  16. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        else:r = rq</font></font>
  17. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        如果 r 是 None:</font></font>
  18. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            返回</font></font>
  19. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        # 我们可能需要在响应体中匹配多行上下文</font></font>
  20. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        if re.search(regex, r.text, re.I): </font></font>
  21. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            return True </font></font>
  22. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        return False </font></font>

  23. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    wafdetections = dict() </font></font>

  24. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    plugin_dict = load_plugins() </font></font>
  25. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    result_dict = {} </font></font>
  26. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    for plugin_dict in plugin_dict。 values(): </font></font>
  27. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        wafdetections[plugin_module.NAME] = plugin_module.is_waf </font></font>
  28. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    # 首先检查优先级,然后检查外部添加的那些</font></font>
  29. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    checklist = wafdetectionsprio </font></font>
  30. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    checklist += list(set(wafdetections.keys()) - set(checklist)) </font></font>

  31. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    def identwaf (self, findall=False) </font><font style="vertical-align: inherit;">        : </font><font style="vertical-align: inherit;">            detection = </font></font>
  32. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        list() </font></font>
  33. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">try: </font></font>
  34. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">self.attackres = self.performCheck(self.centralAttack)</font></font>
  35. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        除了 RequestBlocked: </font></font>
  36. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            return</font></font>
  37. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        在 self.checklist: </font></font>
  38. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            self.log.info('Checking for %s' % wafvendor) </font></font>
  39. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            if self.wafdetections[wafvendor](self): </font></font>
  40. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                detection.append(wafvendor)</font></font>
  41. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                如果不是 findall: </font></font>
  42. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                    break </font></font>
  43. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        self .knowledge['wafname'] = detection</font></font>
  44. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        返回检测到</font></font>

  45. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">def calclogginglevel(verbosity): </font></font>
  46. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    default = 40 # 错误被打印出来</font></font>
  47. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    level = default - (verbosity * 10) </font></font>
  48. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    if level < 0: </font></font>
  49. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        level = 0 </font></font>
  50. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    return level </font></font>

  51. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">def buildResultRecord(url, waf ):</font></font>
  52. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    结果 = {}</font></font>
  53. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    结果['url'] = url</font></font>
  54. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    if waf: </font></font>
  55. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        result['detected'] = True </font></font>
  56. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        if waf == 'generic': </font></font>
  57. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            result['firewall'] = 'Generic' </font></font>
  58. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            result['manufacturer'] = 'Unknown' </font></font>
  59. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        else: </font></font>
  60. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            result['firewall'] = waf. split('(')[0].strip() </font></font>
  61. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            result['manufacturer'] = waf.split('(')[1].replace(')', '').strip() </font></font>
  62. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    else: </font></font>
  63. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        result['检测到'] = False </font></font>
  64. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        result['firewall'] = 'None' </font></font>
  65. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        result['manufacturer'] = 'None'</font></font>
  66. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    返回结果</font></font>
复制代码
  1. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">def getTextResults(res=None): </font></font>
  2. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    # 留出一些空间以供将来更新列的可能性</font></font>
  3. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    # 可以将新列添加到此元组下面的</font></font>
  4. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    键 = ('detected') </font></font>
  5. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    res = [({key: ba[key] for key in ba if key not in keys}) for ba in res] </font></font>
  6. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    rows = [] </font></font>
  7. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    for dk in res: </font></font>
  8. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        p = [str(x) for _, x in dk.items()] </font></font>
  9. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        rows.append(p) </font></font>
  10. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    for m in rows : </font></font>
  11. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        m[1] = f'{m[1]} ({m[2]})' </font></font>
  12. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        m.pop() </font></font>
  13. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    defgen = [ </font></font>
  14. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        (max([len(str(row)) for row in rows]) + 3 ) </font></font>
  15. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        for i in range(len(rows[0])) </font></font>
  16. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    ] </font></font>
  17. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    rwfmt = "".join(["{:>"+str(dank)+"}" for dank in defgen]) </font></font>
  18. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    textresults = []</font></font>
  19. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    对于行中的行:</font></font>
  20. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        textresults.append(rwfmt.format(*row)) </font></font>
  21. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    return textresults </font></font>

  22. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">def disableStdOut(): </font></font>
  23. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    sys.stdout = None </font></font>

  24. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">def enableStdOut(): </font></font>
  25. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    sys.stdout = sys.__stdout__ </font></font>

  26. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">def getheaders(fn): </font></font>
  27. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    headers = { }</font></font>
  28. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    如果不是 os.path.exists(fn): </font></font>
  29. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        logging.getLogger('wafw00f').critical('Headers file "%s" does not exist!' % fn)</font></font>
  30. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        返回</font></font>
  31. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    io.open(fn, 'r', encoding='utf-8') as f: </font></font>
  32. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        for line in f.readlines(): </font></font>
  33. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            _t = line.split(':', 2) </font></font>
  34. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            if len(_t) == 2: </font></font>
  35. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                h, v = map(lambda x: x.strip(), _t)</font></font>
  36. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                标头[h] = v</font></font>
  37. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    返回标头</font></font>

  38. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">类 RequestBlocked(Exception):</font></font>
  39. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    通过</font></font>
复制代码
  1. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">def main(): </font></font>
  2. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    parser = OptionParser(usage='%prog url1 [url2 [url3 ... ]]\r\nexample: %prog http://www.victim.org/') </font></font>
  3. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    parser.add_option('-v ', '--verbose', action='count', dest='verbose', default=0, </font></font>
  4. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                      help='启用详细程度,多个 -v 选项增加详细程度') </font></font>
  5. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    parser.add_option('-a', '-- findall', action='store_true', dest='findall', default=False, </font></font>
  6. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                      help='找到所有匹配签名的WAF,不要停止对第一个的测试') </font></font>
  7. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    parser.add_option('-r', ' --noredirect', action='store_false', dest='followredirect', </font></font>
  8. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                      default=True, help='不要遵循 3xx 响应给出的重定向')</font></font>
  9. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    parser.add_option('-t', '--test', dest='test', help='Test for a specific WAF') </font></font>
  10. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    parser.add_option('-o', '--output', dest='output ', help='</font></font>
  11. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">根据文件扩展</font><font style="vertical-align: inherit;">    名将</font><font style="vertical-align: inherit;">输出写入 csv、json 或文本文件</font><font style="vertical-align: inherit;">。对于标准输出,指定 - 作为文件名。', </font></font>
  12. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                      default=None) </font></font>
  13. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">parser.add_option('-i', '--input-file' , dest='input', help='从文件中读取目标。输入格式可以</font></font>
  14. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">是 csv、json 或文本。对于 csv 和 json,需要一个 `url` 列名或元素。', </font></font>
  15. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                      default=None)</font></font>
  16. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    解析器。 add_option('-l', '--list', dest='list', action='store_true', </font></font>
  17. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                      default=False, help='列出 WAFW00F 能够检测到的所有 WAF')</font></font>
  18. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    parser.add_option('-p', '--proxy', dest='proxy', default=None, </font></font>
  19. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                      help='使用HTTP代理执行请求,示例:http://hostname:8080, </font></font>
  20. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">socks5://主机名:1080, http://user:pass@hostname:8080') </font></font>
  21. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    parser.add_option('--version', '-V', dest='version', action='store_true', </font></font>
  22. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                      default=False, help= '打印出当前版本的 WafW00f 并退出。') </font></font>
  23. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    parser.add_option('--headers', '-H', dest='headers', action='store', default=None, </font></font>
  24. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                      help='Pass custom headers通过文本文件覆盖默认头集。')</font></font>
  25. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    选项,args = parser.parse_args()</font></font>
  26. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    日志记录。basicConfig(level=calclogginglevel(options.verbose)) </font></font>
  27. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    log = logging.getLogger('wafw00f')</font></font>
  28. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    if options.output == '-': </font></font>
  29. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        disableStdOut() </font></font>
  30. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    print(randomArt()) </font></font>
  31. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    if options.list: </font></font>
  32. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        print('[+] Can test for these WAFs:\r\n') </font></font>
  33. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        attack = WAFW00F(None)</font></font>
  34. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        尝试:</font></font>
  35. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            m = [i.replace(')', '').split(' (') for i in wafdetectionsprio] </font></font>
  36. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            print(R+' WAF Name'+' '*24+'Manufacturer\n '+'-'*8 +' '*24+'-'*12+'\n') </font></font>
  37. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            max_len = max(len(str(x)) for k in m for x in k) </font></font>
  38. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            for inner in m: </font></font>
  39. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                first = True </font></font>
  40. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                for elem in inner:</font></font>
  41. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                    如果第一个:</font></font>
  42. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                        text = Y+" {:<{}} ".format(elem,max_len+2)</font></font>
  43. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                        第一个 = 假</font></font>
  44. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                    否则:</font></font>
  45. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                        text = W+"{:<{}} ".format(elem, max_len+2) </font></font>
  46. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                    print(text, E, end="") </font></font>
  47. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                print() </font></font>
  48. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            sys.exit(0)</font></font>
  49. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        除了异常:</font></font>
  50. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            返回</font></font>
  51. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    if options.version : </font></font>
  52. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        print('[+] 您拥有的 WAFW00F 版本是 %sv%s%s' % (B, __version__, E)) </font></font>
  53. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        print('[+] WAFW00F 是在 %s%s%s 许可下提供的。' % (C, __license__, E)) </font></font>
  54. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        return </font></font>
  55. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    extraheaders = {} </font></font>
  56. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    if options.headers: </font></font>
  57. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        log.info('Getting extra headers from %s' % options.headers) </font></font>
  58. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        extraheaders = getheaders(options.headers)</font></font>
  59. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        如果 extraheaders 是 None :</font></font>
  60. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            parser.error('请提供一个带有冒号分隔的头文件名和值的头文件') </font></font>
  61. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    if len(args) == 0 and not options.input: </font></font>
  62. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        parser.error('No test target specified.') </font></font>
  63. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    #check if input file存在</font></font>
  64. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    if options.input: </font></font>
  65. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        log.debug("Loading file '%s'" % options.input) </font></font>
  66. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        try: </font></font>
  67. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            if options.input.endswith('.json'): </font></font>
  68. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                with open(options.input) as f: </font></font>
  69. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                    try :</font></font>
复制代码

  1. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">urls = json.loads(f.read())</font></font>
  2. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                    除了 json.decoder.JSONDecodeError: </font></font>
  3. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                        log.critical("JSON file %s does not contain well-formed JSON", options.input) </font></font>
  4. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                        sys.exit(1) </font></font>
  5. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                log.info ("Found: %s urls to check." %(len(urls))) </font></font>
  6. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                targets = [ item['url'] for item in urls ] </font></font>
  7. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            elif options.input.endswith('.csv'): </font></font>
  8. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                columns = defaultdict( list) </font></font>
  9. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                with open(options.input) as f: </font></font>
  10. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                    reader = csv.DictReader(f) </font></font>
  11. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                    for row in reader: </font></font>
  12. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                        for (k,v) in row.items(): </font></font>
  13. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                            columns[k].append(v)</font></font>
  14. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                target = columns['url'] </font></font>
  15. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            else: </font></font>
  16. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                with open(options.input) as f: </font></font>
  17. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                    targets = [x for x in f.read().splitlines()]</font></font>
  18. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        除了 FileNotFoundError: </font></font>
  19. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            log.error('File %s could not被读取。没有加载目标。', options.input) </font></font>
  20. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            sys.exit(1) </font></font>
  21. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    else: </font></font>
  22. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        targets = args </font></font>
  23. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    results = [] </font></font>
  24. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    for target in targets: </font></font>
  25. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        if not target.startswith('http'): </font></font>
  26. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            log.info('The url %s 应该以 http:// 或 https:// 开头 .. 修复(可能使其无法使用)' % target) </font></font>
  27. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            target = 'https://' + target </font></font>
  28. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        print('[*] Checking %s' % target )</font></font>
  29. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        pret = urlParser(target)</font></font>
  30. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        如果 pret 是 None: </font></font>
  31. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            log.critical('The url %s is not </font></font>
  32. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            wellformed </font><font style="vertical-align: inherit;">' % target) </font><font style="vertical-align: inherit;">sys.exit(1) </font></font>
  33. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        (hostname, port, path, _, _) = pret </font></font>
  34. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        log.info ('starting wafw00f on %s' % target) </font></font>
  35. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        proxies = dict() </font></font>
  36. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        if options.proxy: </font></font>
  37. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            proxies = { </font></font>
  38. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                "http": options.proxy, </font></font>
  39. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                "https": options.proxy, </font></font>
  40. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            } </font></font>
  41. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        attacker = WAFW00F(target, debuglevel=options .verbose, path=path, </font></font>
  42. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                    followredirect=options.followredirect, extraheaders=extraheaders, </font></font>
  43. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                        proxies=proxies)</font></font>
  44. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        全局 rq</font></font>
  45. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        rq =attacker.normalRequest()</font></font>
  46. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        如果 rq 为 None:</font></font>
  47. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            log.error('Site %s 似乎已关闭' % hostname) </font></font>
  48. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            continue </font></font>
  49. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        if options.test: </font></font>
  50. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            if options.test </font></font>
  51. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                inattacker.wafdetections </font><font style="vertical-align: inherit;">: </font><font style="vertical-align: inherit;">waf = attack.wafdetections[options .test](attacker) </font></font>
  52. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                if waf: </font></font>
  53. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                    print('[+] The site %s%s%s is behind %s%s%s WAF.' % (B, target, E, C, options.test, E) ) </font></font>
  54. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                else: </font></font>
  55. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                    print('[-] WAF %s 未在 %s' % (options.test, target) 上检测到) </font></font>
  56. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            else: </font></font>
  57. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                print('[-] WAF %s 在我们的列表中未找到\r\n使用--list 选项以</font></font>
  58. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">查看可用的内容'% options.test)</font></font>
  59. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            return </font></font>
  60. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        waf = attack.identwaf(options.findall) </font></font>
  61. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        log.info('Identified WAF: %s' % waf) </font></font>
  62. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        if len(waf) > 0: </font></font>
  63. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            for i in waf: </font></font>
  64. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                results.append(buildResultRecord(target, i)) </font></font>
  65. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            print ('[+] 站点 %s%s%s 在 %s%s%s WAF 后面。' % (B, target, E, C, (E+' 和/或 '+C).join(waf), E)) </font></font>
  66. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        if (options.findall) or len(waf) == 0: </font></font>
  67. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            print('[+] Generic Detection results:') </font></font>
  68. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            if </font></font>
  69. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                attack.genericdetect( </font><font style="vertical-align: inherit;">): </font><font style="vertical-align: inherit;">log.info('Generic Detection: %s' % attack .knowledge['generic']['reason']) </font></font>
  70. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                print('[*] 站点 %s 似乎支持 WAF 或某种安全解决方案'% 目标)</font></font>
  71. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                print('[~] Reason: %s' % </font></font>
  72. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                attack.knowledge </font><font style="vertical-align: inherit;">['generic']['reason']) </font><font style="vertical-align: inherit;">results.append(buildResultRecord(target, 'generic')) </font></font>
  73. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            else: </font></font>
  74. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                print('[-] 未检测到 WAF通过通用检测') </font></font>
  75. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                results.append(buildResultRecord(target, None)) </font></font>
  76. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        print('[~] Number of requests: %s' %attacker.requestnumber) </font></font>
  77. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    #print table of results </font></font>
  78. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    if len(results) > 0: </font></font>
  79. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        log. info("Found: %s 匹配。" % (len(results))) </font></font>
  80. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    if options.output: </font></font>
  81. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        if options.output == '-': </font></font>
  82. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            enableStdOut() </font></font>
  83. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            print(os.linesep.join(getTextResults(results))) </font></font>
  84. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        elif 选项。output.endswith('.json'):</font></font>
  85. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            log.debug("以 json 格式导出数据到文件:%s" % (options.output)) </font></font>
  86. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            with open(options.output, 'w') as outfile: </font></font>
  87. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                json.dump(results, outfile, indent=2) </font></font>
  88. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        elif options.output.endswith('.csv'): </font></font>
  89. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            log.debug("Exporting data in csv format to file: %s" % (options.output)) </font></font>
  90. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            with open(options.output, 'w') as outfile: </font></font>
  91. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                csvwriter = csv.writer(outfile, delimiter=',', quotechar='"', </font></font>
  92. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                    quoting=csv.QUOTE_MINIMAL) </font></font>
  93. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                count = 0 </font></font>
  94. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                for result in results: </font></font>
  95. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                    if count == 0: </font></font>
  96. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                        header = result.keys()</font></font>
  97. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                        csvwriter.writerow(header) </font></font>
  98. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                        count += 1 </font></font>
  99. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                    csvwriter.writerow(result.values()) </font></font>
  100. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        else: </font></font>
  101. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            log.debug("以文本格式导出数据到文件:%s" % (options.output)) </font></font>
  102. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">            with open(options. output, 'w') as outfile: </font></font>
  103. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">                outfile.write(os.linesep.join(getTextResults(results))) </font></font>
  104. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">if __name__ == '__main__': </font></font>
  105. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    if sys.hexversion < 0x2060000: </font></font>
  106. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">        sys.stderr.write('Your version of python 太旧了...请更新到 2.6 或更高版本\r\n') </font></font>
  107. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    main()</font></font>
复制代码

安装

github地址:https://github.com/EnableSecurity/wafw00f
官方使用文档:https://github.com/enablesecurity/wafw00f/wiki
安装环境:python3环境 --->使用pip install wafw00f进行安装
安装成功后目录:python安装目录中的Lib\site-packages\wafw00f--->例如:
C:\Python37\Lib\site-packages\wafw00f

验证:cd到C:\Python37\Lib\site-packages\wafw00f目录中输入python main.py如下图说明安装成功

091159wntzusjdtbo5tnin.png

具体使用

这里我们直接使用kali kali中自带自带WAFW00F:

9998.png

输入wafw00f --help或者wafw00f -h可以看到很多使用参数:
  1. -h, --help            show this help message and exit
  2.   -v, --verbose         Enable verbosity, multiple -v options increase
  3.                         verbosity
  4.   -a, --findall         Find all WAFs which match the signatures, do not stop
  5.                         testing on the first one
  6.   -r, --noredirect      Do not follow redirections given by 3xx responses

  7.   -t TEST, --test=TEST  Test for one specific WAF

  8.   -o OUTPUT, --output=OUTPUT
  9.                         Write output to csv, json or text file depending on
  10.                         file extension. For stdout, specify - as filename.

  11.   -i INPUT, --input-file=INPUT
  12.                         Read targets from a file. Input format can be csv,
  13.                         json or text. For csv and json, a `url` column name or
  14.                         element is required.
  15.   -l, --list            List all WAFs that WAFW00F is able to detect
  16.   -p PROXY, --proxy=PROXY
  17.                         Use an HTTP proxy to perform requests, examples:
  18.                         http://hostname:8080, socks5://hostname:1080,
  19.                         http://user:pass@hostname:8080
  20.   -V, --version         Print out the current version of WafW00f and exit.

  21.   -H HEADERS, --headers=HEADERS
  22.                         Pass custom headers via a text file to overwrite the
  23.                         default header set.
复制代码

wafw00f -l 一次可以识别出的防火墙:
  1. WAF Name Manufacturer
  2.   ------------                                                            

  3.   ACE XML Gateway Cisco                                                                  
  4.   aeSecure aeSecure                          
  5.   AireeCDN Airee                             
  6.   Airlock Phion/Ergon                       
  7.   Alert Logic Alert Logic                       
  8.   AliYunDun阿里云计算         
  9.   安心宝 安心宝                        
  10.   AnYu AnYu Technologies                 
  11.   Approach                          
  12.   AppWall Radware                           
  13.   Armor Defense Armor                             
  14.   ArvanCloud ArvanCloud                        
  15.   ASP.NET Generic Microsoft                        
  16.   ASPA Firewall ASPA Engineering Co.              
  17.   Astra Czar Securities                  
  18.   AWS Elastic Load Balancer Amazon                           
  19.   AzionCDN AzionCDN                        
  20.   Azure的前门微软                        
  21.   Barikode伦理忍者                     
  22.   梭子鱼梭子鱼网络               
  23.   Bekchy Faydata Technologies Inc.的        
  24.   鲟CDN鲟                           
  25.   BIG-IP本地流量管理器F5 Networks公司                     
  26.   BinarySec BinarySec                        
  27.   BitNinja BitNinja                          
  28.   BlockDoS BlockDoS                        
  29.   蓝盾蓝盾IST                     
  30.   BulletProof Security Pro AITpro Security                  
  31.   CacheWall Varnish                           
  32.   CacheFly CDN CacheFly                          
  33.   Comodo cWatch Comodo Cyber​​Security              
  34.   CdnNS 应用程序网关 CdnNs/WdidcNet                    
  35.   ChinaCache 负载均衡器 ChinaCache                        
  36.   Chuang Yu Shield Yunaq                             
  37.   Cloudbric Penta Security                    
  38.   Cloudflare Cloudflare Inc.                  
  39.   Cloudfloor Cloudfloor DNS                  
  40.   Cloudfront Amazon                           
  41.   CrawlProtect Jean-Denis Brun                  
  42.   DataPower IBM                              
  43.   DenyALL Rohde & Schwarz Cyber​​Security       Distil Distil
  44.   Networks                  
  45. DOSarrest DOSarrest Internet Security      
  46.   DotDefender Applicure Technologies            
  47.   DynamicWeb Injection Check DynamicWeb                        
  48.   Edgecast Verizon Digital Media Eisoo            
  49.   Cloud Firewall Eisoo                           
  50.   Expression Engine EllisLab                          
  51.   BIG-IP AppSec Manager F5 Networks                       
  52.   BIG-IP AP Manager F5 Networks                       
  53.   Fastly Fastly CDN                        
  54.   FirePass F5 Networks                       
  55.   FortiWeb Fortinet                          
  56.   GoDaddy 网站保护 GoDaddy                           
  57.   Greywizard Gray Wizard                     
  58.   华为云防火墙 华为                           
  59.   HyperGuard 防御艺术                  
  60.   Imunify360 CloudLinux                        
  61.   Incapsula Imperva Inc.                     
  62.   IndusGuard Indusface                        
  63.   Instart DX Instart Logic                     
  64.   ISA Server Microsoft                        
  65.   Janusec Application Gateway Janusec                           
  66.   Jiasule Jiasule                           
  67.   Kona SiteDefender Akamai                           
  68.   KS-WAF KnownSec                          
  69.   KeyCDN KeyCDN                           
  70.   风头CDN风头                        
  71.   的Litespeed的Litespeed技术           
  72.   开放Resty Lua的Nginx的FLOSS                             
  73.   Oracle云甲骨文                           
  74.   Malcare Inactiv                           
  75.   MaxCDN MaxCDN                           
  76.   任务控制盾构任务控制                  
  77.   的ModSecurity SpiderLabs                        
  78.   NAXSI NBS系统                     
  79.   Nemesida PentestIt                        
  80.   NevisProxy AdNovum                           
  81.   NetContinuum Barracuda Networks               
  82.   NetScaler AppFirewall Citrix Systems                    
  83.   Newdefend NewDefend                        
  84.   NexusGuard 防火墙 NexusGuard                        
  85.   NinjaFirewall NinTechNet
  86.   NullDDoS 保护 NullDDoS NSFocus                        NSFocus                          
  87.   Global Inc.               
  88.   OnMessage Shield BlackBaud                        
  89.   Palo Alto 下一代防火墙 Palo Alto Networks               
  90.   PerimeterX PerimeterX                        
  91.   PentaWAF 全球网络服务         
  92.   pkSecurity IDS pkSec                             
  93.   PT 应用防火墙 Positive Technologies            
  94.   PowerCDN PowerCDN                          
  95.   Profense ArmorLogic                       
  96.   普惠普惠                           
  97.   七牛七牛 CDN                        
  98.   Reblaze Reblaze                           
  99.   RSFirewall RSJoomla!                        
  100.   RequestValidationMode Microsoft                        
  101.   Sabre 防火墙 Sabre                             
  102.   Safe3 Web 防火墙 Safe3                             
  103.   Safedog SafeDog                           
  104.   Safeline Chaitin Tech。                    
  105.   SecKing SecKing                           
  106.   eEye SecureIIS BeyondTrust                       
  107.   SecuPress WP 安全性 SecuPress                        
  108.   SecureSphere Imperva Inc.                     
  109.   Secure Entry United Security Providers        
  110.   SEnginx Neusoft                           
  111.   ServerDefender VP Port80 Software                  
  112.   Shield Security One Dollar Plugin                 
  113.   Shadow Daemon Zecure                           
  114.   SiteGround SiteGround                        
  115.   SiteGuard Sakura Inc.                       
  116.   Sitelock TrueShield                        
  117.   SonicWall Dell                              
  118.   UTM Web Protection Sophos                           
  119.   Squarespace Squarespace                     
  120.   SquidProxy IDS SquidProxy                        
  121.   StackPath StackPath                        
  122.   Sucuri CloudProxy Sucuri Inc.                     
  123.   腾讯云防火墙 腾讯科技            
  124.   Teros Citrix Systems                    
  125.   Trafficshield F5 Networks                       
  126.   TransIP Web 防火墙 TransIP                           
  127.   URLMaster SecurityCheck iFinity/DotNetNuke               
  128.   URLScan Microsoft                        
  129.   UEWaf UCloud                           
  130.   Varnish OWASP                             
  131.   Viettel Cloudrity                        
  132.   VirusDie VirusDie LLC                     
  133.   Wallarm Wallarm Inc.                     
  134.   WatchGuard WatchGuard Technologies           
  135.   WebARX WebARX 安全解决方案        
  136.   WebKnight AQTRONIX                          
  137.   WebLand WebLand                           
  138.   RayWAF WebRay 解决方案                 
  139.   WebSEAL IBM                              
  140.   WebTotem WebTotem                          
  141.   West263 CDN West263CDN                        
  142.   Wordfence Defiant                           
  143.   WP Cerber Security Cerber Tech                       
  144.   WTS-WAF WTS                              
  145.   360WangZhanBao 360 Technologies                  
  146.   XLabs Security WAF XLabs                           
  147.   玄武顿                        
  148.   玄武顿
  149.   云顿云锁                           云锁                           
  150.   云家苏百度云计算            
  151.   YXLink YxLink Technologies               
  152.   Zenedge Zenedge                           
  153.   ZScaler Accenture
复制代码

网络探测站点是否存在waf和一些细节

例子1:(wafw00f https://www.baidu.com百度知道有waf)

9997.png

这里还可以用的服务器应该是BWS/1.1但是它的响应包中返回的服务器是Apache我们自己用burp抓包也能包:

9996.png

应该是修改了响应头的返回。 例如:进入org/apache/catalina/util编辑配置文件ServerInfo.properties
字段来实现来改变我们tomcat的版本信息

9992.png
9991.png

修改为:
  1. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">server.info=Apache Tomcat </font></font>
  2. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">server.number=0.0.0.0 </font></font>
  3. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">server.built=2017 年 4 月 2 日 07:25:00 UTC</font></font>
复制代码

将修改后的信息压缩回jar包:
  1. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"># cd /tomcat/lib </font></font>
  2. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"># jar uvf catalina.jar org/ap
  3. ache/catalina/util/ServerInfo.properties</font></font>
复制代码

9990.png

重启公猫验证前后截图如下所示:

6999.png
6998.png

您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

关注

0

粉丝

9021

主题
精彩推荐
热门资讯
网友晒图
图文推荐

Powered by Pcgho! X3.4

© 2008-2022 Pcgho Inc.