防火墙出站端口测试:利用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
Hi there,
thanks for the great service it is really useful during engagements! Any idea how to implement the powershell snippet into a oneliner? Might be usefull in case of restricted scenarios like uploaded php-shells and where you can’t open up PS and the usage of CMD is mandatory.
Thanks!
f

Nem Schlecht
April 4, 2017 @ 10:03 am
Here’s how to do it as a one-liner, flux:
In 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))
Take the resulting string (I had to put it into an editor and remove newlines!) and run it as this right from a CMD window (this should all be one line):
C:> powershell -NoProfile -ExecutionPolicy ByPass -EncodedCommand MQAuAC4AMQAwADIANAAgAHwAIABGAG8AcgBFAGEAYwBoAC0ATwBiAGoAZQBjAHQAIAB7ACQAdABlAHMAdAA9ACAAbgBlAHcALQBvAGIAagBlAGMAdAAgAHMAeQBzAHQAZQBtAC4ATgBlAHQALgBTAG8AYwBrAGUAdABzAC4AVABjAHAAQwBsAGkAZQBuAHQAOwAgACQAdwBhAGkAdAAgAD0AIAAkAHQAZQBzAHQALgBiAGUAZwBpAG4AQwBvAG4AbgBlAGMAdAAoACIAYQBsAGwAcABvAHIAdABzAC4AZQB4AHAAbwBzAGUAZAAiACwAJABfACwAJABuAHUAbABsACwAJABuAHUAbABsACkAOwAoACQAdwBhAGkAdAAuAGEAcwB5AG4AYwB3AGEAaQB0AGgAYQBuAGQAbABlAC4AdwBhAGkAdABvAG4AZQAoADIANQAwACwAJABmAGEAbABzAGUAKQApADsAIABpAGYAKAAkAHQAZQBzAHQALgBDAG8AbgBuAGUAYwB0AGUAZAApACAAewBlAGMAaABvACAAIgAkAF8AIABvAHAAZQBuACIAfQBlAGwAcwBlAHsAZQBjAGgAbwAgACIAJABfACAAYwBsAG8AcwBlAGQAIgB9AH0AIABwACAAcwBlAGwAZQBjAHQALQBzAHQAcgBpAG4AZwAgACIAIAAiAA==
(You should always generate this code yourself – don’t trust what I posted – even though in this case, it is the same code).

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