aniqfakhrul/powerview.py
GitHub: aniqfakhrul/powerview.py
基于 Python 实现的 Active Directory 侦察与攻击工具,提供持久的 LDAP 交互会话、查询混淆、漏洞检测及 AI 集成能力。
Stars: 888 | Forks: 85
[安装](#installation) | [基本用法](#basic-usage) | [混淆](#obfuscation) | [模块](#module-available-so-far) | [日志](#logging) | [用户定义规则](#user-defined-rules) | [MCP](#mcp) | [致谢](#acknowledgements) ## 概述 PowerView.py 是强大的原始 [PowerView.ps1](https://github.com/PowerShellMafia/PowerSploit/blob/master/Recon/PowerView.ps1) 脚本的替代品。PowerView 中使用的大多数模块在这里都可用(一些标志已更改)。主要目标是实现交互式会话,而无需重复向 LDAP 进行身份验证。 ## 安装 https://github.com/aniqfakhrul/powerview.py/wiki/Installation-Guide ## 基本用法 * 初始化连接 ``` powerview range.net/lowpriv:Password123@192.168.86.192 [-k] [--use-ldap | --use-ldaps | --use-gc | --use-gc-ldaps | --use-adws] ``` * 维持持久连接 * 启动 Web 界面 ``` powerview range.net/lowpriv:Password123@192.168.86.192 --web [--web-host 0.0.0.0] [--web-port 3000] [--web-auth user:password1234] ```  * 使用特定身份验证初始化连接。请注意,`--use-sign-and-seal` 和 `--use-channel-binding` 仅在您直接从此 [分支](https://github.com/ThePirateWhoSmellsOfSunflowers/ldap3/tree/tls_cb_and_seal_for_ntlm) 安装 `ldap3` 库时才可用 ``` powerview range.net/lowpriv:Password123@192.168.86.192 [--use-channel-binding | --use-sign-and-seal | --use-simple-auth] ``` * 使用 Schannel 初始化。`--pfx` 标志接受 pfx 格式的证书文件。 ``` powerview 10.10.10.10 --pfx administrator.pfx ```  * 查询特定用户 ``` Get-DomainUser Administrator Get-DomainUser -Identity Administrator ``` * 指定搜索属性 ``` Get-DomainUser -Properties samaccountname,description ``` * 过滤结果 ``` Get-DomainUser -Where 'samaccountname [contains][in][eq] admins' ``` * 统计结果 ``` Get-DomainUser -Count ``` * 将结果输出到文件 ``` Get-DomainUser -OutFile ~/domain_user.txt ``` * 将输出格式化为表格。 ``` Get-DomainUser -Properties samaccountname,memberof -TableView Get-DomainUser -Properties samaccountname,memberof -TableView [csv,md,html,latex] ``` * Set 模块 ``` Set-DomainObject -Identity "adminuser" -Set 'servicePrincipalname=http/web.ws.local' Set-DomainObject -Identity "adminuser" -Append 'servicePrincipalname=http/web.ws.local' Set-DomainObject -Identity "adminuser" -Clear 'servicePrincipalname' # 从本地文件读取 Set-DomainObject -Identity "adminuser" -Set 'servicePrincipalname=@/path/to/local/file' Set-DomainObject -Identity "adminuser" -Append 'servicePrincipalname=@/path/to/local/file' ``` * Relay 模式 ``` powerview 10.10.10.10 --relay [--relay-host] [--relay-port] [--use-ldap | --use-ldaps] ```  ### 混淆 PowerView 可以混淆 LDAP 查询和相关参数,以改变可观察的模式,同时保留查询意图。 * 通过 CLI 启用 ``` powerview range.net/lowpriv:Password123@192.168.86.192 --obfuscate ``` * 通过 Web 启用 **混淆内容** - Filter(过滤器):在发送之前转换属性名称、运算符和值 - DN:改变搜索库的 distinguishedName(可分辨名称) - Attributes(属性):改变请求的属性列表 **使用的技术** - 带有间距/零变化的 OID 属性编码(为了兼容性省略前缀) - 属性/值的随机大小写 - 数值/SID 值的前导零填充 - 符合条件的值的十六进制编码 - 过滤器和 DN 中与上下文相关的间距 - 相等运算符替换为近似运算符 - 通配符扩展 - ANR 属性随机化 - DN 十六进制转义 + 随机大小写 - 属性列表 OID 别名 + 随机大小写 * ldapx:灵活的 LDAP 代理,用于 filter/DN/attribute 转换的灵感和参考 — https://github.com/Macmod/ldapx * Research:MaLDAPtive: Obfuscation and De-Obfuscation (DEF CON 32 talk) — https://www.youtube.com/watch?v=mKRS5Iyy7Qo * Authors:Sabajete Elezaj — https://x.com/sabi_elezi, Daniel Bohannon — https://x.com/danielhbohannon ## 可用模块(目前?) ``` PV > Add-ADComputer Get-ADObject Get-EventLogChannel Login-As Set-ADObject Add-ADUser Get-CA Get-EventLogPublisher Logoff-Session Set-ADObjectDN Add-CATemplate Get-CATemplate Get-ExchangeDatabase Reboot-Computer Set-CATemplate Add-CATemplateAcl Get-DMSA Get-ExchangeMailbox Remove-ADComputer Set-DomainCATemplate Add-DMSA Get-Domain Get-ExchangeServer Remove-ADObject Set-DomainComputerPassword Add-DomainCATemplate Get-DomainCA Get-GMSA Remove-ADUser Set-DomainDNSRecord Add-DomainCATemplateAcl Get-DomainCATemplate Get-GPOLocalGroup Remove-CATemplate Set-DomainObject Add-DomainComputer Get-DomainComputer Get-GPOSettings Remove-DMSA Set-DomainObjectDN Add-DomainDMSA Get-DomainController Get-LocalUser Remove-DomainCATemplate Set-DomainObjectOwner Add-DomainDNSRecord Get-DomainDMSA Get-NamedPipes Remove-DomainComputer Set-DomainRBCD Add-DomainGMSA Get-DomainDNSRecord Get-NetComputerInfo Remove-DomainDMSA Set-DomainUserPassword Add-DomainGPO Get-DomainDNSZone Get-NetLoggedOn Remove-DomainDNSRecord Set-NetService Add-DomainGroup Get-DomainForeignGroupMember Get-NetProcess Remove-DomainGMSA Set-ObjectOwner Add-DomainGroupMember Get-DomainForeignUser Get-NetService Remove-DomainGroupMember Set-RBCD Add-DomainObjectAcl Get-DomainGMSA Get-NetSession Remove-DomainObject Set-ShadowCred Add-DomainOU Get-DomainGPO Get-NetShare Remove-DomainObjectAcl Set-ShadowCredential Add-DomainUser Get-DomainGPOLocalGroup Get-NetTerminalSession Remove-DomainOU Shutdown-Computer Add-GMSA Get-DomainGPOSettings Get-ObjectAcl Remove-DomainUser Start-NetService Add-GPLink Get-DomainGroup Get-ObjectOwner Remove-GMSA Stop-Computer Add-GPO Get-DomainGroupMember Get-RBCD Remove-GPLink Stop-NetProcess Add-GroupMember Get-DomainObject Get-RegLoggedOn Remove-GroupMember Stop-NetService Add-NetService Get-DomainObjectAcl Get-SCCM Remove-NetService Unlock-ADAccount Add-ObjectAcl Get-DomainObjectOwner Get-ShadowCred Remove-NetSession clear Add-OU Get-DomainOU Get-ShadowCredential Remove-NetTerminalSession exit Clear-Cache Get-DomainRBCD Get-TrustKey Remove-ObjectAcl get_pool_stats ConvertFrom-SID Get-DomainSCCM Get-WDS Remove-OU history ConvertFrom-UACValue Get-DomainTrust Invoke-ASREPRoast Remove-ShadowCred taskkill Disable-DomainDNSRecord Get-DomainTrustKey Invoke-DFSCoerce Remove-ShadowCredential tasklist Find-ForeignGroup Get-DomainUser Invoke-Kerberoast Restart-Computer Find-ForeignUser Get-DomainWDS Invoke-MessageBox Restore-ADObject Find-LocalAdminAccess Get-EventLog Invoke-PrinterBug Restore-DomainObject ``` ### 域/LDAP 函数 | 模块 | 别名 | 描述 | | ------ | ----- | ---- | |Get-DomainUser||查询 AD 中的所有用户或特定用户对象| |Get-DomainComputer||查询 AD 中的所有计算机或特定计算机对象| |Get-DomainGroup||查询 AD 中的所有组或特定组对象| |Get-DomainGroupMember||查询特定域组的成员| |Get-DomainOU||查询 AD 中的所有 OU 或特定 OU 对象| |Get-Domain||查询域信息| |Get-DomainController||查询可用的域控制器| |Get-DomainDNSRecord||查询可用的记录。如果未指定 -ZoneName,它将递归所有 DNS 区域| |Get-DomainDNSZone||查询域中可用的 DNS 区域| |Get-DomainObject|Get-ADObject|查询 AD 中的所有或指定域对象| |Get-DomainObjectAcl|Get-ObjectAcl|查询指定 AD 对象的 ACL| |Get-DomainSCCM|Get-SCCM|查询 SCCM| |Get-DomainRBCD|Get-RBCD|查找配置了基于资源的约束委派的账户| |Get-DomainObjectOwner|Get-ObjectOwner|查询 AD 对象的所有者| |Get-DomainGMSA|Get-GMSA|查询组托管服务账户 (gMSA) 并检索其密码 Blob| |Get-DomainDMSA|Get-GDSA|查询委托托管服务账户| |Remove-DomainGMSA|Remove-GMSA|从域中删除现有的组托管服务账户 (GMSA)| |Remove-DomainDMSA|Remove-DMSA|从域中删除现有的委托托管服务账户| |Remove-DomainDNSRecord||删除域 DNS 记录| |Remove-DomainComputer|Remove-ADComputer|删除域计算机| |Remove-DomainGroupMember|Remove-GroupMember|删除特定域组的成员| |Remove-DomainOU|Remove-OU|删除 AD 中的 OU 或特定 OU 对象| |Remove-DomainObjectAcl|Remove-ObjectAcl|删除指定 AD 对象的 ACL| |Remove-DomainObject|Remove-ADObject|删除指定的域对象| |Remove-DomainUser|Remove-ADUser|删除 AD 中指定的域用户| |Set-DomainDNSRecord||设置域 DNS 记录| |Set-DomainUserPassword||设置指定域用户的密码| |Set-DomainComputerPassword||设置指定域计算机的密码| |Set-DomainObject|Set-ADObject|设置 AD 中的指定域对象| |Set-DomainObjectDN|Set-ADObjectDN| 修改对象的 distinguishedName 属性以及更改 OU| |Set-DomainObjectOwner|Set-ObjectOwner|设置 AD 对象的所有者| |Set-ShadowCredential|Set-ShadowCred|管理域对象的 msDS-KeyCredentialLink (Shadow Credentials)| |Get-ShadowCredential|Get-ShadowCred|列出域对象或所有对象的 Shadow Credentials (msDS-KeyCredentialLink)| |Remove-ShadowCredential|Remove-ShadowCred|通过 DeviceId 删除 Shadow Credentials 或清除域对象中的所有内容| |Add-DomainDNSRecord||添加域 DNS 记录| |Disable-DomainDNSRecord||通过指向无效地址禁用 DNS 记录| |Add-DomainGMSA|Add-GMSA|在域中创建新的组托管服务账户 (gMSA)| |Add-DomainDMSA|Add-GMSA|在域中创建新的委托托管服务账户| |Add-DomainUser|Add-ADUser|在 AD 中添加新的域用户| |Add-DomainComputer|Add-ADComputer|在 AD 中添加新的域计算机| |Add-DomainGroupMember|Add-GroupMember|在 AD 中的指定域组中添加新成员| |Add-DomainOU|Add-OU|在 AD 中添加新的 OU 对象| |Add-DomainGPO|Add-GPO|在 AD 中添加新的 GPO 对象| |Add-DomainObjectAcl|Add-ObjectAcl|目前支持的权限有 All, DCsync, RBCD, ShadowCred, WriteMembers| |Clear-Cache||清除缓存| ### GPO 函数 | 模块 | 别名 | 描述 | | ------ | ----- | ---- | |Get-DomainGPO|| 查询域组策略对象 | |Get-DomainGPOLocalGroup|Get-GPOLocalGroup|查询域中所有通过 `Restricted Groups` 或 `Group Policy preferences` 修改本地组成员身份的 GPO| |Add-GPLink||创建到 OU 的新 GPO 链接| |Remove-GPLink||删除 OU 上的 GPO 链接| ### 计算机枚举函数 | 模块 | 别名 | 描述 | | ------ | ----- | ---- | |Get-NetSession||[MS-SRVS] 查询本地或远程计算机的会话信息| |Get-NetShare||查询本地或远程计算机上的开放共享| |Get-NetLoggedOn||[MS-WKST] 查询本地或远程计算机上的已登录用户| |Get-EventLog||[MS-EVEN6] 通过 RPC 查询远程计算机的 Windows 事件日志| |Get-EventLogChannel||[MS-EVEN6] 列出远程计算机上的事件日志通道,并进行安全产品检测| |Get-EventLogPublisher||[MS-EVEN6] 列出远程计算机上的事件日志发布者,并进行安全产品检测| |Get-NetService||[MS-SCMR] 查询本地或远程计算机上正在运行的服务| |Stop-NetService||[MS-SCMR] 停止本地或远程计算机上的特定服务| |Get-NetProcess|tasklist|[MS-TSTS] 查询本地或远程计算机上正在运行的进程| |Stop-NetProcess|taskkill|[MS-TSTS] 终止本地或远程计算机上的特定进程| |Get-NetTerminalSession||[MS-TSTS] 查询本地或远程计算机上的活动终端会话| |Remove-NetTerminalSession||[MS-TSTS] 终止本地或远程计算机上的特定终端会话| |Stop-Computer|Shutdown-Computer|[MS-TSTS] 关闭远程计算机| |Restart-Computer|Reboot-Computer|[MS-TSTS] 重启远程计算机| ### ADCS 函数 | 模块 | 别名 | 描述 | | ------ | ----- | ---- | |Get-DomainCATemplate|Get-CATemplate|查询可用的 CA 模板。支持过滤易受攻击的模板| |Get-DomainCA|Get-CA|查询证书颁发机构 (CA)| |Remove-DomainCATemplate|Remove-CATemplate|删除指定的域 CA 模板| |Set-DomainCATemplate|Set-CATemplate|修改 CA 模板的域对象属性| |Add-DomainCATemplate|Add-CATemplate|添加新的域 CA 模板| |Add-DomainCATemplateAcl|Add-CATemplateAcl|向证书模板添加 ACL。目前支持的权限有 All, Enroll, Write| ### Exchange 函数 | 模块 | 别名 | 描述 | | ------ | ----- | ----------- | |Get-ExchangeServer|Get-Exchange|检索域中可用的 Exchange 服务器列表| ### 域信任函数 | 模块 | 别名 | 描述 | | ------ | ----- | ---- | |Get-DomainTrust||查询所有域信任| |Get-DomainForeignUser|Find-ForeignUser|查询位于用户域外组中的用户| |Get-DomainForeignGroupMember|Find-ForeignGroup|查询包含域外用户的组,并查找外部成员| ### 杂项函数 | 模块 | 别名 | 描述 | | ------ | ----- | ---- | |ConvertFrom-SID||将给定的安全标识符 (SID) 转换为用户/组名| |ConvertFrom-UACValue||将 UAC 整数值转换为可读形式| |Get-NamedPipes||列出特定计算机的命名管道| |Invoke-DFSCoerce||通过 MS-DFSNM NetrDfsRemoveStdRoot() 强制机器账户身份验证| |Invoke-Kerberoast||请求指定服务主体名称 的 Kerberos 票据| |Invoke-PrinterBug||触发 MS-RPRN RpcRemoteFindFirstPrinterChangeNotificationEx 函数,强制服务器向指定机器进行身份验证| |Unlock-ADAccount||通过修改 lockoutTime 属性解锁域账户| |Find-LocalAdminAccess||查找当前用户在本地域中拥有本地管理员访问权限的计算机| ### 日志记录 我们绝不会错过日志记录,以跟踪执行的操作。默认情况下,powerview 会在当前用户主目录 _(~)_ 中创建一个 `.powerview` 文件夹。每个日志文件基于当前日期生成。 示例路径:`/root/.powerview/logs/bionic.local/2024-02-13.log` ### 漏洞检测 PowerView.py 包含一个集成的漏洞检测系统,可自动识别常见的 Active Directory 安全问题。查询对象时,漏洞将显示在输出中: ``` vulnerabilities: [VULN-026] Domain with high machine account quota (allows users to add computer accounts) (MEDIUM) [VULN-029] Domain with weak minimum password length policy (less than 8 characters) (HIGH) ``` #### 用户定义规则 您可以通过修改 PowerView 存储目录中的 `vulns.json` 文件(`~/.powerview/vulns.json`)来定义自定义漏洞检测规则。 每个漏洞规则具有以下结构: ``` "rule_name": { "description": "Human-readable description of the vulnerability", "rules": [ { "attribute": "attributeName", "condition": "condition_type", "value": "value_to_check" }, { "attribute": "anotherAttribute", "condition": "another_condition", "value": "another_value" } ], "exclusions": [ { "attribute": "attributeName", "condition": "condition_type", "value": "value_to_exclude" } ], "severity": "low|medium|high|critical", "id": "VULN-XXX", "rule_operator": "AND|OR", "exclusion_operator": "AND|OR", "details": "Optional detailed explanation of the vulnerability and remediation steps" } ``` **规则组件:** - **rules**:必须满足才能检测到漏洞的条件列表 - **exclusions**:如果满足排除对象检测的条件列表,即使该对象匹配规则 - **rule_operator**:如何组合多个规则(默认值:"OR") - "AND":所有规则必须匹配 - "OR":任何规则都可以匹配 - **exclusion_operator**:如何组合多个排除项(默认值:"OR") - "OR":任何排除项匹配即可排除该对象 - "AND":所有排除项必须匹配才能排除该对象 - **negate**:可选的布尔值,可添加到任何规则以反转其结果 **支持的条件:** | 条件 | 描述 | | --------- | ----------- | | `exists` | 属性存在 | | `not_exists` | 属性不存在 | | `equals` | 精确匹配(不区分大小写) | | `not_equals` | 非精确匹配 | | `contains` | 子字符串匹配(不区分大小写) | | `not_contains` | 无子字符串匹配 | | `startswith` | 以字符串开头(不区分大小写) | | `endswith` | 以字符串结尾(不区分大小写) | | `older_than` | 日期早于指定的天数 | | `newer_than` | 日期晚于指定的天数 | | `greater_than` | 数值大于指定值 | | `less_than` | 数值小于指定值 | | `greater_than_or_equal` | 数值大于或等于指定值 | | `less_than_or_equal` | 数值小于或等于指定值 | | `has_flag` | 数值中设置了位标志 | | `missing_flag` | 数值中未设置位标志 | | `any_flag_set` | 设置了任何指定的标志 | | `all_flags_set` | 设置了所有指定的标志 | **多值:** 您可以使用以下方式为条件指定多个值: 1. 管道分隔字符串:`"value": "value1|value2|value3"` 2. 列表格式:`"value": ["value1", "value2", "value3"]` **示例规则:** ``` "weak_password_policy": { "description": "Domain with weak minimum password length policy (less than 8 characters)", "rules": [ { "attribute": "objectClass", "condition": "contains", "value": "domainDNS" }, { "attribute": "minPwdLength", "condition": "less_than", "value": 8 } ], "exclusions": [], "severity": "high", "id": "VULN-029", "rule_operator": "AND" } ``` ### MCP 这将启用模型上下文协议服务器,允许 AI 代理通过 Streamable HTTP 传输的标准化接口与 PowerView 功能进行交互。有关更多详细信息,请参阅 [MCP 文档](powerview/mcp/README.md)。 * 启动 MCP 服务器 ``` powerview domain.local/lowpriv:Password1234@10.10.10.10 --mcp [--mcp-host 0.0.0.0] [--mcp-port 8888] [--mcp-path powerview] ``` MCP 服务器通过标准化的工具接口公开 PowerView 的大部分功能。这包括以下能力: - 查询和枚举 Active Directory 对象(用户、计算机、组、OU) - 检索有关域信任、GPO 和组成员身份的信息 - 搜索安全漏洞和错误配置 - ... #### Claude Desktop Claude Desktop 尚不支持基于 HTTP 的传输 [Github](https://github.com/orgs/modelcontextprotocol/discussions/16)。您可能需要使用 [mcp-proxy](https://github.com/sparfenyuk/mcp-proxy)。 * 安装 `mcp-proxy` ``` # 选项 1:使用 uv(推荐) uv tool install mcp-proxy # 选项 2:使用 pipx(备选) pipx install mcp-proxy ``` * 修改 `%APPDATA%\Claude\claude_desktop_config.json` ``` { "mcpServers": { "Powerview": { "command": "mcp-proxy", "args": ["http://10.10.10.10:5000/powerview"] } } } ``` #### Cursor 您可以在 MCP 选项按钮下的 Cursor 设置中修改此项。 ``` { "mcpServers": { "Powerview": { "url": "http://127.0.0.1:5000/powerview" } } } ``` ### 致谢 * https://github.com/SecureAuthCorp/impacket * https://github.com/CravateRouge/bloodyAD * https://github.com/PowerShellMafia/PowerSploit/blob/master/Recon/PowerView.ps1 * https://github.com/ThePorgs/impacket/ * https://github.com/the-useless-one/pywerview * https://github.com/dirkjanm/ldapdomaindump * https://learn.microsoft.com/en-us/powershell/module/grouppolicy/new-gplink * https://github.com/ThePirateWhoSmellsOfSunflowers/ldap3/tree/tls_cb_and_seal_for_ntlm * https://github.com/ly4k/Certipy * https://github.com/MaLDAPtive/Invoke-Maldaptive * https://github.com/xforcered/SoaPy * https://github.com/Macmod/sopa
标签:Active Directory, AD安全, HTTP, IPv6, LDAP协议, LDAP枚举, PE 加载器, Plaso, PowerShell, PowerView替代, Prisma Cloud, Python安全工具, SNMP, Web报告查看器, 内网信息收集, 后渗透, 域渗透测试, 域环境渗透, 开源安全工具, 提权辅助, 模拟器, 横向移动, 渗透测试框架, 编程规范, 逆向工具, 逆向工程平台, 防御