본문으로 바로가기

해커스쿨 FTZ level6

category Wargame/FTZ 2017. 8. 17. 17:24

level6 --- what the hell

 

level6 계정으로 login하면 평소와는 다른 상황이 벌어진다.

 

 

 

위 화면에서 Enter키를 누르면 아래와 같은 화면으로 바뀐다.

 

 

 

Ctrl + c를 누르면 위와 같이 "Can't use ctrl+c"가 출력된다.

 

이러한 화면을 보고 눈치가 빠른 사람은 시스템 인터럽트와 관련이 있는 문제라는것을 느낄 수 있다.

 

시스템 인터럽트에 대해서 정확히 모를수도 있으니 시스템 인터럽트에 대해서 정확히 알고가자.

 

시스템 인터럽트는 프로세스간에 주고 받는 신호이다.

 

인터럽트를 유발하는 시그널 목록을 우선 보자.

 

 

 

여기서 자주 사용하는 시그널을 알아보자.

 

프로세스 종료 -  2) SIGINT -> 일반 종료

     15) SIGTERM -> 일반 종료

                         9) SIGKILL -> 강제 종료

 

프로세스 정지 - 19) SIGSTOP

프로세스 재시작 - 18) SIGCONT

 

Ctrl + C -> SIGINT, Ctrl + Z -> SIGSTOP

 

운영체제와 다른 프로세스에 시그널을 보내는 것은 일종의 정보 공유 기능에 해당하므로 프로그램에 따라 인터럽트 처리가 필수인 경우가 많다.

또한 시그널은 소스코드에서 사용할 수 있게 signal.h 이라는 헤더파일에 정의되어있다.

signal.h 헤더파일의 위치는 다음과 같다  --> /usr/include/asm/signal.h

 

시그널 사용을 연습해보자. kill - [시그널] [PID] 형식으로 사용하며 kill은 프로세스 종료 명령어이다.

 

 

 

/usr 이라는 디렉토리를 /tmp/backup 디렉토리에 백그라운드로 구동해서 8490이라는 PID를 가지는 프로세스를 만든다.  9번 시그널(SIGKILL)을 보내 프로세스를 종료시킬 수 있고, 6번 시그널(SIGABRT)을 보내서 프로세스를 중지시킬 수 있다.

 

아래는 signal() 함수의 사용법을 나타낸 표이다.

 

시그널 함수를 구현하는 예제 소스를 작성해보자.

 

 

 

 

SIGINT, SIGTSTP, SIGQUIT 세 개의 시그널을 발생시키면 각 핸들러 함수가 실행되면서 입력된 시그널의 번호가 출력된다. SIGINT(2), SIGTSTP(20), SIGQUIT(3)이다. SIGINT, SIGQUIT의 시그널 핸들러 함수는 시그널 번호를 출력하고, 연속해서 동일 시그널이 입력되면 프로세스를 종료한다. 하지만 SIGTSTP 시그널 핸들러 함수는 시그널 번호를 출력하고 연속해서 SIGTSTP 시그널이 입력되더라도 SIG_IGN 옵션 때문에 중단되지 않는다.

 

작성한 소스코드를 컴파일후 실행해보자.

 

 

또한 시그널의 단축키를 확인하는 것도 가능하다. 자주 쓰는 단축키는 Ctrl+C, Ctrl+D, Ctrl+Z, Ctrl+\이다.

 

 

시스템의 인터럽트에 대해서 얄팍하지만 알아보았으니 이제 문제를 파악하고 분석해보자.

 

다시 level6로 login 해보자

 

텔넷 접속 서비스에 1. 하이텔, 2. 나우누리, 3. 천리안이 있다. 각, 텔넷 서비스에 접속해 연결이 정상적으로 되는지 확인하자.

 

 

위와 같이 1. 하이텔, 2. 나우누리, 3. 천리안 모두 텔넷 접속이 되지 않는다. 텔넷 접속이 되지 않는 이유를 확인하기 위해서 DNS 역조회를 이용해 도메인을 확인해보자.

 

 

위와 같이 DNS 역조회를 해보면 1.하이텔과 3. 천리안은 도메인이 존재하지만, 2. 나우누리는 검색되지 않는다. 검색된다는 것은 서버는 존재한다는 의미이므로 IP가 등록되어 있음을 알 수 있다.

 

여기서 텔넷 연결도 안되기 때문에 무엇을 해야할지 감이 오지 않는다. 정삭적인 흐름을 따라갔지만 아무것도 실행되지 않고, 세션이 끝나기 때문이다.

