本文主要介绍渗透测试的信息收集阶段中,可能遇到的WAF、蜜罐和CDN这三种设备平台的相关知识

WAF

基本概念

  1. 什么是WAF:WAF的全称是(Web Application Firewall),即Web应用防火墙。WAF是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的一款产品,提供web应用层防护安全能力。

    WAF只保护web应用,如果目标服务器上还开放了其他的服务,WAF并不会对其进行保护

  2. 原理:WAF主要是通过内置的很多安全规则 来进行防御。

    • 可防护常见的SQL注入、XSS、网页篡改、中间件漏洞等OWASP TOP10攻击行。
    • 当发现攻击后,可将IP进行锁定,IP锁定之后将无法访问网站业务。
    • 也支持防止CC攻击,采用集中度和速率双重检测算法。
  3. WAF的分类与其部署方式

    3ee71cd998dab5d7953eb7d1e5337123

    目前使用非嵌入型WAF比较多,中小型公司使用软件型WAF,zf、jg、学校一般使用硬件型WAF,大型公司使用云WAF(防护能力最强)

WAF识别

  1. wafwoof

    kali中执行下面的命令进行WAF扫描(注意是0不是O)

    1
    2
    # wafw00f ip/域名
    wafw00f www.isoda.top
  2. identYwaf

    地址:https://github.com/stamparm/identywaf

    与wafwoof相比运行速度慢,比较稳定推荐还是使用这一款工具。

    这两个工具的原理都是:发送一系列定制的HTTP请求,捕获响应中的特定模式并匹配特征库进行识别(如被拦截的错误页面图片模板)

  3. 网站请求信息中暴露

    网站请求数据包中的 X-Powered-By 字段暴露WAF相关信息

    image-20241224113646275

  4. nmap指纹检测

    1
    2
    3
    4
    # nmap -p 80,443 --script=http-waf-detect 目标主机
    nmap -p 80,443 --script=http-waf-detect www.isoda.top
    # nmap -p 80,443 --script=http-waf-fingerprint 目标主机(精度更高)
    nmap -p 80,443 --script=http-waf-fingerprint www.isoda.top

识别WAF对于安全测试的意义

在开始测试之前检测是否存在WAF,如果存在的是软件WAF可以尝试绕过。如果是其他WAF的话大部分都是没办法绕过的,只能考虑从web应用以外的方向攻击,或者直接放弃测试。

  • 一个网站要是使用了waf,而渗透人员没有识别直接使用工具进行扫描,有可能会导致waf将你的ip地址拉入黑名单而不能访问。
  • 不同waf可能存在着不同的绕过思路,可以有针对性行的绕过各个厂商的waf。

蜜罐

基本概念

  1. 什么是蜜罐

    蜜罐(Honeypot)是一种网络安全机制,用于吸引、检测、分析和防御网络攻击。它通常被设计成一个看似真实但实际上是受控的系统或环境,诱使攻击者对其进行攻击,从而保护真正的系统并收集有关攻击行为的信息。

  2. 蜜罐在红蓝对抗中扮演的角色

    • 红队:通过识别蜜罐来发现和规避蜜罐
    • 蓝队:部署蜜罐来保护真正的系统,通过分析蜜罐的被攻击记录推测攻击者的意图和攻击手法等信息
  3. 蜜罐的分类

    1)根据蜜罐与攻击者之间进行的交互的程度分类

    • 低交互蜜罐
    • 中交互蜜罐
    • 高交互蜜罐

    2)根据蜜罐模拟的目标分类

    • 数据库蜜罐
    • 工控蜜罐:模拟ICS设备,如SCADA、PLC
    • 物联网蜜罐:模拟IOT设备,如路由器、智能摄像头
    • Web蜜罐
  4. 开源蜜罐项目

蜜罐识别

  1. 蜜罐识别技术的原理

    谁是鱼谁是饵?红队视角下蜜罐识别方式汇总

  2. 人工分析方法

    人工审查目标服务器IP,如果是蜜罐的话可能存在以下的特征:

    1)端口多而有规律性:蜜罐通常开放多个端口,以模拟真实服务器的服务。这些端口可能包括常见的 HTTP、SSH、MySQL 等服务端口。可能开放多个端口运行http服务,端口号连续且比较大。

    2)蜜罐设计导致真实应用解析问题:例如目标服务器存在开放端口3306( 一般运行MySQL服务)

    • 如果这个服务器不是蜜罐:如果你在浏览器中访问 http://目标IP:3306,通常会提示“连接被拒绝”或“无法建立连接”。因为 MySQL 是基于特定数据库协议的,而浏览器主要支持 HTTP/HTTPS 协议,因此MySQL 服务器并不支持 HTTP,从而拒绝连接。

    • 如果这个服务器是蜜罐:如果你在浏览器中访问 http://目标IP:3306,通常不是返回常见的 HTML 页面,而是立即提示或开始下载JSON或HTML文件。

      蜜罐会捕获攻击者尝试暴力破解 SSH、MySQL 等服务的用户名和密码,记录的账号密码通过 Web 功能(如 JSONP)传输到蜜罐运维方的实时监控后台。因为这里使用到了jsonp等web功能,浏览器访问的时候就会使用web协议来解析,从而导致了下载(蜜罐的设计理念所导致的问题)。

    参考:

    假设百度某个接口存在jsonp漏洞,防守方可在web蜜罐页面上,加载一个js,由于js请求可跨域,即可向存在jsonp漏洞的xx.baidu.com/xx发请求。
    如果访问者存在baidu.com的登录态,那么这个请求是能自动带上baidu.com的cookie的,响应中会有回调函数以及json格式封装的数据。

    3)蜜罐设备指纹分析

    记录维护常见的蜜罐设备指纹信息

  3. 工具

