ぼちぼちCTF

CTF関連

TrendMicroCTF2017 Writeup

TrendoMicroCTF2017にshpxというチームで参加.
チームとしては300点取り133位.
私はForensicの100点問題を解いた.

Forensic100

output.pcapというファイルを渡されるので,Wiresharkで開いてみる.
f:id:mattun_mart:20170625140648p:plain

開いてみるとDNSのパケットのやり取りが入っている.
クライアント側から投げているDNSパケットを見てみると,ASfsbGivEQsT2aQPHzaB.gzpgs.trendmicro.co.jpのようドメイン名のAレコード要求するようなパケットをサーバに投げまくってる.
ここ怪しい...
ホスト名だけ毎回変わっているのでこの部分でサーバーに情報を送っているらしい.
DNSトンネリングってやつっぽい.

f:id:mattun_mart:20170625140828p:plain

scapyを使ってパケットからホスト名の部分だけ取り出してみる.

#!/usr/bin/env python
from scapy.all import *

def main():
  packets = rdpcap('output.pcap')
  for p in packets:
    if p['IP'].src == '192.168.16.153':
      temp =  p['DNS'].summary().split("\"")
      Dname = temp[1]
      temp = Dname.split(".")
      Hname = temp[0]
      sys.stdout.write(Hname)

if __name__ == '__main__':
  main()
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

これはBASE58でエンコードされた情報なので,BASE58でデコードする.

==Phrack Inc.==
                    Volume One, Issue 7, Phile 3 of 10
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
The following was written shortly after my arrest...
                       \/\The Conscience of a Hacker/\/
                                      by
                               +++The Mentor+++
                          Written on January 8, 1986
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
        Another one got caught today, it's all over the papers.  "Teenager
Arrested in Computer Crime Scandal", "Hacker Arrested after Bank Tampering"...
        Damn kids.  They're all alike.
        But did you, in your three-piece psychology and 1950's technobrain,
ever take a look behind the eyes of the hacker?  Did you ever wonder what
made him tick, what forces shaped him, what may have molded him?
        I am a hacker, enter my world...
        Mine is a world that begins with school... I'm smarter than most of
the other kids, this crap they teach us bores me...
        Damn underachiever.  They're all alike.
        I'm in junior high or high school.  I've listened to teachers explain
for the fifteenth time how to reduce a fraction.  I understand it.  "No, Ms.
Smith, I didn't show my work.  I did it in my head..."
        Damn kid.  Probably copied it.  They're all alike.
        I made a discovery today.  I found a computer.  Wait a second, this is
cool.  It does what I want it to.  If it makes a mistake, it's because I
screwed it up.  Not because it doesn't like me...
                Or feels threatened by me...
                Or thinks I'm a smart ass...
                Or doesn't like teaching and shouldn't be here...
        Damn kid.  All he does is play games.  They're all alike.
        And then it happened... a door opened to a world... rushing through
the phone line like heroin through an addict's veins, an electronic pulse is
sent out, a refuge from the day-to-day incompetencies is sought... a board is
found.
        "This is it... this is where I belong..."
        I know everyone here... even if I've never met them, never talked to
them, may never hear from them again... I know you all...
        Damn kid.  Tying up the phone line again.  They're all alike...
        You bet your ass we're all alike... we've been spoon-fed baby food at
school when we hungered for steak... the bits of meat that you did let slip
through were pre-chewed and tasteless.  We've been dominated by sadists, or
ignored by the apathetic.  The few that had something to teach found us will-
ing pupils, but those few are like drops of water in the desert.
        This is our world now... the world of the electron and the switch, the
beauty of the baud.  We make use of a service already existing without paying
for what could be dirt-cheap if it wasn't run by profiteering gluttons, and
you call us criminals.  We explore... and you call us criminals.  We seek
after knowledge... and you call us criminals.  We exist without skin color,
without nationality, without religious bias... and you call us criminals.
You build atomic bombs, you wage wars, you murder, cheat, and lie to us
and try to make us believe it's for our own good, yet we're the criminals.
        Yes, I am a criminal.  My crime is that of curiosity.  My crime is
