はまやんはまやんはまやん

hamayanhamayan's blog

Hack The Box Sherlocks - Lockpick2.0 Writeup

https://app.hackthebox.com/sherlocks/Lockpick2.0
Hack The Box Sherlocksとは

Sherlock Scenario

We've been hit by Ransomware again, but this time the threat actor seems to have upped their skillset. Once again a they've managed to encrypt a large set of our files. It is our policy NOT to negotiate with criminals. Please recover the files they have encrypted - we have no other option! Unfortunately our CEO is on a no-tech retreat so can't be reached. Warning This is a warning that this Sherlock includes software that is going to interact with your computer and files. This software has been intentionally included for educational purposes and is NOT intended to be executed or used otherwise. Always handle such files in isolated, controlled, and secure environments. One the Sherlock zip has been unzipped, you will find a DANGER.txt file. Please read this to proceed.
私たちは再びランサムウェアの被害に遭いましたが、今回は脅威アクターのスキルセットが向上しているようです。もう一度、彼らは私たちの大規模なファイルセットを暗号化することに成功しました。犯罪者と交渉しないのが私たちのポリシーです。暗号化されたファイルを回復してください。他に選択肢はありません。残念ながら、弊社の CEO は技術関連のない休暇中のため、連絡が取れません。警告 これは、この Sherlock には、お使いのコンピュータやファイルと対話するソフトウェアが含まれていることを示す警告です。このソフトウェアは教育目的で意図的に含まれており、それ以外の方法で実行または使用することを意図したものではありません。このようなファイルは常に、隔離され、管理された安全な環境で処理してください。Sherlock zip を解凍すると、DANGER.txt ファイルが見つかります。続行するにはこれをお読みください。

ランサムウェアに関連するファイル群が与えられる。

Tasks

Task 1

What type of encryption has been utilised to encrypt the files provided?
提供されたファイルの暗号化にはどのような種類の暗号化が使用されていますか?

どうせAESやろと思って入力したらあってた。

Task 2

Which market is our CEO planning on expanding into? (Please answer with the wording utilised in the PDF)
当社の CEO はどの市場への進出を計画していますか? (PDFに記載されている文言で回答してください)

UPXでパッキングされてたのでまずは解除する。upx -d update。AESであることはTask 1から分かっているので、その前提で読んでいくと以下のように復号化に必要な情報が手に入る。

Type: aes_256_cbc
key: f3fc056da1185eae370d76d47c4cf9db9f4efd1c1585cde3a7bcc6cb5889f6db
IV: 01448c7909939e13ce359710b9f0dc2e

これでファイル復号化ができ、expanding-horizons.pdfを開くとAustralian marketであると分かる。

Task 3

Please confirm the name of the bank our CEO would like to takeover?
当社の CEO が買収を希望している銀行の名前を確認してください。

takeover.docxを復号化するとNotionwide Bankであると分かる。

Task 4

What is the file name of the key utlised by the attacker?
攻撃者が使用したキーのファイル名は何ですか?

使われている短縮URLのLocationから分かる。

