Pwnable/FTZ

FTZ - Level4 [Backdoor]

Lucvs 2019. 12. 1. 21:38

LEVEL 4

 

[level4] passcode : suck my brain

(NO DRAG, NO PASSCODE)

역시 hint 존재한다. 살펴보자.

누군가 /etc/xinetd.d/에 백도어를 심어놓았다고 한다. 

 

백도어란 정상적인 인증 절차를 거치지 않고 시스템에 접근할 수 있는 방법을 말한다. 이는 시스템에 최단 시간에 침입할 수 있으며 관리자의 감시망을 완전히 벗어나는 침입 경로이다. 게다가 로그 기록을 남기지 않으며 온라인으로 접속해도 이를 발견할 수 없다.

 

/etc/xinetd.d/ 디렉토리로 이동하여 어떤 파일이 존재하는지 살펴보자 

피상적으로도 백도어 프로그램으로 의심되는 backdoor 라는 파일이 존재한다. 살펴보자.

backdoor 의 코드를 살펴보면 다음과 같다.

service finger     //service 의 이름을 명시 : finger
{
    disable              = no     //슈퍼데몬을 사용 : no(외부에서 접속시 실행 O), 데몬 사용 X : yes(외부에서 접속시 실행 X)
    flags                  =    REUSE     //해당 서비스 포트가 사용중일 경우 재사용 허가
    socket_type       = stream     //TCP : stream, UDP : dgram
    wait                   = no     //xinetd가 새로운 service 요청을 받은 경우 이후에 즉시 그를 처리할 것인지의 여부, TCP : no wait
    user                   = level5     //어떠한 권한으로 service 할 것인지 : level5
    server                = /home/level4/tmp/backdoor     //xinetd(슈퍼 데몬)에 의하여 실행될 데몬 파일
    log_on_failure    += USERID     //로그 접속에 실패하면 USERID 기록을 남김
}

 

 


데몬과 슈퍼데몬 

 

데몬(daemon) 은 사용자가 직접적으로 제어하지 않고, 백그라운드에서 돌면서 여러 작업을 하는 프로그램. 시스템 로그를 남기는 syslogd처럼 보통 데몬을 뜻하는 ‘d’를 이름 끝에 달고 있으며, 일반적으로 프로세스로 실행됨. 또한 데몬에는 두 가지 종류가 있음.

 

1. 스탠드얼론(standalone)

standalone 은 데몬이 메모리에 독립적으로 메모리에 상주하고 있는 방식.

그러나 항상 메모리를 차지하고 있기 때문에 비효율적.

 

2. 슈퍼데몬(xinetd)

더 많은 데몬들은 사용하기 위하여 슈퍼데몬에서 관리하는 데몬이 호출될 경우 일시적으로 메모리를 할당 받았다가 사용을 종료하면 해제하는 방식.

이 때문에 standalone 방식 보다는 처리 속도가 느림. 

 

슈퍼데몬은 telnet, ftp, finger, login, shell 등과 같은 서버스를 제어하는데, 슈퍼데몬은 이러한 서비스를 사용자가 실행하려고 할 때 그 사용자가 허가된 사용자인지를 검증하고 해당 서비스 위치에 있는 파일을 실행하여 사용자가 서비스를 이용할 수 있게 해줌.


 

 

 

이번에는 finger 를 살펴보자.

이 finger 코드가 원래 finger 의 original 코드인 것 같다. disable = yes 로 되어있어 사용되지는 않는 것 같다.

 

그럼 먼저 backdoor 에 정의되어 있는 것처럼 /home/level4/tmp/backdoor 의 경로로 이동하여 어떤 파일이 있는지 살펴보자.

 

tmp 에 아무것도 들어있지 않기 때문에 임의적으로 만들어 주어야 한다. 가짜 finger(backdoor)을 실행시켜서 passcode 를 얻어내야 하므로 tmp 디렉토리에 실행파일 backdoor 를 만들어주도록 하자.

backdoor 에 대한 코드를 작성해주었으면 컴파일하여 실행 파일을 만들자.

성공적으로 생성되었다. 이제 finger 명령어를 이용하여 passcode 를 얻어내는 일만 남았다.

 

 


finger 

 

- finger : 현재 시스템에 로그인 되어 있는 사용자 확인

- finger [user] : finger는 로컬에 접속

- finger @host명 : 해당 서버에 접속해 있는 모든 유저의 정보 확인

- finger user명 @host명 /  @host명 user명 : 원격서버의 사용자 정보 확인


 

 

일단 finger 명령어를 입력하여 실행하였더니 원래의 finger 가 실행되었다.

backdoor 코드에 diable = no 라고 되어있었으므로 외부에서 접속을 해야 backdoor 파일이 실행될 것이다. 

finger 명령어에는 로컬 사용자 정보뿐만이 아니라 원격서버 사용자의 정보도 알 수 있는데, 이를 이용하여 backdoor 를 실행시킬 수 있을 것 같다.

 

finger 에서 명시한 것처럼 원격서버의 사용자 확인 문법을 이용하여 해결해보자.

성공적으로 passcode 를 획득하였다.




백도어 탐지 기법 및 대응 

 

백도어 프로그램은 주로 SetUID 권한을 가진 파일을 변조해서 사용한다. 또한 항상 프로세스를 항상 동작하게 만들거나, 포트를 열어두는 방식을 사용한다. 

따라서 다음과 같은 대응이 필요하다.

 

- 해커가 접근을 위하여 실행시켜둔 프로세스나 열어둔 포트가 있는지 확인

- SetUID 권한이 있는 파일을 검사

- 백도어 탐지 툴을 이용하거나 바이러스 검사

- 무결성 검사를 하여 침입자에 의하여 변경된 파일이 있는지 검사

- 로그를 분석하여 침입자의 기록 확인

/etc/xinetd.d/finger 파일의 삭제

- /etc/services 파일 내에서 finger 행의 삭제 또는 주석(#) 처리.


 

[level5] : what is your name?