'Linux'에 해당되는 글 8건

  1. 2013.04.04 Shell codes
  2. 2012.11.24 Return To Library
  3. 2012.11.14 Format String Bug
  4. 2012.09.14 Race condition
2013. 4. 4. 20:49

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

Exploit/System2012. 11. 24. 07:45

Return To Library



이름 그대로 이해하시면 됩니다.

Library로 return 합니다.


ret 값을 덮어씌워 shell code로 떨어지게 하는게 고전적인 시스템 해킹 방법입니다.

해커들이 신명나게 해킹을 하고 다니는데

OS 개발자들이 가만히 보고만 있을리가 없겠지요.


고전적인 방법의 해킹을 할 때

프로그램을 실행하고 shell code를 집어넣습니다.

Parameter로 넘겨주든 환경변수를 쓰든

Shell code는 실행 영역이 아니라 stack에 들어가게 됩니다.


여기서 아이디어를 얻어 OS 개발자들은 DEP를 적용하게 됩니다.


DEP의 개념을 모르시면 다음 글을 읽고 오세요.

 -> 


이제 stack상에 존재하는 shell code는 무의미하게 되었습니다.

그렇다고 해커들이 해킹을 포기할리는 없겠지요.

DEP에 대한 대책으로 나온 해킹 기술이 RTL입니다.


왼쪽의 그림이 shell code를 이용하는 방법이라면

오른쪽의 그림은 library를 이용하는 RTL입니다.


RTL은 shell code를 사용하지 않습니다.

프로그램을 실행할 때 같이 memory에 load 되어있는 library의 함수를 이용합니다.

Library에 있는 함수들은 library 내부의 code 영역에 존재합니다.

Code 영역은 stack과 달리 실행을 위한 code들이 저장되어 있습니다.

한마디로 DEP에 걸리지 않습니다.

그러므로 library의 함수를 이용해 공격을 하면 됩니다.


RTL 공격에 쓰이는 대표적인 함수로는 system()이 있습니다.

system() 함수를 이용해 RTL 공격을 시도해 보겠습니다.

공격대상이 되는 데몬의 코드는 다음과 같습니다.

입력받은 string을 출력하고 종료합니다.

BOF 취약점도 보이고 FSB 취약점도 보입니다.


해당 데몬은 bugbear라는 유저의 setuid가 걸려있습니다.


gdb로 attackme를 열어봅니다.

권한 문제로 debugging이 불가능하니 코드를 이용해 새로 컴파일한 후 debugging 합니다.

Stack을 0x80(128)만큼 확보합니다.


이제 return 할 system()의 주소를 찾습니다.

system()의 주소는 0x40058ae0입니다.

system()은 libc.so.6 library에 속해 있습니다.

libc.so.6에서 system()의 위치를 찾아보겠습니다.


gdb로 libc.so.6을 열어봅니다.

libc.so.6에서 system()의 위치는 0x00040ae0입니다.


이제 system()에서 참조할 "/bin/sh" string을 찾아보겠습니다.
"/bin/sh"는 system()에서 참조만 하므로 .rodata 영역에 존재합니다.

libc.so.6의 ELF 구조를 살펴보겠습니다.

ELF 구조에 대해 모르시면 다음 글을 읽고 오세요.
 -> 

.rodata section은 0x000e09e0부터 시작됩니다.


이제 attackme 프로그램에서의 "/bin/sh" string의 주소를 구해야 합니다.

attackme에서의 system() 주소에서

libc.so.6에서의 system() 주소를 빼줍니다.

그리고 libc.so.6에서의 .rodata section의 주소를 더하면

attackme process 상에서 mapping 되어있는 libc.so.6의 .rodata section 주소가 나옵니다.


0x40058ae0 - 0x40ae0 + e09e0 = 0x400f89e0

attackme에서 libc.so.6의 .rodata section 주소는 0x400f89e0입니다.


해당 주소부터 string을 검색해봅니다.

0x400fbff9에서 "/bin/sh"을 찾았습니다.

"/bin/sh"를 찾는 개념적인 방법을 설명하느라 위와같이 힘든 작업을 했지만

"/bin/sh"를 찾는 프로그램을 작성해서 돌려버리는게 훨씬 편합니다.


공격 코드는 BOF를 통해 ret를 system() 주소로 바꾸고

system에서 사용할 "/bin/sh"를 parameter로 쓰도록 넘겨주면 됩니다.


이제 공격해봅니다.



공격에 성공했습니다.


'Exploit > System' 카테고리의 다른 글

Format String Bug  (0) 2012.11.14
Race condition  (0) 2012.09.14
Posted by slimV
Exploit/System2012. 11. 14. 13:59

Format String Bug



printf("Hello World!");

다들 익숙하다 못해 반가우실겁니다.

printf는 c 언어를 배울때 가장 먼저 사용하게 되는 함수일거라 믿어 의심치 않습니다.


printf를 사용하는 모습을 먼저 살펴보도록 하겠습니다.


위의 실행 코드에서 "print int : %d"가 format string 입니다.

Format string은 이름 그대로 출력하려는 string의 format을 지정해줍니다.


위와 같은 코드도 사용하시는 분이 더러 있습니다.

