Go: Criando seu próprio Fuzzer e Explorando a Concorrência com Canais

Go: Criando seu próprio Fuzzer e Explorando a Concorrência com Canais

Aprenda a construir um fuzzer rápido em Go, utilizando canais e goroutines para processamento concorrente. Este artigo detalha a modularização de código e a comunicação eficiente entre processos.

MundiX News·27 de junho de 2026·7 min de leitura·👁 1 views

Neste artigo, exploraremos as principais técnicas de trabalho com canais em Go e nos familiarizaremos com os métodos e práticas de escrita de código multithread. Como exemplo prático, criaremos nosso próprio fuzzer rápido que verificará a existência de arquivos de um dicionário em um host.

A implementação de concorrência em Go, através da troca de mensagens entre threads independentes, é chamada de CSP (Communicating Sequential Processes). Sua base são os canais, que transmitem mensagens de uma thread (goroutine) para outra.

Se você está familiarizado com o conceito de pipes de sistema, já terá uma ideia geral. No entanto, o runtime do Go não utiliza os recursos do sistema operacional; ele possui sua própria implementação de goroutines e canais.

Não nos aprofundaremos na metodologia de fuzzing em si: o objetivo principal é dominar Go, portanto, vamos nos concentrar nas ferramentas fornecidas pela linguagem de programação. Assim, a implementação será a mais simples possível: adicionaremos uma palavra do dicionário ao nome do host, executaremos uma requisição GET no endereço resultante e salvaremos o código de resposta.

Você pode obter um dicionário, por exemplo, aqui, mas recomendo não pegar uma lista muito grande, e sim escrever a sua com cerca de dez posições – isso é mais do que suficiente para começar.

Info: Frequentemente, o modelo CSP é descrito com uma afirmação: "não implemente comunicação através do compartilhamento de memória; em vez disso, compartilhe memória através da comunicação".

Web: O modelo CSP foi desenvolvido e descrito por Charles Antony Hoare – talvez você já tenha ouvido falar dele em relação ao algoritmo quicksort (qsort).

Criaremos um novo módulo:

bash
mkdir dirfuzzer
cd dirfuzzer
go mod init dirfuzzer
touch main.go

Dividindo o Código em Módulos

No arquivo main.go, inseriremos o seguinte código:

go
package main

import (
	"bufio"
	"fmt"
	"io"
	"net/http"
	"os"
	"strings"
	"sync"
	"time"
)

type Result struct {
	Name string
	Code int
}

// produce gera tarefas para processamento, combinando o host com os valores lidos do filename,
// e os coloca no canal outCh.
func produce(filename string, host string, outCh chan<- string) {
	file, err := os.Open(filename)
	if err != nil {
		fmt.Fprintf(os.Stderr, "opening %s: %v\n", filename, err)
		return
	}
	defer file.Close()

	scanner := bufio.NewScanner(file)
	for scanner.Scan() {
		s := strings.TrimSpace(scanner.Text())
		if s == "" {
			continue
		}
		outCh <- "https://" + host + "/" + s
	}

	if err := scanner.Err(); err != nil {
		fmt.Fprintf(os.Stderr, "reading %s: %v\n", filename, err)
	}
}

// worker recebe valores do canal inCh, enquanto ele estiver aberto, executa o processamento e coloca os resultados em outCh.
func worker(c *http.Client, inCh <-chan string, outCh chan<- Result) {
	for job := range inCh {
		resp, err := c.Get(job)
		if err != nil {
			continue
		}
		resp.Body.Close()
		io.Copy(io.Discard, resp.Body)

		result := Result{
			Name: job,
			Code: resp.StatusCode,
		}
		outCh <- result
	}
}

// collect recebe valores do canal resultCh, enquanto ele estiver aberto, e os escreve no arquivo filename.
func collect(filename string, resultCh <-chan Result) {
	dstFile, err := os.Create(filename)
	if err != nil {
		fmt.Fprintf(os.Stderr, "creating %s: %v\n", filename, err)
		return
	}
	defer dstFile.Close()

	writer := bufio.NewWriter(dstFile)
	for r := range resultCh {
		s := fmt.Sprintf("%s - %d %s\n", r.Name, r.Code, http.StatusText(r.Code))
		_, err = writer.WriteString(s)
		if err != nil {
			fmt.Fprintf(os.Stderr, "writing to %s: %v\n", filename, err)
		}
	}

	if err = writer.Flush(); err != nil {
		fmt.Fprintf(os.Stderr, "writing to %s: %v\n", filename, err)
	}
}

func main() {
	// TODO
}

Como você pode ver, dividimos logicamente os trechos de código em funções separadas e isoladas, de acordo com os papéis que são atribuídos a esse código.

A função produce() gera tarefas para processamento posterior. Ela lê linhas de uma lista e forma URLs para as quais as tentativas de conexão serão feitas. O processamento em si está fora da responsabilidade desta função e não afeta seu código. Outros nomes frequentemente usados para tal código são: generate, source.

