<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: José Vitor Alves Pignataro</title>
    <description>The latest articles on DEV Community by José Vitor Alves Pignataro (@vitorpignataro).</description>
    <link>https://dev.to/vitorpignataro</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F901739%2F557cc4af-e72a-4eb3-aef8-b86f7ee5c2ff.jpeg</url>
      <title>DEV Community: José Vitor Alves Pignataro</title>
      <link>https://dev.to/vitorpignataro</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/vitorpignataro"/>
    <language>en</language>
    <item>
      <title>Write-up: Git Exposed, weak password reset and account takeover.</title>
      <dc:creator>José Vitor Alves Pignataro</dc:creator>
      <pubDate>Tue, 02 Aug 2022 14:39:06 +0000</pubDate>
      <link>https://dev.to/vitorpignataro/write-up-git-exposed-weak-password-reset-and-account-takeover-360c</link>
      <guid>https://dev.to/vitorpignataro/write-up-git-exposed-weak-password-reset-and-account-takeover-360c</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Vx2lHpKg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/plntsh7sqdybvpxgtl6u.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Vx2lHpKg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/plntsh7sqdybvpxgtl6u.jpg" alt="Image description" width="880" height="495"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Olá, primeiramente antes de mais nada e não menos importante, me chamo José Vitor, trabalho atualmente como desenvolvedor de software, automação de processos e desenvolvimento de bots.&lt;/p&gt;

&lt;p&gt;Sou entusiasta em Segurança da Informação e é nela em que aplico meus estudos, então sempre que possível estou dedicando meu tempo em me desenvolver cada vez mais nesta área, e quando possível realizo testes de seguranças como um trabalho extra.&lt;/p&gt;

&lt;p&gt;Este write-up é referente a um teste que realizei em um sistema o qual me foi solicitado, onde mostro os métodos aplicados para realizar o teste e falo um pouco sobre a importância de saber programação dentro da área de segurança.&lt;/p&gt;

&lt;p&gt;Buscando ser breve, não irei me aprofundar em cada tópico abaixo, e sim mostrar o processo e explicar o básico do que está acontecendo para melhor seguirmos durante o write-up.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Reconhecimento&lt;/li&gt;
&lt;li&gt;Exploração&lt;/li&gt;
&lt;li&gt;Explorando um pouco mais a fundo&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Reconhecimento.&lt;/strong&gt;&lt;br&gt;
Nesta etapa iniciei o reconhecimento geral do sistema, enumerando portas, tecnologias, arquivos, diretórios etc...&lt;/p&gt;

&lt;p&gt;Mas neste caso vou focar na enumeração de diretórios em que nos leva a falha de git exposed. Utilizando uma ferramenta autoral que desenvolvi para realizar o fuzzing em aplicações Web, obtive a seguinte saída&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--OMHZTfen--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nqe9nvcuuyaopj1qa7or.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OMHZTfen--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nqe9nvcuuyaopj1qa7or.png" alt="Image description" width="697" height="230"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Aqui temos o resultado da enumeração e um possível git exposto na aplicação, verificando manualmente conseguimos ver mais a fundo os repositórios abertos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;.git/HEAD&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Hb_vIvo4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vwqdeifqs4aq2t9cygzl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Hb_vIvo4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vwqdeifqs4aq2t9cygzl.png" alt="Image description" width="595" height="80"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;.git/config&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mjMSJV1F--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wj47xrzib34bral72fu1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mjMSJV1F--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wj47xrzib34bral72fu1.png" alt="Image description" width="582" height="251"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;.gitignore&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7gnuQBtL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/utobo8acw697o9s6ifvl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7gnuQBtL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/utobo8acw697o9s6ifvl.png" alt="Image description" width="551" height="186"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exploração.&lt;/strong&gt;&lt;br&gt;
Confirmando então que os repositórios estão abertos, podemos realizar o dump do git explorando a falha de git exposed, para isso costumo utilizar a ferramenta git-dumper que pode ser acessada através do link: &lt;a href="https://github.com/arthaud/git-dumper"&gt;https://github.com/arthaud/git-dumper&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2II3x7vn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d6at4czl75852tn55kf4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2II3x7vn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d6at4czl75852tn55kf4.png" alt="Image description" width="589" height="57"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Com isso já foi possível explorar a vulnerabilidade e dumpar o repositório da aplicação em minha máquina.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xcGLSn0q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/01heey5mb3k7ad4m6te7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xcGLSn0q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/01heey5mb3k7ad4m6te7.png" alt="Image description" width="354" height="369"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Explorando um pouco mais a fundo.&lt;/strong&gt;&lt;br&gt;
Aqui entramos na importância de ter uma boa base em programação, explorando um pouco os arquivos da aplicação me deparei com uma função que fazia o reset de senha do usuário em caso de esquecimento de senha, basicamente a função criava um hash para a nova senha e utilizava os 8 primeiros dígitos deste mesmo hash para gerar a nova senha.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LfrcqtFI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3umn9d0kk1bw2i5yuzp5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LfrcqtFI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3umn9d0kk1bw2i5yuzp5.png" alt="Image description" width="589" height="349"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Reproduzindo a mesma lógica em minha máquina com seguinte código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;?php

