当前位置: 首页 > 编程笔记 >

PowerShell脚本开发之批量扫描IP和端口

胡泓
2023-03-14
本文向大家介绍PowerShell脚本开发之批量扫描IP和端口,包括了PowerShell脚本开发之批量扫描IP和端口的使用技巧和注意事项,需要的朋友参考一下

前面的文章中曾经发布了对指定IP进行批量端口扫描的方法和脚本,过PowerShell收发TCP和UDP消息包的方法以及通过PowerShell尝试登录SQLServer服务的方法,这构成了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.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 {

  }

}

 类似资料:
  • 本文向大家介绍PowerShell脚本开发之对指定IP进行端口扫描,包括了PowerShell脚本开发之对指定IP进行端口扫描的使用技巧和注意事项,需要的朋友参考一下 前些天看到一篇关于Metasploit与PowerShell的文章,里面提到了一句关于端口扫描的语句,写的很简练,思路很不错,可以抛开笨重的Nmap直接扫描指定的指定IP的端口:       语句中直接通过..列举了1到1024之间

  • 本文向大家介绍PowerShell脚本开发之收发TCP消息包,包括了PowerShell脚本开发之收发TCP消息包的使用技巧和注意事项,需要的朋友参考一下 在上篇文章中,我们在PSNet包中创建了Test-TCPPort函数用于探测指定IP的指定端口是否开放,检测端口之后大多数人想到的可能就是需要通过PowerShell收发TCP消息包了,这篇文章里将会描述如何在PSNet包中创建针对TCP消息包

  • 本文向大家介绍PowerShell脚本开发之收发UDP消息包,包括了PowerShell脚本开发之收发UDP消息包的使用技巧和注意事项,需要的朋友参考一下 在上篇文章中,在PSNet工具集中创建了Send-TCPMessage和Receive-TCPMessage两个函数实现了通过PowerShell收发TCP消息包的功能,有了TCP包的发送和接收,自然少不了UDP消息包的发送和接收,本文将会介绍

  • 本文向大家介绍PowerShell脚本开发之尝试登录ftp,包括了PowerShell脚本开发之尝试登录ftp的使用技巧和注意事项,需要的朋友参考一下 上一篇文章介绍了通过PowerShell批量扫描IP段和端口,在PSNet程序集中添加了Invoke-ScanIPPort函数,这里尽管扫描到了指定IP端中监听的端口,但是未对端口和相应的程序进行对应,正如我们所知一些常用的应用程序使用的默认端口是

  • 我必须使用扫描仪输入未知数量的数字。一旦用户输入-1,程序需要打印输入的所有数字的总和,然后结束程序。总和中需要包含-1。 我不能得到正确的总数。有人能帮忙吗?

  • 本文向大家介绍Windows2003下批量添加和导出所有ip BAT脚本,包括了Windows2003下批量添加和导出所有ip BAT脚本的使用技巧和注意事项,需要的朋友参考一下 批量添加IP 在cmd命令行下运行: 往“本地连接”中添加“192.168.1.130~192.168.1.190”的所有IP,且子网掩码都是255.255.255.192 导出所有IP 写一个批处理bat文件,如下内容