Snoozy

1.Sleep-inducing; tedious.

VulnHubでBrainpan: 1をやってみたよ~!

VulnHubでBrainpan: 1をやってみたよ~!ということでやっていく。

https://www.vulnhub.com/entry/brainpan-1,51/

 

まずはいつもどおりアドレスをゲットするところから始める。

f:id:snoozekvn:20190615170028p:plain

次はポートスキャン。

9999番ポートでabyssなるもの、10000番ポートでhttpサーバーが可動している模様。

まずはブラウザからhttpにアクセス。

f:id:snoozekvn:20190615170656p:plain

う~ん、ヒントはなさそう。

f:id:snoozekvn:20190615170209p:plain

9999番ポートで稼働中のabyssなるものはざっと検索してみたところWebサーバーぽい。netcatでアクセスしてみる。

f:id:snoozekvn:20190615174101p:plain

何やらバナーが表示されパスワードの入力を求められた。

適当な文字列を入力してみても当然弾かれる。

う~ん。

dirbでもう少し10000番ポートを探索してみることにする。

f:id:snoozekvn:20190615170026p:plain

/binがあるらしいのでアクセスしてみる。

f:id:snoozekvn:20190615171002p:plain

ダウンロードして中身をざっと見てみる。

f:id:snoozekvn:20190615171250p:plain

これは9999番ポートで出力されたバナーと全く同じ…

さらに含まれている文字列を見てみる。

f:id:snoozekvn:20190615171247p:plain

文字列比較やネットワーク系の命令が見えるなぁ。

Windows Emulatorことwineを使って実行してみる。

f:id:snoozekvn:20190615171005p:plain

9999番ポートにバインドしている…やっぱりBrainpanVMの9999番ポートで稼働中のものと同じものっぽい。

 

netcatで自分自身の9999番ポートに接続してみる。

f:id:snoozekvn:20190615170958p:plain

パスワードの入力を求められているので適当な文字を入力。当然ACCESS DENIED…残念。

と思いきや次のような出力がされていた。

f:id:snoozekvn:20190615171729p:plain

これはBOF攻撃ができるのか…?

Pythonでシンプルなファザーを書いてファジングしてみる。

ファジングに使ったコードは以下。

f:id:snoozekvn:20190615183357p:plain

すると次のように出力された。

f:id:snoozekvn:20190615171733p:plain

702bytesコピーしたところでオーバーフローしたとのこと。

ということは、オーバーフローしたポイントが502~702bytesにあるということだ。

具体的に何byte目でオーバーフローするのかさらに調査する。

文字列中の3bytes特定できれば、それが文字列中のどの部分なのかが一意に特定できる文字列を、次のコマンドで出力する。

f:id:snoozekvn:20190615173105p:plain

さてこの文字列をbrainpan.exeに流し込む。

書いたコードは以下。

f:id:snoozekvn:20190615183442p:plain

結果は次のようになった。

f:id:snoozekvn:20190615172353p:plain

アドレス0x35724134にアクセスしようとしてエラーを起こしている。

0x35724134をascii変換すると5rA4で、このことからバッファーの大きさは先程用意した文字列の先頭からちょうど5rA4までだとわかる。

では次のようにしてその長さを求めてみよう。

f:id:snoozekvn:20190615172356p:plain

バッファーの大きさは524bytesだと判明した。

さて、ここからどうするのかだが…

BOF攻撃を使ってKaliへリモートシェルを張らせるようなコマンドを実行させることができれば、BrainpanVMのシェルが取れそうだ。

msfvenomを使ってリバースシェルを張らせるペイロードを作成する。

f:id:snoozekvn:20190615175756p:plain

ペイロードを含んだコードを作成して、

f:id:snoozekvn:20190615183532p:plain

ncでリバースシェルを待ち受け後、実行!

すると次のような出力が得られた。f:id:snoozekvn:20190615180548p:plain

たぶんこれをBrainpanVMの9999ポートに試せば、シェルが得られるんだと思う。

ペイロードを書き込んだファイルのアドレスをBrainpanVMのアドレスに書き換えて実行してみる。ncで待ち受けるのを忘れないように!
f:id:snoozekvn:20190615180822p:plain

素晴らしい!シェルが得られているようだ。

さっそく内部を調査する。

シェルを操作していると変な挙動を示す。bashのつもりで動かすとうまくいかない。

多分いま操作しているのはwindowsのシェルであってbashではないからだろう。

f:id:snoozekvn:20190615180825p:plain

動かしづらいと思っていたら矢先に/bin/bashを見つけた。

ただbashが使えるのは使えるのだがいちいち直接bashを指定してやらねばならず、不便この上ない。

リバースシェルを貼らせてみる。

f:id:snoozekvn:20190615180818p:plain

f:id:snoozekvn:20190615182202p:plain

うまくいったようだ。いつもどおりのbashの要領で操作ができる。

さておもむろに、root権限で実行可能なファイルを調べて見ると、あるではないか!f:id:snoozekvn:20190615182205p:plain

これを使ってrootへの昇格をねらう。

このanansi_utlはいくつかのコマンドを実行できるようだ。試しにmanualコマンドを実行してみよう。

f:id:snoozekvn:20190615185953p:plain

これによるとanansi_utl manualは引数に与えられたコマンドのmanページを表示するものらしい。
これは怪しい。

以下のページにあるように、vimやmanなどはその中でさらにコマンドを実行可能だということが知られている。

https://www.hackingarticles.in/linux-privilege-escalation-using-exploiting-sudo-rights/

これを利用すればroot権限を引き継いだshを呼び出すことが可能だろう。

f:id:snoozekvn:20190615182200p:plain

よし!

f:id:snoozekvn:20190615182213p:plain

やったね!

Thanks to superkojiman for this CTF!

 

あとから気づいたんだけど画像が全部透けててぜんぜんやったねじゃないじゃん…