防火墙出口测试利器:AllPorts.Exposed端口探测技术解析

本文详细介绍了如何使用AllPorts.Exposed服务进行防火墙出口过滤测试,包含PowerShell端口扫描脚本实战,帮助渗透测试人员和网络管理员快速发现网络出口开放端口,提升网络安全防护能力。

防火墙出口测试利器:AllPorts.Exposed端口探测技术解析

Beau Bullock //

如果你在过去三十年间稍微接触过技术领域,很可能听说过"防火墙"这个东西。如果没有,那么"防火墙"就是决定哪些流量可以通过、哪些不能通过的系统。大多数组织都使用防火墙来保护其网络免受互联网其他部分的侵害。有些组织还将防火墙部署在最有利的位置,以分割其内部网络的特定区域。你现在用来阅读这篇博客的系统很可能就内置了防火墙。

关于防火墙作用的普遍共识是,它可以防止"坏东西"进入受保护的网络或系统。但防火墙也可以阻止东西离开网络或系统。这被称为"出口过滤"。

为什么我们需要关心出站流量?

简单的答案是:允许出去的端口越多,攻击者建立命令和控制就越容易。如果没有设置出站过滤器,组织很快就会失去对离开网络的内容的可见性。这可能导致恶意软件感染、命令和控制会话被忽视,或者内部员工绕过企业网络策略。

如果你是负责组织防火墙的人员,如何在不深入研究防火墙规则集的情况下快速了解允许哪些端口出站?

如果你是渗透测试人员,如何快速找出网络中允许出站的端口,这些端口可能被用作命令和控制通道?

AllPorts.Exposed

AllPorts.Exposed是一个驻留在互联网上的系统,(顾名思义)所有65535个TCP端口都在上面开放。如果你从一个没有防火墙保护的系统/网络对其进行端口扫描,你应该看到所有端口都是"开放的"。现在,如果你从受防火墙保护的网络内部扫描这个系统,并且看到开放的端口,这些端口可以被认为是允许通过防火墙出站的。

如何测试?

是的,你可以使用Nmap之类的工具进行简单的端口扫描,但我更喜欢使用PowerShell来完成这个任务,因为它内置于Windows操作系统中。很多时候,当我们进行渗透测试时,我们是从基于Windows的系统上工作,并且通常不是管理员用户。因此,安装外部工具可能很困难。

这里有一个简短的PowerShell端口扫描脚本,你可以用来测试allports.exposed的1-1024端口。

打开命令终端。 输入’powershell.exe -exec bypass’并按回车。 将以下脚本复制到终端窗口并运行。

1
1..1024 | % {$test= new-object system.Net.Sockets.TcpClient; $wait = $test.beginConnect("allports.exposed",$_,$null,$null); ($wait.asyncwaithandle.waitone(250,$false)); if($test.Connected){echo "$_ open"}else{echo "$_ closed"}} | select-string " "

在下面的截图中,你可以看到脚本为发现的开放端口在终端窗口中打印’open’。

或者,如果你只想检查特定端口,可以在脚本开头用逗号分隔要扫描的每个端口,代替"1..1024"。例如,以下脚本将只扫描端口21、22、23、25、80、443和1337。

1
21,22,23,25,80,443,1337 | % {$test= new-object system.Net.Sockets.TcpClient; $wait =$test.beginConnect("allports.exposed",$_,$null,$null); ($wait.asyncwaithandle.waitone(250,$false)); if($test.Connected){echo "$_ open"}else{echo "$_ closed"}} | select-string " "

这是相同的脚本,但这次我们测试的是Nmap项目定义的互联网上使用最多的前128个端口。

