본문 바로가기

🔐 Security/System

[시스템보안] RTL 공격, DEP 우회, ASLR 우회

위 글은 2022년도 목포대학교 학점교류 '시스템보안' 수업에서 수행한 과제를 작성한 내용입니다.
교재 : 시스템 해킹과 보안: 정보 보안 개론과 실습 3판, 양대일 (2018)

 

1. RTL 공격 수행하기

1) bugfile.c 컴파일하기

bugfile.c를 컴파일 후 SetUID를 부여한다.

 

2) ret 주소 확인하기

bugfile.c 파일의 ret 주소가 buffer에서 16바이트 위에 있음을 알 수 있다.

 

3) system 함수 주소 확인하기

gdb에서 libc 영역에 존재하는 system 함수의 주소를 확인한다.
system 함수의 주소는 0x4005aae0이다.

 

4) exit 함수 주소 확인하기

마찬가지로 exit 함수 주소를 확인한다. exit 함수 주소는 0x4003b1e0이다.

 

5) “/bin/sh” 주소 확인하기

findsh.c 코드 작성

메모리에서 system 함수의 시작 주소부터 “/bin/sh” 문자열을 찾는 프로그램을 작성한다.

확인된 주소는 0x400fdff9이다.

 

6) rtl 공격 수행하기

system 함수는 4바이트 거리에 있는 값을 인수로 인식하므로 system(“/bin/sh”)처럼 실행한 다. 종료 후에 exit 함수를 실행하고, 일반계정으로 전환 후 공격 코드를 넣어 확인해보면 관 리자 셸을 획득하였음을 알 수 있다.

 

2. 실습 RTL (DEP 우회)

ASLR 해제 전

ASLR 해제 후

user 계정으로 ASRL을 해제 시도를 하면 권한이 없어 해제되지 않으므로 root 계정으로 전 환 후 aslr을 해제한다.

 

1) bof 컴파일하기

bof.c 파일을 컴파일한 후, SetUID를 부여한다.

stack smashing 기법이 적용되므로 스택 가드를 풀기 위해 컴파일 옵션에 해제 명령어를 덧 붙여서 작성해준다. 이때 버퍼의 크기는 40이다.

 

2) ret 주소 확인하기

bof.c 파일의 ret 주소는 버퍼 크기가 40이기 때문에 44바이트 상위에 위치함을 알 수 있다.

 

3) system 함수 인자 삽입

system() 인자로 넣을 내용의 주소를 확인하기 위해 env 함수를 작성하여 환경변수를 확인한다.

“/bin/sh” 문자열 위치는 0xb7f6184f이다.

./env aa가 permission denied 상태가 되었는데 원인을 찾지 못해서 findsh.c 파일로 주소 를 확인했다. 이 때문에 이후 env 함수를 사용하는 실습을 진행하지 못했다.

 

4) system, exit 함수 주소 확인하기

bof.c를 gdb로 확인하여 각 함수 주소를 확인한다.

system() 함수 주소 : 0xb7e3d060
exit() 함수 주소 : 0xb7e30af0

 

5) 공격 시도 및 공격 결과

RET를 조작하여 버퍼 크기(40) + EBP(4) + RET에 system 함수 주소를 삽입한다.
system 함수 인자를 삽입할 때 exit 함수 주소와 “/bin/sh” 문자열 주소도 함께 삽입한다.

이러면 system(“/bin/sh”)만 실행되는데, root권한으로 실행되지 않아서 setuid(0)을 추가하 는 과정이 필요하다.

 

6) 셸 실행 프로그램 작성

root 계정으로 sh.c 프로그램을 작성한다. 이후 권한을 4755로 변경해준다.

 

7) execl 함수 주소 확인

execl 함수의 주소는 0xb73b49d0이다.

 

8) 공격 시도

env함수의 문제가 생겨 함수를 사용한 공격 결과 확인에 실패했다.

정상적으로 작동했을 시, system 함수는 execl 함수 주소가 되고 exit 함수 주소는 변경되지 않는다. “/bin/sh”문자열 주소는 컴파일 했던 sh 파일 경로의 문자열 주소가 된다.
위와 같이 export로 bb에 경로를 삽입하여 env 함수를 확인하면 sh 파일 경로가 저장된 주 소가 나온다.

따라서 ./bof “`perl –e ‘print ”A“x44,”execl 함수주소, exit 함수주소, sh 파일 경로가 저장 된 주소“ 를 입력하여 id를 확인하면 uid가 0, 즉 root 권한으로 변경됨을 확인할 수 있다.

 

3. ASLR 우회

1) 실행 가능한 데이터 영역 확인

0x08048000-0x08050000 영역은 읽기와 실행이 가능하다.

ASLR우회로 할 수 있는 공격원리는 root셸을 획득하여 sh파일 경로를 획득한다. RTL 공격 처럼 환경변수에 삽입하면 ASLR에 의해 주소가 변경된다.

즉 실행 가능한 데이터 영역에 항상 있을만한 기계어를 파일명으로 사용해 sh 파일 경로에 링크시키게 되면 sh파일이 실행되게 된다.

 

2) 링크 설정

특정 기계어 (0x01)를 sh파일 경로에 심볼릭 링크를 설정한다.

 

3) 기계어 주소 확인

실행가능한 영역에서 특정 기계어(0x01) 주소를 확인한다.
사용가능한 0x01 값을 보면 0x01뒤에 00이 연결되어 있다.
0x01 0x00의 주소는 0x08048014부터 2바이트에 위치하여 있다.

 

4) execl 주소를 확인

execl 주소를 확인해보면 0xb7eb49d0이다.

 

5) 공격시도

RET를 조작한다. 버퍼크기(40) + ebp(4) + execl 함수 주소를 삽입한다.

마찬가지로 bof 파일에 이상이 있었는데, 원인을 찾지 못해서 uid의 권한이 user에서 root로 변하지 않아 공격이 실패했다.