해킹/시스템해킹

[시스템해킹 도전기 9편] RTL(2)

놀고싶다~ 2021. 2. 12. 10:00

안녕하세요!

 

오늘은 지난 시간에 이어서 RTL 공격에 대해 알아보고자 합니다.

 

오늘은 일반 사용자가 쉘을 획득하고 root 권한까지 획득하는 방법을 알아 볼 수 있도록 하겠습니다.

 

먼저 권한을 획득할 수 있는 C파일을 만들겠습니다.

 

 

일반 사용자가 sh 파일을 만드는 이유RTL 공격시 execl의 인자로 사용할 /tmp/sh 문자열을 환경 변수에 넣어 주기 때문에 위 파일을 만들었습니다.

 

execl 함수는 처음 인자 경로에 있는 파일을 실행하는 함수입니다.

 

함수의 원형 : int execl(char const *path, char const *arg0, ...);

사용 예시 : execl(“/bin/sh”,“argv”,NULL)

 

execl의 주소를 확인하고 tmp/sh파일을 실행 시킬 수 있는 방법을 진행 해보겠습니다.

 

execl의 주소는 0x420acaa0입니다.

 

그리고 /tmp/sh를 실행시킬 수 있는 환경변수를 설정 해주었습니다.

 

그리고 먼저 쉘을 실행 시키기 위한 코드를 살펴보기 이전에 gdb를 통해서 어떻게 값이 저장되는지를 알아보겠습니다.

 

 

Ax60는 거리를 나타내기 위해서 표현하였습니다.

BBBBexecl의 주소를 나타내기위해서 표현하였습니다.

CCCCexecl로 생기게 되는 ret(더미값)이 되겠습니다.

DDDD/tmp/sh를 넣는 자리인데 3번을 넣게 됩니다. 이유는 execl의 값 특성상 마지막 값이 NULL값이 들어가야 합니다.

 

처음 DDDDx2를 하였을 때에는 값이 남아 있는 것을 보았습니다.

 

하지만 DDDDx3을 주게되었을 때 뒤에 NULL값이 나오게 되는 것을 볼 수 있었습니다.

 

따라서 3번을 넣어줌으로 인해 NULL값이 들어가는 것을 봄으로써 제대로 동작하는 것을 볼 수 있습니다.

 

이제 완성된 코드를 넣고 실행 해보겠습니다.

 

./bof `perl -e 'print "A"x60,"\xc0\xf2\x03\x42","AAAA","\x03\xff\xff\xbf"'`

 

완성된 코드로 실행하여 다음과 같은 결과를 획득할 수 있습니다.

 

결과는 쉘을 획득하고 root 권한을 획득하였습니다.

 

하지만 여기서 한가지 문제점이 발생합니다.

 

RTL 공격시에 ASLR 보호 기법으로 환경변수 주소도 스택이므로 인자를 환경변수로 인자를 구성할 수 없으므로 문제가 생기게 됩니다.

 

따라서 다음시간에는 RTL 우회기법을 통해서 알아볼 수 있도록 하겠습니다.