
빠르고 사용자 정의 가능한 서비스 탐지 도구로, 유연한 핑거프린트 시스템을 기반으로 합니다. 인프라 전반의 서비스, API 및 네트워크 구성을 식별하는 데 도움을 줍니다.
유연한 핑거프린트 시스템을 기반으로 하는 빠르고 사용자 정의 가능한 서비스 탐지 도구입니다. 인프라 전반의 서비스, API 및 네트워크 구성을 식별하는 데 도움을 줍니다.
Releases에서 최신 버전을 다운로드하세요.
# 단일 IP 스캔
zscan -target 192.168.1.1
# CIDR 범위 스캔
zscan -target 192.168.1.0/24
# 여러 대상 스캔 (; 또는 ,로 구분)
zscan -target "192.168.1.0/24;10.0.0.0/24"
zscan -target "192.168.1.1,192.168.1.2,192.168.1.3"
# 특정 포트 스캔
zscan -target 192.168.1.1 -port 80,443,8080
# 결과를 JSON 파일로 저장
zscan -target 192.168.1.1 -output results.json
# 원격 서버에 결과 보고
zscan -target 192.168.1.0/24 -report http://server/api/assets
package main
import (
"flag"
"log"
"os"
"time"
"github.com/zcyberseclab/zscan/pkg/stage"
)
func main() {
target := flag.String("target", "", "IP address or CIDR range to scan")
configPath := flag.String("config", "config/config.yaml", "Path to config file")
templatesDir := flag.String("templates-dir", "templates", "Path to templates directory")
enableGeo := flag.Bool("geo", false, "Enable geolocation and IP info lookup")
enableCensys := flag.Bool("censys", false, "Enable Censys data enrichment")
censysAPIKey := flag.String("censys-api-key", "", "Censys API Key")
censysSecret := flag.String("censys-secret", "", "Censys API Secret")
flag.Parse()
if *target == "" {
log.Fatal("Target IP or CIDR range is required")
}
// Handle Censys credentials from environment if not provided
if *enableCensys {
if *censysAPIKey == "" || *censysSecret == "" {
*censysAPIKey = os.Getenv("CENSYS_API_KEY")
*censysSecret = os.Getenv("CENSYS_SECRET")
}
if *censysAPIKey == "" || *censysSecret == "" {
log.Printf("Warning: Censys integration enabled but credentials not provided. Skipping Censys data enrichment.")
*enableCensys = false
}
}
// Create scanner
scanner, err := stage.NewScanner(*configPath, *templatesDir, *enableGeo, *enableCensys, *censysAPIKey, *censysSecret)
if err != nil {
log.Fatalf("Failed to create scanner: %v", err)
}
defer scanner.Close()
// Perform scan
startTime := time.Now()
results, err := scanner.Scan(*target)
if err != nil {
log.Fatalf("Scan failed: %v", err)
}
// Print results
if err := stage.PrintResults(results); err != nil {
log.Printf("Error printing results: %v", err)
}
duration := time.Since(startTime)
log.Printf("\nScan completed in: %v\n", duration)
}
docker build -t zscan .를 실행하여 이미지를 빌드합니다.
docker run zscan --target 127.0.0.1 --config /app/config/config.yaml을 실행하여 컨테이너를 시작합니다.
ZScan은 YAML 형식의 사용자 정의 POC 개발을 지원합니다. POC 작성에 대한 자세한 내용은 POC 작성 가이드를 참조하세요.
POC 예시:
type: Path Traversal
cve-id: CVE-2021-41773
severity: critical
rules:
- method: GET
path: /icons/.%2e/%2e%2e/etc/passwd
expression: "response.status==200 && response.body.bcontains(b'root:')"
더 많은 예제와 상세 문법은 POC 작성 가이드를 확인하세요.
기존의 자산 또는 취약점 스캐너는 수십 년 전에 구축되었습니다. 폐쇄형 소스이며, 매우 느리고, 벤더 중심적입니다. 오늘날의 공격자는 과거 몇 년이 걸리던 것과 달리, 며칠 만에 새로 발표된 CVE를 인터넷 전체에서 대량으로 악용하고 있습니다. 이러한 변화는 인터넷에서 유행하는 익스플로잇을 다루기 위해 완전히 다른 접근 방식을 요구합니다.
우리는 이 문제를 해결하기 위해 ZScan을 구축했습니다. 전체 스캐닝 엔진 프레임워크를 공개하고 사용자 정의 가능하게 만들어 전 세계 보안 커뮤니티가 협력하여 인터넷에서 유행하는 공격 벡터와 취약점을 해결할 수 있도록 했습니다. 현재 ZScan은 많은 기업, 정부 기관, 대학에서 사용되고 기여하고 있습니다.
코드, 템플릿 라이브러리에 기여하거나 팀에 합류하여 참여할 수 있습니다.
PR을 보내고 이 프로젝트를 계속 업데이트해 주신 모든 훌륭한 커뮤니티 기여자분들께 감사드립니다. ❤️
ZScan은 MIT 라이선스에 따라 배포됩니다.
| 옵션 | 설명 |
|---|
-target | IP 주소 또는 CIDR 범위 (; 또는 , 구분자 지원) |
-port | 스캔할 사용자 정의 포트 (쉼표로 구분) |
-config | 설정 파일 경로 (기본값: config/config.yaml) |
-geo | 지리적 위치 및 IP 정보 조회 활성화 |
-output | 출력 형식: json, html, 또는 md |
-report | 스캔 결과를 보고할 URL |
-apikey | 보고 인증을 위한 API 키 (Bearer 토큰) |
-version | 버전 정보 표시 |