level4의 hint를 확인해보면 다음과 같은 힌트를 얻을 수 있다.
명시된 /etc/xinetd.d라는 것은 디렉토리로, 슈퍼 데몬이다. 네트워크 서비스에 대한 접근제어, 로그인에 대한 접근 제어 등을 한다고 한다. 들어가서 어떤 파일이 있는지 리스트를 확인해보니 다음과 같이 backdoor라는 파일을 확인할 수 있었다.
원래 슈퍼데몬 내의 finger는 다음과 같은 기본 정보를 갖고 있는다.
각각의 옵션은 다음과 같은 의미를 갖는다
service 서비스 이름
{
disable : 해당 서비스의 실행 여부
socket_type: 서비스의 소켓 유형. stream은 tcp를 의미.
wait: no라고 하면 서비스 요청 처리 중 다음 요청이 들어오면 처리중인 요정이 끝날 때 까지 대기하겠다는 뜻
user: 어떤 사용자로 서비스를 실행할지
server: 서비스 실행 파일 경로. 서비스가 실행되면 경로의 파일을 실행한다.
}
백도어 파일을 보면 service finger라는 부분을 묘사하고 있었다. level5의 권한으로 실행되고, 서버가 level4의 tmp 폴더 안이라는 것을 알 수 있다. 그럼 tmp 안에 backdoor라는 파일을 통해 my-pass를 실행하면, level5의 권한으로 해당 명령어가 실행되지 않을까?
처음에는 생각없이 stdio.h 헤더를 통해 system 함수를 쓰려 했지만 이상한 글자만 출력이 된 채, 제대로 먹히지 않았다. 그래서 검색해보니 리눅스에서 사용하는 C 헤더파일인 unistd.h 가 따로 있었다. 이 헤더에는 system 함수가 구현되어 있어 이 함수를 통해 my-pass 명령어를 실행하기로 했다. (윈도우에서는 os 헤더를 통해 사용해야하는걸로 알고 있는데 기억이 좀 가물가물함)
다음과 같이 간단한 코드를 짜고. gcc를 통해 backdoor라는 파일명으로 실행파일을 만든다. 그리고 finger 명령어를 사용해야하는데, 옵션 없이 로컬로 연결하게 된다면 (ex finger 이 한단어만 입력하기) 기존에 있었던 finger 함수가 나오게 된다. 근데 이 기존 finger 명령어는 데몬을 사용하지 않는다고 되어있기도 하고, 우리가 짠 코드를 실행시키지 않기 때문에 원격 연결을 해서 데몬으로 연결되게끔 백도어 finger 명령어를 호출해야 한다.
* 데몬은 위에서 말했듯 네트워크 접속 제어를 해주는 기능인데, 로컬을 통해 접속할 경우 네트워크를 통하지 않기 때문에 기존 finger에 연결하게 된다. 하지만 원격 연결을 통해 finger 프로토콜을 이용한다면 데몬을 거치기 때문에 우리가 사용한다고 한 백도어 finger가 실행되게 되는 것.
finger 명령어의 원격 호스트 연결 인자는 @호스트 인데, localhost를 통해 우리의 FTZ 서버로 접속한다면 정상적으로 system("my-pass") 구문이 실행되어 비밀번호를 받을 수 있다.
'Write-Up > FTZ' 카테고리의 다른 글
FTZ: Level6 (0) | 2019.09.26 |
---|---|
FTZ: Level 5 (0) | 2019.09.19 |
FTZ: Level1 (0) | 2019.09.19 |
FTZ: level2 (0) | 2019.09.19 |
FTZ : level3 (0) | 2019.09.19 |