that of judging people by what they say and think, not what they look like.
My crime is that of outsmarting you, something that you will never forgive me
for.
        I am a hacker, and this is my manifesto.  You may stop this individual,
but you can't stop us all... after all, we're all alike.
                               +++The Mentor+++
TMCTF{DNSTunnelExfil}

フラグゲット.
BASE58でエンコードされていることに気付くまでにかなり時間がかかった.

感想

全体的に難しかった気がするがpcapを解析するような問題初めて解けたのはうれしい.
就活終わったのでCTF関連の勉強時間増やしていきたい.

WhiteHat Contest 2017参加記

shpxというチームでベトナムのCTF WhiteHatContest2017に参加.
チームは200点獲得して76位.私は一問も解けなかった...
ということで簡単に感想でも.

昨年のSECCONからCTFは参加し始めたがCTFで一問も解けなかったのはこれが初めて.
かなり悔しいし,チームメンバーへの申し訳なさが半端ない.
CTFではフォレンジクスのdai lai lakeとREのTuy Hoaに主に取り組んでいた.
dai lai lakeは,apkファイルを解析してflagを見つけ出すような問題.
apkファイルの中身をデコンパイルしたりしてflagを探したりしていたが結局わからず.
あぁ...apkファイル嫌いになりそう.
Tuy Hoaはパスワードの入力を求められるバイナリを解析してflagをゲットする問題.
アセンブリ読んでパスワードチェックの仕組みはわかったのだが,そこからパスワードを予測する方法が思いつかず.

最近空き時間にセキュリティ関連の本を読んだりはしているけどCTF関連のWriteup読んだりや過去問を解いたりということはできてない.
やはりCTFの点取るならやっぱりCTF向けの勉強をするべき.
CTFと実際のセキュリティは同じようで異なる点も多いってのは実感してきた.
バランスと両者をどうつなげるかが重要な気がする.
あと,今はとっつきやすそうな問題から手を付けてるから一度一つの分野を重点的にやったほうがよさそう.
どの分野にするか...

angstromCTF 2017 Writeup

4月下旬にangstromCTF2017にshpxというチームで参加.
1週間という長丁場なCTFだったので,空いてる時間を見つけて参加した感じ.
チームとしては780点獲得して15位だった.
私は8問解いて310点獲得.(そのうち1問はチームメンバーと協力して解いた)

f:id:mattun_mart:20170503034423p:plain

The Beginning(crypto 10)

次のような問題文が書かれている.

Pxevhfx mh tgzlmkhfvmy. Px ahix rhn xgchr hnk vmy. tvmy{utvd_mh_max_ynmnkx}.

ただのシーザー暗号.rot7で復号できる.

Welcome to angstromctf. We hope you enjoy our ctf. actf{back_to_the_future}.

flagはactf{back_to_the_future}.

Knock Knock(crypto 30)

一定の長さの連続したノック音が入った音声ファイルを渡される.
ノック音の回数は1~5であり,それぞれ区切られている.
答えから言うとtap codeという暗号.
次のtap code tableに従ってテキストの各文字が一定の長さの連続したノック音2つに変換されている.
縦の数字が1回目のノック音の回数,横の数字が2回目のノック音の回数.

0 1 2 3 4 5
1 A B C/K D E
2 F G H I J
3 L M N O P
4 Q R S T U
5 V W X Y Z

音声ファイルのノック音をカウントしてみると以下のようになる.

2 3 1 5 3 1 3 5 3 2 1 5 3 5 3 1 1 5 1 1 4 3 1 5

一文字は2つのノック音に暗号化されているので,上記の表に従って復号してみると次のようなメッセージが得られる.

