write-ups/CTF

H3X0R CTF geek test write up

2018. 6. 17. 21:05


늦은 감이 굉장히 많이 드는데 지난주에 있었던 H3X0R CTF 의 Write up을 공개해볼까 한다.


해당 문제의 소스 


일단 문제 컨셉 자체는 websec.fr 에서 문제를 풀다가 나온 것이고, 원평이형하고 이러쿵저러쿵 얘기를 하다가 나온 문제이다. PHP Jail류의 문제이기 때문에 취약점 자체는 바로 보인다. 


Challenge Anaylse



받은 $code 를 eval() 함수로 eval 시키는 곳에서부터 취약점이 발생한다. 그럼 여기서 함수를 써서 취약점을 공략하면 된다.



근데 여기서 문제가 존재한다. get_defined_functions() 함수를 통해서 이미 선언되어 있는 모든 함수들을 필터링하게 된다. 우리는 이러한 필터링을 우회해야 한다. 



Useful PHP trick 1

여기에서는 정상적인 방법으로는 풀 수 없고 PHP 트릭을 이용야만 풀 수 있다. 해당 트릭은 다음과 같다. 


PHP에서는 함수를 이상하게 처리한다. 이런걸 정확히 어떤 용어로 부르는지는 잘 모르겠지만, 어째뜬 이러한 형식이 된다. 



Useful PHP trick 2

대괄호가 막혀있는데 대괄호 없이도 배열의 요소에 접근할 수 있는 방법이 존재한다. 외쳐 갓PHP! 이것도 그냥 배열에 접근할 수 있는 방법이 없을까 생각하면서 해봤는데 되어서 꽤나 신기했던 기억이 난다. 



Exploit

 우리는 배열에 접근할 수 있고, 문자열을 이용해서 함수를 실행시킬 수 있다. 그럼 우리가 할 수 있는 것들을 찾아보도록 하자. 



$variables 라는 변수에 _GET 전역변수가 들어가는 것을 확인하였다. 그럼 우리는 배열에 접근하는 방식을 알기 때문에 $_GET 안의 요소들에도 접근할 수 있는 방법을 갖게 된다. 


http://dimitrust.oa.to:8080/php_shell/?code=print($variables{0});



그럼 우리는 _GET에 있는 우리가 보낸 값들에 접근할 수 있는 방법이 생겼고 이는 String 형이니 String -> function 트릭을 이용해서 함수를 실행시킬 수 있다. 


http://dimitrust.oa.to:8080/php_shell/?code=${$variables{0}}{0}();&0=phpinfo



phpinfo() 함수를 실행시킨 모습이다. 


그런데 길이 제한 때문에 함수를 실행시키는 것은 조금 힘들어 보인다. 그런데 우리는 에러코드를 제공받았다. 



그래서 이런식으로 변수 안에 있는 값들을 에러코드를 통해서 볼 수 있게 된다. ~_~ 그렇게 플래그도 획득할 수 있다. 


http://dimitrust.oa.to:8080/php_shell/?code=${${$variables{0}}{0}}();&0=flag



[*] flag : H3X0R{yes u r a geek}



여담 

 김용진님이 unintended solution으로 문제를 풀어서 정말 당황한 나머지 Geek test revenge 문제를 홧김에 업로드하였다... 그래서 이러한 방식으로 문제를 푼 사람들은 약 1000점을 꽁으로 얻게 되었다... ㄹㅇ루 역대급 판단미스....