2014年12月26日金曜日

Advent Calendar CTF 2014 Write-upのまとめ


ぼっちちーむhorityで参加しました。

170ポイントの25位でした。

アドベントカレンダーっぽい順位で大変縁起が良いですね。

pwnとrevは苦手なのでほとんど触っていません。

それではwriteupを見てみましょう。

Write-ups


(順不同、チームは推測です)

ytokuさん(チーム:ytoku)
https://wiki.mma.club.uec.ac.jp/ytoku/CTF/Writeup/AdventCalendarCTF2014

ShiftCropsさん(チーム:tuat_mcc)
http://blog.shift-crops.net/?cat=32&paged=1

st98さん(チーム:omakase)
https://st98.github.io/diary/posts/2014-12-26-adctf.html

hhc0nullさん(チーム:hhc0null)(pwnable only)
https://gist.github.com/hhc0null/663697b255af29278abf

しおあめさん(チーム:candies)
http://sc123.hatenablog.jp/entry/2014/12/26/001342

志穂さん(チーム:Ellipse)
http://shiho-elliptic.tumblr.com/post/106148779474/advent-calender-ctf-2014-writeup

yagihashooさん(チーム:chikuwa)
http://qiita.com/yagihashoo/items/f0e08ac7ed9f727eed64


大変参考になりますね。

感想


day24のregexp quiz、sudo -u flagman lessでなんとかしたらいいというところまで気づいていたんですが、ずっとexec bash -c "/bin/sh…"で作ったリバースシェルをnetcatで受けて何とかしようとしていたのがとても悔しいです。

なんとかならないんですか?!

socatとかexpectとか初めて聞いたものをプロは当然のように使っているし、なんというか、linuxの基礎から勉強し直しという感じです。

まとめ


開催中のCTFのwriteup(やsolver)をpastebinに貼り付けるような奴は何をやってもダメ
http://pastebin.com/6tShfuju
http://pastebin.com/P0QP4jX4
http://pastebin.com/nWNY5Uyz
http://pastebin.com/iAbafnc6

2014年8月12日火曜日

社会人のための趣味CTFまとめ

DEFCONにセキュキャン…
夏の日差しのように若きセキュリティ人材の活躍が眩しい今日この頃、職場や家族の冷ややかな視線を背中に受けながら、冷房いらずでフラグを探している社会人趣味CTF初心者の皆様、いかがお過ごしでしょうか。

通勤時間を使いスマホの小さな画面でwriteupを読み、なんとなく理解したようでも、いざ実戦となると歯も立たず…。

鬼の居ぬ間に過去問を解いてみても、それが直接得点になるわけではないのでモチベーションが続かない…。

だからといって、易々と教えを乞うのはプライドが許さない…。

社会人趣味CTF初心者が、小さな小さな人権と、問題を解いた大きな喜びを得るには、当然ながら「自分で問題を解く」しかありません。

そこで、社会人でもスキマ時間を使って参加でき、さらにランキングがあってモチベーションが維持しやすい常時開催されているタイプのCTFを、私の主観を交えてまとめてみました。


常時開催のオンラインCTF(順不同)


私がCTFに出会ったサイトです。幅広いジャンルで出題されています。Villager Bは登竜門と言った感じでしょうか。

ユーザが問題を投稿できる珍しいCTF。問題を投稿すると、新着情報がたくさん並んで楽しいです。

最近のアップデートでwriteup投稿機能が付きました。WEBの問題が充実している印象です。無意味なブルートフォースはやめましょう。

日本の強豪チームEpsilonDeltaのCTF。ROPの問題が充実している印象です。特にROP Challenge1~4はステップアップ形式で学べていい感じです。

賛否両論ありますが、全体的に超入門者向けで差別化できています。最近更新されていないのでもう飽きたのかもしれませんね。
 

さまざまなジャンルの問題が結構な頻度で追加されています。writeupを送るとコインがもらえて、そのコインを消費してヒントがもらえます。

pwnだらけのようです。いつかやります。

問題集がいくつかあって、その中でレベルアップしていくようです。いつかやります。

