FTZ - Level 5

HelloMG
|2019. 7. 14. 19:12

먼저 hint를 살펴 보도록 합시다!

 

그림 1     hint

"/usr/bin/level5 프로그램은 /tmp 디렉토리에 level5.tmp라는 이름의 임시파일을 생성한다."

임시파일을 생성한다는 문구에서 레이스 컨디션을 이용하여 권한을 얻어야 된다는 것을 알 수 있습니다 :D

그럼 레이스 컨디션에 대해 알아 보도록 합시다!

 

레이션 컨디션을 한글 그대로 해석하면 경쟁 상태라는 의미입니다.

이 의미는 다수의 프로세스가 서로 동일한 자원을 할당 받기 위해 경쟁하는 상태를 의미합니다.

그럼 레이스 컨디션 취약점이 존재하기 위한 최소 조건은 다음과 같습니다 :D


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

"일시 파일을 생성해야 한다."

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


이제 밑의 순서도를 보면서 레이스 컨디션을 알아보도록 합시다 :)

그림 2     레이스컨디션 흐름도 예제

1. 파일을 생성

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

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

4. 파일 삭제

 

이 동작 중에서 2번과 4번 사이에 취약점이 존재하게 됩니다!

즉, 실행 흐름에서 2번과 4번 사이에 공격할 수 있는 틈이 있긴 하지만 너무 짧은 시간 간격이라서

결국 공격용 프로그램을 작성해야 합니다.

 

그럼 조금더 자세히 알아보도록 합시다!

그림 3     레이션컨디션 공격 타이밍

그림 2번에서 공격 프로세스의 처리 과정을 새롭게 추가한 그림입니다.

취약한 프로세스가 파일을 생성하기 전에 공격하는 프로세스에서 먼저 파일을 생성하고

취약한 프로세스에서 생성할 파일명으로 링크를 만들어 두면 취약한 프로세스는 공격 프로세스가 만든 링크에

내용을 쓰게 되고 링크를 삭제하게 됩니다!

 

이번 문제에는 다음과 같이 파일 이름을 사용 하겠습니다 :D

파일 생성 : /tmp/6pass.txt (password를 위한 임의의 파일)

링크 생성 : /tmp/level5.tmp (임시 파일)

 

공격 흐름


  1. 공격 프로세스에서 /tmp/6pass.txt 파일을 만든다.
  2. 공격 프로세스에서 /tmp/6pass.txt 파일을 원본으로 하는 /tmp/level5.tmp 링크 파일을 만든다(/tmp/level5.tmp 링크가 취약한 프로세스가 생성하고 삭제하는 파일의 이름이다).
  3. 레이스 컨디션 취약점이 있는 프로세스를 시작한다.
  4. 취약한 프로세스가 /tmp/level5.tmp 파일을 생성하려고 하지만 공격 프로세스가 만들어 둔 링크인 /tmp/level5.tmp 파이이 이미 있으므로 추가로 파일을 만들지 않는다.
  5. 취약한 프로세스가 /tmp/level5.tmp 링크에 내용을 쓴다(/tmp/level5.tmp 링크에 내용을 쓰면 원본인 /tmp/6pass.txt 파일에 내용이 쓰여진다).
  6. 취약한 프로세스가 쓴 내용을 사용한 뒤 /tmp/level5.tmp 파일을 삭제하고 종료한다(결국 내용이 쓰여진 /tmp/6pass.txt 파일이 남아 있으므로 쓴 내용을 볼 수 있다).

그럼 이제 문제를 풀어봅시다 :D

먼저 문제의 파일을 찾아봅시다.

그림 4     level5 파일

그리고 실행을 시켜봅시다!

그림 5     파일 실행

파일을 실행 시켰는데 아무런 변화가 없음을 알 수 있습니다.

 

이번 문제를 간단한 코드를 작성해서 공격하여 풀어보도록 합시다!

먼저 백그라운드로 프로세스를 10번에 걸쳐 반복 실행하는 코드를 작성을 합니다.

그림 6     run.c

그리고 실행하여 봅시다 :D

그림 7     컴파일 후 실행

실행을 하여보면 프로그램이 끝나는데 1초도 안걸리는기 때문에

공격 프로세스와 취약한 프로세스를 동시에 실행하는 부분도 프로그램으로 구현할 필요가 있습니다!

 

그럼 코딩을 진행해 봅시다!

그림 8     exp.c

그리고 실행을 시켜 봅시다.

그림 9     exp 실행

심볼릭 링크가 걸린 파일이 생성이 되고 6pass.txt을 가리키는 것을 볼 수 있네요 :D

그럼 문제 파일을 백그라운드로 실행시키고

exp파일을 실행 시켜볼까요 !

그림 10     next password

next password가 출력되면서 level6번 문제의 password를 알게 되었습니다 :D

 

사실상 더 쉽게 푸는 방법으로는 

/tmp/level5.tmp 파일을 만들고 다른 공파일에 링크를 걸어두면 바로 풀리는 문제입니다!

 

조금 더 나아가서 완전 자동화된 방법으로 푸는 걸 알아보도록 해봅시다!

다음과 같이 sh을 이용해서 푸는 방법이 있습니다 :D

그림 11     expBash.sh

정말 쉽게 나오죠 ㅎㅎㅎ!

 

이번엔 코딩을 해서 완전 자동화 방법으로 풀어 봅시다 : )

그림 12     exp_level5.c

이후 컴파일을 하여 실행시켜 주어야 하는데

 주의 해야할 점은 pthread가 사용 되었기 때문에

컴파일시 -pthread 옵션을 주고 컴파일 하셔야 합니다!

그림 13     exp_level5 실행
그림 14     6pass.txt 

 

6번 문제를 풀면서 레이스 컨디션 공격에 대해 알아보았습니다 :D

레이스 컨디션 공격을 하기 위해서는 반드시 맨위에서 제시한 최소한의 조건을 맞춰 주어야 한다는거 잊지 마세요 : )

 

그럼 이만 다음 문제에서 뵙도록 하겠습니다!

'CTF > FTZ' 카테고리의 다른 글

FTZ - Level 6  (0) 2019.07.16
FTZ - Level 4  (0) 2019.07.13
FTZ - Level 3  (0) 2019.07.12
FTZ - Level 2  (0) 2019.07.11
FTZ - Level 1  (0) 2019.07.11