보안/시스템 보안

[시스템 보안] 리눅스 레이스 컨디션 실습 (02. 레이스 컨디션 수행)

gaan 2023. 4. 13. 18:34

02. 레이스 컨디션 수행

01. 심볼릭 링크 기능 내용에 이어서 레이스 컨디션 실습을 해보도록 할 것이다.
 
symlink.txt 파일을 생성해놓고, link.txt 파일이 삭제되었다가 다시 생성되어도 -> 그대로 원본파일에 영향을 끼칠 수 있다는 점을 이용
그 과정에서 레이스 컨디션이 발생하는 케이스(그 사이에 symlink.txt 파일을 수정하거나 등등 .. 일종의 해킹에 해당되는 행동을 할 수 있음)

1) tempbug.c

tempbug.c : 파일명과 파일 내용의 두 인수를 주면, 해당 내용을 파일에 쓰는 역할

 
🖥️ 코드를 짜기 전에, 편의를 위해 vimrc 파일을 아래와 같이 편집하도록 하자.

➡️ tap space = 4
➡️ autoindent : 자동들여쓰기
 
 
🖥️ vim 에디터로 tempbug.c 파일에 아래와 같이 코드를 작성해보자.

argc(arguments count) : 명령행 옵션의 개수가 저장되는 곳
argv(arguments vector) : 명령행 옵션의 문자열들이 실제로 저장되는 배열 -> string 타입의 포인터 변수를 가짐
 
🖥️ 예를 통해 살펴보자.

➡️ argc 에는 3이 저장되어 있다.
➡️ argv[0] 에는 chmod, argv[1] 에는 777, argv[2] 에는 filename 이 저장되어 있다는 것이다.
 
그럼 다시 tempbug.c 파일의 코드를 분석해보자.
 
첫번째 if 문
argc != 3 이면, 즉 arguments count가 3이 아니라면,
밑의 메시지를 출력하고 종료한다.
argv[0] : 이 프로그램을 실행할 때의 이름 -> tempbug 라는 string이 들어있음
 
sleep() 함수
매개변수에 주어진 시간동안 (위의 코드에서는 20초) 프로그램이 아무것도 동작하지 않고 멈춰있게 함
 
두 번째 if 문
fopen 으로 argv[1] 에 해당하는 파일을 연다.
만약 fopen 메서드가 제대로 동작하지 않는다면, "Can't open" 메시지 출력하고 종료.
만약 잘 열어서 파일 포인트를 획득했다면, 두번째 argument vector로 주어진 값을 이 파일에 쓴다.
파일포인터 닫음
표준입출력으로 "Write Ok" 출력하고 종료.
 
※ fopen 함수의 동작
fopen 함수를 호출해서 파일을 연다.
파일이 없으면 -> 파일을 생성해서 거기에 write
파일이 있으면 -> 파일을 열어서 써줌
 
⭐ 20초라는 시간동안 fopen으로 열어야 하는 파일을 symlink.txt 파일로 바꿔버리면
symlink.txt 파일에 연결되어 있는 원본 파일을 수정하는 듯한 효과를 가질 수 있다.
그러한 효과를 누리기 위한 공격을 시도해볼 것이다.


2) 공격 대상 파일 생성하기

🖥️ /etc/shadow 파일에 대해 공격 수행 전, 파일을 백업해주자.

 
🖥️ tempbug.c 파일을 컴파일 해주자. -> 바이너리가 생성될 것이다.

 
🖥️ SETUID 를 set 해주자. (for 권한상승)
➡️ 실행되는 동안 파일 소유자의 권한으로 실행되도록 해주기 위해.

➡️ tempbug 파일의 SETUID 비트가 set 됨.


3) 공격 대상 파일 실행하기

 
이전에 진행했던 권한 상승 실습처럼
일반사용자의 권한으로 이 프로그램을 실행시켜놓고, 그 사이에 심볼릭 링크 파일을 만들어서 이상행동을 해볼 것이다.
 
🖥️ 먼저, switch user로 계정을 전환해야 함 ➡️ exit 커맨드로 root 권한으로 돌아올 수 있음
❓ 왜냐? 이 공격을 수행하고 난 후에는, shadow 파일이 바뀌기 때문에 sudo 커맨드를 못씀 -> shadow 파일을 copy 못함

 
🖥️ temp 파일을 생성해주고,
방금 컴파일 한, tempbug 파일을 다음과 같이 실행해주자.

※ & 는 이 프로그램을 백그라운드로 실행시키겠다는 의미!
➡️ tempbug 라는 파일은 temp 파일에 "root ... " 스트링을 써주는 프로그램이다.
 
🖥️ temp 파일을 확인해보자.

➡️ 스트링이 잘 써져있는 것을 확인할 수 있다.


4) 파일 바꿔치기

🖥️ 공격 대상 파일을 백그라운드로 실행해놓고,
20초 이내에 파일 바꿔치는 코드를 아래와 같이 작성해보자.

이 공격의 순서를 나타내면 다음과 같다. 
 
➡️ 1. tempbug 프로그램을 백그라운드로 실행시켜놓고
➡️ 2. rm temp : 먼저 생성했던 temp 파일 삭제
➡️ 3. ln -s /etc/shadow ./temp : /etc/shadow 에 해당되는 심볼릭 링크 파일을 temp라는 이름으로 만들어줌
 
⭐ 이 공격의 핵심⭐
setuid 가 set 되어있는 프로그램이므로, 이 프로그램이 실행되는 동안 root 권한으로 실행되고 있다.
-> symlink 파일을 root 권한이 필요한 파일로 만들어줬을 때, 이 바이너리가 root 권한으로 실행되고 있기 때문에,
새로 만든 temp 파일에 write 되는 것이 이 파일과 심볼릭 링크로 연결되어 있는 원본 파일에 영향을 끼칠 수 있다.


5) 공격 결과 확인

🖥️ exit 커맨드로 root 계정으로 돌아온 후,
/etc/shadow 파일을 확인해보도록 하자.

➡️ temp 파일에 입력되었어야 할 내용이 /etc/shadow 파일에 입력된 것을 확인할 수 있다.


6) 시스템 정상 상태로 복구

🖥️ 공격 뒤에는 /etc/shadow 파일을 복구해주도록 하자.