힌트를 확인해보았다. /usr/bin/level5 프로그램이 /tmp에 level5.tmp 파일을 생성한다고 하여서 먼저 프로그램을 실행시킨 후 확인해보았다.
프로그램을 실행시킨 후 폴더를 확인해봤지만 파일이 존재하지 않았다. level5 프로그램은 임시 파일을 생성한 후, 곧바로 파일을 다시 삭제시키는 것 같았다.
race.c와 create.c 프로그램을 작성하여 컴파일했다. race.c는 레이스 컨디션을 하는 코드이고, create.c는 /usr/bin/level5 프로그램을 무한으로 실행하는 코드이다. 이때 레이스 컨디션이란 한정된 자원을 동시에 이용하려는 여러 프로세스가 자원의 이용을 위해 경쟁을 벌이는 현상이다. 레이스 컨디션 코드는 구글링을 하여 찾아 작성했다.
먼저 힌트를 확인했다. /etc/xinetd.d/에 백도어를 심어놓았다고 해서 해당 폴더로 이동했다.
xinetd(extended Internet daemon)는 오픈 소스 슈퍼 서버 데몬으로서 많은 유닉스 계열 시스템에서 돌아가며 인터넷 기반 연결을 관리한다. 이것은 오래된 inetd의 대체로서 더 강력한 보안을 제공하며, 대부분의 현대 리눅스 배포판에서는 이것을 사용한다.
폴더의 파일 리스트를 확인하니 백도어가 존재했다. 백도어 파일을 확인해보니 finger 서비스가 등록되어 있었다. 이때 중요하게 볼 것은 user와 server이다. user는 서버 프로세스를 실행할 수 있는 사용자의 아이디를 나타내고, server는 해당 서비스를 실행할 데몬 프로그램의 위치를 나타낸다. 즉 해당 위치에 my-pass 명령어를 실행하는 프로그램을 작성하고, 서비스를 실행하게 되면 level5의 권한으로 my-pass 명령이 실행되게 된다.
/home/level4/tmp 폴더에 backdoor.c 프로그램을 작성했다. my-pass 명령을 실행하는 간단한 프로그램이다.
컴파일을 진행하여 backdoor 프로그램을 작성하였다.
이 다음부터는 구글링을 하여 문제를 풀었다. backdoor 서비스를 실행시키기 위해서는 finger을 구동시켜야 한다고 했다. 참고하여 finger을 실행시키니 password가 출력됐다.
힌트를 확인해보면 autofig 프로그램의 소스코드와 하단의 more hints가 존재한다. 동시에 여러 명령어를 사용하려면 ;(세미콜론)을 사용한다. 또한 문자열 형태로 명령어를 전달하려면 ""(쌍따옴표)를 사용한다.
level4의 권한을 가진 파일을 찾아보면 힌트에서 확인했던 autodig를 확인할 수 있다.
이제 autodig의 인자열을 정해야한다. "dig@ ~ version.bind chaos txt" 명령어는 버전을 확인할 수 있는 명령어이다. 그 인자로 임의의 ip 주소를 주고, ;을 사용해서 sh을 실행시켜준다. 또한 문자열 형태로 명령어를 전달해야 하므로 ""에 묶어서 인자로 넣으면 password가 출력된다.
문제에 접속하면 소스 코드가 출력된다. 이때 sha1(10932435112)에 대해서 구글링해보면 이 값은 매직 해시인 것을 알 수 있다.
PHP에서는 1e2를 1*10^2로 인식한다. 따라서 0e~로 시작하게 된다면 뒤에 무슨 값이 오든 결과값은 0이 될 것이다. 매직 해시란 '0e'로 시작하는 문자열 뒤의 값들이 전부 숫자인 경우를 의미한다. 이는 PHP 상에서 flaot 형태로 인식되고, 값을 계산해보면 모두 0이 된다.