MCP para Pentesters — Claude Orquestrando Tools via Linguagem Natural

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


🛡️ MCP para Pentesters — Claude Orquestrando Tools via Linguagem Natural


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





Nos módulos anteriores construímos um MCP Server com Tools, Resources e Prompts, e integramos a NVD API para busca de CVEs. Agora chegamos na etapa final: conectar tudo ao Claude via API e fazer a IA orquestrar as tools automaticamente através de linguagem natural — sem clicar em nada.



🧠 Como o Claude Orquestra as Tools


O fluxo completo de uma chamada em linguagem natural:



  • 1️⃣ Você digita: "faz um dns lookup no google.com e verifica a porta 443"

  • 2️⃣ Claude lê as tools disponíveis (nome + docstring + tipos)

  • 3️⃣ Claude decide chamar dns_lookup("google.com")

  • 4️⃣ Recebe o IP retornado e decide chamar check_open_port("142.250.x.x", 443)

  • 5️⃣ Consolida tudo num relatório estruturado



💡 Você não especifica qual tool usar. O Claude decide sozinho com base nos docstrings que você escreveu no server.




💳 Passo 1 — Configurar Créditos na API Anthropic


Para usar o Claude via API você precisa de créditos na plataforma da Anthropic:



  • Acesse: console.anthropic.com → Billing

  • Clique em Buy Credits (mínimo recomendado: US$ 5,00)

  • Aguarde a confirmação do pagamento



⚠️ Atenção: Após adicionar créditos, gere uma nova API key em API Keys → Create Key. Keys antigas criadas antes da adição de créditos podem não funcionar corretamente.




🔑 Passo 2 — Gerar e Configurar a API Key


1. Gerar a key no console:



  • console.anthropic.com → API Keys → + Create Key

  • Nome sugerido: kali-mcp

  • Copie a key imediatamente — ela só aparece uma vez


2. Exportar no Kali:



source ~/mcp-env/bin/activate

export ANTHROPIC_API_KEY="sk-ant-SEU-TOKEN-AQUI"

# Confirma que exportou corretamente
echo $ANTHROPIC_API_KEY




⚠️ Atenção com o shell: No Kali como root, o prompt exibe #. O comando export deve ter espaço antes — #export (sem espaço) é interpretado como comentário e não executa.




🧪 Passo 3 — Testar a API antes de tudo


Valide que a key e os créditos estão funcionando com um teste rápido:



python3 << 'EOF'
import anthropic
client = anthropic.Anthropic()
msg = client.messages.create(
model="claude-haiku-4-5-20251001",
max_tokens=50,
messages=[{"role": "user", "content": "responda só: ok"}]
)
print("✅ API OK:", msg.content[0].text)
EOF




✅ Resultado esperado: API OK: ok. Só avance para o próximo passo após ver esse output.




💻 Passo 4 — Criar o Cliente MCP


📄 Arquivo: /usr/local/scripts/mcp_client.py



import asyncio
import sys
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
import anthropic

# ─────────────────────────────────────────
# CONFIGURAÇÃO
# ─────────────────────────────────────────

SERVER_SCRIPT = "/usr/local/scripts/pentest_server_v2.py"
MODEL = "claude-opus-4-5"

# ─────────────────────────────────────────
# CONVERTE TOOLS MCP -> FORMATO ANTHROPIC
# ─────────────────────────────────────────

def mcp_tools_to_anthropic(tools):
result = []
for tool in tools:
result.append({
"name": tool.name,
"description": tool.description,
"input_schema": tool.inputSchema
})
return result

# ─────────────────────────────────────────
# LOOP PRINCIPAL
# ─────────────────────────────────────────

async def chat_loop(session: ClientSession, anthropic_client: anthropic.Anthropic):
tools_response = await session.list_tools()
tools = mcp_tools_to_anthropic(tools_response.tools)

print(f"\n✅ Conectado ao PentestServer")
print(f"🔧 {len(tools)} tools disponíveis: {', '.join(t['name'] for t in tools)}")
print(f"🤖 Modelo: {MODEL}")
print("\n" + "─"*60)
print("Digite sua pergunta ou comando. 'sair' para encerrar.")
print("─"*60 + "\n")

messages = []

while True:
try:
user_input = input("Você: ").strip()
except (KeyboardInterrupt, EOFError):
print("\nEncerrando...")
break

if user_input.lower() in ("sair", "exit", "quit"):
print("Até mais!")
break

