FreedomCTF Spring 2021 Writeup

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

Simple Discord (Miscellaneous 5)

Discordに入り、#generalチャネルのトピックを見ると、フラグが書いてあった。

flag{u3eD1scordf0rH3lp}

Sanity Check (Miscellaneous 5)

豚の学名を答える。

flag{Sus}

TCP Fact (Networking 5)

TCP/IPプロトコルを実装した最初のネットワークを答える。

flag{ARPANET}

Toujours (Cryptography 25)

暗号文は以下のようになっている。

Dans la béatitude pour toujours
Dans la félicité en une infinité
Dans la gloire irrévocablement
éternellement à perpétuité
Dans la divinité pour toujours
à perpétuité dans la lumière

https://www.dcode.fr/ave-maria-trithemeで復号する。

UORDLIKEPOEM

U,V,Wは同じ暗号なので、意味が通るように調整する。

flag{wordlikepoem}

Behind the Scene (Web Exploitation 5)

http://networking.freedomctf.org/.envにアクセスすると、以下のbase64らしき文字列が書いてあった。

mxhZ3sxeXQxNzE4MXk3ODE4OTE3MTcxfQ==

先頭に"Z"をつけて、base64デコードする。

$ echo ZmxhZ3sxeXQxNzE4MXk3ODE4OTE3MTcxfQ== | base64 -d
flag{1yt17181y7818917171}
flag{1yt17181y7818917171}

IP Lookup (Networking 5)

networking.freedomctf.orgのIPを答える。

$ nslookup networking.freedomctf.org
Server:		127.0.0.53
Address:	127.0.0.53#53

Non-authoritative answer:
Name:	networking.freedomctf.org
Address: 18.189.22.84
flag{18.189.22.84}

Pretty Sunset (Forensics, Steganography 25)

jpgが添付されている。Stegsolveで開き、Blue plane 0を見ると、フラグが書いてあった。
f:id:satou-y:20210620205942p:plain

flag{Hidden_l1ke_a_pro}

Zip Up Prep Up (Forensics, Steganography 5)

$ unzip flag.zip
Archive:  flag.zip
 extracting: flag/.hidden            
 extracting: flag/flag               
 extracting: flag/flag2              
 extracting: flag/flag3              
 extracting: flag/flag4              
 extracting: flag/flag5              
 extracting: flag/hidden             
 extracting: flag/hidden1            
 extracting: flag/hidden2            
 extracting: flag/hidden3            
 extracting: flag/hidden4            
$ cat flag/.hidden
flag{h0wt0unz1pan43xtracta_7ile}
flag{h0wt0unz1pan43xtracta_7ile}

Bee Sixty Four (Cryptography 5)

base64文字列をデコードするだけの問題。

$ echo ZmxhZ3tSaWdodDBmZl90aGVfQjR0fQ== | base64 -d
flag{Right0ff_the_B4t}
flag{Right0ff_the_B4t}

Assembly 1 (Reverse Engineering 5)

アセンブラファイルから実行ファイルを作成して実行する。

$ as -o Assembly1.o Assembly1.s
$ gcc -o Assembly1 Assembly1.o
$ ./Assembly1
flag{Assembly_is_fun_3dws9r}
flag{Assembly_is_fun_3dws9r}

Netting (Networking 5)

freedomctf.orgのIPアドレス、サブネットクラス、サブネットマスクを答える。

$ nslookup freedomctf.org
Server:		127.0.0.53
Address:	127.0.0.53#53

Non-authoritative answer:
Name:	freedomctf.org
Address: 172.67.178.180
Name:	freedomctf.org
Address: 104.21.88.120
Name:	freedomctf.org
Address: 2606:4700:3031::6815:5878
Name:	freedomctf.org
Address: 2606:4700:3033::ac43:b2b4

第一オクテットが172のため、Bクラスでサブネットマスクは255.255.0.0。

flag{172.67.178.180_B_255.255.0.0}

Stick Bug (Cryptography 25)

黄金虫の暗号。https://www.dcode.fr/gold-bug-poeで復号する。

