본문 바로가기
모의해킹 침해대응 과정/본 과정

Hackme / day 49-51

by 알거음슴 2021. 6. 3.

교육목표

 1) 멀웨어 분석

 2) 포렌식 분석

 3) 권한 상승 (CTF)

 4) reverse 를 통한 의사코드(가상코드)생성

 5) Exploit 코드 개발 (BoF, FSB)

 

Level 1

Backdoor 의 이해

악의적인 사용자가 시스템 보안 취약점을 응용하여 고안된 프로그램, 사용자 인증 등 정상적인절차를 거치지 않고 응용프로그램 또는 시스템에 접근 할 수 있는 프로그램 대표적으로 reverse_tcp, bind_tcp 가 있다.

풀이

더보기

level1 으로 접근진행. 내부를 확인해본다. 

hint file 확인 시 "level2 권한에 setuid가 걸린 파일을 찾는다" 라는 문구 기반으로 추적을 시작한다.

find CMD를 통해 setuid의 값을 가지고 있는 파일을 찾았다, 해당 파일을 실행해본다.

level 2 권한으로 CMD를 실행할 수 있다고 한다. 권한 확인을 위해 id 값을 이용하여 level 2 권한임을 확인할 수 있다.

bash CMD를 통해서 level2의 shell이 열리는지 확인해보자

해당 프로그램으로 인해 level2의 bash shell 이 열린것으로 확인된다.

 

my-pass CMD를 통해서 level2의 Password를 획득할 수 있었다. 프로그램을 종료하고 telnet을 통하여 level2로 접속을 시도한다. 

접속성공!

Level 2

편집기 백도어의 이해

vi/vim 편집기 내에서 외부 명령어를 실행할 수 있다. lastline 모드에서 ! 를 활용하면 편집기를 빠져나가지 않은 상태에서 CMD 를 활용할 수 있다.

풀이

더보기

이전 크랙한 정보를 활용하여 level2로 접속한다. 

ID : level2 

PW : hacker or cracker 

이번에도 힌트 파일을 우선적으로 확인하여 키워드를 얻는다.

편집기 내에서 CMD를 활용하는 문제로 사료된다. set-uid로 level3권한이 있는 파일을 찾는다.

find CMD를 활용해서  level3 user의 권한이 있는 파일을 확인, 해당 파일을 열어본다.

 vi 편집기를 통해서 id CMD 를 입력해보자 예상대로라면 출력결과값이 level3의 권한이 있을것이다.

 BINGO! level1 을 클리어했던것처럼 bash 명령어를 통해 level3의 Shell이 열리는지 확인한다.

level3 uid를 부여받은 bash shell이 열린걸 확인할 수 있다 비밀번호를 크랙해보자. my-passwd CMD 입력

level3의 password 를 크랙했다. 비밀번호는 "can you fly?" telnet을 통해서 로그인시도를 한다.

level3에 도착했다 clear~~~

Level 3

system('CMD') 함수의 취약점

프로세스를 가져와서 실행하는 C언어 함수, 프로세스가 종료되지않는다는점을 활용하여 해당 내용이 있는 소스코드에 Injection 공격을 통해 악의적인 코드를 삽입해보자.

풀이

더보기

level3 사용자로 접속.

ID : level3

PW : can you fly ?

이번에도 hint 파일을 먼저 확인해보자.

autodig CMD 의 소스가 나왓다,해당 내용을 활용하여 level4 권한을 얻으라고한다, 코드를 분석해보자.

int main(int argc, char **argv){  
# int argc : main 함수에 전달되는 정보의 갯수를 의미. (인자 갯수로 구분, 실행 파일도 인자로 침)
# char **argv : main 함수에 전달되는 실제 정보, 문자열의 배열을의미

    char cmd[100];

    if( argc!=2 ){          # 인자값이 2개 일경우
        printf( "Auto Digger Version 0.9\n" );
        printf( "Usage : %s host\n", argv[0] );
        exit(0);
    }
                              # 인자값이 2개가 아닐경우
    strcpy( cmd, "dig @" );         # dig @ 를 복사 (srrcpy)
    strcat( cmd, argv[1] );           # argv[1] 값을 붙임 (strcat)
    strcat( cmd, " version.bind chaos txt");           #version.bind chaos txt 를 붙임 (strcat)

    system( cmd );     #system : 인수로 실행시킬 프로세스 CMD를 받아와 그 프로세스를 호출함.

}

dig CMD를 활용하여 적절한 인자값을 붙여서 권한을 획득하는것으로 사료됨.

우선 fine 명령어를 통해서 역시나 level4 권한의 파일을 찾아낸다.

 찾았다. 해당 파일을 통해서 dig CMD 처럼 IP값을 넣은 결과를 보자.

큰 차이없이 answer section 의 값이 unknow 또는 빈공간으로 표기되며 다른 차이는없는것으로 확인, 즉 autodig CMD 는 level4의 권한으로 dig 명령어를 실행하는것으로 보인다. Injection 공격으로 level4의 ID값을 얻어보자.

