김현우
  • 리눅스 한 학기 살기 - 12주차
    2025년 06월 02일 00시 35분 44초에 업로드 된 글입니다.
    작성자: kugorang
    728x90
    728x90

    들어가며

    nmap을 통해 다양한 정보들을 스캔할 수 있다

    이번 주차에서 다룰 프로그램은 네트워크 맵퍼(Network Mapper)라는 이름의 Nmap은 네트워크 환경의 호스트와 서비스를 검색하고 보안 점검을 수행하는 무료 오픈 소스 스캐너이다[1]. 원 저작자인 Gordon "Fyodor" Lyon이 1997년 처음 발표한 이래로 지속적으로 발전해 왔으며, 현재는 리눅스를 비롯한 다양한 운영체제에서 사용할 수 있는 범용 도구로 자리잡았다.

     

    Nmap은 IP 패킷을 활용하여 대상 시스템의 열린 포트, 실행 중인 서비스 버전, 운영체제 정보를 파악함으로써 네트워크의 "지도"를 작성하는 데 도움을 준다[2]. 이러한 기능을 통해 네트워크 인벤토리 작성, 서비스 업그레이드 일정 관리, 서버 가동 모니터링 등 시스템 및 네트워크 관리 업무에도 유용하게 활용된다[1]. 특히 네트워크 관리자와 보안 전문가들에게는 없어서는 안 될 필수 도구로 인정받고 있으며, 정보보안 분야의 교육 과정에서도 빠지지 않고 다루어지는 중요한 소프트웨어이다.

     

    본 글에서는 Nmap의 개요와 목적, 주요 스캔 기법, CLI 명령어 구조와 옵션, 보안 측면에서의 활용 사례를 살펴본다. 또한 간단한 사용 예시부터 고급 방화벽 우회 기법, NSE 스크립트 엔진 활용, 리눅스에서의 설치 및 실습 환경 구성, 스캔 결과 해석과 시각화 도구까지 단계별로 알아본다. 강력한 보안 도구인 만큼 책임 있는 사용 태도가 중요하며, 악의적인 목적의 남용을 경계해야 한다는 점을 미리 강조하고자 한다.


    Nmap 개요 및 목적

    Nmap의 기본 목적은 네트워크에 연결된 호스트와 해당 호스트에서 실행 중인 서비스를 스캔하여 정보를 수집하는 것이다. 이러한 정보 수집 과정을 통해 관리자나 보안 담당자는 네트워크 구조를 정확히 파악하고 잠재적 보안 취약점을 사전에 진단할 수 있다. 예를 들어 Nmap은 조직 내부에서 허가 없이 열려 있는 서버 포트를 찾아내어 미처 인지하지 못한 서비스가 동작 중인지 확인하는 데 활용될 수 있다.

     

    Nmap은 네트워크 보안 감사(security auditing) 및 침투 테스트(penetration test)에서 표준 도구로 자리잡고 있으며, 일반적으로 "포트 스캐너"로 널리 알려져 있다[3]. 열린 포트들을 탐색하고 각 포트에서 동작하는 서비스를 식별함으로써, 불필요한 서비스를 차단하거나 취약한 소프트웨어를 업데이트하는 등의 보안 강화 조치를 취할 근거를 제공한다. 또한 네트워크 관리자들은 Nmap을 활용하여 네트워크 자산을 효율적으로 관리하고, 서비스 가용성을 모니터링하며, 네트워크 성능 최적화를 위한 기초 데이터를 수집할 수 있다.

     

    특히 리눅스 입문자에게 Nmap은 자신의 시스템에서 어떤 포트가 열려 있고 어떤 서비스가 노출되어 있는지 직접 확인해볼 수 있는 학습 도구로서도 의미가 있다. 네트워크의 동작 원리를 이해하고, TCP/IP 프로토콜의 실제 구현을 관찰하며, 보안의 기본 개념을 체득하는 데 있어 Nmap만큼 효과적인 도구는 찾기 어렵다. 더불어 Nmap은 단순한 포트 스캐너를 넘어서 네트워크 디버깅, 서비스 모니터링, 보안 정책 검증 등 다양한 용도로 활용될 수 있는 다목적 도구이기도 하다.


    주요 스캔 기법

    Nmap은 다양한 스캔 기법을 제공하여 각기 다른 상황과 목적에 맞게 활용할 수 있도록 설계되었다. 각 스캔 기법은 고유한 특성과 장단점을 가지고 있으며, 대상 시스템의 구성과 네트워크 환경에 따라 적절히 선택하여 사용해야 한다.

     

    TCP Connect 스캔(-sT)

    TCP Connect 스캔은 가장 단순하면서도 직관적인 방식의 TCP 포트 스캔이다. 이 방식은 운영체제의 connect() 시스템콜을 이용하여 대상 포트에 완전한 TCP 3-way 핸드셰이크(SYN -> SYN/ACK -> ACK)를 수행한다. 일반 사용자 권한으로도 실행할 수 있다는 장점이 있으며, 오픈/클로즈 상태를 정확히 식별할 수 있어 신뢰성이 높다.

     

    그러나 이 방식의 가장 큰 단점은 실제 연결을 맺기 때문에 대상 시스템의 로그에 스캔 시도가 명확히 기록된다는 점이다. 또한 완전한 연결 과정을 거치므로 속도가 비교적 느리며, 대량의 포트를 스캔할 경우 상당한 시간이 소요될 수 있다. 따라서 은밀한 스캔이 필요하거나 빠른 속도가 요구되는 상황에서는 적합하지 않다.

     

    TCP SYN 스캔(-sS)

    TCP SYN 스캔은 일명 하프-오픈(half-open) 스캔으로 불리며, 현재 가장 널리 사용되는 기본적인 스텔스 스캔 기법이다. 이 방식은 SYN 패킷만 보내고 응답 단계에서 연결을 완료하지 않은 채 RST(reset) 패킷을 보내 세션을 종료하기 때문에, 대상 서버의 애플리케이션 레벨 로그에는 남지 않을 가능성이 높다.

     

    스캔 메커니즘을 자세히 살펴보면, Nmap은 먼저 대상 포트에 SYN 패킷을 전송한다. 포트가 열려 있다면 SYN/ACK 응답을 받게 되고, 포트가 닫혀 있다면 RST 응답을 받는다. 중요한 점은 SYN/ACK를 받은 경우에도 ACK를 보내지 않고 바로 RST를 전송하여 연결을 중단한다는 것이다. 이로 인해 대상 시스템에서는 불완전한 연결 시도로 인식되어 일반적인 연결 로그에는 기록되지 않는다[4].

     

    이 방법은 연결을 완료하지 않으므로 연결당 처리 시간이 적게 들고 대량의 포트를 빠르게 스캔할 수 있다는 장점이 있다. 단, Raw 패킷을 다루기 때문에 root 권한으로 실행해야 한다는 제약이 있으며, 일부 고급 IDS(침입 탐지 시스템)는 이러한 하프-오픈 연결 시도를 탐지할 수 있다는 점도 고려해야 한다.

     

    UDP 스캔(-sU)

    UDP 스캔은 비연결형 프로토콜인 UDP 포트들을 스캔하는 기법이다. TCP와 달리 UDP는 연결 설정 과정이 없고 명시적인 응답 메커니즘이 없어 스캔 결과의 신뢰도가 낮을 수 있고 속도가 매우 느리다는 특징이 있다.

     

    UDP 스캔의 동작 원리를 살펴보면, Nmap은 대상 포트에 빈 UDP 패킷이나 특정 프로토콜에 맞는 유효한 페이로드를 보낸다. 만약 대상 호스트로부터 ICMP 포트 도달 불가(port unreachable) 메시지가 돌아오면 해당 포트를 닫힘으로 간주한다. 응답이 없으면 포트가 열려있거나 필터링됨(open|filtered) 상태로 표시되는데, 이는 포트가 실제로 열려 있거나 방화벽 등에 의해 차단되어 응답이 없을 경우를 구분할 수 없기 때문이다.

     

    UDP 스캔이 느린 이유는 여러 가지가 있다. 첫째, 많은 운영체제가 ICMP 오류 메시지의 발송 속도를 제한하고 있어 응답을 기다리는 시간이 길어진다. 둘째, 응답이 없는 경우 패킷 손실과 실제 오픈 상태를 구분하기 위해 여러 번 재전송을 시도해야 한다. 셋째, UDP 서비스들은 특정 형식의 데이터를 기대하는 경우가 많아 적절한 페이로드를 구성해야 정확한 응답을 얻을 수 있다. 이러한 이유로 UDP 스캔은 TCP 스캔보다 훨씬 오래 걸리는 경향이 있으며, 전체 포트 범위를 스캔하는 것은 현실적으로 어려운 경우가 많다.

     

    핑 스캔(Ping scan, -sn)

    핑 스캔은 대상 네트워크의 IP 주소 범위에서 호스트가 활성화(up) 상태인지 여부만을 확인하는 가장 기본적인 형태의 네트워크 검색이다. 과거에는 -sP 옵션으로 사용되었으나 현재는 -sn 옵션을 사용하며, 포트 스캔은 수행하지 않고 오직 호스트의 존재 여부만을 파악한다.

     

    기본적으로 ICMP 에코 요청(Echo Request)을 사용하는 것으로 알려져 있지만, 실제로 Nmap의 핑 스캔은 훨씬 정교한 방법을 사용한다. 많은 시스템이 보안상의 이유로 ICMP 응답을 차단하고 있기 때문에, Nmap은 다양한 방법을 조합하여 호스트 탐지의 정확도를 높인다.

     

    특히 주목할 점은 로컬 이더넷 네트워크에서의 동작이다. 동일한 서브넷에 있는 호스트를 대상으로 할 때, Nmap은 ICMP 대신 ARP 요청을 보내 해당 IP의 장비 존재 여부를 확인한다[5]. ARP 프로토콜은 이더넷 네트워크의 기본 동작에 필수적이므로 차단할 수 없으며, 따라서 ICMP를 막아둔 호스트도 ARP 응답을 통해 존재를 드러내게 된다[5]. 이는 로컬 네트워크 스캔에서 매우 효과적인 방법이며, 거의 100%의 탐지율을 보장한다.

     

    원격 네트워크를 대상으로 하는 경우에는 ICMP 에코 요청 외에도 TCP SYN 패킷(포트 443), TCP ACK 패킷(포트 80), ICMP 타임스탬프 요청 등을 조합하여 사용한다. 이러한 다양한 방법을 통해 단순한 ICMP 핑보다 훨씬 높은 호스트 탐지율을 달성할 수 있다.

     

    기타 특수 스캔 기법

    이외에도 Nmap은 다양한 특수 목적의 스캔 기법을 제공한다. TCP 플래그를 조작한 FIN/NULL/Xmas 스캔은 일부 구형 시스템이나 특정 운영체제에서 방화벽을 우회할 수 있는 방법으로 고안되었다. ACK 스캔은 포트의 개방 여부보다는 방화벽의 필터링 규칙을 파악하는 데 주로 사용되며, 스테이트풀 방화벽과 스테이트리스 방화벽을 구분하는 데 유용하다. Window 스캔은 일부 시스템에서 TCP 윈도우 크기를 분석하여 포트 상태를 추론하는 기법이다. 이러한 특수 기법들은 일반적인 상황에서는 잘 사용되지 않지만, 특정 환경이나 고급 보안 테스트에서는 유용할 수 있다.


    CLI 명령어 구조 및 주요 옵션

    Nmap은 명령줄 인터페이스(CLI) 기반 도구로, 터미널에서 명령어와 옵션을 입력해 실행한다. 기본 명령어 구조는 다음과 같다:

    nmap [스캔 방식] [옵션들] <대상 지정>

    여기서 대상은 하나의 IP 주소나 도메인일 수도 있고, IP 주소 범위(예: 192.168.1.0/24 또는 192.168.1.1-50)나 여러 호스트를 공백으로 구분하여 지정할 수도 있다. 여러 대상이 목록 파일에 있을 경우 -iL <파일명> 옵션으로 불러올 수도 있다. 이러한 유연한 대상 지정 방식은 대규모 네트워크 스캔을 효율적으로 수행할 수 있게 해준다.

     

    포트 지정 옵션

    -p <포트범위> 옵션은 스캔할 포트 번호를 지정하는 데 사용된다. 단일 포트(-p 80), 쉼표로 구분한 여러 포트(-p 22,80,443), 하이픈으로 범위 지정(-p 1-1023), 또는 -p-로 모든 65,535개 포트를 선택할 수 있다. 포트를 명시적으로 지정하지 않으면 Nmap은 기본적으로 가장 일반적인 1000개의 포트를 스캔한다. 이 기본 포트 목록은 인터넷 전체의 포트 사용 통계를 바탕으로 선정되었으며, 대부분의 일반적인 서비스를 포함하고 있어 효율적인 스캔이 가능하다.

     

    스캔 모드 및 탐지 옵션

    -A 옵션은 어그레시브 스캔(aggressive scan) 모드로, 여러 검사를 한꺼번에 수행하는 편의 기능이다. 이 옵션을 사용하면 OS 탐지(-O), 버전 탐지(-sV), 기본 NSE 스크립트(-sC) 실행, 트레이서우트(경로 추적)까지 모두 활성화된다. 초보자의 경우 한 번에 다양한 정보를 얻을 수 있어 편리하지만, 수행 작업이 많아 스캔 속도가 느려지고 대상에 상당한 부하를 줄 수 있으므로 주의가 필요하다. 또한 공격적인 스캔은 IDS나 보안 모니터링 시스템에 쉽게 탐지될 수 있다는 점도 고려해야 한다.

     

    -sV 옵션은 각 포트에서 실행 중인 서비스와 버전 정보를 검출한다. 기본적으로 배너 그래빙(banner grabbing)과 Nmap의 내장 서비스 시그니처 데이터베이스를 활용하여 서버 응용 프로그램의 종류(예: Apache httpd)와 버전(예: 2.4.51)을 추론한다. 버전 탐지는 여러 단계의 프로브(probe)를 통해 이루어지며, --version-intensity 옵션으로 탐지의 강도를 조절할 수 있다. 침투 테스트 시 서비스 버전을 파악함으로써 알려진 취약점 여부를 확인하는 데에 필수적인 기능이다.

     

    -O 옵션은 운영체제(OS) 탐지를 수행한다. TCP/IP 스택의 미세한 동작 차이를 분석하여 대상 호스트의 운영체제 종류와 버전을 추정한다. 이는 TCP 초기 시퀀스 번호 생성 패턴, TCP 옵션 지원 여부, IP ID 생성 방식, ICMP 응답 특성 등 다양한 요소를 종합적으로 분석하여 이루어진다. OS 탐지는 충분한 오픈/닫힘 포트가 있어야 정확도가 올라가며, 방화벽이 엄격한 환경에서는 실패하거나 부정확할 수 있다. 탐지 결과는 확률과 함께 표시되며, 여러 OS가 유사한 특성을 보일 경우 가능한 후보들을 모두 나열한다.

     

    -sC 옵션은 Nmap 기본 스크립트들을 실행한다. NSE(Nmap Scripting Engine)에 포함된 수백 개의 스크립트 중 default 카테고리에 속하는 핵심 스크립트들이 실행되어 추가 정보를 수집한다. 이 옵션은 --script=default와 동일하며, 버전 탐지(-sV)와 함께 사용하면 서비스 관련 세부 정보까지 얻을 수 있다. 기본 스크립트는 안전하고 유용한 정보를 제공하도록 선별되었으며, 과도한 부하나 침해를 일으키지 않도록 설계되었다.

     

    호스트 발견 관련 옵션

    -Pn 옵션은 스캔 전에 핑으로 생존 여부를 확인하지 않고 모든 대상 IP를 활성 호스트로 간주하여 포트 스캔을 진행한다. 기본 동작에서는 포트 스캔 전에 ping으로 대상 호스트가 응답하는지 확인하여, 응답 없는 호스트는 건너뛰는데 -Pn을 사용하면 응답이 없어도 무조건 스캔한다. 이는 방화벽 등으로 ICMP가 차단된 환경이거나 모든 IP를 강제로 스캔하고 싶을 때 유용하다. 단, 존재하지 않는 호스트까지 스캔하게 되므로 전체 스캔 시간이 크게 증가할 수 있다.

     

    타이밍 및 성능 옵션

    -T0 부터 -T5까지의 옵션은 스캔 속도(타이밍)를 조정하는 프리셋이다. 각 레벨은 패킷 전송 간격, 병렬 처리 수준, 타임아웃 값 등 여러 파라미터를 종합적으로 조정한다:

    • -T0 (Paranoid): 가장 느린 스캔으로, 각 프로브 간 5분의 간격을 둔다. IDS 회피에 효과적이지만 현실적으로 사용하기 어려울 정도로 느리다.
    • -T1 (Sneaky): 각 프로브 간 15초의 간격을 두며, 여전히 매우 느리지만 T0보다는 실용적이다.
    • -T2 (Polite): 일반 스캔보다 느리지만 대상 시스템에 부하를 적게 준다. 대역폭이 제한적인 환경에서 유용하다.
    • -T3 (Normal): 기본값으로, 일반적인 네트워크 환경에 최적화되어 있다.
    • -T4 (Aggressive): 빠른 스캔을 위해 타임아웃과 재전송 간격을 줄인다. 현대적인 네트워크에서 가장 많이 사용되는 설정이다.
    • -T5 (Insane): 최대 속도로 스캔하지만 패킷 손실이 발생하기 쉽고 결과의 정확도가 떨어질 수 있다.

     

    출력 형식 옵션

    Nmap은 다양한 형식으로 결과를 저장할 수 있는 옵션을 제공한다. -oN은 사람이 읽기 쉬운 일반 텍스트 형식으로, -oX는 프로그램이 파싱하기 쉬운 XML 형식으로, -oG는 grep 등의 유닉스 도구로 후처리하기 쉬운 간략한 형식으로 결과를 저장한다. -oA <베이스명>를 사용하면 한 번의 스캔으로 모든 형식의 파일을 동시에 생성할 수 있어 편리하다. 별도로 지정하지 않으면 Nmap 결과는 터미널 표준 출력으로만 표시되므로, 나중에 참조하거나 분석할 필요가 있다면 파일로 저장하는 것이 권장된다.

     

    상세 출력 옵션

    -v-vv 옵션은 상세 출력(verbose) 모드를 활성화한다. -v를 한 번 지정하면 스캔 진행 상황, 발견된 포트 정보 등을 실시간으로 표시하며, 두 번 지정(-vv)하면 전송되는 패킷의 세부 정보까지 포함한 매우 상세한 디버깅 수준의 정보를 출력한다. 이 외에도 -d (디버그) 옵션을 통해 출력 상세 수준을 1부터 9까지 세밀하게 조정할 수 있다. 문제 해결이나 스캔 과정을 정확히 이해하고자 할 때 유용하며, 특히 스캔이 예상대로 동작하지 않을 때 원인을 파악하는 데 도움이 된다.


    보안 측면에서의 활용 사례

    Nmap은 다양한 보안 관련 작업에서 핵심적인 역할을 수행한다. 공격자의 관점에서는 취약점을 찾는 도구로, 방어자의 관점에서는 보안을 강화하는 도구로 활용될 수 있는 양날의 검과 같은 존재이다. 여기서는 보안 강화를 위한 건설적인 활용 방안을 중심으로 살펴본다.

     

    오픈 포트 탐지 및 서비스 최소화

    시스템이나 네트워크 상의 열린 포트를 스캔하여 목록을 파악함으로써, 불필요하게 개방된 서비스를 발견하고 보안 정책을 강화할 수 있다. 많은 조직에서 서버를 구축하고 운영하는 과정에서 기본 설정 그대로 두거나, 테스트 목적으로 열어둔 포트를 닫는 것을 잊어버리는 경우가 빈번하다.

     

    예를 들어 내부 서버에서 의도치 않게 열려 있는 8080/TCP 포트를 Nmap으로 발견했다면, 해당 포트에서 실행 중인 서비스를 확인하고 필요성을 검토해야 한다. 만약 더 이상 사용하지 않는 개발용 웹 서버라면 즉시 종료하거나, 필요한 경우에만 방화벽으로 특정 IP에서만 접근 가능하도록 제한하는 조치를 취할 수 있다.

     

    정기적인 포트 스캔은 새로운 서비스가 무단으로 열리지 않았는지 확인하는 보안 모니터링 수단이 된다. 매주 또는 매월 정기적으로 전체 네트워크를 스캔하여 이전 결과와 비교함으로써, 새롭게 나타난 서비스나 변경된 설정을 즉시 파악할 수 있다. 이는 내부자의 실수나 악의적인 행위, 또는 멀웨어 감염으로 인한 백도어 설치 등을 조기에 발견하는 데 매우 효과적이다.

     

    방화벽 및 필터링 정책 검증

    Nmap 결과의 포트 상태 정보(open/closed/filtered)를 통해 방화벽이 어떤 포트를 차단하거나 허용하는지 유추할 수 있다. filtered로 표시되는 포트들은 패킷이 차단되고 응답이 없다는 뜻이므로 해당 서비스 앞에 방화벽이나 필터가 존재함을 시사한다[2].

     

    Nmap의 ACK 스캔(-sA) 등 특수 기법은 방화벽이 스테이트풀(stateful)인지 여부를 알아내는 데 사용된다. 스테이트풀 방화벽은 연결 상태를 추적하여 정상적인 세션의 일부인 패킷만 통과시키는 반면, 스테이트리스 방화벽은 개별 패킷의 규칙만을 검사한다. ACK 스캔을 통해 이러한 차이를 파악하면 방화벽의 동작 방식을 이해하고 보안 정책을 더욱 정교하게 수립할 수 있다.

     

    관리자 입장에서는 이러한 기능을 활용하여 방화벽 규칙이 예상대로 동작하는지 검증할 수 있다. 예를 들어 특정 서비스를 외부에서 차단하도록 설정했다면, 외부 네트워크에서 Nmap으로 스캔했을 때 해당 포트가 filtered로 표시되어야 한다. 만약 open으로 표시된다면 방화벽 규칙에 문제가 있거나 우회 경로가 존재한다는 의미이므로 즉각적인 조치가 필요하다.

     

    서비스 버전 식별 및 취약점 관리

    앞서 설명한 버전 탐지(-sV)와 NSE 스크립트를 통해 서비스의 상세 정보와 잠재적 취약점을 확인할 수 있다. 현대의 사이버 공격은 대부분 알려진 취약점을 악용하는 방식으로 이루어지므로, 시스템에서 실행 중인 소프트웨어의 버전을 정확히 파악하고 관리하는 것은 보안의 기본이다.

     

    예를 들어 Nmap으로 웹 서버를 스캔하여 지원 종료(EOL)된 구버전 Apache httpd 2.2.x가 실행 중임을 발견했다면, 해당 서버는 수많은 알려진 취약점에 노출되어 있을 가능성이 높다. 이러한 정보는 즉각적인 업그레이드나 패치의 필요성을 명확히 보여주며, 보안 투자의 우선순위를 정하는 데 중요한 근거가 된다.

     

    또한 Nmap NSE의 vuln 카테고리 스크립트들을 사용하면 자동화된 취약점 검사도 가능하다. 이들 스크립트는 CVE 데이터베이스와 연동하여 알려진 취약점의 존재 여부를 직접 테스트하고 보고한다. 예를 들어 smb-vuln-ms17-010 스크립트는 WannaCry 랜섬웨어가 악용한 EternalBlue 취약점의 존재를 확인할 수 있다. 이러한 자동화된 검사는 대규모 네트워크에서 취약한 시스템을 신속히 찾아내는 데 매우 유용하다.

     

    운영체제 식별을 통한 자산 관리

    Nmap의 OS 탐지 기능(-O)은 원격 시스템의 운영체제 종류를 파악하는 데 사용된다[2]. 이는 단순히 기술적 호기심을 충족시키는 것이 아니라, 조직의 IT 자산을 효과적으로 관리하고 보안 위험을 평가하는 데 중요한 정보를 제공한다.

     

    기업 환경에서는 승인되지 않은 장비나 OS가 네트워크에 연결되는 것을 방지해야 한다. Nmap의 OS 탐지를 통해 예상치 못한 장비(예: 직원이 무단으로 연결한 개인용 IoT 기기)나 보안 지원이 종료된 구형 OS(예: Windows XP, Windows Server 2003)가 여전히 사용되고 있는지를 발견할 수 있다. 이러한 미승인 장비나 구형 시스템은 전체 네트워크의 보안을 위협하는 약한 고리가 될 수 있으므로, 발견 즉시 적절한 조치를 취해야 한다.

     

    또한 Nmap 스캔 결과를 바탕으로 자산 관리 데이터베이스의 정보와 실제 네트워크 구성을 대조할 수 있다. 많은 조직에서 문서상의 IT 자산 목록과 실제 운영 중인 시스템 간에 불일치가 발생하는데, 정기적인 Nmap 스캔을 통해 이러한 차이를 발견하고 자산 정보를 최신 상태로 유지할 수 있다.

     

    OS 정보와 서비스 정보를 종합하면 각 시스템의 보안 위험도를 평가할 수 있다. 예를 들어 인터넷에 직접 노출된 Windows Server 2008 시스템에서 RDP 서비스가 실행 중이라면, 이는 매우 높은 위험도를 가진 구성이므로 즉각적인 보안 강화 조치가 필요하다. 반면 최신 패치가 적용된 Linux 시스템에서 SSH만 열려 있고 키 기반 인증을 사용한다면 상대적으로 안전한 구성으로 평가할 수 있다.

     

    침투 테스트 및 보안 감사

    보안 전문가들은 Nmap을 침투 테스트의 초기 단계인 정보 수집(Information Gathering) 단계에서 핵심 도구로 활용한다. 대상 네트워크의 구조를 파악하고, 공격 가능한 서비스를 식별하며, 잠재적 진입점을 찾는 과정에서 Nmap이 제공하는 정보는 필수적이다.

     

    정기적인 보안 감사에서도 Nmap은 중요한 역할을 한다. 보안 정책이 제대로 구현되고 있는지, 패치 관리가 적절히 이루어지고 있는지, 불필요한 서비스가 실행되고 있지 않은지 등을 체계적으로 점검할 수 있다. 특히 규정 준수(Compliance) 관점에서 특정 포트나 서비스의 사용을 금지하는 정책이 있다면, Nmap을 통해 이러한 정책의 준수 여부를 객관적으로 확인할 수 있다.


    실제 사용 예시

    이론적인 설명을 넘어 실제로 Nmap을 어떻게 사용하는지 구체적인 예시를 통해 살펴보자. 각 예시는 실무에서 자주 사용되는 시나리오를 바탕으로 구성되었으며, 명령어와 함께 예상되는 출력 결과를 제시한다.

     

    호스트 검색 (Ping 스캔)

    네트워크 스캔의 첫 단계는 대상 네트워크에 어떤 호스트가 활성화되어 있는지 확인하는 것이다. -sn 옵션으로 ping 스캔을 실행하면 호스트들의 응답 여부만 확인하여 목록을 보여준다.

    nmap -sn 192.168.0.0/24

    이 명령은 192.168.0.0부터 192.168.0.255까지 256개의 IP 주소에 대해 호스트 검색을 수행한다. 예상되는 출력 결과는 다음과 같다.

    Starting Nmap 7.93 ( https://nmap.org ) at 2025-06-01 10:00 KST
    Nmap scan report for 192.168.0.1
    Host is up (0.004s latency).
    Nmap scan report for 192.168.0.10
    Host is up (0.002s latency).
    Nmap scan report for 192.168.0.15
    Host is up (0.001s latency).
    Nmap done: 256 IP addresses (3 hosts up) scanned in 3.50 seconds

    위 결과에서 192.168.0.1, 192.168.0.10, 192.168.0.15 세 대의 호스트가 응답하여 온라인 상태(Host is up)임을 알 수 있다. 괄호 안의 latency 값은 각 호스트까지의 응답 시간을 나타내며, 네트워크 지연이나 호스트의 부하 상태를 간접적으로 파악할 수 있다. 이들 IP를 대상으로 다음 단계의 포트 스캔을 진행하면 된다.

     

    단일 호스트 기본 TCP 스캔

    특정 호스트에 대해 기본 설정으로 포트 스캔을 수행해보자. 별다른 옵션 없이 실행하면 가장 일반적인 상위 1000개 TCP 포트를 대상으로 열린 포트를 찾아낸다.

    nmap 192.168.0.10

    일반 사용자 권한으로 실행하면 TCP Connect 스캔이 수행되고, root 권한으로 실행하면 TCP SYN 스캔이 기본값으로 사용된다. 출력 결과 예시는 아래와 같다.

    Starting Nmap 7.93 ( https://nmap.org ) at 2025-06-01 10:05 KST
    Nmap scan report for 192.168.0.10
    Host is up (0.0020s latency).
    Not shown: 997 closed ports
    PORT    STATE SERVICE
    22/tcp  open  ssh
    139/tcp open  netbios-ssn
    445/tcp open  microsoft-ds
    
    Nmap done: 1 IP address (1 host up) scanned in 1.23 seconds

    위 예시는 192.168.0.10 호스트에 대한 스캔 결과이다. 22번(SSH), 139번(NetBIOS 세션 서비스), 445번(SMB 파일 공유) 포트가 열려 있음(open)으로 표시되었다. Not shown: 997 closed ports라는 문구는 이 호스트에서 나머지 997개의 포트가 모두 닫혀 있어서 출력에 생략되었음을 의미한다.

     

    이 결과를 통해 해당 호스트가 SSH 접속을 허용하고 있으며, Windows 파일 공유 서비스(또는 Samba)가 실행 중임을 알 수 있다. 보안 관점에서 보면, 특히 139번과 445번 포트는 다양한 공격에 악용될 수 있는 서비스이므로 필요한 경우가 아니라면 외부에 노출되지 않도록 주의해야 한다.

     

    여러 호스트 및 특정 포트 스캔

    한 번에 여러 시스템을 스캔하여 특정 서비스의 개방 현황을 점검할 수도 있다. 예를 들어 사내 네트워크에서 SSH 서버가 어디에서 실행 중인지 확인하려면 해당 포트만 지정하여 전체 대역을 훑어볼 수 있다.

    nmap -p 22 192.168.0.0/24

    이 명령은 전체 서브넷에서 22번 포트만을 대상으로 스캔을 수행한다. 출력 결과는 다음과 같이 간결하게 표시된다.

    Starting Nmap 7.93 ( https://nmap.org ) at 2025-06-01 10:10 KST
    Nmap scan report for 192.168.0.10
    Host is up (0.0015s latency).
    
    PORT   STATE SERVICE
    22/tcp open  ssh
    
    Nmap scan report for 192.168.0.15
    Host is up (0.0012s latency).
    
    PORT   STATE SERVICE
    22/tcp open  ssh
    
    Nmap scan report for 192.168.0.20
    Host is up (0.0018s latency).
    
    PORT   STATE  SERVICE
    22/tcp closed ssh
    
    Nmap done: 256 IP addresses (3 hosts up) scanned in 5.23 seconds

    위 결과에서는 192.168.0.10과 192.168.0.15 두 호스트에서 22번 포트(SSH)가 열려 있고, 192.168.0.20 호스트에는 해당 포트가 닫힘(closed) 상태임을 보여준다. 닫힌 포트는 호스트가 활성화되어 있지만 해당 포트에서 서비스가 실행되지 않음을 의미한다.

     

    이런 식으로 Nmap을 활용하면 대규모 네트워크에서 특정 서비스가 실행 중인 호스트를 손쉽게 찾아낼 수 있다. 보안 관리자는 이 정보를 바탕으로 SSH 서비스가 필요하지 않은 시스템에서는 해당 서비스를 중단하거나, 방화벽 규칙을 통해 접근을 제한하는 등의 조치를 취할 수 있다.

     

    복합 스캔 및 상세 조사

    하나의 명령어에 여러 옵션을 조합하여 종합적인 스캔을 수행할 수 있다. 다음 예시는 TCP SYN 스캔(-sS)과 서비스/버전 탐지(-sV), OS 탐지(-O), 기본 스크립트(-sC), 빠른 타이밍(-T4) 옵션을 함께 사용하여 대상 시스템을 정밀 분석하는 명령이다.

    sudo nmap -sS -sV -O -sC -T4 192.168.0.15

    이러한 복합 스캔은 상당한 양의 정보를 제공한다.

    Starting Nmap 7.93 ( https://nmap.org ) at 2025-06-01 10:15 KST
    Nmap scan report for 192.168.0.15
    Host is up (0.0012s latency).
    Not shown: 996 closed ports
    PORT    STATE SERVICE      VERSION
    139/tcp open  netbios-ssn  Microsoft Windows netbios-ssn
    445/tcp open  microsoft-ds Microsoft Windows 10 microsoft-ds
    3389/tcp open  ms-wbt-server Microsoft Terminal Services
    | rdp-ntlm-info: 
    |   Target_Name: DESKTOP-ABC123
    |   NetBIOS_Domain_Name: DESKTOP-ABC123
    |   NetBIOS_Computer_Name: DESKTOP-ABC123
    |   DNS_Domain_Name: DESKTOP-ABC123
    |   DNS_Computer_Name: DESKTOP-ABC123
    |   Product_Version: 10.0.19041
    |_  System_Time: 2025-06-01T10:15:30+09:00
    | ssl-cert: Subject: commonName=DESKTOP-ABC123
    | Not valid before: 2025-05-31T00:00:00
    |_Not valid after:  2025-12-01T00:00:00
    5357/tcp open  wsdapi       Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
    
    MAC Address: 08:00:27:12:34:56 (Oracle VirtualBox virtual NIC)
    Device type: general purpose
    Running: Microsoft Windows 10
    OS CPE: cpe:/o:microsoft:windows_10
    OS details: Microsoft Windows 10 1607 - 1909
    Network Distance: 1 hop
    
    Host script results:
    | smb2-time: 
    |   date: 2025-06-01T01:15:30
    |_  start_date: N/A
    | smb-security-mode: 
    |   account_used: guest
    |   authentication_level: user
    |   challenge_response: supported
    |_  message_signing: disabled (dangerous, but default)
    | smb2-security-mode: 
    |   2.02: 
    |_    Message signing enabled but not required
    
    TRACEROUTE
    HOP RTT     ADDRESS
    1   1.23 ms 192.168.0.15
    
    OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
    Nmap done: 1 IP address (1 host up) scanned in 15.67 seconds

    위와 같은 종합 스캔 결과는 대상 호스트에 대한 풍부한 정보를 제공한다. 열린 포트 139/445가 Windows 파일 공유(NetBIOS/SMB) 서비스임을 확인할 수 있으며, 3389번 포트에서는 원격 데스크톱(RDP) 서비스가 실행 중이다. 5357번 포트는 Windows의 네트워크 검색 기능과 관련된 서비스이다.

     

    서비스 버전 탐지를 통해 이 호스트가 Windows 10 운영체제를 사용하고 있으며, 구체적으로는 빌드 19041(버전 2004)임을 알 수 있다. NSE 스크립트 결과는 추가적인 세부 정보를 제공하는데, 컴퓨터 이름이 "DESKTOP-ABC123"이고, SMB 메시지 서명이 비활성화되어 있어 중간자 공격에 취약할 수 있음을 경고하고 있다.

     

    OS 핑거프린팅 결과는 이 시스템을 Windows 10으로 정확히 식별했으며, MAC 주소 정보로부터 VirtualBox 가상 머신 환경에서 실행 중임도 파악할 수 있다. 네트워크 거리가 1홉으로 표시된 것은 스캔 대상이 동일한 네트워크 세그먼트에 있음을 의미한다.

     

    이처럼 단일 명령으로 포트, 서비스, OS 정보를 한꺼번에 얻을 수 있지만, 스캔 범위와 옵션이 광범위할 경우 대상 시스템에 부하를 줄 수 있으므로 무분별한 사용은 피해야 한다. 특히 운영 중인 프로덕션 시스템을 대상으로 할 때는 더욱 신중해야 하며, 가능하면 업무 시간 외에 스캔을 수행하는 것이 바람직하다.


    방화벽 우회 기법과 대응

    네트워크 보안이 강화됨에 따라 대부분의 조직에서는 방화벽과 침입 탐지 시스템(IDS)을 운영하고 있다. Nmap은 이러한 보안 장비를 우회하거나 탐지를 회피하기 위한 다양한 기법을 제공한다. 이러한 기법들을 이해하는 것은 공격자의 관점을 이해하고 더 나은 방어 전략을 수립하는 데 필수적이다.

     

    패킷 분할(Fragmentation, -f 옵션)

    패킷 분할은 스캔 패킷을 여러 조각(fragment)으로 쪼개어 보내는 기법이다. 많은 구형 방화벽이나 IDS는 패킷을 완전히 재조립하지 않고 개별 조각만을 검사하는 경우가 있어, 이를 악용하면 스캔 시도를 탐지하지 못하게 할 수 있다.

     

    Nmap에서 -f 옵션을 사용하면 IP 패킷을 8바이트 크기의 작은 조각들로 분할하여 전송한다. -ff 옵션을 사용하면 더 작은 크기로 분할할 수도 있다. 예를 들어,

    nmap -f -sS 192.168.0.10

    이 기법의 원리는 방화벽이나 IDS가 패킷의 시그니처를 검사할 때 완전한 패킷이 아닌 조각만을 보게 되어 공격 패턴을 인식하지 못하도록 하는 것이다. 하지만 최신 보안 장비들은 이러한 공격에 대비하여 모든 IP 조각을 버퍼에 저장하고 재조립한 후 검사하는 기능을 갖추고 있다.

     

    대응 방안: 관리자는 방화벽에서 IP 조각 재조립 검사를 활성화해야 한다. 또한 비정상적으로 작은 크기의 IP 조각이나 과도한 조각화를 보이는 트래픽을 의심스러운 활동으로 간주하고 로깅하거나 차단하도록 설정할 수 있다. 일부 방화벽에서는 조각화된 패킷 자체를 완전히 차단하는 옵션도 제공하지만, 이는 정상적인 트래픽에도 영향을 줄 수 있으므로 신중히 적용해야 한다.

     

    데코이 스캔(Decoy, -D 옵션)

    데코이 스캔은 가짜 IP 주소들을 다수 설정하여 여러 소스에서 스캔하는 것처럼 위장하는 기법이다. 이는 실제 스캐너의 IP 주소를 숨기고 방어자를 혼란스럽게 만드는 효과가 있다.

     

    예를 들어 다음 명령은 랜덤한 10개의 데코이 IP와 함께 스캔을 수행한다.

    nmap -D RND:10 192.168.0.10

    또는 특정 IP 주소들을 데코이로 지정할 수도 있다.

    nmap -D 192.168.0.50,192.168.0.51,192.168.0.52,ME 192.168.0.10

    여기서 ME는 실제 스캐너의 IP를 의미하며, 데코이 IP들 사이에 섞여 있다. 대상 시스템의 로그에는 여러 IP에서 동시에 스캔이 발생한 것으로 기록되어, 실제 공격자를 추적하기 어렵게 만든다[6].

     

    대응 방안: 방화벽이나 IDS는 동일한 패턴의 스캔이 여러 IP에서 동시다발적으로 발생할 경우 이를 데코이 공격으로 간주하여 경보를 발생시킬 수 있다. 특히 데코이로 사용된 IP들이 실제로는 존재하지 않거나 평소에 트래픽이 없던 주소라면 의심스러운 활동으로 판단할 수 있다.

     

    또한 내부 자산에 대한 스캔이 탐지되었을 때, 출발지 IP들의 지리적 위치나 AS(Autonomous System) 정보를 분석하여 비정상적인 패턴을 찾아낼 수 있다. 예를 들어 한국의 내부 네트워크를 대상으로 미국, 러시아, 중국 등 여러 국가의 IP에서 동시에 스캔이 발생한다면 이는 명백히 데코이 공격일 가능성이 높다.

     

    소스 포트 위장(Source Port, --source-port 옵션)

    일부 방화벽은 특정 출발지 포트에서 오는 트래픽을 신뢰하도록 설정되어 있다. 이러한 설정의 허점을 악용하여 Nmap 패킷의 출발지 포트를 위장하는 기법이다.

    nmap --source-port 53 192.168.0.10

    위 명령은 출발지 포트를 53번(DNS)으로 설정하여 스캔을 수행한다. 일부 방화벽은 DNS 응답 트래픽을 정상적인 것으로 간주하여 차단하지 않을 수 있다[7]. 다른 자주 사용되는 신뢰 포트로는 80(HTTP), 443(HTTPS), 88(Kerberos) 등이 있다.

     

    이 기법이 효과적인 이유는 많은 방화벽이 상태 비저장(stateless) 모드로 동작하거나, 성능상의 이유로 특정 포트의 트래픽을 간소화된 규칙으로 처리하기 때문이다. 특히 DNS나 NTP 같은 서비스는 대량의 정상 트래픽을 처리해야 하므로, 엄격한 검사를 적용하기 어려운 경우가 많다.

     

    대응 방안: 중요 서비스에 대해서는 포트 번호만으로 트래픽을 신뢰하는 규칙을 최소화해야 한다. 스테이트풀 방화벽을 사용하여 연결의 전체 컨텍스트를 검사하고, 정상적인 세션의 일부가 아닌 패킷은 차단하도록 설정해야 한다.

     

    또한 출발지 포트가 특권 포트(1-1023)인 경우에도 패킷의 내용과 패턴을 검사하여 실제 해당 서비스의 트래픽인지 확인해야 한다. 예를 들어 53번 포트에서 오는 트래픽이라도 DNS 프로토콜 형식을 따르지 않는다면 의심스러운 활동으로 간주할 수 있다.

     

    좀비 아이들 스캔(Idle scan, -sI 옵션)

    좀비 아이들 스캔은 가장 정교한 우회 기법 중 하나로, 제3의 무고한 시스템(zombie)을 중간에 이용하여 자신의 정체를 완전히 숨기는 방법이다. 이 기법은 IP 프로토콜의 특성과 일부 시스템의 예측 가능한 IP ID 증가 패턴을 악용한다.

    nmap -sI zombie_host target_host

    이 스캔의 동작 원리는 다음과 같다.

    1. 먼저 좀비 호스트의 IP ID 값을 확인한다
    2. 좀비 호스트를 소스로 위장하여 대상에 SYN 패킷을 보낸다
    3. 대상이 포트가 열려 있으면 좀비에게 SYN/ACK를 보내고, 좀비는 RST로 응답하며 IP ID가 증가한다
    4. 다시 좀비의 IP ID를 확인하여 증가 여부로 포트 상태를 판단한다

     

    이 방법의 장점은 대상 시스템에는 좀비 호스트가 스캔한 것으로만 보이며, 실제 스캐너의 IP는 전혀 드러나지 않는다는 점이다. 단, 적절한 좀비 호스트를 찾는 것이 어렵고, 스캔 속도가 매우 느리며, 현대의 운영체제들은 대부분 랜덤한 IP ID를 사용하여 이 기법이 통하지 않는다.

     

    대응 방안: Idle 스캔을 완벽히 차단하기는 어렵지만, 몇 가지 방어 방법이 있다. 첫째, 네트워크 내의 시스템들이 예측 가능한 IP ID 패턴을 사용하지 않도록 최신 OS로 업데이트한다. 둘째, 평소와 다른 통신 패턴을 보이는 내부 시스템을 모니터링한다. 셋째, 외부에서 내부 시스템으로의 비정상적인 SYN/ACK 패킷을 탐지하여 좀비로 사용되는 것을 방지한다.

     

    기타 회피 기법들

    위에서 소개한 기법 외에도 Nmap은 다양한 회피 옵션을 제공한다.

    • FIN/NULL/Xmas 스캔: RFC 793의 모호한 부분을 악용하여 일부 시스템에서 방화벽을 우회할 수 있는 특수 플래그 조합을 사용한다[8]. FIN 스캔은 FIN 플래그만 설정된 패킷을, NULL 스캔은 모든 플래그를 끈 패킷을, Xmas 스캔은 FIN, PSH, URG 플래그를 모두 켠 패킷을 전송한다.
    • 타이밍 조정: -T0이나 -T1 같은 느린 타이밍을 사용하여 IDS의 임계값 아래로 스캔 속도를 낮출 수 있다. 패킷 간 간격이 충분히 길면 연관된 활동으로 인식되지 않을 수 있다.
    • MTU 지정: --mtu 옵션으로 최대 전송 단위를 지정하여 패킷 크기를 조정할 수 있다. 이는 특정 네트워크 장비의 처리 방식을 악용하는 데 사용될 수 있다.
    • 배드 체크섬: --badsum 옵션은 잘못된 TCP/UDP 체크섬을 가진 패킷을 보낸다. 일부 방화벽은 체크섬 검증을 하지 않고 통과시키는 반면, 실제 호스트는 이를 폐기하므로 방화벽의 존재를 탐지하는 데 사용할 수 있다.

     

    현대의 스테이트풀 방화벽과 차세대 방화벽(NGFW)들은 이러한 고전적인 우회 기법들에 대부분 대응할 수 있도록 설계되어 있다. 그러나 보안 관리자는 여전히 이러한 기법들을 이해하고, 자신의 네트워크에서 실제로 차단되는지 주기적으로 테스트해야 한다. 또한 방화벽 로그를 주기적으로 검토하여 비정상적인 스캔 시도가 포착될 경우 원인을 조사하고 필요한 대응 조치를 취하는 것이 중요하다.


    Nmap 스크립트 엔진(NSE)의 기본 구조 및 활용

    Nmap 스크립트 엔진(NSE)은 Nmap의 기능을 크게 확장하는 강력한 프레임워크로, 사용자가 Lua 프로그래밍 언어로 작성된 스크립트를 통해 다양한 네트워크 테스트를 자동화할 수 있게 해준다[8]. NSE는 단순한 포트 스캔을 넘어서 취약점 탐지, 멀웨어 감염 확인, 웹 애플리케이션 스캔, 네트워크 프로토콜 분석 등 고급 기능을 수행할 수 있도록 Nmap을 확장한다.

     

    NSE의 구조와 동작 원리

    Nmap에는 기본적으로 600개 이상의 NSE 스크립트가 포함되어 있으며, 이들은 /usr/share/nmap/scripts/ 디렉터리(리눅스 기준)에 저장되어 있다. 각 스크립트는 .nse 확장자를 가진 Lua 파일로, 특정 조건에서 실행되어 추가 정보를 수집하거나 보안 검사를 수행한다.

     

    NSE 스크립트의 기본 구조는 다음과 같은 요소로 구성된다.

    1. description: 스크립트의 목적과 기능을 설명하는 문자열
    2. categories: 스크립트가 속한 카테고리 목록 (예: safe, intrusive, vuln 등)
    3. portrule/hostrule/prerule/postrule: 스크립트 실행 조건을 정의하는 함수
    4. action: 실제 스크립트 동작을 구현하는 메인 함수

    스크립트는 용도와 특성에 따라 하나 이상의 카테고리로 분류된다[8]:

    • safe: 대상 시스템에 영향을 주지 않는 안전한 스크립트
    • intrusive: 시스템에 부하를 주거나 서비스를 방해할 수 있는 공격적 스크립트
    • vuln: 알려진 취약점을 검사하는 스크립트
    • exploit: 실제 취약점을 악용하는 스크립트 (매우 주의해서 사용)
    • auth: 인증 관련 테스트를 수행하는 스크립트
    • default: 기본적으로 실행되는 유용하고 안전한 스크립트
    • discovery: 추가 호스트나 서비스 정보를 발견하는 스크립트
    • dos: 서비스 거부 공격을 수행하는 스크립트 (절대 주의)
    • fuzzer: 예상치 못한 입력으로 서비스를 테스트하는 스크립트
    • malware: 멀웨어 감염을 탐지하는 스크립트

     

    NSE 스크립트 실행 방법

    NSE 스크립트는 다양한 방법으로 실행할 수 있다.

    1. 기본 스크립트 실행: -sC 옵션이나 --script=default를 사용하면 default 카테고리의 모든 스크립트가 실행된다.
    nmap -sC target.com
    1. 특정 스크립트 실행: --script 옵션 뒤에 스크립트 이름을 지정한다.
    nmap --script=http-title target.com
    1. 여러 스크립트 실행: 쉼표로 구분하여 여러 스크립트를 지정할 수 있다.
    nmap --script=http-title,http-headers target.com
    1. 카테고리별 실행: 특정 카테고리의 모든 스크립트를 실행한다.
    nmap --script=vuln target.com
    1. 와일드카드 사용: 스크립트 이름에 와일드카드를 사용할 수 있다.
    nmap --script="http-*" target.com
    1. 논리 연산자 사용: and, or, not 연산자로 복잡한 조건을 만들 수 있다.
    nmap --script="safe and not intrusive" target.com

     

    실용적인 NSE 스크립트 활용 예시

    FTP 익명 로그인 검사

    FTP 서비스의 익명 로그인 허용 여부는 중요한 보안 점검 항목이다. ftp-anon 스크립트를 사용하여 이를 확인할 수 있다:

    nmap -p 21 --script=ftp-anon 192.168.0.10

    출력 예시:

    PORT   STATE SERVICE
    21/tcp open  ftp
    | ftp-anon: Anonymous FTP login allowed (FTP code 230)
    | drwxr-xr-x   2 0        0            4096 Jan 01 10:00 pub
    |_-rw-r--r--   1 0        0             123 Jan 01 09:00 welcome.txt

    위 결과는 익명 FTP 로그인이 허용되어 있으며, 접근 가능한 파일과 디렉터리 목록까지 보여준다. 이는 의도하지 않은 정보 노출의 위험이 있으므로 즉시 조치가 필요하다.

     

    SMB/NetBIOS 정보 수집

    Windows 시스템이나 Samba 서버의 정보를 수집하는 것은 네트워크 자산 관리와 보안 평가에 중요하다. smb-os-discovery 스크립트는 상세한 시스템 정보를 제공한다:

    nmap -p 445 --script=smb-os-discovery 192.168.0.15

    출력 예시:

    PORT    STATE SERVICE
    445/tcp open  microsoft-ds
    
    Host script results:
    | smb-os-discovery: 
    |   OS: Windows 10 Pro 19043 (Windows 10 Pro 6.3)
    |   OS CPE: cpe:/o:microsoft:windows_10::-
    |   Computer name: DESKTOP-ABC123
    |   NetBIOS computer name: DESKTOP-ABC123\x00
    |   Domain name: WORKGROUP
    |   Forest name: WORKGROUP
    |   FQDN: DESKTOP-ABC123.WORKGROUP
    |_  System time: 2025-06-01T10:30:15+09:00

    이 정보를 통해 정확한 Windows 버전, 컴퓨터 이름, 도메인 구성 등을 파악할 수 있다. 특히 오래된 Windows 버전이나 지원이 종료된 시스템을 찾아내는 데 유용하다.

     

    HTTP 서비스 정보 수집

    웹 서버의 기본 정보를 수집하는 것은 웹 애플리케이션 보안 평가의 첫 단계이다. 여러 HTTP 관련 스크립트를 조합하여 사용할 수 있다:

    nmap -p 80,443 --script=http-title,http-headers,http-methods 192.168.0.20

    출력 예시:

    PORT    STATE SERVICE
    80/tcp  open  http
    | http-title: Apache2 Ubuntu Default Page: It works
    |_Requested resource was http://192.168.0.20/
    | http-headers: 
    |   Date: Mon, 01 Jun 2025 01:35:20 GMT
    |   Server: Apache/2.4.41 (Ubuntu)
    |   Last-Modified: Mon, 01 May 2025 10:00:00 GMT
    |   Content-Type: text/html
    |   Connection: close
    |_  (Request type: HEAD)
    | http-methods: 
    |_  Supported Methods: GET HEAD POST OPTIONS
    443/tcp open  https
    | http-title: Site doesn't have a title (text/html).
    |_Requested resource was https://192.168.0.20/

     

    취약점 스캔

    vuln 카테고리의 스크립트들은 알려진 취약점을 자동으로 검사한다. 전체 취약점 스캔을 수행하려면:

    nmap --script=vuln 192.168.0.10

    특정 취약점만 검사하려면 개별 스크립트를 지정한다. 예를 들어 SMBv1 취약점(EternalBlue)을 검사하려면:

    nmap -p 445 --script=smb-vuln-ms17-010 192.168.0.15

    출력 예시:

    PORT    STATE SERVICE
    445/tcp open  microsoft-ds
    
    Host script results:
    | smb-vuln-ms17-010: 
    |   VULNERABLE:
    |   Remote Code Execution vulnerability in Microsoft SMBv1 servers (ms17-010)
    |     State: VULNERABLE
    |     IDs:  CVE:CVE-2017-0143
    |     Risk factor: HIGH
    |       A critical remote code execution vulnerability exists in Microsoft SMBv1
    |       servers (ms17-010).
    |           
    |     Disclosure date: 2017-03-14
    |     References:
    |       https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-0143
    |       https://technet.microsoft.com/en-us/library/security/ms17-010.aspx
    |_      https://blogs.technet.microsoft.com/msrc/2017/05/12/customer-guidance-for-wannacrypt-attacks/

    이 결과는 시스템이 WannaCry 랜섬웨어가 악용한 치명적인 취약점에 노출되어 있음을 보여준다. 즉각적인 패치가 필요한 상황이다.

     

    고급 NSE 활용

    스크립트 인자 전달

    일부 스크립트는 추가 인자를 받아 동작을 커스터마이즈할 수 있다. --script-args 옵션을 사용하여 인자를 전달한다:

    nmap --script=http-brute --script-args userdb=users.txt,passdb=passwords.txt target.com

     

    스크립트 디버깅

    스크립트 실행 과정을 자세히 보려면 --script-trace 옵션을 사용한다:

    nmap --script=http-title --script-trace target.com

     

    사용자 정의 스크립트 작성

    기본 제공 스크립트로 충분하지 않다면 직접 스크립트를 작성할 수 있다. 간단한 예시로, 특정 포트에서 배너를 가져오는 스크립트를 만들어보자:

    -- custom-banner.nse
    description = [[
    Custom banner grabbing script
    ]]
    
    categories = {"safe", "discovery"}
    
    portrule = function(host, port)
        return port.state == "open"
    end
    
    action = function(host, port)
        local socket = nmap.new_socket()
        local status, err = socket:connect(host, port)
    
        if not status then
            return nil
        end
    
        local status, data = socket:receive()
        socket:close()
    
        if status then
            return "Banner: " .. data
        end
    
        return nil
    end

    작성한 스크립트는 Nmap 스크립트 디렉터리에 저장하거나, --script 옵션에 전체 경로를 지정하여 실행할 수 있다.

     

    NSE 사용 시 주의사항

    NSE는 매우 강력한 도구이지만, 그만큼 주의해서 사용해야 한다:

    1. intrusive 카테고리 스크립트는 대상 시스템에 부하를 주거나 서비스를 중단시킬 수 있으므로, 프로덕션 환경에서는 사용을 피해야 한다.
    2. exploit 카테고리 스크립트는 실제로 취약점을 공격하므로, 반드시 자신이 소유하거나 명시적인 허가를 받은 시스템에서만 사용해야 한다.
    3. dos 카테고리 스크립트는 서비스 거부 공격을 수행하므로, 테스트 환경 외에서는 절대 사용하지 말아야 한다.
    4. 일부 스크립트는 많은 양의 네트워크 트래픽을 발생시키므로, 네트워크 대역폭이 제한적인 환경에서는 주의가 필요하다.
    5. 스크립트 실행 결과는 절대적이지 않으며, 오탐(false positive)이나 미탐(false negative)의 가능성이 있으므로 결과를 신중히 해석해야 한다.

    NSE는 Nmap을 단순한 포트 스캐너에서 종합적인 네트워크 보안 평가 도구로 변모시키는 핵심 기능이다. 적절히 활용하면 보안 평가의 효율성과 정확도를 크게 향상시킬 수 있지만, 항상 책임감 있게 사용해야 한다는 점을 명심해야 한다.


    리눅스에서의 설치 및 실습 환경 구성

    Nmap을 효과적으로 학습하고 활용하기 위해서는 안전한 실습 환경을 구축하는 것이 중요하다. 이 섹션에서는 다양한 리눅스 배포판에서의 Nmap 설치 방법과 법적 문제없이 실습할 수 있는 환경 구성 방법을 상세히 다룬다.

     

    리눅스 배포판별 설치 방법

    Nmap은 대부분의 주요 리눅스 배포판의 공식 저장소에 포함되어 있어 패키지 관리자를 통해 쉽게 설치할 수 있다. 각 배포판별 설치 명령은 다음과 같다.

     

    Debian/Ubuntu 계열

    Debian 기반 시스템에서는 APT 패키지 관리자를 사용한다:

    sudo apt update
    sudo apt install nmap

    설치 후 다음 명령으로 설치된 파일 목록을 확인할 수 있다:

    dpkg -L nmap

     

    Red Hat/CentOS/Fedora 계열

    Red Hat 기반 시스템에서는 YUM 또는 DNF를 사용한다:

    # CentOS 7 이하 또는 RHEL 7 이하
    sudo yum install nmap
    
    # CentOS 8 이상, RHEL 8 이상, Fedora
    sudo dnf install nmap

     

    Arch Linux

    Arch Linux에서는 pacman을 사용한다.

    sudo pacman -S nmap

     

    openSUSE

    openSUSE에서는 zypper를 사용한다.

    sudo zypper install nmap

     

    소스코드 컴파일 설치

    최신 버전이나 특별한 기능이 필요한 경우 소스코드에서 직접 컴파일할 수 있다.

    # 의존성 패키지 설치 (Debian/Ubuntu 기준)
    sudo apt install build-essential libssl-dev libssh2-1-dev
    
    # 소스코드 다운로드
    wget https://nmap.org/dist/nmap-7.93.tar.bz2
    tar xvf nmap-7.93.tar.bz2
    cd nmap-7.93
    
    # 컴파일 및 설치
    ./configure
    make
    sudo make install

    설치 확인은 다음 명령으로 수행한다:

    nmap --version

    정상적으로 설치되었다면 버전 정보와 함께 컴파일 옵션, 라이브러리 정보 등이 표시된다.

     

    안전한 실습 환경 구축

    Nmap 실습에서 가장 중요한 원칙은 자신이 소유하거나 명시적으로 허가받은 시스템만을 대상으로 한다는 것이다. 타인의 시스템을 무단으로 스캔하는 것은 불법이며, 심각한 법적 결과를 초래할 수 있다. 안전한 실습을 위한 여러 방법을 소개한다.

     

    로컬호스트 활용

    가장 간단한 실습 대상은 자신의 시스템이다. 로컬 루프백 주소를 대상으로 스캔을 수행할 수 있다:

    # IPv4 로컬호스트 스캔
    nmap 127.0.0.1
    
    # IPv6 로컬호스트 스캔
    nmap ::1
    
    # 모든 로컬 인터페이스 스캔
    nmap localhost

    로컬 서비스를 실행하여 스캔 대상을 만들 수도 있다. 예를 들어 간단한 Python HTTP 서버를 실행하고 스캔해보자:

    # 터미널 1: HTTP 서버 실행
    python3 -m http.server 8080
    
    # 터미널 2: Nmap으로 스캔
    nmap -p 8080 localhost

     

    가상 머신 환경 구축

    보다 현실적인 네트워크 환경을 구축하려면 가상 머신을 활용하는 것이 좋다. VirtualBox를 사용한 실습 환경 구축 과정은 다음과 같다:

    1. VirtualBox 설치:
      # Debian/Ubuntu
      sudo apt install virtualbox
      
      # Fedora
      sudo dnf install VirtualBox

    2. 실습용 가상 머신 준비:
       - Metasploitable2: 의도적으로 취약하게 만들어진 리눅스 배포판
       - DVWA (Damn Vulnerable Web Application): 취약한 웹 애플리케이션
       - WebGoat: OWASP에서 제공하는 취약한 웹 애플리케이션

    3. 네트워크 구성:
       - NAT 네트워크: 외부 접근 차단, VM 간 통신 가능
       - Host-Only: 호스트와 VM 간만 통신 가능
       - Internal Network: VM 간만 통신 가능

    가상 머신 네트워크 설정 예시:

    # VirtualBox 명령줄로 Host-Only 네트워크 생성
    VBoxManage hostonlyif create
    VBoxManage hostonlyif ipconfig vboxnet0 --ip 192.168.56.1

     

    Docker 컨테이너 활용

    Docker를 사용하면 가볍고 빠르게 실습 환경을 구축할 수 있다:

    1. Docker 설치:
    2. # Debian/Ubuntu sudo apt install docker.io sudo systemctl start docker sudo usermod -aG docker $USER
    3. 취약한 서비스 컨테이너 실행:
    # 취약한 WordPress 환경
    docker run -d -p 8080:80 --name vulnerable-wp vulnerables/web-dvwa
    
    # 취약한 Node.js 애플리케이션
    docker run -d -p 3000:3000 --name juice-shop bkimminich/juice-shop
    
    # FTP 서버
    docker run -d -p 21:21 -p 20:20 -p 21100-21110:21100-21110 \
      -e FTP_USER=testuser -e FTP_PASS=testpass \
      --name ftp-server fauria/vsftpd
    1. 컨테이너 네트워크 스캔:
    # 실행 중인 컨테이너 IP 확인
    docker inspect vulnerable-wp | grep IPAddress
    
    # 컨테이너 스캔
    nmap 172.17.0.2

     

    전용 실습 네트워크 구성

    더 복잡한 시나리오를 위해 여러 시스템으로 구성된 실습 네트워크를 만들 수 있다:

    # Docker 커스텀 네트워크 생성
    docker network create --subnet=10.0.0.0/24 testnet
    
    # 여러 컨테이너를 커스텀 네트워크에 연결
    docker run -d --net testnet --ip 10.0.0.10 --name web1 nginx
    docker run -d --net testnet --ip 10.0.0.11 --name web2 httpd
    docker run -d --net testnet --ip 10.0.0.12 --name db1 mysql
    
    # 전체 네트워크 스캔
    nmap 10.0.0.0/24

     

    실습 시나리오

    시나리오 1: 기본 포트 스캔 실습

    목표: 다양한 스캔 기법의 차이점 이해

    # 1. TCP Connect 스캔 (일반 사용자)
    nmap -sT 10.0.0.10
    
    # 2. TCP SYN 스캔 (root 권한)
    sudo nmap -sS 10.0.0.10
    
    # 3. 스캔 시간 비교
    time nmap -sT 10.0.0.0/24
    time sudo nmap -sS 10.0.0.0/24

     

    시나리오 2: 서비스 및 OS 탐지

    목표: 서비스 버전과 운영체제 정보 수집 연습

    # 서비스 버전 탐지
    nmap -sV 10.0.0.10-12
    
    # OS 탐지 (root 권한 필요)
    sudo nmap -O 10.0.0.10-12
    
    # 종합 스캔
    sudo nmap -A 10.0.0.10-12

     

    시나리오 3: NSE 스크립트 활용

    목표: 다양한 NSE 스크립트 사용법 익히기

    # HTTP 정보 수집
    nmap -p 80 --script=http-* 10.0.0.10
    
    # 취약점 스캔
    nmap --script=vuln 10.0.0.10
    
    # 안전한 스크립트만 실행
    nmap --script=safe 10.0.0.10

     

    실습 결과 분석 및 문서화

    실습 결과를 체계적으로 관리하는 것이 중요하다.

    # 결과 저장 디렉터리 생성
    mkdir -p ~/nmap-labs/{scans,reports}
    
    # 날짜별 스캔 결과 저장
    nmap -oA ~/nmap-labs/scans/$(date +%Y%m%d)-basic-scan 10.0.0.0/24
    
    # XML 결과를 HTML로 변환
    xsltproc ~/nmap-labs/scans/20250601-basic-scan.xml \
      -o ~/nmap-labs/reports/20250601-report.html

     

    권한 관리 및 보안 고려사항

    Nmap 실습 시 권한 관리는 매우 중요하다.

    1. 일반 사용자 vs root 권한:
      • 일반 사용자: TCP Connect 스캔만 가능
      • root 권한: 모든 스캔 기법 사용 가능
      • 권한 상승은 필요한 경우에만 수행
    2. sudo 설정:
    3. # sudoers 파일에 Nmap 권한 추가 (권장하지 않음) # visudo로 편집 # username ALL=(ALL) NOPASSWD: /usr/bin/nmap
    4. capabilities 활용 (Linux):
    5. # Nmap에 필요한 권한만 부여 sudo setcap cap_net_raw,cap_net_admin,cap_net_bind_service+eip /usr/bin/nmap

     

    법적 책임과 윤리적 사용

    Nmap 사용 시 반드시 준수해야 할 법적, 윤리적 원칙:

    1. 명시적 허가: 스캔 대상 시스템의 소유자로부터 서면 허가를 받아야 한다
    2. 범위 제한: 허가받은 IP 주소와 시간대에만 스캔을 수행한다
    3. 기록 유지: 모든 스캔 활동을 문서화하고 로그를 보관한다
    4. 책임감: 스캔으로 인한 서비스 중단이나 피해에 대한 책임을 인지한다
    5. 법규 준수: 국가별 컴퓨터 관련 법규를 숙지하고 준수한다

    실습 환경에서도 이러한 원칙을 지키는 습관을 들이는 것이 중요하다. 실제 업무에서 Nmap을 사용할 때 전문가다운 태도를 유지할 수 있도록 평소부터 올바른 사용법을 익혀야 한다.


    Nmap 출력 해석과 결과 시각화 도구

    Nmap의 출력 결과를 정확히 이해하고 해석하는 것은 효과적인 네트워크 보안 평가의 핵심이다. 이 섹션에서는 Nmap 출력의 각 요소를 상세히 분석하고, 결과를 시각화하여 더 직관적으로 이해할 수 있는 도구와 방법을 소개한다.

     

    Nmap 출력 구조의 상세 분석

    Nmap의 텍스트 출력은 일정한 구조를 따르며, 각 섹션은 특정한 정보를 담고 있다. 전체적인 출력 구조를 단계별로 살펴보자.

     

    스캔 헤더 정보

    모든 Nmap 스캔은 기본 정보를 포함한 헤더로 시작한다:

    Starting Nmap 7.93 ( https://nmap.org ) at 2025-06-01 10:00 KST

    이 부분은 Nmap 버전, 공식 웹사이트, 스캔 시작 시간을 보여준다. 버전 정보는 특정 기능의 사용 가능 여부를 판단하는 데 중요하며, 시간 정보는 스캔 로그 관리에 필수적이다.

     

    호스트 상태 정보

    각 대상 호스트에 대한 기본 정보가 표시된다:

    Nmap scan report for target.example.com (192.168.1.100)
    Host is up (0.042s latency).

    여기서 주목할 점:

    • 도메인 이름과 IP 주소가 함께 표시된다
    • Host is up: 호스트가 응답했음을 의미
    • latency: 호스트까지의 왕복 시간(RTT)을 나타냄

    때로는 추가 정보가 포함될 수 있다.

    Other addresses for target.example.com (not scanned): 2001:db8::1
    rDNS record for 192.168.1.100: target.example.com

    이는 IPv6 주소나 역방향 DNS 정보를 보여준다.

     

    포트 상태 정보

    포트 스캔 결과는 표 형식으로 정리되어 표시된다.

    Not shown: 997 closed ports
    PORT    STATE    SERVICE     VERSION
    22/tcp  open     ssh         OpenSSH 8.9p1 Ubuntu 3 (Ubuntu Linux; protocol 2.0)
    80/tcp  open     http        Apache httpd 2.4.52 ((Ubuntu))
    443/tcp filtered https

    포트 상태(STATE)의 의미:

    • open: 애플리케이션이 해당 포트에서 연결을 수락하고 있음
    • closed: 포트에 접근 가능하지만 수신 애플리케이션이 없음
    • filtered: 패킷 필터링으로 인해 포트 상태를 확인할 수 없음
    • unfiltered: 포트에 접근 가능하지만 열림/닫힘 여부는 확인 불가
    • open|filtered: 열림 또는 필터링 상태 (주로 UDP 스캔에서)
    • closed|filtered: 닫힘 또는 필터링 상태

    Not shown: 줄은 표시되지 않은 포트들의 요약이다. 기본적으로 Nmap은 흥미로운 포트(열림, 필터링됨 등)만 표시하고 나머지는 요약한다.

     

    서비스 및 버전 정보

    -sV 옵션 사용 시 SERVICE와 VERSION 열이 추가된다:

    PORT     STATE SERVICE       VERSION
    3306/tcp open  mysql         MySQL 8.0.28
    | mysql-info: 
    |   Protocol: 10
    |   Version: 8.0.28
    |   Thread ID: 10
    |   Capabilities flags: 65535
    |   Some Capabilities: Support41Auth, SupportsTransactions
    |   Status: Autocommit
    |_  Salt: \x08\x7F\x12c@N\x0Fez\x7F{8\x14]QTaQNT

    NSE 스크립트 결과는 포트 정보 아래에 들여쓰기로 표시되며, | 문자로 시작한다. 스크립트의 마지막 줄은 |_로 끝난다.

     

    OS 탐지 결과

    -O 옵션 사용 시 운영체제 정보가 추가된다:

    Device type: general purpose
    Running: Linux 5.X
    OS CPE: cpe:/o:linux:linux_kernel:5
    OS details: Linux 5.4 - 5.16
    Network Distance: 2 hops
    
    OS detection performed. Please report any incorrect results at https://nmap.org/submit/ .

    주요 정보:

    • Device type: 장비 유형 (일반 목적, 라우터, 프린터 등)
    • Running: 운영체제 종류와 버전
    • OS CPE: Common Platform Enumeration 형식의 OS 식별자
    • OS details: 더 구체적인 OS 정보
    • Network Distance: 대상까지의 홉 수

     

    추가 정보 섹션

    MAC 주소 (로컬 네트워크 스캔 시):

    MAC Address: 00:11:22:33:44:55 (Dell Inc.)

    호스트 스크립트 결과:

    Host script results:
    | smb-os-discovery: 
    |   OS: Windows 10 Pro 19043 (Windows 10 Pro 6.3)
    |   Computer name: DESKTOP-TEST
    |   NetBIOS computer name: DESKTOP-TEST\x00
    |   Workgroup: WORKGROUP\x00
    |_  System time: 2025-06-01T10:30:45+09:00

    경로 추적 결과 (--traceroute 옵션):

    TRACEROUTE (using port 80/tcp)
    HOP RTT     ADDRESS
    1   1.23 ms 192.168.1.1
    2   15.67 ms target.example.com (192.168.1.100)

     

    스캔 요약

    마지막에는 전체 스캔의 요약 정보가 표시된다.

    Nmap done: 256 IP addresses (10 hosts up) scanned in 45.23 seconds

     

    출력 형식 옵션의 활용

    Nmap은 다양한 출력 형식을 지원하여 후처리와 분석을 용이하게 한다.

     

    Normal (-oN)

    사람이 읽기 쉬운 기본 텍스트 형식이다.

    nmap -oN scan_results.txt target.com

    터미널에 표시되는 것과 동일한 형식으로 저장된다.

     

    XML (-oX)

    구조화된 XML 형식으로, 프로그램에서 파싱하기 쉽다.

    nmap -oX scan_results.xml target.com

    XML 출력은 다음과 같은 구조를 가진다.

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE nmaprun>
    <nmaprun scanner="nmap" args="nmap -oX scan_results.xml target.com" 
             start="1622520000" version="7.93">
      <host starttime="1622520001" endtime="1622520010">
        <status state="up" reason="echo-reply"/>
        <address addr="192.168.1.100" addrtype="ipv4"/>
        <ports>
          <port protocol="tcp" portid="22">
            <state state="open" reason="syn-ack"/>
            <service name="ssh" product="OpenSSH" version="8.9p1"/>
          </port>
        </ports>
      </host>
    </nmaprun>

     

    Grepable (-oG)

    한 줄에 한 호스트씩 정보를 정리하여 grep 등의 도구로 처리하기 쉽다.

    nmap -oG scan_results.gnmap target.com

    출력 예시:

    # Nmap 7.93 scan initiated Mon Jun  1 10:00:00 2025 as: nmap -oG scan_results.gnmap target.com
    Host: 192.168.1.100 (target.com)  Status: Up
    Host: 192.168.1.100 (target.com)  Ports: 22/open/tcp//ssh///, 80/open/tcp//http///, 443/filtered/tcp//https///

     

    Script Kiddie (-oS)

    해커 문화의 "스크립트 키디" 스타일로 출력하는 재미있는 형식이다. 실용적이지는 않다:

    nmap -oS l33t_results.txt target.com

     

    모든 형식 동시 저장 (-oA)

    한 번에 여러 형식으로 저장한다:

    nmap -oA scan_results target.com

    이 명령은 scan_results.nmap, scan_results.xml, scan_results.gnmap 세 파일을 생성한다.

     

    시각화 도구

    Zenmap - 공식 GUI

    Zenmap은 Nmap의 공식 그래픽 사용자 인터페이스로, 크로스 플랫폼을 지원한다[9]. 주요 기능:

    1. 프로파일 기반 스캔: 자주 사용하는 스캔 옵션을 프로파일로 저장
    2. 토폴로지 뷰: 네트워크 구조를 그래픽으로 표현
    3. 스캔 비교: 여러 스캔 결과를 비교하여 변경사항 파악
    4. 검색 기능: 특정 호스트나 서비스를 쉽게 찾기

    Zenmap 설치:

    # Debian/Ubuntu
    sudo apt install zenmap
    
    # Fedora
    sudo dnf install nmap-frontend

    Zenmap의 주요 탭:

    • Hosts: 스캔된 호스트 목록과 상태
    • Services: 발견된 모든 서비스 목록
    • Topology: 네트워크 토폴로지 그래프
    • Host Details: 선택한 호스트의 상세 정보
    • Scans: 수행한 스캔 히스토리

     

    웹 기반 시각화 도구

    1. WebMap

    WebMap은 Nmap XML 결과를 웹 대시보드로 변환하는 도구이다:

    # Docker로 WebMap 실행
    docker run -d -p 8000:8000 reborntc/webmap
    
    # XML 파일 업로드 후 웹 브라우저에서 확인
    # http://localhost:8000

    2. IVRE

    IVRE(Instrument de Veille sur les Réseaux Extérieurs)는 대규모 네트워크 스캔 결과를 관리하고 시각화하는 프레임워크이다:

    # IVRE 설치 (Python pip 사용)
    pip install ivre
    
    # MongoDB 필요
    sudo apt install mongodb
    
    # Nmap 결과 임포트
    ivre scan2db scan_results.xml
    ivre db2view nmap
    
    # 웹 인터페이스 실행
    ivre httpd

     

    커스텀 시각화

    Python을 사용한 간단한 시각화 예제:

    import xml.etree.ElementTree as ET
    import matplotlib.pyplot as plt
    
    # XML 파일 파싱
    tree = ET.parse('scan_results.xml')
    root = tree.getroot()
    
    # 포트 상태 통계
    port_states = {}
    for port in root.findall('.//port'):
        state = port.find('state').get('state')
        port_states[state] = port_states.get(state, 0) + 1
    
    # 파이 차트 생성
    plt.figure(figsize=(8, 6))
    plt.pie(port_states.values(), labels=port_states.keys(), autopct='%1.1f%%')
    plt.title('Port States Distribution')
    plt.show()

     

    결과 분석 자동화

    대규모 스캔 결과를 효율적으로 분석하기 위한 스크립트 예제:

    #!/bin/bash
    # nmap_analyzer.sh - Nmap 결과 분석 스크립트
    
    XML_FILE=$1
    
    # 열린 포트가 있는 호스트 찾기
    echo "=== Hosts with Open Ports ==="
    grep -B3 "state=\"open\"" $XML_FILE | grep "addr=" | cut -d'"' -f2 | sort -u
    
    # 가장 많이 열린 포트 TOP 10
    echo -e "\n=== Top 10 Open Ports ==="
    grep "state=\"open\"" $XML_FILE | grep -oP 'portid="\K[0-9]+' | \
      sort | uniq -c | sort -rn | head -10
    
    # 발견된 서비스 목록
    echo -e "\n=== Discovered Services ==="
    grep -oP 'service name="\K[^"]+' $XML_FILE | sort -u
    
    # 취약한 서비스 버전 찾기 (예: 오래된 SSH)
    echo -e "\n=== Potentially Vulnerable Services ==="
    grep -B1 -A1 "OpenSSH" $XML_FILE | grep -E "version=\"[1-6]\."

     

    보고서 생성

    전문적인 보고서 생성을 위한 도구와 템플릿:

    1. XSL 변환을 통한 HTML 보고서

    # Nmap과 함께 제공되는 XSL 스타일시트 사용
    xsltproc /usr/share/nmap/nmap.xsl scan_results.xml > report.html

    2. LaTeX를 사용한 PDF 보고서

    \documentclass{article}
    \usepackage{longtable}
    \begin{document}
    \title{Network Security Assessment Report}
    \author{Security Team}
    \date{\today}
    \maketitle
    
    \section{Executive Summary}
    This report presents the findings from the network security assessment 
    conducted on June 1, 2025.
    
    \section{Methodology}
    The assessment was performed using Nmap version 7.93 with the following 
    scan techniques:
    \begin{itemize}
        \item TCP SYN scan for port discovery
        \item Service version detection
        \item Operating system fingerprinting
    \end{itemize}
    
    \section{Findings}
    \subsection{Open Ports Summary}
    \begin{longtable}{|l|l|l|l|}
    \hline
    \textbf{Host} & \textbf{Port} & \textbf{Service} & \textbf{Version} \\
    \hline
    192.168.1.100 & 22/tcp & SSH & OpenSSH 8.9p1 \\
    192.168.1.100 & 80/tcp & HTTP & Apache 2.4.52 \\
    \hline
    \end{longtable}
    
    \end{document}

     

    실시간 모니터링

    지속적인 네트워크 모니터링을 위한 스크립트:

    #!/bin/bash
    # continuous_monitor.sh - 주기적 Nmap 스캔 및 변경사항 알림
    
    TARGETS="192.168.1.0/24"
    BASELINE="baseline.xml"
    CURRENT="current.xml"
    INTERVAL=3600  # 1시간마다
    
    while true; do
        # 현재 상태 스캔
        nmap -sS -sV -oX $CURRENT $TARGETS
    
        # 기준선과 비교
        if [ -f $BASELINE ]; then
            # ndiff를 사용한 차이점 분석
            ndiff $BASELINE $CURRENT > changes.txt
    
            # 새로운 포트가 열렸는지 확인
            if grep -q "^+" changes.txt; then
                echo "Alert: Network changes detected!"
                mail -s "Nmap Alert: Network Changes" admin@example.com < changes.txt
            fi
        fi
    
        # 현재 스캔을 새 기준선으로
        cp $CURRENT $BASELINE
    
        sleep $INTERVAL
    done

    이러한 도구와 기법들을 활용하면 Nmap 스캔 결과를 더욱 효과적으로 분석하고 활용할 수 있다. 중요한 것은 단순히 스캔을 수행하는 것이 아니라, 그 결과를 정확히 해석하고 적절한 조치를 취하는 것이다. 정기적인 스캔과 결과 비교를 통해 네트워크의 변화를 추적하고, 새로운 위협이나 취약점을 조기에 발견할 수 있다.


    결론 및 주의사항

    이 가이드를 통해 리눅스 환경에서 Nmap을 활용한 네트워크 스캐닝의 기초부터 고급 기법까지 폭넓게 다루었다. Nmap은 단순한 포트 스캐너를 넘어서 종합적인 네트워크 보안 평가 도구로서의 가치를 지니고 있으며, 적절히 활용하면 네트워크의 보안 수준을 크게 향상시킬 수 있다.

     

    핵심 요약

    본 가이드에서 다룬 주요 내용을 정리하면 다음과 같다.

    1. Nmap의 기본 개념: 네트워크 맵핑과 보안 감사를 위한 오픈소스 도구로서, 포트 스캔, 서비스 탐지, OS 식별 등 다양한 기능을 제공한다.
    2. 주요 스캔 기법: TCP Connect, TCP SYN, UDP, Ping 스캔 등 각각의 특성과 적용 상황을 이해하고 목적에 맞게 선택하여 사용한다.
    3. CLI 옵션 활용: 포트 지정, 타이밍 조정, 출력 형식 설정 등 다양한 옵션을 조합하여 효율적인 스캔을 수행한다.
    4. 보안 활용 사례: 오픈 포트 탐지, 방화벽 정책 검증, 취약점 관리, 자산 관리 등 실무에서의 구체적인 활용 방법을 익힌다.
    5. NSE 스크립트 엔진: Lua 기반의 확장 가능한 스크립트 엔진을 통해 Nmap의 기능을 무한히 확장할 수 있다.
    6. 안전한 실습 환경: 가상 머신, Docker 컨테이너 등을 활용하여 법적 문제없이 실습할 수 있는 환경을 구축한다.
    7. 결과 분석과 시각화: 다양한 출력 형식과 시각화 도구를 활용하여 스캔 결과를 효과적으로 분석하고 보고한다.

     

    법적 책임과 윤리적 사용

    Nmap 사용에 있어 가장 중요한 것은 법적 책임과 윤리적 사용이다. 다시 한 번 강조하지만,

    절대 준수 사항:

    • 자신이 소유하거나 명시적으로 허가받은 시스템만 스캔한다
    • 스캔 전 반드시 서면 허가를 받는다
    • 허가받은 범위와 시간대를 엄격히 준수한다
    • 모든 스캔 활동을 문서화하고 기록을 보관한다
    • 스캔으로 인한 서비스 중단 가능성을 사전에 고지한다

    법적 위험:

    • 무단 스캔은 컴퓨터 침해 관련 법률 위반이다
    • 민사상 손해배상 책임이 발생할 수 있다
    • 형사 처벌을 받을 수 있다
    • 직업적 신뢰도와 경력에 치명적인 손상을 입을 수 있다

     

    지속적인 학습과 발전

    네트워크 보안 분야는 빠르게 발전하고 있으며, Nmap도 지속적으로 업데이트되고 있다. 효과적인 활용을 위해서는,

    1. 공식 문서 참조: Nmap 공식 웹사이트와 매뉴얼을 정기적으로 확인한다
    2. 커뮤니티 참여: 보안 커뮤니티와 포럼에서 최신 정보를 공유한다
    3. 실습 환경 유지: 안전한 실습 환경을 구축하고 지속적으로 연습한다
    4. 새로운 기법 학습: 새로운 스캔 기법과 NSE 스크립트를 학습한다
    5. 관련 도구 습득: Wireshark, Metasploit 등 관련 도구도 함께 익힌다

     

    마치며

    Nmap은 강력한 도구이지만, 그 자체로는 중립적이다. 도구의 가치는 사용자가 어떻게 활용하느냐에 달려 있다. 보안 전문가로서 Nmap을 사용할 때는 항상 방어적 관점에서 접근하고, 발견한 취약점을 보호하고 개선하는 데 집중해야 한다.

     

    네트워크 보안은 단순히 기술적인 문제가 아니라 조직의 자산과 정보를 보호하는 중요한 책임이다. Nmap은 이러한 책임을 수행하는 데 있어 필수적인 도구이며, 올바르게 사용할 때 네트워크의 보안 수준을 크게 향상시킬 수 있다.

     

    이 글이 리눅스 환경에서 Nmap을 처음 접하는 사용자들에게 실질적인 도움이 되기를 바란다. 단계별로 제시된 내용을 충분히 이해하고 실습한 후, 자신의 환경에 맞게 응용하여 활용하기 바란다. 무엇보다 중요한 것은 기술적 역량과 함께 책임감 있는 보안 전문가로서의 윤리 의식을 함께 갖추는 것이다.

     

    보안은 목적지가 아닌 여정이다. Nmap은 그 여정에서 신뢰할 수 있는 동반자가 될 것이다. 지속적인 학습과 실습을 통해 네트워크 보안 전문가로 성장하기를 기원한다.


    참고 자료

    [1] Nmap 공식 사이트 - "Nmap(Network Mapper)는 네트워크 검색과 보안 감사에 사용되는 무료 오픈소스 유틸리티" (nmap.org)

    [2] 한국어 위키백과 - Nmap: 원격 시스템의 운영체제, 서비스 버전, 방화벽 존재 여부 등을 탐지하는 기능 소개 (ko.wikipedia.org)

    [3] HAHWUL 보안 블로그 - "Nmap은 네트워크 점검 도구이지만 보편적으로 포트 스캐너로 많이 알려져 있으며, 대상의 열린 포트를 찾아 서비스를 식별해 침투 테스트나 네트워크 점검에 도움을 준다" (hahwul.com)

    [4] Nmap 공식 가이드 - TCP SYN 스캔은 완전한 연결을 맺지 않아 빠르고 비교적 은밀한 스캔 방법임을 설명 (nmap.org)

    [5] Nmap 공식 가이드 - 로컬 이더넷에서는 ARP 스캔을 기본 사용하여 ICMP 차단 호스트도 탐지함; ARP는 차단 불가이므로 ICMP 막아도 호스트 식별 가능 (nmap.org)

    [6] Medium 블로그 - R. Anand, Mastering Nmap Firewall Evasion Techniques (2024년) : 데코이 스캔은 여러 IP 주소를 섞어 보내 실제 공격자의 흔적을 감추는 방법이라고 설명함 (medium.com)

    [7] Medium 블로그 - R. Anand, Mastering Nmap Firewall Evasion Techniques (2024년) : 출발지 포트를 53 등 신뢰 포트로 위장하면 일부 방화벽이 해당 스캔 패킷을 허용할 수 있다고 언급함 (medium.com)

    [8] Nmap 공식 문서 - NSE(Nmap Scripting Engine) 소개 및 활용 범위 설명 (nmap.org)

    [9] Nmap 공식 사이트 - Zenmap 소개 (크로스플랫폼 GUI 프론트엔드로 초보자와 고급 사용자를 모두 염두에 둔 설계) (nmap.org)

    [10] Kali 리눅스 Nmap 사용법 블로그 - 방화벽이 SYN 패킷을 필터링할 때 우회하기 위해 FIN 플래그만 설정해 스캔하는 FIN 스캔 기법 설명 (peemangit.tistory.com)

    728x90
    728x90
    댓글