PHRYGANISTRIA CHINENSIS
flag{phryganistria chinensis}

Networking Recon? (Networking 25)

Webサーバの使用サーバ名とバージョンを答える。
存在しないパスを指定してアクセスすると、Not Foundとなり、Webサーバの情報が表示された。

Apache/2.4.41 (Ubuntu) Server at networking.freedomctf.org Port 80
flag{Apache_2.4.41}

Failed Inspection (Web Exploitation 25)

ブラウザでアクセスすると、リダイレクトしているようだったので、curlでリダイレクトさせずにアクセスする。

$ curl https://failedinspection.freedomctf.org/
<!DOCTYPE html>
<html>
  <head>
    <style>
      * {
        margin: 0;
        padding: 0;
      }

      body {
        background-color: rgb(197, 190, 190);
        font-family: "Lucida Handwriting";
        font-size: 30px;
      }

      h1 {
        color: rgb(216, 129, 71);
        text-align: center;
        font-size: 60px;
      }

      h2 {
        color: rgb(80, 82, 105);
        text-align: center;
        font-size: 40px;
      }

      img {
        width: 185px;
        height: 259px;
      }

      .center-container {
        display: flex;
        width: 100%;
        justify-content: space-around;
        margin-top: 10vh;
      }
    </style>
  </head>

  <body>
    <h1>Inspector:</h1>
    <h2>Was your most recent inspection failed?</h2>

    <div class="center-container">
      <div>
        Contact Michael C. Westfall today at:
        <ul style="margin-left: 5vw">
          <li><a href="michael.westfall@osig.virginia.gov">Email</a></li>
          <li><a href="(804) 625-3255">Phone Number</a></li>
          <li><a href="(804) 786-2341">Fax</a></li>
        </ul>
      </div>
      <div>
        <img src="DeputyInspectorGeneral.jpg" />
      </div>
    </div>
    <script>
      window.onresize = function () {
        if (window.outerHeight - window.innerHeight > 100) {
          // console was opened (or screen was resized)
            while(true){
                window.open();
            }
        }
      };

      document.addEventListener("contextmenu", (event) =>
        event.preventDefault()
      );
      window.addEventListener("load", (event) => {
        // window.open();
        window.close();
        document.close();
      });
      document.onkeydown = function (e) {
        if (event.keyCode == 123) {
          return false;
        }
        if (e.ctrlKey) {
          return false;
        }
        return false;
      };
    </script>
  </body>
  <!--Their inspection might have failed, but you passed! flag{N0_insp3ct_n0_prOb|3m}-->
</html>
flag{N0_insp3ct_n0_prOb|3m}

Triangle (Forensics, Steganography 5)

$ exiftool triANGLE.png 
ExifTool Version Number         : 10.80
File Name                       : triANGLE.png
Directory                       : .
File Size                       : 83 kB
File Modification Date/Time     : 2021:06:05 16:51:36+09:00
File Access Date/Time           : 2021:06:05 16:52:14+09:00
File Inode Change Date/Time     : 2021:06:05 16:51:36+09:00
File Permissions                : rwxrwxrwx
File Type                       : PNG
File Type Extension             : png
MIME Type                       : image/png
Image Width                     : 1688
Image Height                    : 828
Bit Depth                       : 8
Color Type                      : RGB with Alpha
Compression                     : Deflate/Inflate
Filter                          : Adaptive
Interlace                       : Noninterlaced
Author                          : flag{KVzPgxqTaKuBRAVRWaLs}
Image Size                      : 1688x828
Megapixels                      : 1.4

!Apple (Reverse Engineering 50)

Bytecode Viewerで開き、デコンパイルする。

package com.example.apkchallenge;

import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import com.example.apkchallenge.MainActivity.1;
import com.example.apkchallenge.MainActivity.2;

public class MainActivity extends AppCompatActivity {
   public void callLoginServices() {
      Volley.newRequestQueue(this).add(new StringRequest(0, "https://phaleroviamobile.freedomctf.org/secret-message", new 1(this), new 2(this)));
   }

