소개
이 랩에서는 강력한 네트워크 스캔 및 보안 감사 도구인 Nmap 의 설치 및 기본적인 사용법에 대해 배우게 됩니다. Nmap 은 Network Mapper 라고도 하며, 시스템 관리자와 보안 전문가가 네트워크에서 호스트, 서비스 및 취약점을 찾는 데 널리 사용되는 오픈 소스 유틸리티입니다.
이 랩에서는 Nmap 을 설치하고, 스캔을 위한 로컬 서비스를 설정하며, Nmap 의 기능을 이해하기 위한 기본적인 스캔을 수행하는 과정을 안내합니다.
Nmap 설치
이 단계에서는 Ubuntu Linux 시스템에 Nmap 을 설치하는 과정을 안내합니다. Nmap 은 네트워크 검색 및 보안 감사와 같은 작업에 사이버 보안 분야에서 널리 사용되는 강력한 네트워크 스캔 도구입니다. Ubuntu 기본 저장소에서 사용할 수 있으므로 설치 과정이 매우 간단합니다.
먼저 터미널을 열어야 합니다. 터미널은 명령을 입력하여 시스템과 상호 작용할 수 있는 텍스트 기반 인터페이스입니다. 기본적으로 /home/labex/project 디렉토리에 있어야 합니다. 이 디렉토리에 있지 않은 경우 다음 명령을 사용하여 이동할 수 있습니다. 이 명령은 현재 작업 디렉토리를 /home/labex/project로 변경합니다.
cd /home/labex/project