1
80,23,443,21,22,25,3389,110,445,139,143,53,135,3306,8080,1723,111,995,993,5900,1025,587,8888,199,1720,465,548,113,81,6001,10000,514,5060,179,1026,2000,8443,8000,32768,554,26,1433,49152,2001,515,8008,49154,1027,5666,646,5000,5631,631,49153,8081,2049,88,79,5800,106,2121,1110,49155,6000,513,990,5357,427,49156,543,544,5101,144,7,389,8009,3128,444,9999,5009,7070,5190,3000,5432,3986,13,1029,9,6646,49157,1028,873,1755,2717,4899,9100,119,37,1000,3001,5001,82,10010,1030,9090,2107,1024,2103,6004,1801,19,8031,1041,255,3703,17,808,3689,1031,1071,5901,9102,9000,2105,636,1038,2601,7000 | % {$test= new-object system.Net.Sockets.TcpClient; $wait =$test.beginConnect("allports.exposed",$_,$null,$null); ($wait.asyncwaithandle.waitone(250,$false)); if($test.Connected){echo "$_ open"}else{echo "$_ closed"}} | select-string " "

总之,了解网络中允许哪些端口出站对渗透测试人员和网络管理员都非常重要。网络中允许出站的每个端口都为攻击者创造了一个额外的出口点。BHIS建议将出口流量锁定在仅业务功能所需的端口上。如果可能,实施Web代理并仅允许从其出站的Web流量。阻止客户端系统的所有出站流量,并强制其Web浏览器使用Web代理执行Web浏览。


悄悄说 如果你喜欢这篇博客,我们认为你会喜欢Beau的课程:

云渗透突破

提供实时/虚拟和点播课程!


评论

flux - 2016年12月21日 @ 7:58 am

你好, 感谢这项伟大的服务,在任务期间真的很有用!有没有办法将PowerShell代码片段实现为单行命令?在受限场景(如上载的PHP shell)且无法打开PS而必须使用CMD时可能很有用。 谢谢! f

Nem Schlecht - 2017年4月4日 @ 10:03 am

flux,这里是如何将其作为单行命令的方法: 在PowerShell中:

1
2
PS> $script = {1..1024 | ForEach-Object {$test= new-object system.Net.Sockets.TcpClient; $wait = $test.beginConnect("allports.exposed",$_,$null,$null); $wait.asyncwaithandle.waitone(250,$false)); if($test.Connected) {echo "$_ open"}else{echo "$_ closed"}} | select-string " "}
PS> [System.Convert]::ToBase64String([System.Text.Encoding]::UNICODE.GetBytes($script)) 

获取结果字符串(我不得不将其放入编辑器并删除换行符!)并从CMD窗口直接运行(这应该是一行):

1
C:\> powershell -NoProfile -ExecutionPolicy ByPass -EncodedCommand MQAuAC4AMQAwADIANAAgAHwAIABGAG8AcgBFAGEAYwBoAC0ATwBiAGoAZQBjAHQAIAB7ACQAdABlAHMAdAA9ACAAbgBlAHcALQBvAGIAagBlAGMAdAAgAHMAeQBzAHQAZQBtAC4ATgBlAHQALgBTAG8AYwBrAGUAdABzAC4AVABjAHAAQwBsAGkAZQBuAHQAOwAgACQAdwBhAGkAdAAgAD0AIAAkAHQAZQBzAHQALgBiAGUAZwBpAG4AQwBvAG4AbgBlAGMAdAAoACIAYQBsAGwAcABvAHIAdABzAC4AZQB4AHAAbwBzAGUAZAAiACwAJABfACwAJABuAHUAbABsACwAJABuAHUAbABsACkAOwAoACQAdwBhAGkAdAAuAGEAcwB5AG4AYwB3AGEAaQB0AGgAYQBuAGQAbABlAC4AdwBhAGkAdABvAG4AZQAoADIANQAwACwAJABmAGEAbABzAGUAKQApADsAIABpAGYAKAAkAHQAZQBzAHQALgBDAG8AbgBuAGUAYwB0AGUAZAApACAAewBlAGMAaABvACAAIgAkAF8AIABvAHAAZQBuACIAfQBlAGwAcwBlAHsAZQBjAGgAbwAgACIAJABfACAAYwBsAG8AcwBlAGQAIgB9AH0AIAB8ACAAcwBlAGwAZQBjAHQALQBzAHQAcgBpAG4AZwAgACIAIAAiAA==

(你应该始终自己生成此代码 - 不要信任我发布的内容 - 即使在这种情况下,它是相同的代码)。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计