ID : level5
Password : what is your name?
힌트 :
/usr/bin/level5 프로그램은 /tmp 디렉토리에 level5.tmp 라는 이름의 임시파일을 생성한다. 이를 이용하여 level6의 권한을 얻어라. |
문제를 풀기 전에 :
노삼혁교수님의 운영체제 수업을 들었던 기억이 난다.
레이스컨디션이라는 용어를 배웠지만 그 당시에는 의미만 겉핥기로 이해했지 명확이 이해하지 못했었다.
레이스 컨디션(race condition)이란?
여러 프로세스가 동일한 자원을 읽고 쓸 때 문제가 발생한다. 만약 하나의 파일이 쓰고 있는 데 다른 프로세스가 읽으려고 한다면? 또는 두 프로세스가 동시에 하나의 파일을 쓰려고 한다면? 문제가 발생할 것이다. 프로세스 스케줄링의 상호배제 원칙에 의하면 하나의 프로세스만 하나의 자원을 이용할 수 있다. 결국 두 프로세스는 돌아가면서 해당 파일을 읽고 쓸 것이다.
이 때의 결과는 실행할 때마다 다르다. 순서가 운영체제의 프로세스스케줄링에 의해 변하게 될 것이기 때문이다.
하드링크(hard link)란?
우리가 아는 윈도우즈의 바로가기와는 다른 개념이다. 파일시스템의 하나의 파일은 어떤 하나의 공간을 점유하고 있다. 하지만 다른 경로에 동일한 파일이 존재하기를 원한다면? 보통 윈도우즈 운영체제에서는 복사 붙여넣기를 수행한다. 하지만 이럴 경우 새로운 파일시스템 공간에 쓰기 작업을 하는 것이므로 저장공간이 낭비될 수 있다. 따라서 리눅스에는 하드링크가 존재한다. 복사하려는 파일의 아이노드의 링크수를 증가시키고 바로가기와 비슷한 파일을 해당경로에 생성한다. 만약 원본 파일을 삭제한다면? 아이노드의 링크수는 1감소할 것이지만 이 파일은 파일시스템내에서 삭제되지 않을 것이다. 이유는? 아이노드의 링크수가 0이 아니기 때문이다. 파일을 연결하는 모든 파일 및 하드링크가 제거되어야만 파일시스템내에서 해당 파일이 완전히 제거 된다. (사실 제거는 아니다. 단순히 아이노드만 제거 된다.)
ln "원본파일경로" "하드링크파일경로" |
심볼릭 링크(symbolic link)란?
윈도우즈의 바로가기 파일과 비슷하다. 원본파일을 제거하면 바로가기 파일은 그대로 남아있다. 하지만 바로가기 파일을 실행하면 실행을 할 수 없을 것이다. 왜냐? 원본파일이 제거되었기 때문이다.
ln -s "원본파일경로" "심볼릭링크파일경로" |
심볼링 링크를 이용한 레이스 컨디션 공격
공격1 : 프로세스가 임시파일을 작성하여 그 파일을 가지고 작업을 수행할 때의 취약점
1) 취약 프로그램이 생성하는 임시파일 이름을 확인한다.
2) 동일한 경로에 임시파일 이름과 동일한 파일을 생성한다.
3) 다른 경로에 임시파일의 심볼릭 링크파일을 생성한다.
4) 2)에서 생성한 파일을 제거한다.
5) 프로세스가 임시파일을 생성할 때 심볼릭링크를 이용해 해당 내용을 변경한다.
6) 프로세스는 변경된 내용을 가지고 작업을 수행할 것이다.
공격2 : 프로세스가 임시파일을 작성하고 지울 때 임시파일의 내용 확인
1) 취약 프로그램이 생성하는 임시파일 이름을 확인한다.
2) 특정한 경로에 임시파일과 동일한 이름을 가진 파일을 생성한다.(굳이 동일할 필요는 없다)
3) 프로세스는 다음과 같은 작업을 한다.
- 임시 파일 존재 유무 확인
- 존재할경우 파일 제거
- 새롭게 임시 파일 생성
4) 3)의 -존재할 경우 파일 제거 시
파일이 삭제된 경로에 2)에서 생성한 파일의 심볼릭링크 파일을 임시파일과 동일한 이름으로 생성한다.
5) 프로세스는 심볼릭링크에 쓰기작업을 수행할 것이다.
풀이 :
위의 내용을 가진 소스를 /home/level5/tmp/attack.c로 작성한다.
vi에 복사 붙여넣기 작업을 하기 위해서 :set paste를 설정해준다.
마우스 우클릭을 이용해 내용을 붙여넣는다.
코드내용은 다음과 같다.
공격하려는 프로세스가 임시파일을 제거하고 새로 생성할 때 그 틈을 노려 다른 파일의 심볼릭링크파일을 임시파일과 동일한 이름으로 저장한다. 따라서 프로세스실행과 심볼릭링크를 번갈아가면서 실행하다보면 언젠간 한번은 틈새를 노릴 수 있을 것이다.
touch level5.tmp |
위의 명령어를 입력하여 임시파일을 생성한다.
생성한 attack 바이너리를 이용해 공격한다.
그리고
cat level5.tmp |
위의 명령어를 사용해 내용을 확인한다.
'리버싱 > FTZ' 카테고리의 다른 글
해커스쿨 FTZ Level7 (이진수 -> 헥사 -> 문자열) (0) | 2015.02.17 |
---|---|
해커스쿨 FTZ Level6 (프로세스 종료 후 쉘 접근) (0) | 2015.02.17 |
해커스쿨 FTZ Level4 (backdoor) (0) | 2015.02.16 |
해커스쿨 FTZ Level3 (명령어를 인자로 전달) (0) | 2015.02.16 |
해커스쿨 FTZ Level2 (vi 취약점) (0) | 2015.02.16 |