본문 바로가기
System Hacking/해커스쿨 F.T.Z Hacking Zone

해커스쿨 F.T.Z Level 5

by En_Geon 2020. 2. 11.

구글링 결과

level 5부터는 C언어가 필요하다는 소문이 있다.

level 5는 "심볼릭 링크(Symbolic Link)"와 "레이스 컨디션(Race Condition)" 해킹기법을 알아야 풀 수 있는 문제다.

level 5문제 출제자 의도는 "레이스 컨디션"이라는 말이 많다. 

level 5는 제작 단계 코드 실수로 인해 오류가 있다는 소문이 있다.

Geundi님의 글이 해킹기법부터 오류에 대한 정보까지 모든 정보가 들어있는 글이다. 이 글을 참고했다.

 

 

심볼릭 링크(Symbolic Link)

 

심볼릭 링크란 어떤 파일을 가리키고 있는 파일을 말한다. 윈도우에서 바로 가기와 비슷한 개념이다.

원본 파일이 있고 심볼릭 링크 파일이 있을 때 심볼릭 링크 파일은 원본 파일을 가리키는 것이다.

이때, 심볼릭 링크 파일을 수정하면 원본 파일도 수정된다.

 

예를 들어 root가 "/etc/passwd"를 "/tmp/pass"라는 이름으로 심볼릭 링크를 만들어 놓고 root가 심볼릭 링크 파일인

"/tmp/pass"를 수정하면 /etc/passwd도 수정 된다.

 

일반 사용자도 "/etc/passwd"의 심볼릭 링크를 만들 수는 있다. 하지만 "/tmp/pass" 파일의 권한이 어떻든 간에 원본 파일을 가리키기만 해서 원본 파일의 권한 설정으로 접근은 제한된다.

 

일반 사용자가 root 몰래 "/etc/passwd" 파일의 심볼릭 링크 파일인 "/tmp/pass"를 만들어 놓았을 때 root가

심볼릭 링크 파일인 "/tmp/pass"의 내용을 수정한다면 결과적으로는 root는 "/etc/passwd"에 수정을 하는 것이 되고, 이때 "/etc/passwd"로 비밀번호를 바꾼다면 사용자의 비밀번호를 암호화해 저장하는 파일인 shadow 파일이 수정된다.

 

level 5 hint

 

level 5의 힌트처럼 임시파일을 생성하는 SetUID가 걸린 프로그램이 있다.

이 프로그램은 실행하면 /tmp 디렉터리에 level5.tmp 라는 이름의 임시파일을 생성한다.

프로그램이 실행 과정에서 임시파일을 생성하는 때도 심볼릭 링크를 이용해 해킹할 수 있다.

 

예를 들어 일반 사용자가 "/etc/passwd"의 심볼릭 링크 파일을 "/tmp/level5.tmp"라고 만들었을 때 level5 프로그램을 실행하면 level5 프로그램은 root권한의 SetUID가 걸려있으므로 실행되는 동안에는 root 권한이 유지된다.

프로그램이 level5.tmp 임시파일을 만드는데 이 level5.tmp는 "/etc/passwd"의 심볼릭 링크다.

"/etc/passwd"는 root만 쓰기가 가능한데 프로그램 실행 중에는 root의 권한이 유지되기 때문에 "/etc/passwd 파일에 쓰기가 가능해진다. 

결국, level5.tmp 파일의 내용이 "/etc/passwd"로 들어가고 다른 일반 사용자에 의해 "/etc/passwd" 파일이 변경된다.

 

이것이 심볼릭 링크인데 이 심볼릭 링크 해킹기법이 알려지고 나서 대처방법으로는 프로그램이 임시파일을 생성할 때 이미 같은 이름의 파일이 존재하면 그 파일을 삭제하고 새로 임시파일을 생성하는 방법으로 바뀌었다.

 

그 방법이 "레이스 컨디션"이다.

 

레이스 컨디션(Race Condition)

 

레이스 컨디션이란 한정된 자원을 동시에 이용하려는 여러 프로세스가 자원의 이용을 위해 경쟁을 벌이는 현상이다.

 

  1. 프로그램 실행
  2. 생성할 임시파일과 같은 이름의 파일이 있는지 검사
  3. 같은 이름의 임시 파일이 있으면 삭제, 없으면 지나감
  4. 임시파일 생성

프로그램은 위 순서와 같이 작업을 수행한다.

일반 사용자가 심볼릭 링크 공격을 통해 심볼릭 링크를 만들어 놓았어도 3번 작업 수행으로 삭제되어버리므로 일반 사용자가 만든 심볼릭 링크는 무용지물이 된다.

 

프로그램이 작업을 수행할 때 조금의 시간 간격이 나오는 틈새들이 있다.

그 시간 간격은 따로 타이밍을 계산할 수도 없고 타이핑으로 입력할 수 있는 시간이 되지 않는다.

