2023. 4. 22. 11:47ㆍWeb 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 |