$ curl https://rb.gy/3flsy -v
*   Trying 3.229.245.252:443...
* Connected to rb.gy (3.229.245.252) port 443 (#0)
…
< content-length: 0
< location: https://www.dropbox.com/s/2hqgpmtc2mdwij4/updater?dl=1
...

より、updater。

Task 5

What is the file hash of the key utilised by the attacker?
攻撃者が利用したキーのファイル ハッシュは何ですか?

短縮URL経由でファイルを持ってきてハッシュを取る。

$ md5sum updater 
950efb05238d9893366a816e6609500f  updater

Task 6

What is the BTC wallet address the TA is asking for payment to?
TA が支払いを求めている BTC ウォレット アドレスは何ですか?

ランサムノート share/countdown.txt をみると書いてある。

Task 7

How much is the TA asking for?
TA はいくら要求していますか?

ランサムノート share/countdown.txt をみると書いてある。A million poundsなので£1000000

Task 8

What was used to pack the malware?
マルウェアの梱包には何が使用されましたか?

Task 2よりupx

Hack The Box Sherlocks - Lockpick Writeup

https://app.hackthebox.com/sherlocks/Lockpick
Hack The Box Sherlocksとは

Sherlock Scenario

Forela needs your help! A whole portion of our UNIX servers have been hit with what we think is ransomware. We are refusing to pay the attackers and need you to find a way to recover the files provided. Warning This is a warning that this Sherlock includes software that is going to interact with your computer and files. This software has been intentionally included for educational purposes and is NOT intended to be executed or used otherwise. Always handle such files in isolated, controlled, and secure environments. One the Sherlock zip has been unzipped, you will find a DANGER.txt file. Please read this to proceed.
フォレラにはあなたの助けが必要です! UNIX サーバー全体がランサムウェアと思われる攻撃を受けています。私たちは攻撃者への支払いを拒否しており、提供されたファイルを回復する方法を見つける必要があります。警告 これは、この Sherlock には、お使いのコンピュータやファイルと対話するソフトウェアが含まれていることを示す警告です。このソフトウェアは教育目的で意図的に含まれており、それ以外の方法で実行または使用することを意図したものではありません。このようなファイルは常に、隔離され、管理された安全な環境で処理してください。Sherlock zip を解凍すると、DANGER.txt ファイルが見つかります。続行するにはこれをお読みください。

ランサムウェアに関連するファイル群が与えられる。

Tasks

Task 1

Please confirm the encryption key string utilised for the encryption of the files provided?
提供されたファイルの暗号化に使用された暗号化キー文字列を確認してください。

bescrypt3.2を解析する。この問題がLockpickの一番重い部分ですべて。答えの末尾がpであることは分かっているので、bescrypt3.2をghidraで解析してpで終わるそれっぽい文字列を探すとあった。コードを読むとこの文字列を使ってXORで暗号化していたので、復号化もXORしてやれば復号化できることが分かる。

Task 2

We have recently recieved an email from wbevansn1@cocolog-nifty.com demanding to know the first and last name we have him registered as. They believe they made a mistake in the application process. Please confirm the first and last name of this applicant.
最近、 wbevansn1@ cocolog-nifty.com から、登録している彼の姓名を知りたいというメールを受け取りました。彼らは申請プロセスで間違いを犯したと信じています。この申請者の姓名を確認してください。

復元後のforela_uk_applicants.sqlに書いてあった。

Task 3

What is the MAC address and serial number of the laptop assigned to Hart Manifould?
Hart Manifold に割り当てられたラップトップの MAC アドレスとシリアル番号は何ですか?

復元後のit_assets.xmlに書いてあった。

Task 4

What is the email address of the attacker?
攻撃者の電子メール アドレスは何ですか?

適当にランサムノートに書いてあったメールアドレスを書いた

Task 5

City of London Police have suspiciouns of some insider trading taking part within our trading organisation. Please confirm the email address of the person with the highest profit percentage in a single trade alongside the profit percentage.
ロンドン市警察は、当社の取引組織内で何らかのインサイダー取引が行われている疑いがあるとしています。利益率と併せて、1回の取引で最も利益率が高かった人のメールアドレスをご確認ください。

import json

with open('trading-firebase_bkup.json') as fp:
    j = json.load(fp)
    ps = []
    for k, v in j.items():
        pp = v['profit_percentage']
        e = v['email']
        ps.append((pp,e))
    ps.sort(key=lambda pair: float(pair[0]))
    for p in ps:
        print(p)

これでprofit_percentageが最も高いものを持ってくることができた。注意だが、桁落ちして出力されるので原文のものを解答すること。

Task 6

Our E-Discovery team would like to confirm the IP address detailed in the Sales Forecast log for a user who is suspected of sharing their account with a colleague. Please confirm the IP address for Karylin O'Hederscoll.
当社の電子情報開示チームは、同僚とアカウントを共有している疑いのあるユーザーの売上予測ログに詳細に記載されている IP アドレスを確認したいと考えています。Karylin O'Hederscoll の IP アドレスを確認してください。

復元後のデータのsales_forecast.xlsxを見るとIPアドレスが特定できる。

Task 7

Which of the following file extensions is not targeted by the malware? .txt, .sql,.ppt, .pdf, .docx, .xlsx, .csv, .json, .xml 次のファイル拡張子のうち、マルウェアのターゲットにならないものはどれですか?.txt, .sql,.ppt, .pdf, .docx, .xlsx, .csv, .json, .xml

ghidraでprocess_directoryを見ると拡張子が書いてある。比べると.pptがない

(pcVar2 = strstr(local_18->d_name,".txt"), pcVar2 != (char *)0x0 ||
(pcVar2 = strstr(local_18->d_name,".sql"), pcVar2 != (char *)0x0)) ||
(pcVar2 = strstr(local_18->d_name,".pdf"), pcVar2 != (char *)0x0)) ||
((pcVar2 = strstr(local_18->d_name,".docx"), pcVar2 != (char *)0x0 ||
(pcVar2 = strstr(local_18->d_name,".xlsx"), pcVar2 != (char *)0x0)))) ||
((pcVar2 = strstr(local_18->d_name,".csv"), pcVar2 != (char *)0x0 ||
((pcVar2 = strstr(local_18->d_name,".json"), pcVar2 != (char *)0x0 ||
(pcVar2 = strstr(local_18->d_name,".xml"), pcVar

.**t .ppt

Task 8

We need to confirm the integrity of the files once decrypted. Please confirm the MD5 hash of the applicants DB.
復号化したら、ファイルの整合性を確認する必要があります。応募者DBのMD5ハッシュをご確認ください。

$ md5sum forela_uk_applicants.sql 
f3894af4f1ffa42b3a379dddba384405  forela_uk_applicants.sql

Task 9

We need to confirm the integrity of the files once decrypted. Please confirm the MD5 hash of the trading backup.
復号化したら、ファイルの整合性を確認する必要があります。取引バックアップのMD5ハッシュを確認してください。

$ md5sum trading-firebase_bkup.json 
87baa3a12068c471c3320b7f41235669  trading-firebase_bkup.json

Task 10

We need to confirm the integrity of the files once decrypted. Please confirm the MD5 hash of the complaints file.
復号化したら、ファイルの整合性を確認する必要があります。苦情ファイルの MD5 ハッシュを確認してください。

$ md5sum complaints.csv            
c3f05980d9bd945446f8a21bafdbf4e7  complaints.csv

Hack The Box Sherlocks - Litter Writeup

https://app.hackthebox.com/sherlocks/Litter
Hack The Box Sherlocksとは

Sherlock Scenario

Khalid has just logged onto a host that he and his team use as a testing host for many different purposes, it’s off their corporate network but has access to lots of resources in network. The host is used as a dumping ground for a lot of people at the company but it’s very useful, so no one has raised any issues. Little does Khalid know; the machine has been compromised and company information that should not have been on there has now been stolen – it’s up to you to figure out what has happened and what data has been taken.
Khalid は、彼と彼のチームがさまざまな目的でテスト ホストとして使用しているホストにログオンしました。このホストは企業ネットワークから離れていますが、ネットワーク内の多くのリソースにアクセスできます。ホストは会社の多くの人たちのゴミ捨て場として使用されていますが、非常に便利なので、誰も問題を提起していません。ハリドはほとんど知りません。マシンが侵害され、そこにあるはずのない企業情報が盗まれています。何が起こったのか、どのデータが盗まれたのかを解明するのはあなた次第です。

パケットキャプチャ suspicious_traffic.pcap が与えられるので、解析して設問に答える。

Tasks

Task 1

At a glance, what protocol seems to be suspect in this attack?
一見すると、この攻撃ではどのプロトコルが疑わしいと思われますか?

pcapのプロトコル階層統計を見てみるとDNSが異常に多いことが見て取れる。

Task 2

There seems to be a lot of traffic between our host and another, what is the IP address of the suspect host?
私たちのホストと別のホストの間に大量のトラフィックがあるようですが、疑わしいホストの IP アドレスは何ですか?

pcapの終端(endpoints)を見て、パケットの量が多いものから順にみていく。最も多いIPアドレスはパケットキャプチャ端末(私たちのホスト)なので2番目に多いものが答え。

Task 3

What is the first command the attacker sends to the client?
攻撃者がクライアントに送信する最初のコマンドは何ですか?

Task 1,2よりdns && ip.addr == 192.168.157.145grepすると、hex stringが多数送られている。全部抜いてきてデコードすると所々読むことができる。上からコマンドっぽいものを見つけてくると答えが出る。

Task 4

What is the version of the DNS tunneling tool the attacker is using?
攻撃者が使用している DNS トンネリング ツールのバージョンは何ですか?

dirコマンドの結果を見るとdnscat2-v0.07-clientというのがある。
これがトンネリングツールだろう。

Task 5

The attackers attempts to rename the tool they accidentally left on the clients host. What do they name it to?
攻撃者は、誤ってクライアント ホスト上に残したツールの名前を変更しようとします。彼らはそれに何という名前を付けていますか?

コマンドを眺めるとren dnscat2-v0.07-client-win32.exe win_installer.exeというのがあった。変名してますね。

Task 6

The attacker attempts to enumerate the users cloud storage. How many files do they locate in their cloud storage directory?
攻撃者は、ユーザーのクラウド ストレージを列挙しようとします。クラウド ストレージ ディレクトリにはファイルがいくつありますか?

OneDriveの中身を見ているが、ファイルはなかった。

 Directory of C:\Us¿ Íuä]LÒÍ]Luäers\test\OneDrive

04/06/2021  08:52    <DIR>          .
04/06/2021  08:52    <DIR>         ÒÍ]Luäers\test\OneDrive

04/06/2021  08:52    <DIR>          .
04/06/2021  08:52    <DIR>         ÉÍuä]«­Í]«uä ..
               0 File(s)              0 bytes
               2 Dir(s)  24,470,171,648 byt­Í]«uä ..
               0 File(s)              0 bytes
               2 Dir(s)  24,470,171,648 bytÍuä^

