
TryHackMe.comのSteel Mountainボックスに関するwrite upとCVE-2014-6287のエクスプロイト
TryHackMe.comのSteel Mountainボックスの攻略記とCVE-2014-6287のエクスプロイト
私はこの脆弱性の原本の発見および悪用に対して一切の功績を主張しません。以下の方々に感謝します!
発見: Daniele Linguaglossa
Metasploitモジュール作成者: Muhamad Fadzil Ramli
TryHackMeルームと作者: https://tryhackme.com/room/steelmountain https://tryhackme.com/p/tryhackme
参考文献: https://nvd.nist.gov/vuln/detail/CVE-2014-6287 https://github.com/rapid7/metasploit-framework/blob/master/modules/exploits/windows/http/rejetto_hfs_exec.rb https://subscription.packtpub.com/book/networking_and_servers/9781786463166/1/ch01lvl1sec20/vulnerability-analysis-of-hfs-2-3 https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-6287 https://www.tutorialspoint.com/pascal/pascal_functions.htm
私は決して熟練したセキュリティ専門家ではありません。そのため、誤った情報を提供する可能性があります。もし熟練した専門家/経験豊富な研究者で、誤った情報を見つけた場合は、私に知らせてください。そうすれば、戻ってきて何を間違えたのかを勉強し、正しい情報を提供できます。これは私自身と、この攻略記に出くわすかもしれない他の初心者研究者にとって有益です。もし私が書いた悪い情報を見つけた場合は、[email protected]までご連絡ください。修正します。ありがとうございます!
Rejettoファイルサーバー(HFSとも呼ばれる)は、ネットワーク上でファイルを公開・共有するためのファイル共有プログラムです。バージョン2.3では、CVE-2014-6287で説明されているように、攻撃者が検索パラメータにヌルバイトを入力することでシステムコマンドを実行できる脆弱性がありました。コードはその正規表現構成でヌルバイトを適切に処理できず、その結果、リモートコード実行の脆弱性につながります。
この脆弱性は、parserLib.pasファイルに由来するfindMacroMarker関数に存在します。.pasはPascalプログラミング言語のファイル拡張子です。これを書いている時点で、私はPascalで何かをコーディングしたことはありません。コードスニペットを見て、その動作を分析してみましょう。
function findMacroMarker(s:string; ofs:integer=1):integer;
begin result:=reMatch(s, '{[.:]|[.:]}||', 'm!', ofs) end;
コードの最初の行は、findMacroMarkerという関数の宣言で、2つのパラメータを取ります。Pascalでは、パラメータのデータ型を宣言する必要があるため、s:stringは変数sがstring型であることを意味し、変数ofsも同様にintegerデータ型です。パラメータの右側には、コロン文字の後にintegerが見えます。これは関数の型として知られています。セミコロンはそのコード行の終わりを示します。次のコード行の最初の単語はbeginです。これはコンパイラに関数の開始位置を示します。次に、resultという変数に代入演算子:=が続きます。result変数はreMatch関数に代入されます。インターネット上でreMatchについて何も見つからなかったので、HFSのどこかで書かれたカスタム関数だと推測します。幸いなことに、この関数は一目で意味が分かります。reMatchは明らかに正規表現マッチの略であり、その後にreMatch関数のパラメータと、最初のコード行で定義された初期変数パラメータで考慮される正規表現パターンが続きます。2行目の最後の単語は、コンパイラに対して関数の終了を定義するために使用されます。
脆弱性は、上記のreMatch関数で説明した正規表現パターンにあります。正規表現はヌルバイト%00を適切に処理できません。ヌルバイトを先頭に付けたシステムコマンドを渡すと、関数はバグに遭遇し、ホストコンピュータ上でコマンドを実行します。この脆弱性を悪用するには、以下のようにURLのGETリクエストの検索パラメータにヌルバイトと{.exec|code.}(codeは実行したいコマンド)を渡すだけです。
http://(IPアドレス/ドメイン名)/?search==%00{.exec|コマンドここに.}
まず、rustscanでポートスキャンを実行しましょう。攻撃対象を素早く把握するためにrustscanを使用します。

かなりの数のオープンポートがあります。ここでnmapを使ってさらに深く調査し、どのサービスがこのポート群でリッスンしているかを調べ、悪用可能なサービスを見つけます。

上位ポートではMicrosoft Windows RPCというサービスが実行されています。RPCはリモートプロシージャコールです。これにより、Windowsプロセスはネットワーク経由またはコンピュータ内部で通信できます。次に、ポート80と8080で異なるいくつかのウェブサーバーが実行されています。ポート5985と47001ではMicrosoft Httpapi Httpdが存在し、アプリケーションがMicrosoft IIS(インターネットインフォメーションサービス)を必要とせずにHTTP経由で通信できるようにします。Nmapはポート3389でウェブサーバーの可能性を検出しましたが、HTTPまたはSSLで接続できませんでした。HTTPプロトコルの標準ポートであるポート80のウェブサーバーに接続しましょう。

