Affinity CTF 2019 - Quals Writeup

この大会は2019/9/7 3:00(JST)~2019/9/9 3:00(JST)に開催されました。
今回もチームで参戦。結果は6011点で450チーム中3位でした。
自分で解けた問題をWriteupとして書いておきます。

Sanity Check (Misc 1)

問題にフラグが書いてあった。

AFFCTF{S4nity_1s_V4nity_!}

DISC ORDer (Misc 10)

よく見たら、タイトルの大文字部分がDISCORDになっている。Discordに入ると、#generalのところにフラグが書いてあった。

AFFCTF{Pr0p3r_C0ms_aR3_4lways_g00d!}

Download me ... (Web 150)

HTMLソースを見る。

Download file:<pre><a href="download.php?file=file1.txt&token=6f2268bd1d3d3ebaabb04d6b5d099425">file1.txt</a><br /><a href="download.php?file=file2.txt&token=e6cb2a3c14431b55aa50c06529eaa21b">file2.txt</a><br /><a href="download.php?file=file3.txt&token=65658fde58ab3c2b6e5132a39fae7cb9">file3.txt</a><br /><a href="download.php?file=flag.txt&token=">flag.txt</a><br />

ダウンロードするにはtokenを正しく指定する必要がありそう。

file1: 6f2268bd1d3d3ebaabb04d6b5d099425 --(md5reverse)--> 753
file2: e6cb2a3c14431b55aa50c06529eaa21b --(md5reverse)--> 952
file3: 65658fde58ab3c2b6e5132a39fae7cb9 --(md5reverse)--> 536

tokenをmd5の逆変換してみると、ファイルサイズと合っている。flag.txtに対して1から順にmd5の値を指定して、リクエストしてみる。

import requests
import hashlib

url = 'http://165.22.22.11:25632/download.php?file=flag.txt&token='

for size in range(1, 100):
    token = hashlib.md5(str(size)).hexdigest()
    r = requests.get(url + token)
    flag = r.text
    if flag != 'Invalid token.':
        print 'size =', size
        print flag
        break
AFFCTF{Pr3dic71bl3_t0k3n5_4r3_b4d}

Alan said. (Crypto 100)

Alanという問題のタイトルからエニグマ暗号と推測。問題の暗号は、qrvpc dryqe uyomt nxzin nlxtt vqgyl mptj。
https://cryptii.com/pipes/enigma-machineで、添付の画像をヒントにパラメータを調整する。
画像から推定できるパラメータは以下の通り。

・ROTOR: 123
・POSITION: ZOO
・RING: PUB

モデルを変えながら、復号結果を見て、少しでも何か意味のありそうなものを見つける。結果、以下の画面の通り試して、フラグとして通った。
f:id:satou-y:20190916081650p:plain

AFFCTF{abitofhussingneverdidanyoneanyharm}

Breaking Bad (Crypto 150)

暗号は大文字小文字の繰り返しになっている。原子番号をASCIIコードとして文字にしておけばよさそう。

enc = 'HoRfSbMtInMcLvFlAcAmInMcAmTeErFmInHoLvDbRnMd'

atomic = {
    'Ho': 67,
    'Rf': 104,
    'Sb': 51,
    'Mt': 109,
    'In': 49,
    'Mc': 115,
    'Lv': 116,
    'Fl': 114,
    'Ac': 89,
    'Am': 95,
    'Te': 52,
    'Er': 68,
    'Fm': 100,
    'Db': 105,
    'Rn': 86,
    'Md': 101
}

dec = ''
for i in range(0, len(enc), 2):
    dec += chr(atomic[enc[i:i+2]])

flag = 'AFFCTF{%s}' % dec
print flag
AFFCTF{Ch3m1strY_1s_4Dd1CtiVe}

GolanG Heights (Crypto 350)

Go言語の暗号スクリプトを読み解くと、概要は以下の通り。

・factorBigInt: ランダムBigInt
・p = (factorBigInt ** 2) * 4 + (factorBigInt * 3) + 7351
・q = (factorBigInt ** 2) * 19 + (factorBigInt * 18) + 1379
・e = 2

n = p * qからfactorBigIntの一元4次方程式とできる。そこからp, qを割り出すことができる。結果両方とも4で割ったときの余りが3になるので、Rabin暗号の復号方法で復号できる。

from sympy import *
from Crypto.Util.number import *