文字番号 1回目 2回目 復号結果
1 2 3 H
2 1 5 E
3 3 1 L
4 3 5 P
5 3 2 M
6 1 5 E
7 3 5 P
8 3 1 L
9 1 5 E
10 1 1 A
11 4 3 S
12 1 5 E

flagはHELPMEPLEASE.
最初はモールス信号かと思った.

Substitution Cipher(crypto 60)

次のような暗号文が渡される.

vfauedwyedmtlwylwnawyjfdzltqilqdezfntmwyewyejzettjedmwyfjlzettjyeilwfplxaenmlmpvbldzqwyxadjzyfjxfddemfqwvfavfatwzlqdplnxqyeilexnlewlnnljsfdjqpqtqwvwyedvfauedsfjjqptvoewyfbvfazllsofnjedwqexfedmvfauanjlwylbenqdljvfayeilwyewtaranvvfayeilwyltaranvfodfwcdfzqdxzyewqcdfzwyewjedwqexfjmlewyzyqtlwnexqusnfpeptvjeilmtqiljedmbvlrqjwldulzyqtlxnfwljgaledmqdufbsnlyldjqptlwfvfajeiljtqiljvfamfdwzedwwylwnawyplueajlmllsmfzdqdsteuljvfamfdwwetcepfawewsenwqljvfazedwblfdwyewzettvfadllmblfdwyewzettzlajlzfnmjtqclyfdfnufmltfvetwvzlajlwyljlzfnmjejwylpeucpfdlwfetqoljsldwmloldmqdxjfblwyqdxvfaajllbejesaduytqdlqyeildlqwylnwylwqbldfnwylqdutqdewqfdwflrsteqdbvjltowfebedzyfnqjljedmjtllsjadmlnwylptedclwfowylilnvonllmfbqsnfiqmlwyldgaljwqfdjwylbeddlnqdzyquyqsnfiqmlqwqmnewylnvfahajwjeqmwyedcvfaedmzldwfdvfanzevfwylnzqjlqjaxxljwvfasqucasezlesfdedmjwedmesfjwlqwylnzevqmfdwxqilemebdzyewvfawyqdcvfanlldwqwtlmwf{olzxffmbldhljjls}


単一換字式暗号なので頻度分析をして地道に解読していけば良い.
こちらを使いながら頻度分析し,vimを使って予測したアルファベットを大文字に置換していった.
文字出現頻度分析ツール - instant tools
例えばこの問題の場合,lの出現頻度が一番多いのでEに対応しており,次に出現頻度の高いwはTに対応していると予想.
TとEがわかれば,出現率の高いTyEの文字列はTHEである可能性が高いので,yはHに対応していると予想.こんな感じで分析結果や英文によく出る単語などの知識を駆使して頑張る.

頑張って解読した結果は次の通り.

youcanthandlethetruthsonweliveinaworldthathaswallsandthosewallshavetobeguardedbymenwithgunswhosgonnadoityouyoultweinbergihaveagreaterresponsibilitythanyoucanpossiblyfathomyouweepforsantiagoandyoucursethemarinesyouhavethatluxuryyouhavetheluxuryofnotknowingwhatiknowthatsantiagosdeathwhiletragicprobablysavedlivesandmyexistencewhilegrotesqueandincomprehensibletoyousaveslivesyoudontwantthetruthbecausedeepdowninplacesyoudonttalkaboutatpartiesyouwantmeonthatwallyouneedmeonthatwallweusewordslikehonorcodeloyaltyweusethesewordsasthebackbonetoalifespentdefendingsomethingyouuseemasapunchlineihaveneitherthetimenortheinclinationtoexplainmyselftoamanwhorisesandsleepsundertheblanketoftheveryfreedomiprovidethenquestionsthemannerinwhichiprovideitidratheryoujustsaidthankyouandwentonyourwayotherwiseisuggestyoupickupaweaponandstandaposteitherwayidontgiveadamnwhatyouthinkyoureentitledto{fewgoodmenjessep}

