免责声明
本文仅用于技术讨论与学习,利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者及本公众号不为此承担任何责任。
存活探测
Ping 全称“Packet Internet Groper”,是一个网络诊断工具,用于检测计算机是否能够访问网络中的其他计算机或服务器,并且能够测量数据包从源计算机到目标计算机所需的时间。
-
IP 地址/主机名:你想要 Ping 的远程计算机或服务器的 IP 地址或主机名。 -
包大小:发送的 ICMP 请求数据包的大小。默认大小通常为 32 字节。 -
超时:等待 ICMP 回复的最长时间。如果在此时间内没有收到回复,那么就会认为 Ping 测试失败。 -
计数:Ping 测试的次数。根据需要,你可以进行一次或多次 Ping 测试。
Test-Connection -Count 1 -ComputerName 127.0.0.1
那么,我们可以写一个脚本,参数为扫描范围,来批量进行存活探测。这个脚本接受一个参数 -ScanRange,这个参数可以是一个 C 子网(例如:192.168.1.0/24),一个单独的 IP 地址(例如:192.168.1.10),或者一个 IP 地址范围(例如:192.168.1.0-192.168.1.255)。
param(
[Parameter(Mandatory=$True)]
[string]$ScanRange
)
function Ping-IPRange {
param (
[Parameter(Mandatory=$True)]
[string]$Range
)
if($Range -match "/") { # 检测是否为C段子网地址
$subnet = $Range.Substring(0, $Range.IndexOf("/"))
$subnetPrifixLength = $Range.Substring($Range.IndexOf("/") + 1)
$ipStart = $subnet.substring(0, $subnet.lastIndexOf("."))
1..254 | ForEach-Object { Test-Connection -ComputerName "$ipStart.$_" -Count 1 -ErrorAction SilentlyContinue| Format-Table -Property ProtocolAddress, ResponseTime}
}
elseif($Range -match "-") { # 检测是否为IP范围
$start = $Range.Split('-')[0]
$end = $Range.Split('-')[1]
$ipStart = $start.substring(0, $start.lastIndexOf(".") + 1)
$ipStartNum = $start.substring($start.lastIndexOf(".") + 1)
$ipEndNum = $end.substring($end.lastIndexOf(".") + 1)
$ipStartNum..$ipEndNum | ForEach-Object { Test-Connection -ComputerName "$ipStart$_" -Count 1 -ErrorAction SilentlyContinue | Format-Table -Property ProtocolAddress, ResponseTime }
}
else { # IP地址
Test-Connection -ComputerName $Range -Count 1 -ErrorAction SilentlyContinue | Format-Table -Property ProtocolAddress, ResponseTime
}
}
Ping-IPRange -Range $ScanRange
端口扫描
端口扫描同样使用使用PowerShell的Test-NetConnection cmdlet。
这个命令将发起一个到指定IP地址的网络连接,在指定端口进行监听。如果连接成功,我们可以得知这个端口是开放的;否则,这个端口可能是关闭或者被过滤的。使用示例和完整代码如下:
Test-NetConnection -ComputerName 192.168.171.21 -Port 80
param(
[Parameter(Mandatory=$True)]
[string]$ScanRange,
[Parameter(Mandatory=$True)]
[int]$StartPort,
[Parameter(Mandatory=$True)]
[int]$EndPort
)
function Scan-PortRange {
param(
[Parameter(Mandatory=$True)]
[string]$IpAddress,
[Parameter(Mandatory=$True)]
[int]$StartPort,
[Parameter(Mandatory=$True)]
[int]$EndPort
)
$StartPort..$EndPort | ForEach-Object {
$Port = $_
try{
$Connection = Test-NetConnection -ComputerName $IpAddress -Port $Port -WarningAction SilentlyContinue
if ($Connection.TcpTestSucceeded){
Write-Output "Port $Port is open on $IpAddress"
} else {
Write-Output "Port $Port is closed on $IpAddress"
}
} catch {
Write-Output "An error occurred testing port $Port on $IpAddress"
}
}
}
#调用Scan-PortRange函数即可开始扫描指定IP地址的端口范围
Scan-PortRange -IpAddress $ScanRange -StartPort $StartPort -EndPort $EndPort
总结
本文讲述了如何使用PowerShell的Test-NetConnection进行存活探测和端口扫描。实际上脚本还有很多可以优化的地方,后文将深入讲述如何利用PowerShell进行更多精细化的探测。
原文始发于微信公众号(赛博安全狗):【权限维持技术】PowerShell网络探测
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论