이번에 풀어볼 문제는 HackerSchoolFTZ Level 4 입니다.
이번 문제는 xinetd와 Linux의 서비스 구동 방식, 그리고 finger 서비스에 대한 개념을 알고있으면 쉽게 클리어 할 수 있습니다.
Level 4 Write-Up
level4 계정에 접속 후 힌트를 봅니다.
/etc/xinetd.d 폴더에 백도어가 심어져 있다고 합니다.
xinetd 에 대한 개념은 아래에 정리해 놓았습니다.
xinetd?
xinetd는 현대 리눅스에서 여러 데몬을 관리하는 데몬으로, 슈퍼 데몬이라고도 불립니다.
초기 리눅스에서 사용되던 inetd(Internet Service Daemon)가 보안 한계 때문에 사장되고, 대체재로서 등장한 시스템 입니다.
xinetd 슈퍼 데몬은 리눅스 서버에서 서비스되는 다른 여러가지 데몬들을 제어하며, 각각의 서비스에 대한 요청과 서비스를 연결하는 역할을 담당합니다.
xinetd 슈퍼 데몬으로 제어되는 서비스 중 telnet 으로 예를 들면,
누군가 telnet 서비스에 접속을 요청하게되면, 곧바로 telnet 서비스가 실행되는 것이 아니라 xinetd 에 의해서 연결을 검증받은 뒤에야 비로소 telnet 서비스로 연결이 되는 것입니다.
일반적으로 ftp, finger, login 등 여러 서비스들이 슈퍼 데몬에 의해 관리 및 제어 됩니다.
/etc/xinetd.conf
로 설정을 관리하며, 서비스 별 개별설정이 필요할 경우/etc/xinetd.d/
디렉터리에 서비스별 개별 설정파일을 만들어 관리할 수 있습니다.
xinetd는 Linux에서 서비스되는 운영 방식에 포함
됩니다.
Linux에서 서비스가 운영되는 방식은 대표적으로 standalone, xinetd 두가지가 있습니다.
Standalone? Xinetd?
1) standalone 방식
개별 서비스별로 항상 데몬이 떠있는 상태로 동작하며 속도가 빠른 장점이 있습니다. 하지만 사용하지 않을때도 항상 메모리 및 cpu 를 점유하고 있어 비효율 적입니다.
주로 Web, Mail 등 요청이 잦은 서비스에 사용됩니다.2) xinetd 방식
슈퍼 데몬을 이용해 개별 서비스를 동작시키는 방식으로, xinetd에 서비스 요청을 하게되면 데몬을 띄워주는 방식 입니다.
서버 리소스를 절약할 수 있는 장점이 있으나 xinetd를 거쳐서 서비스가 되는 형식이기 때문에 standalone 방식에 비해 상대적으로 속도가 느리다는 단점이 있습니다.
주로 finger, telnet 등 비교적 요청이 적은 서비스에 사용됩니다.
이제 xinetd 와 linux의 서비스 운영방식에 대해 알았으니 문제풀이로 돌아갑시다.
힌트에서 알려준 대로, /etc/xinetd.d 경로에 들어가면 backdoor 파일이 존재하는 것을 확인할 수 있습니다.
$ cd /etc/xinetd.d
$ ls
cd /etc/xinetd.d && ls
backdoor 파일을 보면, finger 서비스에 대한 설정이 적혀있습니다.
$ cat backdoor
cat backdoor
참고로, 과거에는 주로 finger 서비스를 이용해 BackDoor를 많이 만들었다고 합니다.
Finger Service?
finger 서비스는 who 명령어와 비슷하게 사용자들에 대한 정보를 보여줍니다.
who 명령어가 현재 접속중인 사용자에 대한 간략한 정보만 보여주는데 반해, finger 서비스는 시스템에 등록된 사용자만이 아니라 네트워크를 통해 연결되어 있는 다른 시스템에 등록된 사용자들 정보까지 보여줍니다. 즉,Finger 서비스를 이용하면 네트워크 외부에서 해당 시스템에 등록된 사용자 정보를 확인
할 수 있습니다.
이러한 이유로 서버 관리 메뉴얼에서는 불필요한 경우 Finger 서비스를 비활성화 하도록 권고하고 있습니다.
backdoor 파일에 설정되어 있는 finger 서비스는 다음과 같이 동작합니다.
service finger
{
disable = no // xinetd 방식으로 구동합니다.
flags = REUSE
socket_type = stream
wait = no // 멀티 쓰레드 방식으로 구동합니다.
user = level5 // level5 유저의 권한으로 데몬을 실행합니다.
server = /home/level4/tmp/backdoor // 서비스 요청시 해당 파일을 실행합니다.
log_on_failure += USERID
}
/etc/xinetd.d 개별 설정 플래그
- service finger:
/etc/services
파일에 명시되어 있는 서비스로, 서비스 이름과 포트가 매핑되어야 합니다.- disable: xinetd에 의해 동작할것인지를 묻는 플래그 입니다. no로 설정시 xinetd, yes로 설정시 standalone 방식으로 구동됩니다.
- socket_type: stream(TCP), dgram(UDP)
- wait: 서비스가 싱글 쓰레드(yes)인지 멀티 쓰레드(no)로 동작할지 결정하는 플래그 입니다.
- user: 데몬을 구동할 UID 입니다.
- server: 요청에 의한 연결이 완료되었을 때 실행할 파일의 경로 입니다.
/etc/xinetd.d/ 에 위치한 finger 파일도 확인해 보겠습니다.
$ cd /etc/xinetd.d
$ cat finger
cat finger
여기서 가장큰 차이를 확인할 수 있습니다
finger 파일에 설정된 finger 서비스는 standalone 형식으로 동작
하도록 설정 되어 있으며, backdoor 파일에 설정된 finger 서비스는 xinetd 형식으로 동작
하도록 되어 있습니다.
즉, finger 서비스를 외부에서 xinetd로 요청하는 형태로 보낸다면 level5 계정의 권한으로 /home/level4/tmp/backdoor
파일을 실행할 수 있습니다.
finger 서비스는 ‘finger [user@host]’ 형식으로 외부에서 호출할 수 있으며 ‘finger @localhost
’ 혹은 ‘finger @127.0.0.1
’ 명령어로 로컬호스트로 xinetd를 통해 서비스를 요청하도록 할 수 있습니다.
간단한 테스트를 위해 id 명령어를 실행하는 파일을 만들어 보겠습니다.
‘/home/level4/tmp/’ 경로에 ‘test.c’ 파일을 만들어 줍니다.
// /home/level4/tmp/test.c
#include <stdlib.h>
int main() {
system("id");
}
gcc를 이용해 output ‘backdoor’ 로 컴파일 해줍니다.
$ gcc -o backdoor test.c && ls
Compile test files.
이제 finger 서비스를 로컬호스트로 xinetd를 통해 요청하도록 명령어를 입력하면 성공적으로 level5의 id 정보가 나오는 것을 확인할 수 있습니다.
$ finger @localhost
finger @localhost
그냥 finger 명령어를 입력하면, xinetd 방식이 아닌 standalone 방식으로 구동되어 아래처럼 finger 서비스가 동작됩니다.
$ finger
finger
이번에는 id 명령어가 아닌 패스워드를 확인하는 ‘my-pass’ 명령어를 실행하도록 코드를 수정합니다. edit test.c
컴파일 후 ‘finger @localhost
’ 명령어를 입력하면, 아래와 같이 level5의 권한으로 실행된 ‘my-pass’ 명령어의 결과를 확인할 수 있습니다.
$ gcc -o backdoor test.c && ls
$ finger @localhost
compile test files and run finger @localhost
최종적으로, level5 계정의 패스워드가 "what is your name?"
인것을 확인했습니다.
index.html
index.html에서 아래와 같은 내용을 확인할 수 있습니다.
$ cat public_html/index.html
cat /public_html/index.html