CDN

基本概念

  1. 原理

    CDN的全称是Content Delivery Network,即内容分发网络。CDN是构建在现有网络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。但在安全测试过程中,若目标存在CDN服务,将会影响到后续的安全测试过程。

    img

  2. CDN对于安全测试有那些影响?

    1
    2
    3
    1.传统访问:用户访问域名–>解析服务器IP–>访问目标主机
    2.普通CDN:用户访问域名–>CDN节点–>真实服务器IP–>访问目标主机
    3.带WAF的CDN:用户访问域名–>CDN节点(WAF)–>真实服务器IP–>访问目标主机
    • CDN会隐藏服务器真实的ip地址,无法对目标网站的操作系统进行渗透
    • 但CDN站点又可以理解为是目标站点的镜像站点(大多数都是静态CDN加速),拥有相同的网站架构,且CDN服务器可与站点服务器进行交互,因此sql注入,xss等漏洞的挖掘并不受太大影响
  3. 常见的CDN服务提供商

    1)国内:阿里云 百度云 七牛云 又拍云 腾讯云 Ucloud 360 网宿科技 ChinaCache

    2)国外:CloudFlare StackPath Fastly Akamai CloudFront Edgecast CDNetworks Google Cloud CDN CacheFly Keycdn Udomain CDN77

如何判断目标存在CDN服务?

  1. 多节点请求技术

    如果ping的结果只有一个那么就没有CDN、要是不止一个则可以判断为有CDN

  2. nslookup查询域名解析信息

    如果查询结果中adress存在不止一个,表示使用了CDN

    1
    nslookup www.baidu.com

CDN绕过

子域名查询

  1. 原理

    假设存在主站 www.isoda.top(192.168.1.100) 和子站 bbs.isoda.top ,两个网站可能存在三种关系:

    • 子站ip也是 192.168.1.100:由同一台服务器托管,或使用了同一个CDN

    • 子站ip在同一个网段上,ip为192.168.1.1-254:处于同一数据中心或服务提供商的机房中,或者是运行在同一局域网内的不同服务器上

    • 子站ip在不同网段上:没有关系,一般不考虑

    一般主站的流量要比子站大得多,所以很多站长只会对主站或者流量大的子站点做CDN服务。在这种情况下,可以通过子站的真实IP推算出主站的真实IP(和子站在同一台服务器或者同一个C段)。

  2. 方法

    1)获取子域名

    • 子域名扫描器

      • layer:基于字典进行挖掘
    • 谷歌语法

      1
      2
      # 查看www以外的一子域名
      site:baidu.com -www

    2)使用进行超级ping工具进行多节点ping,找没有用cdn解析的子站点

    工具: http://ping.chinaz.com/

    • ping 带 www 和不带 www 的网站主站域名

      大部分网站会将带 www 和不带 www 的请求指向同一台服务器,保证两者的内容一致。但如果网站使用了 CDN 或缓存服务,而带 www 和不带 www 的域名使用了不同的解析策略,请求可能有一个指向CDN,而另一个指向的是真实IP。

      例如这里可以看到,我们是可以对 www* 的访问进行分别配置的

      image-20241223111420660

    • ping 主站的手机端域名

      一般是在域名前加上 m. ,可以访问网站对应的客户端版本

邮件服务查询

  1. 原理

    一般的中大型网站都会存在邮件服务,这种服务一般都是只有内部员工访问,所以并不会使用CDN。

  2. 方法

    我们可以尝试让网站向我们发送邮件(利用注册账号、找回密码等接口,让网站向我们的邮箱发送验证码),然后通过邮箱反查技术获取到邮件服务器的真实IP信息,邮件服务器的真实IP一般与网站IP相同或处于同一个网段。

  3. 常见的邮件触发点

    • RSS订阅
    • 邮箱注册、激活处
    • 邮箱找回密码处
    • 产品更新的邮件推送
    • 某业务执行后发送的邮件通知
    • 员工邮箱、邮件管理平台等入口处的忘记密码

