
초고속 펜테스팅 스위트.
빠르고 동시적인 정보 수집부터 공격까지 하나의 바이너리로 처리합니다. 모든 스캐너는 하나의 연결 풀링된 HTTP 클라이언트를 공유합니다.
sif는 정보 수집과 익스플로잇 스캐너로, 하나의 바이너리 안에서 전체 체인(서브도메인 열거, 포트 스캔, 크롤러, nuclei, 프레임워크/CVE 탐지, JS 시크릿 추출, 웹 취약점 프로브(CORS/XSS/리다이렉트), 클라우드 및 하이재킹 검사)을 실행합니다. 25개 이상의 스캔 유형을 하나의 명령어로 처리합니다.
sif -u https://example.com -dnslist -ports -crawl -js -framework -nuclei
nuclei와 colly는 라이브러리로 컴파일되어 포함되어 있으며(트리 내부에 exec.Command가 없음), 따라서 단일 정적 바이너리로서 런타임 의존성이 없고 연결할 필요도 없습니다.
모든 스캐너는 하나의 공유 HTTP 클라이언트와 작업 훔치기 워커 풀을 통해 실행됩니다. -proxy, -H, -cookie, -rate-limit은 전체 실행에 한 번에 적용되며, 연결은 스캔 전반에 걸쳐 풀링되어 재사용됩니다(단일 호스트 실행 시 약 50번의 요청에 대해 한 번의 연결을 재사용하여 50번의 다이얼을 피함). 느린 호스트가 나머지 실행을 지연시키지 않습니다. 이 공유 클라이언트는 별도의 도구들을 파이프로 연결하여 사용하는 것보다 실용적인 이점입니다. 포트 스캔은 connect() 기반이므로, raw 포트 스캔에서는 rustscan과 nmap이 여전히 더 빠릅니다.
stdin에서 대상을 읽고 -silent 모드에서 한 줄에 하나씩 결과를 출력하므로, 다음과 같이 조합하여 사용할 수 있습니다:
subfinder -d example.com | sif -silent -crawl -js -nuclei | notify
-diff는 재스캔을 모니터링 도구로 전환하여 변경된 사항만 보고하며, -notify는 slack/discord/telegram/webhook에 게시하고, sarif 및 markdown 형식으로 내보냅니다.
brew tap vmfunc/sif
brew install sif
선호하는 AUR 헬퍼를 사용하여 설치하세요:
yay -S sif
# 또는
paru -S sif
# nixpkgs (선언적: configuration.nix 또는 home-manager에 추가)
environment.systemPackages = [ pkgs.sif ];
# 또는 명령형
nix profile install nixpkgs#sif
# 또는 설치 없이 실행
nix run nixpkgs#sif -- -u https://example.com -headers -sh -framework
리포지토리에는 소스에서 빌드하기 위한 flake도 포함되어 있습니다:
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
최신 바이너리는 릴리스 페이지에서 받으세요.
git clone https://github.com/vmfunc/sif.git
cd sif
make
Go 1.25+ 필요
git clone https://aur.archlinux.org/sif.git
cd sif
makepkg -si
# 기본 스캔
./sif -u https://example.com
# 디렉토리 퍼징
./sif -u https://example.com -dirlist medium
# 서브도메인 열거
./sif -u https://example.com -dnslist medium
# 포트 스캔
./sif -u https://example.com -ports common
# 자바스크립트 프레임워크 탐지 + 클라우드 설정 오류
./sif -u https://example.com -js -c3
# shodan 호스트 정보 조회 (SHODAN_API_KEY 환경 변수 필요)
./sif -u https://example.com -shodan
# securitytrails 도메인 발견 (SECURITYTRAILS_API_KEY 환경 변수 필요)
# 서브도메인 + 연관 도메인을 발견한 후 모두 스캔
./sif -u https://example.com -securitytrails -headers
# SQL 정보 수집 + LFI 스캔
./sif -u https://example.com -sql -lfi
# 웹 취약점 프로브 (CORS, 오픈 리다이렉트, 반사형 XSS)
./sif -u https://example.com -cors -redirect -xss
# 프레임워크 탐지 (CVE 조회 포함)
./sif -u https://example.com -framework
# 광범위 스캔
./sif -u https://example.com -dirlist small -dnslist small -ports common -headers -sh -cms -framework -git -whois
모든 옵션은 ./sif -h로 확인하세요.
스캔 없이 실행되는 몇 가지 서브명령어:
# 버전 출력 (릴리스 빌드는 스탬프 포함; 로컬 빌드는 git describe 사용)
./sif version
# 최신 릴리스 노트 표시 (또는 -pn)
./sif patchnote
새 릴리스를 처음 실행하면 sif가 해당 릴리스 노트를 한 번 출력합니다. 비활성화하려면 SIF_NO_PATCHNOTES=1을 설정하세요.
sif는 모듈식 아키텍처를 가지고 있습니다. 모듈은 yaml로 정의되며 사용자가 확장할 수 있습니다.
모든 아웃바운드 요청에 적용됩니다:
# socks5 프록시를 통해 사용자 정의 헤더, 쿠키, 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
헤더를 명시적으로 설정하는 스캐너(예: API 키)는 항상 전역 기본값보다 우선합니다.
스캔 결과를 CI/CD 또는 분류를 위해 파일로 작성:
# 스캔 후 SARIF 및 마크다운 보고서 생성
./sif -u https://example.com -headers -cors -sarif out.sarif -md out.md
SARIF 출력은 GitHub 코드 스캐닝에서 사용 가능합니다. 마크다운은 대상별 요약 보고서입니다.
-diff는 재스캔을 모니터로 전환: sif가 각 대상의 정규화된 결과를 JSON 파일에 스냅샷으로 저장하고, 다음 실행 시 해당 스냅샷 대비 델타(+ new / - gone)만 보고한 후 덮어씁니다. 대상의 첫 번째 실행은 기준선이 없으므로 모든 항목이 + new입니다. 스냅샷은 -store에 저장되며(대상당 하나의 정리된 파일), 설정되지 않으면 로그 디렉토리를 재사용하고, 그 다음에는 <user-config>/sif/state로 폴백됩니다.
# 기준 실행 후, 나중에 재스캔하여 변경된 것만 확인
./sif -u https://example.com -sh -cors -diff
./sif -u https://example.com -sh -cors -diff
스냅샷은 항상 덮어쓰여지므로 각 실행은 이전 실행과의 차이를 보여줍니다. 델타는 크롬 출력으로(-silent에서는 일반 출력 싱크/stderr로 전송), 결과 스트림이 아닙니다.
결과를 채팅/webhook 싱크로 전송하여 지속적인 정보 수집 실행이 발견한 내용을 알릴 수 있도록 합니다. 모든 프로바이더는 공유 HTTP 클라이언트를 통해 단일 POST로 전송되므로 전역 프록시/속도 제한/헤더 설정이 적용됩니다.
프로바이더는 환경 변수 우선으로 설정되며, YAML 파일(-notify-config)로 각 필드를 재정의할 수 있습니다. YAML 키는 projectdiscovery/notify와 일치하므로 기존 설정을 이식할 수 있습니다:
# 스캔 중 medium 이상 심각도의 결과를 Slack으로 전송
export SLACK_WEBHOOK_URL=https://hooks.slack.com/services/...
./sif -u https://example.com -cors -xss -notify -notify-severity medium
대상이 없는 프로바이더는 건너뜁니다. 아무것도 설정되지 않은 경우 -notify는 자동으로 무시됩니다. Slack/Discord/Telegram은 고정 너비 결과 블록을 수신하고, 일반 웹훅은 구조화된 JSON({count, findings[]})을 수신합니다.
sif는 stdin에서 대상을 읽으며 호스트만 입력할 수 있으므로 유닉스 파이프라인에 통합됩니다. -silent는 배너/스피너/로그 크롬을 stderr로 보내고, 정규화된 결과를 한 줄에 하나씩 stdout으로 출력합니다([심각도] 대상 모듈 제목):
# subfinder가 호스트를 제공하고, sif가 프로브하며, notify가 결과를 전송
subfinder -d example.com | sif -silent -probe | notify
| 플래그 | 설명 |
|---|---|
| stdin | 파이프된 대상 스트림 (한 줄에 하나의 호스트/URL)이 -u/-f와 함께 읽힘 |
스키마가 없는 호스트는 기본적으로 https://로 처리됩니다. 명시적인 http:///https://는 유지되며, 다른 스키마(ftp://, ...)는 거부됩니다.
사용 가능한 모듈 목록:
./sif -lm
특정 모듈 실행:
# ID로 실행
./sif -u https://example.com -m sqli-error-based,xss-reflected
# 태그로 실행
./sif -u https://example.com -mt owasp-top10
# 모든 모듈 실행
./sif -u https://example.com -am
~/.config/sif/modules/에 자체 모듈을 생성하세요. 모듈은 nuclei 템플릿과 유사한 YAML 형식을 사용합니다:
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
전체 모듈 형식은 docs/modules.md를 참조하세요.
기여를 환영합니다. 가이드라인은 contributing.md를 참조하세요.
# 포맷
gofmt -w .
# 린트
go run github.com/golangci/golangci-lint/v2/cmd/[email protected] run
# 테스트
go test ./...
지원, 기능 논의, 침투 테스트 팁을 위해 Discord에 가입하세요:
| 플래그 | 설명 |
|---|
-dirlist | 디렉토리 및 파일 퍼징 (small/medium/large) |
-mc | dirlist: 일치시킬 상태 코드 (쉼표 목록, 예: 200,301) |
-fc | dirlist: 이 상태 코드는 필터링 (쉼표 목록) |
-fs | dirlist: 이 본문 크기의 응답 필터링 (쉼표 목록) |
-fw | dirlist: 이 단어 수의 응답 필터링 (쉼표 목록) |
-fr | dirlist: 본문이 이 정규식과 일치하는 응답 필터링 |
-ac | 소프트 404 와일드카드 기준 자동 보정 (dirlist, sql) |
-w | dirlist: 사용자 정의 단어 목록 (로컬 파일 또는 URL; -dirlist 크기 재정의) |
-e | dirlist: 각 단어에 추가할 확장자 (쉼표 목록, 예: php,bak,env) |
-dnslist | 서브도메인 열거 (small/medium/large) |
-ports | 포트 스캔 (common/full) |
-nuclei | nuclei 템플릿을 사용한 취약점 스캔 |
-dork | 자동화된 구글 도킹 |
-js | 자바스크립트 분석 + 시크릿 및 엔드포인트 추출 |
-c3 | 클라우드 스토리지 설정 오류 |
-headers | HTTP 헤더 분석 |
-sh | 보안 헤더 분석 (누락/취약한 헤더) |
-st | 서브도메인 탈취 탐지 |
-cms | CMS 탐지 |
-whois | whois 조회 |
-git | 노출된 Git 저장소 탐지 |
-shodan | shodan 조회 (SHODAN_API_KEY 필요) |
-securitytrails | 도메인 발견 + 대상 확장 (SECURITYTRAILS_API_KEY 필요) |
-sql | SQL 정보 수집 |
-lfi | 로컬 파일 포함 |
-jwt | JWT 발견 + 오프라인 약점 분석 (alg:none, 약한 HMAC, exp, 민감한 클레임) |
-openapi | OpenAPI/Swagger 스펙 노출 프로브 (경로 + 인증 없는 엔드포인트 열거) |
-favicon | 파비콘 해시 핑거프린팅 (shodan 스타일 mmh3, 기술 매칭 + 피벗 쿼리) |
-cors | CORS 설정 오류 프로브 |
-redirect | 오픈 리다이렉트 프로브 |
-xss | 반사형 XSS 프로브 |
-framework | 프레임워크 탐지 (CVE 조회 포함) |
-crawl | 웹 크롤러 (동일 호스트의 링크/스크립트/폼 스파이더) |
-crawl-depth | 최대 크롤 재귀 깊이 (기본값 2) |
-passive | 수동적 서브도메인/URL 발견 (대상에 트래픽 없음) |
-probe | 라이브 호스트 프로브 (상태, 제목, 서버, 리다이렉트 체인) |
| 플래그 | 설명 |
|---|
-proxy | 모든 트래픽을 프록시로 라우팅 (http/https/socks5 URL) |
-H, --header | 전송할 사용자 정의 헤더 (반복 가능 또는 쉼표 구분, "Key: Value") |
-cookie | 모든 요청에 보낼 쿠키 헤더 |
-rate-limit | 초당 최대 요청 수 (0 = 무제한, 기본값 0) |
| 플래그 | 설명 |
|---|
-sarif | SARIF 2.1.0 보고서를 이 파일에 작성 |
-markdown, -md | 마크다운 보고서를 이 파일에 작성 |
-silent | 일반 출력: 크롬은 stderr로, 결과는 한 줄에 하나씩 stdout으로 (파이프라인용) |
-diff | 각 대상의 마지막 스냅샷 이후 추가/제거된 결과만 표시 |
-store | -diff용 스냅샷 디렉토리 (기본값: 로그 디렉토리, 없으면 <user-config>/sif/state) |
| 플래그 | 설명 |
|---|
-notify | 스캔 후 모든 설정된 프로바이더로 결과 전송 |
-notify-severity | 전송할 최소 심각도 (info/low/medium/high/critical, 기본값 medium) |
-notify-config | 알림 호환 YAML 설정 파일 경로 (환경 변수 재정의) |
| 환경 변수 | YAML 키 | 프로바이더 |
|---|
SLACK_WEBHOOK_URL | slack_webhook_url | Slack 인커밍 웹훅 |
DISCORD_WEBHOOK_URL | discord_webhook_url | Discord 웹훅 |
TELEGRAM_BOT_TOKEN | telegram_api_key | Telegram 봇 API (채팅 ID도 필요) |
TELEGRAM_CHAT_ID | telegram_chat_id | Telegram 대상 채팅 |
NOTIFY_WEBHOOK_URL | webhook_url | 일반 JSON 웹훅 (구조화된 결과) |
![]() vmfunc 🚧 🧑🏫 📆 🛡️ 💻 | ![]() ProjectDiscovery 📦 | ![]() macdoos 💻 | ![]() Matthieu Witrowiez 🤔 | ![]() tessa 🚇 💬 📓 | ![]() Eva 📝 🖋 🔬 🛡️ ⚠️ 💻 | ![]() Zoa Hickenlooper 💻 |
![]() acxtrilla 📦 |