소스코드 내 ; 을통해 추가적인 CMD를 적용할 수 있도록 처리하고 id 값을 넣으니 하단에 ID 값이 나온다!

bash 를 통해서 level4의 shell을 열어보자

 system 함수의 특성상 실행된 프로세스는 종료되지 않고 유지되고 있기 때문에 bash shell이 종료되지않고 열려있는걸 확인할 수 있다, 비밀번호를 얻어오려면 my-pass 를 통해 비밀번호를 얻어보자.

 이번에도 clear ~ 비밀번호는 "suck my brain"

Level 4

xinetd 방식의 이해 (원격 백도어)

* xinetd : xinetd 데몬이 서버에서 대기, Client가 service요청시 xintd데몬이 적당한 데몬을 띄워주는 방식.

* standalone : server 에서 service의 데몬을 직접 띄워놓고 제공하는 방식.

풀이

더보기

level3 사용자로 접속.

ID : level4

PW : suck my brain

역시나 hint 파일이 있다. 먼저 확인해보자.

xinetd.d 에 백도어가 심겨져있다고 한다. 해당 백도어를 찾아내보자 우선 /etc/xinetd.d 로 이동해보자.

백도어 파일이 대놓고있다! 해당 파일의 내부를 보도록 하자

적절한 코드가 등장했다 해당 코드를 분석해보자

service finger
{
        disable = no
        flags           = REUSE
        socket_type     = stream
        wait            = no
        user            = level5
        server          = /home/level4/tmp/backdoor
        log_on_failure  += USERID
}

 finger 라는 service의 대한 내용으로 확인된다, 우선 finger servise 의 정보를 수집해보자.

finger 은 79/tcp와 udp를 사용 Listen 상태로 열려있는것으로 확인되고 코드내 있는 server의 위치에는 아무것도 없는것으로 확인된다 finger 의 info를 확인하여 사용방법을 알아보자.

 유저의 정보를 보여주는 프로그램으로 확인된다. 사용양식도 확인되니 level4의 정보를 조회해보자.

작동이 되지 않는다. 생각을 해보자. finger 의 명령어의 값은 /etc/xinetd.d/backdoor 파일을 참조하여 실행한다. 헌대 현제 user정보는 level4가 맞지만 /home/level4/tmp/backdoor 파일은 존재하지않는다. 즉 /tmp 아래 backdoor 파일을 만들어서 재시도진행해보자

1. /etc/xinetd.d/backdoor 파일 수정

service finger
{
disable = no
flags = REUSE
socket_type = stream
wait = no
user = level5
server = /home/level4/tmp/backdoor
log_on_failure += USERID
}

2. /tmp/backdoor.c 생성

#include<stdlib.h>
 
int main()
{
system("cat /home/level4/hint");
system("/usr/bin/id");
return 0;
}

gcc -o 를 통해 컴파일시킨 backdoor 을 활용하여 커맨드진행을해보자.

안된다 .. 이유가 뭘까. 평문형태로 전달되어야하는 언어가 아무래도 정상적으로 닿지않는것으로 보여진다. 문자를 그대로 입력하는 방식인 대화형명령어가 필요한데 bash의 경우 -i 옵션을 활용할경우 해당기능으로 작동가능하다.

1. /tmp 아래 backdoor2.c 파일 제작.

 2. gcc -o backdoor backdoor2.c 로 backdoor 파일 제작완료

이제 테스트를 다시 진행해본다. nc 명령어를 활용하여 리스너를 별도로 열어주기위해 linux 시스템을 활용한다.

즉 linux - listener (port 79) 

 bach shell 이 열렷다! id / pwd 등 정보 확인 후 비밀번호를 찾아보자. 

클리어~

 

 

Level 5

레이스 컨디션(Race Condition, 경쟁상태/경쟁조건) 의 이해

다수의 프로세스가 서로 동일한 자원을 할당받기위해 경쟁하는 상태.

- 다른 계정의 권한에 접근해야 함으로 Set-UID가 걸려있어야한다.

- 임시 파일을 생성해야 한다.

- 공격자가 임시로 생성되는 파일명을 정확하게 알아야한다.

풀이

더보기

level3 사용자로 접속.

ID : level5

PW : what is your name?

 level5 프로그램으로 /tmp/level5.tmp를 생성한다라고 나와있다 우선 /usr/bin/level5 파일을 확인해보자.

 내용을 볼수없다 권한이 부여되어있지않다. 실행권한은 있기때문에 실행을 진행해보자.

생성이 되자마자 사라지는거같다. 한번 레이스 컨디션 공격을 진행해보자. 우선 /tmp로 이동후 공격코드를 작성한다.

2가지 공격코드를 통하여 공격작업을 진행해보자.

공격작업이 진행되는 도중 하단에 next password : what the hell 이라는 문구가 확인된다 해당문구로 로그인해보자.

접속은 성공한것으로 보여지나.. hint가 바로출력되며 로그인이 유지되지않는다.. 다음문제로 넘어가보자!