国外地址请求

  1. 原理:国内的服务器为了节省成本,一般不会部署CDN到国外的运营商。

  2. 方法:在这种情况下,通过国外的代理直接访问网站可能可以直接获取到真实IP。

    但是有些比较大或离中国比较近的国家(美国、加拿大、日本等)还是可能会部署CDN,所以尽量找比较冷门的国家。

  3. 工具

全网扫描

  1. 原理

    基于网站所使用CDN厂商,去IP库中查询

    准确率低、麻烦、时间成本大,属于没有办法的办法

  2. 方法

    1)判断目标网站使用的CDN服务提供商

    工具:https://tools.ipip.net/cdn.php

    2)IP库筛选地址段

    基于CDN服务提供商,在IP库中查询该服务提供商的真实IP地址范围

    工具:纯真IP库 https://github.com/FW27623/qqwry

    3)配置范围扫描

    基于目标网站的一些特征(如网站的标题),扫描获取到的IP地址范围,看是否存在匹配的网站

    工具:

遗留文件

  1. 原理

    一些站点在搭建之初,会用一些文件测试站点,例如“phpinfo()”文件,此类文件里就有可能包含了真实的IP地址。

  2. 方法

    可以利用Google语法搜索站点是否有遗留文件,里面的 SERVER-ADDR 字段存在IP配置信息

    1
    site:xxx.com inurl:phpinfo.php

DNS解析历史记录

  1. 原理:站点在使用CDN服务之前,它的真实IP地址可能被DNS服务器所记录到,此时我们就可以通过DNS历史记录找到目标真实IP。

  2. 方法

    1)获取DNS解析的历史记录可以获取真实IP

DDOS攻击

CDN作为负载均衡的工具,存在流量上限,当CDN的访问量达到流量上限的时候,我们再去访问网站访问的一般就是没有使用CDN的真实IP

网络测绘引擎搜索特定内容

  1. 原理

    通过关键字检索相关的ip或域名,很多时候能直接获取到网站的真实ip

  2. 常用的网络测绘引擎

  3. 方法

    1)对网站的icon进行检索

    查看网站源代码找到网站icon对应的地址

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    import mmh3
    import requests
    import base64

    # 获取favicon.ico
    response = requests.get('https://i0.hdslb.com/bfs/static/jinkela/long/images/favicon.ico')

    # 将内容编码为base64
    favicon_base64 = base64.b64encode(response.content).decode('utf-8')

    # 计算hash
    hash_value = mmh3.hash(favicon_base64)

    # 打印结果
    print('shodan语法:http.favicon.hash: ' + str(hash_value))
    print('fofa语法:icon_hash="{}"'.format(str(hash_value)))

待进一步仔细阅读:https://www.cnblogs.com/qiudabai/p/9763739.html

利用主动漏洞

如果网站存在主动请求自定义网址此类的主动漏洞,可以利用漏洞让目标请求我们所控制的服务器,从而获取到网站的真实IP

f12c127ac5f8011328571dc14d409d4f

真实IP验证

想要验证我们获取到的IP是否可信,可以采用下面的方法

  1. 第三方ip地址查询工具:不一定准确

  2. 手动验证

    • 查询网站IP的真实地址地址,在网站主页上找备案号看是否地区一致
    • 检索网站公司相关信息,所在地等,结合社工进行验证
  3. 本地 DNS 劫持验证

    原理:

    通过在本地修改 hosts 文件,将目标域名强制解析到你获取的 IP 地址,从而绕过正常的 DNS 解析流程。CDN 的一个核心功能是缓存内容,缓存需要时间同步和刷新。如果强制将域名解析到某个 IP 上,而这个 IP 是 CDN 节点,可能出现:

    • 内容可能不完整(因为CDN缓存和源站之间需要同步)。
    • 某些动态请求可能出现异常(例如 API 数据未返回或功能失效)。
    • 网址连接失败

    而源站直接处理请求,内容完整,刷新异常不会发生。

    步骤:

    1)清空本地 DNS 缓存

    1
    2
    ipconfig /flushdns       # Windows
    sudo dscacheutil -flushcache # macOS

    2)修改hosts文件

    修改 C:\Windows\System32\drivers\etc 文件中的ip域名映射,为我们获取的真实ip地址

    1
    2
    175.12.114.176 mozhe.com
    175.12.114.176 www.mozhe.com

    3)访问网站

    • 如果网站功能和内容都正常,说明连接的可能是源站。
    • 如果出现刷新异常、功能失效,或者内容不一致,则可能连接的是 CDN 节点。