
nmap-vulners v1.5
감지된 네트워크 서비스에 대한 알려진 취약점(CVE)을 식별하기 위해 Vulners API를 쿼리하는 Nmap NSE 스크립트로, 자동화된 CVE 조회 및 CVSS 점수 산정을 통해 표준 포트 스캐닝을 향상시킵니다.
nmap-vulners
nmap 서비스 스캔을 실제 공격 대상이 되는 CVE 및 익스플로잇의 순위 목록으로 변환합니다.
nmap이 이미 식별한 소프트웨어를 가져와 Vulners 데이터베이스에 해당 소프트웨어에 대해 알려진 내용을 질의하고, 그 답변을 스캔 보고서 안에 출력하는 하나의 NSE 스크립트입니다. 실제로 익스플로잇 가능한 항목을 기준으로 가장 심각한 것부터 나열합니다.
스캔용으로 공개된 호스트에 대한 실제 스캔입니다. 키 없음, 그다음 키 있음, 그다음 웹 포트: nmap의 -sV가 Coyote 배너를 보고하고 스윕이 그 뒤의 Tomcat과 jQuery를 식별합니다.
기능
열려 있는 모든 포트에 대해 nmap이 식별한 소프트웨어(-sV가 생성한 CPE)를 조회하고 Vulners가 해당 소프트웨어에 대해 알고 있는 내용을 출력합니다. 점수만이 아니라 실제로 익스플로잇되고 있는 항목을 기준으로 가장 심각한 것부터 나열하며, 각 행은 해당 정보의 상세 페이지로 연결되는 링크입니다.
HTTP 포트에서는 웹 스택 자체도 지문 분석하여 -sV가 볼 수 없는 소프트웨어(애플리케이션 프레임워크, CMS, 리버스 프록시 뒤의 PHP 버전)를 식별합니다. 721개의 규칙이 버전 정보를 담고 있는 응답의 부분( Server 헤더, X-Powered-By, 쿠키, 페이지 제목, <meta> 태그, <script src> 파일 이름 및 본문)을 읽습니다. 이러한 식별 결과도 조회되어 포트에 게시되므로 나머지 스캔에서 활용할 수 있습니다.
스윕 외에 추가로 수행하는 두 가지 작업:
- nmap 자체의 서비스 배너를 읽습니다.
-sV가 서비스를 식별하지 못한 경우, 원시 배너를 FTP, SMTP, SSH, MySQL, DNS, NTP, LDAP 등에 대한 규칙과 대조합니다. 이는 추가 요청 비용이 들지 않으며, 그 외에는 포트가 아무것도 보고하지 않을 상황에서 유용합니다. - 자신을 밝히지 않는 제품에 질의합니다. 자신의 이름은 밝히면서 버전을 숨기는 CMS는 흔하며, 아무리 패턴 매칭을 해도 페이지에 없는 숫자를 추출할 수는 없습니다. 제품이 인식되었지만 버전이 인식되지 않은 경우, 답을 알 수 있는 곳에 요청 하나를 보냅니다. Drupal의 경우
/CHANGELOG.txt, Joomla의 경우/administrator/manifests/files/joomla.xml입니다. 여섯 가지 프로빙 대상 제품 중 어느 것도 실행하지 않는 호스트에는 추가 요청이 전송되지 않습니다.```sh nmap -sV --script vulners
That is the whole interface. It works without an API key; with one it tells you
more. There is no mode switch.```
PORT STATE SERVICE VERSION
80/tcp open http Apache httpd 2.4.7 ((Ubuntu))
| vulners: cpe:/a:apache:http_server:2.4.7 272 findings, 56 exploitable
| SEVERITY CVSS AI FLAGS LINK
| ======== ==== ==== ======= ==============================================================
| CRITICAL 10.0 8.8 EXP https://vulners.com/gitee/3E6BA608-776F-5B1F-9BA5-589CD2A5A351
| CRITICAL 9.8 9.9 EXP https://vulners.com/zdt/1337DAY-ID-39214
| CRITICAL 9.8 9.6 EXP https://vulners.com/packetstorm/PACKETSTORM:171631
| CRITICAL 9.8 9.9 https://vulners.com/cve/CVE-2021-44790
| CRITICAL 9.8 9.8 https://vulners.com/cve/CVE-2023-25690
|_ 262 more not shown; -v shows all, -vv adds where each was found
키가 있으면 동일한 호스트에 대한 동일한 스캔이 다르게 응답합니다. KEV는
CISA가 해당 취약점이 실제 환경에서 악용된 것으로 기록했음을 의미하고, EPSS는
악용될 게시된 확률입니다:```
| vulners: cpe:/a:apache:http_server:2.4.7 272 findings, 78 exploitable
| SEVERITY CVSS EPSS FLAGS LINK
| ======== ==== ==== ======= ==============================================================
| CRITICAL 9.1 >99% KEV EXP https://vulners.com/cve/CVE-2024-38475
| CRITICAL 9.0 >99% KEV EXP https://vulners.com/cve/CVE-2021-40438
| CRITICAL 9.1 >99% KEV https://vulners.com/cnvd/CNVD-2024-36387
| CRITICAL 10.0 71% EXP https://vulners.com/gitee/3E6BA608-776F-5B1F-9BA5-589CD2A5A351
| CRITICAL 9.8 97% EXP https://vulners.com/cve/CVE-2021-44790
|_ 262 more not shown; -v shows all, -vv adds where each was found
동일한 272개의 발견 항목, 다른 순서, 다른 최상위 행 - 그리고 그중 22개는 더 많이
악용 가능한 것으로 알려져 있는데, 이는 각 익스플로잇을 해당 CVE에 연결하는 키가 있기 때문이다.
이 두 결과 모두 vulners.com의 실제 응답으로, 해당 배너를 제시하는 로컬 서버를 대상으로 캡처된 것이다.
## 순위
사실은 예측보다 우선한다. 발견 항목은 다음과 같이 정렬된다:
1. **CISA KEV** - 실제 환경에서 악용된 것으로 기록됨
2. **SSVC `active`** - 조정자가 악용이 진행 중이라고 판단한 경우
3. **익스플로잇 존재** - 이 취약점 또는 해당 CVE에 대해 코드가 공개됨
4. **높은 EPSS** - 모델이 악용을 예측함
5. 그 외 모든 항목
CVSS는 동일한 대역 내에서만 동률을 깨며, 대역 간에는 적용되지 않는다: 악용된 7.5는
악용되지 않은 9.8보다 더 심각한 문제이며, 이를 말해주는 순서가 바로 이것이다.
열은 데이터를 따른다. 응답이 담지 않은 신호는 빈 셀을 표시하는 대신 해당 열을 잃는다.
빈 EPSS는 "조용함"으로 읽히기 때문이며, 이는 존재하지 않는 필드가 뒷받침할 수 없는 주장이다.
## API 키가 추가하는 것
| | |
|---|---|
| **키 없음** | nmap이 찾은 모든 CPE가 무료 엔드포인트에서 조회된다. 발견 항목, 점수, 익스플로잇 플래그 및 Vulners 자체 AI 점수. 크레딧 없음, 계정 없음 |
| **키 있음, 크레딧 없음** | 각 발견 항목은 id 엔드포인트가 아는 정보를 얻는다: 제목, 날짜, 상위 권고 또는 익스플로잇 페이지, 익스플로잇-대-CVE 연결, CISA KEV, 그리고 라이선스에 따라 EPSS 및 SSVC |
| **키 있음, 크레딧 1개** | 무료 경로로 전혀 식별할 수 없었던 소프트웨어가 원시 배너에서 식별된다. 여기서 비용이 드는 유일한 항목이며, CPE가 없는 서비스에만 해당한다 |
이미 CPE를 보유한 포트는 크레딧을 소모하지 않는다: 네 가지 제품을 대상으로 측정한 결과,
무료 조회는 CPE에 대해 유료 조회와 **동일한 CVE**를 반환한다. 크레딧이 구매하는 것은
식별이지 더 많은 취약점이 아니다.
무료 키는 [vulners.com/userinfo](https://vulners.com/userinfo)에서 얻을 수 있다.
## 설치
**macOS, Linux, Kali, WSL** - 인수 없이 한 줄로:```sh
curl -fsSL https://raw.githubusercontent.com/vulnersCom/nmap-vulners/master/install.sh | sh
Windows - 관리자 권한의 PowerShell:```powershell irm https://raw.githubusercontent.com/vulnersCom/nmap-vulners/master/install.ps1 | iex
설치 프로그램은 nmap에 데이터가 저장되는 위치를 묻고, 스크립트와 해당 데이터 파일을 그곳에 복사한 다음 스크립트 데이터베이스를 재구축하고, `--script vulners`가 방금 설치한 항목으로 실제로 해석되는지 확인합니다. nmap에는 자체 `vulners.nse`가 포함되어 있으며, 이 설치가 그것을 대체합니다.
<details>
<summary><b>루트 권한 없이, 및 기타 옵션</b></summary>```sh
# 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 v2.0
# remove everything it installed
./install.sh --uninstall
PowerShell도 동일한 옵션을 사용합니다: -User, -Prefix, -Ref, -Uninstall.
체크아웃에서
```sh git clone https://github.com/vulnersCom/nmap-vulners cd nmap-vulners ./install.sh ``` 설치 프로그램은 옆에 있는 파일들을 사용하므로, 이 방식은 여러분이 클론한 내용을 정확히 설치합니다. 체크아웃 디렉터리에서 스크립트를 직접 실행해도 작동합니다:```sh nmap -sV --script "$PWD/vulners.nse" ``` > 체크아웃에서 실행할 때는 **절대** 경로를 사용하세요. nmap은 상대 경로 > `--script ./vulners.nse`를 자체 `script.db`에 대해 먼저 확인하고, > nmap에 포함된 복사본을 조용히 실행하므로 여러분의 것이 아닌 복사본이 실행됩니다.수동 설치
파일 하나: vulners.nse를 <nmap data dir>/scripts/에 복사하고
sudo nmap --script-updatedb를 실행하세요. 배치할 다른 것은 없습니다. 스크립트는
사전을 스캔 시점에 다운로드하고 디스크에 아무것도 쓰지 않으므로, 잊을 것도 없습니다.
이전에는 실행은 되지만 아무것도 찾지 못하고 그 이유를 알려주지 않는 스크립트가
생기곤 했습니다.
1.x에서 업그레이드하는 경우, 해당 디렉터리에서 vulners_enterprise.nse와
http-vulners-regex.nse도 삭제하세요. 남아 있는 http-vulners-regex.nse는
여전히 default 카테고리를 포함하며, 일반 -sC에서도 대상을 계속 훑습니다.
설치 프로그램이 이 작업을 대신 처리합니다.
nmap 데이터 디렉터리는 보통 /usr/share/nmap(Debian, Ubuntu, Kali),
/usr/local/share/nmap(소스에서 빌드), /opt/homebrew/share/nmap
(Homebrew) 또는 C:\Program Files (x86)\Nmap(Windows)입니다. 확실히 하려면 nmap에 물어보세요:```sh
nmap -d2 --script-help probe 2>&1 | grep nse_main.lua
`nse_main.lua` 파일이 들어 있는 디렉터리가 이 nmap이 사용하는 디렉터리입니다.
</details>
## 스크립트 인자
| 인자 | 기본값 | 의미 |
|---|---|---|
| `vulners.mincvss` | `0` | 이 값보다 낮은 점수의 결과를 숨깁니다. 점수가 매겨지지 않은 게시판과 알려진 익스플로잇이 있는 항목은 임계값과 관계없이 표시됩니다 |
| `vulners.paths` | 게시된 939개 경로 | 웹 스캔용 경로: Lua 목록, 줄마다 경로 하나씩 있는 파일을 가리키는 문자열 하나, 또는 스캔을 끄는 `none`. 읽을 수 없는 파일을 지정하면 게시된 목록으로 대체하지 않고 스캔을 중단하고 그 사실을 알립니다 |
| `vulners.width` | `80` | 테이블이 배치되는 터미널 너비 |
| `vulners.max_items` | `32` | 전체 스캔에서 청구되는 항목의 상한 |
| `vulners.api_key` | - | API 토큰. 누출 위험: nmap이 자체 명령줄을 `-oX`에 복사합니다 |
| `vulners.api_key_file` | - | 첫 줄이 토큰인 파일의 절대 경로 |
| `vulners.api_host` | `vulners.com` | API의 호스트 이름 |
| `vulners.api_port` | `443` | `api_host`의 포트 |
이름만 사용해도 되므로 `--script-args mincvss=7`만으로 충분합니다.