Task 7

What is the full location of the PII file that was stolen?
盗まれた PII ファイルの完全な場所はどこですか?

適当に目grepすると見つかる。

Task 8

Exactly how many customer PII records were stolen?
正確に何件の顧客 PII 記録が盗まれましたか?

ちゃんと解析する必要がある。

from scapy.all import rdpcap, DNSQR, DNSRR
import struct

# tshark -r suspicious_traffic.pcap -Y 'dns && ip.addr == 192.168.157.145 && frame.len > 96 && ip.dst == 192.168.157.145' -w dns2.pcap
for p in rdpcap('dns2.pcap'):
    if p.haslayer(DNSQR) and not p.haslayer(DNSRR):
        if 'microsofto365' in p[DNSQR].qname.decode():
            qry = p[DNSQR].qname.decode().replace(".microsofto365.com.","").strip()[9*2:].split(".")
            for x in qry:
                y = bytes.fromhex(x)
                print(y)

こんな感じに出すととてもいい感じにパースされてくるので、SSNのフォーマット\d{3}-\d{2}-\d{4}grepすると721件ヒットするのでそれが答え。

Hack The Box Sherlocks - Hyperfiletable Writeup

https://app.hackthebox.com/sherlocks/Hyperfiletable
Hack The Box Sherlocksとは

Sherlock Scenario

There has been a new joiner in Forela, they have downloaded their onboarding documentation, however someone has managed to phish the user with a malicious attachment. We have only managed to pull the MFT record for the new user, are you able to triage this information?
Forela に新しい参加者がいて、オンボーディング ドキュメントをダウンロードしましたが、誰かが悪意のある添付ファイルでユーザーをフィッシングすることに成功しました。新しいユーザーの MFT レコードしか取得できませんでしたが、この情報を優先順位付けできますか?

mft.rawというドライブのMFT(:Master File Table)が与えられるので設問に答えていく。

Tasks

Task 1

What is the MD5 hash of the MFT?
MFT の MD5 ハッシュは何ですか?

$ md5sum mft.raw
3730c2fedcdc3ecd9b83cbea08373226  mft.raw

Task 2

What is the name of the only user on the system?
システム上の唯一のユーザーの名前は何ですか?

ZimmermanToolsのMFTECmd.exeで解析していく。

PS> MFTECmd.exe -f mft.raw --csv out

csvが出力されるのでTimeline Explorerで眺めると、
.\Users\Randy Savage\AppData\Local\Microsoft\Edge\User Data\Default\Cache\Cache_Dataみたいなパスが見つかる。

Task 3

What is the name of the malicious HTA that was downloaded by that user?
そのユーザーがダウンロードした悪意のある HTA の名前は何ですか?

出力されたcsvgrepすると答えが見つかる。

$ cat 20231118070900_MFTECmd_\$MFT_Output.csv | grep "\.hta"
103820,7,True,105011,2,.\Users\Randy Savage\Downloads,Onboarding.hta,.hta,1144,1,,False,True,False,False,False,False,Archive,Windows,2023-04-05 13:21:40.0706726,,2023-04-05 13:21:45.6478863,2023-04-05 13:21:40.0732403,2023-04-05 13:21:45.6478863,2023-04-05 13:21:40.2279587,2023-04-05 13:22:00.9916344,2023-04-05 13:21:40.0732403,27166224,375731114,1793,,,    
103820,7,True,105011,2,.\Users\Randy Savage\Downloads,Onboarding.hta:Zone.Identifier,.Identifier,389,1,,False,False,True,False,False,False,Archive,Windows,2023-04-05 13:21:40.0706726,,2023-04-05 13:21:45.6478863,2023-04-05 13:21:40.0732403,2023-04-05 13:21:45.6478863,2023-04-05 13:21:40.2279587,2023-04-05 13:22:00.9916344,2023-04-05 13:21:40.0732403,27166224,375731114,1793,,,"[ZoneTransfer]

Task 4

What is the ZoneId of the download for the malicious HTA file?
悪意のある HTA ファイルのダウンロードの ZoneId は何ですか?

103820のZoneTransferを見てみるとZoneId=3とある。

Task 5

What is the download URL for the malicious HTA?
悪意のある HTA のダウンロード URL は何ですか?

Task 4と同じ所に書いてある。

Task 6

What is the allocated size for the HTA file? (bytes)
HTA ファイルに割り当てられるサイズはどれくらいですか? (バイト)

Task 4のファイルではあるが、MFTECmd.exeでは良い感じに見れない。
うーんと思ってさまよっていると、以下のようなツールがあり使ってみると、Physical Sizeが見られる。
https://sites.google.com/view/kumaa/software/mft-ntfs-explorer

Task 7

What is the real size of the HTA file? (bytes)
HTA ファイルの実際のサイズはどれくらいですか? (バイト)

Task 4と同じ所に書いてある。

Task 8

When was the powerpoint presentation downloaded by the user?
ユーザーが PowerPoint プレゼンテーションをダウンロードしたのはいつですか?

色々探すと105622にProposal.pptxがあった。

