Slapdash Safeguards

にわか仕込みのセキュリティ

今日はpowerview.pyに感動したから、毎年01/23はpowerview.py記念日

powerview.pyって良いですよね。

github.com

皆大好きPowerView

これのlinux版的なもの

ただし、powerview.pyはシェルは必要なく、ldap,ldaps,gc,adwsの接続のみでおk

侵入しなくてもpowerviewと同じようなコマンドが使えるのが良い。

インストール

以下実行するだけ、一応venvで環境でインストールしましょう。

python3 -m venv powerview-venv
source ./powerview-venv/bin/activate
sudo apt install libkrb5-dev
pip3 install powerview

実行確認

$ powerview             
usage: powerview [-h] [-p PORT] [-d] [--stack-trace] [-q QUERY] [--no-admin-check] [--obfuscate] [--no-cache] [--no-vuln-check] [--raw] [--use-system-nameserver | -ns NAMESERVER] [-v] [--use-ldap | --use-ldaps | --use-gc |
                 --use-gc-ldaps | --use-adws] [-H LMHASH:NTHASH] [-k] [--use-channel-binding | --use-sign-and-seal | --use-simple-auth | --pfx PFX] [--no-pass] [--aes-key hex key] [--dc-ip IP address] [--relay]
                 [--relay-host RELAY_HOST] [--relay-port RELAY_PORT] [--web] [--web-host WEB_HOST] [--web-port WEB_PORT] [--web-auth WEB_AUTH] [--mcp] [--mcp-host MCP_HOST] [--mcp-port MCP_PORT] [--mcp-name MCP_NAME]
                 [--mcp-path MCP_PATH] [--max-connections MAX_CONNECTIONS] [--pool-cleanup-interval POOL_CLEANUP_INTERVAL] [--keepalive-interval KEEPALIVE_INTERVAL]
                 target

Python alternative to SharpSploit's PowerView script, version 2026.1.6

positional arguments:
  target                [[domain/]username[:password]@]<targetName or address>

options:
  -h, --help            show this help message and exit
  -p, --port PORT       LDAP server port. (Default: 389|636)
  -d, --debug           Enable debug output
  --stack-trace         raise exceptions and exit if unhandled errors
  -q, --query QUERY     PowerView query to be executed one-time
  --no-admin-check      Skip admin check when first logging in
  --obfuscate           Obfuscate search filter
  --no-cache            Disable caching of LDAP queries
  --no-vuln-check       Disable vulnerability detection
  --raw                 Return raw LDAP entries without formatting
  --use-system-nameserver
                        Use system nameserver to resolve hostname/domain
  -ns, --nameserver NAMESERVER
                        Specify custom nameserver. If not specified, domain controller will be used instead
  -v, --version         show program's version number and exit

protocol:
  --use-ldap            [Optional] Use LDAP instead of LDAPS
  --use-ldaps           [Optional] Use LDAPS instead of LDAP
  --use-gc              [Optional] Use GlobalCatalog (GC) protocol
  --use-gc-ldaps        [Optional] Use GlobalCatalog (GC) protocol for LDAPS
  --use-adws            [Optional] Use ADWS protocol

authentication:
  -H, --hashes LMHASH:NTHASH
                        NTLM hashes, format is LMHASH:NTHASH
  -k, --kerberos        Use Kerberos authentication. Grabs credentials from .ccache file (KRB5CCNAME) based on target parameters. If valid credentials cannot be found, it will use the ones specified in the command line
  --use-channel-binding
                        [Optional] Use channel binding if channel binding is required on LDAP server
  --use-sign-and-seal   [Optional] Use sign and seal if LDAP signing is required on ldap server
  --use-simple-auth     Authenticate with SIMPLE authentication
  --pfx PFX             Supply .pfx formatted certificate. Use --cert and --key if no pfx
  --no-pass             don't ask for password (useful for -k)
  --aes-key hex key     AES key to use for Kerberos Authentication '(128 or 256 bits)'
  --dc-ip IP address    IP Address of the domain controller or KDC (Key Distribution Center) for Kerberos. If omitted it will use the domain part (FQDN) specified in the identity parameter

relay:
  --relay               Enable relay mode
  --relay-host RELAY_HOST
                        Bind interface to expose HTTP server (Default: 0.0.0.0)
  --relay-port RELAY_PORT
                        Relay mode custom HTTP port (Default: 80)