flagは{fewgoodmenjessep}.

単一換字式暗号は頻度分析で解読できることは知っていたが,実際にやったのは初めて.
途中で一部文字の対応が間違っていて苦戦した.
結構慣れが必要な気がする.

USB Encryption(forensics 30)

DEFUND.dmgという名前のdmgファイルを渡される.
7zipで中身を見てみるとDEFUND.dmg\Thumbs.us\com1.{2227a280-3aea-1069-a2de-08002b30309d}\zᄆ요ᄚ\Dᄆ\の中にflag.txtがあった.
flag.txtの中にflagが書かれている.

flagはactf{not_quite_usb_encryption}.

最初はdmgファイルの中身をmacで見て,中に唯一入っていたUSBセキュリティソフトの名前がflagだと思って悩んでた.(ヒントに実際のソフトウェアとか書かれてたし...)

Image Trickery(forensics 50)

次のようなpngファイルを渡される.
f:id:mattun_mart:20170503041046p:plain

バイナリエディタに突っ込んで,bitimageを見てみると下のほうに規則的な模様がある.
画像の中に情報が埋め込まれてるっぽい.いわゆるステガノグラフィ―.
f:id:mattun_mart:20170503041008p:plain

Image Magickを使って画像をエッジ処理してみるとQRコードが出てきた.
f:id:mattun_mart:20170503040519p:plain

このままだと読み込めなかったのでImage Magickを使って2値化処理.
f:id:mattun_mart:20170503040549p:plain

このQRコードを読み込むと,次のURLが出てくる.
http://pastebin.com/S9De6WYA

このページにあるデータをBASE64でデコードするとdata URIsvgファイルが出てくるので,開くと画像の中にflagが書いてある.
f:id:mattun_mart:20170503040608p:plain

falgはactf{fa1L_F15H}

Document(forensics 60)

破損したessay.docxファイルを渡される.
ワードで開こうとしても破損していて開けない.修復もできない.
docxファイルはXML形式のファイルzipしたものなので,拡張子をzipに変更して中身を見てみるとessay.zip\word\document2.xmlの中にflagがある.

flagはactf{too_bad_for_zip_recovery}

Captcha1(web 70)

チームメンバーと一緒に解いた.

色が赤,青,緑色,形が四角,三角,円のいずれかの図形が散りばめられた画像.そして,特定の色,形の図形の数とpin番号を入力するフォームがあるページが表示される.(スクショ取るの忘れた...)
pin番号は3桁なので総当たりで破れる範囲.後は画像に表示された特定の図形の数をどうにかすればよい.
図形の数は間違った数が入力されてもまた同じ図形の数について問われるので,図形の数が当たるまで同じPINでリクエストを投げる.
これを001~999すべてのpinで試す.

チームメンバーがrubyで書いてくれた.図形の数は1~10の範囲で回した.

require ‘net/http’
require ‘uri’