Line Tag Entry Number    Sequence Number Parent Entry Number Parent Sequence Number  In Use  Parent Path File Name   Extension   Is Directory    Has Ads Is Ads  File Size   Created0x10 Created0x30 Last Modified0x10   Last Modified0x30   Last Record Change0x10  Last Record Change0x30  Last Access0x10 Last Access0x30 Zone Id Contents    Reparse Target  Reference Count SI<FN    u Sec Zeros Copied
139852  チェックなし  105622  4   107430  3   チェックなし  .\Users\Randy Savage\Documents\Work Proposal.pptx   .pptx   チェックなし  チェックあり  チェックなし  16552989    2023-04-05 13:11:49     2023-04-05 13:11:53     2023-04-05 13:12:14 2023-04-05 13:11:53 2023-04-05 13:11:53             1   チェックなし  チェックなし  チェックなし
139853  チェックなし  105622  4   107430  3   チェックなし  .\Users\Randy Savage\Documents\Work Proposal.pptx:Zone.Identifier   .Identifier チェックなし  チェックなし  チェックあり  253 2023-04-05 13:11:49     2023-04-05 13:11:53     2023-04-05 13:12:14 2023-04-05 13:11:53 2023-04-05 13:11:53     "[ZoneTransfer]
ZoneId=3
HostUrl=https://doc-00-74-slides.googleusercontent.com/export/9etqlefsb6ag0v7ccvvsuuv79k/h3mmec1fs2af8n60d48rub6hoc/1680708410000/117027713603155848197/*/1b2C-JaPMvvrosQiNyLBX2LZLPhx1vIDPKfG686ZVXHQ?authuser&exportFormat=pptx
"       1   チェックなし  チェックなし  チェックなし

Createdを採用すると正答だった。

Task 9

The user has made notes of their work credentials, what is their password?
ユーザーは仕事用の資格情報をメモしていますが、パスワードは何ですか?

C:\Users\Randy Savage\Documents\Work\notes.txtというファイルがあり、残存データを見てみるとパスワードが残っていた。

Task 10

How many files remain under the C:\Users\ directory? (Recursively)
C:\Users\ ディレクトリにはいくつのファイルが残っていますか? (再帰的)

csv結果を「Contains([Parent Path], '\Users\') And [Is Directory] = False And [Is Ads] = False And [In Use] = True」でフィルタリングすると3478件になったので適当に周辺の数字を出してみると3471にすると通った。

Hack The Box Sherlocks - Einladen Writeup

https://app.hackthebox.com/sherlocks/Einladen
Hack The Box Sherlocksとは

Sherlock Scenario

Our staff recently received an invite to the German embassy to bid farewell to the Germany Ambassador. We believe this invite was a phishing email due to alerts that fired on our organisation's SIEM tooling following the receipt of such mail. We have provided a wide variety of artifacts inclusive of numerous binaries, a network capture, DLLs from the host system and also a .hta file. Please analyse and complete the questions detailed below!
私たちのスタッフは最近、ドイツ大使にお別れを告げるためにドイツ大使館への招待状を受け取りました。このようなメールの受信後に組織の SIEM ツールでアラートが発せられたため、この招待状はフィッシング メールであると考えられます。多数のバイナリ、ネットワーク キャプチャ、ホスト システムからの DLL、および .hta ファイルを含む、さまざまなアーティファクトを提供しました。以下に詳しく説明されている質問を分析して回答してください。

色々なアーティファクトが与えられるので解析しながら設問に答えていこう。

Tasks

Task 1

The victim visited a web page.The HTML file of the web page has beenprovided as ‘downloader.html’ sample file.The web page downloadsa ZIP file named 'Invitation_Farewell_DE_EMB.zip'. What is the SHA-256 hash of the ZIP file?
被害者は Web ページにアクセスしました。Web ページの HTML ファイルは、「downloader.html」サンプル ファイルとして提供されています。Web ページは、「Invitation_Farewell_DE_EMB.zip」という名前の ZIP ファイルをダウンロードします。ZIP ファイルの SHA-256 ハッシュは何ですか?

downloader.htmlを開くと変数dでデータがdecimalで入っているので、持ってきてCyberChefに送る。

Task 2

Thedownloaded ZIP file contains a HTA file, which creates multiple files. One of those files is a signed fileby Microsoft Corporation. In HTA file, which variable’s value was the content of that signed file?
ダウンロードした ZIP ファイルには、複数のファイルを作成する HTA ファイルが含まれています。これらのファイルの 1 つは、Microsoft Corporation によって署名されたファイルです。HTA ファイルでは、どの変数の値が署名されたファイルの内容でしたか?

該当htaファイルはInvitation_Farewell_DE_EMB.htaのこと。中

Task 3

The threat actor was acting as an embassy of a country. Which country was that?
攻撃者はある国の大使館として活動していました。それはどこの国でしたか?

PDFの中身を見るとドイツからの資料であることが分かる。

Task 4

The malware communicatedwith a chatting platform domain. What is the domainname (inclusive of sub doamain) the malware connects to?
マルウェアはチャット プラットフォームのドメインと通信しました。マルウェアが接続するドメイン名 (サブドメインを含む) は何ですか?

ネットワーク接続が分かりそうなソースとしてpcapngファイルがあるので見てみよう。DNS通信を見ると怪しいドメインがある。

69   192.168.0.105   51935   192.168.0.1 53  DNS 78          Standard query 0x0f17 A toyy.zulipchat.com

Task 5

How many DNS A records were found for that domain?
そのドメインDNS A レコードがいくつ見つかりましたか?

応答がNo.71として記録されていたので、見てみると6つ応答が帰ってきている。

Task 6

It seems like the chatting service was running on a very known cloud service using a FQDN, where the FQDN contains the IP address of the chatting domain in reversive format somehow. What is the FQDN?
チャット サービスは、FQDN を使用するよく知られたクラウド サービス上で実行されていたようです。FQDN には、チャット ドメインの IP アドレスが何らかの形で逆形式で含まれています。FQDNとは何ですか?

Taks 5と同じDNSでの通信を見ると以下のような応答があり、設問の答えに即してそうなフォーマットになっている。

84   192.168.0.1 53  192.168.0.105   54294   DNS 141         Standard query response 0x3bf0 PTR 55.197.171.35.in-addr.arpa PTR ec2-35-171-197-55.compute-1.amazonaws.com

Task 7

What was the parent PID (PPID) of the malware?
マルウェアの親 PID (PPID) は何でしたか?

Logfile.PMLで細かい情報が得られそうなのでSysInternalsのProcess Monitorで開く。ProcessStartのログを見るとPPIDも記録されているのでそれを答える。

Task 8

What was the computer name of the victim computer?
被害を受けたコンピュータのコンピュータ名は何でしたか?

Logfile.PMLの適当なログに環境変数が残っているので、そこからコンピュータ名が分かる。COMPUTERNAME=DESKTOP-O88AN4O

Task 9

What was the username of the victim computer?
被害者のコンピュータのユーザー名は何でしたか?

これもTaks 8同様に環境変数から分かる。

Task 10

How many times were the Windows Registry keys set with a data value?
Windows レジストリ キーにデータ値が設定された回数は何回ですか?

Logfile.PMLを開き、OperationのRegSetValueでフィルタリングすると11件出てくるのでこれが答え。

Integer, e.g - 65

Task 11

Did the malicious mso.dll load by the malware executable successfully?
悪意のある mso.dll はマルウェア実行可能ファイルによって正常に読み込まれましたか?

Logfile.PMLを開き、OperationのLoad Imageでフィルタリングすると分かる。フィルタリングして見てみるとmso.dllの読み込みにSUCCESSしているのでyes

Task 12

The JavaScript file tries to write itself as a .bat file. What is the .bat file name (name+extension) it tries to write itself as?
JavaScript ファイルは、それ自体を .bat ファイルとして書き込もうとします。それ自体を書き込もうとする .bat ファイル名 (名前 + 拡張子) は何ですか?

unc.jsというファイルが与えられる。難読化を頑張って解除していくと

'return this')()['WScript']['CreateObject']('WScript.Shell')['run']('cmd /k copy "' + this['WScript']['ScriptFullName'] + '" "%temp%\\\\richpear.bat" && "%temp%\\\\richpear.bat"')

