Snoozy

1.Sleep-inducing; tedious.

VulnHubのIMF: 1をやってみたよ~!

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

 

まずはnetdiscoverでIMF VMのアドレスを取得。

f:id:snoozekvn:20190620194718p:plain

アドレスが分かったら次はNmapでポートスキャン。

f:id:snoozekvn:20190620194721p:plain

80番ポートでApacheが動いていることがわかる。

アクセスしてみた結果が次の画像。

f:id:snoozekvn:20190620194714p:plain

かっこいいページだがここにはヒントはなさそう。

違うページをあさっているとcontactページのソースにフラッグを発見した。

ざっとみてスルーしてしまいそうだったが、なんとなくブラウザのページ内検索を試したら見つかった。あぶないあぶない。

f:id:snoozekvn:20190620195312p:plain

 

さて、他に隠されたページはないかdirbを使って辞書ベースのページ探索をしてみる。

f:id:snoozekvn:20190620195316p:plain

特になさそうだ。

niktoでサイトに脆弱性がないか試してみる。

f:id:snoozekvn:20190620195319p:plain

 

うむ…とくになさそう。

早くもどうしようかとウロウロしていると先程見つけたフラッグの中身がBase64エンコードされた文字列であることに気づいた。

さっそくデコードしてみる。

f:id:snoozekvn:20190620195940p:plain

ふむふむ?

ファイルが関係する…のか?

これまでのところファイルが見えるのはページのソースだけなので再度チェックしてみる。

サイトのソースをくまなく見ていくと次の画像の部分でそれをみつけた。

ファイル名がBase64エンコードされている。

f:id:snoozekvn:20190620200613p:plain

3つの文字列をつなげてからデコードしてみる。

f:id:snoozekvn:20190620200650p:plain

フラッグゲット!

f:id:snoozekvn:20190620200654p:plain
が、またしてもエンコードされているのでデコードする。

f:id:snoozekvn:20190620201105p:plain

どういうことだろう・・・?

ページ名か…?

f:id:snoozekvn:20190620200848p:plain

おお、合ってた。

ログインページさんこんにちは。

適当に試してももちろんログインできないのでソースを見てみる。

f:id:snoozekvn:20190620201453p:plain

ソースにRogerというユーザー名が見つかった。

これをつかって何度かログインを試してみたうまく行かず。

contactページでいくつかメールアドレスやユーザー名が見つかっていたので、それらをもとにcewlを使って簡単なワードリストを作る。

f:id:snoozekvn:20190620200845p:plain

ワードリストにRogerも追加して…

Burpsuiteでユーザー名とパスワードを格納するパラメータも入手し、準備は万端。

hydraでブルートフォースアタック!

 

が…うまくいかない…

ログイン可能な組み合わせは見つからなかった。

脆弱性を使うのかと、Apache2.4.18の脆弱性について調べて回ったが利用できそうなものは見あたらない。

裏でphpが動いていることはわかっているのでphpのlogin処理をbypassする方向で調べを進めたがこれもうまくいかない。

sqlインジェクション脆弱性があるのかとあれこれ試してみたがこれもだめ。

ただユーザー名がrmichaelsであることはレスポンスから判別することができた。

結局writeupを見た。

burpsuiteを使ってパスワードを受け取る変数をpass=をpass[]=にしてやるとうまくいくということだ。

そのレスポンスとして次のページが帰ってきた。

f:id:snoozekvn:20190620201342p:plain

フラッグの文字列をデコードしたのが次の画像。

f:id:snoozekvn:20190620200916p:plain

またリンクをクリックすると次のページに飛んだ。

f:id:snoozekvn:20190620201335p:plain

 URLをよく見ると引数を受け取っていることがわかる。

これは脆弱性がありそうだ。

試しにクォーテーションだけを与えてやるとさっそくエラーが出た。

f:id:snoozekvn:20190620211729p:plain

sqlmapでmysqlを攻撃可能か調べる。

f:id:snoozekvn:20190620211733p:plain

脆弱性があるといろいろ表示されるので試しに次の画像のコマンドでテーブルを表示する。

f:id:snoozekvn:20190620211726p:plain

 

 得られたテーブルで特に気になったのが次の画像だ。f:id:snoozekvn:20190620212028p:plain

ページ名とおぼしき文字列が得られている。

アクセスしてみる。

f:id:snoozekvn:20190620212031p:plain

ふーむ、画像にQRコードが含まれていることがわかる。

https://zxing.org/w/decode.jspx

このサイトでQRコードを読み取るとフラグが得られた。

f:id:snoozekvn:20190620212023p:plain

デコードしてみる。

f:id:snoozekvn:20190620213016p:plain

まーたページ名かな?

アクセスしてみる。

f:id:snoozekvn:20190620213018p:plain

アップロードフォームだ。

リモートシェルを返すスクリプトphpで書いてアップロードしてみる。

が、phpファイルはアップロードを許可されていなかった。

拡張子だけをみて判定していると考え、先程のファイルの拡張子をjpgに変えて再度アップロードする。

すると今度はeval関数が含まれているため許可されないとレスポンスが帰ってきた。

f:id:snoozekvn:20190620214001p:plain

 

