[ftz] level5: what is your name?
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에서 디버깅하였다.
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")
√ 공격
- 쉘 스크립트 작성
: 좀 더 자동화된 방법을 사용하기 위함
: 위와 같이 두 프로그램을 거의 동시에 구동하면 좀 더 정확한 레이스 컨디션이 만들어짐
√ 공격 과정
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 |
댓글