こんな感じのコマンド片が得られて、ファイル名が得られる。

Task 13

The JavaScript file contains a big text which is encoded as Base64. If you decode that Base64 text and write its content as an EXE file. What will be the SHA256 hash of the EXE?
JavaScript ファイルには、Base64 としてエンコードされた大きなテキストが含まれています。その Base64 テキストをデコードし、その内容を EXE ファイルとして書き込むとします。EXE の SHA256 ハッシュは何になりますか?

コメント部分にbase64エンコード文字列があるのでそれをデコードして持ってくる。

$ sha256sum unc_bin.bin 
db84db8c5d76f6001d5503e8e4b16cdd3446d5535c45bbb0fca76cfec40f37cc  unc_bin.bin

Task 14

The malware contains a class Client.Settings which sets different configurations. It has a variable ‘Ports’ where the value is Base64 encoded. The value is decrypted using Aes256.Decrypt. After decryption, what will be its value (the decrypted value will be inside double quotation)?
このマルウェアには、さまざまな構成を設定するクラス Client.Settings が含まれています。これには、値が Base64エンコードされた変数「Ports」があります。値は Aes256.Decrypt を使用して復号化されます。復号化後の値はどうなりますか (復号化された値は二重引用符で囲まれます)。

Mono/.Net assemblyだったので、dnSpyで中を見てみる。

public static string Ports = "Yhc6k+R99kweya1xRMDhAdRjrYVuSxpgA2Lefoj5KOsbK3OcJtOpNfDubKUTCiWHoVrnnwqj70kyfYTLboawyVxN0W+L/MRchSITSNbbgXE=";

同じ所に鍵もある。

public static string Key = "d0cyOFJwZlBBSXBnalhEVFd2bEdiVHRkQnpybnRBeVM=";

saltもある。

     private static readonly byte[] Salt = new byte[]
        {
            191,
            235,
            30,
            86,
            251,
            205,
            151,
            59,
            178,
            25,
            2,
            36,
            48,
            165,
            120,
            67,
            0,
            61,
            86,
            68,
            210,
            30,
            98,
            185,
            212,
            241,
            128,
            231,
            230,
            195,
            57,
            65
        };

これを使って、このように鍵を生成。

         using (Rfc2898DeriveBytes rfc2898DeriveBytes = new Rfc2898DeriveBytes(masterKey, Aes256.Salt, 50000))
            {
                this._key = rfc2898DeriveBytes.GetBytes(32);
                this._authKey = rfc2898DeriveBytes.GetBytes(64);
            }

復号はこんな感じ。

         byte[] result;
            using (MemoryStream memoryStream = new MemoryStream(input))
            {
                using (AesCryptoServiceProvider aesCryptoServiceProvider = new AesCryptoServiceProvider())
                {
                    aesCryptoServiceProvider.KeySize = 256;
                    aesCryptoServiceProvider.BlockSize = 128;
                    aesCryptoServiceProvider.Mode = CipherMode.CBC;
                    aesCryptoServiceProvider.Padding = PaddingMode.PKCS7;
                    aesCryptoServiceProvider.Key = this._key;
                    using (HMACSHA256 hmacsha = new HMACSHA256(this._authKey))
                    {
                        byte[] a = hmacsha.ComputeHash(memoryStream.ToArray(), 32, memoryStream.ToArray().Length - 32);
                        byte[] array = new byte[32];
                        memoryStream.Read(array, 0, array.Length);
                        if (!this.AreEqual(a, array))
                        {
                            throw new CryptographicException("Invalid message authentication code (MAC).");
                        }
                    }
                    byte[] array2 = new byte[16];
                    memoryStream.Read(array2, 0, 16);
                    aesCryptoServiceProvider.IV = array2;
                    using (CryptoStream cryptoStream = new CryptoStream(memoryStream, aesCryptoServiceProvider.CreateDecryptor(), CryptoStreamMode.Read))
                    {
                        byte[] array3 = new byte[memoryStream.Length - 16L + 1L];
                        byte[] array4 = new byte[cryptoStream.Read(array3, 0, array3.Length)];
                        Buffer.BlockCopy(array3, 0, array4, 0, array4.Length);
                        result = array4;
                    }
                }
            }

これをもとにデコーダを書く。

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
using System.Security.Cryptography;

namespace payload
{
    public class Aes256
    {
        // Token: 0x06000072 RID: 114 RVA: 0x000067BC File Offset: 0x000049BC
        public Aes256(string masterKey)
        {
            if (string.IsNullOrEmpty(masterKey))
            {
                throw new ArgumentException("masterKey can not be null or empty.");
            }
            using (Rfc2898DeriveBytes rfc2898DeriveBytes = new Rfc2898DeriveBytes(masterKey, Aes256.Salt, 50000))
            {
                this._key = rfc2898DeriveBytes.GetBytes(32);
                this._authKey = rfc2898DeriveBytes.GetBytes(64);
            }
        }

        // Token: 0x06000073 RID: 115 RVA: 0x00003D23 File Offset: 0x00001F23
        public string Encrypt(string input)
        {
            return Convert.ToBase64String(this.Encrypt(Encoding.UTF8.GetBytes(input)));
        }

