write-ups/CTF

Layer7 CTF 2018 Margaret write-up

2018. 9. 18. 11:05



 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 를 사용한다. 



익스익스 +_+!!

취약점은 ?p= 로 include 하는 file을 우리가 원하는대로 조작할 수 있다는 점에서 시작된다. 


 하지만 secure_page 함수를 통해 $page 의 맨 끝 4글자가 html 일 때만 include 할 수 있기 때문에 LFI 취약점을 이용하는 것은 상당히 힘들어보인다. 그래서 우리가 원하는 파일을 include 하기 위해선 우리가 write 할 수 있는 파일을 찾아야 한다. 그런데 파일을 읽고 쓰는 기능이 없다.


난관봉착 1


 기능적으로 File Read/Write 를 사용하는 부분은 없지만, $_SESSION을 사용하기 때문에 /var/lib/php/sessions/sess_{session_key} 를 Write 할 수 있다. PHPSESSID 는 기본적으로 16진수로된 랜덤값으로 되어있지만 우리가 임의대로 정해도 상관없다. 우리가 임의대로 정한다면 파일을 이런 형태로 저장되어 있을 것이다. 


 그럼 우리의 username이 session file에 저장되어 있을 것이기 때문에 username에 PHP code를 넣는다면 Webshell를 실행시킬 수 있다.  


[*] POC : http://dm1536803965686.fun25.co.kr:23907/index.php?p=..././..././..././..././..././var/lib/php/sessions/sess_ch4n3html



난관봉착 2

 또 난관에 봉착했다. 아래의 코드를 보면, Register 시 공백을 사용하지 못한다는 것을 알 수 있다. 



 그런데 <? (혹은 <?php) 뒤에 whitespace 를 두어야 PHP tag와 code 간의 구분을 할 수 있는데 공백이 없다면 PHP engine은 PHP태그와 코드를 구분하지 못할 것이다. 


 이런건 @을 사용해서 우회가능하다. 그럼 <?@phpinfo();?> 로 웹쉘을 실행시켜보자. 




RCE를 성공시켰다. 하지만 system command 를 사용하는 함수들이 모조리 막혀있다. PHP의 가변함수를 이용해서 계속 시도해보려하다가 실패했다. 언더바도 필터링 되어있기 때문이다.



난관봉착 3


 언더바도 필터링 되어있기 때문에 우리가 값을 직접적으로 전달할 수 있는 $_GET 을 사용할 수 없었다. 

이건 예전에 김용진님이 내가 H3X0R CTF 냈던 문제를 풀이한 것을 본 적이 있어서 쉽게 풀 수 있었다. 


$_GET은 ${"\x5fGET"} 으로 사용할 수 있으므로 $_GET을 사용할 수 있게 된다. 


 그래서 다음과 같은 코드를 이용해서 무언갈 계속 시도해보다가 scandir() 함수를 이용해서 현재 디렉터리를 읽어보니 플래그가 있었다. 



http://dm1536803965686.fun25.co.kr:23907/index.php?p=..././..././..././..././..././var/lib/php/sessions/sess_ch4n3html&a=var_dump&b=scandir&c=.




[*] flag : LAYER7{ahngunhee_talmo_shakeit}