CSAW 2014 Bin300(1) wololo
アセンブラをゴリゴリ読み続けてあれがこうなって…ってやって調べていくと解けます。
SECCON2014 横浜予選Web Writeup
競技開始 (14:20)
FLAG1 (14:24)
スクリーンショットを撮るWebアプリ
HTML内に背景色と同化したリンクがあることを見つける
しかしlocalhost onlyと表示されアクセスできない。
スクリーンショットで/privateを見るとFLAG1, AdminLogin, ls.txtが見つかる。
改めて/private/FLAG1のスクリーンショットを取るとフラグゲット
SECCON{screenshotFromLocalhost!}
FLAG2 (14:26)
スクリーンキャプチャで/private内を覗くとAdminLoginというフォルダがあるのでアクセスして見るとログイン画面が出てくる。
中身はstrcmpに配列を渡す問題。
山崎さん問題なのにMongoだったらどうしようと思って括弧を入れたらログインできた
?user=aaa&pass[$ne]=aaa
SECCON{strcmpBypass??}
FLAG3 (14:33)
簡単なSQLインジェクションで当然データベースはSQLite。
SQL文が select * from usertbl where (id LIKE '%[id]%');になっているので括弧に注意する。
SQL内の括弧の存在に気づけるかどうかという点で面白い問題でした。
SECCON{IamSqlInjM@ST3R}
FLAG4 (15:14)
スクリーンキャプチャで/private内を読むとls.txtというファイルが見つかるので、
これを更に読むと/***MySSHuserPass.txtがあることがわかる。
このファイルを手に入れるのに少し苦労しました。
Stage3→4へ繋がると思い込んでいたので、FLAG3のあとどこかにローカルファイルを読める脆弱性が存在すると思ってずっと探してました。
見逃しがあるかもしれないと最初のスクリーンショットのページへ行って、スクリーンショットの画像URLを確認してみたところ明らかに怪しい。
http://10.10.10.35/?image=../../../../***MySSHuserPass.txt%00
cedec / secconYkhm
% ssh cedec@10.10.10.35 cedec@10.10.10.35's password: Last login: Thu Sep 4 00:13:20 2014 from 10.10.10.15 [cedec@localhost ~]$ ls FLAG4 [cedec@localhost ~]$ cat FLAG4 SECCON{PathTraversalIsMyFriend}
FLAG5
********チームメンバーとのSSHのプロセスkill対決が1時間くらい行われる。
その後終了20分前くらいに@kazu1130_hがパスワードを変えて********以外全員死亡。
競技終了後に答え合わせをしたらこの問題を解いている人がいないらしいことが判明しました。
答えとしては、
/etc/crontabを読むとPATH=.:/bin/..みたいになっていて、
cronに登録されている/home/FLAG5/myBatch.sh内では
cd /tmp last -20 | grep pts | cut -b23-38 | sort | uniq -c | sort > tmp.tmp
となっているので/tmp以下でFLAG5権限のシェルスクリプトが動く(ということらしい)
cat /etc/crontabはしてPATH=.も見ていたのにコマンドをすりかえる発想がなかったのでだめでした。
SECCON2014 writeup
久々にCTFを本気でやった感じがします。
自分が直接フラグを打って得点した問題はDecode me!と詰将棋?で200ptでした。
あとはXSSのお手伝いとかあみだコードのリファクタリングなんかをしたりごはんをたべたりしました。
詰将棋
CTFで詰将棋っていつだかのお正月の時間を奪っていったアレを彷彿とさせますが、よく見ると普通の詰将棋ではなく、銅、特、平といった見覚えのない駒とその動き方が書いてあります。
普通の詰将棋でも13手詰めはまともに解いたことがないのにいきなりヤバそうな問題を「将棋なら大丈夫だよね」とakiymさんから渡され焦る。
凝視し続けて1時間近く経った頃には脳が最適化されてました。
詰将棋writeup: ▲34銅 △12王 ▲21特 △同王 ▲32平 △12王 ▲22平 △同王 ▲31銀 △33王 ▲43金 △24王 ▲25金
— れっくす (@xrekkusu) 2014, 7月 19
将棋の座標表現で書いてますが、この通りに駒を動かして駒が存在する場所の番号をカンマ区切りで打ち込んでおわり。
SecurityCamp 2014 Web security Write-up
ネットワークセキュリティの問題はかなりWrite-upが上がっているのにWebはそんなに見ないなと思ったので解いてみました。
まずは応募用紙を見てみましょう。
http://www.ipa.go.jp/files/000038877.txt
5. 以下のJavaScriptのコード断片は、とあるWebサイトで利用されていたものです。
これを見て気付いた点について、自由に書いてください。
function getRedirectPageUrl(){ var url = location.hash.substring(1); try{ if( url.length === 0 ) return "/"; url = decodeURIComponent( url ); if( !url.match( /^https?:\/\// ) ) return "/"; }catch( e ){ console.log( "invalid url" ); } return url; } /* .... */ var url = getRedirectPageUrl(); location.href = url;
続きを読む
RuCTF 2014 Writeup (Stegano 100)
100. Cat's eye
Find the key.
Format is "RUCTF_.*"
Steganographyで画像といえばStegSolveなのでとりあえず読ませて様子を見ることにしました。
するとこの画像はGIFアニメで8枚の画像からできていることがわかります。
ほぼ同じ画像が8枚出てきたのでそれらを分離してそれぞれの差分を取ってみました。
具体的には、StegSolveのImage Combinatorで差を取っていって8枚の画像の中で色が異なっているピクセルを1枚に集約した画像を作りました。(めっちゃCombinatorしまくった)
すると上のような画像が出来上がるので、拡大してみると、
どうやら上部に横方向に2行と4/5くらいのあたりに点が集中していることがわかります。
ここで、横方向にデータが並んでいるのではないかと検討をつけました。
フラグの頭がRなので、二進値の01010010を探すとぴったり当てはまります。
このことを既に画像差分を取得するスクリプトを書いていた@akiymさんに報告したところ、
ものの数分でフラグを奪取してくれました。
RuCTF 2014 Writeup (Crypto 200)
200. Mary Queen
Mary Queen of Scots goes chinese. We capture secret message from prison where Mary Queen stands. Help us figure out what message means.
ファイルを開くとE4 xx yyな文字とスペースが並んでいることがわかります。
何が何だかさっぱりわからなかったのですが、xx yyが結構被っていること、スペースが英語っぽい位置にあることから、とりあえず頻度分析を回してみました。
その結果、53種類の文字とスペースがあることがわかり、アルファベットの大文字小文字なんじゃないかと検討をつけました。
適当なサイトから英字の頻度表を持ってきて、とりあえず頻度が高い26文字を置換。
残りは適当に大文字のアルファベットで埋めたりしてそれっぽく処理してます。
置換した結果、英文っぽいけどなんか違う文章が生成されたのでそれを換字式暗号のソルバーに突っ込んだところ、文章の最初の部分が"lewis carroll alices adventures"だということがわかりました。
フラグは"Alice's Adventures in Wonderland"でこの時既に解けているはずだったのですが、
まさか物語のタイトルが答えだと思わず、全文を復元しようと原文と照らしあわせてました。
結局答えが分からず放置してたのですが、
@akiymさんがhttps://www.youtube.com/watch?v=_htopuN4pCkを見つけてきてくれたおかげで、実は既に暗号は解けていてそれ以上の謎はないことが判明。
さらに、IRCでcrypto200の答えについて、「case-insensitiveだけどpunctuationは重要」っていう運営の発言があったのをふと思い出し、"Alice's Adventures in Wonderland"をsubmitしたところ200ptを獲得できました。
import struct dic = { "b890": "e", "b994": "t", "b9a7": "a", "b8b7": "o", "b891": "i", "b99e": "s", "baab": "n", "b898": "r", "b9ab": "h", "b9a5": "l", "b9a4": "d", "b89d": "u", "b9a0": "?", "bbaa": "g", "bba1": "c", "bb90": "w", "b8a8": "y", "b8bc": "m", "babc": "the", "b8a1": "p", "ba9f": "b", "bb83": "f", "b8ad": "k", "b8ac": "v", "b8ae": "and", "b893": "of", "ba86": "in", "b9a9": "q", "bbb2": "that", "bbb8": "x", "baba": "E", "b885": "as", "baa3": "G", "b981": "j", "b996": "I", "b9be": "J", "bb84": "z", "b998": "with", "bb9e": "but", "bbbb": "for", "bb94": "so", "b983": "not", "b991": "what", "baac": "this", "bab6": "is", "bab9": "if", "b8b2": "when", "ba83": "there", "b89e": "me", "b8a4": "my", "ba94": "on", "bb8b": "from", "bb88": "where" } f = open('d8cb57bf1b34bf8c58836724ee2b0b71', 'rb') sample = "" while True: op = f.read(1) if op == ' ': sample += " " continue elif op == "": break code = struct.unpack(">H", f.read(2)) s = "%x" % code sample += dic[s] print sample