텔넷 접속 서비스 선택 메뉴에서 메뉴를 우회하기 위해서 Ctrl+c를 눌렀지만 "Can't use ctrl+c"라는 문자열이 출력되면서 우회가 되지 않는다. 또한 Ctrl+D, Ctrl+\과 같은 시그널을 사용하면 계속 재로그인을 해야 하는 상황이 발생한다.

 

그러면 이제 실행파일을 gdb로 분석해서 소스코드를 분석해보자.

 

 

"cat hint"라는 문자열을 스택에 올린후  system() 함수를 호출한다. system("cat hint")라는 코드가 실행되어 로그인을 하면 hint 파일을 바로 볼 수 있다.

 

 

텔넷 접속 서비스를 선택하는 메뉴 화면에서 1. 하이텔, 2. 나우누리, 3. 천리안 중 접속하고 싶은 메뉴의 번호를 한 글자로 입력받는다.

 

 

"clear"라는 문자열을 스택에 올린후 system() 함수를 호출한다. system("clear") 함수가 호출해 화면을 깨끗하게 한다.

 

 

텔넷 접속 서비스 메뉴 화면 1. 하이텔, 2. 나우누리, 3. 천리안을 구성하는 화면을 구성하는 부분이다.

'[문자]' <repeats 숫자 times>는 '[문자]'를 숫자만큼 반복하라는 뜻이다.

 

 

"sig_func"이라는 문자열과 0x02를 스택에 올리고 signal 함수를 호출한다. signal(2, sig_func)라는 코드가 실행된다.

 

Ctrl + C == SIGINT이고 시그널 번호는 2번이다. 따라서 SIGINT(Ctrl+C) 시그널이 입력되면 sig_func() 함수가 실행된다.

 

 

sig_func 함수는 "Can't use ctrl+c\n"라는 문자열을 스택에 올리고 printf 함수를 호출한다. 따라서 printf("Can't use ctrl+c\n")가 실행된다. 그래서 SIGINT(Ctrl+C) 시그널이 입력되면 "Can't use ctrl+c\n" 문자열을 화면에 출력한다.

 

 

"\n접속하고 싶은 bbs를 선택하세요 : "라는 문자열을 스택에 올리고 printf 함수를 호출한다. 따라서 printf("\n접속하고 싶은 bbs를 선택하세요 : ")가 실행된다.

 

 

사용자에게 입력받은 값을 저장하는 변수를 스택에 올리고 "%d"라는 문자열을 스택에 올린후 scanf 함수를 호출한다.

 

 

입력받은 값이 0x01이 아니면 <main+263>으로 이동하라. 입력받은 값이 0x01이면 "telnet 203.245.15.76"이라는 문자열을 스택에 올리고, system 함수를 출력한다. 따라서 system("telnet 203.245.15.76") 함수가 호출되 telnet 접속을 시도한다.

 

 

 

입력받은 값이 0x02이 아니면 <main+285>으로 이동하라. 입력받은 값이 0x01이면 "telnet 203.238.129.97"이라는 문자열을 스택에 올리고, system 함수를 출력한다. 따라서 system("telnet 203.238.129.97") 함수가 호출되 telnet 접속을 시도한다.

 

 

입력받은 값이 0x03이면 "telnet 210.120.128.180"이라는 문자열을 스택에 올리고, system 함수를 출력한다. 따라서 system("telnet 210.120.128.180") 함수가 호출되 telnet 접속을 시도한다.

 

 

입력 받은 값 중 0x01, 0x02, 0x03 중 하나이면 <main+341>로 가라는 뜻이다.

 

 

1~3이 아닌 임의의 값이 입력되면 "잘못 입력하셨습니다. 접속을 종료합니다.\n"이라는 문자열을 스택에 올리고 printf 함수를 출력한다.

 

좀 더 신중히 생각해보면 지금 분석한 코드에는  세션을 끊는 처리가 없다. 이러한 세션을 끊는 처리는 환경설정 파일에 있다.

 

 

환경 설정 파일을 보면 tn 명령을 종료시키는 상황을 만들면 셸이 나타나지 않고 세션이 끊어진다. 

 

이제 gdb 분석이 끝났으니 공격을 해보자.

 

 

힌트 화면에서 Ctrl + C를 눌러 프로그램의 흐름을 막는다. 그러면 level6의 셸로 접속할 수 있다.

 

 

확인해보니 level6의 디렉토리에 의심스러운 password 파일이 있다. password 파일을 보자.

 

 

 

위와 같이 level7의 password를 확인할 수 있다.

'Wargame > FTZ' 카테고리의 다른 글

해커스쿨 FTZ level8  (0) 2017.08.20
해커스쿨 FTZ level7  (0) 2017.08.19
해커스쿨 FTZ level5  (0) 2017.08.11
해커스쿨 FTZ level4  (0) 2017.08.01
해커스쿨 FTZ level3  (0) 2017.07.31