힌트를 보면 /usr/bin/bof의 소스 코드가 존재한다. buf와 buf2가 존재하고, buf를 40글자 입력받는다. 그리고 buf2가 "go"일 경우, uid를 3010으로 설정한 후 쉘을 실행한다. 이때 주의해야 할 것은 buf가 10글자라는 것이다. 이를 통해 overflow 공격이 가능하다.
/usr/bin/bof를 gdb로 분석한 내용이다. 여기서 주의해서 볼 내용은 다음과 같다.
이는 각각 buf와 buf2를 나타낸다. 이 둘 사이에는 16의 간격이 존재한다. 즉 buf에 16글자를 채우고 나면 그 다음부터는 buf2에 대입이 된다.
/usr/bin/bof를 실행한 후 앞에 임의의 16글자를 채우고 "go"를 17, 18번째 글자로 입력하게 되면 buf2가"go"가 된다. 그러면 level10 권한으로 쉘이 실행된다. 그 상태에서 my-pass 명령어를 사용하면 level10의 password가 출력된다.
힌트를 확인해보았다. /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가 출력됐다.