   protected void onCreate(Bundle var1) {
      super.onCreate(var1);
      this.setContentView(2131427356);
   }

   public void sendLogin(View var1) {
      TextView var3 = (TextView)this.findViewById(2131231010);
      TextView var2 = (TextView)this.findViewById(2131230915);
      var3.getText().toString();
      var2.getText().toString();
      this.callLoginServices();
   }
}

https://phaleroviamobile.freedomctf.org/secret-messageにアクセスしてみるとフラグが書いてあった。

flag{Droid_Broid_bot}

Cap Cap (Networking 25)

ftp-dataの通信でフィルタリングする。その通信パケット中にあるpart1.png~part11.png、part13.pngの画像をエクスポートする。part12.pngはなかった。拡大・縮小しながら組み合わせると、一部が欠けたQRコードになる。
f:id:satou-y:20210620211548p:plain
これをテキストにして読み込む。

$ cat qr.txt
XXXXXXX_X_XXXXX___XXXXXXX
X_____X_XX____X_X_X_____X
X_XXX_X__XXX_X__X_X_XXX_X
X_XXX_X_X_XXXX_XX_X_XXX_X
X_XXX_X__XXX_X_X__X_XXX_X
X_____X___X__X____X_____X
XXXXXXX_X_X_X_X_X_XXXXXXX
________XXX_X__X_________
X_XX_XXX___XX_____X__X_XX
XXXXX__X_XXX__X_X__X_X___
XX_XXXXX___X_XX_X_XXXX___
__XXX_______XXXX__XX_XX__
_X_X_XXXXX___X_X_XXXXXXX_
_X_X______XX___XXXX_XX_XX
_XXX_XXX_X__XXX__X_X_X_X_
X___XX_XX___X__XXX__X____
____XXXX_XXX_X_XXXXXXXX__
________X___X_X_X___X???X
XXXXXXX_XXXXX_X_X_X_X???X
X_____X_XX__X__XX___X???X
X_XXX_X___XXXX__XXXXX____
X_XXX_X_XX__XX___XX?????X
X_XXX_X_XX_XXX_____?????_
X_____X__XX____X_XX?????_
XXXXXXX_XXX_X_XX_X_?????X
$ python sqrd.py qr.txt
flag{fix1ng_1mgs18934}
flag{fix1ng_1mgs18934}

RSA-ONE (Cryptography 5)

p, qがわかっているので、そのまま復号する。

from Crypto.Util.number import *

p = 13096400414421552156969028937353174744908047161155295408964887163262826826036521470217012894200517287339110399380688376522626855275687133288684619779082547
q = 12840054857178763772230365613402198055084749343413307404027010001945719437978924658864009419366334955476170242725335489155132647907960715147801905246920609
e = 65537
ct = 32305409026163713222859212354020077015304928685327842744369445191616303537762118069639355953458045773045005993195097944549512923751703719047488817344339599720835627540521189095721269570852022720021666021201899667129233207585472537514546031754665930962489472140040978466147507216004529382189503453518588974947

phi = (p - 1) * (q - 1)
d = inverse(e, phi)
m = pow(ct, d, p * q)
flag = long_to_bytes(m)
print flag
flag{hellothisisthersaanswer}

CRT0-Q1 (Cryptography 5)

暗号化の処理概要は以下の通り。

・encr(apjubh(phrase))
 ・apjubh()
  文字列の順序を逆にする
 ・encr()
  ・key:1~5のランダム値
  ・keyだけシフト
  ・~をZに置換
  ・%をQに置換

keyの5パターンについて、元に戻して英単語として成り立つものを選択する。

enc = 'l4butzb9`b`oJ`fmef4O'

enc = enc.replace('Z', '~')
enc = enc.replace('Q', '%')

for key in range(1, 6):
    dec = ''
    for i in range(len(enc)):
        dec += chr(ord(enc[i]) - key)
    flag = 'flag{%s}' % dec[::-1]
    print flag

実行結果は以下の通り。

