
Encontra os serviços SaaS aos quais uma organização está subscrita, utilizando apenas dados observáveis externamente. Concebido para a descoberta de shadow IT.
▄▄▓▓▓▓▓▓▓▓▓▄▄
▄▓▓▒▒▒▒▒▒▒▒▒▒▒▓▓▄ Yowie · rastreando o SaaS que ninguém te contou
▓▓▒▒░░░░░░░░░░░▒▒▓▓
▓▒░░ ● ● ░▒▓ Domínio acme.com.au
▓▒░░ ▼ ░▒▓ Candidatos acme, acmecorp
▓▓▒░░ ╰───╯ ░▒▓▓
▀▓▓▒▒░░░░░░░░░▒▒▓▓▀
▀▀▓▓▓▓▓▓▓▓▓▓▓▀▀
Encontra os serviços SaaS aos quais uma organização está subscrita, usando apenas dados observáveis externamente. Feito para descoberta de shadow IT: os serviços que vale a pena encontrar são aqueles que ninguém te contou.
Nomeado em homenagem à criptídeo do mato australiano, porque você está caçando algo que todos insistem que não existe.

574 assinaturas cobrindo 412 fornecedores em nove detectores, mais 104 estacionadas aguardando confirmação. Os achados são classificados e cada um carrega o registro ou a resposta que o produziu.
go build -o yowie ./cmd/yowie
Go 1.22 ou superior. Os pacotes de assinaturas estão embutidos no binário, então o arquivo único é tudo o que você precisa para implantar.
yowie [flags] <domain> [candidate ...]
O domínio é o domínio raiz da organização. Os candidatos são as strings curtas pelas quais um tenant de fornecedor pode ser nomeado — nomes comerciais, abreviações, marcas antigas herdadas de aquisições. Forneça o máximo que puder; cada um é mais uma chance de encontrar um tenant. Sem nenhum informado, o primeiro rótulo do domínio é usado.
yowie acme.com.au acme acmecorp acmegroup
yowie -format html -o report.html acme.com.au acme
yowie -format json acme.com.au | jq '.findings[] | select(.confidence=="high")'
yowie -only dns,spf,dmarc -compact acme.com.au
yowie -signatures ./signatures -validate
| Detector | Sinal |
|---|---|
dns | Tokens de verificação TXT, registros CNAME, MX e NS |
vanity | Tenants hospedados por fornecedores nomeados após a organização (acme.zendesk.com) |
http | Impressões digitais em nível de aplicação para serviços sem pegada de DNS |
spf | O grafo completo de includes do SPF, seguindo includes e redirecionamentos aninhados |
dmarc | Destinos de relatórios agregados/forenses do DMARC |
bimi | Hospedagem do logo BIMI e do Verified Mark Certificate |
mta-sts | Conteúdo da política MTA-STS |
tenant | ID de tenant da Microsoft, provedor de identidade federado e domínios irmãos |
ct | Subdomínios dos logs de Certificate Transparency, resolvidos e atribuídos |
Selecione com -only ou -skip, por exemplo -skip ct,http para uma passagem
rápida apenas de DNS.
Os dois últimos merecem uma nota, porque encontram coisas que uma lista de assinaturas não consegue.
tenant pergunta aos endpoints não autenticados da Microsoft a quem o
domínio pertence. As informações de federação do Autodiscover retornam todos
os domínios anexados ao mesmo tenant, o que rotineiramente revela unidades de
negócio, aquisições e marcas abandonadas. Cada um é mais um domínio que vale a
pena escanear.
ct inverte o modelo de descoberta. Todas as outras verificações perguntam
"esta organização usa o fornecedor X?" contra uma lista fixa, então só consegue
encontrar fornecedores para os quais alguém já escreveu uma assinatura. O CT
pergunta "para onde esta organização realmente apontou seus subdomínios?" Uma
equipe que se inscreve em um produto e configura support.acme.com faz com que
um certificado seja emitido, e esse certificado é público e permanente. Alvos
que não correspondem a nenhuma assinatura são reportados como pistas, e é assim
que você encontra a coisa que não sabia que precisava procurar.
Os achados são classificados, e a classificação é o ponto:
acme.blogspot.com pode não ser o
seu acme.Dois detectores independentes concordando sobre um fornecedor promove um achado Provável para Confirmado. Cada achado carrega o registro ou a resposta exata que o disparou, então um relatório é defensável sem reexecutar a ferramenta.
A promoção tem uma exceção, e é a diferença entre "este tenant existe" e "este tenant é seu" — veja a nota sobre namespace em precisão.
-no-unknown descarta as pistas não atribuídas se você quiser apenas sinal.
-format cli (padrão), json, jsonl, csv, html. Use -o para escrever em
um arquivo. O relatório HTML é autocontido — sem recursos externos — então
sobrevive a ser enviado por e-mail ou colocado em um drive compartilhado.
O progresso vai para stderr e os resultados para stdout, então yowie -format json acme.com > out.json
ainda mostra uma linha de progresso ao vivo.
As assinaturas ficam em signatures/*.yaml. O binário as embute; -signatures <dir>
ou YOWIE_SIGNATURES=<dir> carrega do disco em vez disso, que é como você itera
sem recompilar.
version: 1
pack: dns-txt
description: "Domain-ownership verification tokens published as TXT records."
defaults:
confidence: high
signatures:
- id: txt-1password
vendor: "1Password"
category: "Identity & Secrets"
type: txt
query: "{domain}"
match:
contains: "1password-site-verification"
{domain} expande para o domínio raiz, {candidate} para cada string
candidata. Uma assinatura que referencia {candidate} é avaliada uma vez por
candidato.
| Tipo | Correspondências | Notas |
|---|---|---|
txt, cname, mx, ns | match.contains contra os registros de query | Insensível a maiúsculas/minúsculas |
vanity_a, vanity_cname | Comparação de linha de base; sem bloco match | query deve conter {candidate} |
http | match.present, match.absent ou match.status sozinho | Veja o tratamento de status abaixo |
spf_include | match.contains contra o grafo de includes do SPF resolvido | |
dmarc_rua | match.contains contra os destinos de relatórios do DMARC | |
cname_target | query é um sufixo de hospedagem puro | Aplicado a hosts descobertos por ct; * corresponde a um rótulo |
disabled: true estaciona uma assinatura sem perder a pesquisa por trás dela.
notes: carrega orientação do analista até o relatório.
Execute yowie -validate após editar. A validação é estrita — uma chave
desconhecida é um erro, não um no-op silencioso — e os pacotes também são
verificados por go test, então um erro de digitação não pode silenciosamente
custar cobertura em todas as varreduras futuras.