        // Token: 0x06000074 RID: 116 RVA: 0x00006834 File Offset: 0x00004A34
        public byte[] Encrypt(byte[] input)
        {
            if (input == null)
            {
                throw new ArgumentNullException("input can not be null.");
            }
            byte[] result;
            using (MemoryStream memoryStream = new MemoryStream())
            {
                memoryStream.Position = 32L;
                using (AesCryptoServiceProvider aesCryptoServiceProvider = new AesCryptoServiceProvider())
                {
                    aesCryptoServiceProvider.KeySize = 256;
                    aesCryptoServiceProvider.BlockSize = 128;
                    aesCryptoServiceProvider.Mode = CipherMode.CBC;
                    aesCryptoServiceProvider.Padding = PaddingMode.PKCS7;
                    aesCryptoServiceProvider.Key = this._key;
                    aesCryptoServiceProvider.GenerateIV();
                    using (CryptoStream cryptoStream = new CryptoStream(memoryStream, aesCryptoServiceProvider.CreateEncryptor(), CryptoStreamMode.Write))
                    {
                        memoryStream.Write(aesCryptoServiceProvider.IV, 0, aesCryptoServiceProvider.IV.Length);
                        cryptoStream.Write(input, 0, input.Length);
                        cryptoStream.FlushFinalBlock();
                        using (HMACSHA256 hmacsha = new HMACSHA256(this._authKey))
                        {
                            byte[] array = hmacsha.ComputeHash(memoryStream.ToArray(), 32, memoryStream.ToArray().Length - 32);
                            memoryStream.Position = 0L;
                            memoryStream.Write(array, 0, array.Length);
                        }
                    }
                }
                result = memoryStream.ToArray();
            }
            return result;
        }

        // Token: 0x06000075 RID: 117 RVA: 0x00003D3B File Offset: 0x00001F3B
        public string Decrypt(string input)
        {
            return Encoding.UTF8.GetString(this.Decrypt(Convert.FromBase64String(input)));
        }

        // Token: 0x06000076 RID: 118 RVA: 0x0000698C File Offset: 0x00004B8C
        public byte[] Decrypt(byte[] input)
        {
            if (input == null)
            {
                throw new ArgumentNullException("input can not be null.");
            }
            byte[] result;
            using (MemoryStream memoryStream = new MemoryStream(input))
            {
                using (AesCryptoServiceProvider aesCryptoServiceProvider = new AesCryptoServiceProvider())
                {
                    aesCryptoServiceProvider.KeySize = 256;
                    aesCryptoServiceProvider.BlockSize = 128;
                    aesCryptoServiceProvider.Mode = CipherMode.CBC;
                    aesCryptoServiceProvider.Padding = PaddingMode.PKCS7;
                    aesCryptoServiceProvider.Key = this._key;
                    using (HMACSHA256 hmacsha = new HMACSHA256(this._authKey))
                    {
                        byte[] a = hmacsha.ComputeHash(memoryStream.ToArray(), 32, memoryStream.ToArray().Length - 32);
                        byte[] array = new byte[32];
                        memoryStream.Read(array, 0, array.Length);
                    }
                    byte[] array2 = new byte[16];
                    memoryStream.Read(array2, 0, 16);
                    aesCryptoServiceProvider.IV = array2;
                    using (CryptoStream cryptoStream = new CryptoStream(memoryStream, aesCryptoServiceProvider.CreateDecryptor(), CryptoStreamMode.Read))
                    {
                        byte[] array3 = new byte[memoryStream.Length - 16L + 1L];
                        byte[] array4 = new byte[cryptoStream.Read(array3, 0, array3.Length)];
                        Buffer.BlockCopy(array3, 0, array4, 0, array4.Length);
                        result = array4;
                    }
                }
            }
            return result;
        }

        // Token: 0x04000038 RID: 56
        private const int KeyLength = 32;

        // Token: 0x04000039 RID: 57
        private const int AuthKeyLength = 64;

        // Token: 0x0400003A RID: 58
        private const int IvLength = 16;

        // Token: 0x0400003B RID: 59
        private const int HmacSha256Length = 32;

        // Token: 0x0400003C RID: 60
        private readonly byte[] _key;

        // Token: 0x0400003D RID: 61
        private readonly byte[] _authKey;

        // Token: 0x0400003E RID: 62
        private static readonly byte[] Salt = new byte[]
        {
            191,
            235,
            30,
            86,
            251,
            205,
            151,
            59,
            178,
            25,
            2,
            36,
            48,
            165,
            120,
            67,
            0,
            61,
            86,
            68,
            210,
            30,
            98,
            185,
            212,
            241,
            128,
            231,
            230,
            195,
            57,
            65
        };
    };

    public class Run
    {

        static void Main(string[] args)
        {
            Console.WriteLine("Main");
            var key = "d0cyOFJwZlBBSXBnalhEVFd2bEdiVHRkQnpybnRBeVM=";
            key = Encoding.UTF8.GetString(Convert.FromBase64String(key));
            var aes = new Aes256(key);
            var enc = "Yhc6k+R99kweya1xRMDhAdRjrYVuSxpgA2Lefoj5KOsbK3OcJtOpNfDubKUTCiWHoVrnnwqj70kyfYTLboawyVxN0W+L/MRchSITSNbbgXE=";
            var res = aes.Decrypt(enc);
            Console.WriteLine(res);
        }
    };
}

Task 15

The malware sends a HTTP request to a URI and checks the country code or country name of the victim machine. To which URI does the malware sends request for this?
マルウェアは HTTP リクエストを URI に送信し、被害者のマシンの国コードまたは国名をチェックします。マルウェアはこのリクエストをどの URI に送信しますか?

Client.Helper.GetCountryNameを見ると処理が分かり、 使われているURIもわかる。

Task 16

After getting the country code or country name of the victim machine, the malware checks some country codes and a country name. In case of the country name, if the name is matched with the victim machine’s country name, the malware terminates itself. What is the country name it checks with the victim system?
マルウェアは、被害者のマシンの国コードまたは国名を取得した後、いくつかの国コードと国名をチェックします。国名の場合、その名前が被害者のマシンの国名と一致すると、マルウェアは自動的に終了します。被害者システムでチェックされる国名は何ですか?

     public static void GetSNG()
        {
            string countryCode = Antisng.GetCountryCode();
            string countryName = Antisng.GetCountryName();
            if (countryCode == "RU" || countryCode == "AZ" || countryCode == "AM" || countryCode == "BY" || countryCode == "KZ" || countryCode == "KG" || countryCode == "MD" || countryCode == "TJ" || countryCode == "TM" || countryCode == "UZ" || countryName == "Russia")
            {
                Environment.Exit(0);
            }
        }

ここでチェックしている。明示的に国名が書かれているのはRussia

Task 17

