English version: Red Team Lounge CTF 2021 writeup (English version) - Qiita
概要
Red Team Lounge CTF 2021 (2021年7月31日 13:30~2021年8月2日 01:30 (JST)) (CTFtime.org) に1人チームで参加した。
(開催時間はスコアサーバに設置されていたカウントダウンの設定に基づく)
500点を獲得し、339チーム(正の点数を獲得したのは327チーム)中22位だった。
解けた問題、および解けたことになった問題とその時刻は以下の通りである。
Challenge | Category | Value | Time (JST) |
---|---|---|---|
Bad Developers | Reversing | 10 | 2021/07/31 13:45:52 |
Diffie Hellman | Crypto | 100 | 2021/07/31 14:05:24 |
Basic | Web | 10 | 2021/07/31 15:10:50 |
Expic | Forensics | 15 | 2021/07/31 15:28:13 |
WDigest | Windows | 50 | 2021/07/31 15:47:29 |
Manipulated | Forensics | 50 | 2021/07/31 16:12:58 |
The gate of ultimate success | Reversing | 50 | 2021/07/31 16:13:37 |
Welcome | Crypto | 5 | 2021/07/31 16:20:47 |
Triangle | Crypto | 10 | 2021/07/31 17:35:56 |
Ciphers Galore! | Crypto | 40 | 2021/07/31 18:03:41 |
Last Words | Crypto | 50 | 2021/07/31 18:15:46 |
Identifying an Attack | OSINT | 10 | 2021/08/01 00:44:55 |
Bites | Reversing | 50 | 2021/08/01 00:57:22 |
Where is this? | OSINT | 40 | 2021/08/01 20:16:56 |
Thanks for playing | OSINT | 5 | 2021/08/01 21:57:20 |
Feedback | CTF | 5 | 2021/08/01 23:02:31 |
解けた問題
Pwn
残念ながらこのジャンルからは1問も解けなかった。
Crypto
Welcome
以下の文字列が与えられた。
UlRMe0g0VkVfRlVOX1BMNFkxTkchfQ==
CyberChefでFrom Base64を適用することで、flagが得られた。
RTL{H4VE_FUN_PL4Y1NG!}
Triangle
以下の問題文とデータが与えられた。
My friend encoded the flag with XOR but forgot the key! He remembers that its a 4 byte key. Can you recover the flag?
133f29027034094a33253126395b3704
flagの先頭部分はRTL{
になっていると推測できるので、これと与えられたデータのXORをとることで、
keyの推定値
41 6b 65 79
が得られた。
このkeyの推定値と与えられたデータのXORをとることで、flagが得られた。
RTL{1_l3rNT_x0R}
Ciphers Galore!
以下のデータのURL (hastebin) が与えられた。
$&Es6a@I+v5;|`h_$)q?2Kq75w=p|%tK+)8K)K}d!b_l
問題名の「Galore」をググると、「たくさん」のような意味のようである。
CyberChefでROT47 (Amount=47)をかけてみると、
SUtDe2oxZGdjM190SXBnazBfdHlAMTEzZXgzXzN5P30=
という結果が得られた。さらにこれにFrom Base64をかけると、
IKC{j1dgc3_tIpgk0_ty@113ex3_3y?}
という結果が得られた。さらにこれにROT13(Amount=9)をかけると、flagが得られた。
RTL{s1mpl3_cRypt0_ch@113ng3_3h?}
Last Words
以下のデータのURL (hastebin) が与えられた。
n=654922591808399471401115531725039933804976416275178080902192760929946158327379913921397815675866572368514471928883646492843129515545704650288455484139194674085479767043433916059634120332033088959269854607488937394748966549930683612344765680930825877346853207413052755531377359101713133223003902598963694672505995923904179391456221568627581198379796103905853274401142025181753922563551760475421349438387207814101835728396617249777551918738205026251791041540304166035801169367444769632368098508148321283516990672280903943844076578831127878464804361185261171218008337510295988058766597378522306523707845029512326086281153969312238517561678149326216382068770238520736531273600941471546492734984885174688640769745572963612242607879009754765129567334064867941063826839593018197528692242502124648098963061951119350954396467735643056862091298259178844956622094028547135110211632557488448742742990287309014601421331198088078262672918791473250793328827598271675543610977104049017695062380578362377174224228163980223055437425220689053314587171763084816067718392663203432596767350691383811865855862699762433397509373202656517
e=65537
ct=100710438795162977079348743974088808865381156915931230652674830564884952723797964737417330704790990449847640350694313826907540645947517771309102468382620491151431303509245971254205327928401285858105844273322941744709730235138404791133855224230464330311543377527034287444040442497607564368033381652353025668428244301303066924437016815162803737278638329823899949834679835580778760115487417517224721370787073698165030607724383674378473550370840265887300696291636301457816942477342875386648871368111343762416276747522564143279926396047848536514023846050160848670498687478441942327283357707903465054287238235065476035197766241316080918681581228125031794197267118491412751434265211623073108630476746894061360362486334754179185179035203622586839918393560491482900365894224904151749064929247038688878617389856012413316816710758669316380134350637155478806193340543320655839127039864941782215970914222744836875559787971645305231571859542782671984468965485858145740868483956306860449187868403601170785547890022967337275595188765793071937500328605240827441496747925821120273130333043107613757070639870802278814019421139964349
このn
の値をRaspberry Pi上でwolfram
コマンドを用い、FactorInteger
関数で素因数分解をおこなったところ、
86842034747506493609419721799469420931995622862762177911235982167541270872531314416635530661571139759415845637249847122973461307626071732001202620839724983790638777821431490624281206999841752934471207639839705304729136564852048258975833304653350042975893538110232832319190920640420813884920174219068423676798778919245766035367660194191901644604977395931936301500921652573
の3乗という結果が出た。PrimeQ
関数でチェックしたところ、この数は素数であった。
これを用いて、
オイラーのφ関数 - Wikipedia
を参考にφ(n)を求め、RSA暗号と同様の復号操作を行った。
操作ログ
Python 3.8.2 (tags/v3.8.2:7b3ab59, Feb 25 2020, 23:03:10) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> n=654922591808399471401115531725039933804976416275178080902192760929946158327379913921397815675866572368514471928883646492843129515545704650288455484139194674085479767043433916059634120332033088959269854607488937394748966549930683612344765680930825877346853207413052755531377359101713133223003902598963694672505995923904179391456221568627581198379796103905853274401142025181753922563551760475421349438387207814101835728396617249777551918738205026251791041540304166035801169367444769632368098508148321283516990672280903943844076578831127878464804361185261171218008337510295988058766597378522306523707845029512326086281153969312238517561678149326216382068770238520736531273600941471546492734984885174688640769745572963612242607879009754765129567334064867941063826839593018197528692242502124648098963061951119350954396467735643056862091298259178844956622094028547135110211632557488448742742990287309014601421331198088078262672918791473250793328827598271675543610977104049017695062380578362377174224228163980223055437425220689053314587171763084816067718392663203432596767350691383811865855862699762433397509373202656517
>>> e=65537
>>> ct=100710438795162977079348743974088808865381156915931230652674830564884952723797964737417330704790990449847640350694313826907540645947517771309102468382620491151431303509245971254205327928401285858105844273322941744709730235138404791133855224230464330311543377527034287444040442497607564368033381652353025668428244301303066924437016815162803737278638329823899949834679835580778760115487417517224721370787073698165030607724383674378473550370840265887300696291636301457816942477342875386648871368111343762416276747522564143279926396047848536514023846050160848670498687478441942327283357707903465054287238235065476035197766241316080918681581228125031794197267118491412751434265211623073108630476746894061360362486334754179185179035203622586839918393560491482900365894224904151749064929247038688878617389856012413316816710758669316380134350637155478806193340543320655839127039864941782215970914222744836875559787971645305231571859542782671984468965485858145740868483956306860449187868403601170785547890022967337275595188765793071937500328605240827441496747925821120273130333043107613757070639870802278814019421139964349
>>> x = 86842034747506493609419721799469420931995622862762177911235982167541270872531314416635530661571139759415845637249847122973461307626071732001202620839724983790638777821431490624281206999841752934471207639839705304729136564852048258975833304653350042975893538110232832319190920640420813884920174219068423676798778919245766035367660194191901644604977395931936301500921652573
>>> phi = n * (x - 1) // x
>>> d = pow(e, -1, phi)
>>> res = pow(ct, d, n)
>>> hex(res)
'0x52544c7b315f6330756c645f7072306234626c795f6d346b335f746831355f616c30745f6834726433725f6e6578745f74316d332121212d65383266616337613738306637323537396334376236636530643562376664383265623631393265643635393439636134383533303962357d'
>>> exit()
得られた結果に対しCyberChefでFrom Hexをかけることで、flagが得られた。
RTL{1_c0uld_pr0b4bly_m4k3_th15_al0t_h4rd3r_next_t1m3!!!-e82fac7a780f72579c47b6ce0d5b7fd82eb6192ed65949ca485309b5}
Diffie Hellman
TCPサーバの接続情報が与えられた。
Tera Termで接続すると、BOBとALICEそれぞれについてpublic messageを送るように要求された。
それぞれ適当な値を送ると、メッセージが表示された。
g:5
p:23
Send your public message to BOB.Intercepted Alice's message: 4
4
Send your public message to ALICE.Intercepted Bob's message: 10
10
The message is encrypted.Bob sends message:@F^i&q%v+ *t'$!%+$tpw"v't#v"+&q!&*p'o
表示されたメッセージにCyberChefでXOR Brute Forceをかけることで、flagが得られた。
Key = 12: RTL{4c7d928f563796fbe0d5f1d094c348b5}
また、public messageとして0を2回送ることでも、flagが得られた。
g:5
p:23
Send your public message to BOB.Intercepted Alice's message: 4
0
Send your public message to ALICE.Intercepted Bob's message: 10
0
The message is encrypted.Bob sends message:RTL{4c7d928f563796fbe0d5f1d094c348b5}
RTL{4c7d928f563796fbe0d5f1d094c348b5}
Reversing
Bad Developers
テキストデータのURL (pastebin) が与えられた。
得られたデータをPythonのプログラムとして解釈すると、入力を1文字ずつ指定の値かチェックしていたので、
これを読み取ることでflagが得られた。
RTL{D0NT_D0_TH1S}
The gate of ultimate success
GoogleドライブのURLが与えられた。
アクセスすると、ファイルwe_start_with_basics.exe
が得られた。
TDM-GCCのobjdump
で逆アセンブルして読むと、main
関数内で
-
scanf
関数を用いて入力を読み込む -
strrev
関数を用いて読み込んだデータを加工する - データの各バイトに0x7bをXORする
という処理がみられた。
また、バイナリをチェックすると、出力用のメッセージと思われる文字列の近くに
/5:/)4+62/(46>):(82(:9
という文字列があった。
この文字列にCyberChefで0x7bをXORし、文字列を反転させることで、keyが得られた。
このkeyを問題文の指示通りRTL{}
で囲むことで、flagが得られた。
RTL{BASICSAREMOSTIMPORTANT}
Bites
何かのプログラムのようなテキストファイルdc9_bites.txt
と、
半角空白区切りで数字が並んだテキストファイルflag.txt
が与えられた。
dc9_bites.txt
をよく見てみると、何らかのスタックマシンを用い、
配列の添字の偶奇によってそれぞれ違う値をXORしているように見えた。
flag.txt
の内容にCyberChefでFrom Decimalを適用し、さらにRTL{
とXORをとると、最初の部分がMwMw
となった。
そこで、Mw
とXORをとることで、flagが得られた。
RTL{H4x_ByT3$$}
OSINT
Thanks for playing
以下の問題文が与えられた。
My friend told me that one of the CTF organizers left a note on twitter but I can't seem to find it. #RTLxHA
Twitterで#RTLxHA
で検索すると、以下のツイートが見つかった。
#RTLxHA 21 CTF is ending soon! Thanks everyone for playing, also thanks challenge creators for making the awesome challenges! https://t.co/1nSyluCJkr
— xentropy (@d4rckh) August 1, 2021
このツイート中に書かれているURL https://rtl-ctf.hackarmour.tech/secret
にアクセスすると、flagが書かれていた。
RTL{TH4NK2_F0R_PL4Y1NG}
Identifying an Attack
以下の問題文が与えられた。
Thehackerscrew are remotely executing arbitrary code through Apple’s bluetooth. Can you identify the CVE of the attack?
The CVE should be wrapped around RTL{}
「Apple Bluetooth CVE remove arbitrary code」でググったり、
CVE - Search CVE Listで「Bluetooth arbitrary code」で検索したりしたが、有効な結果は得られなかった。
「bluetooth remote code cve ios」でググると、
iOS 13.5 および iPadOS 13.5 のセキュリティコンテンツについて - Apple サポート (日本)
が見つかり、この中に以下の記述があった。
Bluetooth
対象となるデバイス:iPhone 6s 以降、iPad Air 2 以降、iPad mini 4 以降、iPod touch (第 7 世代)
影響:リモートの攻撃者によって任意のコードが実行される可能性がある。
説明:配列境界チェック機能を改善することで、領域外読み込みの脆弱性に対処しました。
CVE-2020-9838:ダルムシュタット工科大学 Secure Mobile Networking Lab の Dennis Heinze 氏 (@ttdennis)
しかし、以下はIncorrectであった。
RTL{CVE-2020-9838}
RTL{2020-9838}
RTL{20209838}
さらに「site:https://support.apple.com/ bluetooth remote arbitrary code
」でググってみると、
About the security content of iOS 14.4 and iPadOS 14.4 - Apple Support
が見つかり、以下の記述があった。
Bluetooth
Available for: iPhone 6s and later, iPad Pro (all models), iPad Air 2 and later, iPad 5th generation and later, iPad mini 4 and later, and iPod touch (7th generation)
Impact: A remote attacker may be able to cause arbitrary code execution
Description: An out-of-bounds read was addressed with improved input validation.
CVE-2021-1794: Jianjun Dai of 360 Alpha Lab
Entry added February 1, 2021, updated May 28, 2021
Bluetooth
Available for: iPhone 6s and later, iPad Pro (all models), iPad Air 2 and later, iPad 5th generation and later, iPad mini 4 and later, and iPod touch (7th generation)
Impact: A remote attacker may be able to cause arbitrary code execution
Description: An out-of-bounds write was addressed with improved input validation.
CVE-2021-1795: Jianjun Dai of 360 Alpha Lab
CVE-2021-1796: Jianjun Dai of 360 Alpha Lab
Entry added February 1, 2021, updated May 28, 2021
ここから、3個の候補
- CVE-2021-1794
- CVE-2021-1795
- CVE-2021-1796
が得られた。順に試そうとしたところ、最初のものを入れたところでCorrectが出て、flagが得られた。
RTL{CVE-2021-1794}
Where is this?
風景写真と思われる画像ファイルwhere.png
が与えられ、緯度と経度を求めることを要求された。
写真には特徴的と思われる塔が写っていたため、この塔の部分をペイントで切り出し、
さらにまわりの邪魔になりそうなものを黒く塗りつぶした。
塔を切り出した画像 | さらに塗りつぶした画像 |
---|---|
この塔の画像を用いてGoogleで「画像で検索」をしたところ、似た塔の画像が載っている以下のページを見つけた。
Berlin – the place to be - Is it already that late? 😳 | Facebook
ここからこの塔はBerlinに関係していると判断し、「Berlin tower」でググったところ、以下のページがヒットした。
Official website of the Berlin TV Tower - Enjoy the city from above
このサイトで「The tower → Virtual tour」と進み、さらに「Bar 203 → 204° South-West」を見ると、
問題の写真で塔の近くに写っていた旗が、特徴的な形の建物の上に立っている様子が見えた。
Googleのストリートビューで「berlin tv tower」で検索し、まわりを探すと、
この建物は「赤の市庁舎」っぽいことがわかった。
berlin tv tower - Google マップ
さらに、ストリートビューを見ながら移動して探索していくと、それっぽい場所が見つかった。
B1 - Google マップ
この画面のURLの情報を指定のフォーマットに当てはめることで、flagが得られた。
RTL{52.516_13.408}
Windows
WDigest
GoogleドライブのURLが与えられた。
アクセスすると、ファイルlsass1.DMP
が得られた。
また、以下の問題文があった。
I forgot my Windows password, can you recover it?
「dmp crack windows」でググったところ、以下のページが見つかった。
Hacking Windows 10: How to Dump NTLM Hashes & Crack Windows Passwords « Null Byte :: WonderHowTo
ここを参考に、Mimikatzでsekurlsa::minidump
コマンドとsekurlsa::logonPasswords
コマンドを実行すると、
wdigest :
* Username : d4rckh
* Domain : WIN-243AVCIFKOS
* Password : RTL{WD1G3ST_1S_B4D}
という形でflagが出力された。
RTL{WD1G3ST_1S_B4D}
Forensics
Expic
GoogleドライブのURLが与えられた。
アクセスすると、ファイルex.zip
が得られた。
このex.zip
を解凍すると、ファイルphoto
が得られた。
このファイルphoto
の中身をチェックすると、最初の方に
<prism:number>68747470733a2f2f706173746562696e2e636f6d2f514632557a6a56590a</prism:number>
という部分があった。
このタグのようなものの間の十六進文字列にCyberChefでFrom Hexをかけると、
https://pastebin.com/QF2UzjVY
という結果が得られた。
このURLにアクセスすると、
T0tLIApSVEx7MTBiYmE5YTUyNDE3MDk1ZGU1MWRiOTQ1NjM2MWQ3NDR9Cg==
というデータが得られた。
このデータにCyberChefでFrom Base64をかけると、
OKK
RTL{10bba9a52417095de51db9456361d744}
という結果になり、flagが得られた。
RTL{10bba9a52417095de51db9456361d744}
Web
Basic
WebページのURLが与えられた。
アクセスすると、Usernameを入れる欄、Passwordを入れる欄、Log Inボタンがあった。
Username欄に' or 1=1 --
、Password欄にa
を入れてLog Inボタンを押すと、flagが表示された。
RTL{b@s1c_5ql}
CTF
Feedback
GoogleフォームのURLが与えられた。
アクセスすると、4ページからなるアンケートだった。
(最初と最後のページは説明のみで、実質2ページだった)
アンケートに回答し、送信ボタンを押すと、flagが表示された。
RTL{TH4NK_Y0U_F0R_Y0UR_F33DB4CK}
解けたことになった問題
Forensics
Manipulated
GoogleドライブのURLが与えられた。
アクセスすると、ファイルManipulated.zip
が得られた。
これを解凍すると、ファイルcorr.png
が得られた。
corr.png
をTweakPNGで開いてみると、
Incorrect crc for IHDR chunk (is 9a056c98, should be 15060e3d)
と表示された。さらに、このIHDRの部分をTSXBINで見てみると、
00008 DateLength 0000000D
0000C IHDR[0] 49 48 44 52
00010 Width DEADC0DE
00014 Height D34DB33F
00018 Depth 08
00019 ColorType 06
0001A Compression 00
0001B Filter 00
0001C Interlace 00
0001D CRC 9A056C98
となっており、少なくともWidthとHeightの値が異常であることが読み取れた。
以下のプログラムを用意し、corr.png
からIDATのデータを抽出した。
extract.pl
#!/usr/bin/perl
use strict;
use warnings;
my $in_file = @ARGV > 0 ? $ARGV[0] : "Manipulated/corr.png";
open(IN, "< $in_file") or die("failed to open $in_file\n");
binmode(IN);
my $data = "";
while (<IN>) { $data .= $_; }
close(IN);
binmode(STDOUT);
my $pos = 8;
while ($pos < length($data)) {
my $len = unpack("N", substr($data, $pos, 4));
my $type = substr($data, $pos + 4, 4);
print STDERR "$pos $len $type\n";
if ($type eq "IDAT") {
print substr($data, $pos + 8, $len);
}
$pos += $len + 12;
}
得られたデータにCyberChefでZlib Inflateをかけると、2,063,174バイトのデータが得られた。
このデータの最初の部分は、以下のようになっていた。
00000000 01 ff ff ff ff 00 00 00 00 00 00 00 00 00 00 00 |.ÿÿÿÿ...........|
00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
IHDRのColorType=0x06は「アルファチャンネル付きRGB」を示し、Depth=0x08なので、
これらの情報が正しいとすれば1ピクセルは4バイトで表される。
得られたデータを見ると、最初の1バイトで行のエンコード方法を表し、
次から4バイトずつ色データを表しているようであることが読み取れた。
データの続きを見ると、0x00のバイトが多く、途中以下のように3バイトずつ同じ値がある場所があった。
00000790 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000007a0 00 00 00 00 00 00 00 00 00 00 00 00 00 ff ff ff |.............ÿÿÿ|
000007b0 00 00 00 00 00 ff ff ff 00 ff ff ff 00 00 00 00 |.....ÿÿÿ.ÿÿÿ....|
000007c0 00 01 01 01 00 00 00 00 00 fe fe fe 00 00 00 00 |.........þþþ....|
000007d0 00 03 03 03 00 fd fd fd 00 f7 f7 f7 00 f1 f1 f1 |.....ýýý.÷÷÷.ñññ|
000007e0 00 ea ea ea 00 fe fe fe 00 17 17 17 00 10 10 10 |.êêê.þþþ........|
000007f0 00 0a 0a 0a 00 03 03 03 00 00 00 00 00 00 00 00 |................|
00000800 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000a80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000a90 00 00 00 00 00 00 00 00 00 ff ff ff 00 00 00 00 |.........ÿÿÿ....|
00000aa0 00 00 00 00 00 01 01 01 00 00 00 00 00 00 00 00 |................|
00000ab0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
さらに、0xcf5バイト目に単独の0x04があり、これが次の行の始まりであると予想できた。
00000ce0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000cf0 00 00 00 00 00 04 00 00 00 00 00 00 00 00 00 00 |................|
00000d00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
1行が0xcf5バイト (3317バイト) で表されるとすると、1行のピクセル数は(3317 - 1) / 4 = 829
であると考えられる。
さらに、行数は2063174 / 3317 = 622
であると考えられる。
実際にIHDRにWidth=829、Height=622を書き込んでみると、
CRC32の値がファイル中のものと一致し、以下の画像が得られた。 (2021/07/31 14:47 JST)
画像には赤い文字でflagのような文字列が書かれているが、これを入力してもIncorrectとなった。
I
(大文字のアイ) とl
(小文字のエル)、0
(ゼロ) とO
(大文字のオー) の区別がつきにくいので、
以下の文字列を試したが、全てIncorrectとなった。
RTL{IHDR_chunk_m4nipulat10n}
RTL{IHDR_chunk_m4nipuIat10n}
RTL{IHDR_chunk_m4nipulat1On}
RTL{lHDR_chunk_m4nipulat10n}
RTL{lHDR_chunk_m4nipuIat10n}
RTL{lHDR_chunk_m4nipuIat1On}
(8通り試したつもりだったが、メモを見ると同じ文字列が2組あり、この6通りだった)
その後しばらくすると、なぜか解けたことになっていた。