Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

dohki

PHP extension 본문

Hacking/Web

PHP extension

dohki 2016. 7. 11. 00:10

SECUINSIDE CTF Quals 2016에 참가 했는데 마지막에 ownmyweb을 계속 잡고 있었다. web part까지만 풀었기 때문에 완전한 풀이도 아니어서 그냥 여기에 쓴다. ebmoon이 XXE injection이 된다는 것을 알려 줘서 거기에다 php filter wrapper만 추가해서 index.php를 빼내었다. flag.php에는 fake flag가 있었고... (ㅂㄷ) index.php는 더 이상 볼 게 없어서 접으려고 했다. (secret_comment 같은 낚시 따위 걸리지 않아 주겠어...) hint가 shell을 얻으라는 거여서 expect 같은 다른 php wrapper들로도 시도해 보았지만 enable되지 않은 듯 하였다.



옛날부터 다른 CTF에 참여 하면서도 궁금한 게 하나 있었는데, 직접 돌아가고 있는 web app의 src를 다운 받았는데 어떻게 define도 되어 있지 않고 include도 되어 있지 않은 function이 있을 수 있는 가 궁금 했었다. 문제 풀기를 포기 할까 하다가 저게 너무 궁금하기도 하고 마지막 시도도 할 겸 알아 보기로 했다.


처음에는 global하게 include하는 무언가가 있을 것이라 생각 했다. 그런 것들은 보통 php.ini 같은 config 파일에 있을 것 같아서 (이유는 모르겠지만 이런 파일들은 php file wrapper로는 다운이 안 되었고 php filter wrapper로만 다운 받을 수 있었다. 아마 권한 차이인 듯 하다.) php.ini를 다운 받고 하나씩 살펴 보는데 마지막 줄에 extension이라는 것이 눈에 확 띄었다. 그것도 그런 게 이름이 /var/www/html/module_359d7c88d1f37182e8c0db1c935296f1/myxml.so라서...


그래서 저 so파일도 뽑아서 ida로 까 봤는데 zif_xml_sec_check라는 함수가 있어서 바로 이 부분을 보기 시작 했다. (index.php에 있던 정체불명의 함수의 이름이 xml_sec_check 였다.) 참고로 이름이 저런 이유는 다음 사진과 같다. (그나저나 chall.stypr.com에 php-reverse 문제를 풀면서도 느낀 거지만 Zend API는 뭔가 document가 많이 없다...)



zif_xml_sec_check라는 함수를 분석을 하는데 system hacking 안 한지 너무 오래 되어서 dapan에게 정적 분석을 부탁 했는데 아무리 봐도 logic 측면으로 접근 해서는 풀 수가 없어 보였다. xmlEntity라는 구조체도 검색해서 value를 어떻게 맞춰야 하는가도 고민해 봤지만 불가능해 보였다. 사실 이 문제 분야도 pwn이고 여기서 빨리 web part는 끝났다고 판단 했어야  했는데 이 함수가 뭘 하는 지 알고 싶어서 서버에 extension으로 설치해 동적 분석을 해 보고 싶었다. 근데 이미 plus 서버는 apache와 nginx, php5와 php7의 php.ini들이 다 뒤섞여서 대체 어떤 php.ini가 영향을 주는 지 알 수가 없었다. (사실 php5와 nginx를 쓰고 있는 것 같아 그것부터 시작해서 다 시도해 봤지만 이유를 알 수 없게도 아무 것도 되지 않았다.) 그래서 엄청 옛날에 쓰던 서버에 올리게 되었다.


이 myxml.so를 extension으로 인식 시키게 하기 위해서 얼마나 다양한 삽질을 했는 지 모른다. phpize를 써야 한다는 문서도 보았지만 우린 src로부터 만드느 것이 아니고 이미 so파일이 있기 때문에 필요 없었고 단순히 register? 인식?만 시키면 될 것 같았다. 올바른 dir에 myxml.so파일을 위치 시키고 그것에 대응하는 myxml.ini도 올바른 dir에 위치 시키고 apache restart를 하는 걸로 충분할 것 같았는데 안 되었다. dl 함수까지 써 보려고 enable 했는데도 실패 하였다. 문제의 이유는 다음과 같았다.


 


Module과 PHP의 버전이 다르기 때문이었다. 여기서 또 Module을 downgrade하기 보다는 PHP를 upgrade 하는 게 나을 것 같아서 20131226이 PHP 5.6이라는 걸 알아내고 어떻게 하면 특정 PHP 버전으로 upgrade 할 수 있을까하고 계속 삽질을 했다. 그래서 sudo add-apt-repository ppa:ondrej/php5-5.6 같은 것들을 시도해 보는데 apt도 알 수 없는 이유를 뿜어내고 CTF 종료 시간도 10분 남아서 포기했다.


끝나고 문제 출제자에게 풀이를 물어보니 myxml.so에서 UAF를 하면 된다고 한다. ㅋ




TL;DR


1. include나 define이 안 된 function들은 extension에 있을 가능성이 크다. 아니면 auto_prepend_file을 보자.

2. php.ini ㅅㅂ php ㅅㅂ

3. 서버 설정은 왜 이렇게 어려울까

4. web hacking만 해서는 답이 없다.

'Hacking > Web' 카테고리의 다른 글

error based sql injection with xml function in procedure analyse  (0) 2016.02.02
Comments