
nmap-vulners v1.5
감지된 네트워크 서비스에 대한 알려진 취약점(CVE)을 식별하기 위해 Vulners API를 쿼리하는 Nmap NSE 스크립트로, 자동화된 CVE 조회 및 CVSS 점수 산정을 통해 표준 포트 스캐닝을 향상시킵니다.
nmap-vulners
nmap 서비스 스캔을 CVE, CVSS 점수 및 알려진 익스플로잇 목록으로 바꿔줍니다.
nmap이 이미 식별한 소프트웨어를 가져와 Vulners 데이터베이스에 그 소프트웨어에 대해 알려진 정보를 질의하고, 그 답변을 스캔 보고서 안에 출력하는 세 가지 NSE 스크립트입니다.

세 가지 스크립트
| 스크립트 | 키 필요 | 기능 |
|---|---|---|
vulners.nse | 아니요 | nmap이 찾은 모든 CPE를 공개 Vulners 엔드포인트로 보내고, 알려진 정보를 CVSS가 높은 순서대로 출력합니다 |
vulners_enterprise.nse | 예 | Vulners API v4를 통한 동일한 조회: CVSS v3 점수와 각 CVE를 참조하는 익스플로잇 |
http-vulners-regex.nse | 아니요 | HTTP 헤더와 페이지 콘텐츠에서 웹 소프트웨어를 핑거프린팅하여, -sV가 이름을 식별하지 못해도 나머지 두 스크립트가 조회할 대상을 확보합니다 |
서로 독립적입니다. 하나만 실행하거나 세 개 모두 실행할 수 있습니다. regex 스크립트는 찾은 결과를 자동으로 나머지 두 스크립트에 전달합니다.
설치
macOS, Linux, Kali, WSL - 인자 없이 한 줄로:
curl -fsSL https://raw.githubusercontent.com/vulnersCom/nmap-vulners/master/install.sh | sh
Windows - 관리자 권한의 PowerShell:
irm https://raw.githubusercontent.com/vulnersCom/nmap-vulners/master/install.ps1 | iex
설치 프로그램은 nmap에 데이터가 저장된 위치를 물어본 다음 스크립트와 해당 데이터 파일을 그 위치에 복사하고, 스크립트 데이터베이스를 재구축한 후 --script vulners가 방금 설치한 대상으로 실제로 해석되는지 확인합니다. nmap은 자체 vulners.nse를 포함하고 있으며, 이 설치가 그것을 대체합니다.
루트 권한 없이 설치 및 기타 옵션
# into ~/.nmap, no sudo; the installer prints the NMAPDIR line to add to your profile
curl -fsSL https://raw.githubusercontent.com/vulnersCom/nmap-vulners/master/install.sh | sh -s -- --user
# a specific directory
./install.sh --prefix /usr/local/share/nmap
# a specific release
./install.sh --ref v1.5
# remove everything it installed
./install.sh --uninstall
PowerShell도 동일한 옵션을 지원합니다: -User, -Prefix, -Ref, -Uninstall.
체크아웃에서 설치
git clone https://github.com/vulnersCom/nmap-vulners
cd nmap-vulners
./install.sh
설치 프로그램은 자신 옆에 있는 파일을 사용하므로, 클론한 내용이 그대로 설치됩니다. 체크아웃 디렉토리에서 스크립트를 바로 실행하는 것도 가능합니다:
nmap -sV --script "$PWD/vulners.nse" <target>
체크아웃에서 실행할 때는 절대 경로를 사용하세요. nmap은 상대 경로
--script ./vulners.nse를 먼저 자체script.db기준으로 해석하므로, 여러분의 스크립트 대신 nmap에 포함된 복사본을 조용히 실행합니다.
수동 설치
파일 5개, 디렉토리 2개:
| 파일 | 복사 위치 |
|---|---|
vulners.nse, vulners_enterprise.nse, http-vulners-regex.nse | <nmap data dir>/scripts/ |
http-vulners-regex.json, http-vulners-paths.txt | <nmap data dir>/nselib/data/ |
그런 다음 sudo nmap --script-updatedb를 실행하세요.
nmap 데이터 디렉토리는 보통 /usr/share/nmap(Debian, Ubuntu, Kali), /usr/local/share/nmap(소스에서 빌드한 경우), /opt/homebrew/share/nmap(Homebrew) 또는 C:\Program Files (x86)\Nmap(Windows)입니다. 확실히 하려면 nmap에 직접 물어보세요:
nmap -d2 --script-help probe 2>&1 | grep nse_main.lua
nse_main.lua가 있는 디렉토리가 이 nmap이 사용하는 디렉토리입니다.
사용법
vulners - 키 불필요
nmap -sV --script vulners [--script-args mincvss=<score>] <target>
nmap이 보고하는 모든 CPE를 조회하며, 각 취약점은 점수, 해당 점수가 사용하는 척도 및 링크와 함께 출력됩니다. 알려진 익스플로잇이 있는 항목은 *EXPLOIT*로 표시되고 임계값과 관계없이 표시됩니다. 실제로 익스플로잇이 존재하는 낮은 심각도의 버그라도 여전히 시스템이 장악될 수 있기 때문입니다.
vulners_enterprise - Vulners API 키
export VULNERS_API_KEY=<token>
nmap -sV --script vulners_enterprise [--script-args mincvss=<score>] <target>

