powershell對指定IP進行端口掃描

       很久沒寫技術文章了,近期會發布多篇關於PowerShell和安全相關的一些文章。前些天看到一篇關於Metasploit與PowerShell的文章,裏面提到了一句關於端口掃描的語句,寫的很簡練,思路很不錯,能夠拋開笨重的Nmap直接掃描指定的指定IP的端口:shell

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

      語句中直接經過..列舉了1到1024之間的數字,經過管道次傳遞給後面的操做符,使用New-Object建立System.Net.Sockets.TCPClient對象,調用該對象的Connect()方法鏈接指定IP的指定端口,而端口則是由管道傳入的入組對象,也就是前面提到的1~1024及其之間的的數字,是由$_這個自動變量來代替,表明管道傳入的當前的對象。對於開放TCP端口是會有相應的程序監聽該端口的,等待程序鏈接,若是鏈接了一個不曾起監聽的端口,TCPClient對象是會拋出如下的異常安全

「Exception calling "Connect" with "2" argument(s): "因爲目標機器積極拒絕,沒法鏈接。 192.168.10.26:1"」網絡

     對於拋出的異常經過2>$null的方式將錯誤信息重定向到$null的空設備,而再也不當前屏幕輸出,於此同時若是在對指定端口進行鏈接的過程當中不曾拋出異常說明TCPClient對象能夠正常鏈接到端口,則打印出該端口並提示該端口是打開的。asp.net

     經過PowerShell對.net對象的調用咱們能夠作不少的事情,基本上用WinForm和asp.net能作的事情大多能夠經過PowerShell進行操做,與此同時我有了一個想法,經過PowerShell是否能夠寫出一些經常使用的用於安全和***測試的工做腳本,這些腳本能夠組合成一個工具集,這不就能在手邊沒有相關***工具的狀況下用 輕量級的腳本環境+編程 實現安全相關的功能檢測呢?tcp

    上面的腳本寫的很簡練了,可是有一個缺點,就是調用的TCPClient對象超時時間比較長,無論端口是否開發,都須要等到鏈接超時後纔會掃描下一個端口,掃描一個區間的端口會耗費不少的時間,鑑於此我打算改造上面的腳本,爲了便於函數的共享和重用,建立一個名爲PSNet的工具集:ide

Step 1:建立PowerShell的工做文件夾(D:\My Documents\WindowsPowerShell\Modules)並建立系統環境變量指向該目錄,便於後續調用,如PSSpace函數

Step 2.在上述步驟中提到的PSSpace路徑中建立與目標module同名的目錄用於存放腳本,即在%PSSpace%下建立PSNet工具

Step 3.在PSNet目錄下建立與module同名的.psm1文件PSNet.psm1測試

Step 4.在PSNet目錄下建立相關細分的子函數目錄,便於不一樣類型操做進行分類,如建立TCPOp,用於建立TCP相關操做,並把Test-TCPPort.ps1放入其中

Step 5.打開PSNet.psm1加入行:.$PSSpace/TCPOp/Test-TCPPort.ps1 之後若是要建立任何相關函數文件均可以添加一條記錄到此文件,以便module初始化的時候能夠初始化相關的函數,若是相關函數相互之間存在依賴關係,被依賴的文件初始化語句須要放在有依賴關係的文件語句以前

Step 6. 在PSNet.psm1語句的最後面添加Export-ModuleMember -Function * 語句用於將從該文件中導入的函數都做爲Module的成員發佈,注意此語句每一個模塊只可以使用一次不然將會報錯。

     至此工具集的結構建立成功,目錄樹以下所示:

+D:\MY DOCUMENTS\WINDOWSPOWERSHELL\MODULES
└─PSNet
    │  PSNet.psm1
    │ 
    └─TCPOp
            Test-TCPPort.ps1

     若是咱們要在PSNet下建立關於UDP相關的操做能夠與TCPOp同級建立UDPOp子模塊目錄,依次類推,與網絡相關的操做子模塊均放在PSNet下,再預先建立一個PSSecurity模塊用於後續建立於安全相關的模塊。目錄結構以下:

+D:\MY DOCUMENTS\WINDOWSPOWERSHELL\MODULES
├─PSNet
│  │  PSNet.psm1
│  │ 
│  ├─TCPOp
│  │      Test-TCPPort.ps1
│  │     
│  └─UDPOp
└─PSSecurity

    對於Test-TCPPort.ps1子模塊,寫入如下代碼用於實現對TCP端口是否監聽進行測試:

Function Test-TCPPort
{
	param ( [ValidateNotNullOrEmpty()]
	[string] $EndPoint = $(throw "Please specify an EndPoint (Host or IP Address)"),
	[string] $Port = $(throw "Please specify a Port") )
	
	try
	{
		$TimeOut = 1000#定義TCP端口超時時間
		if ( $IP = [System.Net.Dns]::GetHostAddresses($EndPoint) )
		{
			$Address = [System.Net.IPAddress]::Parse($IP)
			$Socket = New-Object System.Net.Sockets.TCPClient
			$Connect = $Socket.BeginConnect($Address,$Port,$null,$null)
			if ( $Connect.IsCompleted )
			{
				$Wait = $Connect.AsyncWaitHandle.WaitOne($TimeOut,$false)			
				if(!$Wait) 
				{
					$Socket.Close() 
					return $false 
				} 
				else
				{
					$Socket.EndConnect($Connect)
					$Socket.Close()
					return $true
				}
			}
			else
			{
				return $false
			}
		}
		else
		{
			return $false
		}
	}
	catch{}
}
對於此模塊能夠經過PowerShell命令行使用如下語句 :

Import-Module $env:PSSpace/PSNet

Test-TCPPort 192.168.10.26 80

    進行調用,或者經過命令行或者批處理啓動時指定

start %windir%\System32\WindowsPowerShell\v1.0\powershell.exe -noExit -Command "Import-Module '%PSSpace%\PSNet' "

     對於本文最初的那個例子,在有了導入這個模塊後執行:

1..1024 | %{$A=(Test-tcpport 192.168.10.26 $_)
if($a) {
echo $_
}
}

      在本文經過一段小腳本的方式引入了經過PowerShell實現簡單安全***功能的想法,首先介紹了該小腳本是如何實現功能的,接下來對建立腳本工具集並導入的方法,隨後又在該工具集中建立了Test-TCPPort函數,並介紹了調用方法,在後續的文章中將會陸續介紹相關腳本的開發,盡請期待。

 

做者: 付海軍
出處:http://fuhj02.blog.51cto.com
版權:本文版權歸做者和51cto共有
轉載:歡迎轉載,爲了保存做者的創做熱情,請按要求【轉載】,謝謝
要求:未經做者贊成,必須保留此段聲明;必須在文章中給出原文鏈接且保證內容完整!不然必究法律責任!
我的網站: http://txj.shell.tor.hu/

相關文章
相關標籤/搜索