Beginner 과정_CTF 풀이

2023. 9. 27. 13:46Web Hacking/Dream Hack_CTF

 

총 9개의 CTF 

 

 

[ 1 ]  64se64 

 

 

http로 문제 사이트 접속

Elements 를 살펴보니

64se64_encoding이란 이름으로 어떠한 값이 숨겨져 있음을 확인

64se64란 이름과 값을 보아하니

base64로 인코딩 되어있는것같았다

 

그래서 base64디코딩을 진행시켜보았다

디코딩하니 파이썬 코드가 나왔다

 

VScode에서 코드를 실행시켜보니

DH{} 형식의 Flag값을 발견 !!

 

(+Python 한글 깨짐 현상이 발생하여 맨 윗 줄에

아래의 코드를 다 utf-8로 인코딩 시켜주는 #-*-encoding:utf-8-*- 을 추가해 주었다)

 

 

Flag값 입력

 

 

 

 

 

[ 2 ]  baby-linux 

 

자세한 문제 풀이 :

https://mssongh.tistory.com/19

[문제 설명]

 

[문제 페이지]

리눅스 명령어를 실행하는 웹 서비스 페이지 접속 

 

 

pwd 입력시, /app경로에 있음을 확인

 

ls명렁어 입력시, /app 경로 안에 app.py, dream, hint.txt, requirements.txt, static, templates 이름의 파일 및 폴더가 있음을 확인

 

hint.txt 파일에 문제 힌트가 있을것을 예상하여

cat hint.txt 명령어로 파일내용을 확인했을때, ./dream/hack/hello 경로에 flag가 있다는것을 알 수 있음

 

 

 

현재 경로에서 ./dream/hack/hello경로로 진입후,
디렉터리 목록을 출력하기 위해


cd dream/hack/hello && ls 입력 시, flag.txt파일이 있음을 확인 
해당경로로 들어가 flag.txt 파일을 열기위해
cd ./dream/hack/hello && cat flag.txt 입력시, No!가 출력

 

웹 서비스를 설정한 코드에서 flag 값이 나오는것을 막아놨다고 예상

 

그래서 문제 파일을 살펴봄 

 

 

 

문제 파일 다운로드

 

파일 다운로드 후

[파일 다운로드]

 

[app.py파일]

*/ ( app.py파일은 디렉터리 목록에서도 확인 가능)

 

 

Visual Studio Code 에서 app.py파일 오픈

[app.py파일 오픈]

 

 

App.py파일 분석

 

App.py파일을 살펴보았을때 Flask를 import하여 사용 중인 것을 확인 가능

 

 

따라서, 이 코드는 Flask라는 웹 프레임워크를 이용하여 만든 웹 서버코드이며

@APP.route('/', methods=['GET', 'POST'])
' / ' 페이지, 즉 메인 페이지에서 GET, POST메소드만 사용가능하며
    if request.method == 'POST': 만약 POST 메소드 요청을 받았다면 
        user_input = request.form.get('user_input') user_input  = 웹 페이지의 리눅스 명령어 입력창에 입력한 값 
        cmd = f'echo $({user_input})' cmd = 그 입력한 값을 리눅스 명령으로 처리
        if 'flag' in cmd:
            return render_template('index.html'result='No!')
하지만, cmd(=input 입력창)에 'flag'문자 입력시 결과 값을
No!로 반환하도록 설정됨

 

그래서 cd dream/hack/hello && cat flag.txt 입력시, flag문자가 들어있어 No!가 출력

 

이렇게 문자 필터링이 되어있는 것을 확인, flag.txt 파일 내용을 보려면 필터링을 우회해야함

 

 

<필터링 우회>

 

flag라는 문자를 'f'lag로 바꿈으로서 문자 필터링 우회 시도

 

cd ./dream/hack/hello && cat 'f'lag.txt 입력시

( && - 앞의 명령어가 성공했을 때 다음 명령어 실행 )

 

필터링이 우회되고 flag.txt파일 내용이 보임으로써 플래그를 발견 !!

[flag 발견]

 

 

 

 

 

 

 

[ 3 ]  Exercise: Welcome-Beginners 

 

[문제 설명]

 

[접속 정보]

http를 통한 접속은 안됨

nc 명령어로 시스템에 접속하여 문제에 접근

[nc 접속]

nc로 접속 후 Dreamhack 을 입력하라는 구문을 보고 

 

Dreamhack 입력 시, DH{}형식의 Flag 값을 획득 !

 

[Flag 입력]

 

 

 

[ 4 ]  Exercise: SSH

터미널에 ssh 를 입력하여 OpenSSH가 실행중인지 확인

 

아래 예시를 참고하여 문제에 주어진 id, pw, host, port를 입력

ssh chall@host3.dreamhack.games -p 20749 

 

를 입력하여 ssh접속 요청 후,

패스워드 dhbgssh 입력 시 

 

성공적으로 SSH접속이 된것을 확인하였다

아래와 사진을 통해 ls 목록에 flag파일이 존재한다는것을 알고

flag 파일의 내용을 확인하니

flag 값 발견 !!

 

 

 

[ 5 ]  Exercise: Doker

 

 

문제 파일을 안에 deploy 폴더에 있는 flag파일을

HxD로 오픈 시,

 

 

 

 

Flag 획득

 

 

[ 6 ]  blue-whale

$ wget https://github.com/wagoodman/dive/releases/download/v0.9.2/dive_0.9.2_linux_amd64.deb
$ sudo apt install ./dive_0.9.2_linux_amd64.deb
$ dive dreamhackofficial/blue-whale:1 으로 dive 환경으로 간 뒤
RUN /bin/sh -c touch python3 -c "print(open('./flag', 'r').read())" # buildkit 로 가서
flag의 DH 값 확인

 

 

docker pull dreamhackofficial/blue-whale:1
CI=true dive dreamhackofficial/blue-whale:1

명령어 입력시 Flag 획득

 

[ 7 ]  ex-reg-ex

[문제 설명]

 

문제 화면을 살펴보았을때,어떤 값을 보내면 flag를 보여주는것으로 예상된다

[문제 화면[

문제 파일을 다운로드하여 

[문제 파일]

app.py 파일을 살펴보니 

아니나 다를까 input에 " dr\w{5,7}e\d+am@[a-z]{3,7}\.\w+ "라는 정규표현식을 풀어 값을 넣게 되면

Flage가 출력되도록 코드가 이루어져 있었다

"

위의 정규표현식을 분석해보면

 

dr + 5 ~7자리 글자 + e + 숫자 + am@ + a~z까지의 3~7자리 글자 + . + 글자 반복      이다.

 

따라서 

 

drssssse1am@sss.sss 값을 input 했을때

아래와 같이 Flag 값이 나온다

 

 

 

 

 

 

[ 8 ]  phpreg

[문제 설명]

http접속하여 문제 페이지 확인하여 살펴보니

Step1과 Step2 두가지 조건을 맞춰야 Flag를 얻을 수 있다는 것을 알 수 있음

[문제 페이지-step1]
[문제 페이지-step2]

문제 파일도 다운로드 했다

 

우선 index.php는 별내용이 없었고

Step2.php를 살펴보니 다음과 같은 부분이 있었다

 

 

 

 

            // pw filtering
            if (preg_match("/[a-zA-Z]/", $input_pw)) {
              echo "alphabet in the pw :(";
            }
알파벳을 포함 할 수가 없음을 뜻함
$name = preg_replace(“/nyang/i”, “”, $input_name); /i는 대소문자를 구분하지 않는다는 뜻.
nyang을 공백으로 바꿔버린다는 뜻
$pw = preg_replace(“/\d*@\d{2,3}(31)+[^0-8]!/”, “d4y0r50ng”, $input_pw); 마찬가지로 /\d*@\d{2,3}(31)+[^0-8]!/ 정규표현식을 d4y0r50ng로 바꿔버린다는 뜻
if ($name === “dnyang0310” && $pw === “d4y0r50ng+1+13”)
name과 pw에 들어가야 하는 값을 의미

< id >

단어가 공백으로 치환되는 것은 아래와 같이 쉽게 우회 가능하다.
dnnyangyang0310 --> dn yang0310 --> dnynyangang0310

 

< pw >

정규표현식 /\d*\@\d{2,3}(31)+[^0-8]\!/에 만족하는 값으로는 1@11319!+1+13 가능

최종 패스워드 값을 1@11319!+1+13 로 대입

 

 

 id,pw를 입력하자

Step2 화면으로 넘어갔다

문제에서 플래그는 ../dream/flag.txt에 위치한다고 했으나

아래 조건식 때문에 flag라는 문자를 입력하지 못한다

                else if (preg_match("/flag/i", $cmd)) {
                  echo "<pre>Error!</pre>";
                }

하지만 *를사용하여 flag 값을 읽어올 수 있었다

 

cat ../dream/*.txt를 입력하면 다음과 같이 flag값을 확인 할 수 있다

 

 

 

[ 9 ]  dreamhack-tools-cyberchef

 

 

위의 설명대로

문제 파일을 다운로드 받아 index.html을 열면

위의 문자를 보고

 

Rail Fence 암호화 -> Base64 인코딩-> ROT13 암호화 순서로 진행하니

 

 <Rail Fence 암호화>

Base64 인코딩

 

ROT13암호