구글링 결과
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의 힌트처럼 임시파일을 생성하는 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)
레이스 컨디션이란 한정된 자원을 동시에 이용하려는 여러 프로세스가 자원의 이용을 위해 경쟁을 벌이는 현상이다.
- 프로그램 실행
- 생성할 임시파일과 같은 이름의 파일이 있는지 검사
- 같은 이름의 임시 파일이 있으면 삭제, 없으면 지나감
- 임시파일 생성
프로그램은 위 순서와 같이 작업을 수행한다.
일반 사용자가 심볼릭 링크 공격을 통해 심볼릭 링크를 만들어 놓았어도 3번 작업 수행으로 삭제되어버리므로 일반 사용자가 만든 심볼릭 링크는 무용지물이 된다.
프로그램이 작업을 수행할 때 조금의 시간 간격이 나오는 틈새들이 있다.
그 시간 간격은 따로 타이밍을 계산할 수도 없고 타이핑으로 입력할 수 있는 시간이 되지 않는다.
몇몇 틈새들이 있지만, 해커들이 주목한 틈새는 3번과 4번 사이의 틈새이다. 이 틈 사이에서 해커가 원하는 임시파일을 심볼릭 링크 파일로 만드는 것이다.
다만 프로그래밍 언어를 통해서는 가능할 것이다. 그것이 레이스 컨디션이다.
root 권한의 SetUID가 걸린 프로그램을 여러 번 반복 실행하는 프로그램, 심볼릭 링크를 여러 번 하는 프로그램을 두 개를 작성해야 한다.
이 프로그램을 동시에 실행하면 프로그램들이 실행되는 시간의 차이가 있으므로 3번과 4번 사이에서 심볼릭 링크를 거는 때가 반드시 있다.
이렇게 하나의 프로그램은 계속해서 심볼릭 링크를 삭제하고 다른 프로그램은 계속해서 심볼릭 링크를 생성하고 두 프로그램은 서로 경쟁하고 있다고 해서 이런 상태를 Race(경쟁), Condition(상태) 레이스 컨디션이라고 한다.
레이스 컨디션 조건
- 프로그램에 root 권한의 SetUID가 걸려있어야 한다.
- 프로그램은 실행 도중 임시파일을 생성한다.
- 생성된 임시파일의 이름과 위치를 알고 있어야 한다.
- 파일이 생성되는 디렉터리에 쓰기 권한을 가지고 있어야 한다.
프로그래밍
프로그램을 반복 실행시키는 코드를 만든다.
"/tmp/level5.tmp"를 어떤 원본 파일 sl의 심볼릭 링크 파일로 만드는 것이다.
따라서 "/tmp/level5.tmp" 파일에 내용이 써진다면 원본 파일 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 |
댓글