deepble
[Webhacking.kr] challenge old-43 revenge 본문
문제
분석
해당 문제는 파일 업로드를 통해 서버에 웹쉘을 업로드한 후 flag를 읽는 것입니다. 조건문부터 분석을 시작하겠습니다.
변수 type에 업로드된 파일의 MIME타입을, 변수 name에 업로드된 파일의 이름을 할당합니다.
(미디어 타입, MIME 타입, 콘텐츠 타입은 인터넷에 전달되는 파일 포맷과 포맷 콘텐츠를 위한 2 부분의 식별자입니다.)
파일 타입이 발견하지 못하면 “type not detected”메세지와 함께 종료됩니다.
파일 이름에 “..”, “/”, “\\”, “.htaccess”와 같은 문자열이 포함되어 있으면 “dont do that” 메세지와 함께 종료됩니다.
파일 MIME 타입이 “text/”, “application/octet-stream”으로 시작하면 “wrong type” 메세지와 함께 종료됩니다. 이로 텍스트 파일이나 이진 데이터 파일의 업로드를 방지합니다.
이미지 처리를 위해 “Imagick” 객체를 생성해 변수 image에 할당합니다.
임시 저장된 업로드 파일을 읽어와 image 객체에 로드합니다.
이미지의 크기를 조정하고 가우시안 필터를 사용합니다.
처리된 이미지를 upload 디렉토리에 파일 이름으로 저장합니다.
“Done!” 메세지와 처리된 이미지의 링크를 출력합니다.
분석정리
- 파일 이름에 대한 검사를 하므로 디렉토리 순회 공격을 방지하고 있습니다.
- 파일 타입을 검증하여 특정 유형의 파일만 허용하고 있습니다. 이로 웹쉘처럼 사용 가능한 텍스트 파일이나 이진 데이터의 업로드가 불가능합니다.
- Imagick을 사용하여 업로드된 파일을 이미지 읽어들여 처리하고 있습니다.(이미지 파일만 업로드 가능하다고 알 수 있음) 또한 처리된 이미지는 “upload” 디렉토리에 저장됩니다.
풀이
jpg같은 이미지 파일 안에 악성코드를 삽입 후 업로드 하는 방식을 사용하였습니다. EXIF를 이용하여 주석 부분에 페이로드를 삽입하면 앞서 설명한 이미지 크기조정 필터 등에 영향을 받지 않고 이미지 업로드가 가능합니다.
페이로드 삽입할 이미지 파일 준비 (image.jpeg)
리눅스에서 명령어로 apt 업데이트 및 exiftool 설치
sudo apt update
sudo apt install -y exiftool
준비된 이미지 파일에 페이로드 주석 삽입
exiftool -Comment='<?php system("cat /flag"); ?>' image.jpeg
-Comment 옵션을 이용하여 메타데이터 필드를 지정한 뒤에 PHP 코드를 주석으로 삽입하게 됩니다. 주석 안에 내용은 PHP 코드로 서버에 /flag파일 내용을 읽어야하기 때문에 "cat /flag"를 입력합니다. image.jpeg는 명령어가 적용될 대상 이미지 파일 이름을 의미합니다.
★ 같은 디렉토리에서 작업해야합니다. 삽입하면 아래에 그림과 같이 이미지가 생성되는 것을 확인할 수 있습니다.
Burp Suite으로 패킷잡아 .jpeg를 .php로 변경 후 전송
1. Burp Suite에서 [Proxy]에 들어가 [Open browser]를 눌러 브라우저를 열어줍니다.
2. 열린 브라우저에서 Webhacking.kr에 challenge old-43 RevengE 문제 경로로 접속합니다.
3. 다시 Burp Suite로 가서 [Intercept is off]를 눌러 패킷을 잡아줍니다.
- Intercept is on 상태이면 브라우저에서 이동, 변경이 생길 때마다 Burp Suite에서 패킷을 잡아 수시로 Forward를 해야합니다. 따라서 패킷을 잡을 필요가 있을 때만 키는 것을 추천합니다.
4. 문제 사이트로 돌아가 [파일 선택]을 눌러 이전에 만들어 놓은 페이로드가 삽입된 이미지 파일을 업로드 한 후 제출합니다.
5. 4번을 진행하면 사이트에서는 로딩중으로 멈추게 됩니다. Burp Suite로 돌아가면 아래와 같이 패킷이 잡힌 것을 확인할 수 있습니다. 이곳에서 17번째 줄에 있는 filename="image.jpeg”에서 jpeg를 php로 변경합니다.
6. 변경이 완료 됐다면 [Forward]를 눌러 패킷을 전송합니다. 그러면 성공적으로 php파일이 업로드 된 것을 확인할 수 있습니다.
업로드된 링크로 들어가 FLAG 얻기
Burp Suite에서 Proxy를 끄지 않았다면(Intercept is on 상태) 패킷이 잡히게 되므로 [Forward]를 누르거나 Proxy를 꺼주시면 ((Intercept is off 상태) 됩니다.
꼼수
문제 사이트에서 코드를 살펴보면 업로드된 파일은 ./upload 경로 안에 이미지파일 이름으로 저장되는 것을 확인할 수 있었습니다. 제가 이미 image.php로 flag를 얻을 수 있는 php을 업로드 해놨기 때문에 upload/image.php로 저장되었을 것입니다. 그러면 사이트에 경로만 입력해도 FLAG를 쉽게 얻을 수 있습니다. ㅎㅎㅎ
풀이자가 40명정도 되는데, 위에 편법을 이용해서 일반적으로 자주 사용될 법한 파일 이름을 대입해보는 무차별 대입 공격을 시도해서 FLAG를 얻을 수도 있어보이네요!
'CTF > Webhacking.kr' 카테고리의 다른 글
[Webhacking.kr] challenge g00gle1 (0) | 2024.04.05 |
---|---|
[Webhacking.kr] challenge old-6 (0) | 2024.04.04 |
[Webhacking.kr] challenge old-3 (0) | 2024.04.02 |
[Webhacking.kr] challenge old-2 (0) | 2024.03.27 |
[Webhacking.kr] challenge old-1 (0) | 2024.03.27 |