您好,登錄后才能下訂單哦!
前面的文章中曾經(jīng)發(fā)布了對指定IP進(jìn)行批量端口掃描的方法和腳本,過PowerShell收發(fā)TCP和UDP消息包的方法以及通過PowerShell嘗試登錄SQLServer服務(wù)的方法,這構(gòu)成了PSNet程序集用于通過PowerShell對網(wǎng)絡(luò)狀態(tài)進(jìn)行操作。最近在不斷嘗試之下,找到了對指定范圍的IP段進(jìn)行掃描和對端口進(jìn)行掃描的方法,本文將會介紹如何通過PowerShell批量掃描IP及其對應(yīng)的端口。
依然在PSNet程序集的基礎(chǔ)上進(jìn)行擴(kuò)展,首先在$env:PSSpace/PSNet/TCPOp下創(chuàng)建腳本文件Invoke-ScanIPPort.ps1,并在$env:PSSpace/PSNet/TCPOp/PSNet.psm1中添加對腳本文件的調(diào)用:
. $env:PSSpace/PSNet/TCPOp/Invoke-ScanIPPort.ps1
首先對后面代碼中將會出現(xiàn)的變量進(jìn)行介紹:
-StartAddress[掃描的起始IP地址],與-EndAddress配合使用,【此參數(shù)必須】
-EndAddress[掃描的結(jié)束IP地址],【此參數(shù)必須】
-ResolveHost[是否嘗試對主機(jī)名嘗試進(jìn)行解析]
-ScanPort[是否進(jìn)行端口掃描],如果要掃描端口此選項(xiàng)必須
-AllPort[是否對所有端口進(jìn)行掃描],范圍為1~65534(注意此選項(xiàng)掃描時間很長建議在選中單個IP的情況下進(jìn)行使用,并且盡量少使用)
-StartPort[掃描的起始端口端口],與-EndPort配合使用,如果此選項(xiàng)與-Ports選項(xiàng)同時存在則-Port參數(shù)失效
-EndPort[掃描的結(jié)束端口]
-Ports掃描時默認(rèn)掃描的端口,如果后續(xù)不帶參數(shù)則僅掃描21,22,23,53,69,71,80,98,110,139,111,389,443,445,1080,1433,2001,2049,
3001,3128,5222,6667,6868,7777,7878,8080,1521,3306,3389,5801,5900,5555,5901如果后續(xù)帶多個以逗號分割的多個數(shù)字則會掃描數(shù)字對應(yīng)的端口,如果只掃描默認(rèn)的端口,則不需此參數(shù)
-TimeOut超時時間,默認(rèn)值為100ms(毫秒)
此函數(shù)的調(diào)用方式如下:
Invoke-ScanIPPort -StartAddress 192.168.10.1 -EndAddress 192.168.10.254#掃描IP段
Invoke-ScanIPPort -StartAddress 192.168.10.1 -EndAddress 192.168.10.254 –ResolveHost#掃描IP段,并嘗試解析IP對應(yīng)主機(jī)名
Invoke-ScanIPPort -StartAddress 192.168.10.1 -EndAddress 192.168.10.254 -ResolveHost –ScanPort#掃描IP段,并嘗試掃描默認(rèn)端口
Invoke-ScanIPPort -StartAddress 192.168.10.1 -EndAddress 192.168.10.254 -ResolveHost -ScanPort -TimeOut 50 #掃描IP段,嘗試掃描默認(rèn)端口,端口掃描50ms超時
Invoke-ScanIPPort -StartAddress 192.168.10.1 -EndAddress 192.168.10.254 -ResolveHost -ScanPort -Port 80 #掃描IP段,并嘗試掃描80端口
Invoke-ScanIPPort -StartAddress 192.168.10.1 -EndAddress 192.168.10.1 -ResolveHost -ScanPort –AllPort#掃描ip,并嘗試掃描所有1~65534之間端口
Invoke-ScanIPPort -StartAddress 192.168.10.1 -EndAddress 192.168.10.254 -ScanPort -StarPort 21 -EndPort 81#掃描IP段之間主機(jī)所有21至81之間的端口
上圖來一張掃描過程中的圖片
掃描結(jié)束后的結(jié)果:
代碼如下:
=====文件名:Invoke-ScanIPPort.ps1===== function Invoke-ScanIPPort { Param( [parameter(Mandatory = $true, Position = 0)] [ValidatePattern("\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b")] [string]$StartAddress, [parameter(Mandatory = $true, Position = 1)] [ValidatePattern("\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b")] [string]$EndAddress, [switch]$ResolveHost, [switch]$ScanPort, [switch]$AllPort, [int]$StartPort, [int]$EndPort, [int[]]$Ports = @(21,22,23,53,69,71,80,98,110,139,111,389,443,445,1080,1433,2001,2049,3001,3128,5222,6667,6868,7777,7878,8080,1521,3306,3389,5801,5900,5555,5901), [int]$TimeOut = 100 ) Begin { $ping = New-Object System.Net.Networkinformation.Ping } Process { foreach($a in ($StartAddress.Split(".")[0]..$EndAddress.Split(".")[0])) { foreach($b in ($StartAddress.Split(".")[1]..$EndAddress.Split(".")[1])) { foreach($c in ($StartAddress.Split(".")[2]..$EndAddress.Split(".")[2])) { foreach($d in ($StartAddress.Split(".")[3]..$EndAddress.Split(".")[3])) { $ip = "$a.$b.$c.$d" write-progress -activity "ScanIP Ping" -status "$ip" -percentcomplete (($d/($EndAddress.Split(".")[3])) * 100) $pingStatus = $ping.Send("$ip",$TimeOut) if($pingStatus.Status -eq "Success") { if($ResolveHost) { write-progress -activity ResolveHost -status "$ip" -percentcomplete (($d/($EndAddress.Split(".")[3])) * 100) -Id 1 $getHostEntry = [Net.DNS]::BeginGetHostEntry($pingStatus.Address, $null, $null) } if($ScanPort) { if($AllPort) { $Ports = @(1..65534) } if($StartPort -ne $null -and $EndPort -ne $null){ $Ports = @($StartPort..$EndPort) } $openPorts = @() for($i = 1; $i -le $Ports.Count;$i++) { $port = $Ports[($i-1)] write-progress -activity "PortScan[$port]$result" -status "$ip" -percentcomplete (($i/($Ports.Count)) * 100) -Id 2 $client = New-Object System.Net.Sockets.TcpClient $beginConnect = $client.BeginConnect($pingStatus.Address,$port,$null,$null) if($client.Connected) { $openPorts += $port } else { # Wait Start-Sleep -Milli $TimeOut if($client.Connected) { $openPorts += $port $length=$openPorts.length $result="[find $length ports.Last port $port]" } } $client.Close() } } if($ResolveHost) { $hostName = ([Net.DNS]::EndGetHostEntry([IAsyncResult]$getHostEntry)).HostName } # Return Object if ($openPorts -ne $null) { write-host "IPAddress" "$ip" if ($getHostEntry -ne $null) {write-host "HostName" $getHostEntry} write-host "Ports" $openPorts } } } } } } } End { } }
作者: 付海軍
出處:http://fuhj02.blog.51cto.com
版權(quán):本文版權(quán)歸作者和51cto共有
轉(zhuǎn)載:歡迎轉(zhuǎn)載,為了保存作者的創(chuàng)作熱情,請按要求【轉(zhuǎn)載】,謝謝
要求:未經(jīng)作者同意,必須保留此段聲明;必須在文章中給出原文連接且保證內(nèi)容完整!否則必究法律責(zé)任!
個人網(wǎng)站: http://txj.shell.tor.hu/
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。