엔터프라이즈 엔드포인트는 CVSS v3 지표와 Vulners가 수집한 익스플로잇 참조 정보를 응답하므로, 익스플로잇이 존재하는 CVE는 *HAS EXPLOIT*로 표시되고 해당 익스플로잇이 그 옆에 나열됩니다. 한 포트의 모든 CPE는 하나의 요청으로 전송됩니다.
http-vulners-regex - -sV가 식별하지 못하는 소프트웨어 핑거프린팅
nmap -sV --script http-vulners-regex [--script-args paths={"/"}] <target>

178개의 패턴이 HTTP 헤더와 페이지 마크업(Server, X-Powered-By, 생성기 태그, 에셋 URL)을 CPE에 매핑합니다: 웹 서버, CMS, 프레임워크, WordPress 플러그인, JavaScript 라이브러리. 발견된 모든 것은 포트에 게시되므로 vulners와 vulners_enterprise가 동일한 스캔에서 이를 조회합니다.
스크립트 인자
vulners
| 인자 | 기본값 | 설명 |
|---|---|---|
vulners.mincvss | 0 | 이 값보다 낮은 점수의 취약점을 숨깁니다. 점수가 없는 게시판과 익스플로잇은 항상 표시됩니다 |
vulners.api_host | vulners.com | API의 호스트 이름 |
vulners.api_port | 443 | api_host의 포트 |
vulners_enterprise
| 인자 | 기본값 | 설명 |
|---|---|---|
vulners_enterprise.mincvss | 0 | 위와 동일 |
vulners_enterprise.api_key | - | API 토큰. 아래의 환경 변수를 권장합니다 |
vulners_enterprise.api_key_file | - | 첫 번째 줄이 토큰인 파일의 절대 경로 |
vulners_enterprise.api_host | vulners.com | API의 호스트 이름 |
vulners_enterprise.api_port | 443 | api_host의 포트 |
http-vulners-regex
| 인자 | 기본값 | 설명 |
|---|---|---|
http-vulners-regex.paths | http-vulners-paths.txt(경로 125개) | Lua 경로 목록 또는 한 줄에 경로 하나씩 적힌 파일 이름을 지정하는 단일 문자열 |
전체 경로 목록은 단일 HTTP 파이프라인으로 전송됩니다. 읽을 수 없는 파일이 지정되면 기본 제공 목록으로 대체하지 않고 스크립트가 중지되므로, 파일 이름의 오타로 인해 경로 3개짜리 스캔이 경로 125개짜리 스캔으로 바뀌는 일은 없습니다.
API 키를 보관할 위치
우선순위 순서:
- 환경 변수의
VULNERS_API_KEY --script-args vulners_enterprise.api_key_file=/absolute/path--script-args vulners_enterprise.api_key=<token>
세 번째 방법은 편리하지만 누출 위험이 있습니다. nmap은 자신의 명령줄을 모든 보고서에 복사하므로 토큰이 -oX 출력의 args 속성과 셸 히스토리에 남게 됩니다. 스크립트 자체는 디버그 출력을 포함해 어디에도 토큰을 기록하지 않습니다. 이를 검증하는 회귀 테스트가 있습니다.
토큰은 여러분의 vulners.com 계정에 있습니다. 토큰이 없으면 vulners_enterprise는 침묵하며 아무것도 보내지 않습니다.
세 스크립트가 함께 동작하는 방식
nmap -sV
|
+-- service fingerprint --> port.version.cpe ------------+
| |
+-- http-vulners-regex.nse |
requests the path list in one pipeline |
matches headers and bodies against 178 patterns |
publishes the CPEs it found for that port ---------+
|
v
vulners.nse / vulners_enterprise.nse
one batched request per port
answers cached for the whole scan
sorted by CVSS, exploits marked
기계 판독 가능한 출력
스크립트가 출력하는 모든 것은 구조화되어 있으므로, 사람이 읽는 텍스트를 건드리지 않고도 -oX 출력을 파싱할 수 있습니다:
<script id="vulners_enterprise">
<table key="cpe:/a:apache:http_server:2.4.7">
<table>
<elem key="id">CVE-2021-44790</elem>
<elem key="type">cve</elem>
<elem key="cvss">9.8</elem>
<elem key="cvss_type">cvss3.1</elem>
</table>
<table>
<elem key="id">EDB-ID:51193</elem>
<elem key="type">exploitdb</elem>
<elem key="cvss">9.8</elem>
<elem key="cvss_type">cvss3.1</elem>
<elem key="is_exploit">true</elem>
</table>
</table>
</script>
키는 id, type, cvss, cvss_type 및 is_exploit이며, is_exploit는 익스플로잇이 있는 항목에만 존재합니다. 결과 테이블은 해당 결과가 발견된 CPE를 기준으로 키가 지정됩니다. 점수가 없는 게시판에는 cvss와 cvss_type이 모두 포함되지 않습니다.
정중한 스캔
네트워크 스캔은 겉보기보다 API에 훨씬 적은 요청을 보냅니다:
- 한 포트의 모든 CPE는 하나의 배치 요청으로 전송됩니다
- 답변은 전체 스캔 동안 캐시되므로, 동일한 서버 100대도 조회 1회만큼만 비용이 들며 100회가 아닙니다
- 이미 진행 중인 조회는 반복하지 않고 완료를 기다립니다
- 125개 경로 스캔은 126개가 아닌 5개의 TCP 연결로 실행되며, 서버가 지원하는 경우 압축된 페이지를 요청합니다
- 속도 제한이나 장애가 발생하면 호스트별 재시도 대신 스캔의 요청 자체가 중지됩니다
개발
테스트, 위생 검사 및 CONTRIBUTING.md는 git 리포지토리에만 있습니다. 릴리스 아카이브에는 스크립트와 해당 데이터가 포함됩니다. 세 가지 검사가 있으며, 명시된 경우를 제외하면 모두 오프라인으로 실행됩니다:
nmap -sn -Pn --script ./tests/run.nse --script-args testdir=tests,root=. 127.0.0.1
python3 tests/e2e/run_e2e.py
python3 tools/check.py
110개의 단위 테스트 케이스가 실제 NSE 라이브러리를 대상으로 nmap 내부에서 실행되고, 33개의 엔드투엔드 테스트 케이스는 로컬 웹 서버와 대체 Vulners API를 대상으로 실제 nmap 바이너리를 구동합니다. 위생 검사는 시크릿, 스캔 출력 및 편집기 잔여 파일이 트리에 남지 않도록 방지합니다. python3 tests/e2e/run_e2e.py --live는 실제 서비스를 대상으로 6가지 검사를 추가합니다. CONTRIBUTING.md를 참조하세요.
FAQ
무언가를 익스플로잇하나요? 아니요. 스크립트는 배너와 페이지를 읽고 데이터베이스에 질의할 뿐입니다. nmap의 safe 카테고리에 속합니다.
API 키 없이도 작동하나요? 네. vulners와 http-vulners-regex는 키가 필요 없지만 vulners_enterprise는 필요합니다.
어떤 취약점은 cvss2.0으로 표시되는데 다른 취약점은 cvss3.1로 표시되는 이유는 무엇인가요? 해당 라벨은 점수가 속한 척도를 나타냅니다. Vulners는 출처가 게시한 척도를 그대로 반환합니다. v2 점수 9.3은 v3 점수 9.3과 같지 않습니다.
mincvss를 설정했는데 왜 낮은 점수의 항목이 표시되나요? 알려진 익스플로잇이 있거나 출처에서 점수를 매기지 않았기 때문입니다. 둘 다 의도된 동작입니다.
취약하다고 알고 있는 호스트에서 아무것도 찾지 못했습니다. -d2 옵션으로 실행해 보세요. 스크립트가 질의한 모든 CPE를 로그로 기록합니다. 보통 nmap이 서비스 이름은 식별하지만 버전은 식별하지 못한 경우이며, 이때는 조회할 버전이 없습니다.
라이선스
스크립트는 Nmap 자체와 동일한 라이선스로 배포됩니다. Nmap Public Source License는 LICENSE에서, 그 의미는 nmap.org/npsl에서 확인할 수 있습니다.
취약점 데이터는 Vulners에서 제공되며 해당 이용 약관이 적용됩니다.
관련 자료
- vulners.com - 이 스크립트의 기반이 되는 데이터베이스
- vulnersCom/api - Python 클라이언트
- vulnersCom/burp-vulners-scanner - Burp Suite에서 동일한 데이터 활용
- nmap.org/book/nse.html - NSE 스크립트의 작동 방식
Vulners 팀이 유지 관리합니다 <[email protected]>
#nmap #nse #vulnerability-scanner #cve #cvss #cpe #vulners
#security-tools #pentest #infosec #network-scanner #exploit-database
#lua #vulnerability-detection #security-automation