$randomPassword = uniqid(rand());
$emailPassword = substr($randomPassword, 0, 8);

echo "HASH: $randomPassword | PasswordReset: $emailPassword"

?&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Resultando na seguinte saída:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Wb1TVo6z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y2vwyekfas0bdmur6l8c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Wb1TVo6z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y2vwyekfas0bdmur6l8c.png" alt="Image description" width="449" height="37"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Confirmando então, ele utiliza sempre os oito primeiros dígitos gerados inicialmente para criar a nova senha, levando em conta isso temos então um &lt;strong&gt;weak password reset&lt;/strong&gt; que podemos explorar elevando para um possível Account Takeover.&lt;/p&gt;

&lt;p&gt;Sabendo então que a nova senha terá sempre um tamanho único e utiliza números, podemos realizar um ataque de brute force.&lt;/p&gt;

&lt;p&gt;Primeiramente realizo o reset em uma conta disponibilizada para os testes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--23Mt_85A--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gtnqdzz5vsmdsip4tcfg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--23Mt_85A--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gtnqdzz5vsmdsip4tcfg.png" alt="Image description" width="593" height="190"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Então simulo um login e faço a interceptação utilizando um proxy para capturar os parâmetros passados para executar o login de um usuário.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BaHNuE0D--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3vf1po24xcjke99kxgxi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BaHNuE0D--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3vf1po24xcjke99kxgxi.png" alt="Image description" width="594" height="86"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora utilizando a ferramenta wfuzz, realizei o brute force na aplicação com o seguinte comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;wfuzz -c -z file,passwordlist.txt --hw 262 -d "empEmail=***@***.com.br&amp;amp;password=FUZZ&amp;amp;submit=signIn" https://***/login.php 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após algum tempo temos o retorno da possível senha encontrada.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7YUXb8Jl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1khxv3f15whbh1x08f39.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7YUXb8Jl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1khxv3f15whbh1x08f39.png" alt="Image description" width="365" height="70"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Então bastou realizar a tentativa de login e garantir o acesso a conta, realizando então o &lt;strong&gt;Account Takeover&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--X9u48nir--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0s9w78v8tez67c99g5og.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--X9u48nir--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0s9w78v8tez67c99g5og.png" alt="Image description" width="397" height="158"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusão&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Este é meu primeiro write-up publicado oficialmente, tendo em vista que todo processo de teste é sempre carregado de um enorme aprendizado, agregando sempre experiência a cada processo, espero ter conseguido transmitir um pouco de todo este aprendizado neste artigo.&lt;/p&gt;

&lt;p&gt;Fique a vontade para entrar em contato a qualquer momento, você pode encontrar minhas redes sociais no meu site logo abaixo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://vitorpignataro.github.io/Portfolio-Jose-Vitor/homepage.html"&gt;https://vitorpignataro.github.io/Portfolio-Jose-Vitor/homepage.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Até a próxima.&lt;br&gt;
José.&lt;/p&gt;

</description>
      <category>security</category>
      <category>cybersecurity</category>
      <category>hacking</category>
      <category>informationsecurity</category>
    </item>
  </channel>
</rss>
