読者です 読者をやめる 読者になる 読者になる

TERRY's Note

CTF関連、解いた問題、勉強の記録などなど

SECCON 2016 まとめ

SECCON 2016 CTF Forensics

各問題のWriteupをまとめとく
随時追加予定

Memory Analysis (Forensics 100)
SECCON 2016 Online CTF Writeup - Memory Analysis - Qiita
Volatilityというツールを使ってメモリフォレンジックをやってみよう問題
このサイトが参考になった
「Volatility Frameworkを使ったメモリフォレンジック」と言うハンズオンに参加させて頂きました。 | Developers.IO

forensics 問題メモ

CTF Forensics

簡単なforensics系の問題をいくつかメモ

CSAW CTF 2016 - evidence.zip

github.com
stringsで一発
逆から読むとFLAGになる

CSAW CTF 2016 - Clams Don't Dance

github.com
解法1
Autopsyで開いてみてみる
MaxiCodeというバーコードの一種が発見できる

解法2
foremostコマンドでファイルをバラしてみる
中にあるpptxファイルを解凍して、MaxiCodeを発見できる
こういったファイルを一旦解凍して見るのは重要かも

バーコードリーダーは以下のサイトが便利
色々な形式のバーコードを読んでくれる
ZXing Decoder Online

ICE CTF 2016 - Audio Problems

github.com
スペクトラムアナライザーで周波数を見るとそこに文字が書いてあるという
ブラウザツールがあったので、メモしておく
Spectrum Analyzer | Academo.org - Free, interactive, education.

EasyCTF 2015 - A Picture is Worth s Thousand Words

github.com
たくさんあるファイルの中から適切なファイルを探す問題
ファイルの集計には以下のコマンドが便利

$file * | awk '{print $n}' | sort | uniq -c

fileコマンドを実行した際の結果のn番目にある文字列を並べて
uniqコマンドでそれらの種類を列挙している

Steganography 1 - SECCON 2015 Online CTF

SECCON 2015 ONLINE CTF CTF Stegano

Steganography問題の練習をしたのでメモ
今回はSECCON 2015 ONLINE CTFのSteganography1を解いた

内容はここに公開されている
github.com


SECCONの他の問題も解いたらあげるかもしれない

問題文

Find image files in the file
MrFusion.gpjb
Please input flag like this format-->SECCON{*** ** **** ****}

問題のファイルはここからダウンロードできた

binwalkやバイナリエディタで見てみると、いくつもの画像ファイルが連結されていることが分かった

これはABCTFでやった問題と同じ方法で解けるぞ!とテンションが上がる
埋め込まれたファイルはforemostコマンドで分割出来るので、実際にやってみる

$ foremost MrFusion.gpjb

出てきたoutputを見てみると合計12枚の画像ファイルが出現
文字らしきものが書いてあるがよく分からない
数字とアルファベットが書いてあるものがあるが、下のようによく分からない画像もあった
f:id:T3RRY:20160802170756p:plain

もういちどバイナリエディタで調べてみる
確認できた画像ファイルは15枚
foremostによる出力が3枚足りなかったことに気づく

今回埋め込まれている画像の種類は、PNG,JPEG,BMP,GIFの4種類で
それぞれのヘッダの先頭に来るバイナリ(マジックナンバーと呼ばれるもの)は以下の通り

PNG : 89 50 4E 47
JPEG: FF D8
BMP : 42 4D
GIF : 47 49 46 38

ここにもっと詳しく書いてある
qiita.com

何故かは分からないが、BMP形式のファイルがforemostで上手く切り出せていなかった……

これぐらいなら自分でやれそうだと決意

上記のバイナリが出現するまでの範囲で切り取って、1つずつ復元していく
多分もっと上手いやり方があるのだろうが、くそざこなので仕方ない
f:id:T3RRY:20160802172016j:plain

結果画像を上手く復元できた
そこから画像に書いてある文字を読み取って、FLAGを入手
やり終えた後に気づいたが、拡張子がヒントになっていた

便利コマンド集

ツール類 CTF

ABCTFに参加した際に調べたり、他の人のWriteupを読んで知ったコマンドをメモ
(実際に使用したマシンはUbuntu 16.04)

base64エンコード、デコードを行う(いちいちwebで操作しなくて済む)
echoでそのまま出力することが出来る

$ echo sample | base64
c2FtcGxlCg==
$ echo c2FtcGxlCg== | base64 -d
sample

URLを与えて、いろいろ情報が見れるコマンド

$ curl http://sample.com               //コンテンツを表示
$ curl --help http://sample.com        //httpのヘッダを表示
$ curl -u user:pass http://sample.com  //ユーザ認証
$ curl -H 'Sample: sample=hoge'        //HTTPリクエストのヘッダを指定する(Cookieも指定出来たりする)
$ curl -b sample=hoge                  //Cookieを送る

ヘッダとコンテンツを同時に表示するには-D-オプションを使う。

  • binwalk

バイナリ解析ツール
ファイルを渡すと、中身に埋め込まれてるファイルがあるかなどを見つけてくれるみたい

$ binwalk sample_file
  • foremost

ファイルの中に埋め込まれたファイルを探し出して復元する
MoonWalk - ABCTFは上記のbinwalkとforemostを使う問題だった

$ foremost sample_file
  • xdg-open

ターミナルからファイルを開くコマンド
CTFとはあまり関係ないが、地味に便利だと思ったので

