渗透测试者指南-第5部分(识别WAF和查找源ip)

渗透测试者指南-第5部分(识别WAF和查找源ip)

在本文中,我将通过识别配置错误的基础服务器来详细介绍绕过WAF的非详尽概述。我将介绍一些技术,其中包括CloudFlare取消屏蔽和识别通常与EC2实例一起部署的AWS WAF。我不会介绍通过混淆来绕过WAF的自定义有效载荷的开发。

WAF介绍

在讨论如何绕过WAF之前,我们需要弄清楚什么是WAF。WAF是Web应用程序防火墙的缩写,通常充当客户端(您为用户)和服务器本身之间的代理。防火墙可以分析和扫描往返服务器的所有http请求,这意味着它可以扫描请求的内容以获取有效负载(例如SQLi,XSS或XXE)并实时阻止它们。如果您曾经尝试在受CloudFlare保护的主机上利用标准的反射XSS,则会注意到您得到了“此页面已被阻止的页面”,这就是CloudFlare接管防火墙过滤的一部分。

有些WAF甚至可能没有过滤有效负载,有时它们会以“仅监视模式”部署,并且通常处于那些模式下,以便它们可以监视将阻塞哪些流量并进行相应的调整,从而不会阻塞一些重要的错误信息.

在其他时候,WAF解决方案可能会偶然地部署,但并不依赖于此,我个人使用0x00sec.org上的 CloudFlare 进行Web缓存和自动免提SSL,从而节省了大量带宽。因此,我尚未尝试保护源IP。如果您在阅读本文后可以识别出0x00sec的来源,那么我已经完成了工作😉

识别WAF

有很多不同的方法来确定您是被WAF阻止还是站点正在使用WAF。最初的迹象可能包括IP地址的组织标签为“ CloudFlare”,或者您明确面对CloudFlare验证码或错误页面。要执行前一种技术,我们只需要解析域名,然后向我每天使用ipinfo.io标识组织名称的出色服务发出请求。我们也可以使用jq解析数据。

dig +short 0x00sec.org
curl -s https://ipinfo.io/<ip address> | jq -r '.org'

WAF(如AWS负载均衡)比较难以检测,因为它们看起来就像EC2实例的IP,并以静默方式阻止恶意请求。这些可能很糟糕,这意味着如果您没有被列入特定评估的白名单,那么您可能会遗漏漏洞。使用AWS,您通常可以通过“AWSLB”和“AWSLBCORS”cookie来识别负载平衡器。它们将悄无声息地放到浏览器中,并使用curl -vv找到它们。

识别来源

理论

对于IT管理员来说,使Web服务器完全在Internet上保持打开状态而不将WAF上游本身列入白名单是非常普遍的。此配置依赖于没有人知道您的源服务器IP地址的公理,否则,您可以直接向服务器发出请求并完全绕过WAF解决方案。

好吧-有数百万个IP地址,如果我的域名没有指向它,您将如何找到它?很好的问题,幸运的是,对于我们的攻击者来说,我们拥有OSINT和扫描解决方案的强大工具箱,可用于通过其IP索引和识别网站。

它可用于渗透测试或威胁搜寻场景中,在这些场景中,您试图揭露洋葱宿主或其他被遮盖的资产(出于c2或其他邪恶目的等)。

Censys和Shodan(OSINT)

第一种可能也是最简单的方法是使用Internet搜索引擎,例如Censys和Shodan。这些搜索引擎索引诸如HTML页面之类的内容,因此也为标题标签建立索引。假设您已经对目标进行了事先侦查,那么应该清楚它们通常使用哪些组织来处理面向公众的Web资产。例如,某些组织将在AWS上托管所有内容,但在CloudFlare上进行托管。随着您进行更多的勘测,组织表面积的布局应该自然而然地出现。为了获得0-100的公司概况,我建议使用dnsdumpster.com生成地图。

接下来,使用Censys进行搜索,并将看起来与目标匹配的IP保存在文本文件中。

如果他们使用的是AWS-可能很多!为了确保这些IP的安全,我们稍后会涉及更多内容,但我们将继续介绍。您可能会发现,只需在浏览器中访问IP即可。在这种情况下,恭喜!

安全追踪(OSINT)

查找与域绑定的IP的另一种方法是查看其历史IP。您可以使用SecurityTrails DNS跟踪来做到这一点。https://securitytrails.com/domain/0x00sec.org/dns

在这里,我们可以看到存在哪些A记录以及持续了多长时间。在X裸机使用X年后,管理员切换到WAF解决方案是如此普遍,您是否认为他们配置了白名单?当然不是,它可以正常工作!

