-- Solutions for the drill.hackerlabs.org wargame --
         <teleh0r@doglover.com> - http://teleh0r.cjb.net/
  =============================================================

Introduction:
~~~~~~~~~~~~~
私は普段は wargame で遊ぶことは無いのだが、クリスマスのアニメに
飽きてきたのでどうしたものかと考えていた。私の愛するサーチエンジン
http://www.google.com/ で wargame を探し、http://www.hackerslab.org/
を見付けた。この hackerslab の wargame はとても面白いものに思えた。
(面白くない話は見た目上、ある程度削除してある)


では、ここからは原文を訳さずに、端的に内容の解説に移ります。元の問題は原文を
参照して下さい。どれも実際に有りそうな話、有りそうなプログラムを元に作られた問題です。

まず、ログインした状態でレベル 0 です。

Level  1. 他者のbackdoor探し
Level  2. system() に対するexploit
Level  3. /bin/more に対する !<command> exploit
Level  4. IFS
Level  5. system("clear") に対するexploit
Level  6. stringsコマンドによるバイナリ中からのパスワード探し
Level  7. パスワードをくれるdaemon探し
Level  8. DESパスワードのcracking
Level  9. race condition
Level 10. buffer overflow
Level 11. UDP packet spoofing

各レベルでの詳細

Level  1.
ユーザ level1 にsetuidされているバイナリを、エラーを出力させずに探しています。
find / -user level1 -perm -4000 2>/dev/null


Level  2.
プログラムが system("/usr/bin/file $input") を含んでいると“推測して”
-v;/bin/sh
を与えています。つまり system("/usr/bin/file -v;/bin/sh") が実行されます。
file はバージョン情報を出力し、続いて /bin/sh が走ります。setuid されているので
level 3 へ行けます。


Level  3.
more コマンドの !<cmd> 機能を使っています。つまりUNIXコマンドへの理解が
試されています。
--More--(64%)
の部分で !/bin/sh; によって /bin/sh を実行しています。これもsetuidされているので
レベルが上がります。


Level  4.
環境変数 IFS は、コマンドラインでの引数のセパレータに使う文字をセットするものです。
つまり、
$ export IFS=x
とすると、
$ lsx-lax/tmp
で ls -la /tmp が実行されます。だから、
IFS=/
とすれば、`/bin/date` は ` bin date` と解釈されます。
そこで、bin というファイル名のshellスクリプトを書けばいいのです。
cshでは
% setenv IFS /
です。


Level  5.
ソースコードに system("clear") を追加してコンパイルしたということをまず把握する
必要が有ります。そして、system("/bin/clear") ではなく、system("clear") である点を
予想し、. にPATHを通して system("clear") で /bin/pass が実行されるよう、clear と
いうファイル名のshellスクリプトを置きます。

Level 5. の方が 4. に似ていてしかも簡単だ、という声も見られました。


Level  6.
核となるコマンドは
find / -user level6 -perm -4000 2>/dev/null
strings /lib/security/pam_auth.so|less
です。まず find でパスワード付きbackdoorを探し出し、strings で plain/text な
部分を取り出しています。


Level  7.
daemonを探し出し、それにlevel6のパスワードを与えよという問題です。
簡単です。単にポートスキャンするだけです。
nmap -sS -F drill.hackerslab.org
(わざわざSYNスキャンにする必要は有りませんが)


Level  8.
まず /dev にbackdoorが有ると踏んだ部分にteleh0r氏の鋭さが表れています。
/dev/audio2 を実行すると DES パスワードが現れるので、これをcrackするだけです。
teleh0r氏は自作の password cracker を書いて使っていますが、勿論 John the Ripper
でもいいでしょう。


Level  9.
/usr/bin/ps2 という名前が既に ps コマンドの race condition を連想させます。
実際の挙動は、
/var/tmp2 にファイルを作る
作業する
/var/tmp2 に作ったファイルを削除する
/var/tmp2 にファイルが無いかどうか確認する
の 4 段階です。実際にteleh0r氏が用意したスクリプトはこうです。
----
#!/bin/sh
while : ; do
    /usr/bin/ps2 &
    rm -f /var/tmp2/ps2.tmp
    ln -s teleh0r /var/tmp2/ps2.tmp
    /usr/bin/ps2
done
----
つまり、/usr/bin/ps2 をバックグラウンドで走らせます。そして ps2 の作ったテンポラリ
ファイル /var/tmp2/ps2.tmp を削除し、/var/tmp2/ps2.tmp -> teleh0r というシンボリック
リンクを張ります。そして再度 ps2 を走らせる訳です。この無限ループですり替えを
試みています。


Level 10.
buffer overflow です。ターゲットも /etc/bof と、そのまんまのファイル名です。
usage: ./bof your_nick_name
から、引数は一つ。そこで ./bof `perl -e '{print "A"x"60"}'` で、perl に A を 50 個
出力させてそれを引数として渡しています。segfaultが起き、overflowしたことが分かります。
return address 0xbffffe68 とし、簡潔なexploitを perl で書いています。
面白いのは、teleh0r氏は
NOPNOPNOPNOPNOPNOPNOP...|shellcode|RETRETRETRET...
という通常の形のバッファを用意せず、今回は
RETRETRETRET...|NOPNOPNOPNOPNOPNOPNOP...|shellcode
という形にしているということです。


Level 11.
問題は、UDP port 5555 で動くdaemonに対して、www.hackerslab.org から「レベル10の
パスワード/メールアドレス」という中身のパケットを送ると、そのメールアドレスに次への
パスワードが送られるというものです。
これはソースIPアドレスをspoofしたパケットを作成して一発送ってやればOK。
コネクトレスな UDP だから可能な芸当です。

補足0 -- hackerslab.orgのBBSを覗いてみると、drill.hackerslab.org からUDP
        パケットをspoofして送ろうとしている人がいましたが、rootでないので
        無理ですね(笑)。自分のPCやroot権限を持っているマシンから送りましょう。

補足1 -- Level 12. は、heap overflow の問題でした。


written by White_E <white_e@iname.com>

Read teleh0r's original text for more informagion.

[Home] | [BBS]