$ xdg-open sample_file

AES MESS - ABCTF

ABCTF CTF Crypto

ctftime.org

問題文

We encrypted a flag with AES-ECB encryption using a secret key, and got the hash: e220eb994c8fc16388dbd60a969d4953f042fc0bce25dbef573cf522636a1ba3fafa1a7c21ff824a5824c5dc4a376e75
However, we lost our plaintext flag and also lost our key and we can't seem to decrypt the hash back :(.
Luckily we encrypted a bunch of other flags with the same key. Can you recover the lost flag using this?

AESとは暗号化と復号に同じ鍵を用いる共通暗号方式の一種である

AESにはいくつかのモードがあって、今回はAES-ECBというモードで暗号化を行ったらしい
Wikipedia:暗号利用モード

それによって得られた暗号文はあるのだが、鍵が分からない
そのため、このページを利用して平文を復号するというのが今回の問題
リンク先には、同じ鍵を利用して暗号化された、平文と暗号文の組がいくつも並んでいる

実はAES-ECBというのは平文をブロック毎に区切り、独立して処理を行うモードらしく
暗号文のブロックが一致するものは、平文のブロックも一致している

与えられた暗号文をブロック毎(128bit毎)に分割する
e220eb994c8fc16388dbd60a969d4953
f042fc0bce25dbef573cf522636a1ba3
fafa1a7c21ff824a5824c5dc4a376e75

何も考えずそれぞれのブロックをCtrl + Fで検索する
すると以下の平文が引っかかった

abctf{looks_like_gospel_feebly}:e220eb994c8fc16388dbd60a969d49536d896bd7d6da9c4ce3eac5e4832c2f64
abctf{verism_evg_you_can_break_ajugas}:528c30c67c57968fa131684d07c1fa9cf042fc0bce25dbef573cf522636a1ba3c0bd6ceeec8e817f1be7b09a9a8b0fb8
abctf{eocene_fazes}:b58b970036b3a521a314d06f1436863efafa1a7c21ff824a5824c5dc4a376e75

1ブロックは16文字なので

abctf{looks_like | _gospel_feebly} 
abctf{verism_evg | _you_can_break_a | iugas}
abctf{eocene_faz | es}

このように分割でき、それぞれ該当する部分をつなぎ合わせると
abctf{looks_like_you_can_break_aes}
となりFLAGが出現した

Yummi - ABCTF

CTF ABCTF Crypto

Cryptography問題
最初見たときは全く意味が分からなかった

Cryptoの発想力系の問題はかなり苦手な模様

Well this image means something and we need you to figure it out!

↓問題の画像ファイル
https://mega.nz/#!zscjkCLI!2h2V1WPmQxxukEaLfR-oIpGx1eiiVo_qRNm9HxauaSc
baconian.bmpというファイルがダウンロードされる

実はこのbaconianという名前自体がヒントになっていた

baconian cipherなどと検索すると手がかりをつかむことに成功した
ベーコンさんが作った暗号があるらしい
Bacon's cipher - Wikipedia, the free encyclopedia
f:id:T3RRY:20160801011857j:plain
※表に微妙な差異があるので注意

5文字のAとBからなる文字列をアルファベット1文字に対応させる暗号方式であることが分かった

そこで先ほどの画像を見てみると、
f:id:T3RRY:20160801011104j:plain
このように、黒と白のピクセルが10行9列で並んでいる

ベーコン暗号はAAAAAのようにAが5つ並ぶ暗号文はあるが、BBBBBのようにBが5つ並ぶ暗号文は存在しないので
黒がAに対応し、白がBに対応していることが分かる

さらに、必ず5bitの入力が必要なので、横には読めない事も分かる

左上から↓に読んでいくと、FLAGに復号に成功した

L33t H4xx0r - ABCTF

CTF ABCTF Web

Web系の問題
ctftime.org


以下のリンクが与えられる
http://yrmyzscnvh.abctf.xyz/web6/

CTFの問題でよくあるパスワードの入力ボックスとSubmitボタンのみのページが出現する

何はともあれソースを表示してみる
下の方に以下の文章を発見

<!-- source at source.txt -->

詳しい事はsource.txtを見れば分かるみたい
URLを以下のように変更して覗いてみる

view-source:http://yrmyzscnvh.abctf.xyz/web6/source.txt

PHPソースコードが出現した

<?php
	$FLAGWEB6 = (file_get_contents("flag.txt"));
	$PASSWORD =  (file_get_contents("flag.txt")); //haha


	if(isset($_GET['password'])){
	
	if(strcmp($PASSWORD, $_GET['password']) == 0){
			$success = true;
		}
		else{
			$success = false;
		}

	}
	else {
		$success = false;
	}
?>

正解PASSWORDがFLAGになっていて、$_GETで入力されたパスワードを取得
strcomp()で二つを比較して、一致している場合は成功としている

色々と調べてみたところ、この部分に問題があることが分かった

if(strcmp($PASSWORD, $_GET['password']) == 0){

$_GETというのは、URLからデータを受け取るメソッドなのだが
passwordとして配列なんかを渡すと、strcmp()で比較した場合NULLを返す
さらに、==で比較した場合は

NULL == 0

をtureとするらしい

これらを利用してURLに以下のように記述したら、FLAGが出現した

http://yrmyzscnvh.abctf.xyz/web6/?password[]=sample