nebula_level09
해킹/시스템 2015. 11. 7. 03:05
nebula_level09 포스팅입니다.
flag09파일 의 php 소스인듯 합니다.
argv[2]를 통해 markup 함수로 들어가는 use_me 변수를 사용해서 공격하는게 확실해 보입니다.
변수 이름이 use_me 이니까요.
사실 php에 전혀 익숙하질 않아서 슬래시 역슬래시가 마구잡이로 섞여있는 코드를 보면서 머리가 참 아팠습니다.
preg_replace는 문자열에서 패턴으로 검출한 부분을 변경해 주는 함수입니다.
markup 함수 안쪽에 이 함수게 세번 호출되는데 뒷쪽에 두번은 코드를 직접 주입할 수 없게 [, ] 를 바꿔주는 일반적인 기능인 것으로 보입니다만 처음 호출되는 preg_replace가 어딘가 취약해 보입니다.
$filename을 통해 전달된 해당 파일의 내용이 $contents 안으로 들어가고 그것을 변경해주는데
"[email" 뒤에 부분을 "]"를 만날때 까지 spam("\2")로 바꿔준다는 내용입니다.(가독성을 위해 \를 빼줫습니다.)
\2가 무슨뜻인지 몰라 잠시 헤맸지만 ()를 두번째 만나는 부분이라는 뜻이란 걸 알아냈습니다. 즉 email이라는 문자 뒤에 나오는 것들을 집어다 넣겠다는 뜻이군요. /e는 앞의 문자열이 php코드라는 뜻이라고 합니다.
tmp밑에 level09.txt를 생성해서 저렇게 만들어주고 argv[1]으로 level09.txt의 경로를, argv[2]로 /bin/bash를 넣어줘봤습니다.
그대로 /bin/bash를 뱉어내기만 할 뿐 실행되지는 않습니다.
system(bin/bash), exec(/bin/bash) 어떻게 넣어봐도 코드로 인식하지 않는지 그냥 그대로 뱉어버립니다.
여기서 1차 멘붕이 왔습니다...
그러던 중에 http://www.madirish.net/node/437에서 재밌는 자료를 찾았는데
짧은 영어이지만 해석해보니 flag가 있을 경우 php 함수가 변수에 있는 문자열을 찍는 것이 아니라 함수를 직접 실행켜 phpinfo를 불러오는 오류가 있다는 내용이었습니다.
그런데 위의 시도에서는 코드가 실행되지 않고 정상적으로 뱉어냈을까요?? 해당 문서의 전문을 읽어보니 spam함수의 괄호 안에 ("") 이런식으로 따옴표가 들어가 있기 때문인 것 같습니다. 위 문서의 경우에는 strtoupper("\\1")이렇게 했더니 정상적으로 대문자로 바꾸는 기능을 수행했으나 strtoupper(\\1)이렇게 따옴표가 없을 때 함수이름까지 출력되었거든요.. 이부분을 우회하기 위해서 level09.txt를 바꿔야 했습니다.
또 이것저것 뒤져보다 정규표현식에서 \\2와 {$2}가 혼용될 수 있다는 정보를 찾았고 그부분을 이용하기로 했습니다. \\2로 사용될 경우 spam("")안에서 결국 문자열로 취급 될 뿐이라서요.
여러가지로 시도를 해본 결과 level09.txt를 [email {${`$use_me`}}]로 바꿔준후...
쉘이 떴습니다!! 근데 getflag를 제대로 실행하지도 못하고 exit를 받고 나서야 안된거라고 뱉어내는 이상한 삐꾸 쉘이 떴네요...ㅎㅎ
쉘을 띄워주는 소스를 짠 후 gcc 명령어로 컴파일을 시켜 아웃풋을 뱉도록 해봐야 겠습니다.
argv[1]로 uid를 넣도록 해놨습니다.
./flag09 /tmp/level09.txt "gcc -o /home/flag09/getshell_id /tmp/getshell_id.c; chmod 7777 /home/flag09/getshell_id" 이런 명령으로 컴파일을 했더니 성공적으로 getshell_id가 생성되었습니다.
중간에 명령어를 바보같이 입력해서 캡쳐가 지저분해지긴 했으나... 결국 getflag 실행에 성공했군요.
솔직히 php를 거의 모르는 상황에서 맨땅에 헤딩하는 경우이고 시스템보다는 웹쪽 내용인 것 같아 넘어가고 싶기도 했으나 어쩐지 풀릴듯 풀릴듯 싶어 계속 잡고있게 만드는 문제였네요... 정말 오래걸렸습니다.
끝-
'해킹 > 시스템' 카테고리의 다른 글
Codegate CTF 2016 - oldschool (0) | 2016.03.22 |
---|---|
Codegate CTF 2016 - miccheck (0) | 2016.03.21 |
nebula_level08 (0) | 2015.11.06 |
nebula_level06 (1) | 2015.11.04 |
nelbula_level05 (1) | 2015.10.29 |