이번에 풀이할 문제는 vulnhub의 basic pentesting 문제다. 지금까지 풀이한 wargame들과 다르게 vulnhub는 가상머신을 제공해주는데, 해당 가상머신에서 취약점을 찾아 최종적으로 root 권한을 얻는 것이 목적이다. 모의해킹 wargame이라고 생각하면 된다.
문제 파일을 다운받고 vmware를 통해 환경을 구축한뒤 부팅해봤다.(network 설정은 NAT로 했다.)
로그인 화면이 나타나는데, id는 marlinspike로 고정된 것을 알 수 있다. 당연히 password는 주어지지 않는다. FTZ, LOB 같은 가상머신 wargame을 상상했던 나는, password 정보가 주어지지 않아 처음에 많이 해맸다.
모의 해킹의 절차를 참고하여 단계를 선정해서 풀이를 진행하겠다.
1. 정보 수집
- 대상 ip를 알아내기
- 운영체제, 서비스 종류 및 버전
2. 취약점 점검
- 정보 수집 단계를 통해 알아낸 서비스의 종류, 버전을 바탕으로 취약점 서칭
(exploitDB 등을 통해 서칭 가능)
3. 침투(exploit)
- 알아낸 취약점을 바탕으로 침투(root 권한 획득)
(metasploit 등을 통해 exploit 가능)
-정보 수집-
맨 첫 단계는 정보 수집이다. 현재 대상의 ip, 운영되는 서비스에 대한 정보가 하나도 없으므로 먼저 필요한 정보들을 수집해야한다.
공격을 진행할 칼리 리눅스의 ip는 192.168.246.137이다. 칼리 리눅스 역시 NAT 환경으로 network 설정이 돼 있으므로 192.168.246.XXX가 공격 대상의 ip 일부일 것이다.
nmap의 -sn 옵션을 사용한다면 목적지 네트워크 대역에 핑을 날려 응답이 있는 호스트만 보여준다.
이 옵션을 이용해 192.168.246.0/24를 목적지로 준다면 192.168.246로 시작하는 모든 ip에 ping을 날려 살아있는(응답이 있는) 호스트들을 알아낼 수 있다.
위 결과를 보면 192.168.246.2, 192.168.246.137, 192.168.246.139가 응답이 있는 것을 알 수 있는데, 192.168.246.137은 위에서 확인했듯이 사용하고 있는 칼리 리눅스의 ip 주소이므로 2, 139 중 타겟 ip가 있을 것이다.
서버에서 root 권한을 획득하는 것이기 때문에 타겟 서버에 웹 서버가 존재할거라 생각해 192.168.246.2, 192.168.246.139에 각각 firefox로 접속해봤다.
예상대로 타겟에는 웹 서버가 존재했다.(운이 좋았다.) 192.168.246.139가 타겟의 ip인 것을 알 수 있다.
ip를 알아냈으므로 ip를 바탕으로 스캔을 진행해 타겟의 서비스, 버전을 알아내겠다.
nmap의 -sV 옵션을 사용한다면 대상 호스트의 운영체제, 각 포트 및 서비스(프로그램), 버전을 알아낼 수 있다.
위는 타겟 ip를 대상으로 -sV 옵션을 사용한 결과다. 이 옵션을 통해 아래와 같은 정보를 얻을 수 있었다.
port | service | version |
21 | ftp - ProFTPD | ProFTPD 1.3.3c |
22 | ssh - OpenSSh | OpenSSH 7.2p2 |
80 | http | Apache |
서비스 및 서비스의 버전 정보를 수집하는 가장 큰 이유는 서비스와 버전을 기반으로 exploit-db 등에서 알려진(1-day) 취약점 및 exploit 코드를 찾을 수 있기 때문이다.
위는 exploit-db 사이트에서 ProFTPD 1.3.3c를 시험삼아 검색한 모습이다. 서비스와 버전을 검색했을 뿐인데, 취약점과 exploit 코드 정보들이 나오는 것을 볼 수 있다.
-취약점 점검-
정보 수집 단계에서 얻은 서비스와 버전 정보를 바탕으로 취약점 및 공격 코드를 찾을 것이다. 직접 취약점을 찾고 공격 코드를 짜면 좋겠지만 아직 그 정도의 실력이 안되고, 이 문제를 풀어보는 취지가 모의해킹의 절차, 방식 학습 및 동기 부여가 목적이므로 exploit-db에 서비스와 버전을 검색함으로써 취약점에 대한 공격 코드를 찾을 것이다.
exploit-db 홈페이지에서 검색하는 방법도 있겠지만, 나는 exploit-db가 제공하는 searchsploit 명령어를 사용해 ProFTPD 1.3.3c에 대한 취약점을 찾았다.(OpenSSH, Apache 등의 취약점도 서칭했으나 해당 버전에 맞으면서 공격에 적당한 취약점과 코드는 찾을 수 없었다.)
ProFTPD 1.3.3c에 대한 취약점은 2가지가 나오는데, 이 중 Metasploit에서 제공하는 backdoor command execution exploit을 사용할 것이다.
-침투(exploit)-
searchsploit 명령어를 통해 metasploit에서 제공하는 ProFTPD에 대한 취약점을 찾았으므로, 이 취약점을 활용해 타겟 서버의 root 권한을 얻을 것이다.
일단 metasploit에서 제공하는 콘솔 인터페이스인 msfconsole을 열었다.
그 다음 search 명령어를 통해 searchsploit을 통해 찾았던 취약점 모듈의 경로를 찾아냈고, use 명령어를 사용해 해당 모듈을 선택했다.
options 명령어를 사용한다면 해당 모듈을 사용할 때 필요한 옵션들을 확인할 수 있다. 해당 모듈의 경우 RHOSTS와 RPORT가 필요한데, 여기서 RHOSTS는 타겟의 ip, RPORT는 타겟의 포트를 넣어주면 된다.
set 명령어를 사용한다면 각 옵션에 값을 넣어줄 수 있다. 타겟의 ip, 포트를 넣어줬다.
이대로 exploit을 진행하면 될줄 알았지만 payload 옵션이 선택되지 않았기 때문에 진행할 수 없었다. 여기서 몰랐던 개념을 깨닫게 됐는데, 모듈은 그냥 취약점에 대한 공격을 수행해주고, 공격을 통해 수행할 동작은 payload를 통해 작동하는 것이다.
show payloads 명령어로 해당 취약점에 대한 payloads들을 찾았고, 이 중 cmd/unix/reverse (reverse shell connection으로 추정)를 사용하기로 했다.
set PAYLOAD로 payload를 옵션에 등록해줬고 해당 payload에 필요한 option을 확인한 뒤 LHOST에 칼리 리눅스의 ip를 기입해줬다.
모든 준비를 마쳤으므로 exploit 명령어를 통해 공격을 했다. whoami 명령어를 입력했을 때 root가 출력되고, ls 명령어도 잘 작동하는 걸 봐서 공격에 성공했음을 알 수 있다.
쉘을 얻었기 때문에 문제는 푼 것이지만 로그인도 하고 싶어져 marlinspike 계정의 password도 알아내보기로 했다.
shadow 파일을 읽어 marlinspike 계정의 암호화된 비밀번호를 알아냈다. ftz에서 배운 지식을 활용해 이 암호화된 비밀번호를 john the ripper 툴을 통해 크래킹을 시도해보기로 했다.
passwd라는 이름으로 텍스트 파일을 만든 후 john the ripper의 --show 옵션을 이용해 크랙을 시도하니, 정말로 크랙이 됐다. marlinspike 계정의 password는 marlinspike로 id와 똑같았다.(뭔가 허무하다..)
알아낸 password로 로그인을 해보니 성공한 것을 볼 수 있다. gg!
뜬금없이 vulnhub 문제를 풀어본 이유는 nmap, metasploit, exploit-db을 활용해 한 번 모의해킹을 해보고 싶다는 생각 때문이었다. 평소 보안프로젝트라는 유튜브 채널을 즐겨보는데, 이 툴들 또한 이 유튜브 채널에서 소개해준 모의해킹 도구였다. 이대로 이 문제에 대한 공부를 끝낸다면 결국 툴을 이용해 문제를 푼 툴키디에 불과하므로 사용한 취약점에 대한 공부와 exploit 코드를 분석해볼 계획이다.
또한 nmap, metasploit에 대해서도 좀더 자세히 공부를 하고 지금껏 팽개쳐둔 웹 해킹도 공부를 시작해, 모의해킹이라는 진로에 대해서도 진지하게 생각해볼 것이다.