セキュリティ猫の備忘録

セキュリティに関する事柄を備忘録として記していく

setodaNote CTF Writeup

setodaNote CTFに参加してきました。

setodaNote CTFはsoji256(@soji256)さんが主催する初心者向けのCTFです。
9カテゴリから全69問出題されていました。

今回はCTFに挑戦してみましたので、Writeupを書いてみることにしました。
記載対象はメダルが取れたカテゴリのみに限定しています。

Network

Host(30)

あなたはある通信を保存したファイルを受け取りました。添付されたファイルを解析し、通信先の Web サーバのホスト名を特定してください。

フラグはホスト名をフラグ形式で答えてください。例えばホスト名が host.example.com であった場合、フラグは flag{host.example.com} となります。

ファイルを解析して、通信先のホスト名を解答する問題です。
Wiresharkの「TCPストリーム」の機能で確認すると以下の情報を見ることができます。

GET / HTTP/1.1
Host: ctf.setodanote.net
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36 Edg/89.0.774.45
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: ja,en;q=0.9,en-GB;q=0.8,en-US;q=0.7

flag

flag{ctf.setodanote.net}

tkys_never_die(50)

うまく爆発を避けれられているといいが。爆発音とともに通信が途切れる間際、後輩からデータが送られてきました。ターゲットが重要なファイルにアクセスしたことを示す証拠だと言い残して。後輩のためにもデータを解析し、重要なファイルの内容を特定してください。

添付されたファイルを解析し、フラグを得てください。

ファイルを解析してflagを入手する問題。
パケットを見ると以下の情報を確認しました。

f:id:nekochanSecurity555:20210831121711p:plain
パケット情報

「flag.html」,「flag.png」の怪しいファイルを確認したので、Wiresharkの機能を使って対象ファイルを抽出します。

「ファイル」>「オブジェクトをエクスポート」>「HTTP...」

抽出したファイルを開くと以下の画像ファイルが得られました。

f:id:nekochanSecurity555:20210831122052p:plain
flag.png

flag

flag{a_treasure_trove}

echo_request(120)

組織内の通信を監視している部署から不審な通信データがあるので解析をしてほしいと依頼がありました。通信自体は許可されたプロトコルが使用されているようですが、、、

添付されたファイルを解析し、フラグを入手してください。

ファイルを解析してflagを入手する問題。

f:id:nekochanSecurity555:20210831130953p:plain
パケット情報

パケットの中身を見るとechoパケットが目立ちます。
echoパケットの中身を見てみると各パケットに何らかのデータを1バイトずつ含まれていることがわかります。

f:id:nekochanSecurity555:20210831131432p:plain
echoパケット

このデータをつなぎ合わせるとflagが入手できます。

flag

flag{ICMP_Tunneling_T1095}

stay_in_touch(150)

あなたはある事件の調査としてある人物の通信を監視しています。どうやら誰かと連絡を取り合っているようです。通信データファイルを解析し、やりとりの内容を明らかにしてください。

添付されたファイルを解析し、フラグを入手してください。

ファイルを解析してflagを入手する問題。
Wiresharkの「TCPストリーム」の機能で確認するとNo.574 - 742に以下の情報を見ることができます。

f:id:nekochanSecurity555:20210831143348p:plain
パケット情報

何らかのZIPファイルが添付されたメールが確認できたので、ファイルを復元します。

import base64
data = b"UEsDBBQAAQAAADBq8FK0Nz5zSgAAAD4AAAATAAAAUmVwb3J0LUFWLVQwMDk3LnR4dAzRMzm6s5vAM3huF0n2GEKFrarxVD3WvzurjKz9sjA7iD6nWis0GBRcIdcyrQkqliocBi2lCUB6J0hRUgHzDVCnVx6LnLS5LenqUEsBAj8AFAABAAAAMGrwUrQ3PnNKAAAAPgAAABMAJAAAAAAAAAAgAAAAAAAAAFJlcG9ydC1BVi1UMDA5Ny50eHQKACAAAAAAAAEAGADNWpx++XnXARJtllL6edcB0TOVfvl51wFQSwUGAAAAAAEAAQBlAAAAewAAAAAA"
b64data=base64.b64decode(data)
f = open("Report-AV-T0097.zip","wb")
f.write(b64data)
f.close()

復元したZIPファイルの中のTxtファイルを開こうとするとパスワードを要求されました。

f:id:nekochanSecurity555:20210831145817p:plain
Zip file -password-

