きゅうり。

主にCTF関係のことを書いていく気がします

Tokyo Westerns/MMA CTF 2nd 2016 greeting writeup

いわゆるpwn challenges listを片っ端からやっていこうというやつ。

実は前に15問ぐらい解いたものの、半年?くらい暗号以外触っていなかったのでリハビリも兼ねて最初からやる。

ところでwebもやりたいんだけど、問題が生きてないからつらい。

続きを読む

Harekaze CTF writeup

解いた

・gacha

・Fight

・Round and Round

解けなかった

・gacha2

続きを読む

ネットワークスペシャリストに受かった話

タイトルの通りです。

発表からしばらく経ってますが、やっぱり書いておこうと思ったので書きます。

決して論文を書くのに飽きたとかそういうやつではありません

続きを読む

SECCON 2017 Online writeup

2200点で71位でした。国内は18位くらい?厳c

4問といて600点を入れました。

 

Vigenere3d

おそらくきちんとスクリプトを書いたほうがいいとは思いますが、手で数えたほうが早いという判断で全部手動でやりました。

(その結果、他の人とほぼ同時進行していたという微妙な時間の無駄に)

フラグ長、鍵長は問題文の*の数に対応してるだろうと推測。

鍵長が14なので、平文のうち(idx%14)の値が等しい箇所はただのシーザー暗号。

SECCON{に対応したところを戻すと、

SECCON{*******_to_SEC*******_2017}

となります。

ここからguessingすると、SECはSECCONだろうなということがわかります。

SECCON{Wel****_to_SECCON****_2017}

さらに、WelはWelcomeっぽいので当てはめつつ埋めます。

SECCON{Welcome_to_SECCON_0TF_2017}

となりますが、意味が通らない 0TF はまぁCTFだろうということで修正。

SECCON{Welc0me_to_SECCON_CTF_2017}

puchar music

「音楽を聴いただけで世界中の人がタイトルのわかる映画」

これは STAR WARS ですね。金曜ロードショーでやってました。

SECCON{STAR_WARS}

Simon and Speck Block Ciphers

不明部分が4文字だけなので、総当たりであろうことはすぐに予想がつきます。

あとは暗号の実装だけですが、探したら出てきたので終了。

Simon_Speck_Ciphers/Python at master · inmcm/Simon_Speck_Ciphers · GitHub

SECCON{6Pz0}

Very smooth

pcapを渡されてTLSを復号する問題。

当時の脳内の方針を雑に書きだすとこんな感じ。

  1. fault attackするやつfacebook ctfであったな
  2. でもエラーでてるパケットないな
  3. 証明書ひっぱりだしたら公開鍵1024bit
  4. タイトル的に素因数分解
  5. msieveもフェルマー法も当たらない
  6. そういやsmooth as silkとかいうのsharifであったな
  7. primefac 即終了

これだけだとひどいので、少していねいに書きます。(というかまともに解いた問題がこれくらいしかない)

証明書から1024bitのRSA公開鍵抽出までは省略します。

素因数分解方法としてはいくつかの手法が考えられて、

・総当たり

フェルマー

・p-1法

・ρ法

などがあります。

総当たり法は言うまでもなく、フェルマー法は2つの素数の差が小さいときに使える手法です。(ここでは割愛します。)

今回はp-1法が刺さります。

さらに簡単な方法として、primefacというものを使うとρ法など幾つかの手法で素因数分解をしてくれます。(多分)

両方で試してみたのが以下のスクリプト

※追記:primefacのimportが抜けてました。最初に from primefac import primefac を脳内補完してください。

素数を得ることができたら秘密鍵を作成してwiresharkで読み込むことでTLSが復号できる。

SECCON{One of these primes is very smooth.}

 

 

MITMのやつも解きたかったものの中々厳しかった。

中間者攻撃自体はかんたんなもののそこ以外の部分で完全に詰まってました。

暗号屋さんにとってはつらい感じだったけど、こういうCTFの度にpwnできるようになりたいって言ってる気がする。

コマンド実行完了時にSlackに通知を飛ばす

状況

Linuxマシンで時間のかかるコマンドを頻繁に実行している。

e.g.) 機械学習、総当たり系CTFソルバ、など

実行が完了したかどうか毎回見にいくのは面倒なので、実行終了時にSlackなどに通知を飛ばすことで効率を良くしたい。

 

方法

ntfy というツールを入れて通知を飛ばすことにしました。

簡単に言ってしまえば、Slackを始めとする様々なツールのAPIラッパーのようなものです。

自分で書いてもいいのですが、今回は手軽に通知を飛ばすことだけを考えていたのでこれで済ませます。

 

手順

ntfyインストール

pipで簡単に入ります。

$pip install ntfy
$pip install ntfy[slack]

slackを用いる場合は下のコマンドを用いるらしいです。

slack側の準備

レガシートークンというものを用います。

api.slack.com

発行したらこれだけでslack側の準備は終了です。

ntfy設定ファイルの準備

~/.ntfy.yml というファイルに以下のように記述します。

backends:
  - slack
slack:
  - token:xoxp-hogehoge
  - recipient:"#<送りたいチャンネル名>"

これで準備完了です。

 

通知送信

コマンドから

$ntfy send "hoge"

pythonから

from ntfy.backends import slack
slack.notify(title="piyo",message="huga",token="token",recipient="#ntfy-test")

これだけ。

結果

f:id:Kyuri:20171130220342j:plain

 

bot名やアイコンなどはntfyをいじればカスタマイズできるはず。

ただ要件は満たしたので今はこれで満足してます。

 

 

 

 

