본문 바로가기
분류 전/CTF

[ASIS] hello 풀이

by jwcs 2023. 10. 2.
728x90

https://asisctf.com/challenges

 

ASIS CTF

 

asisctf.com

ASIS ctf 웹 문제이다.

 

/

첫 화면이다.

curl file:///hi.txt

명령어로 hi.txt를 가져오고있다.

 

curl 명령어는 데이터 전송 및 요청을 수행하는 명령줄 도구이다.

file 스키마는 로컬에 있는 파일에 접근할 때 사용된다. 

 

여기서 escapeshellarg은  문자열 주위에 작은따옴표를 추가하고 기존 작은따옴표를 인용/이스케이프하여 문자열을 쉘 함수에 직접 전달하고 단일 안전 인수로 처리되도록 한다. 이 함수는 사용자 입력에서 오는 쉘 함수에 대한 개별 인수를 이스케이프하는 데 사용되어야 한다.

https://www.php.net/manual/en/function.escapeshellarg.php

 

PHP: escapeshellarg - Manual

On Windows, this function naively strips special characters and replaces them with spaces. The resulting string is always safe for use with exec() etc, but the operation is not lossless - strings containing " or % will not be passed through to the child pr

www.php.net

여기서 자세히 알아보자.

 

우리는 next.txt를 읽어야한다. 그런데 next에 대한 필터링이 이루어지고 있다. 이를 어떻게 우회해야 할까?

https://curl.se/docs/manpage.html

 

curl - How To Use

 

curl.se

curl 매뉴얼이다. globbing에 대한 언급이 나와있다. globbing은 쉽게 와일드 카드라고 생각하면 된다.

 

http://45.147.231.180:8000/?x={f}ile:///{n}ext.txt

위에서 설명한 방법을 사용하여 짜봤다.

 

새로운 경로를 알려준다.

 

file 의 매개변수로 /proc/self/cmdline 을 받는다. 그대로 입력해보자.

 

base64로 인코딩 된 값이 나온다. 디코딩 해보자.

 

위의 값을 base64로 인코딩한 값이었다.

 

우선 /proc/self/cmdline이 어떤 파일인지 파악해보자.

 

gpt 최고

따라서 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() 함수에 대해 알 필요가 있다.

gpt 최고22

쉽게 말해서 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가 나왔다.

 

짜잔

728x90
반응형

'분류 전 > 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