A função worker() processa as tarefas. Neste caso, é executada uma requisição GET ao servidor e o código de resposta é salvo. Como você pode ver, a função "não sabe" nada sobre a origem das tarefas, nem sobre o destino dos resultados – isso não lhe diz respeito. Outros nomes frequentemente encontrados para tal função são: process, handle.

A função collect() lê os resultados e os salva em um arquivo. Por analogia com as anteriores, ela não sabe e não deve saber de onde e como esses resultados foram obtidos. Ela tem apenas uma área de responsabilidade claramente definida – coletar e salvar. Outros nomes frequentemente encontrados são: consume, sink, save.

Essa divisão incorpora o princípio de construção de sistemas de software loose coupling, high cohesion (uma das variantes de tradução: "acoplamento fraco, alta coesão"). De acordo com este princípio, o sistema é construído a partir de componentes separados que dependem minimamente uns dos outros (isso é o loose coupling). Ao mesmo tempo, cada componente executa um papel claramente definido, e o código responsável por uma determinada função está concentrado dentro de seu "próprio" componente, e não espalhado por outros (e isso é o high cohesion).

Essa abordagem facilita a compreensão do funcionamento do sistema, permite a aplicação de testes modulares, melhora a reutilização de código e possibilita o aumento de funcionalidades no futuro.

Se quisermos, por exemplo, salvar os resultados em outro formato ou, em vez de escrever em um arquivo, enviá-los pela rede para outro servidor – só precisamos substituir o componente collect, sem tocar nos outros e sem sequer ler seu código. Este é um princípio geral, aplicável não apenas a funções ou classes separadas, mas a quaisquer componentes de um sistema de software em um sentido amplo.

Info: A divisão de um grande bloco monolítico de código que resolve uma determinada tarefa em componentes separados é chamada de modularização. Não sei sobre você, mas acho difícil até pronunciar, por isso prefiro o conceito relacionado – decomposição. Embora, é claro, seja mais sobre a abordagem para resolver um problema do que sobre a estruturação da implementação dessa solução.

Canais

Executaremos essas funções como goroutines separadas. Ao mesmo tempo, abandonaremos a abordagem "clássica" de troca de informações através de objetos compartilhados protegidos por mutexes. Em vez disso, utilizaremos canais – uma ferramenta especial de comunicação entre goroutines. Canais são thread-safe por definição e não requerem o uso de mutexes ou outros primitivos de sincronização.

O restante do conteúdo está disponível apenas para membros.

Materiais das últimas edições tornam-se disponíveis individualmente apenas dois meses após a publicação. Para continuar a leitura, é necessário se tornar um membro da comunidade "Xakep.ru".

Junte-se à comunidade "Xakep.ru"!

A associação à comunidade durante o período especificado lhe dará acesso a TODO o material "Xaker", permitirá baixar as edições em PDF, desativará a publicidade no site e aumentará seu desconto pessoal acumulado!

Saiba mais

Já sou membro "Xakep.ru"

← Anterior

No Brasil, sistema de alerta de emergência foi hackeado

🛡️⚡

Pare de pesquisar. Comece a hackear.

O MundiX é seu copiloto de pentest com IA: comandos exatos, análise de outputs e próximo passo na kill chain — em segundos.

Testar grátis por 7 dias →

Sem cartão para começar · Planos a partir de R$49/mês

📤 Compartilhar & Baixar

🧰 Ferramentas recomendadas

Divulgação: alguns links são patrocinados. Podemos receber comissão se você comprar — sem custo extra para você. Só indicamos o que faz sentido para a comunidade.

Aprendendo Kali Linux: Teste de segurança, pentest e hacking ético

Aprendendo Kali Linux: Teste de segurança, pentest e hacking ético

Com centenas de ferramentas pré-instaladas, a distribuição Kali Linux facilita o trabalho de os profissionais de segurança começarem a fazer testes de segurança rapidamente. No entanto, com mais de 600 ferramentas em seu arsenal, o Kali Linux também pode ser desafiador. A nova edição deste prático livro abrange as atualizações nas ferramentas e inclui uma melhor abordagem da análise forense e da engenharia reversa. Ric Messier, autor, não fica apenas no teste de segurança, mas também faz uma abordagem sobre a execução de análise forense, incluindo a análise em disco e na memória, assim como alguma análise básica de malware. • Explore as diversas ferramentas disponíveis no Kali Linux • Entenda o valor do teste de segurança e examine os tipos de teste disponíveis • Aprenda os aspectos básicos do pentest em todo o ciclo de vida do ataque • Instale o Kali Linux em vários sistemas, tanto físicos quanto virtuais • Descubra como usar diferentes ferramentas destinadas à segurança • Estruture um teste de segurança baseado nas ferramentas do Kali Linux • Estenda as ferramentas do Kali para criar técnicas de ataque avançadas • Use o Kali Linux para ajudar a criar relatórios quando o teste terminar “A abordagem concisa, clara e baseada na experiência adotada por Ric Messier para a introdução do Kali Linux e dos testes de cibersegurança é incomparável. Este livro é uma leitura excelente e acessível para iniciantes e um recurso valioso para qualquer pessoa.” —Alexander Arlt, Consultor sênior de segurança, Google

