ひよこ倶楽部ネットワークセキュリティやってます。技術よりも趣味と雑談が多めのブログです。最近はオンライン英会話にはまっています。ないブログに表示されています。新しい記事を書く事で広告が消えます。日本最大のCTFであるSECCONがいよいよ国際化するそうだ。従来では日本語だけであったが、12月のオンライン予選では英語が対応になり外国チームの参加が容易になる。今まで日本語オンリーであったためctftimeにはのっていなかったので、これではれてctftimeに加えられそうだ。日本語予選は7月で、予想よりも半年ぐらい前倒しとなり、また準備不足のまま予選に参加することになりそう。目標はプログラミング、ネットワーク、バイナリの各分野でそれぞれ最低1問は解答したい。Comment(0)たのしいバイナリの歩き方いくつになっても知らないことを学ぶのはたのしいことだ。そのうちマルウェア解析ができるぐらいにはなりたい。CTFは、NWな人にはあまり関係ないが、SECな人には有名なセキュリティコンテストである。Flag)は、毎週のように世界各地で催されている。CTFはそのなかで最大なCTFである。参加チームは年々増加しており、今年は1000チームを超えた。我らへっぽこセキュリティエンジニアの集まりで初参戦した。烏合の衆な我がチームは、なんと奇跡的にも0点を回避することができた。3点もとれた!(全部1点問題ですが。)バイナリ解析などのリバースエンジニアリング系の問題ばっかで、手も足も出ない状態でした。pcap系とweb系の問題があればもう少し点数が取れていたかもしれない。バイナリの問題解答例のwrite-upを読んでもさっぱり意味が分からないぐらいスキルのなさを露呈した。くやしいので一昨日からバイナリの勉強を始めた。ネットで基本中の基本ぐらいの知識を身につけて、評判がよさそうな「たのしいバイナリの歩き方」を読む予定である。ちなみに自分が解けた問題は3dtttというやつでした。ncコマンドであるサーバと3次元3目並べゲームとの対戦ゲームで、50回勝ち越しすると勝利のやつ。時間制限などがあったからPythonで自動化できるプログラムを書いて1ポイントゲット。Write-Up問題ページ21ユーザのパスワードファイルとなっている。user99にはパスワードリストのURLがある。RipperみたいなことをすればFlagがとれそう。パスワードファイルのフォーマットはよく知らなかったので調べたところ、$6$はSHA512の意味で、さらに次の$まではソルトの部分である。平文のパスワードにソルトを連結したうえハッシュ処理を行った結果が暗号化パスワードとなる。SHA512なのでハッシュ化文字列は512ビット、16進数文字列でこれを表すと、128文字のハッシュとならないといけない。問題のハッシュをみると86文字しかなく、さらに文字は英数字混じりとなっている。最初、base64でエンコードされていると疑ったが、結果的にそうではなかった。hashlib.sha512()で総当りすれば簡単にできるとおもったがなかなかうまくいかなかった。Pythonでsha512を生成する方法を調べた結果、cryptモジュールならできそう分かる。cryptモジュールはwindowsにないのでpythonをubuntuで書いて実行した。Write-Up問題ページ問題ページにはIDとPassの2つのフォームしかない。IDはadminと言われているので、Passを当てる問題と思われる。SQLの脆弱性を突く以下のような簡単なSQLインジェクションを試す。'A'='Aすると、PHPのページが表示された。adminのパスワードが回答らしい。PHP構文がヒントというので、上から眺めるとSQLの構文があって、この構文の中の変数$idや$passに適切なSQLをはめ込めばパスワードを盗み出せるかもしれない。作戦はたったがどのようなSQLを入れればよいのかは分からない。そもそもSQLよく知らないし。password”をたずねたら、偶然以下のサイトをみつけた。ブラインドSQLインジェクションこのブラインドSQLインジェクションは初耳だが、これをうまく使えばパスワードを推測できそう。かなりの試行錯誤をへて次のようなSQLをIDフォームに入れて(Passフォームは空欄)送信するとSQLインジェクションが成功した。id='admin'),1,1)<='Z'--何をしているかというと、IDがadminでかつadminのパスワードの1文字目がzよりも小さいなら正(SQLインジェクション成功)を返させる。アルファベット英数文字の順序はアスキーコード表を参照すること。ZをCに変えてもう一度攻撃をするとログインエラーとなる。adminのパスワードの1文字目は、D~Zの23文字のいずれである。このようにパラメータを1つずつ変えながら試せば答えにたどり着くことできる。パスワードの長さによっては途中で挫折してしまうかもしれない。パスワードの長さを知りたい衝動にかられる。短ければ気合で総当りすることもできる。調べたらlength関数を使えばパスワードの長さが分かるかもしえれないので、これも試行錯誤して以下のようなSQLにたどり着いた。100--ここでは、IDがadminでかつadminのパスワードが100以下なら正とする。結果としてSQLインジェクションが成功した。先ほどと同様に100を少しずつ減らしていけばパスワードの長さがわかる。長さは、あまりがんばりたくない文字数でしたので、なんとか楽したいとおもいはじめる。Requestをいったん止めてPOSTのパラメータを変えながら試せば効率が上がるとおもったからである。たしかに直接フォームにSQLを入れてためすよりは速度は速いが、やはり手動にはかわらないので数回やると萎えてしまう。プログラミングで自動化したい!PythonによるHTTP通信のプログラミング経験はまったくないので、まずは以下のページを見てお勉強した。使ってインターネット上のリソースを取得するには格闘する3時間でやっとプログラミングが完成した。passwordこれを実行すると、adminのパスワードの文字数およびパスワード文字列が出てくる。プログラムの前半はパスワード文字数を割り出して、後半ではパスワードの各文字を記号・英数文字の総当り検索を行っている。攻撃成功か失敗かはHTTPレスポンスのHTMLの長さで判断している。:2006年のCCNA合格を皮切りにCCIE-RSを含めて数々のシスコ資格をパスし、2009年に念願の海外受験(ドバイ)でCCIE-SCを取得。2010年に目標だったトリプルCCIEを香港の地にて達成した。今はネットワークセキュリティやデータ分析などをやっています。対応のブラウザで見てください。対応のブラウザで見てください。