Snoozy

1.Sleep-inducing; tedious.

VulnHubのFristiLeaks: 1.3をやってみたよ~!

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

https://www.vulnhub.com/entry/fristileaks-13,133/

 

まずはホストのスキャン。f:id:snoozekvn:20190610235302p:plain

アドレスが分かったらnmapでサービスをスキャン。

f:id:snoozekvn:20190610235304p:plain

80番ポートが開いてるのでアクセスしてみる。

f:id:snoozekvn:20190611000203p:plain

ふむ。ソースには有意な情報は含まれておらず。

dirbで隠しオブジェクトを探索。

f:id:snoozekvn:20190610235307p:plain

順に確認していくと、robots.txtでなにか見つかる。

f:id:snoozekvn:20190610235312p:plain

アドレスの/robots.txtを/cola,/sisi,/beerに置き換えてアクセスしてみると、次の画像が表示される。方向性は間違ってないようだ。

f:id:snoozekvn:20190611001132p:plain

ここでつまった。他の方のwriteupを見させていただくと、なるほど。/fristでアクセスできるようだ。192.168.10.109/fristとしてさっそくアクセスしてみる。

f:id:snoozekvn:20190610235316p:plain

よしよし、一歩前進だ。

さて、適当な値を入れてログインしようとしても当然弾かれる。

う~ん総当たりでいくかと考えたところで、ソースにヒントがあった。

f:id:snoozekvn:20190611001752p:plain

f:id:snoozekvn:20190610235221p:plain

どうやらbase64エンコードされた文字列らしい。

f:id:snoozekvn:20190611002048p:plain

デコードしてみる。pngらしいのでファイル名を変えて見てみる。
f:id:snoozekvn:20190610235226p:plain

ふむ、たぶんパスワードだろうということで、いくつか前の画像に出ていたユーザー名っぽいeezeepzと合わせてログインを試してみる。

f:id:snoozekvn:20190610235231p:plain

う~ん、素晴らしい!

さて、ファイルのアップロードができるようだ。phpが動いていることはアドレスから判別できるので、reverseshellを張るphpコードを用意し、アップロードしてみる。

f:id:snoozekvn:20190610235234p:plain

…ということらしい。

ためしにコードの拡張子をhoge.php.pngというふうにしてアップロードしてみる。

f:id:snoozekvn:20190611003252p:plainこれはこれは、都合がいいですなぁ!

kali側で事前にnetcatで待ち受けておくことに留意しつつ、いくつかアップロードされてるであろうアドレスにアクセスしてみる。

f:id:snoozekvn:20190611003255p:plainf:id:snoozekvn:20190611003258p:plain

よしよし、これでshellがとれた。侵入成功というわけだ。

ここからは、定石通り、flagへのアクセスを目指しroot権限への昇格を試みる。

システム情報やファイル構成を確認していく。

 

home/admin/の中身。気になったものをいくつか確認してみた。

出力結果によると、暗号化された文章が含まれるテキストファイル2つと、暗号化に使ったPythonコードが記述されているとみられるファイルが見つかった。f:id:snoozekvn:20190610235241p:plain暗号アルゴリズムがわかっているのなら話は早い。逆演算を行ってデコードを行ってみる。

以下はそのコード。エンコードアルゴリズムは、まず与えられた文字列をbase64変換した後、得られた文字列にROT13をかけ、反転させている。ので、デコード部分ではこれの逆を行えばよい。f:id:snoozekvn:20190610235245p:plain

さて、次がデコードされた文字列だ。f:id:snoozekvn:20190610235249p:plainで、問題はこの文字列をどこで使うのかということだ。

home/eezeepz/内にあるnotes.txtにそのヒントがあった。f:id:snoozekvn:20190610235252p:plainJerryからのメッセージによるとPrivileges accountで実行されるコマンドを、一般ユーザが叩けるらしい???ということかな?

イマイチどういうことかわからず、再度ファイル探索をしてみる。

ユーザー一覧は以下のようになっていた。

f:id:snoozekvn:20190611010851p:plain

またfristigodというディレクトリがPermission deniedされる。ここにアクセスできれば進展がありそうだ。

ここで手が止まった。

これまでの結果をまとめてみる。

暗号化された文字列を含んだファイルがあり、そこから2つの文字列を解読することに成功している。

さらに、home/配下にはadmin,eezeepzという2つのディレクトリが存在する。

…ということは先の文字列を使ってadminやeezeepzにユーザーをスイッチできるのではないかと考え、実際にやってみた。

f:id:snoozekvn:20190611011656p:plain

OK!たしかにスイッチできた。しかしながらこのアカウントではfristigodディレクトリにはアクセスできなかった。

また、ためしにこのユーザに割り当てられているsudo権限で実行可能なコマンドを、sudo -lで確認してみたが特に割当られてなかった。

つぎに、eezeepzにスイッチしてみた。admin同様有意な情報は得られなかった。

fristiは、解読した2つの文字列では切り替えすらできなかった。

最後のfristigodがあたりだった。

f:id:snoozekvn:20190611012535p:plain

sudo -lの出力結果によると、fristigodでdoComというコマンドが実行できるかもということらしい。

f:id:snoozekvn:20190611013234p:plain

なるほど、mayがつくわけだ…いくつかユーザーを変えて試してみたが実行できない。

ここでまた手が止まった。

一つ上の階層にある.bash_historyにヒントがあった。

f:id:snoozekvn:20190610235254p:plain

色が反転しているところに注目していただきたい。

どうやらfristigodではなくfristiで実行するらしい。実際にidつきのコマンドを試してみたところ、このコマンドはroot権限で実行されるらしい。

そうと分かればbashを開かせるのみ!

f:id:snoozekvn:20190610235258p:plain

 

 

疲れた…日本語であんまりこの手のwriteupがないわけだ…

Thanks to Ar0xA!! for this CTF!

int3でデバッガー検出

eagle0wl氏のcrackmeでバイナリ解析を学んでいます。 解析対象内にint3命令でデバッガーを検知するコードを確認しました。興味深い手法のように思いましたので、実際にどういう方法で行われているのか検証してみることにしました。

#include <stdio.h>

using namespace std;

class some_exception
{
    private:
        const char *msg;
    public:
        some_exception(const char *msg) : msg(msg) {}
        const char *what() { return msg; }
};

int main() {
    int isDebug = 1;

    try {
        asm volatile("int3");
    }
    catch (some_exception) {
        isDebug = 0;
    }

    if (isDebug) {
        printf("Debuger detected!\n");
        return 0;
    }

    printf("flag{Conglatulation!}");
    return 0;
}

このような処理だと考えました。 このコードを書くにあたって、まずデバッガーについて次の前提知識が必要でした。 デバッガーでコードをトレース中、デバッガーはint3やint1命令を通過するとき例外処理を基本的にしないというものです。今回のデバッガー検知もこれを利用したものです。

順に見ていきましょう。 tryの中にint3をおくことで、必ず例外が発生するようにしています。例外発生後、catch内でisDebugに0を格納します。if文は非のためprintfは実行されず、flagが表示されプログラムは終了します。 次いでデバッガーを検知する仕組みです。 まず前述したデバッガーの性質により、デバッガーがアタッチ中のプログラムでは例外処理がされません。これにより、isDebugは1のままとなりif文内が実行されます。 以上の方法により、このコードが挿入されたプログラムは自身がデバッガーによってトレースされているかどうかを検知します。

なかなか面白い手法でしたので共有いたしました。 間違いや勘違いなどがありましたら指摘のほどよろしくお願いいたします。