先日開催されていた 2020 FIRST Capture the Flag Challenge にチームで参加していました。*1
FIRST Challenge 2020(サイト閉鎖済み)
https://firstseclounge.org/2020 FIRST Capture the Flag Challenge
https://www.first.org/events/web/ctf-jun2020/
解いた問題について 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 英数字以外に絞って見てみる
- が、意味のあるものや実行可能なものにはならなかった。
しばらく悩む。
他の問題を解きつつ、改めて問題文を見直す。
やっぱり最初と最後にある「<~」と「~>」が全体を囲んでいるように見えて気になる。
そこでこの記号だけを Web 検索にかけてみる。
すると「ASCII85」という単語が多く出てくることに気が付く。
ASCII85 を調べてみると・・・
- Ascii85 - Wikipedia
https://en.wikipedia.org/wiki/Ascii85
お前やーー!
デコーダーがあったので、これにテキストを食わせる。
- Ascii85 / base85: Encode, decode and translate text online — Cryptii
https://cryptii.com/pipes/ascii85-encoding
改行があるとエラーになってしまうので、改行を削除したものを貼り付けた。
無事にフラグゲット。*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?
リンク先のページを見てみる。
ページに記載されている文字列は以下の通り。
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 ページならということで、途中で変なデータ通信がされていないかブラウザの開発者モードで確認してみる。
ページ以外のやりとりは特になかったが、ヘッダーに見慣れない文字列が記載されていた。
x-options: M3 - B - I,IV,V - J,T,V - 1,1,1
なんらか暗号に関わる文字列っぽい。
しばらく悩む。*6
問題のタイトルで検索してみる。
やっぱりこれエニグマじゃない?
ということで、エニグマ暗号文の復号ができるツールを持ってきて、入力が必要なパラメータと手持ちの情報を見比べる。
- Machine Enigma - Déchiffrer, Chiffrer, Coder, Décoder, Encoder
https://www.dcode.fr/chiffre-machine-enigma
M3
とあるから ローターは 3枚っぽい。B
というものや I,IV,V
についてはちょうど設定値にある。J,T,V
や 1,1,1
については曖昧だったのでそれっぽい場所に入れてみる。*7
うまく文字列にならない。
何度か試すも、きれいに読める文字列にはならなかった。
ただ、エニグマであることに間違いはなさそうなので、ほかのツールを試してみる。
CyberChef にもエニグマがあったので、こちらで先ほどと同様にパラメータを埋めていく。
やったでおい。*8
うまく読める文字列になったが、フラグではなかったようなのでもう一つのソースコードに記載されていた方を試す。
空白の位置を調整すると
YOUR FLAG IS JFKJRUIAWXMVDZWYGKNCMLTGKJDXSE
- フラグ:
JFKJRUIAWXMVDZWYGKNCMLTGKJDXSE
Breaking the Code - Bonus
問題文は以下の通りで、文字列がサイトへのリンクになっている。
Can you find the flag?
Bonus Challenge jjlpe oniqy lkwht griha bhesq zyiqz btikt idj Thank you for participating
雰囲気としてはさっきと同じエニグマっぽい。
サイトのソースコードを確認してみる。
大量の文字列が記載されていた。
何らかデータをエンコードしている雰囲気。
とりあえず base64 でデコードしてみる。
デコードできたっぽさある。
PNG とあるので、どうやら png 形式の画像ファイルっぽい。
画像として開くとエニグマの暗号設定らしいものが出てくる。*9
これを地道にひとつひとつ試していった。*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
結果、フラグが得られた。
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
見た感じ、フラグ文字列を何らか置換した文字列っぽい。
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進数が混ざっているのに気づく。
これらを抜き出して、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 個のファイルとフォルダが得られる。
圧縮ファイルの名前にもなっていた「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 部分を分かりやすく図で共有してくれた。再現するとこんなイメージ。
先頭から順に次の文字と 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 を入れてみるが通らず。
ファイルを眺めるとバイナリが逆に詰まっているっぽい。
CyberChef の Reverse で逆に詰めなおしてから取得したハッシュ値がフラグだった。
- フラグ:
095BF40D794B0259556648E114366F46108AB32B324AC9D30399E8E270D47EF5
My Secret - part 2
以下のような問題文と共に、mysecret というファイルが与えられる。
What is the flag in plain text?
与えられるのは1問目と同じファイル。
バイナリを逆にして実行可能な ELF ファイルにしたものを実行すると、以下の結果が得られる。
6B7EDC007B7460D52387CF9238F99C8C3BE1C8988116248A
これを平文に戻せということのよう。
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
これを書き下すと以下の通り。
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
にそれっぽい失敗コマンドを見つける。
これかなぁとフラグに入れてみるが、通らず。
悩んでいたところ、チームメンバが通してくれました。
失敗したコマンドではなく、正しく修正したコマンドがフラグだったらしい。
ちゃんと問題文を読もうねという。。。
- フラグ:
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 の統計情報(正答数、得点分布など)が記載された資料も掲載されています。
- 2020 FIRST Capture the Flag Challenge
https://www.first.org/events/web/ctf-jun2020/
https://www.first.org/resources/papers/ctf-jun2020/last4ofus.pdf
エニグマ暗号機
Enigma, the Bombe, and Typex · gchq/CyberChef Wiki · GitHub
https://github.com/gchq/CyberChef/wiki/Enigma,-the-Bombe,-and-TypexThe Enigma Cipher Machine and Breaking the Enigma Code
https://www.mpoweruk.com/enigma.htmEnigma Daily Settings Generator | 101 Computing
https://www.101computing.net/enigma-daily-settings-generator/ナチスの暗号機エニグマの仕組み : カラパイア
http://karapaia.com/archives/52210869.html
付録
解けなかった問題: 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?
与えられたファイルの拡張子から探すと以下のツールが見つかる。
- Saleaeのロジックアナライザソフトウェア
https://www.saleae.com/ja/downloads/
実際に使ってみるとそれっぽくファイルを開くことができる。
ただ、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 で点数の低いヒントは「それは知ってる」というものばかりだったので、開くなら最後から。
ということで開いた結果。
メンバ一同「??????」
- S-record - Wikipedia
https://ja.wikipedia.org/wiki/S-record
Motorola S-recordは、モトローラによって作成されたファイル形式であり、
このヒントを活用できるところまでさえ到達していなかったという予想外の展開。
しばらく試行錯誤したものの、解けそうな気配がない。
ということで、もうひとつヒントを開く。
最後から2番目のヒント。
一同 「それはしってる!!!」
ヒントは決して期待に応えないということを噛み締めつつ、ふと得点を見ると
なんか減っている・・・!
よくよく CTF の説明文を読むと、ヒントは問題の獲得点数が減る方式ではなく、点数を払って買う方式とのこと。
なんと・・・。*17
この時点でまだ一つ目のヒントが残っていたが、あまり意味がなさそうと判断して開けないこととした。
その後、バイナリを縦読みすると実行可能形式になりそうな気配を感じるも、解くには至らず。
結果、解けなかった。*18
CTF 終了後に1つ目のヒントを開いたところ。
出てきたのは、見つけていたツール「Saleaeのロジックアナライザソフトウェア 」の設定値。
これや・・・、
これが一番欲しかったヒントや・・・。
解答した問題一覧
チームではなく個人のものだけ掲載。
# | 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 のトップページ
ロゴが並んでいてかっこよい。
更新履歴
- 2021-06-17 誤字修正
- 2020/07/05 新規作成
- 2020/08/31 CTF サイトが閉じられていたのを反映
*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