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).
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.
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