很久沒寫技術文章了,近期會發布多篇關於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/