ふと思ったんだけど、頑張ればこの記事をどっかのAdventCalendar用にできたのでは。

HITCON CTF 2017 Secret Server writeup

elfやらcrypto+pwnやらと暗号担当でもバイナリ解析前提の時代がもう来てますね、といった印象でした。

そんな中でpythonが読めれば解けるSecret Server のwriteupです。

チーム内の勉強会で取り扱ってわかったんですが、道中ちょいちょい別解があるっぽいです。(最終的な求め方はないっぽいですが)

 

具体的な動作の説明については読めばわかるので飛ばします。

重要なのは以下の3点。

・暗号化の際のIVは既知

・復号の際のIVは任意に送れる

・unpad は脆弱(長さ判定、paddingの中身判定ともに無し)

 

ここまではよくある共通鍵暗号問題。

 

まずはじめに、Welcome!!の暗号文しか手に入らないため、IVを細工してget-flagを実行させます。

f:id:Kyuri:20171106144618p:plain

 これでフラグの暗号文を手に入れることができる。

同様にIVの細工をしてフラグの出だしを特定していくことを考える。

f:id:Kyuri:20171106145202p:plain

なお、get-flag が実行されたのか command not found となったのかどうかは暗号文の長さを見ることで判定ができる。

同様に、exit-here・get-sha256を利用することでフラグが3文字特定できる。

具体的には、hitcon{Pad までわかる。

(フラグからもパディングを利用していくことは想像できる)

 

さて、フラグの暗号文は3ブロックあるが、2ブロック目の最後1バイトを適当に変えてやると、復号結果の最終バイトすなわちunpadでの判定に利用されるバイトを変えることができる。

unpadの際にサイズ判定をしていないので、255バイト取り除くような状態でも動く。

これを利用してやると、get-sha256がギリギリ残って実行されるような範囲を調べることができる。

f:id:Kyuri:20171106145734p:plain

これをすると38通りの成功パターンが出てくる。

これらの値から、C3を復号直後の中間ブロックの最終バイトが計算でき、m3のパディングの値も計算ができる。(z3を使うとシュッと計算できる)

言葉で書くとわかりにくいが、なんとか図から読み取ってもらいたい。

 

この計算から、フラグは32文字でm3はすべてパディングのブロックであることが判明する。

 

パディングを利用して平文を任意の長さに削ることができるようになった。

そこで、get-sha256+1文字だけ残すようにC2の最終バイトを変えてやる。

すると、sha256の候補としては256通り(asciiなので本当はもっと少ない)しかない。

256通りの候補を手元で計算し、それぞれに対してget-flagとなるようなIVを計算して送ってやる。

f:id:Kyuri:20171106150501p:plain

もしget-flagとなったら、そのIVを計算するのに使ったsha256の元の平文がフラグの1文字となる。

これをget-sha256+n文字についてやっていくと、フラグの16文字目までが特定できる。

ただし、C2をいじるとフラグの2ブロック目が壊れてしまう。

そこで、適当にC4を追加してやり、C3をいじって同様のことを行うとフラグをすべて復元できる。

 

 

hitcon{Paddin9_15_ve3y_h4rd__!!}}

 

 

だれかSecret Server Revenge を教えてください

Kaspersky CTF writeup

遅くなりましたが、Kaspersky CTFのwriteupです。

Cryptoを2問だけ解いたので書きます。

(当初はあまり書く気がなかったものの、勉強会中解き終わって暇なので書きます)

 

Security home cameras (crypto 300)

謎の暗号化されたpngが渡される問題。問題文にヒントは特になし。

pngマジックナンバーすら破壊されているため、なんとなくpngマジックナンバー(0x89 50 4E 47)と暗号のxorをとってみると、どのバイトも0xffとなる。

したがって、暗号の全バイトと0xffでxorをとると画像が復号できる。

20171011160454

 

Bad computation (crypto 800)

やたら読みにくいスクリプトが渡される。(実はこれが暗号文だった説

が、ある程度cryptoを(特に公開鍵暗号)解いたことのある人ならば、egcdやmod_invあたりは関数の中身を見ると判別できると思う。

結論から述べると、スクリプトを読むとpaillier暗号であることがわかる。

関数 L(x) = (x-1)/n や、暗号化の処理などが特徴的なので知っているとわかる。

さて、ここで暗号化の処理を詳しく追ってみる。

dcew \equiv g^b * r^n \pmod{n^2}

c \equiv g^m * r^n * dcew \pmod{n^2}

c \equiv L(c^{\lambda}) * L(g^{(p-1)(q-1)})^{-1} \pmod{n}

最初のcの計算でpaillier暗号における暗号化を行った後、次に復号処理をしていることがわかる。ここで暗号化の際に余計にくっついているdcewを見てみると、bを暗号化している。

つまり、平文mとb=22の暗号文の積をとった後、それについて復号を行う。

ここで、paillier暗号は平文について加法準同型性を持つ。

すなわち、Enc(m)*Enc(b) \equiv Enc(m+b)となる。

今回の問題ではこれについて復号を行っているため、与えられた暗号文はm+b = m + 22となっている。

したがって、暗号文の各文字から22を引くとフラグが得られる。

ソルバ

print "KLCTF{"+"".join(map(lambda x:chr(ord(x)-22),"hnd/goJ/e4h1foWDhYOFiIZ+f3l1e4R5iI+Gin+FhA==".decode('base64')))+"}"

フラグ

KLCTF{paillier_homomorphic_encryption}

あとがき

decrypt the message (crypto 700)が解けていないので誰か教えてください。

padding oracleかなぁと思ったら500しか返ってこなかったので諦めて投げました。