Nmap 을 이용한 취약점 스캔

NmapBeginner
지금 연습하기

소개

이 실습에서는 네트워크 탐색 및 보안 감사를 위한 강력한 오픈 소스 도구인 Nmap(Network Mapper) 을 사용한 네트워크 스캔의 기초를 배웁니다. 기본적인 포트 스캔부터 시작하여 서비스 및 버전 탐지로 나아가고, Nmap 스크립팅 엔진 (NSE) 을 활용해 취약점 점검을 수행하는 방법을 살펴봅니다. 마지막으로, 보고를 위해 스캔 결과를 다양한 형식으로 분석하고 저장하는 방법을 익히게 됩니다. 이 실습은 효과적인 네트워크 보안 평가를 위한 Nmap 의 핵심 기능들을 단계별 실습을 통해 안내합니다.

기본 네트워크 스캔 수행

첫 번째 단계에서는 기본적인 스캔을 수행하며 Nmap 의 사용법을 익힙니다. 기본 스캔은 대상 장비에서 어떤 포트가 열려 있는지 확인하는 데 사용됩니다. 열린 포트는 웹 서버나 SSH 와 같은 서비스가 실행 중이며 연결을 기다리고 있음을 의미합니다.

실습 환경에는 연습을 위해 localhost(사용자의 가상 머신) 에서 실행되는 여러 서비스가 미리 구성되어 있으며, nmap 도구도 이미 설치되어 있습니다.

  1. 먼저 Nmap 이 설치되어 있는지 확인하고 버전을 점검합니다. 터미널을 열고 다음 명령어를 실행하세요.

    nmap --version
    

    Nmap 버전을 확인하는 다음과 같은 출력이 나타나야 합니다.

    Nmap version 7.80 ( https://nmap.org )
    Platform: x86_64-pc-linux-gnu
    Compiled with: liblua-5.3.3 openssl-1.1.1f libssh2-1.8.0 libz-1.2.11 libpcre-8.39 nmap-libpcap-1.9.1
    Compiled without:
    Available nsock engines: epoll poll select
    
  2. 이제 localhost를 대상으로 첫 번째 스캔을 수행합니다. 이 명령어는 로컬 머신에서 가장 흔히 사용되는 열린 포트들을 확인하도록 Nmap 에 지시합니다.

    nmap localhost
    
  3. 출력을 확인합니다. Nmap 은 발견된 열린 포트 목록과 해당 포트의 상태, 그리고 그와 관련된 일반적인 서비스를 표시합니다. 이번 실습을 위해 준비된 서비스들이 포함된 결과는 다음과 같이 나타납니다.

    Starting Nmap 7.80 ( https://nmap.org ) at ...
    Nmap scan report for localhost (127.0.0.1)
    Host is up (0.000092s latency).
    Not shown: 995 closed ports
    PORT     STATE SERVICE
    22/tcp   open  ssh
    2121/tcp open  ccproxy-ftp
    2222/tcp open  EtherNetIP-1
    3001/tcp open  nessus
    8080/tcp open  http-proxy
    
    Nmap done: 1 IP address (1 host up) scanned in 0.04 seconds
    

이 초기 스캔은 실행 중인 서비스의 지도를 제공하며, 이는 모든 네트워크 보안 평가의 첫 번째 단계가 됩니다.

서비스 버전 탐지

어떤 포트가 열려 있는지 아는 것도 유용하지만, 보안 분석가에게는 해당 포트에서 실행 중인 정확한 소프트웨어와 버전을 파악하는 것이 훨씬 더 강력한 정보가 됩니다. 오래된 소프트웨어는 취약점의 주요 원인이기 때문입니다. 이번 단계에서는 Nmap 을 사용하여 서비스 및 버전 탐지를 수행합니다.

열린 포트를 조사하여 상세한 서비스 및 버전 정보를 확인하도록 지시하는 -sV 플래그를 사용하겠습니다.

  1. localhost를 대상으로 버전 탐지 스캔을 실행합니다. 스캔 효율을 높이기 위해 모든 포트를 스캔하는 대신 1 단계에서 발견한 특정 포트 (22, 2121, 2222, 3001, 8080) 를 대상으로 지정합니다.

    nmap -sV -p 22,8080 localhost
    

    전문가 팁: 특정 포트를 지정하면 스캔 시간을 획기적으로 줄일 수 있습니다. -sV 옵션으로 전체 포트 범위를 스캔하면 몇 분이 걸릴 수 있지만, 이처럼 대상을 좁히면 보통 몇 초 내에 완료됩니다.

  2. 1 단계의 기본 스캔 결과와 비교해 보세요. 이제 각 포트에서 실행 중인 소프트웨어의 상세 정보를 제공하는 VERSION 열이 추가된 것을 볼 수 있습니다.

    출력 결과는 다음과 같이 더 상세해집니다.

    Starting Nmap 7.80 ( https://nmap.org ) at ...
    Nmap scan report for localhost (127.0.0.1)
    Host is up (0.00011s latency).
    Not shown: 995 closed ports
    PORT     STATE SERVICE VERSION
    22/tcp   open  ssh     OpenSSH 8.9p1 Ubuntu 3ubuntu0.13 (Ubuntu Linux; protocol 2.0)
    8080/tcp open  http    nginx 1.18.0 (Ubuntu)
    Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
    
    Nmap done: 1 IP address (1 host up) scanned in 2.15 seconds
    

이 정보는 매우 중요합니다. 예를 들어, 스캔 결과 알려진 치명적 취약점이 있는 구버전 nginx가 발견되었다면, 보안 조치를 어디에 집중해야 할지 정확히 알 수 있습니다.

Nmap 스크립팅 엔진 (NSE) 사용

Nmap 스크립팅 엔진 (NSE) 은 Nmap 의 가장 강력한 기능 중 하나입니다. 이를 통해 스크립트 라이브러리를 사용하여 다양한 네트워크 작업을 자동화할 수 있습니다. 이러한 스크립트는 고급 탐색, 취약점 탐지, 심지어 익스플로잇 수행에도 사용될 수 있습니다.

이번 단계에서는 안전하면서도 탐색에 유용한 기본 스크립트 세트를 실행하는 -sC 플래그를 사용합니다.

  1. localhost를 대상으로 기본 스크립트가 활성화된 Nmap 스캔을 실행합니다. -sC 플래그는 개별 스크립트를 일일이 지정하지 않고도 더 많은 정보를 얻을 수 있는 편리한 방법입니다.

    nmap -sC localhost
    
  2. 결과를 검토합니다. 각 포트 아래에 들여쓰기된 추가 정보를 볼 수 있습니다. 이것이 바로 NSE 스크립트의 출력 결과입니다. 예를 들어, http-title 스크립트는 8080 포트 웹 페이지의 제목을 가져올 수 있고, SSL 스크립트는 인증서 상세 정보를 보고할 수 있습니다.

    출력은 더욱 상세해집니다.

    Starting Nmap 7.80 ( https://nmap.org ) at ...
    Nmap scan report for localhost (127.0.0.1)
    Host is up (0.000099s latency).
    Other addresses for localhost (not scanned): ::1
    Not shown: 995 closed ports
    PORT     STATE SERVICE
    22/tcp   open  ssh
    2121/tcp open  ccproxy-ftp
    2222/tcp open  EtherNetIP-1
    3001/tcp open  nessus
    | ssl-cert: Subject: commonName=localhost
    | Subject Alternative Name: DNS:localhost
    | Not valid before: 2024-07-18T03:37:05
    |_Not valid after:  2034-07-16T03:37:05
    8080/tcp open  http-proxy
    |_http-open-proxy: Proxy might be redirecting requests
    |_http-title: Site doesn't have a title (text/html).
    
    Nmap done: 1 IP address (1 host up) scanned in 0.62 seconds
    

보시는 것처럼, 기본 스크립트는 2121 포트에서 익명 FTP 로그인이 허용됨을 발견하고 8080 포트 웹 페이지의 제목을 가져왔습니다. 이는 자동으로 수집된 매우 가치 있는 정보입니다.

취약점 스캔 실행

이제 본격적으로 취약점을 찾아볼 시간입니다. NSE 에는 알려진 보안 결함을 확인하도록 특별히 설계된 스크립트 카테고리가 포함되어 있습니다. 광범위한 취약점 스캔을 수행하기 위해 vuln 카테고리의 모든 스크립트를 실행할 수 있습니다.

시간이 오래 걸리거나 중요한 스캔의 결과는 항상 파일로 저장하는 것이 좋습니다. Nmap 의 일반 텍스트 형식으로 결과를 저장하기 위해 -oN 플래그를 사용하겠습니다.

  1. 먼저 지금까지 배운 내용을 결합해 봅니다. 서비스 탐지 (-sV) 를 포함하고 모든 취약점 스크립트 (--script vuln) 를 실행하는 스캔을 수행합니다. 결과는 vuln_scan.txt라는 파일로 저장합니다.

    nmap -sV --script vuln -oN vuln_scan.txt localhost
    

    이 스캔은 열린 각 포트에 대해 많은 스크립트를 실행하므로 완료까지 몇 분 정도 걸릴 수 있습니다.

  2. 스캔이 완료되면 현재 디렉토리 (/home/labex/project) 에 vuln_scan.txt 파일이 생성됩니다. cat 명령어를 사용하여 내용을 확인할 수 있습니다.

    cat vuln_scan.txt
    
  3. 출력 파일이 길기 때문에 키워드로 검색하는 것이 더 효율적입니다. grep을 사용하여 취약점을 나타내는 줄을 찾습니다. "VULNERABLE"이라는 단어는 강력한 지표입니다.

    grep "VULNERABLE" vuln_scan.txt
    

    발견된 취약점이 있다면 해당 내용이 출력됩니다. 이 실습 환경에서는 Apache 의 byterange 필터와 관련된 취약점이 나타날 가능성이 높습니다.

    |   VULNERABLE:
    |     State: VULNERABLE
    

    상세한 취약점 정보를 보려면 특정 CVE 를 검색하거나 전체 스캔 출력을 확인하면 됩니다. 예를 들어, 8080 포트에서 Apache DoS 취약점 (CVE-2011-3192) 을 발견할 수 있습니다. 참고로 clamav-exec: ERROR와 같은 스크립트 오류가 보일 수 있는데, 이는 특정 취약점 스크립트가 실습 환경에서 제대로 실행되지 않을 때 발생하는 정상적인 현상이므로 무시해도 됩니다.

이 단계는 단순한 탐색을 넘어 표적화된 보안 감사로 나아가며 약점을 능동적으로 조사하는 방법을 보여줍니다.

스캔 결과 저장 및 형식화

발견한 사항을 적절하게 문서화하고 보고하는 것은 보안 전문가에게 필수적인 기술입니다. Nmap 은 다양한 용도에 적합한 여러 출력 형식을 지원합니다. 마지막 단계에서는 결과를 여러 형식으로 저장하고 사용자 친화적인 HTML 보고서를 만드는 방법을 배웁니다.

  1. 먼저 보고서를 체계적으로 관리하기 위해 전용 디렉토리를 생성합니다.

    mkdir -p ~/project/reports
    
  2. 이제 스캔을 다시 실행하되, 이번에는 일반 텍스트 (-oN) 와 XML(-oX) 두 가지 형식으로 동시에 저장합니다. XML 은 다른 도구로 처리하기에 이상적인 구조화된 형식입니다.

    nmap -sV -p 8080 --script vuln -oN ~/project/reports/scan_report.txt -oX ~/project/reports/scan_report.xml localhost
    
  3. XML 형식은 사람이 읽기에 편하지 않습니다. Nmap 은 XML 파일을 깔끔한 HTML 보고서로 변환해주는 xsltproc라는 유틸리티를 제공합니다. 다음 명령어를 실행하여 scan_report.html을 생성하세요.

    xsltproc ~/project/reports/scan_report.xml -o ~/project/reports/scan_report.html
    
  4. ~/project/reports 디렉토리에 모든 보고서 파일이 생성되었는지 확인합니다. ls -l 명령어를 사용하여 파일 목록과 상세 정보를 확인하세요.

    ls -l ~/project/reports
    

    세 개의 보고서 파일이 보여야 합니다.

    total 40
    -rw-rw-r-- 1 labex labex 14276 Aug 28 15:12 scan_report.html
    -rw-rw-r-- 1 labex labex  5686 Aug 28 15:11 scan_report.txt
    -rw-rw-r-- 1 labex labex 14924 Aug 28 15:11 scan_report.xml
    

이제 빠른 검토를 위한 일반 텍스트 파일, 기계 처리를 위한 XML 파일, 그리고 공유 및 발표에 용이한 HTML 파일을 모두 갖추게 되었습니다.

요약

이 실습을 통해 사이버 보안의 필수 도구인 Nmap 에 대한 실무 경험을 쌓았습니다. 네트워크 호스트에서 열린 서비스를 식별하기 위한 기본 포트 스캔부터 시작하여, 특정 소프트웨어와 버전을 파악하는 서비스 버전 탐지 (-sV) 와 같은 고급 기술로 발전했습니다. 또한 기본 스크립트 (-sC) 와 전체 취약점 스캔 (--script vuln) 을 실행하여 Nmap 스크립팅 엔진 (NSE) 의 강력함을 경험했습니다. 마지막으로 스캔 결과를 다양한 형식 (-oN, -oX) 으로 저장하고 이를 분석 및 문서화에 용이한 HTML 보고서로 변환하는 전문적인 실무 절차를 익혔습니다. 이러한 기술은 실제 네트워크 보안 평가에서 Nmap 을 활용하기 위한 견고한 토대가 될 것입니다.