flag{N3edle_In_a_8aysta3k}
flag{M2dckd^Hm^`^7`xrs`2j}
flag{L1cbjc]Gl]_]6_wqr_1i}
flag{K0baib\Fk\^\5^vpq^0h}
flag{J/a`ha[Ej[][4]uop]/g}
flag{N3edle_In_a_8aysta3k}

RSA-TWO (Cryptography 25)

nをfactordbで素因数分解する。

n = 12968523063040435873 * 14978383016497116121

あとはそのまま復号するが文字にならない。復号した数値を3桁ごとに区切り、ASCIIコードとしてデコードする。

from Crypto.Util.number import *

e = 23
n = 194247505596496023881578032915335008633
ct1 = 65205298022099085283449917096537195340
ct2 = 152080695252271793478056704090860133614

p = 12968523063040435873
q = 14978383016497116121
assert n == p * q
phi = (p - 1) * (q - 1)
d = inverse(e, phi)
m1 = pow(ct1, d, n)
m2 = pow(ct2, d, n)

s_m1 = str(m1)
s_m2 = str(m2)

flag = ''
for i in range(0, len(s_m1), 3):
    flag += chr(int(s_m1[i:i+3]))
for i in range(0, len(s_m2), 3):
    flag += chr(int(s_m2[i:i+3]))

print flag
flag{rsa_trouble_dyx1x}

CRT1-Q2 (Cryptography 25)

暗号処理の概要は以下の通り。

・フラグを5行8列に横に並べ、空きの箇所は"Z"で埋める。
・縦に読み、文字列にする。
・順を逆にする。

以上を元に逆算する。

enc = '74CEE12EB1C1A00FF30FD37B74EF2477B37C957D'
enc = enc[::-1]

flag = ''
for r in range(5):
    for c in range(8):
        flag += enc[r + c * 5]

flag = 'flag{%s}' % flag
print flag
flag{D747F01E732B00BE5BF73AEC97E3F124C74DFC17}

Enigma (Cryptography 25)

条件を元にring settingのブルートフォースで復号する。hintを見ると次のように書いてあるので、条件を満たすもののみ出力する。

Three decoded characters in the flag are: 'loo'
from enigma.machine import EnigmaMachine
import itertools

ciphertext = 'cazmgsczlrkrkmnlhsvvma'

for ring in itertools.product(range(26), repeat=3):
    machine = EnigmaMachine.from_key_sheet(
        rotors = 'I II III',
        reflector = 'B',
        ring_settings = list(ring),
        plugboard_settings='GD HR IC KO ML QU PZ WA FN BS')
    machine.set_display('IQL')
    plaintext = machine.process_text(ciphertext.upper())
    if 'loo' in plaintext.lower():
        print plaintext

実行結果は以下の通り。

EPSCKMOREBHVVZMJTRJLOO
UNSJMYLOOOZTPDKQZRFENK
YCQSLOOXBVGQWTWJPEINSD
QLUCLHUCPLOOHCRUSCJCQP
XCIHUMILOOIYWIBYTUEMBG
VSDLOOQBIZPHGBXGIRASPG
JZQNTQJRUILOOTZIKOIQES
HLOOSAIXWTYWTXUIXTNYUQ
PMAKLTULOOXONXRXCHQXIH
TLVIBEUGTOXVQFXCYXLOOK
BKIQDRJUQGLOOTQQIRCQSJ
AUCRLOOAFUGTYWURQJXFGO
XOWQILGOOQIXTLOOAUAHAH
MEFODUPLOOIKPYCCIKYBYE
UENFWRFLVLOOQCPQZHDRGQ
ENGIMAANDLOOPISNOTHARD★
LLQFDDLOOYVFJVPSQNGJGQ
FKLOOMXXKBZKHPWEPVIUNJ
WQOCKEDGSSLOOKEFTCTPZR
LCTGAMVFUFWSJLOOALOPCC
LOOKKZAMSSSXNSUKPLBTJY
INADUDMYNHBMLOORNYAZXP
FYOZKLOOWKBYOSZWVGYQJK
DLRNJAFINPNXEWOSDALOOY
flag{ENGIMAANDLOOPISNOTHARD}