我最初编写了一种刮除这些IP的工具,但是大约一个月前它停止工作。作为临时替换,您可以复制整个表主体并使用awk过滤IP。它既便宜又脏,但是在紧要关头就可以工作。

grep -E -o "([0-9]{1,3}[\\.]){3}[0-9]{1,3}" tails.txt | sort -u | tee -a ips.txt

DNS枚举

如果你列举你的目标DNS,你会发现他们有类似的东西一dev.example.comstaging.example.com子域,它可能指向源主机没有WAF。这又是默默无闻的安全。我们可以使用subfinder进行快速演示,但我建议您在侦查过程中进行详尽的DNS枚举。生成IP列表以使用以下命令进行检查:

subfinder -silent -d 0x00sec.org | dnsprobe -silent | awk  '{ print $2 }'  | sort -u | tee -a ips.txt

检查主机的IP

既然您已经有了潜在候选人的列表,请手动查看您的IP地址,并尝试删除任何看起来像面向公众的网站。删除CloudFlare IP,寻找VPS主机,Microsoft Azure,Vultr,DigitalOcean,GCP等。该组织很可能在这些平台之一上托管(或者它们使用的是Godaddy之类的静态站点主机,它需要一些注意和注意)。有细微差别)。如果需要的话,可以将其喷在所有物体上,但可能会产生更多噪音。用你的判断。

有了一些bash魔术,我们可以快速启动一个内衬以遍历每个IP,并使用所需的主机头进行请求。