Ver na Amazon
Gshield 2 em 1 Hub Extensor Conector USB-C + USB-A e Adaptador de Rede Ethernet LAN RJ45 com 3 Entradas USB 3.0 até 5 Gbps em Liga de Alumínio para Computador e Notebook, Cinza

Gshield 2 em 1 Hub Extensor Conector USB-C + USB-A e Adaptador de Rede Ethernet LAN RJ45 com 3 Entradas USB 3.0 até 5 Gbps em Liga de Alumínio para Computador e Notebook, Cinza

Compatível com portas USB-C e USB-A, ideal para ampliar a conectividade de dispositivos como MacBook Pro e outros com portas USB-C. Inclui um adaptador USB-A extra, proporcionando uma conexão Ethernet estável e veloz de até 1 Gbps, perfeita para filmes, jogos online e videoconferências. Oferece três portas USB 3.0 com velocidades de transferência de até 5 Gbps, permitindo conectar mouse, teclado, discos rígidos e outros periféricos. Fabricado em alumínio durável, garantindo longa vida útil e resistência ao uso diário. Design compacto e leve, ideal para viagens de negócios e uso diário, facilitando o transporte e armazenamento. Funciona com Windows 10/8.1/8, Mac OS e Chrome OS, oferecendo versatilidade incomparável para diversas necessidades de conectividade. Assegura uma conectividade estável e rápida, perfeita para tarefas exigentes como transferência de dados, streaming e mais.

Ver na Amazon
Hacking APIs: Breaking Web Application Programming Interfaces

Hacking APIs: Breaking Web Application Programming Interfaces

Hacking APIs is a crash course on web API security testing that will prepare you to penetration-test APIs, reap high rewards on bug bounty programs, and make your own APIs more secure. You'll learn how REST and GraphQL APIs work in the wild and set up a streamlined API testing lab with Burp Suite and Postman. Then you'll master tools useful for reconnaissance, endpoint analysis, and fuzzing, such as Kiterunner and OWASP Amass. Next, you'll learn to perform common attacks, like those targeting an API's authentication mechanisms and the injection vulnerabilities commonly found in web applications. You'll also learn techniques for bypassing protections against these attacks. In the book's nine guided labs, which target intentionally vulnerable APIs, you'll practice: Enumerating APIs users and endpoints using fuzzing techniques Using Postman to discover an excessive data exposure vulnerability Performing a JSON Web Token attack against an API authentication process Combining multiple API attack techniques to perform a NoSQL injection Attacking a GraphQL API to uncover a broken object level authorization vulnerability

Ver oferta
Gray Hat Hacking: The Ethical Hacker's Handbook, Sixth Edition

Gray Hat Hacking: The Ethical Hacker's Handbook, Sixth Edition

Up-to-date strategies for thwarting the latest, most insidious network attacks This fully updated, industry-standard security resource shows, step by step, how to fortify computer networks by learning and applying effective ethical hacking techniques. Based on curricula developed by the authors at major security conferences and colleges, the book features actionable planning and analysis methods as well as practical steps for identifying and combating both targeted and opportunistic attacks. Gray Hat Hacking: The Ethical Hacker's Handbook, Sixth Edition clearly explains the enemy's devious weapons, skills, and tactics and offers field-tested remedies, case studies, and testing labs. You will get complete coverage of Internet of Things, mobile, and Cloud security along with penetration testing, malware analysis, and reverse engineering techniques. State-of-the-art malware, ransomware, and system exploits are thoroughly explained. Fully revised content includes 7 new chapters covering the latest threats Includes proof-of-concept code stored on the GitHub repository Authors train attendees at major security conferences, including RSA, Black Hat, Defcon, and B-Sides

Ver na Amazon
Bloqueador USB de privacidade de porta USB para PC, notebook, bloco de laptop,

Bloqueador USB de privacidade de porta USB para PC, notebook, bloco de laptop,

Proteção de privacidade aprimorada: protege o link de transmissão de dados para evitar roubo de informações, fornecendo proteção de segurança robusta que protege a privacidade do usuário durante transferências de arquivos e garante uma conexão segura para interações de dispositivos sem preocupações em vários ambientes Uso a longo prazo: a camada protetora resistente ao desgaste, combinada com um corpo de metal resistente, oferece gerenciamento de calor confiável e qualidade duradoura durante o uso diário Entrega eficiente de energia: a tecnologia de chip inteligente garante a identificação automática dos requisitos de energia, fornecendo carregamento eficiente alinhando-se com vários protocolos de carregamento rápido para maior conveniência Proteção contra sobrecarga: evitando riscos de sobrecarga, este bloqueador de dados USB protege a vida útil da bateria e garante um desempenho estável, mantendo um fluxo estável de energia para melhorar a longevidade do dispositivo de forma eficaz Prático de transportar: com atenção à portabilidade, este bloqueador de dados USB oferece um design compacto que é leve e fácil de transportar, melhorando a conveniência do usuário e operação eficiente

Ver na Amazon

📩 Newsletter MundiX

Receba novidades de cibersegurança + um checklist de pentest grátis. Sem spam.

Ao assinar você concorda em receber e-mails. Cancele quando quiser.