/* */ /* Magicklin ver 1.00 Author R00t Zer0 & DEF-CON ZERO */ /* --------------------------------------------------------- */ /* This is "magic password" search program of "rootkit- */ /* LogIN backdoor", It's Magick! and very strong cleanser! */ /* Usage : ./magicklin[ret] / On the SunOS 4.1.x */ /* */ /* -= DEFENCE-CONDITION ZERO is japanese H/Phreak Group =- */ /* HomePage: http://www.ugtop.com/defcon0 (code: shift-jis) */ /* Sysop R00t Zer0 / Subop Hawkeye */ /* E-Mail: defcon0@ugtop.com */ /* */ /* Special thx: wormhole / http://www.ugtop.com/wormhole */ /* : and oz, welee, venus (UGTOP members) */ /* : - UGTOP is Japan Phreak Site - */ /* : HomePage: http://www.ugtop.com */ /* */ ■Introduction This document is written for japanese wannabe only :-) You need document for another language version? If you're h/cracker or system operator, you read source code, must understand. ■このプログラムについて サブタイトルを見てもわかるように、ルートキットによりログインプログラム に仕掛けられたトロイの木馬のマジックパスワードを解析するセキュリティツー ルで、このプログラムは誰でも実行する事が出来る。 大雑把に英語に訳したサブタイトルの意味はこうだ。”これはルートキットの ログイントロイのマジックパスワードを見つけるプログラムだ。それは魔術であ り、また強力なクレンザーだ!” いうまでもなくマジックリンは強力だ。こすらずに汚れが落ちるらしい(!?)。 ■ルートキット(RootKit)とは 足跡を消してくれるツールやネットワーク盗聴を行うツールや足跡を残さずに システムにログイン出来るようにするツールがセットになった、いわば不法な手 段でルートになった後に重宝するツールの事だ。各OS毎に存在するので入手し ておくのもいいだろう。ちなみに私はルートキットは使用せず、オリジナルのツ ールを使用している。 magicklinは、ルートキットの中の「sl.c」を検出する為のツールだ。 ■sl.cとは /usr/bin/loginにバックドアを作成するものだ。このプログラムは/usr/bin/l oginプログラムを書き換えて、マジックパスワードと呼ばれる特別なパスワード を潜り込ませる。このパスワードを使用すると足跡を残さずにログインする事が 出来るようになるというわけだ。 Blackarmyのoz氏によれば、このsl.cにはバグがあり、/usr/bin/loginのサイズ が増えてしまうとの事。また、彼はバックドアの要であるマジックパスワードの 解読方法を教えてくれた(サンクス>oz氏)。しかしファイルサイズを誤魔化すツ ールもある為、油断は出来ない。 マジックパスワードを使用してのログイン方法はルートキットのマニュアルで も読めばわかるだろうから敢えて説明はしない。 ■バックドアとは 侵入者が後にシステムに容易にログイン出来るようにシステムを改竄して作る 裏口のことだ。単にパスワードファイルにパスワード無しの新規エントリを作成 する場合もあるし、inetd.confよりシェルを立ちあげる方法や、sl.cのようにロ グイン処理の部分に細工を施す場合もあり、その種類は多種多様だ。無論、これ ら裏口作成のターゲットとなるファイルはルートでしか改変できない。 ■プログラム(magicklin)の仕組み ルートキットのログインバックドアを設定すると、マジックパスワードは/usr/ bin/loginの中の"@(#)Copyright"という文字列の−8バイトの位置に暗号化され て格納される。もしマジックパスワードが設定されていなければ、−8バイトの 位置には0x00が書き込まれているはずなので、このプログラムでは暗号化された 文字列が存在するか否かでバックドアを検出している(バックドアが仕掛けられた /usr/bin/loginはサイズが増大するのでそれを検出するという方法もあるが、こ のプログラムではサポートしていない)。 +-----------------------------------------------------------------+ |.....|0|1|2|3|4|5|6|7|@|(|#|)|C|o|p|y|r|i|g|h|t|.................| +-----------------------------------------------------------------+ | | +---------------+ マジックパスワード候補文字列 このプログラムでは"(#)"を検索して、その前方9バイト〜1バイトをマジック パスワード候補と仮定して処理を行う。 マジックパスワードは暗号化されているがその暗号化の方法は単純なもので、 単にパスワードにビット反転をかけているだけだ。つまりもう一度ビット反転を 行ってやれば解読する事が出来る。 decode = ~encode; /* 解読はこんな感じで1バイトづつ行う */ 使い方は、ソースをコンパイルして、ただ実行するだけだ。 ・マジックパスワードが仕掛けられていた場合(XXXXXXXXがマジックパスワード) www01% gcc magicklin.c -o magicklin (注:gccでコンパイル) www01% ./magicklin (注:実行する) === Magicklin ver 1.00 Produced by DEF-CON ZERO === Magick password is XXXXXXXX !! www01% (プログラム終了) ・マジックパスワードが仕掛けられていない場合 This server not set magick password... news% ・対応OSでない場合 This server isn't using SunOS4.1.x linux01% マジックパスワードが見つからなかった場合、何故残念そうなメッセージが出 るのだろう。不思議でしょうがない。見つかった場合のエクスクラメーションマ ークは”驚き”を表していると解釈してくれ。 なお、”Can't open login file!?”という文字列からはじまるメッセージが現 れたら、loginプログラムが/usr/binに存在しない事になる。その時は正しいパス を見つけ出して、defineのLOGIN_PATHを書き換えてほしい。またはOSが違う事 も考えられるので、SunOS4.1.x以外は諦めて欲しい。また、ログインプログラム 中に、キーワード「"(#)"」が現れなかった場合は未対応OSという事で処理を終 了する。 ※:動作確認はSunOS4.1.3上でコンパイラはgccを使用して行った。 ■magickとmagicの違いについて 通常、魔法とか魔術、奇術、手品などは"magic"と綴られるが、魔術と手品の区 別をつける為に、魔術を指す場合は"magick"と綴るのがUG的に正しい。 このプログラムでも"magic"ではなく、"magick"という単語を使用している。 ■SPECIAL THANX マジックパスワードの解読方法などを提供してくれたBlackarmyのoz氏、それを 補足してくれたUGTOPのwelee氏、UGTOPのvenus氏には感謝しています。彼らの書 き込みがなければこのツールは生まれなかった。また、wormhole氏には環境を提 供していただき、またプログラム作成のサポートもしていただいた。ありがとう! ■DEF-CON ZEROとは 日本に拠点を置くハック/フリークグループだ。メンバーは現在9名で専門分 野はハック、フリーク、クラック、テイストレスと多岐に及んでいる。中には全 くハックに疎いメンバーもいるが、我々は感覚を重要視している。普通の人間が 考えもつかない事を考えられるというのはUGにおいては最も重要なことだと私 は確信している。つまりクールだって事だ。メンバーになりたい人達はメールを 送って欲しい。ただし、情報は全て公開するのが原則なのでその辺は念頭におい て欲しい。詳しくは下記URLにアクセスしてInfomationを見てくれ。 ○ホームページ :http://www.ugtop.com/defcon0 ○メールアドレス:defcon0@ugtop.com ■UGTOPとは 日本トップレベルのフリークサイトだ。ここはメンバーズサイトがあり、そち らはハッキング関係がメインなのだが、やはりハイレベルといえる。また、更新 のサイクルも速く、お勧めのサイトで私のページもここのサイトの下に作っても らっている。現在UGTOPではメンバーを募集しており、UGサイト管理者や スキルがある者が入会を許される。が、その辺のクラッカーレベルではまず会員 になるのは無理だろう。たしか一万円を払って会員になる方法もまだ存在してい るはずなのでそちらを利用しても損はしないはず(私は入会金制度は廃止して欲し いのだが)。興味があればページを見てほしい。運営はvenus氏で電話システムに 詳しい。 ○ホームページ :http://www.ugtop.com ○メールアドレス:venus@ugtop.com ■wormhloeとは wormhole氏が運営しているサイト。全般的にUNIXハッキングについてのC HIPSを掲載している。全てフリーであるし、特にワナビーには必見のサイト であるといえる。wormhole氏はBlackarmyというグループのメンバーだ(私もDEF- CON ZEROを立ちあげる前まではメンバーだったように思うのだが...)。 ○ホームページ :http://www.ugtop.com/wormhole ■BlackArmyとは jdeamon氏のハッカーグループ。コンピュータハッキングを専門に行うグループ で、メンバーサイトもCUGとなっている。jdaemon氏が運営しているサイトであ る"Hacker's only BBS"では、いくつかの情報が公開されており、重要なものはお 金を払う事で見る事が出来る。BBSの名前のとおり、現在4つの掲示板があり、そ れぞれレベルによってわけられている。誰でも読み書きできるのはそのうちの一 つのみだが有益な情報を提供する事でレベルが上の掲示板へのアクセス権を得る 事が出来る。 ○ホームページ :http://www.ugtop.com/jdaemon /* */ /* Magicklin ver 1.00 Author R00t Zer0 & DEF-CON ZERO */ /* --------------------------------------------------------- */ /* This is "magic password" search program of "rootkit- */ /* LogIN backdoor", It's Magick! and very strong cleanser! */ /* Usage : ./magicklin[ret] / On the SunOS 4.1.x */ /* */ /* -= DEFENCE-CONDITION ZERO is japanese H/Phreak Group =- */ /* HomePage: http://www.ugtop.com/defcon0 (code: shift-jis) */ /* Sysop R00t Zer0 / Subop Hawkeye */ /* E-Mail: defcon0@ugtop.com */ /* */ /* Special thx: wormhole / http://www.ugtop.com/wormhole */ /* : and oz, welee, venus (UGTOP members) */ /* : - UGTOP is Japan Phreak Site - */ /* : HomePage: http://www.ugtop.com */ /* */ #include #include #include #define KEYWORD "(#)" #define LOGIN_PATH "/usr/bin/login" #define OK 1 #define NG 0 char mgkpass[ 0x0d ]; int decode_mgkpw(); main() { FILE *fp; int loop; /* title :-) */ printf("=== Magicklin ver 1.00 Produced by DEF-CON ZERO ===\n\n"); /* file open */ if( NULL == ( fp = fopen( LOGIN_PATH, "r" ) ) ) { perror("Can't open login file!?"); exit( 0 ); } /* buffer zero clear */ memset( mgkpass, '\0', 0x0d ); /* read file */ for( ; ; ) { mgkpass[ 0x0b ] = fgetc( fp ); if( feof( fp ) ) { puts("This server isn't using SunOS4.1.x"); exit( 0 ); } if( strstr( mgkpass + 0x09, KEYWORD ) ) break; for( loop = 0; loop < 0x0b; loop++ ) mgkpass[ loop ] = mgkpass[ loop + 1 ]; } /* decode and check */ decode_mgkpw() ? printf("Magick password is %s !!\n", mgkpass ) : puts("Not found magick password to this server."); /* complete */ exit( 1 ); } /* magick password decode */ int decode_mgkpw() { int loop; for( loop = 0; loop < 0x09; loop++ ) if( !isprint( mgkpass[ loop ] = ~mgkpass[ loop ] ) ) break; mgkpass[ loop ] = '\0'; return( strlen( mgkpass ) ? OK : NG ); }