パスワードについてもパケットデータ内あると思い、探してみると、「パスワード通知(44OR44K544Ov44O844OJ6YCa55+l)」というタイトルのメールにパスワードが記載されていることが確認できました。

f:id:nekochanSecurity555:20210831150336p:plain
「パスワード通知」メール

パスワードを入力し、Txtファイルを開くとflagを入手できました。

flag

flag{SoNtOkIhAmOuKaTaHoUmOtSuMuRuNoSa;)}

yes_you_can(150)

精密機械の技術者である古い友人から一通の封筒が送られてきました。中にはあなたに解析してほしいと震えた筆跡で書かれた手紙と1枚の SD カード。SD カードの中には1つのファイルが記録されていました。

添付されたファイルを解析してフラグを入手してください。

ファイルを解析してflagを入手する問題。
dump.logファイルの中身を見てみると、何らかのログデータが。
調べてみるとCAN(Controller Area Network)通信のログデータの模様。
ログの中には、時間、仮想LAN名、CAN ID、データが含まれており、この中からflag情報を入手するようです。

膨大なデータの中からflagを探すとなるととっかかりが必要なので、
とりあえずCAN ID毎の件数を調べてみることにしました。膨大なデータから探す場合、極端に少ないデータに情報が隠されていることが多いからです。

f:id:nekochanSecurity555:20210831161149p:plain
CAN ID毎の件数

調べるとCAN ID 5A1が最も件数が少なかったので、5A1のデータを調べてみました。

f:id:nekochanSecurity555:20210831161338p:plain
CAN ID 5A1のデータ

しかし、データを見ると、3パターンしかなく、異なるのは末尾の2桁のみであるため、ここから文字と思われるデータは抽出できそうにありません。

そこで今度は、CAN ID毎のデータに着目してみました。
ここで探していたのは、データパターンが多いCAN IDまたは、データパターンが少なくてもパターンに重複箇所が少ないCAN IDです。
データパターンが多いものは一部分が目的のデータになっている可能性があり、重複箇所が少ないものも連結すると目的のデータになるものが多いと思ったからです。
この条件に見合うものは、CAN ID 40Cと244で見つけることができました。

f:id:nekochanSecurity555:20210831162141p:plainf:id:nekochanSecurity555:20210831162202p:plain
CAN ID 40Cと244のデータ

40Cのデータはどのパターンで組み合わせてみても、flagと思われる情報は出てきませんでした。

つづいてCAN ID 244のデータを時系列順にHex処理してみてみると、

f:id:nekochanSecurity555:20210831162709p:plain
CAN ID 244:時系列順Hexエンコード

flagと思わる情報が現れました。

これを順に拾っていくとflagが得られます。

flag

flag{can_bus_hacking}

ちなみに、このログを以下のツールに読み込ませてみると、スピードメータが小刻みに特定の速度を示しているのがわかるので、
そのデータを基に速度に関連するデータにFlag情報が含まれているかもと予想がたてられます。


Digdig(200)

組織内の通信を監視している部署からマルウェア感染した端末から他にはない不審な通信が発生していたことが分かり、急ぎ解析してほしいを依頼がありました。どうやら、通信自体は組織内で許可されているプロトコルが使用されていたため外部に通信できた可能性もあり焦っているようです。

添付されたファイルを解析し、フラグを入手してください。

ファイルを解析してflagを入手する問題。
異なるサブドメインについてDNSリクエストを送っていることがわかります。

f:id:nekochanSecurity555:20210906211829p:plain
DNS通信

一先ず、サブドメインに文字が隠されていそうなので抜き出します。

f:id:nekochanSecurity555:20210906213806p:plain
DNSリクエス

flagと思われるデータは出てきましたが、ところどころ破損したような形になっています。
抽出したデータをよく見てみると、文字として認識できている箇所は、各サブドメインの値の下16桁の模様。
005aayyyxxxxxxxxxxxxxxxx
赤字の部分は不要かと思ったのですが、赤字の箇所をよく見てみると一意の値になっており、連番のようにも見える。。。

というわけで、ソートをかけて、005aayyyを削り、文字に変換してみると以下のデータが見れました。

f:id:nekochanSecurity555:20210906214822p:plain
DNS flag

ダミーフラグも含まれていましたが、正解のflagを入れてみると、あっていました。

flag

flag{DNS_S3cur17y_T1071!}

Logger(250)

夕暮れ時、あなたの携帯が鳴動します。相手の番号は不明。非通知は拒否設定のはずと不思議に思いつつ電話に出ると「お前の秘密を知っている」と低い男の声が聞こえすぐに切れてしまいました。直後、あなたの携帯にファイルが添付された空白のメールが届きます。