web:
  --web                 Enable web interface for LDAP queries
  --web-host WEB_HOST   Specify custom bind interface (Default: 127.0.0.1)
  --web-port WEB_PORT   Specify custom port for web interface (Default: 5000)
  --web-auth WEB_AUTH   Enable authentication for web interface (format: username:password)

mcp:
  --mcp                 Enable Model Context Protocol mode for AI assistants
  --mcp-host MCP_HOST   Specify custom bind interface for MCP (Default: 127.0.0.1)
  --mcp-port MCP_PORT   Specify custom port for MCP server (Default: 8080)
  --mcp-name MCP_NAME   Specify MCP server name (Default: PowerView MCP)
  --mcp-path MCP_PATH   Specify MCP server path (Default: /powerview)

connection pool:
  --max-connections MAX_CONNECTIONS
                        Maximum number of pooled domain connections (Default: 10)
  --pool-cleanup-interval POOL_CLEANUP_INTERVAL
                        Connection pool cleanup interval in seconds (Default: Disabled)
  --keepalive-interval KEEPALIVE_INTERVAL
                        Connection keep-alive interval in seconds (Default: Disabled)

使用感

接続

基本的にオリジナルシェルっぽいところで、PowerViewみたいにコマンド実行できる。

$ powerview us.techcorp.local/studentuserXXX:'XXXXXXXXXXXXXXX'@192.168.1.2
Logging directory is set to /home/kali/.powerview/logs/us-studentuserXXX-192.168.1.2
╭─LDAPS─[US-DC.us.techcorp.local]─[US\studentuserXXX]-[NS:192.168.1.2]
╰─PV ❯ 
Display all 153 possibilities? (y or n)
Add-ADComputer                 Add-OU                         Get-DomainCATemplate           Get-DomainUser                 Get-TrustKey                   Remove-DomainOU                Set-DomainObjectDN 
Add-ADUser                     Add-ObjectAcl                  Get-DomainComputer             Get-DomainWDS                  Get-WDS                        Remove-DomainObject            Set-DomainObjectOwner 
Add-CATemplate                 Clear-Cache                    Get-DomainController           Get-ExchangeDatabase           Invoke-ASREPRoast              Remove-DomainObjectAcl         Set-DomainRBCD 
Add-CATemplateAcl              ConvertFrom-SID                Get-DomainDMSA                 Get-ExchangeMailbox            Invoke-BadSuccessor            Remove-DomainUser              Set-DomainUserPassword 
Add-DMSA                       ConvertFrom-UACValue           Get-DomainDNSRecord            Get-ExchangeServer             Invoke-DFSCoerce               Remove-GMSA                    Set-NetService 
Add-DomainCATemplate           Disable-ADAccount              Get-DomainDNSZone              Get-GMSA                       Invoke-Kerberoast              Remove-GPLink                  Set-ObjectOwner 
Add-DomainCATemplateAcl        Disable-DomainDNSRecord        Get-DomainForeignGroupMember   Get-GPOLocalGroup              Invoke-MessageBox              Remove-GroupMember             Set-RBCD 
Add-DomainComputer             Disable-RDP                    Get-DomainForeignUser          Get-GPOSettings                Invoke-PrinterBug              Remove-NetService              Shutdown-Computer 
Add-DomainDMSA                 Dump-Schema                    Get-DomainGMSA                 Get-LocalUser                  Login-As                       Remove-NetSession              Start-NetService 
Add-DomainDNSRecord            Dump-ServerInfo                Get-DomainGPO                  Get-NamedPipes                 Logoff-Session                 Remove-NetTerminalSession      Stop-Computer 
Add-DomainGMSA                 Enable-ADAccount               Get-DomainGPOLocalGroup        Get-NetComputerInfo            Reboot-Computer                Remove-OU                      Stop-NetProcess 
Add-DomainGPO                  Enable-EFSRPC                  Get-DomainGPOSettings          Get-NetLoggedOn                Remove-ADComputer              Remove-ObjectAcl               Stop-NetService 
Add-DomainGroup                Enable-RDP                     Get-DomainGroup                Get-NetProcess                 Remove-ADObject                Restart-Computer               Unlock-ADAccount 
Add-DomainGroupMember          Find-ForeignGroup              Get-DomainGroupMember          Get-NetService                 Remove-ADUser                  Restore-ADObject               clear 
Add-DomainOU                   Find-ForeignUser               Get-DomainOU                   Get-NetSession                 Remove-CATemplate              Restore-DomainObject           exit 
Add-DomainObjectAcl            Find-LocalAdminAccess          Get-DomainObject               Get-NetShare                   Remove-DMSA                    Set-ADObject                   get_pool_stats 
Add-DomainUser                 Get-ADObject                   Get-DomainObjectAcl            Get-NetTerminalSession         Remove-DomainCATemplate        Set-ADObjectDN                 history 
Add-GMSA                       Get-CA                         Get-DomainObjectOwner          Get-ObjectAcl                  Remove-DomainComputer          Set-CATemplate                 qwinsta 
Add-GPLink                     Get-CATemplate                 Get-DomainRBCD                 Get-ObjectOwner                Remove-DomainDMSA              Set-DomainCATemplate           taskkill 
Add-GPO                        Get-DMSA                       Get-DomainSCCM                 Get-RBCD                       Remove-DomainDNSRecord         Set-DomainComputerPassword     tasklist 
Add-GroupMember                Get-Domain                     Get-DomainTrust                Get-RegLoggedOn                Remove-DomainGMSA              Set-DomainDNSRecord            whoami 
Add-NetService                 Get-DomainCA                   Get-DomainTrustKey             Get-SCCM                       Remove-DomainGroupMember       Set-DomainObject

