今日はlevel5を解きます。

今まで通りこの前取得したlevel5のパスワードでログインし、

hintを確認します。

/usr/bin/level5プログラムは/tmpディレクトリにlevel5.tmpという名前の臨時ファイルを

生成すると書かれています。

 

ここで、使える攻撃方法はレースコンディション(Race Condition)です。

今回は競争状態が起きてる状況の中で重要な情報が入ってるファイルの所有を競争

できる状況になります。

早速、/tmpに移動して/usr/bin/level5を実行した後、確認しましたが、

どうやら、できてすぐ削除されるらしいです。

なので、gdbで確認してみました。

(level5権限ではできないため、level6のアカウントでしました。)

これが内容です!

0x180と0x8048580をstackにpushしてcreat関数を呼び出します。

0x180は2進数で00011000000です。

これはlinuxでchmod命令語を利用し権限を付与する体系を適用すると000 110 000 000に

分けれるし分けた結果をみると0600権限を付与することが分かります。

そして、ファイル生成に成功するとmain+88にjumpしwrite関数でファイルに

パスワードを書き込んだ後、閉じてremove関数で削除します。

もし、ファイル生成に失敗した場合”Can not creat a temporary file.\n”を出力し

remove関数で削除します。

 

では、攻撃コードを書きます。

まず、これは/usr/bin/level5をバックグラウンドで10000回繰り返すコードです。

レースコンディションは瞬間的なタイミングを狙うので10000回くらいにしました。

これのファイル名はkougeki.cにしました。

次のコードはシンボリックリンクをかけるコードです。(これも10000回です)

/usr/bin/level5を10000回実行してる時、一瞬出来る臨時ファイルが削除される前にhyunseok.txtファイルにシンボリックリンクをかける作業を繰り返します

いつかは成功するのでしょう。

成功した場合はhyunseok.txtにlevel5.tmpの内容が書き込まれます。

このファイル名はkougeki2.cにしました。

説明が難しいですが、/usr/bin/level5を実行すると

1.ファイルを生成

2.ファイルにパスワードを書き込む

3.ファイルを削除の順です。

私たちが狙ってるタイミングは2番と3番の間です。

 

シンボリックリンクの原本(日本語あってるかな。。)hyunseok.txtファイルを作ります。

内容はどうでもいいです。

その後、gcc -o kougei.c kougekiとgcc -o kougeki2.c kougeki2で

コンパイルして

./kougeki &

./kougeki2

(&を付けないと、すぐシェールを使用することができません。&はバックグラウンドで実行させるコマンド?文字?特殊文字?とりあえずそれです!!)

で実行した後

hyunseok.txtにnext passwordが書かれているのが確認できます!

 

 

 

今日はlevel4を解きます。

まず、前回獲得したlevel4のアカウントでログインし、hintをみます。

誰かが、/etc/xinetd.d/にbackdoorを設置?したとでました。

早速見てみましょう。

確かに、/etc/xinetd.d/の中にbackdoorが見えます。

中身をみると

disableがnoなのでスーパーデモンに制御されます。

そして、level5の権限で/home/level4/tmp/backdoorが実行されます。

そしてポート番号を見ると79番ポートです。

確かに79番のポートがLISTENになっています。

では、上でみた、実行されるデモンのところへ移動してみてみます。

あら。。ないですね。。

では、作りましょう!!

欲しいのはlevel5のパスワードなので簡単にソースコードを作って

gccでコンパイルします!

そして、fingerサービスに接続すると、level5のパスワードが見えます!!

 

今回はちょっと短かったですね。

でも、スーパデモンとデモンについて勉強ができ、またレベルアップしました!

 

 

 

今日はftzlevel3を解きます。

まず、昨日得たlevel3のパスワードでログインし、hintファイルをみると

autodigのソースコードと

more hintsに同時に複数の命令語をしようするには?

文字列で命令語を伝達するには?と書いています。

では、昨日と同じくfind命令語でlevel4のsuidがかかっているファイルを探します。

見つけたので、gdbでみてみます。

cmpでargcが二つか比較して、二つではないとそのまま下に行き、

”Auto Digger~~”と”Usage~~”をstackにpushして出力し、exit関数で終了します。

argcが二つだとmain+69にjumpします。

値をちゃんと入れたとして進めますwwww(一応確認はしました。)

ここではstrcpy(cmd,dig@); 関数です。

dig@とcmdの住所をpushして、strcpy関数を呼び出します。

そしたらdig @になりますね。

次はargv[0]に+4してargv[1]にさせてstackにpushします(8.8.8.8は私が入れた値です。)

そして、cmdのdig@の住所もpushしてstrcat関数を呼び出します。

そしたらdig @8.8.8.8になります。

そして、もう一回”version~~”とcmdの住所をstackにpushして

strcat関数を呼び出します。

その後0xbbcを二回pushしてsetreuid関数を呼び出します。(10進数で3004です)

最後にcmdの住所をpushしてsystem関数を呼び出します。

