Layer7 CTF 2018 Margaret write-up
Layer7 CTF 를 6등으로 마무리했는데 너무 슬프다 흑흑... 토요일에 빡겜하고 일요일에 이 정도면 그냥 3등일 것이라는 생각으로 계속 놀고 먹고 잤는데 학교가서 8시에 CTF 순위를 확인하니까 위에 한 명이 생겻길래 그 때부터 헐레벌떡 풀엇더니 4등햇다
일요일 8시부터 대회를 다시 시작했을 때, 웹 300을 풀고 나서 웹 250과 폰 100 중 고민했었다. 대회 때 Margaret 문제를 보고 "아 이건 딱봐도 문시우 문제다" 싶어서 pwn100을 시도했는데, 마가렛트 문제를 다시 풀어보니까 재밌어서 공유해본다.
Analyse
PHP를 사용한 간단한 MVC 모델이다. 파일들을 분석해보면 알겠지만 .htaccess를 사용해서 /login.html => /index.php?p=login.html 이렇게 하도록 한다.
GET 메소드를 이용했을때 Template Rendering을 해준다. render_template() 함수를 실행시켜 렌더링을 할 때는 내부적으로 include 를 사용한다.
익스익스 +_+!!
하지만 secure_page 함수를 통해 $page 의 맨 끝 4글자가 html 일 때만 include 할 수 있기 때문에 LFI 취약점을 이용하는 것은 상당히 힘들어보인다. 그래서 우리가 원하는 파일을 include 하기 위해선 우리가 write 할 수 있는 파일을 찾아야 한다. 그런데 파일을 읽고 쓰는 기능이 없다.
난관봉착 1
그럼 우리의 username이 session file에 저장되어 있을 것이기 때문에 username에 PHP code를 넣는다면 Webshell를 실행시킬 수 있다.
난관봉착 2
또 난관에 봉착했다. 아래의 코드를 보면, Register 시 공백을 사용하지 못한다는 것을 알 수 있다.
그런데 <? (혹은 <?php) 뒤에 whitespace 를 두어야 PHP tag와 code 간의 구분을 할 수 있는데 공백이 없다면 PHP engine은 PHP태그와 코드를 구분하지 못할 것이다.
이런건 @을 사용해서 우회가능하다. 그럼 <?@phpinfo();?> 로 웹쉘을 실행시켜보자.
RCE를 성공시켰다. 하지만 system command 를 사용하는 함수들이 모조리 막혀있다. PHP의 가변함수를 이용해서 계속 시도해보려하다가 실패했다. 언더바도 필터링 되어있기 때문이다.
난관봉착 3
언더바도 필터링 되어있기 때문에 우리가 값을 직접적으로 전달할 수 있는 $_GET 을 사용할 수 없었다.
이건 예전에 김용진님이 내가 H3X0R CTF 냈던 문제를 풀이한 것을 본 적이 있어서 쉽게 풀 수 있었다.
$_GET은 ${"\x5fGET"} 으로 사용할 수 있으므로 $_GET을 사용할 수 있게 된다.
그래서 다음과 같은 코드를 이용해서 무언갈 계속 시도해보다가 scandir() 함수를 이용해서 현재 디렉터리를 읽어보니 플래그가 있었다.
[*] flag : LAYER7{ahngunhee_talmo_shakeit}
'write-ups > CTF' 카테고리의 다른 글
KERIS 정보보안경진대회 2018 Write up (0) | 2018.11.12 |
---|---|
2018 정보보안 경진대회 우승했습니다. (0) | 2018.11.11 |
2018 Layer7 CTF write up (0) | 2018.09.18 |
codegate 2016 watermelon write up (0) | 2018.07.26 |
제 1회 사이버가디언즈 고등학교 리그 write up (0) | 2018.06.28 |