Level4에서 구한 암호를 입력하고 들어가서 우선 파일목록을 한번 봐줍니다.



hint가 보이네요. 당연히 읽어줍시다.



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

이를 이용하여 level6의 권한을 얻어라.

 

우선 /usr/bin/level5를 확인해 봅시다.



level6 setuid가 설정 되어 있네요. 느낌상 저걸 실행하면 my-pass명령어를 통해 level6의 비밀번호를 알 수 있고, 그것이 /tmp/level5.tmp에 저장될 것 같습니다.

/usr/bin/level5를 실행하고 /tmp/level5.tmp에 암호가 있나 확인해봅니다.



/usr/bin/level5를 실행하고 /tmp폴더를 확인해봤는데 level5.tmp는 보이지 않습니다.

아마 /usr/bin/level5프로그램이 종료될 때 임시파일을 지우는 듯 합니다.

 

level5.tmp에 들어있는 내용을 읽는게 이번 level의 문제 요지입니다.

여기서 필요한 공격기법이 레이스 컨디션입니다.

setuid와 임시파일을 듣고 레이스 컨디션을 생각하시면 됩니다.

 

레이스 컨디션을 간단하게 얘기하면 일종의 바꿔치기라 할 수 있습니다. 다른 권한으로 실행되는 프로그램 중간에 끼어들어 자신이 원하는 작업을 하는 기술입니다. 타이밍이 가장 중요하기 때문에 보통 될때까지 실행합니다.

 

레이스 컨디션 공격의 기본적인 아이디어는 다른 권한의 프로그램에 의해 생성되고 사용되는 임시 파일에 대한 것입니다.

 

레이스 컨디션 공격에 앞서 파일 링크라는 개념이 필요한데, 이는 다른 블로그에 잘 정리되어 있으니 여기선 설명하지 않겠습니다.

구글에 리눅스 링크라고만 검색해도 많이 나옵니다.

 

레이스 컨디션 공격을 할때 값을 저장할 임의 파일을 하나 생성을 합니다. 그리고 그 임의 파일의 심볼릭 링크를 생성하여 주는데 이때 이름을 프로그램에서 생성하는 임시파일로 만듭니다. 즉 심볼릭 링크의 이름이 /tmp/level5.tmp가 되는 것이죠.

이렇게 되면 프로그램은 권한 상승이 된 상태에서 링크파일에 데이터를 덮어 씌우고, 그 값이 임의 파일에 저장되게 됩니다.

 

그러나 프로세스 연산과정의 순서로 인하여 권한 상승이 끝난뒤 접근하여 값이 변경 되지 않을 수도 있기 때문에 반복하여 될때까지 하는게 일반적입니다.

 

따라서 프로그램으로 작성하였습니다.

/usr/bin/level5를 반복적으로 실행할 func프로그램입니다.



반복적으로 /tmp/level5.tmp라는 이름의 심볼릭 링크를 생성해주는 link프로그램입니다.



값은 /home/level5/tmp/passwd파일에 저장될 것입니다.

이제 연결을 하나 더 여시고 한쪽에서는 func프로그램을 실행해주고, 다른 한쪽에서는 link프로그램을 실행하여 줍니다.

 

프로그램을 몇초정도 실행하고 ^z로 둘다 멈춘후에 /home/level5/tmp/passwd파일의 내용을 확인하면 level6의 암호가 들어가 있는것을 볼 수 있습니다.


level6의 암호는 what the hell이네요.

레이스 컨디션 공격을 막기 위해서는 먼저 프로그램 로직 중에 임시 파일을 생성한 후, 임시 파일에 접근하기 전에 임시 파일에 대한 심볼릭 링크 설정 여부와 권한에 대한 검사과정을 추가해 주면 됩니다. 

 

+ Recent posts