write-up/pwnable

[ftz] level5: what is your name?

여니두 2019. 8. 12.

05_레이스 컨디션

 

√ 레이스 컨디션 (Race Condition)?

: 다수의 프로세스가 서로 동일한 자원을 할당받기 위해 경쟁하는 상태

- 데드락(=교착상태)

: 경쟁 상태에 빠진 다수의 프로세스에게서 발생할 수 있는 최악의 상황 중 하나

 

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

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

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

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

 

- 문제의 레이스 컨디션 환경

1. 임시 파일 생성 시도

2-1. 임시 파일이 생성되면, 내용 쓰고 바로 파일 삭제

> 공격자 입장에서는 임시 파일에 내용을 쓰고 삭제하는 순간이 너무 짧은 것이 문제!!

2-2. 임시 파일 생성에 실패하면, 프로그램 종료

 

>> 임시 파일에 내용 쓰고, 삭제하는 순간이 너무 짧으므로 공격용 프로그램을 작성해야 한다.

 

- 공격 타이밍 예제

by 심볼릭링크: 원본 파일이 삭제되면 내용이 지워진다고 했는데...?

: 링크파일이 수정되면 원본파일도 수정됨!!!!

 

1. 공격 프로세스에서 /tmp/level6pass.txt 파일을 만든다.

2. 공격 프로세스에서 /tmp/level6pass.txt를 원본으로 하는 /tmp/level5.tmp 링크 파일을 만든다.

( >> level5.tmp: 취약 프로세스가 생성, 삭제하는 파일의 이름)

 

3. 레이스 컨디션 취약점이 있는 프로세스를 시작

4. 취약 프로세스가 /tmp/level5.tmp를 생성하려 하지만, 공격 프로세스가 만들어 둔 링크 파일이 이미 있으므로 추가로 파일을 만들지 않는다.

5. 취약 프로세스가 level5.tmp 링크에 내용을 쓴다.

( >> level5.tmp에 내용을 쓰면 원본인 /tmp/level6pass.txt 파일에 내용이 쓰여짐)

6. 취약 프로세스가 쓴 내용을 사용 후, level5.tmp 파일을 삭제하고 종료

( >> 결국 내용이 쓰여진 level6pass.txt가 남아 있으므로 쓴 내용을 볼 수 있음)

 

공격에 성공하기 위해서는 공격 프로세스가 하는 일을 취약 프로세스가 생성할 임시 파일과 같은 이름이 있는지

검사하는 과정 전에 수행해야 한다. (4번 과정 전에)

 

>> 이 타이밍이 맞는 순간이 생길 때까지 공격 프로세스와 취약한 프로세스를 반복하면 공격 성공할 것!

 

√ 문제 분석

- /tmp/level5.tmp 임시파일 생성

: 공격 프로세스에서 임의의 파일 생성 후 /tmp/level5.tmp라는 링크 파일을 만들어야 한다

 

대상 파일 확인

 

/usr/bin/level5를 실행 후, /tmp/level5.tmp를 열어보았더니 그런 파일이나 디렉토리가 없다고 뜬다.

 

√ gdb로 소스코드 분석

: level5 계정 권한은 실행(--x) 밖에 없어서 level5에서 디버깅할 수 없다. 그래서 level6에서 디버깅하였다.

procedure prelude 과정

0x180을 stack에 올린 후, creat("/tmp/level5.tmp", 0x180) 호출

* 0x180 = 0600

 

파일 생성 시도가 성공이면 <main+88>로 이동

 

* 실패 경우

위의 문자열 출력

>> remove("/tmp/level5.tmp")

 

>> exit(0)

 

* 성공 경우

>> write(fd(%[ebp-4]), "next password~", 0x1f)

** 0x1f = 문자열을 모두 쓰기 위해 길이를 충분하게 준 것

>> close(fd)

 

>> remove("/tmp/level5.tmp")

 

 

√ 공격

background.c

 

link.c

 

bash.sh

- 쉘 스크립트 작성

: 좀 더 자동화된 방법을 사용하기 위함

: 위와 같이 두 프로그램을 거의 동시에 구동하면 좀 더 정확한 레이스 컨디션이 만들어짐

 

 

√ 공격 과정

1. hint: tmp 폴더에 임시 파일을 생성한다고 한다. (password 추정)

2. 레이스 컨디션을 이용하여 삭제되기 전에 링크 파일을 걸어두려 함.

3. /usr/bin/level5를 실행하는 코드와 링크파일 생성 코드를 10회 이상 반복

4. 쉘 스크립트를 이용해서 두 코드가 동시에 실행되도록 함

 

Level 6 password = what the hell

 

● 심볼릭링크

ln -s [원본 파일] [링크 파일 이름]

- 단순히 원본파일을 가리키도록 링크만 시켜둔 것

- 윈도우의 '바로가기' 파일

- 원본파일을 가리키고만 있으므로, 원본파일의 크기와는 무관

- 원본파일이 삭제되면 내용 지워짐

 

● 하드링크

ln [원본 파일] [링크 파일 이름]

- 원본파일과 동일한 내용의 다른 파일

- 원본파일을 삭제하더라도 링크파일은 그대로 남아 있음

(다른 파일이기 때문)

- 원본파일의 내용이 수정될 경우에는 링크파일의 내용 또한 자동으로 변경

 

- by 하드링크: 하드링크는 임시파일이 지워져도 링크파일에 내용이 남아있다고 했는데...?

 

1. /tmp 폴더에 result.txt 파일 만든다.

2. /tmp/level5.tmp에 /tmp/result.txt라는 하드링크를 걸어준다.

3. /usr/bin/level5를 수행시켜 level5.tmp에 password를 쓰게 한다.

4. level5.tmp가 지워져도 /tmp/result.txt는 남아있다.

 

 

'write-up > pwnable' 카테고리의 다른 글

[ftz] level 7: come together  (0) 2019.08.14
[ftz] level 6: what the hell  (0) 2019.08.13
[ftz] level4: suck my brain  (0) 2019.07.28
[ftz] level3: can you fly?  (0) 2019.07.28
[ftz] level2: hacker or cracker  (0) 2019.07.25

댓글