def egcd(a, b):
    if a == 0:
        return b, 0, 1
    else:
        gcd, y, x = egcd(b % a, a)
        return gcd, x - (b // a) * y, y

def is_printable(s):
    for c in s:
        if ord(c) < 32 or ord(c) > 126:
            return False
    return True

n = 825321266319602503456977005474981604870402407335194099572979028339224439122246767155608828548258547874076592811333439775645799852274012447643240804287007452861599291275940862131595970247906775549656137041013432613989092491697319873901497907382123859210758943466373193369020798176192106305153278525778145033 
ct = 801050608421922967220624523903721496853411844056321773877598932155971380872263121340024512973182420871402804237809506243995703890886804092449855251892886296340338442367792297266755554172082930224889412735287102163161928535579728998850091020972410977027707699268899998522781790134147981974412918582618345868

var('x')
eq = Eq(((x ** 2) * 4 + (x * 3) + 7351) * ((x ** 2) * 19 + (x * 18) + 1379) - n)
ans = solve(eq)

x = ans[0]
p = (x ** 2) * 4 + (x * 3) + 7351
q = (x ** 2) * 19 + (x * 18) + 1379

assert n == p * q
assert p % 4 == 3
assert q % 4 == 3

r = pow(ct, long((p+1)/4), long(p))
s = pow(ct, long((q+1)/4), long(q))

gcd, c, d = egcd(p, q)
x = (r * d * q + s * c * p) % n
y = (r * d * q - s * c * p) % n
plains = [x, n - x, y, n - y]

for plain in plains:
    flag = long_to_bytes(plain)
    if is_printable(flag):
        flag = 'AFFCTF{%s}' % flag
        print flag
        break
AFFCTF{##just!c3_just!c3_y0u_sh@ll_pursu3_##_d3m@nd__p3@c3__@nd__pursu3__!t##}

Epic Poem (Crypto 500)

XOR鍵がAFFCTF{から始まると推定して、復号する。その際片方のメッセージが以下のサイトのものと同じになりそうなので参考にする。

https://pl.wikisource.org/wiki/Litwo,_Ojczyzno_moja!
def str_xor(s1, s2):
    return ''.join(chr(ord(a) ^ ord(b)) for a, b in zip(s1, s2))

def is_printable(s):
    for c in s:
        if ord(c) < 32 or ord(c) > 126:
            return False
    return True

with open('enc1', 'rb') as f:
    data1 = f.read()

with open('enc2', 'rb') as f:
    data2 = f.read()

flag_head = 'AFFCTF{'

for i in range(len(data1) - 7):
    m1 = str_xor(data1[i:i+7], flag_head)
    m2 = str_xor(data2[i:i+7], flag_head)
    if is_printable(m1) and is_printable(m2):
        print i, '"' + m1 + '"', '"' + m2 + '"'

## guess that key length is 35
pt1_head = 'Litwo! Ojczyzno moja! Ty jestes jak'
key = str_xor(pt1_head, data1[:35])
print key
AFFCTF{M4nY_t1m3_PaD_1$_b@d__!!!}

Grains of Sand (Crypto 900)

TLSの通信ばかり。証明書をエクスポートしてみる。2つのセッションで証明書はあるが、まずはNo.6のパケットからエクスポートし、内容を確認する。

$ openssl x509 -in 6.cer -text -pubkey -inform DER
Certificate:
    Data:
        Version: 1 (0x0)
        Serial Number: 10166668427322618640 (0x8d174311bfbe7310)
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: CN=AFFCTF-2019
        Validity
            Not Before: Aug  6 14:06:46 2019 GMT
            Not After : Aug  5 14:06:46 2020 GMT
        Subject: CN=AFFCTF-2019
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (512 bit)
                Modulus:
                    00:ad:74:88:97:ea:99:aa:23:7e:d9:7b:59:ef:f6:
                    33:58:bf:6d:d9:15:0e:e1:34:e2:80:93:b0:8f:29:
                    a1:60:60:47:18:93:87:70:87:83:a5:00:c1:28:8f:
                    90:eb:fa:75:5d:f2:ce:c3:1e:c7:e9:12:28:ec:ce:
                    19:c1:1d:da:43
                Exponent: 3 (0x3)
    Signature Algorithm: sha256WithRSAEncryption
         a7:18:83:30:e6:6a:a5:d8:36:0e:43:7c:c0:e1:4e:53:67:40:
         e9:d5:0b:aa:d6:86:03:39:ee:c6:2e:d3:53:cc:dd:07:26:0e:
         05:6b:71:02:ff:db:52:cf:a1:52:68:19:d3:22:a3:16:e2:83:
         83:5e:57:61:2f:aa:1e:34:61:f2
-----BEGIN PUBLIC KEY-----
MFowDQYJKoZIhvcNAQEBBQADSQAwRgJBAK10iJfqmaojftl7We/2M1i/bdkVDuE0
4oCTsI8poWBgRxiTh3CHg6UAwSiPkOv6dV3yzsMex+kSKOzOGcEd2kMCAQM=
-----END PUBLIC KEY-----
-----BEGIN CERTIFICATE-----
MIIBGzCBxgIJAI0XQxG/vnMQMA0GCSqGSIb3DQEBCwUAMBYxFDASBgNVBAMMC0FG
RkNURi0yMDE5MB4XDTE5MDgwNjE0MDY0NloXDTIwMDgwNTE0MDY0NlowFjEUMBIG
A1UEAwwLQUZGQ1RGLTIwMTkwWjANBgkqhkiG9w0BAQEFAANJADBGAkEArXSIl+qZ
qiN+2XtZ7/YzWL9t2RUO4TTigJOwjymhYGBHGJOHcIeDpQDBKI+Q6/p1XfLOwx7H
6RIo7M4ZwR3aQwIBAzANBgkqhkiG9w0BAQsFAANBAKcYgzDmaqXYNg5DfMDhTlNn
QOnVC6rWhgM57sYu01PM3QcmDgVrcQL/21LPoVJoGdMioxbig4NeV2Evqh40YfI=
-----END CERTIFICATE-----

公開鍵パラメータは以下のようになっている。

n = 0x00ad748897ea99aa237ed97b59eff63358bf6dd9150ee134e28093b08f29a1606047189387708783a500c1288f90ebfa755df2cec31ec7e91228ecce19c11dda43
e = 3

nを素因数分解しようと思ったが、なかなかできない。sand.numというファイルもあったので、試しにnを割ってみると、割り切れることが分かる。

n = 0x00ad748897ea99aa237ed97b59eff63358bf6dd9150ee134e28093b08f29a1606047189387708783a500c1288f90ebfa755df2cec31ec7e91228ecce19c11dda43
num = 95822117903881741755045863839122036726311174271919162702302872031449498584799

assert n1 % num == 0

p = num
q = n1 / p
assert n1 == p * q

print 'p =', p
print 'q =', q

実行結果は以下の通り。

p = 95822117903881741755045863839122036726311174271919162702302872031449498584799
q = 94806779941127810821354869084316339665245001669547639965103664836666568035613

これで、p, qがわかり秘密鍵を生成できる。

$ rsatool.py -f PEM -o secret1.pem -p 95822117903881741755045863839122036726311174271919162702302872031449498584799 -q 94806779941127810821354869084316339665245001669547639965103664836666568035613 -e 3
Using (p, q) to initialise RSA instance

n =
ad748897ea99aa237ed97b59eff63358bf6dd9150ee134e28093b08f29a1606047189387708783a5
00c1288f90ebfa755df2cec31ec7e91228ecce19c11dda43

e = 3 (0x3)

d =
73a305ba9c66716cff3ba7914aa4223b2a493b635f40cdec55b7cb0a1bc0eae9c1184bb7b9250a89
0cf3ba3ef29209613c26f77af9ad8b67ecd05efc2ed7aedb

p =
d3d96593027df3dfaa545650876cd8fc35d46671d4113924bf8ec0be190d06df

q =
d19abc60d851fff7c2ff3ae09da413674de3f518d4325ed186257ee161cd4d1d

Saving PEM as secret1.pem

このファイルをWiresharkで設定して通信を見てみる。この復号した通信の中からパスフレーズ付きの秘密鍵が取れるが、パスフレーズはわからない。あと怪しいLocationのデータがある。

1slbrvzlvbwxda6nrrs6b67u4d6lbn9h4emxkncxnlm0nr6dwn4bz077jo1kkx8tvgx2eucm80ivnck7dosr7nspsi61ytedp6ibathma6tt43bzsi2c754wwpva4b1fgvo17iofuc5zt52utha7h8pgz4pj2hbnz3upy0xenl504auhp4ab8daqajlj4vq9a7to4khh3pilrq0fhseumx875p47p5l6gmmymyf7ezpjmckmbkcil6h58fhxe6289qd3mxf7560k0z5fqvedw7zbtdspttl4e271sxon019spnimqi9h52u7n2et6n01vkoer2vq1grg13xgbcnq71r12ale5oljepn5hhy98lgqfln3vfsxh1qyo72sgpzw0xgyvikq3i2vgpx3hgwdahzqrnvcie5i8den16jj02s7tj453tog53xo529viq0ibsz75qlehrv240qpncvbg2or8quv6u49ngquspwjfvcd776wfu4q2jmap2crsfqgyctl4vq5do0x9m1820mq6fa9ewfgqs08dvfhz2v70kexnz548xlanorujm6uocnznqq962869ga0tsc21jpzmbm0wt9q6y2rrhtq59mknd74aabwm7m6oy05hq7r7t3lzw0uyl8pcai86845ynqfdc1jnizope8p0fskpmr5hnsxum9jf32hb4umrgll25e5ltd0xzrumcbj3ahyxa2r1g6e7syix9wq8q88wvlcvc77lf28a3lplb6q5g4vjlzktj559qv22zjf8a81we7i2gw0lej946mh4si0ldift07gb7vvjf0z2r2zay6aek7k32cwd67drqq8iaqalz021ircoxzr6n5egrpqw6w0lggzp0n4w3jgijxx6im6r477j0v52jo07uc5izipesedd24zcyasdqa5yolt4y4yr0nuwzelmlg9cgm9bjjcp2er35j1hkxtdhyklkk7nqaqvooswh3hh59kno1wggf96puwc6tup743w7b8kmis9ilxh8z390u0822xq3851ionsbse2eackkkh0acxdacjtqrxid8a1belk95o7ges0zu3zr5hx0q6xvx7lhu9f37tfbtk7bczclryuu1pug3ke33w34andbcpfk7r60ifath13us4y7136rzy1le1a7c7nfvmn2uktm4xzyekkhms7fy3qs9kh35ztj7biyy8s8jytqx37mcqokkd3zjr9kmbif8o0hm0m6mexmdzqwn04xxlrof54jo51r43syffha1chik8djb3bzgs9g4o301hi3emyah6hgmazzgqgc57iwyidjtmylvrzlsfz8wor61cq2r67pkkjfz9evzn2i7kqaj07ht7abluxhn8aa373bifobclsz6qqeuybfy08vyojnse0hybr1fe5cnicm7tyvz5o24a8e9x24z2x2vpwqszed1ficdbc43y78gkexgvrau2sf9q34u5d10lk7vwjp89bx5gunxzch0v62qnbjutokgrv7d72ox1cnlfwrpp8lehqvyi9aqgjnanmyj2buynu2sf89huemau0kukbjw831nwppqnlr40lqy5w9fp6bldhv8d4bdcsuw3oz6carp2e7hgk6z6bx7tp468qokhyorwonyfwlkk8suqdx7ywj1foxbmf9xnsr7kh887q9712s32d6lsj4rcx44ya4d8z8ayzrvosmb11sw87j5yyiooxxbul150rgl7kxq3tewyn75t9hxtekfqsf22vja6smpjazfekg0pdqrg1hnb6yoqu045dg8fwqc7ls4zcbf94mwv2hkits9itnntqdo23uc8xcqcovhxr6aw6xvseaoc96p5xsucubgbxkwo8rqfdcb8851fvyl51rkkfpc9jfb8ygryc8sapluhh7uzqqsfx47k4id5lnnayitp0v5emnntc0f730s1yiy3upxb7fflp9m7dmgt7qajaiqq2f3y5ey69bxv43f7cxtlcxbar1agfyei2rpajdb1by5ch6508lo8w66g4qdaj7ilgmepg5p1ck2sek3u3vkde3daolt5y1lq2pyz3ds0436lgucspa4xvj0563z0rxdbd7qn23ftcsf2bmo8nr7go9cffanqfp31kqtluw7zbnuanx4thilmabc18yydjkw4fl9aio76kejkn4qr2wau4egbv5ntb5jc4dupt400k98bluy4whpl5cck4i4pd3v05dr6ifqqo52161g5qe465s4bougpco3qwugfv88vhkhk1gou5fz7noe98ffcxl0b1qjdznvh3rii5ufhj47dxygcnh0a1kud5lysegcbz00mrvl1v6q62yd481wnb0d6ptof29iqjoxnvol6sjtwdhxyy95494jur0dm41yi857spg2qixbmnh51qspp2c8enpd4pb63olmxsktdxt6dp5qfmxrnxi3jfmvu99d44axhe9g5by4vt6y3efu5pwni9rtwvcatekv15xzvrwko0ciu4lnkwxud1qw130z7w2djzyz5mkxmv40q18v95qhhg90pxotp6647y2f1q5bom7xwm94g2ao7akxcfxfhn9whioanavjmb3j2a7inb49aigfy70t0tlpmep3jxyjkydwdckyrdd8io4e0zq9swb4ydv18fkefwuk1ru6q0rovtzkx2rzz2s79n0pf1g4ak2errugcdcc2any7ok2scyqwumygncng5u2tcbyj1zsye98xayk6mjixu2zb5gc9htimpi860n5jx7gzwfed616pgmk1rnsmhl11r2av7190e9j5yn39fe6u4csyz49gl9dtf0299907hc3f4d9hc05n5zmfn82w55tcc3rn11o3jxpd35wxn2mt1gcwhuetwqolvwtg0u70h0sck8q8g1fibwkvh8xh9vc534ixagokrsaq891gwbzvqkpat5xa8engvcuygl73rp639hskqa9oix9p1vgp5ilo2u6bjdxzf96gi9qlcihwvo3uk59ry4mrm8d2fm3nc4mm9f6gvwsq5j7pgx5dhwaa79qu32p9zaaqo9nntsbg8wv6zyae6ehwqbdc6ucv5o4sahbkbqbqo395o0fsrwwowy8tt3fx12ddz4jooqh17f8y1ouq3wo40q4wq958iyc82qcl6tgrdkqrej8h3meyhtdjzq62l91gsakx7z66oa1dfcndc7rkj6q0k3h4w051ohvz87qq5x1fqx87it-w1-s1-v03-p33

この長い文字列の末尾の、"w1-s1-v03-p33"は前にも見たことがあり、Library of Babel(http://libraryofbabel.info/)のものだとわかった。
ここのBrowseのページで以下のデータを順番に指定する。

Hex Name:
1slbrvzlvbwxda6nrrs6b67u4d6lbn9h4emxkncxnlm0nr6dwn4bz077jo1kkx8tvgx2eucm80ivnck7dosr7nspsi61ytedp6ibathma6tt43bzsi2c754wwpva4b1fgvo17iofuc5zt52utha7h8pgz4pj2hbnz3upy0xenl504auhp4ab8daqajlj4vq9a7to4khh3pilrq0fhseumx875p47p5l6gmmymyf7ezpjmckmbkcil6h58fhxe6289qd3mxf7560k0z5fqvedw7zbtdspttl4e271sxon019spnimqi9h52u7n2et6n01vkoer2vq1grg13xgbcnq71r12ale5oljepn5hhy98lgqfln3vfsxh1qyo72sgpzw0xgyvikq3i2vgpx3hgwdahzqrnvcie5i8den16jj02s7tj453tog53xo529viq0ibsz75qlehrv240qpncvbg2or8quv6u49ngquspwjfvcd776wfu4q2jmap2crsfqgyctl4vq5do0x9m1820mq6fa9ewfgqs08dvfhz2v70kexnz548xlanorujm6uocnznqq962869ga0tsc21jpzmbm0wt9q6y2rrhtq59mknd74aabwm7m6oy05hq7r7t3lzw0uyl8pcai86845ynqfdc1jnizope8p0fskpmr5hnsxum9jf32hb4umrgll25e5ltd0xzrumcbj3ahyxa2r1g6e7syix9wq8q88wvlcvc77lf28a3lplb6q5g4vjlzktj559qv22zjf8a81we7i2gw0lej946mh4si0ldift07gb7vvjf0z2r2zay6aek7k32cwd67drqq8iaqalz021ircoxzr6n5egrpqw6w0lggzp0n4w3jgijxx6im6r477j0v52jo07uc5izipesedd24zcyasdqa5yolt4y4yr0nuwzelmlg9cgm9bjjcp2er35j1hkxtdhyklkk7nqaqvooswh3hh59kno1wggf96puwc6tup743w7b8kmis9ilxh8z390u0822xq3851ionsbse2eackkkh0acxdacjtqrxid8a1belk95o7ges0zu3zr5hx0q6xvx7lhu9f37tfbtk7bczclryuu1pug3ke33w34andbcpfk7r60ifath13us4y7136rzy1le1a7c7nfvmn2uktm4xzyekkhms7fy3qs9kh35ztj7biyy8s8jytqx37mcqokkd3zjr9kmbif8o0hm0m6mexmdzqwn04xxlrof54jo51r43syffha1chik8djb3bzgs9g4o301hi3emyah6hgmazzgqgc57iwyidjtmylvrzlsfz8wor61cq2r67pkkjfz9evzn2i7kqaj07ht7abluxhn8aa373bifobclsz6qqeuybfy08vyojnse0hybr1fe5cnicm7tyvz5o24a8e9x24z2x2vpwqszed1ficdbc43y78gkexgvrau2sf9q34u5d10lk7vwjp89bx5gunxzch0v62qnbjutokgrv7d72ox1cnlfwrpp8lehqvyi9aqgjnanmyj2buynu2sf89huemau0kukbjw831nwppqnlr40lqy5w9fp6bldhv8d4bdcsuw3oz6carp2e7hgk6z6bx7tp468qokhyorwonyfwlkk8suqdx7ywj1foxbmf9xnsr7kh887q9712s32d6lsj4rcx44ya4d8z8ayzrvosmb11sw87j5yyiooxxbul150rgl7kxq3tewyn75t9hxtekfqsf22vja6smpjazfekg0pdqrg1hnb6yoqu045dg8fwqc7ls4zcbf94mwv2hkits9itnntqdo23uc8xcqcovhxr6aw6xvseaoc96p5xsucubgbxkwo8rqfdcb8851fvyl51rkkfpc9jfb8ygryc8sapluhh7uzqqsfx47k4id5lnnayitp0v5emnntc0f730s1yiy3upxb7fflp9m7dmgt7qajaiqq2f3y5ey69bxv43f7cxtlcxbar1agfyei2rpajdb1by5ch6508lo8w66g4qdaj7ilgmepg5p1ck2sek3u3vkde3daolt5y1lq2pyz3ds0436lgucspa4xvj0563z0rxdbd7qn23ftcsf2bmo8nr7go9cffanqfp31kqtluw7zbnuanx4thilmabc18yydjkw4fl9aio76kejkn4qr2wau4egbv5ntb5jc4dupt400k98bluy4whpl5cck4i4pd3v05dr6ifqqo52161g5qe465s4bougpco3qwugfv88vhkhk1gou5fz7noe98ffcxl0b1qjdznvh3rii5ufhj47dxygcnh0a1kud5lysegcbz00mrvl1v6q62yd481wnb0d6ptof29iqjoxnvol6sjtwdhxyy95494jur0dm41yi857spg2qixbmnh51qspp2c8enpd4pb63olmxsktdxt6dp5qfmxrnxi3jfmvu99d44axhe9g5by4vt6y3efu5pwni9rtwvcatekv15xzvrwko0ciu4lnkwxud1qw130z7w2djzyz5mkxmv40q18v95qhhg90pxotp6647y2f1q5bom7xwm94g2ao7akxcfxfhn9whioanavjmb3j2a7inb49aigfy70t0tlpmep3jxyjkydwdckyrdd8io4e0zq9swb4ydv18fkefwuk1ru6q0rovtzkx2rzz2s79n0pf1g4ak2errugcdcc2any7ok2scyqwumygncng5u2tcbyj1zsye98xayk6mjixu2zb5gc9htimpi860n5jx7gzwfed616pgmk1rnsmhl11r2av7190e9j5yn39fe6u4csyz49gl9dtf0299907hc3f4d9hc05n5zmfn82w55tcc3rn11o3jxpd35wxn2mt1gcwhuetwqolvwtg0u70h0sck8q8g1fibwkvh8xh9vc534ixagokrsaq891gwbzvqkpat5xa8engvcuygl73rp639hskqa9oix9p1vgp5ilo2u6bjdxzf96gi9qlcihwvo3uk59ry4mrm8d2fm3nc4mm9f6gvwsq5j7pgx5dhwaa79qu32p9zaaqo9nntsbg8wv6zyae6ehwqbdc6ucv5o4sahbkbqbqo395o0fsrwwowy8tt3fx12ddz4jooqh17f8y1ouq3wo40q4wq958iyc82qcl6tgrdkqrej8h3meyhtdjzq62l91gsakx7z66oa1dfcndc7rkj6q0k3h4w051ohvz87qq5x1fqx87it

Wall: 1
Shelf: 1
Volume: 3
Page: 33

すると、この長い文章の中に以下の情報を見つけた。

password is periodicandselfrepeating

これをパスフレーズとして、秘密鍵パスフレーズを解除する。

$ openssl rsa -in secret2.pem -out secret2_without_pass.pem
Enter pass phrase for secret2.pem:
writing RSA key

このファイルをWiresharkで設定して通信を見てみる。/flagをGETしているのでそのレスポンスを見ると、フラグが書いてあった。

AFFCTF{73H_liBr4Ry_0F_B4b3l_!!}