コマンド実行

上記のコマンドは、PowerViewと同じコマンドだけが使用可能なわけではなく、一部オプションも動作する。

-Identity

対象ユーザ指定

╭─LDAPS─[US-DC.us.techcorp.local]─[US\studentuserXXX]-[NS:192.168.1.2]
╰─PV ❯ Get-DomainUser -Identity Administrator
objectClass                       : top
                                    person
                                    organizationalPerson
                                    user
cn                                : Administrator
description                       : Built-in account for administering the computer/domain
distinguishedName                 : CN=Administrator,CN=Users,DC=us,DC=techcorp,DC=local
memberOf                          : CN=Group Policy Creator Owners,CN=Users,DC=us,DC=techcorp,DC=local
                                    CN=Domain Admins,CN=Users,DC=us,DC=techcorp,DC=local
                                    CN=Administrators,CN=Builtin,DC=us,DC=techcorp,DC=local
name                              : Administrator
objectGUID                        : {6065fe62-0dcb-4a5e-bcad-e99f2dec4cdd}
userAccountControl                : NORMAL_ACCOUNT
                                    DONT_EXPIRE_PASSWORD
badPwdCount                       : 0
badPasswordTime                   : 15/01/2026 10:50:42 (7 days ago)
lastLogoff                        : 1601-01-01 00:00:00+00:00
lastLogon                         : 23/01/2026 08:31:40 (today)
pwdLastSet                        : 05/07/2019 07:42:09 (6 years, 6 months ago)
primaryGroupID                    : 513
objectSid                         : S-1-5-21-210670787-2521448726-163245708-500
adminCount                        : 1
sAMAccountName                    : Administrator
sAMAccountType                    : SAM_USER_OBJECT
objectCategory                    : CN=Person,CN=Schema,CN=Configuration,DC=techcorp,DC=local
lastLogonTimestamp                : 22/01/2026 22:15:11 (today)
vulnerabilities                   : [VULN-002] User account with password that never expires (LOW)
                                    [VULN-020] Admin account with delegation enabled (HIGH)

-Properties

表示する属性指定

╭─LDAPS─[US-DC.us.techcorp.local]─[US\studentuserXXX]-[NS:192.168.1.2]
╰─PV ❯ Get-DomainComputer -Properties Name,logoncount,operatingsystem,dnshostname -Identity US-DC
name                : US-DC
logonCount          : 983
operatingSystem     : Windows Server 2019 Standard
dNSHostName         : US-DC.us.techcorp.local

-LDAPFilterはダメ。でも代わりに-Where

descriptionにbuiltが含まれているのを確認したいとき。

╭─LDAPS─[US-DC.us.techcorp.local]─[US\studentuserXXX]-[NS:192.168.1.2] [CACHED]
╰─PV ❯ Get-DomainUser -Where 'description contains built' -Properties samaccountname,description
description        : Built-in account for guest access to the computer/domain
sAMAccountName     : Guest

