발자취

시스템 보안 03. 리눅스 시스템 보안 본문

3-2/시스템보안

시스템 보안 03. 리눅스 시스템 보안

해린 2023. 10. 4. 20:21

1. 리눅스 시스템 보안

1. 로그인 (Login)

- 사용자 계정과 패스워드를 이용해서 시스템에 액세스함
- Root 사용자: 특권화된 접근 권한
- 일반 사용자: 일반적인 접근 권한
 
 

2. /etc/passwd 파일

- 시스템에 현재 등록되어 있는 계정 정보들의 리스트를 포함
 
 

3. /etc/shadow 파일

- 파일에 있는 계정 정보와 연관된 암호화된 또는 해시된 패스워드들을 포함
 
 

4. /etc/passwd 파일과 /etc/shadow 파일들에 대한 액세스 권한

- /etc/passwd: -rw-r--r--
- /etc/shadow: ----------

 
 

5-1. 액세스 권한

- umask (기본값: 022) 값에 의해 결정됨
- umask는 /etc/bashrc file에서 설정되어 있음
- 최대 파일 액세스 권한: rw-rw-rw (666)
- 최대 디렉토리 액세스 권한: rwxrwxrwx (777)
- 기본 파일 액세스 권한 = 최대 파일 액세스 권한 - umask = 666 - 022 = rw-r--r-- (644)
- 기본 디렉토리 액세스 권한 = 최대 디렉토리 액세스 권한 - umask = 777 -022 = rwxr-xr-x (755)
 
 

5-2. 사용자 ID(UID), 그룹 ID(GID)

- RUID(Real UID), RGID(Real GID): 사용자 계정을 식별하는데 사용됨
- EUID(Effective UID), EGID(Effective GID): 사용자 계정의 액세스 권한을 나타내는데 사용됨

 
즉,
- RUID: static하게 부여된 아이디, 한번 설정되면 변하지 않음
- EUID: dynamic하게 부여된 아이디. 변할 수 있음
 
 

5-3. 액세스 권한 상승

- 실행 파일이 SetUID 비트를 가질 때, 파일이 실행되는 동안, 사용자는 상승된 액세스 권한을 가질 수 있음. (파일 실행이 끝나면 다시 돌아감)
 
- SetUID가 설정된 프로그램: 원래 root가 해야하는 작업을 일반 사용자가 부득이하게 해야하는 경우...
예: 패스워드 수정은 root가 해야하는 작업인데, 다 root가 하면 여러 사용자에게 들어가서 하나하나 바꿔줘야 하니까... 일반 사용자들이 자신의 패스워드를 바꿀 동안은 루트의 권한을 받게 해서 스스로 바꿀 수 있게 해주는 것이다!
즉, 일시적으로 루트 권한을 얻는 것!
 
SetUID: 4000 SetUID가 설정된 파일은 사용자 권한의 x 자리 부분이 's'로 바뀐다 (실제로는 x 권한도 갖고 있는건데 걍 세글자로 표현하려다보니 저렇게 쓰인거임...)예: rwsr-xr-x (4755)
 
 

6. SetUID 비트를 가진 프로그램을 사용해 악용하는 공격

1) SetUID 비트를 가진 /bin/bash를 사용해서 root 권한 획득하려는 시도 (실패)

1. /bin/bash를 ~/bash로 복사2. chmod 4755로 ~/bash에게 SetUID 권한 부여 시도3. id 명령어 입력시 0(guest)가 나와야 하나 실패함


 
실패의 원인
1. SetUID 비트 설정을 root가 해야 함. 일반 사용자가 한다해도 효용이 없음
2. 해당 프로그램의 소유자와 그룹이 둘 다 root가 되어야 함
 
즉, 해당 프로그램의 소유자와 그룹이 root인 프로그램을 root가 SetUID 비트 설정을 해줘야 root 권한을 얻을 수 있다는 말! (이게 SetUID 조건!)
 
그렇다면, 이미 root여야 할 수 있는 공격이라는 것인데.. 왜 공격자가 관심을 갖는걸까?
→ 이미 공격자는 다른 방식으로 root 권한을 얻을 수 있음. 그러나 그 권한은 짧은 기간동안만 사용 가능함.    지속적으로 root 권한을 오랜 기간동안 사용하고 싶어서 이런 공격에 관심을 갖는 것이다
 
 

2) setuid.c를 사용해서 root 권한을 획득하려는 시도 (성공)

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