ざっと見た感じいろんなジャンルがありそうです。デフォルトの猫のアイコンかわいいですね。
※mageさん情報ありがとうございます!(8/12追加)


その他役立つサイト(順不同)


CTFのポータルサイト。チームのランキングやCTF開催情報は常にチェックしておきたいですね。

ROP周辺のテクニックを初歩的なものから応用的なものまで詳細に解説されています。大変お世話になっております。

過去のいろんなCTFの問題がまとめてあります。

過去のいろんなCTFの問題とwriteupがまとめてあります。pullリクエストを送るかIssueを上げるとwriteupに追加してもらえるみたいです。

「ctf writeup」とかでググればwriteupがたくさん出てきます。


おわりに


セキュリティエンジニアでもない私のような社会人にとって、特に家庭がある場合、期間限定で開催されるCTFは参加しにくいものです。

貴重な休日にパソコンを開き、いざCTF参戦しようものなら
「また旗取りゲームか」「家族とフラグどっちが大切なんだ」「CTFで飯食えるのか」
などと言った迫害を受けるのが落ちです。

上記のようなサイトがより活発になると、うれしいですね。
そのためには、ユーザ側も積極的に盛り上げていかないとなぁ、と感じます。

他にもこんなのあるよー!などあれば、是非まとめておきたいので、ご連絡頂けるとありがたいです。

良きCTFライフを!

2014年6月18日水曜日

もしかして「糞言語」

経緯

ある日C++でプログラムを作成しているときに
「世の中にはどんな糞言語があるのだろう?」
という疑問がわきました。 

手始めにChromeのアドレスバーに「C++ くそ」と入力してみたところ、
「c++ 糞言語」といった驚きの提案をグーグル先生から受けたので
ちょっと面白くなって、試してみました。

プログラミング言語一覧 

プログラミング言語の一覧はwikipediaから拝借しました。
http://ja.wikipedia.org/wiki/プログラミング言語一覧

判定方法

プログラミング言語一覧から
{プログラミング言語名}+"くそ"
というキーワードを作成し、Google SuggestのAPIに投げ込みます。

具体的には下記のようなリクエストを投げます。
http://www.google.com/complete/search?hl=ja&output=toolbar&ie=utf_8&oe=utf_8&q={プログラミング言語名}+くそ 
すると、検索ワード候補がxmlで返ってくるので
その中に"糞言語"という文字列を含めば糞言語と判定しています。 

作成したスクリプト(kusogengo.py)

import urllib
import re

def getlang():
    s = unicode(urllib.urlopen('http://ja.wikipedia.org/wiki/プログラミング言語一覧').read(),'utf-8')
    return re.findall(r'<li><a.*?>(.*?)</a></li>',s)

for l in getlang():
    res = urllib.urlopen((u'http://www.google.com/complete/search?hl=ja&output=toolbar&ie=utf_8&oe=utf_8&q=%s くそ'%l).encode('utf-8')).read()
    if '糞言語' in res:
        print u'%sは糞言語'%l
    #else:
    #    print u'%sは糞言語ではない'%l

実行結果

>kusogengo.py
Cは糞言語
C++は糞言語
C@は糞言語
HSPは糞言語
Javaは糞言語
JavaScriptは糞言語
Objective-Cは糞言語
Perlは糞言語
PHPは糞言語

まとめ

C@とかそもそも知らないし、個人的にはちょっと誤判定があるように見えます。
皆さんの好きな言語は糞言語でしたか?

2014年6月12日木曜日

CTF各位

periodic cipher

crypto (1pt)

09,39,2f,1f,35,32,0c,42,09,35,17,63,4c,09,15,19,0d,67,39,67,63,5a,51,63,4b,3e,4d,66,16,01,35,0e,19,3f,3e,6a,2f,1f,44

2014年3月5日水曜日

DEFKTHON CTF 2014 Write-up

DEFKTHON CTF 2014 にちょろっと参加したのでお昼休みを利用して興味深かったもののみWriteup。