description        : Built-in account for administering the computer/domain
sAMAccountName     : Administrator

-Count

勝手に数えてくれる。

╭─LDAPS─[US-DC.us.techcorp.local]─[US\studentuserXXX]-[NS:192.168.1.2]
╰─PV ❯ Get-DomainUser -Count
75

|selectは動作しないが、代わりに-TableView

|selectは動作しない。

╭─LDAPS─[US-DC.us.techcorp.local]─[US\studentuserXXX]-[NS:192.168.1.2]
╰─PV ❯ Get-DomainComputer | select Name,logoncount,operatingsystem,dnshostname
╭─LDAPS─[US-DC.us.techcorp.local]─[US\studentuserXXX]-[NS:192.168.1.2]
╰─PV ❯ 

でも代わりに-TableViewと-Propertiesでselectぽく表示

╭─LDAPS─[US-DC.us.techcorp.local]─[US\studentuserXXX]-[NS:192.168.1.2]
╰─PV ❯ Get-DomainUser -Properties samaccountname,memberof -TableView -Where 'samaccountname contain admin'
[2026-01-23 03:48:45] [Formatter] Results from cache. Use 'Clear-Cache' or '-NoCache' to refresh.

samaccountname    memberof
----------------  -------------------------------------------------------------------------------------
adconnectadmin
pawadmin
exchangeadmin     CN=Organization Management,OU=Microsoft Exchange Security Groups,DC=techcorp,DC=local
helpdeskadmin
mgmtadmin
Administrator     CN=Group Policy Creator Owners,CN=Users,DC=us,DC=techcorp,DC=local
                  CN=Domain Admins,CN=Users,DC=us,DC=techcorp,DC=local
                  CN=Administrators,CN=Builtin,DC=us,DC=techcorp,DC=local

無いものある-Recurse無

-Recurseできません。

╭─LDAPS─[US-DC.us.techcorp.local]─[US\studentuserXXX]-[NS:192.168.1.2] [CACHED]
╰─PV ❯ Get-DomainGroupMember -Identity "Domain Admins" -Recurse
Unrecognized argument: -Recurse
╭─LDAPS─[US-DC.us.techcorp.local]─[US\studentuserXXX]-[NS:192.168.1.2] [CACHED]
╰─PV ❯ 

--relay???

--relayというcoerceでのリレーを受け取る機能があるらしい。
要チェック->https://github.com/aniqfakhrul/powerview.py?tab=readme-ov-file#:~:text=to/local/file%27-,Relay%20mode,-powerview%2010.10.10.10%20%2D%2Drelay

--obfuscate???

--obfuscateというLDAP難読化オプションも???
要チェック->https://github.com/aniqfakhrul/powerview.py#obfuscation
何だか問題はありそうだが、使える時もあるかもしれない。

????

個人的に一番大事なFind-InterestingDomainAclはありません!!!!残念!!!

webuiがあります!

webuiで操作できる。—webを付けて接続

$ powerview us.techcorp.local/studentuserXXX:'nfd3ZWEsCzrA6H8S'@192.168.1.2 --web
Logging directory is set to /home/kali/.powerview/logs/us-studentuserXXX-192.168.1.2
[2026-01-23 04:01:53] Powerview web listening on 127.0.0.1:5000
╭─LDAPS─[US-DC.us.techcorp.local]─[US\studentuserXXX]-[NS:192.168.1.2] [WEB]
╰─PV ❯ 

127.0.0.1:5000にアクセスすると

powerview.pyのwebuiホーム

おぉ、ADExplorer的な感じで確認できる。

よくチェックするような設定が一目で分かるDashboardがある。

webuiのdashboard



Usersの画面では、ボタン一つでユーザ追加や権限があれば青い鍵のマークを押すとパスワード変更できる。凄くね?

webui-users



Computersではボタン一つで、コンピュータアカウント追加、SMB接続、起動再起動まで。

webui-computers



Utilには、ありがたいSID Convert機能が。

webui-util

オフラインでもwebuiを使えるようにするチューニング

この面白いwebui、jsとかcssとかオンラインで拾ってくる使用のため、インターネット繋がらない環境だと使えない。
じゃあ、オフラインでも使えるようにダウンロードしておこう。

git clone

git clone https://github.com/aniqfakhrul/powerview.py.git
cd powerview.py

必要ファイルのダウンロード

