Dreamhack CTF Season 3 Round #2 (🌱Div2) / baby-linux 문제 풀이

2023. 4. 22. 11:47Web Hacking/Dream Hack_CTF

 

문제 제시

 

 

 

문제 VM 웹페이지 접속

 

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

 

 

명령어 입력 부분에 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파일은 디렉터리 목록에도 있던 파일 )

*/

 

 

Visual Studio Code 에서 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 파일 내용을 보려면 필터링을 통과하기위해 문자를 우회해야한다

 

 

/* 참고 

 

코드에 있는 용어 구글 검색시, 

 

  • Flask : 파이썬 마이크로 웹 프레임 워크
  • subprocess : 현재 소스코드안에서 다른 프로세스를 실행하게 해주며 데이터의 입출력도 제어하는 모듈
  • render_template : flask에서 제공하는 함수이며, templates에 저장된 html을 불러올때 사용
  • Flask는 요청 데이터를 파싱해서 request 전역 객체에 저장 / 이를 통해 데이터에 접근 할 수 있음

subprocess 모듈은 파이썬에서 쉘 명령을 실행할 수 있게 해주는 라이브러리

 

*/

 

문자 필터링 우회

 

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

 

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

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

 

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

 

&&필요없이 cat ./dream/hack/hello/'f'lag.txt   한줄 명령어로도 입력이 가능하다 

 

 

cd ./dream/hack/hello && cat 'f'lag.txt  ./dream/hack/hello 경로 이동 후 flag.txt파일 내용 보기
cat ./dream/hack/hello/'f'lag.txt  ./dream/hack/hello 경로의 flag.txt파일 내용 보기

 

 

 

다른 문자 필터링 우회 방법

 

cat ./dream/hack/hello/f\lag.txt 명령어 실행시 \ 문자는 자동으로 무시되기에 우회 가능
cat ./dream/hack/hello/f''lag.txt '와'
cat ./dream/hack/hello/f""lag.txt "와"

''는 문자를 구분하는 특수문자일 뿐이라 문자에 포함이 안되고 정보를 전달하는 과정에서 ''는 사라진 flag만 전달하는것이라고 예상한다

 

/도 마찬가지로 구분자이기에 전달과정에서 사라지거나 영향이 없을것으로 예상

 

 

 

 

 

 

/*

cd ./dream/hack/hello && cat 'f'lag.txt 입력후 Sumbit으로 입력값을 보낼때를

 

Burp suite(버프스위트)로 프록시를 잡아 HTTP POST 요청을 확인한 결과

 

user_input(명령어 입력 창 입력 값) = cat+.%2Fdream%2Fhack%2Fhello%2F%27f%27lag.txt 을 보고

 

URL 인코딩되어 값이 들어가는것을 확인 가능하다

 

또한, %27f%27lag.txt 부문을 보면 %27 = '로 치환되어 입력된것을 보고

 

원래라면 flag라는 하나의 문자가 그대로 전달되면 이를 막지만

 

'라는 문자를 구분하는 특수문자가 f를 둘러 싸고있으므로 'f'가 전송이 되어 'f'lag

 

 

 

 

+ 다른방법 찾는중

리눅스 와일드카드로 푸는 방법도 있다고 함 

'Web Hacking > Dream Hack_CTF' 카테고리의 다른 글

Beginner 과정_CTF 풀이  (0) 2023.09.27
드림핵_WEB_NOTE  (0) 2023.02.16