MCP para Pentesters — Do Zero ao Primeiro Server

Criado por André Albuquerque em Cyber Security 3/03/2026
Compartilhar

🛡️ MCP para Pentesters — Do Zero ao Primeiro Server


Status: ✅ Concluído
Ambiente: 💻 Kali Linux 2025.x · Python 3.13 · MCP SDK 1.26.0
Tags: 🏷️ #mcp #pentest #redteam #python #llm #automação




❓ O que é MCP?


Model Context Protocol (MCP) é um protocolo aberto criado pela Anthropic que permite que LLMs se conectem a ferramentas e sistemas externos de forma padronizada.



  • Analogia: Pense no MCP como uma tomada universal. Cada ferramenta que "fala MCP" funciona com qualquer IA que "fala MCP".

  • Sem MCP: ❌ LLM isolado, sem acesso a ferramentas reais.

  • Com MCP: 🔌 LLM com acesso a Nmap, Burp, SIEM, bancos de dados CVE, etc.


🏗️ Arquitetura


Aqui está a representação visual da arquitetura MCP em três peças principais conectadas:



🧩 Componentes da Arquitetura



  • 🧠 Host: Orquestra tudo (Ex: Claude Desktop, VS Code, seu script).

  • 🔗 Client: Mantém a conexão com os servers (Embutido no Host).

  • 🛠️ Server: Expõe tools, resources e prompts (Seu script Python com as tools).


⚙️ As 3 primitivas



  • 🧰 Tools: Ações que a IA executa (Analogia: Funções/scripts).

  • 📁 Resources: Dados que a IA pode ler (Analogia: Arquivos, logs, DBs).

  • 📝 Prompts: Templates reutilizáveis (Analogia: Checklists, workflows).


🛠️ Instalação no Kali Linux



⚠️ Atenção: Não use pip install direto no Kali 2025.x — isso gera conflito com pacotes do sistema (ex: click instalado via apt). Use venv.



👣 Passo a Passo


1. Criar ambiente virtual:



python3 -m venv ~/mcp-env --system-site-packages
source ~/mcp-env/bin/activate



2. Instalar MCP SDK com CLI:



pip install "mcp[cli]"



3. Verificar instalação:



mcp --help



4. Alias de conveniência (opcional):



echo 'alias mcp-env="source ~/mcp-env/bin/activate"' >> ~/.zshrc
source ~/.zshrc



5. Instalar Node.js (necessário para o Inspector):



apt install nodejs npm -y
node --version



💻 MCP Server de Pentest


📄 Arquivo: pentest_server.py



from mcp.server.fastmcp import FastMCP
import subprocess
import socket
import json

mcp = FastMCP("PentestServer")

@mcp.tool()
def nmap_scan(target: str, flags: str = "-sV -T4") -> str:
"""
Executa um scan nmap num alvo.
Use flags como '-sV -T4' para versões, '-sC' para scripts,
'-p 80,443,8080' para portas específicas.
ATENÇÃO: use apenas em alvos autorizados.
"""
cmd = ["nmap"] + flags.split() + [target]
result = subprocess.run(cmd, capture_output=True, text=True, timeout=120)
return result.stdout or result.stderr

@mcp.tool()
def dns_lookup(domain: str) -> str:
"""
Faz resolução DNS de um domínio.
Retorna IPs associados.
"""
try:
infos = socket.getaddrinfo(domain, None)
ips = list(set([i[4][0] for i in infos]))
return json.dumps({"domain": domain, "ips": ips}, indent=2)
except Exception as e:
return f"Erro: {str(e)}"

@mcp.tool()
def whois_lookup(target: str) -> str:
"""
Executa whois em um domínio ou IP.
Útil para reconhecimento inicial (OSINT).
"""
result = subprocess.run(
["whois", target], capture_output=True, text=True, timeout=30
)
return result.stdout[:3000] or result.stderr

@mcp.tool()
def check_open_port(host: str, port: int, timeout: float = 2.0) -> str:
"""
Verifica se uma porta TCP específica está aberta num host.
Mais rápido que nmap para checks pontuais.
"""
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(timeout)
result = sock.connect_ex((host, port))
sock.close()
if result == 0:
return f"✅ Porta {port} ABERTA em {host}"
else:
return f"❌ Porta {port} FECHADA/FILTRADA em {host}"
except Exception as e:
return f"Erro: {str(e)}"

if __name__ == "__main__":
mcp.run()




💡 Dica: O LLM lê o nome da função, o docstring e os tipos dos parâmetros para decidir quando e como usar a tool. Docstrings descritivos são funcionais, não apenas documentação.



🔍 Rodando o Inspector


1. Ativar o venv:



source ~/mcp-env/bin/activate



2. Subir o inspector:



mcp dev pentest_server.py



3. Acessar no browser:



  • 🌐 Endereço: http://localhost:5173


🚨 Segurança do MCP Server



🛡️ Como pentester, note: o próprio MCP Server tem sua superfície de ataque.



🎯 Vetores de Ataque e Mitigações



  • Command Injection: Flags maliciosas passadas pelo LLM. Mitigação: Allowlist de flags.

  • SSRF: Scan em IPs internos. Mitigação: Validação rigorosa de escopo.

  • Path Traversal: Lendo arquivos arbitrários do sistema. Mitigação: Sanitização de paths.

  • Prompt Injection: Instruções maliciosas embutidas nos outputs. Mitigação: Sanitizar o output.


🛡️ Validações Básicas (Exemplo de Código)



import re

def validar_alvo(target: str) -> bool:
ip_pattern = r'^(\d{1,3}\.){3}\d{1,3}(/\d{1,2})?$'
domain_pattern = r'^[a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?(\.[a-zA-Z]{2,})+$'
return bool(re.match(ip_pattern, target) or re.match(domain_pattern, target))

def sanitizar_flags_nmap(flags: str) -> str:
allowed = {'-sV', '-sC', '-sS', '-sT', '-T1', '-T2', '-T3', '-T4',
'-p', '-A', '-O', '--open', '-Pn'}
partes = flags.split()
return ' '.join(p for p in partes if any(p.startswith(a) for a in allowed))



🗺️ Roadmap da Série



  • Parte 01: Conceitos, instalação e primeiro server

  • Parte 02: Resources, contexto e integração com CVE/NVD API

  • Parte 03: Conectando ao Claude: workflow real de recon

  • Parte 04: Blue Team: integração com SIEM e análise de logs

  • Parte 05: AppSec: SAST automatizado e análise de código


Compartilhar

Compartilhar este post com outros