PowerShell腳本開發(fā)之對指定IP進行端口掃描
前些天看到一篇關于Metasploit與PowerShell的文章,里面提到了一句關于端口掃描的語句,寫的很簡練,思路很不錯,可以拋開笨重的Nmap直接掃描指定的指定IP的端口:
1..1024 | %{ echo ((new-object Net.Sockets.TcpClient).Connect("192.168.10.26",$_)) "$_ is open"} 2>$null
語句中直接通過..列舉了1到1024之間的數(shù)字,通過管道次傳遞給后面的操作符,使用New-Object創(chuàng)建System.Net.Sockets.TCPClient對象,調(diào)用該對象的Connect()方法連接指定IP的指定端口,而端口則是由管道傳入的入組對象,也就是前面提到的1~1024及其之間的的數(shù)字,是由$_這個自動變量來代替,代表管道傳入的當前的對象。對于開放TCP端口是會有相應的程序監(jiān)聽該端口的,等待程序連接,如果連接了一個未曾起監(jiān)聽的端口,TCPClient對象是會拋出以下的異常
“Exception calling "Connect" with "2" argument(s): "由于目標機器積極拒絕,無法連接。 192.168.10.26:1"”
對于拋出的異常通過2>$null的方式將錯誤信息重定向到$null的空設備,而不再當前屏幕輸出,于此同時如果在對指定端口進行連接的過程中未曾拋出異常說明TCPClient對象可以正常連接到端口,則打印出該端口并提示該端口是打開的。
通過PowerShell對.net對象的調(diào)用我們可以做很多的事情,基本上用WinForm和asp.net能做的事情大多可以通過PowerShell進行操作,與此同時我有了一個想法,通過PowerShell是否可以寫出一些常用的用于安全和滲透測試的工作腳本,這些腳本可以組合成一個工具集,這不就能在手邊沒有相關滲透工具的情況下用 輕量級的腳本環(huán)境+編程 實現(xiàn)安全相關的功能檢測呢?
上面的腳本寫的很簡練了,但是有一個缺點,就是調(diào)用的TCPClient對象超時時間比較長,不管端口是否開發(fā),都需要等到連接超時后才會掃描下一個端口,掃描一個區(qū)間的端口會耗費很多的時間,鑒于此我打算改造上面的腳本,為了便于函數(shù)的共享和重用,創(chuàng)建一個名為PSNet的工具集:
Step 1:創(chuàng)建PowerShell的工作文件夾(D:\My Documents\WindowsPowerShell\Modules)并創(chuàng)建系統(tǒng)環(huán)境變量指向該目錄,便于后續(xù)調(diào)用,如PSSpace
Step 2.在上述步驟中提到的PSSpace路徑中創(chuàng)建與目標module同名的目錄用于存放腳本,即在%PSSpace%下創(chuàng)建PSNet
Step 3.在PSNet目錄下創(chuàng)建與module同名的.psm1文件PSNet.psm1
Step 4.在PSNet目錄下創(chuàng)建相關細分的子函數(shù)目錄,便于不同類型操作進行分類,如創(chuàng)建TCPOp,用于創(chuàng)建TCP相關操作,并把Test-TCPPort.ps1放入其中
Step 5.打開PSNet.psm1加入行:.$PSSpace/TCPOp/Test-TCPPort.ps1 以后如果要創(chuàng)建任何相關函數(shù)文件都可以添加一條記錄到此文件,以便module初始化的時候可以初始化相關的函數(shù),如果相關函數(shù)相互之間存在依賴關系,被依賴的文件初始化語句需要放在有依賴關系的文件語句之前
Step 6. 在Test-TCPPort.ps1語句的最后面添加Export-ModuleMember -Function * 語句用于將該文件中的函數(shù)都作為Module的成員發(fā)布。
至此工具集的結構創(chuàng)建成功,目錄樹如下所示:
+D:\MY DOCUMENTS\WINDOWSPOWERSHELL\MODULES
└─PSNet
│ PSNet.psm1
│
└─TCPOp
Test-TCPPort.ps1
如果我們要在PSNet下創(chuàng)建關于UDP相關的操作可以與TCPOp同級創(chuàng)建UDPOp子模塊目錄,依次類推,與網(wǎng)絡相關的操作子模塊均放在PSNet下,再預先創(chuàng)建一個PSSecurity模塊用于后續(xù)創(chuàng)建于安全相關的模塊。目錄結構如下:
D:\MY DOCUMENTS\WINDOWSPOWERSHELL\MODULES
├─PSNet
│ │ PSNet.psm1
│ │
│ ├─TCPOp
│ │ Test-TCPPort.ps1
│ │
│ └─UDPOp
└─PSSecurity
對于Test-TCPPort.ps1子模塊,寫入以下代碼用于實現(xiàn)對TCP端口是否監(jiān)聽進行測試:
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{}
}
Export-ModuleMember -Function * #用于將函數(shù)導出為模塊成員
對于此模塊可以通過PowerShell命令行使用以下語句 :
Import-Module $env:PSSpace/PSNet
Test-TCPPort 192.168.10.26 80
進行調(diào)用,或者通過命令行或者批處理啟動時指定
start %windir%\System32\WindowsPowerShell\v1.0\powershell.exe -noExit -Command "Import-Module ‘%PSSpace%\PSNet' "
對于本文最初的那個例子,在有了導入這個模塊后執(zhí)行:
1..1024 | %{$A=(Test-tcpport 192.168.10.26 $_)
if($a) {
echo $_
}
}
在本文通過一段小腳本的方式引入了通過PowerShell實現(xiàn)簡單安全滲透功能的想法,首先介紹了該小腳本是如何實現(xiàn)功能的,接下來對創(chuàng)建腳本工具集并導入的方法,隨后又在該工具集中創(chuàng)建了Test-TCPPort函數(shù),并介紹了調(diào)用方法,在后續(xù)的文章中將會陸續(xù)介紹相關腳本的開發(fā),盡請期待。
相關文章
PowerShell函數(shù)實現(xiàn)類似重載功能實例
這篇文章主要介紹了PowerShell函數(shù)實現(xiàn)類似重載功能實例,PowerShell函數(shù)是不支持重載的,本文介紹的是類似功能,需要的朋友可以參考下2014-07-07PowerShell查找分區(qū)中最大文件的方法(查找文件并按大小排序)
這篇文章主要介紹了PowerShell查找分區(qū)中最大文件的方法,查找文件并按占用空間排序,并用命令參數(shù)只輸出比如10條,這樣就可以快速找出一個目錄、一個分區(qū)下的N個最大的文件,需要的朋友可以參考下2014-08-08PowerShell中把相對路徑轉(zhuǎn)換為絕對路徑的2個方法
這篇文章主要介紹了PowerShell中把相對路徑轉(zhuǎn)換為絕對路徑的2個方法,并對他的區(qū)別做了講解,需要的朋友可以參考下2014-08-08PowerShell創(chuàng)建Byte數(shù)組例子
這篇文章主要介紹了PowerShell創(chuàng)建Byte數(shù)組例子,Byte數(shù)組即字節(jié)數(shù)組,它是一種強類型的數(shù)組,需要的朋友可以參考下2014-08-08PowerShell腳本清理指定天數(shù)前的臨時文件夾實現(xiàn)代碼
這篇文章主要介紹了PowerShell腳本清理指定天數(shù)前的臨時文件夾實現(xiàn)代碼,指定天數(shù)可以任意修改數(shù)字實現(xiàn),需要的朋友可以參考下2014-08-08