好奇心の足跡

飽きっぽくすぐ他のことをしてしまうので、忘れないため・形にして頭に残すための備忘録。

setodaNote CTF writeup [Crypto]

これは、2021/8/21~2021/9/4の期間で開催された、setodaNote CTFの Crypto 分野のwriteupです。全体writeupはこちら

tech.kusuwada.com

base64 (50)

組織に入ったばかりの新人からチャットが来ました。ですが普通の文字列ではなく暗号文になっているようです。どうやら新人は暇なようです。

以下の文字列を解読して、フラグを獲得してください。

ZmxhZ3tJdCdzX2NhbGxlZF9iYXNlNjQhfQ==

base64 decodeするだけ。

$ echo "ZmxhZ3tJdCdzX2NhbGxlZF9iYXNlNjQhfQ==" | base64 -d
flag{It's_called_base64!}

ROT13 (50)

組織でも指折りの経験豊富なベテランからチャットが来ました。ですが普通の文字列ではなく暗号文になっているようです。どうやらこのベテランも暇なようです。

以下の文字列を解読して、フラグを獲得してください。

synt{Rira_lbh_Oehghf?}

アルファベット順で13文字ずらすだけ。CyberChef使っちゃった。

f:id:kusuwada:20210904230723p:plain:w400

pui_pui (80)

組織の局長からチャットが来ました。ですが普通の文字列ではなく暗号文になっているようです。どうやらこの組織には暇人しかいないようです。

以下の文字列を変換して、フラグを獲得してください。

\x41\x3a\x44\x6f\x20\x79\x6f\x75\x20\x6b\x6e\x6f\x77\x20\x4d\x6f\x6c\x63\x61\x72\x3f\x0a\x0a\x42\x3a\x4f\x66\x20\x63\x6f\x75\x72\x73\x65\x21\x20\x49\x20\x6c\x6f\x76\x65\x20\x74\x68\x65\x20\x73\x63\x65\x6e\x65\x20\x77\x68\x65\x72\x65\x20\x68\x65\x20\x73\x69\x6e\x6b\x73\x20\x69\x6e\x74\x6f\x20\x74\x68\x65\x20\x62\x6c\x61\x73\x74\x20\x66\x75\x72\x6e\x61\x63\x65\x20\x77\x68\x69\x6c\x65\x20\x67\x69\x76\x69\x6e\x67\x20\x74\x68\x65\x20\x74\x68\x75\x6d\x62\x73\x20\x75\x70\x2e\x0a\x0a\x41\x3a\x2e\x2e\x2e\x20\x57\x68\x61\x74\x3f\x0a\x0a\x42\x3a\x62\x74\x77\x2c\x20\x74\x68\x65\x20\x66\x6c\x61\x67\x20\x69\x73\x20\x66\x6c\x61\x67\x7b\x48\x61\x76\x65\x5f\x79\x6f\x75\x5f\x65\x76\x65\x72\x5f\x68\x65\x61\x72\x64\x5f\x6f\x66\x5f\x48\x65\x78\x64\x75\x6d\x70\x3f\x7d\x2e\x0a

モルカーだ!プイプイ!
hex to asciiの変換で行ける。これもcyberchef使っちゃった。

f:id:kusuwada:20210904230741p:plain:w400

tkys_secret_service (120)

分担が一区切りし拠点に立ち寄っていた後輩から、あなたが3か月前に送ってきたチャットが結局なんだったのか解けないでいると話しかけられました。そういえば暇だったから意味もなく秘匿回線で内偵中の後輩に暗号文を送っていたことを思い出します。

以下の文字列を解析してフラグを入手してください。

Gur cevgrsgbvh vp Pvhgevyyrq Hhsynmmbpbrq Vhpvezngbvh (PHV) ermbqrhg bh hvhprqreny mlmgrzm nhq vetnhbfngbvhm bm vp cnenzvahg bzcvegnhsr gv prqreny ntrhsbrm nhq snh qbersgyl bzcnsg gur nobybgl vp gur prqreny tvirehzrhg gv massrmmpayyl svhqasg bgm rmmrhgbny zbmmbvhm nhq pahsgbvhm. Gubm caoybsngbvh cevibqrm ntrhsbrm jbgu ersvzzrhqrq mrsaebgl erdaberzrhgm pve cevgrsgbht gur svhpbqrhgbnybgl vp PHV jurh gur bhpvezngbvh bm ermbqrhg bh hvhprqreny mlmgrzm nhq vetnhbfngbvhm; jurh gur hvhprqreny vetnhbfngbvh bm hvg svyyrsgbht ve znbhgnbhbht bhpvezngbvh vh orunyp vp n prqreny ntrhsl ve ambht ve vcrengbht n mlmgrz vh orunyp vp nh ntrhsl; nhq jurer gurer ner hv mcrsbpbs mnprtaneqbht erdaberzrhgm pve cevgrsgbht gur svhpbqrhgbnybgl vp Synt bm pynt{cabcab_sne_vp_zvy} PHV cermseborq ol gur naguvebfbht ynj, ertayngbvh, ve tvirehzrhgjbqr cvybsl pve gur PHV sngrtvel ybmgrq bh gur PHV Ertbmgel. Gur erdaberzrhgm nccyl gv nyy svzcvhrhgm vp hvhprqreny mlmgrzm nhq vetnhbfngbvhm gung cevsrmm, mgver, nhq/ve genhmzbg PHV, ve gung cevibqr cevgrsgbvh pve masu svzcvhrhgm. Gur mrsaebgl erdaberzrhgm ner bhgrhqrq pve amr ol prqreny ntrhsbrm bh svhgensgany irubsyrm ve vgure nterrzrhgm rmgnoybmurq orgjrrh guvmr ntrhsbrm nhq hvhprqreny vetnhbfngbvhm.

待ってました!気合で解くやつ!多分!
nhq, gurなど、決まった文字列がよく出てきているので、ただの単一換字暗号と予想。flagのフォーマット部分から解読していくと、下記の対応になっているっぽい。(小文字が置換前、大文字が置換後)

p -> F
y -> L
n -> A
t -> G

あとは、gurtheと思われるので

g -> T
u -> H
r -> E

その後も勘で、vFofだろう、などを繰り返していくと、下記の対応表ができました。

a -> U
b -> I
c -> P
d -> Q
e -> R
f -> Z
g -> T
h -> N
i -> V
j -> W
l -> Y
m -> S
n -> A
o -> B
p -> F
q -> D
r -> E
s -> C
t -> G
u -> H
v -> O
y -> L
z -> M

最終的な復号文はこちら。flagフォーマット部分を小文字に直して投げればOK。

THE PROTECTION OF FONTROLLED NNCLASSIFIED ONFORMATION (FNO) RESIDENT IN NONFEDERAL SYSTEMS AND ORGANIZATIONS IS OF PARAMOUNT IMPORTANCE TO FEDERAL AGENCIES AND CAN DIRECTLY IMPACT THE ABILITY OF THE FEDERAL GOVERNMENT TO SUCCESSFULLY CONDUCT ITS ESSENTIAL MISSIONS AND FUNCTIONS. THIS PUBLICATION PROVIDES AGENCIES WITH RECOMMENDED SECURITY REQUIREMENTS FOR PROTECTING THE CONFIDENTIALITY OF FNO WHEN THE INFORMATION IS RESIDENT IN NONFEDERAL SYSTEMS AND ORGANIZATIONS; WHEN THE NONFEDERAL ORGANIZATION IS NOT COLLECTING OR MAINTAINING INFORMATION ON BEHALF OF A FEDERAL AGENCY OR USING OR OPERATING A SYSTEM ON BEHALF OF AN AGENCY; AND WHERE THERE ARE NO SPECIFIC SAFEGUARDING REQUIREMENTS FOR PROTECTING THE CONFIDENTIALITY OF CLAG IS FLAG{PUIPUI_CAR_OF_MOL} FNO PRESCRIBED BY THE AUTHORIZING LAW, REGULATION, OR GOVERNMENTWIDE POLICY FOR THE FNO CATEGORY LISTED IN THE FNO REGISTRY. THE REQUIREMENTS APPLY TO ALL COMPONENTS OF NONFEDERAL SYSTEMS AND ORGANIZATIONS THAT PROCESS, STORE, AND/OR TRANSMIT FNO, OR THAT PROVIDE PROTECTION FOR SUCH COMPONENTS. THE SECURITY REQUIREMENTS ARE INTENDED FOR USE BY FEDERAL AGENCIES IN CONTRACTUAL VEHICLES OR OTHER AGREEMENTS ESTABLISHED BETWEEN THOSE AGENCIES AND NONFEDERAL ORGANIZATIONS.

lets_bake (150)

あなたはシェフ帽の人物からレシピを受け取りました。どうやら組織からの秘密のメッセージのようです。レシピを解読し、秘密のメッセージを入手してください。

Input: NzRmNDRiMWE0Y2M2ZGNiNzc3NTMyNTcwZjk0MTE4NTMyNTcxZjE1YTE1NTJkY2M0

Recipe: RnJvbV9CYXNlNjQoJ0EtWmEtejAtOSsvPScsdHJ1ZSkN]b2[sRnJvbV9IZXgoJ05vbmUnKQ0=]b2[sRm9yaygnJScsJ18nLGZhbHNlKQ0=]b2[sUkM0KHsnb3B0aW9uJzonVVRGOCcsJ3N0cmluZyc6J2NoZWYnfSwnTGF0aW4xJywnTGF0aW4xJyk=

これはCyberChef使うことを示唆してそう。
もらったレシピを、base64で意味の通るところで分解すると

RnJvbV9CYXNlNjQoJ0EtWmEtejAtOSsvPScsdHJ1ZSkN
RnJvbV9IZXgoJ05vbmUnKQ0=
Rm9yaygnJScsJ18nLGZhbHNlKQ0=
UkM0KHsnb3B0aW9uJzonVVRGOCcsJ3N0cmluZyc6J2NoZWYnfSwnTGF0aW4xJywnTGF0aW4xJyk=

となり、base64 decode結果は

From_Base64('A-Za-z0-9+/=',true)
From_Hex('None')
Fork('%','_',false)
RC4({'option':'UTF8','string':'chef'},'Latin1','Latin1')

これをCyberChef上で再現すると

f:id:kusuwada:20210904230823p:plain:w400

vul_rsa_01 (200)

あなたは組織の定期研修に参加しています。教官から RSA 暗号の禁止事項くらいは覚えておくようにと課題が出題されました。どうやら暗号文 c を解くことができればそれだけ早く帰れるようです。

以下の RSA 暗号を解読してフラグを入手してください。

c: 39119617768257067256541748412833564043113729163757164299687579984124653789492591457335

n: 13373801376856352919495636794117610920860037770702465464324474778341963699665011787021257

e: 65537

nが小さいなーと思って factordb.comnを因数分解してもらったらできちゃったので、これを使わせてもらいます。

from Crypto.Util.number import inverse
from Crypto.Util.number import long_to_bytes

c = 39119617768257067256541748412833564043113729163757164299687579984124653789492591457335
n = 13373801376856352919495636794117610920860037770702465464324474778341963699665011787021257
e = 65537
p = 3058517013146002381763962882964790715736519

q = n // p
d = inverse(e, (p-1)*(q-1))
m = pow(c, d, n)
print(long_to_bytes(m))

実行結果

$ python solve.py 
b'flag{weak_rsa_can_be_decrypted!}'

vul_rsa_02 (250)

あなたは引き続き組織の定期研修に参加しています。教官は昨日と同じ人物です。「早く帰れると言ったな。あれは嘘だ」昨日の信じられない光景が脳裏に蘇ります。RSA 暗号の禁止事項くらいは覚えておくようにと再び RSA 暗号の課題が出題されました。もはや誰も信じていませんがどうやら暗号文 c を解くことができればそれだけ早く帰れるようです。

以下の RSA 暗号を解読してフラグを入手してください。

c: 227982950403746746755552239763357058548502617805036635512868420433061892121830106966643649614593055827188324989309580260616202575703840597661315505385258421941843741681

n: 314346410651148884346780415550080886403387714336281086088147022485674797846237037974025946383115524274834695323732173639559408484919557273975110018517586435379414584423

e: 66936921908603214280018123951718024245768729741801173248810116559480507532472797061229726239246069153844944427944092809221289396952390359710880636835981794334459051137

これはeが大きすぎるパターン。RSA暗号運用でやってはいけない n のこと #ssmjp のその7、「eの値が大きすぎてはいけない」時に有効な攻撃手法である、Wiener's Attackが使えそう。
eが大きくなると、相対的にdが小さくなることを利用して、enから秘密鍵が求まってしまう。

攻撃ツールGitHub - orisano/owiener: A Python3 implementation of the Wiener attack on RSAを使わせてもらう。

import owiener
from Crypto.Util.number import *

c = 227982950403746746755552239763357058548502617805036635512868420433061892121830106966643649614593055827188324989309580260616202575703840597661315505385258421941843741681
n = 314346410651148884346780415550080886403387714336281086088147022485674797846237037974025946383115524274834695323732173639559408484919557273975110018517586435379414584423
e = 66936921908603214280018123951718024245768729741801173248810116559480507532472797061229726239246069153844944427944092809221289396952390359710880636835981794334459051137
d = owiener.attack(e, n)

if d is None:
    print("Failed")
else:
    print("Hacked d={}".format(d))
plain = pow(c, d, n)
print(long_to_bytes(plain).strip())

実行結果

$ python solve.py 
Hacked d=19780253153570454414022314122363673676673
b'\x02my\xa6\xfb\xa2t\x19X\xce\x82F(U\xa9n\xc4\xdc\x16#\x13<\xfc4\x15y\x92\x0b\xef\xc0.\xb7\xb9\xe0\xa3\xbb\xb8r\x00flag{197_Michael_J_Wiener_673}'

WEARECIA (300)

家に帰ると黒い封筒が郵便受けに入っていました。封筒の中身は英字が羅列されたメモが一枚。青銅色の紙に白いインクで書かれており右下には同じインクで WEARECIA と記載されています。どうやら暗号文のようです。暗号文を解析してメッセージを受け取る必要がありそうです。

以下の暗号文を解読し、隠されたメッセージを見つけてください。フラグは得られたメッセージを flag{} で囲んで回答してください。

EMUFPHZLRFAXYUSDJKZLDKRNSHGNFIVJYQTQUXQBQVYUVLLTREVJYQTMKYRDMFDRCDNKFRHHMKVLLTGBMFDUTMALDUMKYQTGLWLWCM

WEARECIAってなんじゃ?と思ってググったりしてみたのですが、We are CIAってことかな?
CIA, cipher みたいな単語でググったところ、

Kryptos - Wikipedia Kryptos というのを発見。写真も青銅の地盤に白で文字が書いてあり、これっぽい!
もともとのこのcipherはいくつかのパートに分かれていて、それぞれmethodとkeyが違うみたいなんだけど、まずはpassage1のときかた、vigenere暗号のkeyを"Kryptos","Palimpsest"で解読してみると、下記の文言が得られました。

f:id:kusuwada:20210904231549p:plain:w400

BETWEENSUBTLESHADINGANDTHEABSENCEOFLIGHTLIESTHENUANCEOFIQLUSIONFLAGISWEARETHENATIONSFIRSTLINEOFDEFENSE

このflag部分を抜き出してフラグフォーマットに突っ込むと、正解👍

flag: flag{WEARETHENATIONSFIRSTLINEOFDEFENSE}

文章: BETWEEN SUBTLE SHADING AND THE ABSENCE OF LIGHTLIES THE NUANCE OF IQLUSION FLAG IS WE ARE THE NATIONS FIRST LINE OF DEFENSE