티스토리 뷰




command injection을 공부하다가 좋은 문제가 있어서 풀이를 쓰게 되었습니다.


이 문제는 defcon 2015 예선문제 입니다. 원래 remote환경에서의 문제인데


저는 바이너리 파일을 구해서 제 서버에서 풀었습니다.



flag파일은 제가 만들었습니다.


babycmd를 실행해보면,

4가지의 명령어를 실행시켜준다고 합니다.


ping명령어가 잘 수행됩니다.




dig 명령도 잘 수행 됩니다.



당연히 host 명령도 잘 수행됩니다.


이제 바이너리 파일을 분석하기 위해 ida를 이용해 보겠습니다.


여기서 쓰이는 함수들은 아마 저 명령어들을 실행시켜주는 함수겠죠?


좀 더 자세히 보기 위해 ping일  때 사용되는 함수인 sub_E35를 보겠습니다.




여기가 중요한 부분인 것 같은데요. sub_D65함수가 무엇인지 모르니 보겠습니다.


아 이제 command injection임을 눈치 챌 수 있겠네요.


공백문자, &, |, *,!,:를 막아줍니다.


command injection이 가능한 & |은 막는데  하나 안막는게 있네요.


바로 ` 백틱 입니다.


잘 이용하면 command injection이 가능할 것 같은데요.


sub_D65 함수를 check 로 rename 했습니다.


분석을 더 해보겠습니다.


다시 ping으로 돌아와서



inet_aton함수는 ip주소의 형태인지 아닌지 확인하는 함수인데요.


공격이 불가능 할 것 같습니다. ping 말고 다음 dig를 보겠습니다.



여기서 check함수를 이용해서 검사를 하네요 백틱을 사용할 수 있습니다.


3번째 if에서 인자의 형태가 ip주소의 형태면 명령을 수행합니다.


else문은 해당되지 않을 때 인데요


sub_DCC  이 함수를 한 번 확인 해보겠습니다.



v1에 인자값의 길이+1이 들어갑니다.

if v1-4 가 0x3c(60) <= 이여야 합니다.


따라서 dig함수의 인자의 길이가 63글자 이하여야 하는 것을 알 수 있습니다.


그 다음 if문을 해석하면 인자 값의 첫 번째 글자는 알파벳이거나 숫자 0~9여야 하고


또 그 다음 if문은 인자의 마지막 값이 알파벳이거나 숫자 0~9여야 합니다.


이 함수를 check2로 rename을 하겠습니다.



check2도 무사 통과 했다면 dig ‘%s’ 형태로 명령어를 보냅니다


여기서 알아야 할 것이 있습니다.


저희가 사용할 백 틱보다 싱글 쿼터가 더 우선순위가 있는데요



더블 쿼터는 아니지만


밑에 부분을 보면 싱글 쿼터로 감싸지니 백틱의 능력(?)은 사라지고 문자열로 인식합니다.


따라서 dig에서도 command injection이 불가능합니다,


이제 마지막 host 를 보겠습니다.




dig 와 같이 check 와 check2를 이용해 검사를 한뒤  host \”%s\”로 값을 보냅니다.


아까 사진에서 “더블 쿼터는 command injection에 상관이 없었습니다.


이제 백틱을 이용하고 check2에 있는 내용인 인자의 맨 앞과 맨 뒤를 숫자 또는 알파벳으로 맞추어서 공격을 하면 될 것 같습니다.




sh이 실행되었습니다.


하지만 출력이 되지 않습니다.


찾아보니 stdout이 아닌 stderr로 처리를 한다고 합니다.


하지만 exit를 하면



에러가 나오면서 ls명령과 cat flag 명령이 실행 된 것을 볼 수 있네요.



제가 만든 플래그 이지만


FLAG[BAOBOB_1s_g00dguy!!!]

'pwnable > CTF write-up' 카테고리의 다른 글

[trustealth]easy write-up  (0) 2018.05.13
[CSAW2013] Exploitation-1 write-up  (0) 2018.05.12
[Codegate 2018] betting write-up  (0) 2018.05.12
[Codegate 2017] babypwn write-up  (0) 2018.01.30
[Plaid CTF] ropasaurusrex write-up  (0) 2018.01.29
Comments