添付されたファイルを解析してフラグを入手してください。

ファイルを解析してflagを入手する問題。
ファイルを確認すると、USBの通信データの模様。

f:id:nekochanSecurity555:20210906220757p:plain
パケットデータ

データを確認すると、Leftover Capture Dataの3バイト目の値が変化していることがわかる。
そこで、そのデータを抜き出してみて文字に置き換えてみる。
f:id:nekochanSecurity555:20210906222220p:plain
特に意味のあるデータには見えない。
USB通信なので、その他にデータに意味を持たせるとしたらキーボードのコードではないかと推測しました。
以下のサイトの対応表と照らし合わせてデータを見てみると、次のデータが出てきました。
USB HID Usage ID の Scancode 変換と対応するキー | capyBaral

one popular bbut unverified explanati oon for the qwerty arrangement is that it wwas designed to reduce the likelihood of <strong>flag[qwe-keyb0ard-rty]</strong> internal clashhing of typebar s by placing commonly ussed combinatiioons of letters farther froom each oher inside the machine.Enter

flagと思われるデータがあり、”[”→”{”、"qwerty"はキーボード配列のことなので、これを大文字に変えたものがflagでした。

flag

flag{QWE-keyb0ard-RTY}

tkys_not_enough(250)

せっかく内偵中の後輩から通信データが送られてきたのに。いわく決定的な証拠を掴んだとのことですが、普段とは異なる方法で取得したデータなのか解析ツールにうまく取り込めません。後輩に聞こうにも通信データが送られた直後「やはり君だったか」という聞きなれない男の声を最後に連絡が途絶えてしまっています。あなたは何とかしてこの通信データを解析しなければなりません。

添付されたファイルを解析し、フラグを入手してください。

ファイルを解析してflagを入手する問題。
Wiresharkでファイルを開いてみると、以下のエラーが出てきました。

f:id:nekochanSecurity555:20210906230050p:plain
Wiresharkエラー

一先ずデータのすべてを見てみるために、パケットデータを抜き出してみました。

a = open("tkys_not_enough.pcap","rb")
b = a.read()
with open("test.txt","w") as f:
	f.write(b.hex())
a.close()

すると、大量の「ff」データの後に別のデータが見えてきました。

f:id:nekochanSecurity555:20210906230636p:plain
パケットデータ

得られたデータを文字に変換すると、何らかの通信と思われるデータが確認できました。

f:id:nekochanSecurity555:20210906230909p:plain

このデータを追っていくと、途中まで読めていたデータがgzipで圧縮されていました。

HTTP/1.1 200 OK
Date: Wed, 04 Aug 2021 06:42:59 GMT
Server: Apache/2.4.48 (Debian)
Last-Modified: Wed, 04 Aug 2021 06:29:34 GMT
ETag: "79-5c8b5ed077ee4-gzip"
Accept-Ranges: bytes
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 122
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html

............;.à ..wNño]: ^ sN.YÄ!..#pT¡ªw.ݾÇò.DM5Â.g£`)0.ò?

そこで、Cyberchefを使って解読してみました。解読するデータ部分は、「Content-Type: text/html」の後の改行以降のデータを「Content-Length: 122」から122バイト分を抜き出します。

f:id:nekochanSecurity555:20210906232020p:plain

するとflagが出てきました。

flag

flag{netw0rk_shell_2000}

Programing

ZZZIPPP(80)

あなたはあるファイルの解析作業を依頼されました。何重にも入れ子になった箱のようなファイルのようで、その中に組織にとって重要な機密情報が入っているようです。

添付されたファイルを解析してフラグを入手してください。

ファイルを解析してflagを入手する問題。
ZIPの中にZIPがあり、マトリョーシカのように次々解凍していき最後にflagを取り出す問題になります。
たった1000回ZIPを解凍するだけでflagをゲットできる簡単な問題ですね!!

flag

flag{loop-zip-1989-zip-loop}

.............................................さすがに手動はつらいので以下のコードを使って解凍しました。

import zipfile
import os
for i in range(1000,0,-1):
	fname = "flag"+str(i)+".zip"
	print(fname)
	with zipfile.ZipFile(fname, "r") as zp:
		zp.extractall()					#展開
	os.remove(fname)					#展開済みのファイルを削除

echo_me(120)

山登りが趣味だという同僚が疲れた様子で話しかけてきます。山でヤッホーと声を出せば、いつでもヤッホーと返ってくる。そんなあたりまえを支えるやまびこさんの気持ちって、どんな感じなんでしょうね。その眼には若干の狂気が宿っているようにも思えました。あなたは同僚を狂気から救うため、解析作業を手伝うことにしました。

以下にアクセスしてフラグを得てください。

nc 10.1.1.10 12020

この設問では Linux ターミナルを使用します。

サーバーにアクセスして回答する問題。
指定されたコマンドを実行すると以下の応答が返ってきました。

nc 10.1.1.10 12020

==========
echo me: 10990794
==========
10990794
Correct!

==========
echo me: 44631989
==========
......

「echo me:」の後の数字をひたすら入力していくようです。
こちらも無心できたものを入力していけばいいので楽ですねw。

まあ、手入力なんてやってたら発狂しそうですが。。。
以下のコードを組んで対処しました。

import socket
import re
import time

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

for i in range(1,1000,1):
	response = client.recv(4096)
	print(response)
	t=re.search(r'\d+', response)
	print(t.group())
	client.send(t.group()+"\n")
	time.sleep(2)

何回か(カウントし忘れたので、回数は不明)入力を返したのちにflagが返ってきました。

flag

flag{Hellow_yamabiko_Yoo-hoo!}

EZZZIPPP(150)

あなたは再びあるファイルの解析作業を依頼されました。何重にも入れ子になった箱のようなファイルですが、今度は鍵までかかっているようです。ファイルを解析し中に封じ込められている機密情報を取得してください。

ファイルを解析してフラグを入手してください。

ファイルを解析してflagを入手する問題。
「ZZZIPPP」と同様の課題であり異なるのは、それぞれのZIPを解凍するのに同梱されているpass.txtに記載されているパスワードを使って解凍する必要があるという点です。

こちらもたった1000回パスワードZIPを解凍するだけで...(略)。

さすがに手動で解凍する気にはなれないので、以下のコードを組んでflagをゲットしました。

import zipfile
import os
for i in range(1000,0,-1):
	fname = "flag"+str(i)+".zip"
	print(fname)
	with open("pass.txt","r") as f:
		a = f.read()
		with zipfile.ZipFile(fname, "r") as zp:
			zp.extractall(pwd=a[:-1].encode("utf-8"))
	os.remove(fname)

flag

flag{bdf574f15645df736df13daef06128b8}

deep_thought(250)

計算勝負をしましょう。普段は寡黙に働き続けているサーバが不意に話しかけてきました。あなたは珍しいこともあるものだと思いつつも、そのサーバからの挑戦を受けることにしました。

以下にアクセスしてフラグを得てください。

nc 10.1.1.10 12010

この設問では Linux ターミナルを使用します。

サーバーにアクセスして回答する問題。
指定されたコマンドを実行すると以下の応答が返ってきました。

nc 10.1.1.10 12010

[ Q1 ]
4 + 5
9
Correct!

[ Q2 ]
7 + 4
11
Correct!

[ Q3 ]
11 + 9
......

出された計算問題をひたすら解答すればいいようですね。
こちらも無心で....(略)w。

ここも以下のコードを組んで対処しました。

import socket
import re
import time

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(("10.1.1.10",12010))
time.sleep(2)

for i in range(1,1000,1):
	response = client.recv(4096)
	print(response)
	t1=re.search(r'\d+ . \d+', response)
	t1=t1.group()
	t = re.findall(r'\d+', t1)
	#print(t.group())
	print(t)
	if "+" in t1:
		sum = int(t[0]) + int(t[1])
	if "-" in t1:
		sum = int(t[0]) - int(t[1])
	if "*" in t1:
		sum = int(t[0]) * int(t[1])
	if "/" in t1:
		sum = int(t[0]) / int(t[1])
	print(sum)
	client.send(str(sum)+"\n")
	time.sleep(2)

実行すると50問目にflagが返ってきました。

flag

flag{__42__}

感想

今回は初心者向けのCTFに参加してきました。
多くのCTFは常時開催のオンライン型のものか、24時間開催の短いものかが主流のため、
なかなか競うタイプのCTFに参加する機会が取れなかったのですが、
このCTFは2週間と開催されていたため、休みの日に時間をとって参加することができました。
まあ、休みは完全につぶしてしまいましたが。。。

このようなCTFを開催していただきありがとうございます。
とても楽しかったです。

また、こうして振り返ることで自分の苦手な分野が見えてきたので、苦手分野を克服できるようにしていきたいと思います。