본문 바로가기

카테고리 없음

pwnable.tw CVE-2018-1160 Write up

Hitcon 2019 netatalk 문제랑 같은 문제이다.

환경은 ubuntu 18.04.1 환경이다.

 

약간 문제 설명에 이런거까지 세세하게 있으면 좋을거같다.

 

일단 이 취약점은 우리가 원하는곳에 메모리 쓰기가 가능하다.

그럼 어디서 취약점에 발생하는 걸까?

첫번째 취약점은 여기서 memcpy 에서 발생하게 된다. 우리가 조정할 수 있는 값은 dsi->commands, dsi->attn_quantum 이다.  우리가 컨트롤이 가능하니 여기서 취약점이 팍 하고 터지는 것을 알 수 있다.

디버깅 결과 이렇게 포인터를 덮을 수 있다.

 

근데 여기서 오버플로우가 발생하면 도대체 뭘 할수 있을까?

정답을 알아볼려면 dsi 구조체에 뭐가 들어있는지 알아야한다.

여기서 보면 우리는 attn_quantum 값 부터 데이터 쓰는게 가능하다.

즉 밑에 보면 있는 포인터를 덮을 수 있는거다. (포인터 같은 경우는 중요한 곳에 쓰일 수도 있어서 중요하게 보는거다)

 

그럼 이 포인터는 어디에 쓰일까?

이 포인터는 AFP 메시지는 Netatalk의 AFP 기능에 의해 처리되기 전에 명령 포인터에 기록된다. 명령 메모리는 연결이 종료 된 직후와 프로세스가 종료되기 직전까지 존재하지 않습니다.

 

즉 AFP 메시지가 들어오면 commands 포인터 안에 저장하게 되는데 그럼 우리가 원하는 주소로 commands포인터를 덮어버리고 AFP메시지를 보내버리면 어떻게 될것인가?

임외 메모리 쓰기가 가능 할 것이다.

 

근데 문제가 있다. 어떻게 메모리 주소를 알아내야할까?

이거는 부르트포싱이다. 포인터 덮을때 한바이트씩 바꿔주면서 부르트 포싱으로 메모리 주소를 알아 낼 수 있다.

 

그럼 이제 생각을 해보자. 이제 우리는 원하는 곳에 메모리를 쓰는게 가능하다.

근데 어케 익스를 해야 쉘이 따질까?

 

바로 _dl_fini 를 이용하여 쉘 획득이 가능하다.

이 방법은 씨텦에서도 풀 만한 기법으로 나온다.

 

_rtld_global+3840 여기 부분을 덮으면 _dl_fini 에서 이 부분을 실행하게 되는데 인자는 _rtdl_global+2312로 들어간다.

그래서 이런식으로 인자를 줄 수 있으니 setcontext 함수를 호출시켜 우리가 원하는 레지스터로 바꿔주고 ret섞어서 mmap으로 실행 권한 할당해서 익스 시켜주는 문제이다.

 

여기 익스 보면서 공부하였따아

https://github.com/0xddaa/ctf_challenges/blob/master/hitcon2019/netatalk/exp.py