1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Red Team Lounge CTF 2021 writeup

Last updated at Posted at 2021-08-03

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

Category Breakdown
Score over Time

公式Score Over Time (解けた時刻を無視して横方向に等間隔でプロット)

公式Score over Time

解けた問題

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-GCCobjdumpで逆アセンブルして読むと、main関数内で

  1. scanf関数を用いて入力を読み込む
  2. strrev関数を用いて読み込んだデータを加工する
  3. データの各バイトに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で検索すると、以下のツイートが見つかった。

このツイート中に書かれている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が与えられ、緯度と経度を求めることを要求された。
写真には特徴的と思われる塔が写っていたため、この塔の部分をペイントで切り出し、
さらにまわりの邪魔になりそうなものを黒く塗りつぶした。

塔を切り出した画像 さらに塗りつぶした画像
tower_trimmed.png tower_trimmed_painted.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.pngTweakPNGで開いてみると、

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
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)

Width=829、Height=622 を書き込んだ画像

画像には赤い文字で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通りだった)

その後しばらくすると、なぜか解けたことになっていた。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?