そしたらlevel5の権限でdig @8.8.8.8 version.bind~~~になります。

これで全体的な分析は終わりましたので本格的に(自分の中では)

攻撃します。

 

linuxでは一列で複数の命令語を実行させるには ; ←これを使用します。

こう入れて実行させてみると?

 

ん。。。level3のパスワードが出ますね。。。。

;←これだけだと8.8.8.8が実行して終わった後、my-passが実行されるので

level3の権限でmy-passが実行されます。(8.8.8.8まではlevel4です。)

では、あの二つの引数を一つの引数として伝達する方法は。。。??

””←これです!!””これを使うと8.8.8.8とmy-passを一つの引数として伝達することが

できます!

では、やってみます。

こうやって実行すると!!

出ました!!

今日はftzlevel2を解きます。

まず、前回で得たlevel2のパスワードでlevel2でログインします。

そして、hintファイルを見てみると、

テキストファイル編集中にシェール命令を実行させると。。。。

これはviの話ですね。

前回と同じくfind命令語でlevel3のSUIDが設定されているやつを探します。

ほぉ。。。

開いてみると!!

viですね!

でも、ファイルの大きさはviより小さいし。。

viとかvimにリンクをかけて使ってるのもないし。。。怪しいですね。

 

こういう時はgdbで開いて中身を見てみましょう!

分析をしてみると、setreuid関数を呼び出す前に0xbbbをstackに2回pushしますね。

0xbbbは10進数で3003です!

これは多分level3のidだと思います。

そして、/bin/viをstackにpushしてsystem関数を呼び出します!

ということは、level3の権限でviを実行するという意味ですね。

これをC言語にすると

int main()

{

   setreuid(3003,3003);

   system("/bin/vi");

}

ん。。。簡単すぎかな。。

では回答は

はい!/usr/bin/editorを実行して

:!my-passを入力すると

パスワードが出力されます!

飛べたらいいな~

ひさしぶりにブログを書きます。

今日からftzのレベル1から最後のレベルまで挑戦します。

まず、レベル1のhintを見るとlevel2権限のsetuidがかかっているファイルを

探してくださいというメッセージがでます。(韓国語ででてます。)

はい。

find命令語で探しました。

見つけたファイルを実行したらlevel2の権限で命令語を一つ実行させてあげます。

ただし、my-passとchmodは除外というメッセージがでます。

一回実行+一つの命令語でlevel2の権限を維持できる命令語は。。?

写真の通りシェール実行命令語を入力するとlevel2の権限が維持できます。

shを入力後idを確認してみると、uidがlevel2になっていることがわかります。

そのままmy-passを入力するとlevel2のパスワードがでます。

簡単です。。。

なのでgdbで開いてもうちょっと分析してみます。

長いです。。。。

関数をcallする前にpush 0xなんちゃらかんちゃら~は

呼び出す関数の引数です。

system関数を呼び出す前に引数/usr/bin/clearをstackにpushしてcallします。

chdir関数を呼び出す前に引数/home/level2をstackにpushしてcallします。

printf関数達も同じです。

なので、見つけ出したファイルを実行すると画面が一度クリアされ

文字列が出力されます。(chdirでlevel2のディレクトリに移動します。)

次はfgets関数がでます。breakをかけてみてみます。

fgetsをcallする前にpushされてる奴らを見てみると

0x8049948はstdin、0x1eは10進数で30、ebp-40は配列なのが分かります(アスキーコード表を見るとchmodが入ってます。私が入力しました!)

つまりfget(buff、30、stdin);ということです。

fgets(buff、sizeof(buff)、stdin);これがもっといいですね。

つぎは、

eaxにユーザーから入力された住所を入れてstackにpush

0x804879もstackにpush(確認したらmy-passが入ってました。)

そしてstrstr関数を呼び出して比較します。

比較して同じだったら、エラーをだしてexit関数を利用し、プログラムを終了します。

同じじゃなかったら、main+201にjumpして次の禁止命令語chmodと

同じく比較します。

全部通過したら

0xbbaを二回stackにpushして(bbaは10進数で3002です。3002はlevel2のuidです。)

setreuid関数を呼び出します。

そして、ユーザーから入力された文字列をstackにpushしてsystem関数を呼び出し、

命令語を実行します。

 

今まで分析した情報をソースコードにすると

int main()

{

char buff[30];

char kinsi1[]="my-pass";

char kinsi2[]="chmod";

system("/usr/bin/clear");

chdir("/home/level2");

printf(画面に出てた文字列1);

printf(画面に出てた文字列2);

printf(画面に出てた文字列3);

printf("[level2@ftz level2]$");

fgets(buff,sizeof(buff),stdin);

if(strstr(buff,kinsi1)!=NULL)

 {

  printf("ダメでーす");

  exit(0);

 }

 if(strstr(buff,kinsi2)!=NULL)

  {

   printf("これもダメでーす");

   exit(0);

  }

setreuid(3002,3002);

system(buff);

}

こんな感じですかね。