int main() {
	setuid(0);  //uid와 gid를 루트로 설정
    setgid(0);
    system("/bin/bash");  /system 함수: 함수 안에 들어가는 인자들을 명령어로 인식해서 실행시킴
    exit(1);  //종료
}

setuid.c 코드
 
1. setuid 실행
2. chmod 4755로 권한 부여
3. id 명령어 실행해보면 권한이 0(root)로 바뀐 것 확인 가능 (프롬프트도 root 프롬프트#로 바뀜)
 

 
 

2. 레이스 컨디션 실습

1-1. 하드 링크

- 사용법: ln [원본 파일] [하드링크 파일]
- 하드 링크 후에, 두 개의 파일이 존재함 (원본 파일, 하드 링크 파일)
- 두 개의 파일 중 하나가 삭제되면, 링크의 수는 1만큼 감소함 (파일의 내용은 변하지 않음)
- 원본 파일과 하드링크 파일은 동기화됨

 
 

1-2. 심볼릭 링크

- 사용법: ln -s [원본 파일] [심볼릭 링크 파일]
- 심볼릭 링크 후에, 한 개의 파일이 존재함 (원본 파일)
- 심볼릭 링크는 단지 원본 파일에 대한 링크만을 포함함
- 원본 파일이 사라지면 심볼릭 링크는 가리킬 대상이 사라지므로 아무것도 가리킬 수 없음 (다시 원본 파일과 같은 이름의 파일 생성해주면 다시 가리킴)
 
*장점: 저장공간을 차지하지 않음
 

원본 파일이 삭제된 후에 심볼릭 링크 파일의 내용을 출력하려하면 에러메시지가 뜸.
다시 원본 파일을 복원해주면 링크 연결이 지속됨
 
 

2. 레이스 컨디션 공격

- 동작 중인 프로그램을 대상으로 공격을 수행함
- 성공적인 공격을 위해서, 공격 대상 프로그램은 임시파일을 사용해야 하며, 공격자는 임시파일의 이름을 알고 있어야 함
- lsof 명령어: 하나의 프로세스에 의해 사용되는 파일 리스트를 출력. 이 명령어로 어떤 파일이 임시 파일인지 유추할 수 있음.
 
1. 레이스 컨디션 공격: 일반 프레임 워크에 대한 공격
프로세스 시작 → 임시 파일에 대한 공격 → 임시 파일 열기 → 임시 파일에 대한 작업 수행 → 임시 파일 닫기 → 프로세스 종료
 
2. 레이스 컨디션 공격: 복호화 프로세스에 대한 공격
프로세스 시작 → 임시 파일에 대한 심볼릭 링크 링킹 → 임시 파일 열기 → 암호문을 복호화하고 복호화된 평문을 임시 파일에 저장함 → 임시 파일 닫기 → 프로세스 종료
 
*희생자와 공격자의 경쟁
- 희생자 프로세스는 임시 파일을 여는 시점을 공격자에게 알리고 싶지 않고,
- 공격자는 임시파일이 열리기 전에 심볼릭 링킹 작업을 해서 복호화된 평문을 얻어내고자 함

*심볼릭 링크 링킹을 이용한 레이스 컨디션 공격시 중요한 점!
심볼릭 링크를 만들 때 원본파일과 심볼릭 링크 파일에 각각 어떤 파일이 들어가는지가 중요하다!
ln -s [원본 파일] [심볼릭 링크 파일]
위 명령어에서 ‘원본 파일’에는 공격자가 새로 생성한 파일, 즉 희생자의 파일을 읽어올 빈 파일을 넣어줘야 하고, ‘심볼릭 링크 파일’ 위치에 희생자가 사용하는 프로세스의 ‘임시파일’을 넣어줘야 한다.
그 이유는, 임시 파일은 프로세스 동작이 끝나면 삭제될 가능성이 크기 때문이다. 만약 ‘원본 파일’에 ‘임시파일’을 넣어줬다면 프로그램이 종료된 후, 심볼릭 링크가 가리킬 대상이 사라진다.
공격자는 프로그램이 종료되고 나서도 지속적으로 액세스하고 싶어하기 때문에, 임시파일이 심볼릭 링크 파일이 되어야 한다.
링크를 거는 순간 심볼릭 링크 파일과 원본 파일은 동기화되기 때문에 임시파일의 내용이 빈 파일에 들어와서 내용을 읽어오는데는 문제가 없다!