https://dreamhack.io/wargame/challenges/27/
드림핵 wargame 단계별로 풀어보기 welcome 문제이다.
문제 페이지를 보면 접속 정보와 문제 파일을 확인할 수 있다.
어떻게 접속해서 어떤 문제를 풀라는 것일까??
Pwnable CTF / wargame 풀이는 다음과 같은 순서로 이루어진다.
0. 제공된 문제 파일 다운로드 (공격해야하는 프로그램)
1. 제공 받은 프로그램/소스코드 분석 (문제 파일)
2. 원격으로 공격할 서버에 접속 (접속 정보)
3. 서버에 접속하는 순간 주어준 프로그램이 자동으로 실행된다.
4. 이제 그 프로그램을 잘 주물러서 서버의 쉘을 획득하면 됨!
5. 이후 쉘에서 악의적인 동작(flag 파일 읽기)를 수행
이때 서버에 접속하는 방법은 여러가지가 있다.
첫번째로 웹 브라우저를 이용하는 것
http://[호스트 이름]:[포트번호]
http://host1.dreamhack.games:20774
와 같은 방법으로 접속할 수 있다. 브라우저에서 포트 번호를 입력해주고 싶을떄는 도메인 이름(호스트 이름) 뒤에 : 을 붙인뒤 포트번호를 입력해주면 된다.
주로 웹 페이지를 만져보며 취약점을 찾아야하는 웹 해킹 문제에서 많이 사용하는 접속 방법이다.
조금 더 자세한 내용은 아래 포스팅에서 확인해볼 수 있다.
https://juntheworld.tistory.com/18?category=983751
두번째는 netcat을 이용하는 것
웹 페이지를 볼 필요가 없고 문제파일로 C언어 따위로 만들어진
프로그램이 주어지는 Pwnable 문제의 경우에 주로 사용한다.
리눅스 nc 명령을 통해서 서버에 접속할 수 있다.
(윈도우로도 netcat 프로그램 사용이 가능하지만, 사용해본적이 없어서 잘 모르겠다. 윈도우 용 netcat은 여기서 다운 받을 수 있나보다 https://eternallybored.org/misc/netcat/)
리눅스에서 netcat을 사용하는 방법을 알아보자
설치
sudo apt-get install netcat
사용법
nc [호스트 이름] [포트 번호]
nc host1.dreamhack.games 20774
를 입력하면 쉽게 해당 호스트와 포트를 가지고 있는 서버에 접속할 수 있다.
여기서 호스트는 도메인 네임(-> ip주소)라고 보면 된다.
접속을 성공적으로 한다면 다음과 같이 Welcome To DreamHack Wargame! 이라는 문구와 함께 예쁜 플래그를 얻을 수 있다.
어서 플래그를 정답 창에 복붙해서 wargame 문제를 푼 쾌감을 느껴보기를 바란다.
여기서 서버에 접속을 하면, Welcome To DreamHack Wargame! 이라는 문구와 플래그가 출력되는데,
이런 동작은 누가 해주는 것일까?
바로 문제 파일로 제공된 welcome.c 파일이 이러한 동작을 수행해주는 것이다!
문제 파일을 다운로드하면 다음과 같은 zip파일이 다운로드 되고, 안을 까보면 이런 두개의 파일이 있다.
첫번째는 바이너리 실행파일이고, 두번째는 C언어 소스코드이다.
사실 바이너리 파일만 존재해도, 프로그램을 분석하는 것이 가능(리버싱, 동적 디버깅 등을 이용)하기 때문에, 어려운 문제의 경우 C언어 소스 코드를 주어주지 않을 수도 있지만, welcome 문제는 상당히 친절한 친구인 것 같다.
그래서 c 소스 코드를 까보면,
#include <stdio.h>
int main(void) {
FILE *fp;
char buf[0x80] = {};
size_t flag_len = 0;
printf("Welcome To DreamHack Wargame!\n");
fp = fopen("/flag", "r");
fseek(fp, 0, SEEK_END);
flag_len = ftell(fp);
fseek(fp, 0, SEEK_SET);
fread(buf, 1, flag_len, fp);
fclose(fp);
printf("FLAG : ");
fwrite(buf, 1, flag_len, stdout);
}
printf 를 통해 아까 본 Welcome To DreamHack Wargame! 이라는 문구를 출력해주고
파일 포인터를 이용해서 /flag 파일을 fread로 읽어온 뒤, 열어서 보여준다.
fwrite 함수에 4번째 인자에 파일 포인터 스트림으로 stdout을 지정하면 화면에 출력된다.
핵심은 우리가 nc로 접속한 서버(접속 정보)에서 문제 파일로 제공된 프로그램이 자동으로 실행되었다는 것이다.
이 서버에서 돌아가는 프로그램을 공격해서 쉘을 얻어 서버 어딘가에 있는 /flag 파일을 읽는 것이 pwnable wargame의 목표!!
'CTF > dreamhack.io' 카테고리의 다른 글
[dreamhack.io] proxy-1 (0) | 2022.02.21 |
---|---|
[Dreamhack.io 단계별로 도전하기] off_by_one_001 Write-up (0) | 2022.01.10 |
[Dreamhack.io 단계별로 도전하기] basic_exploitation_001 Return Address Overwrite (Pwnable) (0) | 2021.08.03 |
[Dreamhack.io 단계별로 도전하기] basic_exploitation_000 Return Address Overwrite (Pwnable) (0) | 2021.08.02 |
[Dreamhack.io 단계별로 도전하기] file-download-1 파일 다운로드 취약점(WEB) (0) | 2021.07.26 |