if not user_input:
continue

messages.append({"role": "user", "content": user_input})

response = anthropic_client.messages.create(
model=MODEL,
max_tokens=4096,
system="""Você é um assistente especializado em pentest e segurança ofensiva.
Você tem acesso a tools de reconhecimento e busca de vulnerabilidades.
SEMPRE leia o resource 'file://escopo' antes de executar qualquer scan.
Seja objetivo e técnico. Apresente resultados em formato estruturado.""",
tools=tools,
messages=messages
)

while response.stop_reason == "tool_use":
tool_calls = [b for b in response.content if b.type == "tool_use"]
text_blocks = [b for b in response.content if b.type == "text"]

for tb in text_blocks:
if tb.text.strip():
print(f"\nClaude: {tb.text}")

messages.append({"role": "assistant", "content": response.content})

tool_results = []
for tc in tool_calls:
print(f"\n🔧 Chamando tool: {tc.name}")
print(f" Parâmetros: {tc.input}")

try:
result = await session.call_tool(tc.name, tc.input)
result_text = result.content[0].text if result.content else "Sem resultado"
print(f" ✅ Resultado obtido ({len(result_text)} chars)")
except Exception as e:
result_text = f"Erro ao executar {tc.name}: {str(e)}"
print(f" ❌ Erro: {e}")

tool_results.append({
"type": "tool_result",
"tool_use_id": tc.id,
"content": result_text
})

messages.append({"role": "user", "content": tool_results})

response = anthropic_client.messages.create(
model=MODEL,
max_tokens=4096,
system="""Você é um assistente especializado em pentest e segurança ofensiva.
Você tem acesso a tools de reconhecimento e busca de vulnerabilidades.
SEMPRE leia o resource 'file://escopo' antes de executar qualquer scan.
Seja objetivo e técnico. Apresente resultados em formato estruturado.""",
tools=tools,
messages=messages
)

final_text = ""
for block in response.content:
if hasattr(block, "text"):
final_text += block.text

print(f"\nClaude: {final_text}\n")
messages.append({"role": "assistant", "content": response.content})


# ─────────────────────────────────────────
# ENTRYPOINT
# ─────────────────────────────────────────

async def main():
anthropic_client = anthropic.Anthropic()

server_params = StdioServerParameters(
command="python3",
args=[SERVER_SCRIPT]
)

async with stdio_client(server_params) as (read, write):
async with ClientSession(read, write) as session:
await session.initialize()
await chat_loop(session, anthropic_client)


if __name__ == "__main__":
asyncio.run(main())




🚀 Passo 5 — Instalar o SDK Anthropic e Rodar


1. Instalar o SDK:



source ~/mcp-env/bin/activate
pip install anthropic



2. Rodar o cliente:



cd /usr/local/scripts
python3 mcp_client.py




✅ Passo 6 — Testes em Linguagem Natural


Com o prompt Você: ativo, execute os testes em ordem:



Teste 1 — DNS + verificação de porta:



faz um dns lookup no google.com e depois verifica se a porta 443 esta aberta




Resultado confirmado em laboratório:



🔧 Chamando tool: dns_lookup
Parâmetros: {'domain': 'google.com'}
✅ Resultado obtido (97 chars)

🔧 Chamando tool: check_open_port
Parâmetros: {'host': '142.250.218.238', 'port': 443}
✅ Resultado obtido (37 chars)

Claude:
| Tipo | Endereço |
|------|-------------------|
| IPv4 | 142.250.218.238 |
| IPv6 | 2800:3f0:4004:... |

| Host | Porta | Status |
|-----------------|----------|-----------|
| 142.250.218.238 | 443/TCP | ✅ ABERTA |




Teste 2 — CVE search + loot automático:



busca CVEs do apache 2.4.49 e salva os criticos no loot




🚨 Troubleshooting



  • credit balance too low: Créditos ainda não processados. Gere uma nova API key após adicionar créditos.

  • invalid x-api-key (401): Key digitada com erro (ex: ssk-ant- em vez de sk-ant-) ou #export sem espaço virou comentário.

  • variável vazia após export: Rode echo $ANTHROPIC_API_KEY para confirmar. Se vazio, re-exporte sem o #.



🗺️ Roadmap da Série



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

  • Parte 02: Resources, Prompts e NVD/CVE Integration

  • Parte 03: Cliente Python + Claude orquestrando tools

  • 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