1. 程式人生 > >【技術分享】手把手教你使用PowerShell內置的端口掃描器

【技術分享】手把手教你使用PowerShell內置的端口掃描器

別名 target 實例 white tcpclient 提升 是否 ddb sans

【技術分享】手把手教你使用PowerShell內置的端口掃描器

技術分享

引言


想做端口掃描,NMAP是理想的選擇,但是有時候NMAP並不可用。有的時候僅僅是想看一下某個端口是否開放。在這些情況下,PowerShell確實能夠大放異彩。接下來我們聊聊如何使用PowerShell實現基本的端口掃描功能。

技術分享

本文中用到的PowerShell命令


PowerShell端口掃描器:針對單個IP的多個端口的掃描

1..1024 | % {echo ((new-object Net.Sockets.TcpClient).Connect("10.0.0.100",$_)) "Port $_ is open!"} 2>$null

Test-Netconnection 針對某IP段中單個端口的掃描

foreach ($ip in 1..20) {Test-NetConnection -Port 80 -InformationLevel "Detailed" 192.168.1.$ip}

針對某IP段 & 多個端口的掃描器

1..20 | % { $a = $_; 1..1024 | % {echo ((new-object Net.Sockets.TcpClient).Connect("10.0.0.$a",$_)) "Port $_ is open!"} 2>$null}

PowerShell測試出口過濾器

1..1024 | % {echo ((new-object Net.Sockets.TcpClient).Connect("allports.exposed",$_)) "Port $_ is open!" } 2>$null

為了僅用一行PowerShell命令實現一個端口掃描器,我們需要組合3個不同的組件:創建一系列對象、循環遍歷每個對象、將每個對象的信息輸出到屏幕。在PowerShell中,我們可以利用好其面向對象的特性來幫助我們實現此過程。

PowerShell端口掃描器


1..1024 | % {echo ((new-object Net.Sockets.TcpClient).Connect("10.0.0.100",$_)) "Port $_ is open!"} 2>$null

技術分享

命令分解

1)1..1024 - 創建值為從1到1024的一系列變量

2)| - 管道運算符,將上述對象傳遞給循環體

3)% - 在PowerShell中,%是foreach對象的別名,用來開始一個循環。循環體為接下來使用大括號{}括起來的內容

4)echo - 將輸出打印至屏幕

5)new-object Net.Sockets.TcpClient - 新建一個.Net TcpClient類的實例,它允許我們和TCP端口之間建立socket連接

6).Connect("10.0.0.100",$_)) - 調用TcpClient類的Connect函數,參數為10.0.0.100和端口$_。其中$_這個變量表示當前對象,即本輪循環中的數字(1..1024)

7)"Port $_ is open!") - 當程序發現一個開放的端口時,屏幕打印『Port # is open!』

8)2>$null - 告訴PowerShell遇到任何錯誤都不顯示

上述示例中掃描的端口是1-1024,但是可以很容易改成如(22..53)、(8000..9000)等端口範圍。

在PowerShell中另外一種可用的方法是使用Test-NetConnection命令。該命令使用方法差不多,還能夠輸出更多有用的信息。

Test-NetConnection 針對某IP段中單個端口的掃描


foreach ($ip in 1..20) {Test-NetConnection -Port 80 -InformationLevel "Detailed" 192.168.1.$ip}

技術分享

Test-NetConnection的最大的不足是:該命令是在4.0版本的PowerShell中才引入的。

命令分解

1)foreach ($ip in 1..20) {} - 循環遍歷數字1到20

2)Test-NetConnection - Test-Connection是一個用來測試不同種類的網絡連接的工具

3)-Port 80 - 檢查80端口是否可用

4)-InformationLevel "Detailed" - 提供詳細的輸出信息

5)192.168.1.$ip - 針對列表中的IP地址,依次嘗試向80端口發起連接。在本例中,變量$ip從1循環至20

當然,構建一個可以遍歷多個系統的多個端口的掃描器也是可行的。

針對某IP段 & 多個端口的掃描器


1..20 | % { $a = $_; 1..1024 | % {echo ((new-object Net.Sockets.TcpClient).Connect("10.0.0.$a",$_)) "Port $_ is open!"} 2>$null}

技術分享

這一版本的掃描器會對10.0.0.1-20IP段的1-1024端口進行掃描。註意,這可能需要花費較長時間才能完成掃描。一種更有效的方法是手動指定目標端口,比如接下來介紹的:

針對某IP段 & 多個端口的掃描器v2


1..20 | % { $a = $_; write-host "------"; write-host "10.0.0.$a"; 22,53,80,445 | % {echo ((new-object Net.Sockets.TcpClient).Connect("10.0.0.$a",$_)) "Port $_ is open!"} 2>$null}

技術分享

額外獎勵 - 測試出口過濾


許多安全的網絡環境會開啟出口流量過濾控制,以限制對某些服務的出口協議的訪問。這對於提升HTTP/HTTPS/DNS通道的安全性是有好處的,原因之一就在於此。然而,當需要識別出可替代的出站訪問時,我們可以在內網中使用PowerShell來評估網絡防火墻上的出口過濾器。

PowerShell測試出口過濾器

1..1024 | % {echo ((new-object Net.Sockets.TcpClient).Connect("allports.exposed",$_)) "Port $_ is open" } 2>$null

技術分享

有關PowerShell出口測試的更多信息,請參考Beau Bullock在*Black Hills Information Security中發表的文章:http://www.blackhillsinfosec.com/?p=4811

結論


PowerShell是一個強大的工具,一旦在Windows環境啟用了PowerShell,則幾乎可以用PS完成任何事情。大家如果有其他相關的PowerShell獨門絕技,歡迎留言評論。

本文由 安全客 翻譯,轉載請註明“轉自安全客”,並附上鏈接。
原文鏈接:https://pen-testing.sans.org/blog/2017/03/08/pen-test-poster-white-board-powershell-built-in-port-scanner

【技術分享】手把手教你使用PowerShell內置的端口掃描器