티스토리 뷰

레이스 컨디션 취약점이 존재하기 위한 최소한의 조건

- 다른 계정의 권한에 접근해야 하므로 SUID가 걸려 있어야 한다.

- 임시 파일을 생성해야 한다.

- 공격자가 임시로 생성되는 파일명을 정확하게 알아야 한다.


레이스 컨디션 환경

- 임시 파일의 생성을 시도

- 임시 파일이 생성되면 내용을 쓰고 바로 파일을 삭제(공격자 입장에서는 임시 파일에 내용을 쓰고 삭제하는 순간이 너무 짧은 것이 문제)

- 임시 파일의 생성에 실패하면 프로그램을 종료

요약해보자면

1. 파일 생성

2. 파일 생성에 성공하면 생성된 파일에 내용 쓰기

3. 쓴 내용을 읽어들여 처리/사용

4. 파일 삭제

* 구체적으로는 2번과 4번 사이에 취약점이 존재하게 된다. 위의 실행 흐름에서 2번과 4번 사이에 공격할 수 있는 틈이 있긴 하지만 너무 짧은 시간 간격이라서 결국 공격용 프로그램을 작성해야 한다. 즉, 취약한 프로세스가 파일을 생성하기 전에 공격하는 프로세스에서 먼저 파일을 생성하고, 취약한 프로세스에서 생성할 파일명으로 링크를 만들어 두면 취약한 프로세스는 공격 프로세스가 만든 링크에 내용을 쓰게 되고 링크를 삭제하게 된다.


hint를 보면 /tmp/level5.tmp라는 임시 파일이 만들어진다는 언급이 있다. 그러므로 공격 프로세스에서 suspect..txt와 같은 임의의 파일을 만들고, 이 파일을 "/tmp/level5.tmp"라는 이름으로 링크 파일을 만들어야 한다는 정보를 얻을 수 있다.


find 명령어로 소유자가 level6인 것을 찾습니다.


ls -al로 /usr/bin/level5로 보게 되면 x(실행) 권한만 체크가 되어있고 읽기, 쓰기는 전혀 되지 않음으로 cat 명령어와 gdb 명령어는 사용할 수 없습니다. 


level6 권한으로 분석을 진행한 결과 복원된 소스코드를 볼 수가 있다.

#include <stdio.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

#define PERM 0x180 

int main()

{

int fd;

char nextPass[] = "next password : what the hell\n";

char *tempFile = "/tmp/level5.tmp";

//임시 파일 생성

fd = create(tempfile, PERM);

//임시 파일 생성에 실패하면 에러 메시지 출력

// 파일 삭제 후 종료

if(fd < 0){

printf("Can not create a temporary file.\n");

remove(tempfile);

exit(0);

}else {

write(fd, nextPass, strlen(nextPass));

close(fd);

remove(tempFile);

} return 0; }

위 소스에서 공격 포인트는 fd = create(tempFile, PERM); 부분인데, level5 프로세스에서 임시 파일을 생성하기 직전에 공격 프로그램에서 임시 파일에 먼저 링크를 걸게 되면 링크를 건 파일을 통해 미리 만들어 둔 파일에 write(fd, nextPass, strlen(nextPass));로 패스워드를 적게 하는 것이다.



공격 코드에서 염두해 둘 부분은 타이밍을 빼앗을 수 있는 순간을 만들어 내기 위해 취약한 프로그램과 공격 프로그램을 여러 차례 반복해서 실행해야 한다는 것이다. 일단 runtarget.c 코드는 취약한 프로그램을 실행할 코드이다. 10번에 걸쳐 /usr/bin/level5 프로그램을 반복 실행한다.



runtarget(취약한 프로그램)을 실행해도 10번의 실행이 끝나는 데 1~2초 정도밖에 걸리지 않는다. 그래서 두 번째 공격 프로그램을 실행할 겨를이 없다.


공격 프로세스와 취약한 프로세스를 동시에 실행하는 부분도 프로그램으로 구현할 필요가 있다. expTarget 소스에도 위와 마찬가지로 10번의 타이밍 경쟁 시도를 하게 만들었다.


위에서 ./runtarget & 명령으로 /tmp/level5.tmp가 10번 실행될 때, 바로 expTarget을 아래와 같이 실행을 해주면 보다시피 취약한 프로그램이 실행되는 타이밍보다 공격 프로그램의 실행이 늦은 경우에는 앞에서 작성한 suspect.txt 파일에 패스워드가 쓰여지는 타이밍을 놓치게 된다.


해결방법으로는 셸 스크립트를 이용해서 시간 문제를 해결해야 한다. 아래의 소스는 runtarget(취약한 프로그램)을 먼저 실행하고 바로 expTarget(공격 프로그램)을 바로 실행하는 셸 코드이다.


sh 명령어로 expBash.sh를 실행하면 패스워드가 출력이 된다.




'시스템해킹 > FTZ' 카테고리의 다른 글

FTZ LEVEL7 문제풀이  (0) 2015.07.22
FTZ LEVEL6 문제풀이(시스템 인터럽트)  (0) 2015.07.21
FTZ LEVEL4 문제풀이  (0) 2015.07.18
FTZ LEVEL3 문제풀이  (0) 2015.07.15
FTZ LEVEL2 문제풀이  (0) 2015.07.15
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함