이제 올바른 디렉토리에 있으므로 패키지 목록을 업데이트하고 Nmap 을 설치할 차례입니다. 패키지 목록에는 Ubuntu 저장소에서 사용할 수 있는 모든 소프트웨어에 대한 정보가 포함되어 있습니다. 이를 업데이트하면 최신 버전의 Nmap 을 얻을 수 있습니다.
sudo apt update
sudo apt install nmap -y
sudo 명령은 관리자 권한으로 명령을 실행하는 데 사용됩니다. 소프트웨어를 설치하려면 관리자 액세스가 필요하므로 sudo를 사용해야 합니다. -y 플래그는 apt install 명령과 함께 사용됩니다. 설치 과정에서 발생하는 모든 프롬프트에 자동으로 "yes"로 응답하므로 각 단계를 수동으로 확인할 필요가 없습니다.
설치가 완료된 후에는 Nmap 이 올바르게 설치되었는지 확인하는 것이 중요합니다. 버전 확인을 통해 확인할 수 있습니다. nmap 명령의 --version 옵션은 Nmap 의 버전 정보를 표시합니다.
nmap --version
다음과 유사한 출력을 볼 수 있습니다 (버전은 다를 수 있습니다).
Nmap version 7.80 ( https://nmap.org )
Platform: x86_64-pc-linux-gnu
Compiled with: liblua-5.3.3 openssl-1.1.1f nmap-libssh2-1.8.2 libz-1.2.11 libpcre-8.39 libpcap-1.9.1 nmap-libdnet-1.12 ipv6
Compiled without:
Available nsock engines: epoll poll select
이 출력은 Nmap 이 시스템에 설치되었음을 확인합니다. 또한 Nmap 의 버전 및 사용된 컴파일 옵션에 대한 정보를 제공하며, 이는 문제 해결 또는 설치된 Nmap 의 기능을 이해하는 데 유용할 수 있습니다.
스캔을 위한 로컬 서비스 설정
Nmap 을 사용하여 스캔을 시작하기 전에 대상 서비스가 실행 중이어야 합니다. 이렇게 하면 Nmap 의 스캔 기능을 효과적으로 테스트할 수 있습니다. 이 단계에서는 Python 의 내장 http.server 모듈을 사용하여 간단한 HTTP 서버를 설정합니다. Python 의 http.server 모듈은 복잡한 구성 없이 HTTP 서버를 빠르게 시작할 수 있는 편리한 도구입니다.
먼저 HTTP 서버용 새 디렉토리를 만들어 보겠습니다. 디렉토리는 컴퓨터의 폴더와 같으며, 서버와 관련된 모든 파일을 저장할 수 있습니다.
mkdir -p /home/labex/project/http-server
cd /home/labex/project/http-server
mkdir -p 명령은 지정된 경로에 http-server라는 디렉토리를 만듭니다. -p 옵션은 중간 디렉토리가 존재하지 않는 경우에도 생성되도록 합니다. 그런 다음 cd 명령은 현재 작업 디렉토리를 새로 생성된 http-server 디렉토리로 변경합니다.
이제 서버가 제공할 간단한 HTML 파일을 만들어 보겠습니다. HTML 은 웹 페이지를 만드는 표준 마크업 언어입니다.
echo "<html><body><h1>Welcome to the Nmap Lab</h1></body></html>" > index.html
이 명령은 echo 명령을 사용하여 HTML 코드를 터미널에 출력한 다음 해당 출력을 index.html이라는 파일로 리디렉션합니다. 따라서 기본 HTML 구조와 환영 메시지가 있는 파일을 만들었습니다.
다음으로 Python HTTP 서버를 시작합니다.
python3 -m http.server 8000
이 명령은 python3 인터프리터를 사용하여 http.server 모듈을 스크립트로 실행합니다. -m 옵션은 Python 에게 모듈을 스크립트로 실행하도록 지시합니다. 포트 8000 을 지정하면 서버가 이 포트에서 들어오는 요청을 수신 대기합니다.

중요: 계속하려면 새 터미널 탭 또는 창을 엽니다. 이 터미널에서 HTTP 서버를 계속 실행하고, 이 랩의 모든 후속 Nmap 명령에 새 터미널을 사용하십시오. 이렇게 하면 스캔을 수행하는 동안 HTTP 서버가 활성 상태로 유지됩니다.
서버가 실행 중인지 확인하려면 새 터미널에서 curl 명령을 사용할 수 있습니다. curl은 서버에서 또는 서버로 데이터를 전송하는 데 사용되는 명령줄 도구입니다.
curl http://localhost:8000
이 명령을 실행하면 curl은 포트 8000 에서 localhost (자신의 컴퓨터를 의미) 에서 실행 중인 HTTP 서버로 요청을 보냅니다. 서버가 올바르게 실행 중이면 이전에 만든 HTML 콘텐츠가 표시됩니다.
127.0.0.1 - - [13/Sep/2024 15:24:21] "GET / HTTP/1.1" 200 -
<html>
<body>
<h1>Welcome to the Nmap Lab</h1>
</body>
</html>
이 출력은 서버가 요청을 수신하고 성공적으로 처리했으며 (200 상태 코드로 표시됨) index.html 파일의 HTML 콘텐츠를 반환했음을 보여줍니다.
Nmap 기본 스캔
이제 Nmap 을 성공적으로 설치하고 로컬 서비스를 설정했으므로, 몇 가지 기본 스캔을 시작할 차례입니다. 이를 통해 Nmap 이 어떻게 작동하는지, 어떤 종류의 정보를 제공할 수 있는지 이해할 수 있습니다.
먼저 로컬 HTTP 서버에서 간단한 TCP 연결 스캔을 수행합니다. TCP 연결 스캔은 Nmap 의 기본적인 스캔 유형입니다. 대상 포트에 대한 전체 TCP 연결을 설정하려고 시도합니다. 연결에 성공하면 포트가 열려 있음을 의미합니다.
이 스캔을 수행하는 명령은 다음과 같습니다.
nmap -sT -p 8000 localhost
이 명령을 분석해 보겠습니다.
-sT는 TCP 연결 스캔을 지정하는 옵션입니다. 이는 Nmap 에게 포트의 상태를 확인하기 위해 TCP 연결 방식을 사용하도록 지시합니다.-p 8000은 Nmap 이 포트 8000 만 스캔하도록 하려는 것을 나타냅니다. 필요한 경우 이 숫자를 변경하여 다른 포트를 스캔할 수 있습니다.localhost는 스캔 대상입니다. 서비스가 실행 중인 로컬 머신을 나타냅니다.
이 명령을 실행하면 다음과 유사한 출력이 표시됩니다.
Starting Nmap 7.80 ( https://nmap.org ) at 2024-09-13 15:27 CST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00011s latency).
Other addresses for localhost (not scanned): ::1
PORT STATE SERVICE
8000/tcp open http-alt
Nmap done: 1 IP address (1 host up) scanned in 0.06 seconds
이 출력은 포트 8000 이 열려 있고 HTTP 서비스를 실행 중임을 보여줍니다. STATE 열은 포트의 상태를 나타내며, 이 경우 open입니다. SERVICE 열은 해당 포트에서 어떤 종류의 서비스가 실행 중인지에 대한 아이디어를 제공합니다.
이제 더 자세한 스캔을 수행해 보겠습니다. 때로는 포트가 열려 있다는 것만으로는 충분하지 않습니다. 해당 포트에서 실행 중인 서비스에 대한 자세한 정보, 예를 들어 버전을 알고 싶을 수 있습니다.
더 자세한 스캔을 위한 명령은 다음과 같습니다.
nmap -sV -p 8000 localhost
-sV 옵션은 서비스/버전 정보를 확인하기 위해 열린 포트를 프로브하도록 Nmap 에 지시하는 데 사용됩니다. 즉, Nmap 은 열린 포트에서 어떤 특정 소프트웨어와 버전이 실행 중인지 파악하려고 시도합니다.
이 명령을 실행하면 다음과 유사한 출력이 표시됩니다.
Starting Nmap 7.80 ( https://nmap.org ) at 2024-09-13 15:27 CST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00011s latency).
Other addresses for localhost (not scanned): ::1
PORT STATE SERVICE VERSION
8000/tcp open http SimpleHTTPServer 0.6 (Python 3.10.12)
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 6.48 seconds
이 출력은 포트 8000 에서 실행 중인 서비스에 대한 자세한 정보를 제공합니다. Python SimpleHTTPServer 이며 버전 번호까지 알려줍니다.
Python HTTP 서버를 시작한 터미널의 로그에서 Nmap 요청을 볼 수 있습니다. 이는 디버깅 또는 추가 분석에 유용할 수 있습니다.
다중 포트 스캔
실제 시나리오에서는 여러 포트 또는 전체 포트 범위를 스캔해야 하는 경우가 많습니다. Nmap 으로 이를 수행하는 방법을 살펴보겠습니다.
네트워크 스캔과 관련하여 여러 포트를 한 번에 확인하고 싶을 수 있습니다. 이는 서로 다른 서비스가 서로 다른 포트에서 실행되기 때문에 유용하며, 여러 포트를 스캔하면 대상에서 사용 가능한 서비스에 대한 포괄적인 보기를 얻을 수 있습니다.
먼저 localhost 에서 가장 일반적인 1000 개 포트를 스캔해 보겠습니다. Localhost 는 IP 주소 127.0.0.1 로 표시되는 현재 작업 중인 장치를 나타냅니다. 가장 일반적인 1000 개 포트를 스캔하는 것은 로컬 머신에서 실행 중인 서비스에 대한 개요를 얻는 빠른 방법입니다.
nmap localhost
이 명령을 실행하면 다음과 유사한 출력이 표시됩니다.
Starting Nmap 7.80 ( https://nmap.org ) at 2024-09-13 15:29 CST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00016s latency).
Other addresses for localhost (not scanned): ::1
Not shown: 997 closed ports
PORT STATE SERVICE
22/tcp open ssh
3001/tcp open nessus
8000/tcp open http-alt
Nmap done: 1 IP address (1 host up) scanned in 0.08 seconds
포트 지정을 하지 않은 이 명령은 가장 일반적인 1000 개 포트를 스캔합니다. 열린 포트, 닫힌 포트 및 필터링된 포트 목록이 표시됩니다. 출력은 포트 번호, 상태 (열림, 닫힘 또는 필터링됨) 및 관련 서비스를 보여줍니다.
이제 65535 개 포트를 모두 스캔해 보겠습니다. TCP/IP 프로토콜에는 총 65535 개의 포트가 있습니다. 이 모든 포트를 스캔하면 대상에서 실행 중인 서비스에 대한 전체 그림을 얻을 수 있지만 시간이 더 오래 걸립니다.
nmap -p- localhost
-p- 옵션은 Nmap 에게 1 에서 65535 까지의 모든 포트를 스캔하도록 지시합니다. 이 스캔은 모든 포트를 하나씩 확인해야 하므로 완료하는 데 더 오래 걸립니다.
마지막으로 특정 포트 범위를 스캔해 보겠습니다. 때로는 특정 서비스가 실행될 수 있는 포트에 대한 아이디어가 있을 수 있으며 해당 포트만 스캔하려는 경우도 있습니다.
nmap -p 1-1000 localhost
이 명령은 1 에서 1000 까지의 포트를 스캔합니다. 포트 범위를 지정하면 필요에 가장 적합한 포트에 스캔을 집중할 수 있습니다.
출력 형식 및 결과 저장
Nmap 은 다양한 출력 형식을 제공하며, 각 형식은 서로 다른 요구 사항에 맞게 조정되었습니다. 이러한 형식을 이해하고 스캔 결과를 저장하는 방법은 추가 분석 및 발견 사항 공유에 매우 중요합니다. 이 단계에서는 이러한 형식 중 일부를 자세히 살펴보고 스캔 결과를 효과적으로 저장하는 방법을 배웁니다.
먼저 스캔을 수행하고 출력을 일반 형식으로 저장해 보겠습니다. 일반 형식은 사람이 읽을 수 있는 텍스트 형식으로, 스캔 결과를 명확하고 간단한 방식으로 표시합니다. 이 형식으로 출력을 저장하려면 다음 명령을 사용합니다.
nmap -oN normal_output.txt localhost
이 명령에서 -oN 옵션은 Nmap 에게 출력을 일반 형식으로 저장하도록 지시하는 데 사용됩니다. normal_output.txt는 결과가 저장될 파일의 이름입니다. localhost는 스캔 대상이며, 로컬 머신 자체를 나타냅니다.
이제 출력을 XML 형식으로 저장해 보겠습니다. XML (eXtensible Markup Language) 은 데이터 저장 및 교환에 널리 사용되는 형식입니다. 스크립트로 쉽게 구문 분석하거나 추가 처리를 위해 다른 도구로 가져올 수 있는 구조화된 형식을 가지고 있습니다. 출력을 XML 형식으로 저장하려면 다음 명령을 사용합니다.
nmap -oX xml_output.xml localhost
여기서 -oX 옵션은 Nmap 에게 출력을 XML 형식으로 저장하도록 지시합니다. xml_output.xml은 XML 형식의 결과가 저장될 파일입니다.
마지막으로, 출력을 grepable 형식으로 저장해 보겠습니다. grepable 형식은 Unix 와 유사한 시스템에서 강력한 텍스트 검색 유틸리티인 grep과 같은 도구로 쉽게 구문 분석할 수 있도록 설계되었습니다. 이 형식은 스캔 결과에서 특정 정보를 빠르게 검색하려는 경우에 유용합니다. 출력을 grepable 형식으로 저장하려면 다음 명령을 사용합니다.
nmap -oG grepable_output.txt localhost
-oG 옵션은 출력을 grepable 형식으로 저장하는 데 사용되며, grepable_output.txt는 결과가 저장될 파일입니다.
결과를 다른 형식으로 저장한 후에는 이러한 파일의 내용을 보고 싶을 수 있습니다. cat 명령을 사용하여 텍스트 파일의 내용을 표시할 수 있습니다. 예를 들어, 일반 형식의 출력 파일을 보려면 다음 명령을 사용할 수 있습니다.
cat normal_output.txt
이렇게 하면 normal_output.txt 파일의 내용이 터미널에 인쇄되어 스캔 결과를 볼 수 있습니다.
요약
이 랩에서는 강력한 네트워크 스캔 및 보안 감사 도구인 Nmap 의 기본 사항을 배웠습니다. 먼저 Ubuntu Linux 시스템에 Nmap 을 설치하고 설치를 확인했습니다. 그런 다음, 테스트를 위한 간단한 서비스를 만드는 방법을 보여주면서 스캔 대상인 로컬 HTTP 서버를 설정했습니다.
또한 기본 포트 스캔에서 자세한 서비스 버전 감지에 이르기까지 다양한 스캔 기술을 탐구했습니다. 네트워크를 이해하고 잠재적인 취약점을 찾는 데 중요한 특정 포트, 범위 및 시스템의 모든 65535 개 포트를 스캔하는 방법을 배웠습니다. 마지막으로, 문서화 및 추가 분석에 필수적인 일반 텍스트, XML 및 grepable 형식으로 결과를 저장하는 것과 같은 Nmap 의 출력 옵션에 대해 배웠습니다.
이 랩은 Nmap 을 사용하여 실질적인 경험을 제공했으며, 보다 진보된 네트워크 스캔 및 보안 감사를 위한 기반을 마련했습니다. Nmap 을 책임감 있게, 그리고 적절한 권한을 가지고 사용하십시오.