짧고 좋습니다.

당연히 정상적으로 실행이 됩니다.

하지만 악의적인 목적을 가진 사용자에게는 허점을 제공해 준 셈이 됩니다.


printf 함수는 printf(a)에서 a를 format string으로 인식하게 됩니다.

a에 %d같은 형식 지시자가 들어있으면 형식 지시자 수만큼 stack에서 값들이 출력됩니다.


어차피 출력만 되는거면 별 문제없는게 아니냐 생각하시겠지만

%n이라는 다소 생소한 형식 지시자가 있습니다.

%n은 자신이 사용되기 전까지 출력된 문자 개수가 %n이 가리키고 있는 주소에 저장이 됩니다.

원하는 주소에 저장이 가능하다는건

프로그램의 흐름을 바꿀 수 있다는 뜻입니다.


기본적인 Format String Bug 공격을 시도해 보겠습니다.

공격 대상이 되는 데몬의 코드는 다음과 같습니다.

입력받은 string을 출력하고 종료합니다.

BOF 취약점도 보입니다.


해당 데몬은 bugbear라는 유저의 setuid가 걸려있습니다.


gdb로 attackme를 열어봅니다.

권한 문제로 debugging이 불가능하니 코드를 이용해 새로 컴파일한 후 debugging 합니다.


a에 접근하는 printf 주변을 찾아봅니다.

0xbffffa64부터 a가 시작됩니다.


이제 ret의 주소를 찾아보겠습니다.

함수가 끝날 때의 esp를 보면됩니다.


ret의 주소는 0xbffffaec입니다.


이제 format string과 stack에서 추출할 영역의 거리가 어느정도인지 알아봐야합니다.

바로 붙어있는 것을 확인할 수 있습니다.


마지막으로 한가지가 남아있습니다.

%n으로 ret의 값을 바꾸기엔 ret의 값이 너무 큽니다.

그러므로 반씩 잘라서 저장을 해줘야됩니다.


shell code의 시작 주소는 대충 nop slide 중간인 0xbffffa78쯤이 되겠습니다.


이제 공격 코드를 만들도록 하겠습니다.


먼저 형식 지시자가 나오기 전까지의 크기를 정하겠습니다.

%c를 통해 출력할 AAAA

%n을 통해 저장할 ret 주소 1

%c를 통해 출력할 BBBB

%n을 통해 저장할 ret 주소 2

Shell code와 nop slide까지 해서 총 50-byte로 만들겠습니다.


ret 주소 1에 저장할 값은 0xfa78입니다.

0xfa78은 64120입니다.

앞서 출력될 크기인 50을 빼면 64070이 됩니다.


ret 주소 2에 저장할 값은 0xbfff입니다.

0xbfff에서 앞서 출력된 수를 빼면 overflow가 발생합니다.

앞에 1을 붙여주고 계산하도록 합니다.

0x1bfff는 114687입니다.

앞서 출력될 크기를 빼면 50567입니다.


공격 코드

AAAA

0xbffffaec

(ret 1)

BBBB

0xbffffaee

(ret 2)

Nop slide + Shell code

(34-byte)

%64070c

(0xfa78 - 50)

%n

(ret 1)

%50567c

(0x1bfff - 0xfa78)

%n

(ret 2)


공격해봅니다.



공격에 성공했습니다.


'Exploit > System' 카테고리의 다른 글

Return To Library  (0) 2012.11.24
Race condition  (0) 2012.09.14
Posted by slimV
Exploit/System2012. 9. 14. 22:10

Race condition



OS Concept에서 Race condition이란 두 프로세스간에 리소스를 사용하기 위해 다투는 과정을 말합니다.


하지만 해킹 기법으로 Race condition을 말 할 때에는

setuid를 가진 취약한 데몬과 공격자의 exploit이 서로 경쟁하는 상태를 말합니다.


Race condition에 취약한 데몬의 조건은 다음과 같습니다.

- setuid 포함

- 임시파일 생성

- 임시파일의 이름을 공격자가 알아야 함

- Race condition에 대한 대처 미비


기본적인 Race condition을 시도해 보겠습니다.

crack이라는 임시 파일을 생성하는 데몬을 Race condition을 통해 exploit을 시도해 보겠습니다.

해당 데몬은 root 권한으로 setuid가 걸려있습니다.


데몬이 생성하는 임시파일에

사용자의 id와 password를 저장하고 있는 /etc/passwd을

반복적으로 링크를 거는 프로그램을 만듭니다.


Link의 개념을 모르시면 다음 글을 읽고 오세요.

 -> http://slimv.tistory.com/entry/SymbolicHard-link


데몬을 반복적으로 실행하는 프로그램을 만듭니다.

/etc/passwd에 맞게 id와 권한을 써 넣도록 합니다.


이제 두 프로그램을 동시에 실행합니다.


/etc/passwd를 열어보면 공격자가 입력한 id 정보가 등록되어 있습니다.


등록한 id로 접속이 가능합니다.

설정한 대로 root 권한을 가지고 있습니다.


공격에 성공했습니다.


'Exploit > System' 카테고리의 다른 글

Return To Library  (0) 2012.11.24
Format String Bug  (0) 2012.11.14
Posted by slimV