for ip in $(cat ips.txt); do org=$(curl -s <https://ipinfo.io/$ip> | jq -r '.org'); title=$(timeout 2 curl --tlsv1.1 -s -k -H "Host: 0x00sec.org" <https://$ip/> | pup 'title text{}'); echo "IP: $ip Title: $title Org: $org"; done
for ip in $(cat ips.txt) # iterate through each line in file
do 
	org=$(curl -s <https://ipinfo.io/$ip> | jq -r '.org') #  Get Org from IPInfo
  title=$(timeout 2 curl -s -k -H "Host: 0x00sec.org" <https://$ip/> | pup 'title text{}') # Get title
	echo "IP: $ip Title: $title Org: $org" # Print results
done 

让我们分解一下这个命令。

for ip in $(cat ips.txt) 

对于此文件中的每一行,将其分配给一个名为“ $ ip”的变量,然后运行以下do块。

org=$(curl -s <https://ipinfo.io/$ip> | jq -r '.org')

将org变量分配给IP的组织。

 title=$(timeout 2 curl -s -k -H "Host: 0x00sec.org" <https://$ip/> | pup 'title text{}')

这个需要更多解释,让我们将该命令再次分解为以下内容:

title=$( # set the output of the following commands into $title
timeout 2 # If the command takes longer than 2 seconds, kill it
curl -s -k -H "Host: 0x00sec.org" <https://$ip/> # Request the IP with the 0x00sec.org Host header
pup 'title text{}' # Parse the HTML result and print the title

我喜欢使用pup,因为它可以让我快速执行一些html解析任务,您可以在此处找到。

	echo "IP: $ip Title: $title Org: $org"

最后一行很容易解释,将详细信息打印到屏幕上。

现在,我们快速概览了哪个IP对哪个Host标头作出响应,并且可以查看标题。立即在此图像中显示“ 0x00sec-黑客的家”,您看到ASN吗?我们找到了来源!我们遍历每个主机,直接使用主机头请求IP,然后繁荣(是讽刺性繁荣),我们有了源IP!

与主机互动

主机文件

现在,您已经找到了源主机,您可能想要与其进行交互。最简单的方法就是更新您的主机文件。/etc/hosts在任何Linux或类似Unix的计算机上进行编辑。这将需要超级用户特权才能进行修改。

主机文件更新后,您应该能够像往常一样与主机进行交互,它将直接通过主机。如果您需要撤消此操作,只需删除此行并保存文件即可。

手动设置主机头

如果您不希望全局更改,则可以使用curl或BurpSuite并手动设置主机头。

curl -s -k -H "Host: 0x00sec.org" https://<ip address>/

这将根据请求将“主机”标头设置为“ 0x00sec.org ”,这将向Web服务器发出信号,表示您正在请求该域的站点。当您正常访问域时,您的浏览器会假定这样做,并在对源的请求中包含Host标头。对于大多数人来说,这也许是显而易见的-但是当我意识到这一点时,这很有道理,并且揭示了域名背后的一些魔力。

批量SSL扫描(活动)

您可以用来识别主机的另一种方法是通过SSL扫描。这是一种有效的方法,在本文中将不进行演示。但是,我可以告诉您如何操作以及如何进行自己的扫描设置。我的一个好伙伴为此编写了一个很棒的工具,但我会让他们觉得舒服时就发布它。SSL证书通常包含一个字段,其中包含为其生成的域名。从理论上讲,如果您扫描整个Internet并找到每个打开的端口443,然后提取每个证书并解析域名,则可以找到与您要查找的域有关的所有主机。拥有这些IP后,重复上述步骤,直到找到(或没有)为止。

我已经完成了几次,为客户发现了许多许多未公开的资产-这是一个非常有趣的资产发现活动。(影子IT令人恐惧)。

获取服务器发出请求

另一种细微差别的方法是滥用站点中的远程URL包含功能,以尝试使其到达您的服务器。很多时候,服务器可能具有“包含来自URL的图像”功能。这种方法通常适用于简单的服务器设置(例如单个web应用程序),就像更复杂的多网络系统(处理OOB DNS的任何人都非常了解这一点)一样。

要滥用这样的功能,请获得一个打的协作者并将其粘贴到“ include from url”部分中。轮询与客户的互动,您将看到网络流量。

Crobat反向查询

当我与室友和才华横溢的彭特斯特朋友@calumboal作梦时,这种技巧让我大吃一惊。使用Cal’s Crobat,您可以在IP范围内进行反向DNS查找。例如:

现在,事实证明,您可以将此链接与从ipinfo.io提取的ASN范围相链接,以创建一个非常不错的反向查找工具!如果您可以使用他们的高级计划,则可以直接从其API获取范围-确实很棒。

curl -s "<https://ipinfo.io/AS16276/json?token=yourtokenifyouhaveit>"  | jq  -r '.prefixes[].netblock' | tee -a ranges.txt

但是如果您可以粗暴地对待它,因为您没有预算,我就知道了。

只需从我们之前的步骤中获取这些ASN,然后转到https://ipinfo.io/ <ASNNUMBER>。例如:AS16276

现在,展开底部的滑块,然后将所有这些复制并粘贴到文件中。粘贴可能需要一段时间-这是正常的。

cat ranges.txt| awk '{ print $1 }' | grep "\\." | tee -a source.txt 

现在,我们有了目标ASN的范围列表,我们可以对之前已经看到其资产的每个ASN重复此操作。您可以在我的云范围项目https://easyasn.xyz/的整个提供商面前走得更远。

curl -s <https://easyasn.xyz/companies/amazon/ranges.txt> | grep -v ":"

现在我们有了范围,可以遍历它们并进行反向查找。

for range in $(cat source.txt); do crobat -r $range | jq -c -C '' | grep "0x00sec.org"; done | tee -a results.txt

此命令将遍历每个范围并提取分配给它的DNS记录,您可以通过这种方式找到可能隐藏的其他资产(并且在DNS枚举期间可能丢失了)。找到所有这些新资产后,请通过上述过程将它们反馈给您,直到您认为自己获得了不错的覆盖率。

CloudFail(Automagic Python)

您可以使用的最后一种方法(超级易用)是CloudFail python工具。使用此工具,您所要做的就是傻瓜相机!有时它起作用,有时却不起作用。如果可以肯定的话,那肯定是一笔不错的透支钱。

git clone <https://github.com/m0rtem/CloudFail.git>
cd CloudFail
pip install -r requirements.txt
python3 cloudfail.py -t 0x00sec.org

减轻

对于所有在这里工作的人来说,我确信缓解/补救措施很明确-将WAF上游和可选的管理地址或堡垒主机列入白名单,以进行维护。也不要依赖WAF来缓解真正的严重漏洞。应将它们视为最后一道防线,而WAF绕过的影响不应成为成功入侵之间的区别。如果您有能力修复代码,则应该优先考虑。

IPInfo.io

我想借此时间向我们的赞助商ipinfo.io快速鸣叫!我每天都在使用这个API处理很多不同的事情,直到写这篇文章之前,我才真正意识到自己有多依赖它。请帮自己一个忙,在那边开设一个帐户,以获取更高的免费请求限额,然后打个招呼!他们都很友好,氛围也很好。非常高兴能很快尝试出host.io

结论

总体而言,希望本文能学到一些技巧,以揭​​露Web代理或WAF之后的服务器!现在,我正在编写它,实际上感觉其中有些技巧也适用于揭开洋葱域的面纱。只是拉OSINT并将其卡在墙上以查看粘住了什么。如果您喜欢这篇文章并且觉得自己学到了一些东西,请考虑向我买咖啡说谢谢:

from