4주 차 팀세션에서는 FTZ level1~5단계를 함께푸는 활동을 진행했다.
팀원들과 같이 푼 문제들을 혼자 다시 풀어보면서 복습하는 내용입니다.
먼저 ls -al
명령어로 리스트를 확인한 다음, 누가봐도 힌트처럼 생긴 파일을 cat
으로 확인해 보았다.
find
명령어와 옵션들을 통해 level2권한에 setuid가 걸린 파일을 권한 거부된 것을 제외하고 검색했더니
ExecuteMe라는 파일이 검색되었다.
바로 실행
레벨 2의 권한으로 원하는 명령어를 입력했다.
/bin/bash
쉘코드로 level2의 권한을 얻어주고
my-pass
로 패스워드 얻기 성공!
레벨 2의 힌트파일!
level1과 동일하게 일단 setid 권한이 걸린 파일부터 찾아주었다.바로 실행!
vim 사용법을 다 까먹어서 다시 천천히 찾아봤다.
ESC로 모드 바꾸는 것도 까먹어서 헤매다가 사용법 정독하고 다시 시작~
:!bin/bash
느낌표를 앞에 붙이면 vim을 나가지 않고도 쉘명령을 실행시킬 수 있다!
이렇게 vim으로 쉘을 얻고 my-pass
로 level3의 패스워드까지 획득할 수 있었다.
음...
level3힌트는 좀 길다...
코드를 살펴보면 인자를 받아서 system에 cmd를 실행시키는 코드이다.
즉, system에 들어갈 명령어는 dig @ [인자] version.bind chaos txt
argc : 프로그램을 실행할 때 인자로 전달된 문자열길이
Ex ) ./autodig abc -> argc = 2
argv : 인자로 전달된 문자열
Ex ) ./autodig abc -> argv[0] = autodig , argv[1] = abc
그래서 일단 find
옵션으로 검색도 해보고 (이제 저 한 줄은 다 외운듯)
파일 실행도 해보니
코드대로 Auto Digger Version 0.9라고 잘 출력된다
일단 setID권한이 걸려있으니 저 파일을 속여보자
bin 디렉토리로 이동한 다음
./autodig "sh;my-pass"
로 레벨 14의 패스워드를 얻어냈다.
이때 .
은 현재 디렉토리를 의미
""
를 사용해 문자열으로 명령을 전달, ;
으로 쉘권한과 동시에 my-pass
를 전달했다.
즉, sh;my-pass를 system에서 실행시키면서 level4의 권한으로 my-pass를 실행시킬 수 있었던 것이다!
들어가자 마자 습관성 ls -al
cat hint
누군가 백도어를 심어놓았다고 뜬다
백도어(backdoor)란?
정상적인 인증 절차를 거치지 않고, 컴퓨터와 암호 시스템 등에 접근할 수 있도록 하는 장치
설계자가 개발단계에서의 테스트, 유지 보수 등을 위해 일부로 특수 계정을 허용하도록 남겨놓을 수도 있음
악용의 위험 多
=>그러면 이 백도어를 이용해 level5의 패스워드를 알아내보자!
바로 디렉토리로 이동하니 위에 누가봐도 backdoor인 파일이 하나있다.
당장 이동해서 파일을 열어보니
서버 경로가 나와있다.
이때 /etc/xinetd.d/ 경로에 대해 알아볼 필요가 있다.
xinetd는 네트워크에 들어오는 요청을 듣고, 거기에 맞는 적절한 서비스를 실행시키는데, /etc/xinetd.d/ 하위 경로에 각 서비스들에 대한 설정 파일을 보관한다.
위 백도어 파일내용을 기준으로 설명하면
- service : 말그대로 서비스 이름 위 파일에선 finger 서비스에 대한 xinetd 설정을 한다는 뜻이다. (finger에 대해선 아래서 다룰 예정)
- disable : 해당 서비스를 서비스 할 것인가(n) 아닌가 (y)를 설정하는 옵션
- socket_type : TCP일 경우 stream / UDP일 경우에는 dgram 이 외에도 서비스의 성격에 따라 다른 것이 올 수 있음
- wait : xinetd가 서비스 요청을 받은 경우 이후에 즉시 다른 요청을 처리할 것인지(n) 아닌지(y)의 여부를 결정하는 지시자 (stream일 경우에는 반드시 no -> 현재 요청 외 다른 접속 요청을 새롭게 시작해 처리)
- user : 이 서비스를 어떤 사용자 권한으로 서비스 할 것인가? -> 위 파일에선 level5
- server : 해당 서비스 요청이 들엉왔을 경우에 해당 서비스를 담당하게 될 데몬파일(프로그램)의 절대경로
위 파일에서 finger 라는 서비스에 요청이 들어왔을 경우에 /home/level4/tmp/backdoor 라는 프로그램(데몬)을 실행시킨다는 것.- log_on_failure : 서버에 접속을 실패했을 때, 로그파일에 기록하는 내용을 설정
+=USERID -> 접속 실패시 정의된 항목 외에 USERID값, 즉 접속 사용자의 id를 log파일에 추가로 기록하라는 뜻
=> level4사용자가 finger라는 서비스 요청이 들어오게 했을 경우, /home/level4/tmp/backdoor 프로그램을 level5사용자의 권한으로 실행시키겠다.
서버로 당장 이동
근데 /home/level4/tmp에는 backdoor파일이 없다...!
내가 만들라는 뜻!
트레이너 과정에서 배운 파일 생성, 컴파일 방법으로 backdoor.c파일을 만들고 원하는 코드를 작성한 뒤, 컴파일 해줬다.
이때, 이 파일을 실행시켜야 하는데 위에서 알아봤듯이 finger서비스를 실행시켜야 된다.
finger
시스템 상의 사용자의 대한 정보를 조회함 (/etc/passwd 파일에서)
옵션이 아무 것도 주어지지 않으면 현재 시스템에 로그인되어있는 사용자들을 보여줌
-s
사용자의 로그인 이름, 실제이름, 로그인 시간 등을 보여줌
-l
-s 옵션정보에 몇 가지를 추가해 여러 줄에 걸쳐서 보여줌
-p
-l에서 .plan과 .project 파일을 보이지 않음
finger
현 시스템에 로그인 되어있는 사용자들을 보여줌
finger user명
host명 없이 user를 적으면 로컬에 접속한다.
finger @host명
host명만 적으면 해당 서버에 있는 모든 유저의 정보를 출력한다.
(host명과 user명을 모두 기입하면 원격서버의 사용자 계정정보 확인가능)
그래서 로컬 호스트로 finger서비스 요청을 넣었고 xinetd에서 backdoor.c를 level5의 권한으로 잘 실행시켜서 패스워드를 알아낼 수 있었다.
cat hint
=> 그럼 내가 미리 /tmp 디렉토리에 level5.tmp를 만들어두고 /level5 프로그램을 실행시키면 거기에 덮어쓰겠네?
진행시켜
/tmp로 이동해서 파일을 생성했다!
이제 프로그램을 실행시켜보자!
프로그램을 실행시키고 다시 만들어둔 level5.tmp파일을 열어 패스워드를 얻을 수 있었다.
문제 풀면서 막힐 때는 너무 어려웠는데
하나하나 알아가면서 이해하는 재미가 있었다. 그래도 갈 길이 까마득하다.
나머지 레벨도 언젠가 풀어봐야지!