(先にSECCONのWriteup書けという声が聞こえてきそうですが、
既にたくさんの素晴らしいWriteupをスーパーなこわい方々が書いておられるので遠慮しておきます…)

Web 200

Auth Me In

最初SQLインジェクションをいろいろ試してみたけどだめだった。

もしかしてNoSQLかなぁ…

?userid[$ne]=a&password[$ne]=a

flagが表示されてしまった。

Web100が全然ダメだったので、拍子抜けでした。


Reversing 200


elf。

IDAで見てみると、forkして生成した子プロセスに数字を渡して、
子プロセスがその数字からflagを生成しているぽい。

ただし、子プロセスが自身のプロセスIDを求めてくるので、psで確認してから入力。

子プロセスはIDが正しいことを確認した後、文字列を生成して表示するのだが、

if(1==0) printf("%s",flag);

のような感じになってしまっているので、if(1==1)となるようにgdbでスタックの値を書き換えたらflagが表示された。

Rev100が全然だめだったので、拍子抜けでした。

Reversing 300


exe。

バイナリエディタで見てみると、なんだかpython臭漂う内容だった。

動かしてみると、C:\Users\ユーザ\AppData\Local\Temp配下に_MEIXXXXX(X:数値)フォルダを生成してそこにpythonのdllやらなんやらを置いていた。

ググってみたら、pyinstallerがそういう動きらしいので、さらにぐぐってpyinstallerをextractするスクリプトを見つけた。


extractすると、pythonソースが見れた。
#AJIN ABRAHAM | OPENSECURITY.IN 
from passlib.hash import cisco_pix as pix
import sys,base64
user=""
xx=""
if(len(sys.argv)>1):
     x=sys.argv[1]
     hashus = pix.encrypt("DEFCON14-CTF-IS", user=x)
     z=[89,86,69,121,100,82,69,103,98,47,48,103,80,71,77,121]
     for zz in z:
          xx+= chr(zz+(275*100001-275*1000-27225274))
     hashgen = pix.encrypt("DEFCON14-CTF-IS", user=base64.decodestring(xx))
     if(hashgen==hashus):
          print "Oh Man You got it! But :( ===>    " + str(base64.encodestring(base64.decodestring(xx)))
     else:
          print "Naaaaaaa !! You are screweD"
else:
     print "Password !!"
やってることは
・zから生成されるbase64文字列xxをデコードしたものをpix.encryptで暗号化したもの
・引数(argv[1])をpix.encryptで暗号化したもの
が等しいかどうかをチェックして、等しければxxをbase64デコードしてbase64エンコードしたもの(=xx)を表示している。

xがb64decode(xx)と同じであれば良いので、下記のスクリプトでxxを作ってdecode。
from base64 import b64decode
z=[89,86,69,121,100,82,69,103,98,47,48,103,80,71,77,121]
xx = ''
for zz in z:
    xx+= chr(zz+(275*100001-275*1000-27225274))
print b64decode(xx)
出てきたものがflagだった。

まとめ

上記以外で解けたのはmisc200と300、recon100でした。

スコアボードを見るとseccon勢もちらほらでしたね。

Recon以外のジャンルは100点の問題が僕の頭ではサッパリで、
逆に他の問題があっさり解けてしまうという感じでした。

インド人怖い。

来年のsecconに向けて精進したいと思います。

2013年10月9日水曜日

RXでアセンブラ短歌

SECCONで解けなかった問題。

RXでアセンブラ短歌(プログラミング:100pt)


下記の短歌を詠んだ結果、出力される文字列を答えよというもの。

FB 7E 67 6D 62
FB 62 15 08 0C 65 03
FC 37 67 7E A7
66 11 66 43 66 55 03
EF 02 75 60 FF 67 01

RXというのはルネサスというメーカが出しているマイコンファミリの事らしい。

RX ファミリ | ルネサス エレクトロニクスhttp://japan.renesas.com/products/mpumcu/rx/index.jsp

知らなかった。


RXとして動かす方法はいろいろあるみたいだけど、自前でgccやgdbをRX向けにmakeする方法がなかなかうまくいかなかった。