# POST
(ARGV[0]..ARGV[1]).each do |pin|
 STDERR.puts ‘pin:’ + format(“%03d”, pin)
 10.times do |n|
   res = Net::HTTP.post_form(URI.parse(‘http://web.angstromctf.com:1342/’),{‘question1’ => n.to_s, ‘pin’ => format(“%03d”, pin)})
   unless res.body.include?(‘Bad’)
        STDERR.puts res.body
        unless res.body.include?(‘Wrong’)
          puts “flag get”
          exit(0)
        end
        break
   end
 end
end

PINの値は612.
flagはactf{comp_abstract_art_2F239B}

感想

割と多くの問題を解けたのは良かったが,得点の高い問題はまだなかなか解けない.
他に取り組んでいた問題としては,Broken PasscodeとかHeadphonesとか.
Broken Passcodeはapkファイル解析してAndroidManifest.xmlのmeta-dataの鍵っぽいのは見つけたけどそこからアプローチ法が全く分からず時間を浪費.
かなり粘着してたので解きたかったなぁ...
3月4月とCTFに出てみて思ったのは見切りも大事ということ.
結構ひとつの問題に粘着してしまうところがある.
あと今回pwnの問題をチームメンバーが一人でサクサク解いてしまったのすごい.というか彼強い.
就活中なのであまりがっつりCTFできないけど,pwn系も解けるように地道に頑張りたい.

VolgaCTF 2017 Quals writeup

VolgaCTF 2017 Qualsにshpxというチームで参加.
私は日曜に予定が入っていたため土曜のみ参加だった.
チームとしては700点,個人としては150点獲得し117位.
すでにwriteupは出ているが,自分のためにもwriteup書く.

VC (crypto 50)

A.pngとB.pngという画像を渡される.ここからフラグを探し出す.
A.pngとB.pngの差分を取ればフラグが出てくる.
ImageMagickコマンドラインツールで以下のコマンド実行し2つの画像の差分画像を生成.

composite -compose difference A.png B.png diff.png

次のような差分画像が生成され,その中にフラグがある.
f:id:mattun_mart:20170328012218p:plain

この問題他のチームメンバーが先に解いていたのに気づかず自分も解いていた.

Keypass (reverse 100)

入力したパスフレーズから鍵を生成するプログラムkeypassとaes-128-cbcで暗号化されたzipファイルflag.zip.encが渡される.
keypassでいろいろパスフレーズを入力してみると,生成される鍵に結構被りがあることがわかる.

  • ./keypass aa -----> BWf81zF%SdkxL*jL.
  • ./keypass aaaa -----> BWf81zF%SdkxL*jL.
  • ./keypass bbbb -----> BWf81zF%SdkxL*jL.

ここでおそらく生成される鍵のパターンはそこまで多くなく,総当たりでいけそうと予想.
とりあえずアルファベットと数字を使った4ケタのパスフレーズから鍵を生成して復号してみるとすぐに復号できた.
ただし,ヒントにOpenSSL 1.1.0eが使われていることが書かれているため,このバージョンを使用する必要がある.

# -*- coding:utf-8 -*-
from itertools import product
import subprocess

chars = 'abcdefghijklmnopqrstuvwxyz1234567890'
key_list = []
patterns = product(chars, repeat=4)
for pt in patterns:
	command = "./keypass " + ''.join(pt)
	key = subprocess.check_output(command.split(" "))
	if key not in key_list:
		key_list.append(key)
		key = key.strip()
		
		command = "openssl enc -aes-128-cbc -d -pass pass:\"" + key + "\" -in flag.zip.enc -out flag.zip"
		proc = subprocess.Popen(command.strip(" "), shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

		result = proc.stdout.read()
		proc.wait()

		if proc.returncode == 0:
			print "decrypt OK"
			print key
			break

あとは復号したzipファイルを解凍してフラグゲット.

$python decrypt.py
decrypt OK
\M)R<.DDe/:;d>JZP

$unzip flag.zip
Archive:  flag.zip
 extracting: flag.txt 

$cat flag.txt
VolgaCTF{L0ve_a11_trust_@_few_d0_not_reinvent_the_wh33l}

ちょっと試したらすぐに解けてしまったためあまり逆アセンブルしたコードを読んでいないが,鍵生成処理はパスフレーズの各文字のXORを取った値をseedとしてパスフレーズを生成しているらしい.

 4004e8: 48 0f be 07           movsx  rax,BYTE PTR [rdi]
 4004ec: 48 83 c7 01           add    rdi,0x1
 4004f0: 48 31 c2              xor    rdx,rax
 4004f3: 48 39 cf              cmp    rdi,rcx
 4004f6: 75 f0                 jne    4004e8 <__libc_start_main@plt+0x68>

結局256通りに絞られるみたい.

感想

その他にもAngry Guessting Gameなどにトライしていたが,reversing力全然足りてない感をかなり感じた.
少しずつレベル上げていきたい.