
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 · tracking down the SaaS nobody told you about
▓▓▒▒░░░░░░░░░░░▒▒▓▓
▓▒░░ ● ● ░▒▓ Domain acme.com.au
▓▒░░ ▼ ░▒▓ Candidates acme, acmecorp
▓▓▒░░ ╰───╯ ░▒▓▓
▀▓▓▒▒░░░░░░░░░▒▒▓▓▀
▀▀▓▓▓▓▓▓▓▓▓▓▓▀▀
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: os serviços que vale a pena encontrar são aqueles sobre os quais ninguém te falou.
Nomeado em honra da criatura críptida do mato australiano, porque estás a caçar algo que todos insistem que não existe.

786 assinaturas cobrindo 593 fornecedores em nove detetores, mais 109 em espera aguardando confirmação. Os achados são classificados e cada um transporta o registo ou a resposta que o produziu.
go build -o yowie ./cmd/yowie
Go 1.22 ou posterior. Os pacotes de assinaturas estão incorporados no binário, portanto o único arquivo é 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 cadeias curtas a partir das quais um tenant de fornecedor pode ser nomeado — nomes comerciais, abreviaturas, marcas antigas herdadas de aquisições. Forneça o máximo que puder; cada um é outra oportunidade de encontrar um tenant. Se nenhum for fornecido, é utilizada a primeira etiqueta do domínio.
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 pelo fornecedor com o nome da organização (acme.zendesk.com) |
http | Fingerprints na camada de aplicação para serviços sem pegada de DNS |
spf | O grafo completo de includes do SPF, seguindo includes e redirects 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 deles é outro 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 leads, e é assim que você encontra aquilo que não sabia que precisava procurar.
Os achados são classificados, e a classificação é o ponto principal:
acme.blogspot.com pode não ser o seu acme.Dois detectores independentes concordando sobre um fornecedor promovem um achado Probable para Confirmed. Todo 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 os leads não atribuídos se você quiser apenas sinal.
-format cli (padrão), json, jsonl, csv, html. Use -o para gravar em um
arquivo. O relatório HTML é autocontido — sem recursos externos — então ele 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 incorpora; -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ência | Notas |
|---|---|---|
txt, cname, mx, ns | match.contains contra os registros de query | Não diferencia maiúsculas de minúsculas |
vanity_a, vanity_cname | Comparação com a linha de base; sem bloco match | query deve conter {candidate} |
http | match.present, match.absent ou match.status isoladamente | Ver tratamento de status abaixo |
spf_include | match.contains contra o grafo de includes SPF resolvido | |
dmarc_rua | match.contains contra os destinos de relatórios 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: leva a 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 packs também são verificados por go test, então um
erro de digitação não pode custar silenciosamente sua cobertura em todas as varreduras futuras.