
la suite di pentesting incredibilmente veloce.
installazione · utilizzo · moduli · documentazione · contribuire
ricognizione rapida e concorrente fino allo sfruttamento in un singolo binario. ogni scanner condivide un singolo client HTTP con pool di connessioni.
sif è uno scanner di ricognizione e sfruttamento che esegue l'intera catena in un solo binario: enumerazione dei sottodomini, scansione delle porte, crawler, nuclei, rilevamento di framework/CVE, estrazione di segreti da JS, probe per vulnerabilità web (CORS/XSS/redirect), controlli cloud e di takeover. Oltre 25 tipi di scansione, un unico comando.
sif -u https://example.com -dnslist -ports -crawl -js -framework -nuclei
nuclei e colly sono compilati come librerie anziché eseguiti come comandi esterni (non c'è exec.Command nell'albero), quindi è un singolo binario statico senza dipendenze runtime e nulla da configurare.
Ogni scanner utilizza un singolo client HTTP condiviso e un pool di worker con furto di lavoro. -proxy, -H, -cookie e -rate-limit si applicano all'intera esecuzione contemporaneamente, le connessioni vengono raggruppate e riutilizzate durante la scansione (un'esecuzione su un singolo host riutilizza una connessione per circa 50 richieste invece di stabilire 50 connessioni separate), e un host lento non blocca il resto. Quel client condiviso è il motivo pratico per usarlo invece di concatenare una pila di strumenti separati. La scansione delle porte è basata su connect(), quindi rustscan e nmap sono ancora più veloci per le scansioni raw delle porte.
Legge i target da stdin e stampa i risultati uno per riga con -silent, quindi si compone:
subfinder -d example.com | sif -silent -crawl -js -nuclei | notify
-diff trasforma una nuova scansione in un monitor che segnala solo ciò che è cambiato, -notify pubblica su slack/discord/telegram/webhook e le esecuzioni esportano in sarif e markdown.
brew tap vmfunc/sif
brew install sif
Installa usando il tuo helper AUR preferito:
yay -S sif
# oppure
paru -S sif
# nixpkgs (dichiarativo: aggiungi a configuration.nix o home-manager)
environment.systemPackages = [ pkgs.sif ];
# oppure imperativamente
nix profile install nixpkgs#sif
# oppure esegui senza installare
nix run nixpkgs#sif -- -u https://example.com -headers -sh -framework
Il repository include anche un flake se vuoi compilare dai sorgenti:
nix run github:vmfunc/sif
curl -1sLf 'https://dl.cloudsmith.io/public/sif/deb/setup.deb.sh' | sudo -E bash
sudo apt-get install sif
Scarica l'ultimo binario da releases.
git clone https://github.com/vmfunc/sif.git
cd sif
make
Richiede go 1.25+
git clone https://aur.archlinux.org/sif.git
cd sif
makepkg -si
# scansione di base
./sif -u https://example.com
# fuzzing delle directory
./sif -u https://example.com -dirlist medium
# enumerazione dei sottodomini
./sif -u https://example.com -dnslist medium
# scansione delle porte
./sif -u https://example.com -ports common
# rilevamento framework javascript + misconfigurazione cloud
./sif -u https://example.com -js -c3
# intelligence host di shodan (richiede variabile d'ambiente SHODAN_API_KEY)
./sif -u https://example.com -shodan
# scoperta domini tramite securitytrails (richiede variabile d'ambiente SECURITYTRAILS_API_KEY)
# scopre sottodomini + domini associati, poi li scansiona tutti
./sif -u https://example.com -securitytrails -headers
# ricognizione sql + scansione lfi
./sif -u https://example.com -sql -lfi
# probe vulnerabilità web (cors, reindirizzamento aperto, xss riflesso)
./sif -u https://example.com -cors -redirect -xss
# rilevamento framework (con ricerca CVE)
./sif -u https://example.com -framework
# una scansione ampia
./sif -u https://example.com -dirlist small -dnslist small -ports common -headers -sh -cms -framework -git -whois
Esegui ./sif -h per tutte le opzioni.
Un paio di sottocomandi vengono eseguiti senza scansione:
# stampa la versione (le build rilasciate sono timbrate; le build locali usano git describe)
./sif version
# mostra le ultime note di rilascio (anche -pn)
./sif patchnote
La prima volta che esegui una nuova release, sif stampa le note di quella release una volta. Imposta SIF_NO_PATCHNOTES=1 per disattivarlo.
sif ha un'architettura modulare. I moduli sono definiti in yaml e possono essere estesi dagli utenti.
Queste si applicano a ogni richiesta in uscita su tutti gli scanner:
# scansione attraverso un proxy socks5 con un header personalizzato, un cookie e un limite di 20 req/s
./sif -u https://example.com -headers -proxy socks5://127.0.0.1:1080 -H "Authorization: Bearer tok" -cookie "session=abc" -rate-limit 20
Uno scanner che imposta esplicitamente un header (es. una chiave API) ha sempre la precedenza sul default globale.
Scrive i risultati dell'esecuzione in un file per CI/CD o triage:
# scansione ed emissione di entrambi i report SARIF e markdown
./sif -u https://example.com -headers -cors -sarif out.sarif -md out.md
L'output SARIF può essere importato da GitHub Code Scanning; il markdown è un riepilogo leggibile per target.
-diff trasforma una nuova scansione in un monitor: sif salva uno snapshot dei risultati normalizzati di ogni target in un file json, e alla successiva esecuzione riporta solo il delta (+ nuovo / - rimosso) rispetto a quello snapshot, poi lo sovrascrive. La prima esecuzione per un target non ha baseline, quindi tutto è + nuovo. Gli snapshot finiscono in -store (un file sanitizzato per target); se non impostato, riutilizza la directory di log, ricadendo su <user-config>/sif/state.
# esecuzione baseline, poi riscansione successiva per vedere solo cosa è cambiato
./sif -u https://example.com -sh -cors -diff
./sif -u https://example.com -sh -cors -diff
Lo snapshot viene sempre riscritto, quindi ogni esecuzione si differenzia dalla precedente. Il delta è chrome (viene inviato al normale sink di output / stderr con -silent), non il flusso dei risultati.
Invia i risultati a un sink di chat/webhook in modo che un'esecuzione di ricognizione continua possa avvisare su ciò che trova. Ogni provider è un singolo POST attraverso il client HTTP condiviso, quindi si applica la configurazione globale di proxy/rate-limit/header.
I provider sono configurati prima tramite ambiente; un file yaml (-notify-config) sovrascrive per campo. Le chiavi yaml corrispondono a projectdiscovery/notify quindi una configurazione esistente può essere portata:
# avvisa slack per risultati con gravità medium+ scoperti durante una scansione
export SLACK_WEBHOOK_URL=https://hooks.slack.com/services/...
./sif -u https://example.com -cors -xss -notify -notify-severity medium
Un provider senza destinazione viene saltato; con nulla configurato, -notify è un no-op silenzioso. Slack/Discord/Telegram ricevono un blocco di risultati a larghezza fissa; il webhook generico riceve JSON strutturato ({count, findings[]}).
sif legge i target da stdin e accetta host nudi, quindi si inserisce in una pipeline unix. -silent indirizza tutto il banner/spinner/log chrome su stderr e stampa un risultato normalizzato per riga ([severità] target modulo titolo) su stdout:
# subfinder alimenta host, sif li analizza, notify invia i risultati
subfinder -d example.com | sif -silent -probe | notify
| flag | descrizione |
|---|---|
| stdin | un flusso di target piped (un host/URL per riga) viene letto insieme a -u/-f |
Gli host senza schema predefiniscono https://; uno schema esplicito http:///https:// viene mantenuto; qualsiasi altro schema (ftp://, ...) viene rifiutato.
Elenca i moduli disponibili:
./sif -lm
Esegui moduli specifici:
# esegui per id
./sif -u https://example.com -m sqli-error-based,xss-reflected
# esegui per tag
./sif -u https://example.com -mt owasp-top10
# esegui tutti i moduli
./sif -u https://example.com -am
Crea i tuoi moduli in ~/.config/sif/modules/. I moduli utilizzano un formato yaml simile ai template nuclei:
id: my-custom-check
info:
name: my custom security check
author: you
severity: medium
description: checks for something specific
tags: [custom, recon]
type: http
http:
method: GET
paths:
- "{{BaseURL}}/admin"
- "{{BaseURL}}/login"
matchers:
- type: status
status:
- 200
- type: word
part: body
words:
- "admin panel"
- "login"
condition: or
Vedi docs/modules.md per il formato completo dei moduli.
Contributi benvenuti. Vedi contributing.md per le linee guida.
# formatta
gofmt -w .
# lint
go run github.com/golangci/golangci-lint/v2/cmd/[email protected] run
# test
go test ./...
Unisciti al nostro discord per supporto, discussioni sulle funzionalità e consigli per il pentesting:
| flag | descrizione |
|---|
-dirlist | fuzzing di directory e file (small/medium/large) |
-mc | dirlist: corrispondi a questi codici di stato (elenco separato da virgole, es. 200,301) |
-fc | dirlist: filtra questi codici di stato (elenco separato da virgole) |
-fs | dirlist: filtra risposte con queste dimensioni del corpo (elenco separato da virgole) |
-fw | dirlist: filtra risposte con questi conteggi di parole (elenco separato da virgole) |
-fr | dirlist: filtra risposte il cui corpo corrisponde a questa regex |
-ac | auto-calibrazione della baseline wildcard soft-404 (dirlist, sql) |
-w | dirlist: wordlist personalizzata (file locale o URL; sovrascrive la dimensione di -dirlist) |
-e | dirlist: estensioni aggiunte a ogni parola (elenco separato da virgole, es. php,bak,env) |
-dnslist | enumerazione dei sottodomini (small/medium/large) |
-ports | scansione delle porte (common/full) |
-nuclei | scansione delle vulnerabilità con i template nuclei |
-dork | google dorking automatizzato |
-js | analisi javascript + estrazione di segreti ed endpoint |
-c3 | errata configurazione dello storage cloud |
-headers | analisi degli header HTTP |
-sh | analisi degli header di sicurezza (header mancanti/deboli) |
-st | rilevamento takeover del sottodominio |
-cms | rilevamento CMS |
-whois | query whois |
-git | rilevamento repository git esposto |
-shodan | query shodan (richiede SHODAN_API_KEY) |
-securitytrails | scoperta domini + espansione target (richiede SECURITYTRAILS_API_KEY) |
-sql | ricognizione SQL |
-lfi | inclusione di file locale |
-jwt | scoperta JWT + analisi offline delle debolezze (alg:none, hmac debole, exp, claims sensibili) |
-openapi | probe di esposizione delle specifiche openapi/swagger (enumera percorsi + endpoint non autenticati) |
-favicon | fingerprinting tramite hash del favicon (mmh3 stile shodan, corrispondenza tech + query pivot) |
-cors | probe di errata configurazione CORS |
-redirect | probe di reindirizzamento aperto |
-xss | probe XSS riflesso |
-framework | rilevamento framework con ricerca CVE |
-crawl | web crawler (spider di link/script/form sullo stesso host) |
-crawl-depth | profondità massima di ricorsione del crawl (default 2) |
-passive | scoperta passiva di sottodomini/URL (zero traffico verso il target) |
-probe | probe host live (stato, titolo, server, catena di reindirizzamento) |
| flag | descrizione |
|---|
-proxy | instrada tutto il traffico attraverso un proxy (URL http/https/socks5) |
-H, --header | header personalizzato da inviare (ripetibile o separato da virgole, "Key: Value") |
-cookie | header cookie da inviare con ogni richiesta |
-rate-limit | massimo di richieste al secondo (0 = illimitato, default 0) |
| flag | descrizione |
|---|
-sarif | scrive un report SARIF 2.1.0 in questo file |
-markdown, -md | scrive un report markdown in questo file |
-silent | output semplice: chrome su stderr, un risultato per riga su stdout (per pipeline) |
-diff | mostra solo i risultati aggiunti/rimossi dall'ultimo snapshot di ogni target |
-store | directory degli snapshot per -diff (default: directory di log, altrimenti <user-config>/sif/state) |
| flag | descrizione |
|---|
-notify | invia i risultati a ogni provider configurato dopo la scansione |
-notify-severity | gravità minima da inviare (info/low/medium/high/critical, default medium) |
-notify-config | percorso di un file yaml compatibile con notify (sovrascrive le variabili d'ambiente) |
| variabile d'ambiente | chiave yaml | provider |
|---|
SLACK_WEBHOOK_URL | slack_webhook_url | webhook in arrivo Slack |
DISCORD_WEBHOOK_URL | discord_webhook_url | webhook Discord |
TELEGRAM_BOT_TOKEN | telegram_api_key | API bot Telegram (richiede anche chat id) |
TELEGRAM_CHAT_ID | telegram_chat_id | chat di destinazione Telegram |
NOTIFY_WEBHOOK_URL | webhook_url | webhook JSON generico (risultati strutturati) |
![]() vmfunc 🚧 🧑🏫 📆 🛡️ 💻 | ![]() ProjectDiscovery 📦 | ![]() macdoos 💻 | ![]() Matthieu Witrowiez 🤔 | ![]() tessa 🚇 💬 📓 | ![]() Eva 📝 🖋 🔬 🛡️ ⚠️ 💻 | ![]() Zoa Hickenlooper 💻 |
![]() acxtrilla 📦 |