バランスを取りたい

よくCTFの記事を書きます

SECCON2014 横浜予選Web Writeup

競技開始 (14:20)

FLAG1 (14:24)

スクリーンショットを撮るWebアプリ

HTML内に背景色と同化したリンクがあることを見つける

f:id:xrekkusu:20140908114715p:plain
http://localhost/private/

しかし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]%');になっているので括弧に注意する。

http://10.10.10.35/private/AdminLogin/search.php?user=a%27or%201=1)%20union%20select%20pass,1,1%20from%20usertbl--


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のお手伝いとかあみだコードのリファクタリングなんかをしたりごはんをたべたりしました。

詰将棋

f:id:xrekkusu:20140719214743p:plain

CTFで詰将棋っていつだかのお正月の時間を奪っていったアレを彷彿とさせますが、よく見ると普通の詰将棋ではなく、銅、特、平といった見覚えのない駒とその動き方が書いてあります。


普通の詰将棋でも13手詰めはまともに解いたことがないのにいきなりヤバそうな問題を「将棋なら大丈夫だよね」とakiymさんから渡され焦る。

凝視し続けて1時間近く経った頃には脳が最適化されてました。

将棋の座標表現で書いてますが、この通りに駒を動かして駒が存在する場所の番号をカンマ区切りで打ち込んでおわり。

Decode it!

今回のやるだけ問題

$ nkf -r encoded.txt

メルマガできちんとヒントが出ているので「なるほどね。」って問題。

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_.*"
f:id:xrekkusu:20140312113028g:plain

Steganographyで画像といえばStegSolveなのでとりあえず読ませて様子を見ることにしました。
するとこの画像はGIFアニメで8枚の画像からできていることがわかります。


ほぼ同じ画像が8枚出てきたのでそれらを分離してそれぞれの差分を取ってみました。
具体的には、StegSolveのImage Combinatorで差を取っていって8枚の画像の中で色が異なっているピクセルを1枚に集約した画像を作りました。(めっちゃCombinatorしまくった)

f:id:xrekkusu:20140312113529p:plain


すると上のような画像が出来上がるので、拡大してみると、
どうやら上部に横方向に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

RuCTF 2014 Writeup (Crypto 100)

100. MD5

Server (python27.quals.ructf.org:12337) accepts only authorized messages.
It works like this:

	buf = c.recv(4096)
	digest, msg = buf.split(" ", 1)
	if (digest == md5(password+msg).hexdigest()):
		#here I send a secret
	else:
		c.send("Wrong signature\n")

You have intercepted one authorized message: "b34c39b9e83f0e965cf392831b3d71b8 do test connection". Construct your own authorized message! Answer starts with 'RUCTF_'

Length extension attackを知ってるかどうかが勝負の分かれ目らしい。
IRCで変な質問してる人がいたりして面白かったです(真顔


この手の攻撃で知ってるツールはHashPumpだけだったのでそれでなんとかしました。
結果下見たいなコードになったんですが、Pythonほとんど書いたことが無くて文字列の処理周りでめっちゃ大変なことになってます。
あと、文字列周りでエラー吐く可能性があったんですが何事も無く動いたのでそのままです。

import socket
import time
import commands

host = "python27.quals.ructf.org"
port = 12337

known_sig = "b34c39b9e83f0e965cf392831b3d71b8"
known_text = "do test connection"

def test(sign, text):
  sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM);
  sock.connect((host, port))
  
  data = sign + " " + text
  sock.send(data)
  time.sleep(0.1)
  return sock.recv(4096)

for i in range(1,32):
  cmd = "/Users/rex/CTF/tools/HashPump/HashPump"
  cmd += " -s " + known_sig
  cmd += " -d \"" + known_text + "\""
  cmd += " -k " + str(i)
  cmd += " -a " + "AAAA"
  sign, text = commands.getoutput(cmd).split('\n')
  a, b = text.split('\\x80')
  b = b[:-4].replace('\\x','').decode('hex')

  data = a + '\x80' + b + 'AAAA'
  res = test(sign, data)
  print str(i) + ': ' + res
  if not 'Wrong' in res:
    break

RuCTF 2014 Writeup (Recon)

100. Favourite Book

Have you ever met Olimpiada Balalaykina?
She is a young girl who likes to chat and dreams to meet Pavel Durov.
We'd like to know her favorite book.

これ、だいぶ困りました。
ぐぐってもFacebookでも全く出てこないので放置ゲーしてました。


@lmt_swallowが「やっぱりvk.comかなあ」と言うので二人で見に行ったところ、アカウントを発見。

なんかの文章付きのバッグの写真をアップロードしているのでGoogle画像検索に投げつけました。

すると、"Pride and Prejudice Cotton Book Bag"って名前らしいことがわかるので、
"Pride and Prejudice"をsubmitして100pt。


200. Stolen Camera

Have you ever met Olimpiada Balalaykina?
She is a young girl who likes to chat and dreams to meet Pavel Durov.
Сould name the city where her camera was stolen.

vk.comのpostにある、
"My friend always tells me not to use my relatives' birthdays as a password but he have just tweeted that his own mail had been hacked! Hahaha! :DDD"
がどう考えても怪しい。でもなんだろう。

っていう状態で、Grannyって誰だろうと@akiymさんに聞いたところ、
普通に「おばあちゃん」って意味だとわかったのでそこでひらめきました。

  • 親族の誕生日がパスワード
  • 誕生日は先週の日曜日(写真のアップロード日は2014年3月6日)
  • おそらく80歳を祝っているバースデーケーキ
  • メールアドレスが公開されている

という条件から、メールボックスが見られると推測し、メールアドレスのドメインからMXレコードを引いたところ、GoogleAppsでした。


パスワード19340302とかやってたんですが@akiymさんが地域によって日付の書き方違う、とナイスな指摘をしてくれたので02031934でメールボックスに侵入。


するとGoogleMap付きのメールがあるので、
そのMap上のポイントと、VKのamerican tripのアルバムのコメントの内容から
Day7に行った場所、すなわちGreat Junctionをsubmitして200pt。

200点問題はちゃんと推理可能なように適度にヒントが散りばめられていてすごくいい問題でした