
Wappalyzer 대안으로 기술 탐지
이 프로젝트는 Wappalyzer 브라우저 확장 프로그램과 그 핑거프린트를 사용하여 기술을 탐지하는 명령줄 도구 및 파이썬 라이브러리입니다. 공식 오픈소스 프로젝트가 중단된 이후 등장한 다른 프로젝트들은 오래된 핑거프린트를 사용하며 동적 웹 앱에서 정확도가 떨어집니다. 이 프로젝트는 Playwright를 통해 Chromium에서 확장 프로그램을 실행함으로써 이러한 한계를 극복합니다.

파이썬 패키지를 설치한 후 Playwright의 Chromium 브라우저를 설치하세요:
python -m playwright install chromium
최소 Linux 컨테이너에서는 Chromium의 시스템 종속성도 함께 설치하세요:
python -m playwright install-deps chromium
pipx install wappalyzer
pipx run --spec playwright playwright install chromium
라이브러리로 사용하려면 pip를 사용하여 격리된 컨테이너(예: venv 또는 docker) 내에 설치하세요. --break-system-packages를 사용하여 '일반' 설치를 할 수도 있지만 권장되지 않습니다.
pip install wappalyzer
python -m playwright install chromium
git clone https://github.com/s0md3v/wappalyzer-next.git
cd wappalyzer-next
docker compose build
docker compose run --rm wappalyzer -i https://example.com
docker compose run --rm wappalyzer -i urls.txt -w 3 -oJ output.json
일반적인 사용 예시는 아래에 나와 있습니다. 더 많은 정보는 모든 옵션 목록을 참조하세요.
wappalyzer -i https://example.comwappalyzer -i urls.txt -w 3wappalyzer -i urls.txt -t 15wappalyzer -i https://example.com -c "sessionid=abc123; token=xyz789"wappalyzer -i https://example.com -oJ results.jsonwappalyzer -i https://example.com -oJ출력 플래그를 파일 없이 사용하면 보고서가 stdout으로 기록됩니다. 상태 줄, 배너 텍스트, 오류는 stderr로 기록됩니다.
참고: 정확성을 위해 'full' 스캔 유형(기본값)을 사용하세요. 'fast' 및 'balanced'는 브라우저 에뮬레이션을 사용하지 않습니다.
-i: 입력 URL 또는 URL이 포함된 파일 (한 줄에 하나씩)--scan-type: 스캔 유형 (기본값: 'full')
fast: 빠른 HTTP 기반 스캔 (1개의 요청 전송)balanced: 더 많은 요청을 사용하는 HTTP 기반 스캔full: Wappalyzer 확장 프로그램을 사용한 완전한 스캔-w, --workers: 동시 작업자 수 (기본값: 5; 전체 스캔은 최대 3으로 제한)-t, --timeout: 전체 스캔에서 페이지 로드를 기다리는 최대 시간(초) (기본값: 30)-oJ [file]: JSON 출력 파일 경로, 파일을 생략하거나 -로 설정하면 stdout-oC [file]: CSV 출력 파일 경로, 파일을 생략하거나 -로 설정하면 stdout-oH [file]: HTML 출력 파일 경로, 파일을 생략하거나 -로 설정하면 stdout파이썬 라이브러리는 pypi에서 wappalyzer로 제공되며 동일한 이름으로 임포트할 수 있습니다.
둘 이상의 URL을 스캔할 때는 Wappalyzer를 사용하세요. 브라우저는 한 번 시작되고 재사용되며 with 블록이 종료되면 닫힙니다.
from wappalyzer import Wappalyzer
with Wappalyzer(workers=3, timeout=30) as scanner:
results = scanner.analyze_many([
'https://example.com',
'https://github.com',
'https://python.org',
])
for url, technologies in results.items():
print(url)
for name, data in technologies.items():
version = f" {data['version']}" if data['version'] else ""
print(f" {name}{version}")
동일한 스캐너를 사용하여 Chromium을 다시 열지 않고 한 번에 하나의 URL을 스캔할 수도 있습니다:
from wappalyzer import Wappalyzer
with Wappalyzer(workers=3, timeout=30) as scanner:
github = scanner.analyze('https://github.com')
python = scanner.analyze('https://python.org')
단일 URL의 경우 analyze()가 더 간단합니다. 자체 스캐너를 생성하고 한 번 스캔한 후 닫습니다.
from wappalyzer import analyze
results = analyze(
url='https://example.com',
scan_type='full', # 'fast', 'balanced', or 'full'
cookie='sessionid=abc123',
timeout=30
)
대량 작업을 위해 루프에서 최상위 analyze() 함수를 호출하지 마세요. 재사용되는 스캐너에서 Wappalyzer.analyze_many() 또는 Wappalyzer.analyze()를 사용하여 Chromium과 Wappalyzer 확장 프로그램이 모든 URL에 대해 다시 로드되지 않도록 하세요.
url (str): 분석할 URLscan_type (str, optional): 수행할 스캔 유형
'fast': 빠른 HTTP 기반 스캔'balanced': 더 많은 요청을 사용하는 HTTP 기반 스캔'full': JavaScript 실행을 포함한 완전한 스캔 (기본값)workers (int, optional): 전체 스캔을 위해 생성할 브라우저 작업자 수 (기본값: 1)cookie (str, optional): 인증된 스캔을 위한 쿠키 헤더 문자열timeout (int, optional): 전체 스캔에서 페이지 로드를 기다리는 최대 시간(초) (기본값: 30)URL을 키로, 탐지된 기술을 값으로 하는 딕셔너리를 반환합니다:
{
"https://github.com": {
"Amazon S3": {
"version": "",
"confidence": 100,
"categories": ["CDN"],
"groups": ["Servers"]
},
"React Router": {
"version": "6",
"confidence": 100,
"categories": ["JavaScript frameworks"],
"groups": ["Web development"]
}
},
"https://example.com": {}
}
전체 스캐너는 Playwright를 통해 Chromium에서 Wappalyzer 확장 프로그램을 실행합니다. Playwright의 Chromium 확장 프로그램 지원은 직접적이며 geckodriver나 Selenium이 필요하지 않습니다.
-c, --cookie: 인증된 스캔을 위한 쿠키 헤더 문자열