Security_lab

레이스 컨디션 실습

부산대보금자리 2021. 7. 25. 21:14

레이션 컨디션은 관리자 권한으로 실행되는 프로그램 중간에 끼어들어 자신이 원하는 작업을 하는 것이다. 

물론 타이밍이 가장 중요하며, 타이밍을 맞추는 것이 쉽지는 않지만, 그렇다고 특별한 기술이 필요한 것도 아니다. 

 

레이스 컨디션 공격과 관련되어 미리 알아두어야 할 내용을 보자.

 

* 파일 링크 

1) 하드 링크

하드 링크는 간단히 설명하면 똑같이 복사된 파일을 만드는 것이다. 

실제 하드 링크를 생성하여 살펴보자

link.txt의 링크의 수가 2가 되었다. 링크가 아니었다면 1일 것이다. 

이렇게 하드 링크된 파일을 수정하면 원래 파일인 a.txt도 같이 수정된다. 

또 두 파일중 하나를 삭제하면 파일 내용은 바뀌지 않고 링크 숫자만 하나 줄어든다.

즉 데이터의 동기화가 일어난다고 보면 된다. 

하드 링크에는 제약점이 하나 있는데, 링크하고자 하는 파일이 다른 파티션에 있으면 안 된다는 것이다.

 

2) 심볼릭 링크

특정 파일에서 심볼릭 링크 파일을 만들어 원본 파일과 심볼릭 링크 파일 간의 관계를 이해해보자

현재 원본파일과 심볼릭 링크 파일은 둘 다 root 권한이다. 

하나 봐야할것은 링크의 수가 늘어나지 않고 그대로 1로 있다는 것이다.

이제는 원본파일의 소유를 일반 계정으로 바꾸어 보겠다.

이 상태에서 symlink를 수정한다면 원본 파일을 수정할 수가 있다. 

반대로 원본을 root, symlink를 일반 계정 권한이라면 어떻게 될까? 

이때는 관리자 계정인 root의 소유인 원본파일을 변경할 수 없다.

 

마지막으로 원본 파일을 삭제한다면 심볼릭 링크는 어떻게 될까? 

다음과 같이 파일이 없다라는 메시지가 출력된다.

 

그렇다면 이 상태에서 다시 b.txt를 만들어준다면 

이런 식으로 링크가 유지된다. 즉 원본 파일을 삭제해도 원본 파일의 이름과 위치를 기억하여 계속 그 파일을 바라보는 상태로 남는다.

 

* 심볼릭 링크와 레이스 컨디션 

리눅스에서 레이스 컨디션 공격의 대상은 소유자가 root이고, setUID 비트를 가지며 임시파일을 생성하는 파일이다.

정상적인 상황은 프로그램 실행(유저) -> 임시파일 생성(관리자) -> 프로그램 동작 및 임시파일 처리(관리자)-> 종료

이다.

추가로 알아야 할것은 생성되는 임시 파일의 이름을 알아야 한다.

리눅스에는 lsof명령어가 있다. lsof는 특정 파일에 접근하는 프로세스 목록을 확인할 수 있으며, 특정 프로세스가 사용하는 파일 목록을 뽑을 수도 있다.

예를 들어 시스템에서 동작하는 bash셸이 사용하는 파일 목록을 알고 싶다고 하면 ps -ef로 bash 셸의 프로세스 ID를 확인한다.

그리고 lsof 로 프로세스가 사용하는 파일 목록을 확인한다.

생성하는 임시 파일을 확인하고, 프로그램을 실행하기 전에 이 생성된 임시 파일의 이름으로 심볼릭 링크 파일을 생성할 수 있다.

 

임시파일을 생성하는 프로그램은 임시 파일을 생성하기 전에 임시 파일의 존재 여부를 확인한다.

그리하여 파일이 존재하면 이 파일을 지우고 재생성하는 것이다. 즉, 다음 프로세스를 프로그램 로직에 넣는 것이다. 

 

1. 임시 파일 존재 여부를 확인한다.

2. 임시 파일이 있다면 삭제하고 재생성한다. 

3. 임시 파일에 접근하고 처리한다. 

 

이때부터 레이스 컨디션이 발생하는데, 레이스 컨디션 공격 코드는 다음 작업을 반복적으로 수행한다.

1. 임시 파일이 존재하면 심볼릭 링크 파일인지 여부를 확인한다. 

2. 심볼릭 링크가 아니면 임시파일을 삭제한다. 

3. 임시파일을 심볼릭 링크로 생성한다.

 

레이스 컨디션 공격이 성공했을 때는 밑의 상황과 같이 정상적인 프로세스와 레이스 컨디션 공격의 프로세스가 임시 파일에서 각각 자신의 작업을 처리한 경우이다. 

정상 - 1. 임시 파일 존재 여부를 확인한다.

정상 - 2. 임시 파일이 이미 존재하면 삭제하고 재생성한다.

공격 - 3. 임시 파일이 존재하면 심볼릭 링크 파일인지 확인한다.

 

공격 - 1. 심볼릭 링크가 아니면 임시 파일을 재생성한다. 

공격 - 2. 임시 파일을 심볼릭 링크로 생성한다.

정상 - 3. 임시 파일에 접근하고 처리한다. 

 

* 실습

 

1. 공격대상 파일 생성하기

우선 /etc/shadow 파일에 공격을 수행하기 전에 먼저 이 파일을 다음과 같이 백업해두자

 

그리고 tempbug를 컴파일 후 setuid권한을 준다.

2. 공격대상 파일 실행하기

이제 일반 계정으로 전환하여 temp 파일을 만들고, 이 파일에 'root::12519:0:99999:7:::'을 쓰도록 백그라운드로 실행한다

3. 파일 바꿔 치기

먼저 생성했던 temp파일을 삭제하고 /etc/shadow 파일에 대한 심볼릭 링크 파일을 tempbug가 

접근하고자 하는 temp파일로 바꿔치기한다.

 

4. 공격 결과 확인

temp파일에 입력해야 할 내용이 /etc/shadow파일에 입력된 것을 확인할 수 있다.

5. 복구

재빨리 백업 파일로 복원한다.

 

실제로 공격을 한다면 이렇게 20초 동안 기다려줄 리가 없다. 

따라서 있는 파일을 삭제하고 링크를 거는 과정을 계속 반복하도록 백 그라운드에서 실행해야 한다.

 

이러한 방법 외에도 암호화된 파일을 복호화시켜서 임시 파일을 생성하는 경우 그 데이터를 보기 위한 공격도 가해질 수가 있다.

'Security_lab' 카테고리의 다른 글

gdb를 통한 heap buffer overflow  (0) 2021.07.27
gdb를 통한 Stack buffer overflow  (0) 2021.07.27
John the ripper,johnny 와 Hash  (0) 2021.07.23
SetUID  (0) 2021.07.21
shell code & assembly analysis  (0) 2021.07.20