As an anti-debugging functionality, the malware checks if there is any process running where the process name is a debugger. What is the debugger name it tries to check if that’s running?
アンチデバッグ機能として、マルウェアはプロセス名がデバッガーであるプロセスが実行されているかどうかをチェックします。実行中かどうかを確認しようとするデバッガの名前は何ですか?

     public static void RunAntiAnalysis()
        {
            if (Anti_Analysis.DetectManufacturer() || Anti_Analysis.DetectDebugger() || Anti_Analysis.DetectSandboxie() || Anti_Analysis.IsSmallDisk() || Anti_Analysis.IsXP() || Anti_Analysis.IsProcessRunning("dnSpy") || Anti_Analysis.CheckWMI())
            {
                Environment.FailFast(null);
            }
        }

というプログラムが見つかる。dnSpy

Task 18

For persistence, the malware writes a Registry key where the registry key is hardcoded in the malware in reversed format. What is the registry key after reversing?
永続性を維持するために、マルウェアレジストリ キーを書き込みます。レジストリ キーはマルウェア内で逆形式でハードコーディングされています。元に戻した後のレジストリ キーは何ですか?

Client.Install.NormalStartupに以下のようにある。

using (RegistryKey registryKey = Registry.CurrentUser.OpenSubKey(Strings.StrReverse("\\nuR\\noisreVtnerruC\\swodniW\\tfosorciM\\erawtfoS"), RegistryKeyPermissionCheck.ReadWriteSubTree))

逆にして、CurrentUserのレジストリなのでHKCU\を先頭につけると答え。

Task 19

The malware sets a scheduled task. What is the Run Level for the scheduled task/job it sets?
マルウェアはスケジュールされたタスクを設定します。設定されるスケジュールされたタスク/ジョブの実行レベルは何ですか?

/c schtasks /create /f /sc onlogon /rl highest /tn \"というリテラルがあるので、以下が答え。

Hack The Box Sherlocks - Constellation Writeup

https://app.hackthebox.com/sherlocks/Constellation
Hack The Box Sherlocksとは

Sherlock Scenario

The SOC team has recently been alerted to the potential existence of an insider threat. The suspect employee's workstation has been secured and examined. During the memory analysis, the Senior DFIR Analyst succeeded in extracting several intriguing URLs from the memory. These are now provided to you for further analysis to uncover any evidence, such as indications of data exfiltration or contact with malicious entities. Should you discover any information regarding the attacking group or individuals involved, you will collaborate closely with the threat intelligence team. Additionally, you will assist the Forensics team in creating a timeline. Warning : This Sherlock will require an element of OSINT and some answers can be found outside of the provided artifacts to complete fully.
SOC チームは最近、内部関係者の脅威が存在する可能性について警告を受けました。容疑者の従業員のワークステーションは確保され、検査されています。メモリ分析中に、上級 DFIR アナリストはメモリからいくつかの興味深い URL を抽出することに成功しました。これらは、データ漏洩や悪意のあるエンティティとの接触の兆候などの証拠を明らかにするためのさらなる分析のために提供されるようになりました。攻撃グループまたは関与した個人に関する情報を発見した場合は、脅威インテリジェンス チームと緊密に連携します。さらに、フォレンジック チームによるタイムラインの作成を支援します。 警告: この Sherlock には OSINT の要素が必要であり、完全に完了するには提供されたアーティファクトの外にいくつかの答えが見つかります。

constellation.zipが添付ファイルで2つのURLが書いてある。

  • URL 1 : hxxps://cdn[.]discordapp[.]com/attachments/1152635915429232640/1156461980652154931/NDA_Instructions.pdf?ex=65150ea6&is=6513bd26&hm=64de12da031e6e91cc4f35c64b2b0190fb040b69648a64365f8a8260760656e3&
  • URL 2 : hxxps://www[.]google.com/search?q=how+to+zip+a+folder+using+tar+in+linux&sca_esv=568736477&hl=en&sxsrf=AM9HkKkFWLlX_hC63KqDpJwdH9M3JL7LZA%3A1695792705892&source=hp&ei=Qb4TZeL2M9XPxc8PwLa52Ag&iflsig=AO6bgOgAAAAAZRPMUXuGExueXDMxHxU9iRXOL-GQIJZ-&oq=How+to+archive+a+folder+using+tar+i&gs_lp=Egdnd3Mtd2l6IiNIb3cgdG8gYXJjaGl2ZSBhIGZvbGRlciB1c2luZyB0YXIgaSoCCAAyBhAAGBYYHjIIEAAYigUYhgMyCBAAGIoFGIYDMggQABiKBRiGA0jI3QJQ8WlYxIUCcAx4AJABAJgBqQKgAeRWqgEEMi00NrgBAcgBAPgBAagCCsICBxAjGOoCGCfCAgcQIxiKBRgnwgIIEAAYigUYkQLCAgsQABiABBixAxiDAcICCBAAGIAEGLEDwgILEAAYigUYsQMYgwHCAggQABiKBRixA8ICBBAjGCfCAgcQABiKBRhDwgIOEC4YigUYxwEY0QMYkQLCAgUQABiABMICDhAAGIoFGLEDGIMBGJECwgIFEC4YgATCAgoQABiABBgUGIcCwgIFECEYoAHCAgUQABiiBMICBxAhGKABGArCAggQABgWGB4YCg&sclient=gws-wiz

OSINT要素もある問題のようだ。

Tasks

Task 1

