前面的文章中曾经发布了对指定IP进行批量端口扫描的方法和脚本,过PowerShell收发TCP和UDP消息包的方法以及通过PowerShell尝试登录服状态"置疑"务的方法,这构成了PSNet程序集用于通过PowerShell对网络状态进行操作。最近在不断尝试之下,找到了对指定范围的IP段进行扫描和对端口进行扫描的方法,本文将会介绍如何通过PowerShell批量扫描IP及其对应的端口。
依然在PSNet程序集的基础上进行扩展,首先在$ env: PSSpace/PSNet TCPOp下创建脚本文件Invoke-ScanIPPort.ps1,并在$ env: PSSpace/PSNet TCPOp/PSNet。psm1中添加对脚本文件的调用:
。美元env: PSSpace/PSNet/TCPOp/Invoke-ScanIPPort。ps1
首先对后面代码中将会出现的变量进行介绍:
-StartAddress[扫描的起始IP地址],与-EndAddress配合使用,【此参数必须】
-EndAddress[扫描的结束IP地址],【此参数必须】
-ResolveHost[是否尝试对主机名尝试进行解析]
-ScanPort[是否进行端口扫描],如果要扫描端口此选项必须
-AllPort[是否对所有端口进行扫描],范围为1~65534(注意此选项扫描时间很长建议在选中单个IP的情况下进行使用,并且尽量少使用)
-StartPort[扫描的起始端口端口],与-EndPort配合使用,如果此选项与-Ports选项同时存在则-Port参数失效
-EndPort[扫描的结束端口]
-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如果后续带多个以逗号分割的多个数字则会扫描数字对应的端口,如果只扫描默认的端口,则不需此参数
-TimeOut超时时间,默认值为100ms(毫秒)
此函数的调用方式如下:
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对应主机名
Invoke-ScanIPPort -StartAddress 192.168.10.1 -EndAddress 192.168.10.254 -ResolveHost –ScanPort#扫描IP段,并尝试扫描默认端口
Invoke-ScanIPPort -StartAddress 192.168.10.1 -EndAddress 192.168.10.254 -ResolveHost -ScanPort -TimeOut 50 #扫描IP段,尝试扫描默认端口,端口扫描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段之间主机所有21至81之间的端口
上图来一张扫描过程中的图片
扫描结束后的结果:
代码如下:
函数Invoke-ScanIPPort { 参数( (参数(强制性=$真的, 位置=0)) [ValidatePattern (“\ b \ d {1,3} \ \ d {1,3} \。。\ d {1,3} \ \ d {1,3} \ b"。。)) [string] StartAddress美元, (参数(强制性=$真的, 位置=1) [ValidatePattern (“\ b \ d {1,3} \ \ d {1,3} \。。\ d {1,3} \ \ d {1,3} \ b"。。)) [string] EndAddress美元, (开关)ResolveHost美元, (开关)ScanPort美元, (开关)AllPort美元, (int) StartPort美元, (int) EndPort美元, [int[]] $端口=@(21日,22日,23日,53岁,69,71,80,98110139111389443445,1080,1433,2001,2049,3001,3128,5222,6667,6868,7777,7878,8080,1521,3306,3389,5801,5900,5555,5901), (int)超时=100美元 ) 开始{ $萍=新对象System.Net.Networkinformation.Ping } 过程{ foreach(美元)(美元StartAddress.Split (“!”) [0] . . EndAddress.Split美元(“!”)[0])){ foreach (b美元($ StartAddress.Split (“!”) [1] . . EndAddress.Split美元(“!”)[1])){ foreach ($ c (StartAddress.Split美元(“!”)[2]. . EndAddress.Split美元(“!”)[2])){ foreach ($ d (StartAddress.Split美元(“!”)[3]. . EndAddress.Split美元(“!”)[3])){ ip=耙幻涝。c。美元d"美元; write-progress活动“ScanIP Ping"地位“ip"美元;-percentcomplete (d/美元($ EndAddress.Split (“!”) [3])) * 100) pingStatus=ping.Send美元(“ip"美元;,超时美元) 如果(pingStatus美元。地位eq“Success") { 如果(ResolveHost美元){ write-progress活动ResolveHost地位“ip"美元;-percentcomplete (d/美元($ EndAddress.Split (“!”) [3])) * 100) id 1 $ getHostEntry=[Net.DNS]:: BeginGetHostEntry (pingStatus美元。地址、空,空美元) } 如果(ScanPort美元){ 如果(AllPort美元){ $=@港口(1 . . 65534) } 如果($ StartPort - ne零——EndPort美元- ne零美元){ $=@港口(StartPort . . EndPort美元) } $ openPorts=@ () (i=1美元;我勒Ports.Count美元;$ i + +) { $=$港港口[张($) write-progress活动“端口搜索result"美元(美元港口);地位“ip"美元;-percentcomplete (($ i/(Ports.Count美元))* 100)id 2 $客户=新对象System.Net.Sockets.TcpClient beginConnect=client.BeginConnect美元(pingStatus.Address,港口,美元零美元,美元零) 如果(client.Connected美元){ openPorts +=美元港口 其他}{ #等 美元起得毫超时 如果(client.Connected美元){ openPorts +=美元港口 长度=openPorts.length美元 美元$=敖峁鸞发现长度港口。港港口美元]“; } } $ client.Close () } } 如果(ResolveHost美元){ 主机名=美元([Net.DNS]:: EndGetHostEntry ([IAsyncResult] getHostEntry)美元).HostName } #返回对象 如果($ openPorts - ne零美元) { write-host“IPAddress"“ip"美元; 如果($ getHostEntry - ne零美元) {write-host“HostName"$ getHostEntry} write-host“Ports"openPorts美元 } } } } } } } {结束 } }PowerShell批量扫描IP和端口