結局、KPIT GNU Tools(http://www.kpitgnutools.com)というところからGNURX v13.01 Linux Tool Chainをダウンロードした。


短歌をアセンブラソースファイルに書く
$ cat tanka.s
.section .text
.global _main
.type _main, @function
_main:
.byte 0xFB
.byte 0x7E
.byte 0x67
.byte 0x6D
.byte 0x62
…以下略

続いてrx-elf向けのgccでコンパイル
$ rx-elf-gcc tanka.s -o tanka.o

rx-elfとして実行する
$ rx-elf-run ./tanka.o
rene

答え(多分):rene


ルネサス(renesas)の頭4文字だということであれば納得。

また、短歌を書き込んだバイナリをobjdumpで見てみると、0x626d67と0x650c0815のxorを取って出力しているっぽい。0x656e6572はリトルエンディアンで"rene"。
$ rx-elf-objdump -b binary -m rx -D tanka
tanka:     ファイル形式 binary

セクション .data の逆アセンブル:
00000000 <.data>:
   0: fb 7e 67 6d 62                 mov.l #0x626d67, r7
   5: fb 62 15 08 0c 65             mov.l #0x650c0815, r6
   b: 03                             nop
   c: fc 37 67                       xor r6, r7
   f: 7e a7                         push.l r7
  11: 66 11                         mov.l #1, r1
  13: 66 43                         mov.l #4, r3
  15: 66 55                         mov.l #5, r5
  17: 03                             nop
  18: ef 02                         mov.l r0, r2
  1a: 75 60 ff                       int #255
  1d: 67 01                         rtsd #4


実行や逆アセンブルできる環境を整えるまでが大変だった。

2013年10月6日日曜日

SECCON 2013 福岡大会 Write-up

SECCON 2013 福岡大会にチームINFOGRAMとして参加してきました。

3人チームで出場するはずでしたが、チームメイトの1人が大会直前で脱臼したので、2人で挑みました。

結果、なぜか優勝してしました。

Write-upというものを書くのが通例みたいなので、解けた問題だけ書きたいと思います。

どっち派?(その他:100pt)


最初の正解者でした(たぶん全チーム中最初のポイントであったとも思う)。

下記の文字列が与えられた。
jj jlk_hjljh_hjlhjl hklhkl_kljklj_kkljhlj_hjl_hjljh llhjj_kljh_jlkh
jとkとlとh…これviや…(ここまで5秒)

「j」を「↓」、「k」を「↑」、「h」を「←」、「l」を「→」に置き換えた
↓↓ ↓→↑_←↓→↓←_←↓→←↓→ ←↑→←↑→_↑→↓↑→↓_↑↑→↓←→↓_←↓→_←↓→↓← →→←↓↓_↑→↓←_↓→↑←
そのまま右手にペンとノートを持って人間コマンド入力したら



最初は「I uSE EmAcS Too」やら「IuSEEmAcSToo」をsubmitしていたが通らなかった。
最終的にアンダースコアを入れて正解だった気がする

答え(確か):I u_S_E E_m_A_c_S T_o_o

ちなみに僕はvi派です。Emacsはよく知りません。


decrypt(その他:100pt)


これも最初の正解者でした。

下記の文字列が与えられた。

Szylrow lfw Xbzk hc z lozahlhqjzb qrlaqqo cyqol kwjwozbbm ybzmwa tm sfhbaowj, pfwow lpq lwzuc wzsf fzgw z xbzk (qo qlfwo uzoiwo) zja lfw qtvwslhgw hc lq szylrow lfw qlfwo lwzu'c xbzk, bqszlwa zl lfw lwzu'c "tzcw," zja tohjk hl czxwbm tzsi lq lfwho qpj tzcw. Wjwum ybzmwoc szj tw "lzkkwa" tm ybzmwoc hj lfwho fquw lwoohlqom; lfwcw ybzmwoc zow lfwj, awywjahjk qj lfw zkowwa orbwc, qrl qx lfw kzuw, uwutwoc qx lfw qyyqchlw lwzu, qo "hj vzhb". (Qjw gzohzlhqj qx lfw kzuw hjsbrawc z "vzhb" zowz hj zaahlhqj lq lfw xbzk qj wzsf lwzu'c lwoohlqom.)
Sqjkozlrbzlhqj!
Lfw zjcpwo hc CrtclhlrlhqjShyfwoHcWzcm

換字式暗号や…(ここまで2秒)。

Capture the Flag is a traditional outdoor sport generally played by children, where two teams each have a flag (or other marker) and the objective is to capture the other team's flag, located at the team's 'base,' and bring it safely back to their own base. Enemy players can be 'tagged' by players in their home territory; these players are then, depending on the agreed rules, out of the game, members of the opposite team, or 'in jail'. (One variation of the game includes a 'jail' area in addition to the flag on each team's territory.)  Congratulation! The answer is SubstitutionCipherIsEasy
答え:SubstitutionCipherIsEasy

訳:換字式暗号ってカンタン!


2012年4月27日11時08分54秒に作成されたエントリは?(フォレンジック:100pt)※表題うろ覚え


ファイルが与えられた。

http://sites.google.com/site/horityctf/home/files/Filesystem001.bin

バイナリエディタで開いてみたらjpgとかファイル名っぽいのとかいろいろ書いてある。



ダンプファイルかと思ってmountを試してみたけど「そんなフォーマット知らん」って言われてだめだった。

頻出する「2E 20 20 20 20 20 20 20」とかでググってたら下記のページに行き着いた。

http://pierrelib.pagesperso-orange.fr/filesystems/fat16.html

どうやらFATらしい。それがわかっていろいろやってみたけど、結局mountできなかった。

タイムスタンプがわかればよかったので、上記サイトの"The DOS Date-Time format"の表を参考に「2012年4月27日11時08分54秒」を変換してみた。

年(1980年から数えて) 7bit : (2012-1980) = 32 => 0100000
月 4bit : 4 => 0100
日 5bit : 27 => 11011
時 5bit : 11 => 01011
分 6bit : 8 => 001000
秒(2倍する) 5bit : (54/2)= 27 => 11011

これをつなげて目的のタイムスタンプ「40 9b 59 1b」を得た。
リトルエンディアンにして検索したら1つだけヒットした。



きっとこれ(Panda.jpg)だと思ってsubmitして正解

答え:Panda.jpg

他のチームの解き方を聞くと、stringsして出てきた文字列でブルートフォースしてもよかったみたい(一定時間のロックアウトを恐れなければ)。


パスワードを探せ(バイナリ:100pt)


バイナリファイルが与えられた(実際の出題は拡張子付きのstamp.exe)。


起動すると文字列がいぱーい。


stringsでは見つからなかったので、パスワードを探すべくおもむろにollydbgを起動。

怪しいところを探していたら"TextOutA"なる関数がループで呼ばれていた。



それっぽい文字を1文字ずつ出力していた。引数のY座標は変化しないのに、X座標の方はバラバラだった(さらにもう1つループがあって、そっちはお邪魔文字をスタンプするループだった)。

「Flagを1文字ずつ、順番はバラバラに1行(同じY座標)に表示」って処理かなぁと超閃きをかまして、ループ終了後にブレークを置いて画面を確認した。


おぉ、当たってた。

答え:ST4MPS3CURITY


まとめと感想

解けたのは以上の4問でした。

最初の正解者には1%の追加ポイントが入るので、最終スコアは402。

長野大会に比べたらヒドイですね。長野の2位3位のチームに申し訳ない気がします。

福岡大会の最終的なスコア↓



web系の問題はping打って「ふーん、なるほどね」しただけで全く手が出ませんでした。勉強しときます。

今回はC#の出番はなく、紙とペンが大活躍でした。

優勝するつもりはなかったのですが、優勝した以上は九州代表として全国で「ふーん、なるほどね(pingをうちながら」をかましてきます。

関係者の皆様、おつかれさまでした!