防火墙出口测试:利用AllPorts.Exposed进行端口出站检测

本文介绍了如何使用AllPorts.Exposed服务检测防火墙的出站规则,通过PowerShell脚本快速识别网络允许的出站端口,帮助渗透测试人员和网络管理员评估安全风险。

防火墙出口测试:利用AllPorts.Exposed进行端口出站检测

Beau Bullock //

如果你在过去三十年中稍微接触过技术,你可能听说过“防火墙”。如果没有,防火墙决定什么可以通过它,什么不能通过。大多数组织都有一个防火墙来保护其网络免受互联网其他部分的影响。一些组织将它们放在最有利的位置,以分段其内部网络的特定区域。你现在用来阅读这篇博客的系统很可能内置了防火墙。

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

为什么我们要关心离开的内容?

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

如果你负责组织的防火墙,如何在不深入防火墙规则集的情况下快速了解允许什么离开你的网络?

如果你是一名渗透测试员,如何快速找出允许离开网络的端口,这些端口可以用作命令和控制通道?

AllPorts.Exposed

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

如何测试?

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

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

  1. 打开命令终端。
  2. 输入‘powershell.exe -exec bypass’并按回车。
  3. 将以下脚本复制到终端窗口并运行。
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浏览。


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

Breaching the Cloud

提供现场/虚拟和点播!


评论

flux
December 21, 2016 @ 7:58 am
嗨,感谢这项伟大的服务,它在参与期间非常有用!有没有办法将PowerShell片段实现为一行命令?可能在受限场景下有用,比如上传的php-shell,并且你无法打开PS,必须使用CMD。
谢谢!
f

Nem Schlecht
April 4, 2017 @ 10:03 am
这里是如何作为一行命令执行,flux:
在PowerShell中:
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窗口直接运行这个(这应该全部是一行):
C:> powershell -NoProfile -ExecutionPolicy ByPass -EncodedCommand MQAuAC4AMQAwADIANAAgAHwAIABGAG8AcgBFAGEAYwBoAC0ATwBiAGoAZQBjAHQAIAB7ACQAdABlAHMAdAA9ACAAbgBlAHcALQBvAGIAagBlAGMAdAAgAHMAeQBzAHQAZQBtAC4ATgBlAHQALgBTAG8AYwBrAGUAdABzAC4AVABjAHAAQwBsAGkAZQBuAHQAOwAgACQAdwBhAGkAdAAgAD0AIAAkAHQAZQBzAHQALgBiAGUAZwBpAG4AQwBvAG4AbgBlAGMAdAAoACIAYQBsAGwAcABvAHIAdABzAC4AZQB4AHAAbwBzAGUAZAAiACwAJABfACwAJABuAHUAbABsACwAJABuAHUAbABsACkAOwAoACQAdwBhAGkAdAAuAGEAcwB5AG4AYwB3AGEAaQB0AGgAYQBuAGQAbABlAC4AdwBhAGkAdABvAG4AZQAoADIANQAwACwAJABmAGEAbABzAGUAKQApADsAIABpAGYAKAAkAHQAZQBzAHQALgBDAG8AbgBuAGUAYwB0AGUAZAApACAAewBlAGMAaABvACAAIgAkAF8AIABvAHAAZQBuACIAfQBlAGwAcwBlAHsAZQBjAGgAbwAgACIAJABfACAAYwBsAG8AcwBlAGQAIgB9AH0AIAB8ACAAcwBlAGwAZQBjAHQALQBzAHQAcgBpAG4AZwAgACIAIAAiAA==
(你应该总是自己生成这段代码——不要信任我发布的——即使在这种情况下,它是相同的代码)。

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