[normaltic 비기너 클래스 1기] 2023-09-13 Drill Course 1주차 과제

2023. 9. 27. 12:08normaltic 비기너 클래스 1기/과제

Task 2 

 

 

nmap -sn 10.0.2.4/24

 

이번 문제는 공격대상 시스템의 IP 주소를 찾는 것에서부터 시작한다. 공격대상의 IP 주소는 10.0.2.6이다.

 

 

nmap -sCV 10.0.2.6 > scan_res

 

포트 스캔 결과 22, 80, 31337번 포트가 열려있는 것을 확인할 수 있다. 80번 포트가 웹 서비스를 제공 중이므로 웹 브라우저에 IP 주소를 입력해 보자.

 

 

searchsploit nginx

 

IP 주소를 입력하면 nginx라는 웹 서비스를 제공 중인 것을 확인 가능하다. 이제 이 웹 서비스 nginx의 취약점을 분석하기 위해 searchsploit 명령어를 사용하였다. 현재 80번 포트에서 서비스 중인 nginx의 버전은 1.10.3으로 포트 스캔 결과에  출력되어 있다. 그러나 해당 버전의 취약점은 없는 걸로 봐서 다른 루트를 찾아봐야 할 것 같다.

 

 

포트 스캔 결과에서 31337번 포트도 웹 서비스를 제공 중이다. IP 주소를 웹 브라우저에 입력한 결과 Not Found를 볼 수 있다. 그러나 포트 스캔 결과에서 해당 포트에 robots.txt가 있는 것을 확인할 수 있다. 

 

 

robots.txt에서 명시되어있는 .bashrc, .profile, taxes를 차례대로 입력했더니 .bashrc, .profile은 파일로 다운로드 받아졌고 taxes는 flag1이라는 웹 페이지를 제공하였다.

 

 

cat index.bashrc
cat index.profile

 

다운로드 받은 두 파일의 내용을 출력해 본 결과 딱히 별다른 정보는 없었다. 이번에는 해당 포트의 웹 디렉터리 스캔을 진행해 보자.

 

 

gobuster dir -u http://10.0.2.6:31337 -w /usr/share/dirb/wordlists/common.txt -t 60

 

해당 웹 페이지의 디렉터리를 스캔한 결과 .bash_history, .ssh 디렉터리가 추가로 있는 것을 확인하였다. .ssh 디렉터리가 있다는 것은 개인키를 이용하여 공격대상 시스템에 접속 가능한 가능성이 있다는 걸로 판단하였다.

 

 

 

역시 .ssh 디렉터리에 개인키와 공개키가 있는 것을 확인하였다. 이제 웹 브라우저에 id_rsa와 id_rsa.pub를 입력하였더니 해당 파일들을 다운로드 받을 수 있었다.

 

 

cat id_rsa.pub

 

우선 id_rsa.pub인 공개키의 내용을 출력하여 어떤 계정의 키(Key)인지 확인한다. simon이란 계정의 키인 걸로 확인이 되었다.

 

chmod 600 id_rsa
ssh -i id_rsa simon@10.0.2.6

 

이제 ssh로 접속하기 위해 개인키의 권한을 제한해 주고 접속을 시도해 보았다. 그러나 해당 개인키에는 passphrase가 걸려있는 것을 확인할 수 있었다.

 

 

ssh2john id_rsa > sshkey_pass
john --wordlist=/usr/share/wordlists/rockyou.txt sshkey_pass

 

passphrase를 크랙킹 하기 위해 개인키를 john 도구를 사용하기 적합하게 바꿔줘야 한다. 그리고 john 도구를 이용한 크랙킹 결과 starwars라는 passphrase를 갖고 있는 걸로 확인이 되었다.

 

 

ssh -i id_rsa simon@10.0.2.6

 

다시 ssh로 접속을 시도한 결과 simon계정으로 공격대상 시스템이 접속을 할 수 있었다.

 

 

sudo -l
find / -perm -4000 2> /dev/null

 

공격대상 시스템에 접속을 하고 난 후 기본적으로 해야 할 행동이 있는데 우선 sudo -l로 sudo 명령어를 사용가능한지, 그리고 suid가 걸려있는 파일을 찾는 것, 마지막으로 해당 계정의 홈 디렉터리에서 정보를 찾는 것이다. 앞의 두 활동에 대한 결과에서는 별다른 성과를 거두지 못했다. 이제 홈 디렉터리로 가서 정보를 찾아보자.

 

 

ls -al
cat .bash_history

 

홈 디렉터리 파일 리스트 출력 결과 .bash_history 파일을 읽을 수 있다. .bash_history는 해당 유저가 입력했던 명령어가 저장되어 있는 파일이다. 해당 파일의 내용을 출력해 본 결과 read_message라는 파일을 입력했던 걸로 확인이 되었다.

 

 

find / -name read_message 2> /dev/null
cd /usr/local/bin

 

read_message라는 파일을 찾아서 해당 디렉터리로 이동하였다.

 

 

./read_message

 

read_message파일을 실행해 보았더니 이름을 물어보길래 simon이라고 입력했더니 Simon이 아니라고 하여 다시 Simon이라고 입력했더니 추가적인 텍스트가 출력되었다. 출력된 텍스트의 내용은 해당 파일의 소스를 확인하고 싶으면 root의 홈 디렉터리에서 확인하라고 한다. 그럼 root의 홈 디렉터리로 이동하여 확인해 보자.

 

 

cd /root
ls -al

 

root 홈 디렉터리로 이동 후 파일 리스트를 출력해보니 read_message의 원본 소스 코드가 있는 것을 확인하였다.

 

 

소스 코드를 쭉 읽어봤더니 주목해야 할 부분들이 존재한다. 우선 buf라는 배열은 20의 크기를 가지며 buf배열에 데이터를 입력하는 함수로 gets가 쓰였다. gets함수로 대표적인 메모리 버퍼 오버플로우를 일으키는 함수이다. 즉 메모리 버퍼 오버플로우 공격을 사용하여 루트 권한을 얻을 수 있다는 얘기이다.

 

해당 소스 코드로 메모리 버퍼 오버플로우가 일어나는 원리는 gets 함수로 buf에 데이터를 20자리 이상 입력하게 되면 초과한 내용은 program이라는 배열에 덮어 씌워지게 된다. 그리고 program배열은 조건문이 실행(앞 5자리가 authorized배열과 비교했을 때 같다면)되면 execve라는 함수로 실행이 되게 소스 코드가 구성되어 있다. 그렇다면 덮어 씌우는 명령어는 root 계정으로 실행이 되는 쉘을 입력해 주면 된다.

 

 

Simon+15글자+/bin/sh를 입력하였더니 euid가 0으로 root 권한을 얻을 수 있었다.