When did the suspect first start Direct Message (DM) conversations with the external entity (A possible threat actor group which targets organizations by paying employees to leak sensitive data)? (UTC)
容疑者が初めて外部組織 (従業員にお金を払って機密データを漏洩させることで組織を標的にする脅威攻撃者グループの可能性) とダイレクト メッセージ (DM) での会話を始めたのはいつですか? (UTC

discordのURL 1から取得することができるのだろう。 https://dfir.blog/unfurl/ で解析可能。 Channel IDの横にあるタイムスタンプの日時が答え。2023-09-17 01:03:37

Task 2

What was the name of the file sent to the suspected insider threat?
内部関係者による脅威の疑いのある人物に送信されたファイルの名前は何ですか?

discordのURL 1を見るとファイル名が分かる。
NDA_Instructions.pdf

Task 3

When was the file sent to the suspected insider threat? (UTC)
内部関係者の脅威が疑われる人物にファイルが送信されたのはいつですか? (UTC

Task 1と同様にdiscordのURL 1をunfurlで解析してFile IDの横のタイムスタンプを答えると正答。
2023-09-27 05:27:02

Task 4

The suspect utilised Google to search something after receiving the file. What was the search query?
容疑者はファイルを受け取った後、Google を利用して何かを検索しました。検索クエリは何でしたか?

URL 2を見れば分かる。クエリストリングのqをURLデコードすると分かる。

Task 5

The suspect originally typed something else in search tab, but found a Google search result suggestion which they clicked on. Can you confirm which words were written in search bar by the suspect originally?
容疑者は当初、検索タブに別の文字を入力していたが、Google 検索結果の候補を見つけてクリックした。容疑者が最初に検索バーにどの単語を書き込んだのか確認できますか?

URL 2をよく解析すると分かるのだろう。
Googleの検索画面のURLについて調べてみた | DevelopersIO
この辺を参考に見ていこう。

oq=How+to+archive+a+folder+using+tar+iが怪しい。
How to archive a folder using tar iが答え。

Task 6

When was this Google search made? (UTC)
この Google 検索はいつ行われましたか? (UTC

同様にURL 2を見ていく。
時間につながりそうなのはsca_esv=568736477くらいしかない。
Google Videos Search "sca_esv" query parameter possible tracking
タイムスタンプっぽいが…違う。

このページに書いてあるunfurlというサイトを使ってみる。
https://dfir.blog/unfurl/
なんと別のタイムスタンプを得ることができ、そっちが正解。
2023-09-27 05:31:45

ちなみに同サイトにURL 1を入れ込んでみると見事にパースされて答えが出てきた。そっか…

Task 7

What is the name of the Hacker group responsible for bribing the insider threat? インサイダーの脅威に賄賂を贈ったハッカー グループの名前は何ですか?

URL 1を使ってpdfをダウンロードして中身を見てみる。

Constellation
Thanks For getting in touch with AntiCorp Gr04p, karen riley. We appreciate you in helping us get our hands on important data for forela. Ita high time we stand against billion dollars corporates who are playing monaply with common folks!! We are attaching instructions on how to get us the data securely.

これを見ると、攻撃者グループが分かる。AntiCorp Gr04p

Task 8

What is the name of the person suspected of being an Insider Threat?
内部脅威の疑いのある人物の名前は何ですか?

Task 7と同様にpdfをダウンロードして中身を見てみると書いてある。

Constellation
Thanks For getting in touch with AntiCorp Gr04p, karen riley. We appreciate you in helping us get our hands on important data for forela. Ita high time we stand against billion dollars corporates who are playing monaply with common folks!! We are attaching instructions on how to get us the data securely.

ここに書いてある。karen riley

Task 9

What is the anomalous stated creation date of the file sent to the insider threat? (UTC)
インサイダー脅威に送信されたファイルの異常な作成日は何ですか? (UTC

途中で問題が修正されてめちゃめちゃになっていた問題。pdfファイルでexiftoolを開くと作成日が見て取れる。

$ exiftool NDA_Instructions.pdf.bin 
ExifTool Version Number         : 12.67
File Name                       : NDA_Instructions.pdf.bin
Directory                       : .
File Size                       : 26 kB
File Modification Date/Time     : 2023:09:27 14:27:02+09:00
File Access Date/Time           : 2023:12:15 14:58:02+09:00
File Inode Change Date/Time     : 2023:12:15 12:54:16+09:00
File Permissions                : -rwxrwxrwx
File Type                       : PDF
File Type Extension             : pdf
MIME Type                       : application/pdf
PDF Version                     : 1.7
Linearized                      : No
Page Count                      : 1
Producer                        : AntiCorp PDF FW
Create Date                     : 2054:01:17 22:45:22+01:00
Title                           : KarenForela_Instructions
Author                          : CyberJunkie@AntiCorp.Gr04p
Creator                         : AntiCorp
Modify Date                     : 2054:01:17 22:45:22+01:00
Subject                         : Forela_Mining stats and data campaign (Stop destroying env) 

Create Date : 2054:01:17 22:45:22+01:00から答えが得られる。
UTCに変換しなくてもよかった。2054-01-17 22:45:22が答え。

Task 10

The Forela threat intel team are working on uncovering this incident. Any OpSec mistakes made by the attackers are crucial for Forela's security team. Try to help the TI team and confirm the real name of the agent/handler from Anticorp.
Forela 脅威情報チームは、この事件の解明に取り組んでいます。攻撃者による OpSec のミスは、Forela のセキュリティ チームにとって非常に重要です。 TI チームを支援し、Anticorp のエージェント/ハンドラーの本名を確認してください。

攻撃者グループ名で検索してみると、LinkedInが見つかる。
AntiCorp Gr04p - Google 検索
この人?

Task 11

Which City does the threat actor belongs to?
脅威アクターはどの都市に属していますか?

上のLinkedInを見ると、Security Expert at AntiCorp Gr04p. AntiCorp Gr04p. Bahawalpur, Punjab, Pakistan.と書いてある。
Bahawalpurが答え。

OSCTF Writeups

https://ctftime.org/event/2416

[Web] Introspection

ソースコード無し。フラグを入力するサイトが与えられる。Burp Suiteを起動してサイトを巡回すると/script.jsが読み込まれていて、以下のようにフラグが含まれていた。

function checkFlag() {
    const flagInput = document.getElementById('flagInput').value;
    const result = document.getElementById('result');
    const flag = "OSCTF{■■■■■■■■■■■■}";

    if (flagInput === flag) {
        result.textContent = "Congratulations! You found the flag!";
        result.style.color = "green";
    } else {
        result.textContent = "Incorrect flag. Try again.";
        result.style.color = "red";
    }
}

[Web] Style Query Listing...?

SQL Injectionができるっぽいので、適当に試して一発で以下でフラグが手に入った。

username -> admin password -> ' or ''='

理論無し。

[Web] Heads or Tails?

ソースコード無し。GET /を開くとWelcome to my first ever website.と言われる。あまりにGuessだったので寝かせていたが、ヒントが有償で開けるようになったので開いてみる。

Try making a custom directory/file bruteforcing list that is made in the following format: (http_request_methods)-(words_related_to_ctf)

ということでGET /get-flagを試してみるとMethod Not Allowedという応答が得られる。OPTIONSを試してみよう。以下のようなリクエストを飛ばしてみる。

OPTIONS /get-flag HTTP/1.1
Host: 34.16.207.52:4789

すると、Allow: OPTIONS, HEADと帰ってくる。HEADを試してみよう。

HEAD /get-flag HTTP/1.1
Host: 34.16.207.52:4789

を送るとFlagヘッダーがレスポンスに含まれてきて、フラグ獲得。

[Web] Indoor WebApp

ソースコード無し。サイトを開くとWelcome to the IDOR Challengeと言われる。View Profileを押してみると/profile?user_id=1に遷移する。1から2に変更してみるとフラグが得られた。