結局私はGIFファイルシグネチャーをヘッダーに付与した非常に簡素なWebシェルをアップロードすることでこのWAFを回避した。

次の画像が実際にアップロードに使用したgifファイルだ。

f:id:snoozekvn:20190620215542p:plain

このファイルを呼び出すことができれば引数に与えたコマンドを実行できる。

 uploadディレクトリ配下に格納されると考えいくつか適当なURLにアクセスしたがページが見つからないとレスポンスが帰ってくる。

ディレクト構造に調べたりと散々苦労したあと、アップロードフォームのソースに次の文字列を発見した。
f:id:snoozekvn:20190620213012p:plain

緑色にコメントアウトされているのがその文字列である。

私は最初、この文字列が何を意味するのかわからなかった。

何度かファイルをアップロードし直したりする中で、この文字列が変化していることに気づいた。

おそらくこれがアップロード後のファイル名なのではないか?

ファイル名がハッシュ値のような形に変換されているのではないかと考えた。

実際にURLのファイル名を、この16進数表記された文字列に変えてアクセスして見るとコマンドの結果が表示された。

f:id:snoozekvn:20190620214347p:plain

lsコマンドを渡すと、フラッグが同ディレクトリ内にあることがわかったのでcatで表示させたのが次の画像。

f:id:snoozekvn:20190620214345p:plain

デコードすると次のような文字列を得られた。

f:id:snoozekvn:20190620220504p:plain

 

ここまでたどり着くのにかなりの時間を要した。

 

無事フラグも回収できたので、気を取り直して次のステップに進もう。

Webシェルの引数にwgetコマンドを与え、Kaliに置いてあるリバースシェルを張るスクリプトをダウンロードさせる。

f:id:snoozekvn:20190620220507p:plain

 次に、URL上でスクリプトを指定して実行させると、無事シェルが得られた。

シェルが得られたら次にすべきことは権限昇格だ。

PoCを使ってカーネルエクスプロイトを狙いたいがおそらくこれまでの流れから察するにうまくいかない。

先のフラッグで得られたagentservicesというヒントを使っていきたい。

netstatで裏でどんなサーバーサービスが待ち受けているのかを表示したのが次の画像。

f:id:snoozekvn:20190620220837p:plain

7788番ポートでLISTENがある。

IMF VM上でからアクセスしてみる。

f:id:snoozekvn:20190620220834p:plain

Agetn IDを求めるプログラムが動いていた。

明らかにこのプログラムが次の攻略対象だと思われる。

 

また/usr/local/binにこのagentプログラムとaccess_codesというファイルを見つけた。

f:id:snoozekvn:20190620220909p:plain

access_codesは何に使うんだろうか…?

とりあえずagentを解析するためにcatで出力し、Base64で表示可能な範囲に変換。

f:id:snoozekvn:20190620222224p:plain

この文字列をKaliにコピペし、デコードすればファイルを実質ダウンロードしたことになる。

f:id:snoozekvn:20190620222233p:plain

 

またIMF VMの方でpsコマンドを実行したところknockdを発見した。

これは予め決めておいた順にポートアクセスされたときに特定ポートを開放するというものだ。

さきほどのaccess_codeはおそらくknockするためのものだろう。

ためしにやってみる。

f:id:snoozekvn:20190620222230p:plain

冒頭のNmapを使ったスキャンでは開いていたなかった7788番ポートにアクセスできるようになっている。

やはりこのagentプログラムを利用して権限昇格を狙うので間違いないだろう。


まずはstringsコマンドで簡単にプログラムに含まれる文字列をチェックする。

f:id:snoozekvn:20190620225805p:plain

agentプログラムは最初にagent IDを求めてくる。

おそらくその部分の処理はstringsで表示された、strncmpで行われていると予想される。

ltraceでライブラリの呼び出しをチェックしてみる。

f:id:snoozekvn:20190620225756p:plain

やはりそうだった。

agent IDは48093572だ。

f:id:snoozekvn:20190620225841p:plain

次の入力で大量の文字列をインプットするとSegmentation faultを起こす。

このことからバッファオーバーフローを利用した攻撃が可能だと考えられる。

まずはバッファからeipを上書きできる場所までのオフセットを求める。

最初に一意な文字列を生成し、

f:id:snoozekvn:20190620225752p:plain

edbをagentにアタッチさせた状態で、先程の文字列をagentにインプットする。

するとedbの方で次のような出力を得る。

f:id:snoozekvn:20190620225748p:plain

eipが上書きされ、不法なアドレスにアクセスしようとした結果エラーが出たわけだ。

この文字列までのオフセットを次のコマンドで求める。

f:id:snoozekvn:20190620225808p:plain

なるほど、バッファからeipを上書きできる部分までのオフセットは168だということだ。

したがってmsfcenomでリバースシェルを張るシェルコードを生成し、

f:id:snoozekvn:20190620225902p:plain

見つけておいたcall eax(番地0x08048563)へと、eipが上書きされるように次のようにすれば権限昇格が狙える。

f:id:snoozekvn:20190620225906p:plain

Netcatで待ち受けて…

f:id:snoozekvn:20190620225913p:plain

よおし!!

 

ここまで長かった…