본문 바로가기

WARGAME/exploit-exercise

[exploit-exercise] fusion level03

보호기법은 ASLR과 NX-bit가 걸려 있습니다.


level03 문제 같은 경우는 입력 값에 대한 필터링이 몇 개 존재하고, 특이한 점은 클라이언트에게 입력 받자마자 소켓을 닫아버립니다. 따라서, exploit은 최초 한 번 입력 후 서버가 다시 reverse bind 하는 방법으로 작성하였습니다.


bof가 발생하는 부분은 decode_string() 함수입니다. 


decode_string() 함수의 경우 전체적인 동작은 memcpy(src, dest, size) 와 비슷한데, size를 체크하는 부분에서 '<', '>' 와 같이 비교해야하는데, 단순히 != 로 비교하기 때문입니다. 




그래서, 이 부분만 넘어가게 되면 while문에서 조건을 검사할 때 dest != end 부분은 계속 참을 가지게 되고, src변수가 끝날 때 까지 계속 dest 변수에 복사를 하게 됩니다.


그리고 while문 안을 보면 아래 소스와 같이 '\\u' 인 경우 dest를 두 번 증가시켜주는 부분을 볼 수 있습니다.

따라서, 초기에 src에 A를 127개 넣고 그다음에 \\u를 넣으면 dest++; dest++; 하게되어 dest>end인 경우가 되어버리게 됩니다. 이러면 dest != end는 무조건 참이 됩니다.




validate_request() 함수에서는 클라이언트에서 입력받은 값을 token을 키로하여 sha1 해쉬 알고리즘으로 HMAC연산을 하게 됩니다. 여기서 그 해쉬화된 20바이트의 결과 값에 result[0] 바이트와 result[1] 바이트의 or 연산 값이 0이 나와야 checksum 검증을 통과할 수 있습니다.

이 함수의 경우엔 단순히 해쉬 알고리즘의 충돌쌍을 구한다고 하지만 따지고 보면 두 바이트만 0에 맞게 맞춰주면 되기 때문에 공격 페이로드를 기준으로 랜덤 값을 추가하여 조건에 맞을 때 까지 브루트포싱 하였습니다.


그래서 아래와 같은 exploit 코드를 작성하였습니다. (실패한 exploit)



위 exploit 코드는 가젯을 이용해서 rand() 함수를 got overwrite 하여 mprotect() 함수로 바꿔주고 이를 이용해 쉘코드를 실행시키는 코드인데, 결과적으론 실패하였습니다.

이유는 parse_request() 함수의 json_tokener_parse() 함수에서 인자로 들어간 스트링에 NULL 바이트가 포함되면 파싱에 실패하기 때문입니다.

그리고 위 exploit 코드에서는 bss 영역에 g_Title에 입력한 메모리를 복사해주고 해당 부분으로 점프하도록 되어 있는데, g_Title은 포인터값으로 해당 부분에는 입력 값이 아니라 할당된 힙 주소가 적혀있으므로 이 부분도 틀렸습니다.

따라서, 새로운 exploit 코드는 NULL byte가 없는 공격 페이로드를 작성하고 system() 함수를 이용하여 nc를 실행해 reverse bind 하도록 작성하였습니다. 그리고, fake ebp를 통해 bss 영역에 있는 gContents 포인터 변수에 저장된 주소를 system() 함수의 인자로 들어가게 하여 1차 익스플로잇에서 실패한 부분을 모두 수정하였습니다.


% *malloc_got -> system_libc

add [ebx + 0x5d5b04c4], eax ; ret 와 같은 형식의 가젯을 이용해 got overwrite 할 때, 만약 변경 대상이 되는 함수 (malloc)의 libc 주소가 변경 하려는 함수(system) 의 libc 보다 커야 eax 레지스터에 NULL바이트가 아닌 값을 넣을 수 있게됩니다.




위 문제를 풀면서 참고했던 사이트들 주소


https://pen-testing.sans.org/blog/2013/05/06/netcat-without-e-no-problem

 - nc(netcat)을 이용한 backdoor (nc에서 -e 옵션이 없을 때)


http://egloos.zum.com/improf/v/2916457

  - openssl의 HMAC함수의 인자 설명


http://bujakim.blogspot.kr/2014/09/linux-c-c-json-json-c_3.html

  - c언어에서의 json 형식


http://imgproxy.dahlia.kr/

  - python에서의 hmac 사용




'WARGAME > exploit-exercise' 카테고리의 다른 글

[exploit-exercise] fusion level02  (0) 2015.12.22
[exploit-exercise] fusion level01  (0) 2015.12.22
[exploit-exercise] fusion level00  (0) 2015.12.22