# 静的ファイル配置先
mkdir -p powerview/web/front-end/static/vendor

# Tailwind CSS (ビルド済みスタンドアロン版)
curl -L -o powerview/web/front-end/static/vendor/tailwind.min.js "https://cdn.tailwindcss.com/3.4.1"

# Alpine.js
curl -o powerview/web/front-end/static/vendor/alpine.min.js "https://cdn.jsdelivr.net/npm/alpinejs@3.14.9/dist/cdn.min.js"
curl -o powerview/web/front-end/static/vendor/alpine-focus.min.js "https://cdn.jsdelivr.net/npm/@alpinejs/focus@3.14.9/dist/cdn.min.js"
curl -o powerview/web/front-end/static/vendor/alpine-collapse.min.js "https://cdn.jsdelivr.net/npm/@alpinejs/collapse@3.14.9/dist/cdn.min.js"
curl -o powerview/web/front-end/static/vendor/alpine-mask.min.js "https://cdn.jsdelivr.net/npm/@alpinejs/mask@3.14.9/dist/cdn.min.js"

# Font Awesome (CSS版)
curl -o powerview/web/front-end/static/vendor/fontawesome.min.css "https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css"

# Font Awesomeのwebfonts
mkdir -p powerview/web/front-end/static/webfonts
curl -o powerview/web/front-end/static/webfonts/fa-solid-900.woff2 "https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/webfonts/fa-solid-900.woff2"
curl -o powerview/web/front-end/static/webfonts/fa-regular-400.woff2 "https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/webfonts/fa-regular-400.woff2"
curl -o powerview/web/front-end/static/webfonts/fa-brands-400.woff2 "https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/webfonts/fa-brands-400.woff2"

# ttfファイル
curl -o powerview/web/front-end/static/webfonts/fa-solid-900.ttf "https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/webfonts/fa-solid-900.ttf"
curl -o powerview/web/front-end/static/webfonts/fa-regular-400.ttf "https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/webfonts/fa-regular-400.ttf"
curl -o powerview/web/front-end/static/webfonts/fa-brands-400.ttf "https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/webfonts/fa-brands-400.ttf"

絶対パスに置き換え

sed -i 's|../webfonts/|/static/webfonts/|g' powerview/web/front-end/static/vendor/fontawesome.min.css

headerの書き換え

$ cat powerview/web/front-end/templates/base/header.html
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{ title or 'PowerView.py' }}</title>
<link rel="apple-touch-icon" sizes="180x180" href="{{ url_for('static', filename='images/apple-touch-icon.png') }}">
<link rel="icon" type="image/png" sizes="32x32" href="{{ url_for('static', filename='images/favicon-32x32.png') }}">
<link rel="icon" type="image/png" sizes="16x16" href="{{ url_for('static', filename='images/favicon-16x16.png') }}">
<link rel="manifest" href="{{ url_for('static', filename='site.webmanifest') }}">

<script src="{{ url_for('static', filename='js/main.js') }}"></script>
<script src="{{ url_for('static', filename='js/static.js') }}"></script>
<script src="{{ url_for('static', filename='js/icon.js') }}"></script>
<link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}">

<!-- local version -->
<script src="{{ url_for('static', filename='vendor/tailwind.min.js') }}"></script>
<link rel="stylesheet" href="{{ url_for('static', filename='vendor/fontawesome.min.css') }}">

<!-- Alpine Plugins (local) -->
<script defer src="{{ url_for('static', filename='vendor/alpine-focus.min.js') }}"></script>
<script defer src="{{ url_for('static', filename='vendor/alpine-collapse.min.js') }}"></script>
<script defer src="{{ url_for('static', filename='vendor/alpine-mask.min.js') }}"></script>

<!-- Alpine Core (local) -->
<script defer src="{{ url_for('static', filename='vendor/alpine.min.js') }}"></script>

pipxでインストール

$ pipx install .                                                                 
  installed package powerview 2025.1.8, installed using Python 3.13.9
  These apps are now globally available
    - powerview
done! ✨ 🌟 ✨

これで動きまっせ

ローカルで動くようにしたwebui

GUIよりもCLIが良いという気持ちは分かるが、GUIの方が気持ちいい時だってある

powerview.pyの一番いいところは、powershell無くても使えるようになったところ。

しかし、webuiが使いたくなる時だってあるんです。