ポート80では、スチールマウンテン社のロゴと「今月の社員」とラベル付けされた写真が表示されるウェブページが表示されます。ウェブ開発ツールを開くと、写真が「BillHarper.png」とラベル付けされていることがわかり、最初の質問の答えが得られます。他のリスニングサービスに接続して、何が見つかるか見てみましょう。

ポート5985のサービスに接続すると、HTTPエラーコード404が表示されます。404エラーコードは、サーバーが要求されたリソースを見つけられないことを意味します。ここには興味深いものは何もありません。次に進みましょう。

はい!これは面白そうです。ポート8080には、何らかのファイル共有サービスがあります。このサービスについて詳しく調べてみましょう。左下隅に、名前とバージョン番号のように見えるものがあります。HttpFileServer 2.3です。さらに詳しく調べます。

HttpFileServer 2.3とラベル付けされたリンクをクリックすると、ポート8080で実行されているソフトウェアの名前のウェブページに移動します。この場合、Rejetto HFS HTTP File Serverです。ポート47001の他のポートも確認して、すべての状況を把握しましょう。有用なものが見つからなければ、Rejettoに戻って既知のCVEを探し始めます。

ポート47001でも404のようです。Rejetto HFS 2.3のCVEを探し始めましょう。

簡単な検索で、HFS 2.3に既知のCVEリストがあることがわかりました。THMガイドから離れ、処方箋のMetasploitを使用しないことにします。シェルを提供するエクスプロイトをコード化しました。使用するには、revshells.comにアクセスし、適切なネットワーク情報を入力して、PowerShell #3 (Base 64)を選択します。ペイロードを取得したら、それを13行目のペイロード変数にコピー&ペーストし、エクスプロイトを実行します。リスナーが自動的に開き、システムにアクセスできるはずです。注:シェルをキャッチするために、エクスプロイトを複数回実行する必要がある場合があります。

ドーン!システムに侵入できました。おまけにPowerShellシェルを入手できました。これは、.NETコマンドレットにアクセスできることを意味します。標準のコマンドプロンプトシェルよりもはるかに危険です。権限昇格に進みましょう。THMガイドは、PowerSploitと呼ばれる便利なツールを提供しています。これには、潜在的な権限昇格ベクトルを列挙するツールが含まれています。マシンにPowerUp.ps1をドロップし、それを使用してマシンの制御を獲得します。

まず、自システム上のPowerUp.ps1ファイルがあるディレクトリで簡単なHTTPサーバーを起動します。次に、ターゲットシステムでInvoke-Webrequestコマンドレットを使用して、サーバーからターゲットマシンにファイルをプルします。ここで、PowerUpに付属するコマンドレットの1つをインストールして実行します。

PowerUp.ps1をインストールするには、次のコマンドを実行します:. .\PowerUp.ps1。次に、新しいコマンドレットInvoke-AllChecksを使用します。実行後、大量の出力が表示されます。重要なものだけに絞りました。PowerUpがファイルを変更する権限があることを教えてくれていることがわかります。実行中のサービスを確認して、実行中であれば停止できるようにします。サービスが使用中である場合、ファイルに対して何もできないため、これを行う必要があります。

Get-Serviceコマンドレットを使用すると、マシン上に存在するサービスのリストが表示されます。ターゲットサービスが実行中であるため、バイナリを変更および上書きできるように停止する必要があります。

サービスを停止するには、Stop-Serviceコマンドレットの後にサービス名を指定して使用します。ここで、Get-Serviceコマンドレットを使用してサービスが停止したことを再確認する必要があります。上記のように、サービスが確かに停止したことを確認できます。ターゲットバイナリが含まれるディレクトリに移動しましょう。ディレクトリはC:\Program Files (x86)\IObit\Advanced SystemCareです。

最右列のバイナリ名の左側にあるバイナリのファイルサイズに注意してください。

meterpreterペイロードを作成し、以前と同じようにPythonウェブサーバーモジュールでホストします。

ペイロードの作成に使用した同じネットワーク情報を使用して、meterpreterリスナーを起動します。

Invoke-Webrequestコマンドレットを使用して、自マシンからターゲットシステムにmeterpreterペイロードをプルします。必ずASCService.exeという名前にして、弱いファイル権限を悪用し、通常のバイナリを悪意のあるバイナリで上書きできるようにします。

ディレクトリをリストしてファイルサイズが変更されたかどうかを確認することにより、バイナリが上書きされたことを確認します。この場合、6桁の数字から5桁の数字に変更されており、悪意のあるバイナリが正常にアップロードされたことが確認できます!

悪意のあるバイナリが通常のバイナリを置き換えたら、Start-Serviceコマンドレットでサービスを再起動するだけです。そうすると、マシンはペイロードを実行し、meterpreterシェルを提供します!meterpreterでgetuidを実行して、NT AUTHORITY/SYSTEMを持っているか確認できます。getuidを実行すると、確かにこのマシンを所有していることがわかります!素敵な一日を!
end