몇몇 틈새들이 있지만, 해커들이 주목한 틈새는 3번과 4번 사이의 틈새이다. 이 틈 사이에서 해커가 원하는 임시파일을 심볼릭 링크 파일로 만드는 것이다.

다만 프로그래밍 언어를 통해서는 가능할 것이다. 그것이 레이스 컨디션이다.

 

root 권한의 SetUID가 걸린 프로그램을 여러 번 반복 실행하는 프로그램, 심볼릭 링크를 여러 번 하는 프로그램을 두 개를 작성해야 한다.

이 프로그램을 동시에 실행하면 프로그램들이 실행되는 시간의 차이가 있으므로 3번과 4번 사이에서 심볼릭 링크를 거는 때가 반드시 있다.

 

이렇게 하나의 프로그램은 계속해서 심볼릭 링크를 삭제하고 다른 프로그램은 계속해서 심볼릭 링크를 생성하고 두 프로그램은 서로 경쟁하고 있다고 해서 이런 상태를 Race(경쟁), Condition(상태) 레이스 컨디션이라고 한다.

 

레이스 컨디션 조건

 

  1. 프로그램에 root 권한의 SetUID가 걸려있어야 한다.
  2. 프로그램은 실행 도중 임시파일을 생성한다.
  3. 생성된 임시파일의 이름과 위치를 알고 있어야 한다.
  4. 파일이 생성되는 디렉터리에 쓰기 권한을 가지고 있어야 한다.

 

프로그래밍

 

level 5를 반복실행하는 프로그램

 

프로그램을 반복 실행시키는 코드를 만든다.

 

심볼릭 링크 생성을 반복하는 프로그램

 

"/tmp/level5.tmp"를 어떤 원본 파일 sl의 심볼릭 링크 파일로 만드는 것이다.

따라서 "/tmp/level5.tmp" 파일에 내용이 써진다면 원본 파일 sl에도 같은 내용이 써질 것이다.

 

심볼릭 링크의 원본 파일 sl

 

소스파일 컴파일

 

소스 파일을 컴파일 후 동시에 실행시킨다.

 

실행할 때 동시에 실행해야 한다. 그렇지 않으면 한 프로그램이 끝나고 다음 프로그램을 실행시켜야 한다. 

우리는 동시 실행시키는 방법을 생활코딩에서 백그라운드 실행을 통해 배웠다.

그 방법은 "&" 문자를 이용하는 것이다.

 

먼저 level 5를 반복 실행하는 "s"를 실행할 때 "./s &"를 입력한다. "&"를 입력하지 않으면 "s"가 반복 실행이 끝난 후 다른 명령을 수행할 수 있다. 즉 앞 프로그램이 수행이 완료될 때까지는 다른 무언가를 할 수 없다는 것이다.

 

실행 결과

 

실행 결과와 같이 나오고 반복이 끝나면 끝이 난다.

한 번 돌리고서 확인하기 위해 cat sl을 입력했다. 그러나 아무것도 실행되지 않고 아무것도 나오지 않았다.

그래서 ls -l로 파일을 확인했을 때 "sl 파일"의 크기가 "0"이어서 당황했다.

 

1000번 반복하는 코드를 작성했기에 두 프로그램을 실행시키면 1000번 반복을 한다.

한 번 돌렸음에도 불구하고 "sl 파일"의 크기가 0으로 아무것도 입력되지 않을 경우도 있다.

 

이때 위 레이스 컨디션의 시간 간격의 틈새가 맞지 않아서 "sl 파일"의 크기가 0이 될 수 있다.

그럴 때는 두 프로그램을 "sl 파일"에 글이 쓰일 때까지 프로그램을 돌리거나 반복문의 반복 횟수를 늘려주면 된다.

 

심볼릭 링크를 만드는 프로그램에서 임시파일을 삭제하는 소스를 추가하면 더 좋은 실습이 된다.

 

 

오류에 대해 말하자면 처음에 말했듯이 많은 사람들은 이 문제의 출제자 의도는 "레이스 컨디션"이라고 말한다.

그러나 "레이스 컨디션" 기법을 사용하지 않고 해결되는 오류가 있다.

 

level5 프로그램을 실행하기 전에 먼저 "/tmp/level5.tmp" 파일을 만들고 level5 프로그램을 실행시키면 삭제되어야 할 "/tmp/level5.tmp"가 삭제되지 않고 그대로 남아 있다. 또 level5.tmp 파일의 내용을 보면 패스워드도 들어있는 오류가 있다.

 

자세한 오류의 분석 내용은 링크를 통해 확인할 수 있다.

 

'System Hacking > 해커스쿨 F.T.Z Hacking Zone' 카테고리의 다른 글

해커스쿨 F.T.Z Level 7  (0) 2020.02.13
해커스쿨 F.T.Z Level 6  (0) 2020.02.13
해커스쿨 F.T.Z Level 4  (0) 2020.02.07
해커스쿨 F.T.Z Level 3  (0) 2020.02.06
해커스쿨 F.T.Z Level 2  (0) 2020.02.05

댓글