Nmap Scripting Engine 활용

NmapBeginner
지금 연습하기

소개

이 랩에서는 Nmap Scripting Engine (NSE) 을 활용하는 방법을 배우게 됩니다. 이 랩은 기본 스크립트 실행, 특정 스크립트 사용, 스크립트에 인수 추가, 스크립트 업데이트, 여러 스크립트 테스트, 그리고 Xfce 터미널에서 스크립트 출력을 보는 것을 다룹니다. nmap -sC, nmap --script, nmap --script-updatedb와 같은 명령을 대상 IP 주소에 대해 실행하여 다양한 스캔을 수행하고 정보를 수집합니다.

nmap -sC 192.168.1.1 로 기본 스크립트 실행

이 단계에서는 Nmap 을 사용하여 대상에 대해 기본 스크립트 세트를 실행하는 방법을 살펴보겠습니다. Nmap 스크립트는 취약점 식별에서 대상 시스템에 대한 정보 수집에 이르기까지 광범위한 작업을 자동화할 수 있는 강력한 도구입니다. -sC 옵션은 Nmap 에게 "default" 스크립트 범주를 사용하도록 지시합니다. 이 범주에는 일반적인 스캔에 안전하고 유용한 것으로 간주되는 스크립트가 포함됩니다.

시작하기 전에 올바른 디렉토리에 있는지 확인해 보겠습니다.

cd ~/project

이제 -sC 옵션을 사용하여 대상 IP 주소 192.168.1.1에 대해 Nmap 을 실행해 보겠습니다. 이 IP 주소는 자리 표시자입니다. 실제 시나리오에서는 스캔하려는 대상의 실제 IP 주소로 대체합니다. 이 랩 환경에서는 192.168.1.1이 유효한 대상이라고 가정합니다.

sudo nmap -sC 192.168.1.1

이 명령은 포트 스캔 및 서비스 탐지를 포함한 표준 Nmap 스캔을 수행한 다음 열린 포트에 대해 기본 스크립트를 실행합니다. 출력에는 포트 스캔, 서비스 탐지 및 스크립트에서 수집한 정보의 결과가 표시됩니다.

출력은 다음과 유사하게 표시됩니다 (정확한 출력은 대상 시스템에 따라 다름).

Starting Nmap 7.80 ( https://nmap.org ) at ...
Nmap scan report for 192.168.1.1
Host is up (0.00028s latency).
Not shown: 999 filtered ports
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu)
| ssh-hostkey:
|   2048 ... (RSA)
| ssh-rsa ...
|_ssh-algorithm: ...
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Host script results:
|_clock-skew: mean: -1s, deviation: 0s, median: -1s
|_nbstat: NetBIOS name: ..., NetBIOS user: ..., NetBIOS MAC: ... (unknown)
| smb-os-discovery:
|   OS: Unix
|   ...
|_  System time: ...

Nmap done: 1 IP address (1 host up) scanned in ... seconds

이 예에서 출력은 포트 22 가 열려 있고 SSH 를 실행하고 있음을 보여줍니다. ssh-hostkey 스크립트는 SSH 호스트 키를 식별했으며, ssh-algorithm 스크립트는 지원되는 알고리즘을 식별했습니다. clock-skew 스크립트는 대상 시스템에서 약간의 시계 왜곡을 감지했습니다. nbstatsmb-os-discovery 스크립트는 각각 NetBIOS 및 SMB 서비스에 대한 정보를 수집했습니다.

이 단계에서는 특정 Nmap 스크립트를 사용하는 방법을 배우겠습니다. Nmap 에는 다양한 작업을 수행하는 데 사용할 수 있는 방대한 스크립트 라이브러리가 있습니다. 대상 호스트에서 실행 중인 서비스에서 배너를 검색하려고 시도하는 banner 스크립트를 사용합니다. 배너에는 종종 소프트웨어 버전 및 정찰에 유용할 수 있는 기타 세부 정보가 포함되어 있습니다.

먼저, ~/project 디렉토리에 있는지 확인합니다.

cd ~/project

이제 --script 옵션과 함께 nmap 명령을 사용하여 banner 스크립트를 지정하고 localhost IP 주소인 127.0.0.1을 대상으로 지정해 보겠습니다.

sudo nmap --script banner 127.0.0.1

이 명령은 Nmap 에게 127.0.0.1의 모든 열린 포트에 대해 banner 스크립트를 실행하도록 지시합니다. 출력에는 검색된 모든 배너를 포함한 스크립트의 결과가 표시됩니다.

출력은 다음과 유사하게 표시될 수 있습니다 (정확한 출력은 localhost 에서 실행 중인 서비스에 따라 다름).

Starting Nmap 7.80 ( https://nmap.org ) at ...
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000028s latency).
Other addresses for localhost (not scanned): ::1

PORT     STATE SERVICE
22/tcp   open  ssh
111/tcp  open  rpcbind
631/tcp  open  ipp
5900/tcp open  vnc
8000/tcp open  http
8080/tcp open  http

Host script results:
|_banner: SSH-2.0-OpenSSH_8.2p1 Ubuntu-4ubuntu0.5
|_banner: 111/tcp:  rpcbind version 2-4
|_banner: 631/tcp: CUPS v2.4.1
|_banner: 5900/tcp: RFB 003.008
|_banner: 8000/tcp: Werkzeug/2.0.1 Python/3.9.7
|_banner: 8080/tcp: Jetty(9.4.44.v20210927)

Nmap done: 1 IP address (1 host up) scanned in ... seconds

이 예에서 banner 스크립트는 SSH, rpcbind, CUPS, VNC 및 HTTP 서버를 포함하여 127.0.0.1에서 실행 중인 여러 서비스에서 배너를 성공적으로 검색했습니다. 배너는 사용 중인 소프트웨어 버전에 대한 정보를 제공합니다.

nmap --script http-title --script-args 로 인자 추가 (192.168.1.1)

이 단계에서는 Nmap 스크립트에 인수를 전달하는 방법을 배우겠습니다. 일부 스크립트는 인수를 사용자 정의해야 하거나 허용합니다. http-title 스크립트를 사용하고 http.useragent 인수를 수정합니다. http-title 스크립트는 HTTP 서버에서 제목을 검색합니다. http.useragent 인수는 스크립트가 HTTP 요청을 할 때 사용할 User-Agent 문자열을 지정합니다.

먼저, 작업 디렉토리로 이동해 보겠습니다.

cd ~/project

이제 --script 옵션을 사용하여 http-title 스크립트를 지정하고 --script-args 옵션을 사용하여 http.useragent 인수를 Test로 설정하여 Nmap 을 실행해 보겠습니다. 대상 IP 주소 192.168.1.1을 사용합니다. 실제 시나리오에서는 HTTP 서버를 실행하는 대상의 실제 IP 주소로 이 주소를 대체해야 합니다.

sudo nmap --script http-title --script-args http.useragent=Test 192.168.1.1

이 명령은 Nmap 에게 "Test"를 User-Agent 문자열로 사용하여 192.168.1.1의 열린 HTTP 포트에 대해 http-title 스크립트를 실행하도록 지시합니다.

출력은 다음과 유사하게 표시될 수 있습니다 (정확한 출력은 대상 시스템 및 해당 HTTP 서버 구성에 따라 다름).

Starting Nmap 7.80 ( https://nmap.org ) at ...
Nmap scan report for 192.168.1.1
Host is up (0.00028s latency).
Not shown: 999 filtered ports
PORT   STATE SERVICE VERSION
80/tcp open  http    nginx 1.18.0
|_http-title: Test

Nmap done: 1 IP address (1 host up) scanned in ... seconds

이 예에서 http-title 스크립트는 192.168.1.1의 80 번 포트에서 실행 중인 HTTP 서버에서 제목을 성공적으로 검색했습니다. http.useragent 인수는 HTTP 요청에서 User-Agent 문자열을 "Test"로 설정하는 데 사용되었습니다. 서버는 이 User-Agent 문자열을 로깅할 수 있으며, 이는 스캔을 식별하는 데 유용할 수 있습니다. 대상에 포트 80 이 열려 있지 않으면 다른 출력이 표시됩니다.

nmap --script-updatedb 로 스크립트 업데이트

이 단계에서는 Nmap 스크립트 데이터베이스를 업데이트합니다. Nmap 스크립팅 엔진 (NSE) 은 스크립트 데이터베이스에 의존합니다. 시간이 지남에 따라 새로운 스크립트가 추가되고 기존 스크립트가 업데이트됩니다. 최신 스크립트를 사용하려면 주기적으로 스크립트 데이터베이스를 업데이트해야 합니다.

먼저, ~/project 디렉토리에 있는지 확인합니다.

cd ~/project

이제 --script-updatedb 옵션과 함께 nmap 명령을 사용하여 스크립트 데이터베이스를 업데이트해 보겠습니다.

sudo nmap --script-updatedb

이 명령은 최신 스크립트 정보를 다운로드하고 데이터베이스를 업데이트합니다. 출력에는 업데이트 진행 상황이 표시됩니다.

출력은 다음과 유사하게 표시될 수 있습니다.

Starting Nmap 7.80 ( https://nmap.org ) at ...
NSE: Updating rule database.
NSE: Using nmap.org/svn/nse_svn to download the latest scripts.
Downloaded nmap-mac-prefixes.lua
Downloaded nselib/data/nmap-services.
Downloaded nselib/data/service-ports.
Downloaded scripts/script.db
NSE: Script database updated.
Nmap done: 0 IP addresses (0 hosts up) scanned in ... seconds

이 출력은 스크립트 데이터베이스가 성공적으로 업데이트되었음을 나타냅니다. 이제 사용할 수 있는 최신 Nmap 스크립트가 있습니다.

nmap --script banner,http-title 로 여러 스크립트 테스트 (127.0.0.1)

이 단계에서는 여러 Nmap 스크립트를 동시에 실행합니다. 이를 통해 단일 스캔에서 대상에 대한 더 많은 정보를 수집할 수 있습니다. 127.0.0.1 대상을 대상으로 bannerhttp-title 스크립트를 사용합니다.

먼저, 작업 디렉토리로 이동해 보겠습니다.

cd ~/project

이제 --script 옵션을 사용하여 Nmap 을 실행하고 쉼표로 구분된 bannerhttp-title 스크립트를 모두 지정합니다. 로컬 머신을 참조하는 대상 IP 주소 127.0.0.1을 사용합니다.

sudo nmap --script banner,http-title 127.0.0.1

이 명령은 Nmap 에게 127.0.0.1의 열린 포트에 대해 bannerhttp-title 스크립트를 모두 실행하도록 지시합니다. banner 스크립트는 서비스 배너를 검색하려고 시도하고, http-title 스크립트는 HTTP 서버에서 제목을 검색합니다.

출력은 다음과 유사하게 표시될 수 있습니다 (정확한 출력은 127.0.0.1에서 실행 중인 서비스에 따라 다름).

Starting Nmap 7.80 ( https://nmap.org ) at ...
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000018s latency).
Loopback interface ignored
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 8.9p1 Ubuntu 3ubuntu0.1 (Ubuntu)
| banner: SSH-2.0-OpenSSH_8.9p1 Ubuntu-3ubuntu0.1
|_ssh-hostkey:
80/tcp open  http    nginx 1.18.0
|_http-title: Welcome to nginx!

Nmap done: 1 IP address (1 host up) scanned in ... seconds

이 예에서 banner 스크립트는 22 번 포트에서 SSH 배너를 검색했고, http-title 스크립트는 80 번 포트에서 실행 중인 HTTP 서버에서 제목을 검색했습니다. 대상에 이러한 포트가 열려 있지 않으면 다른 출력이 표시됩니다.

Xfce 터미널에서 스크립트 출력 확인

이 단계에서는 Xfce 터미널 내에서 Nmap 스크립트의 출력을 보는 데 중점을 둡니다. Xfce 터미널은 LabEx VM 환경의 기본 터미널 에뮬레이터입니다. 이전 단계에서 이미 사용해 보셨습니다. 이 단계는 새로운 명령을 실행하는 것보다 출력을 해석하는 방법에 대한 이해에 더 중점을 둡니다.

Nmap 스크립트의 출력은 스캔이 완료된 후 터미널에 직접 표시됩니다. 출력 형식은 스크립트 자체에 따라 다릅니다. 일부 스크립트는 간단한 텍스트 출력을 제공하고, 다른 스크립트는 더 구조화된 데이터를 제공할 수 있습니다.

이전 단계의 명령을 다시 살펴보겠습니다.

sudo nmap --script banner,http-title 127.0.0.1

이 명령을 실행하면 출력이 Xfce 터미널에 직접 인쇄됩니다. 터미널 출력을 스크롤하여 bannerhttp-title 스크립트의 결과를 검토할 수 있습니다.

예를 들어, 출력에는 다음이 포함될 수 있습니다.

  • 배너 정보: banner 스크립트는 열린 포트에서 서비스 배너를 검색하려고 시도합니다. 이를 통해 특정 포트에서 실행 중인 소프트웨어 버전을 확인할 수 있습니다.
  • HTTP 제목: http-title 스크립트는 HTTP 서버에서 제공하는 웹 페이지의 제목을 검색합니다.

핵심은 유용한 정보가 있는지 출력을 주의 깊게 검토하는 것입니다. Xfce 터미널은 이 정보를 볼 수 있는 간단하고 직접적인 방법을 제공합니다. 필요한 경우 grep과 같은 표준 Linux 도구를 사용하여 출력을 필터링할 수도 있습니다. 예를 들어, "http-title"을 포함하는 줄만 찾으려면 nmap 명령의 출력을 grep 으로 파이프할 수 있습니다.

sudo nmap --script banner,http-title 127.0.0.1 | grep "http-title"

이 명령은 이전과 동일한 Nmap 스캔을 실행하지만 "http-title" 문자열을 포함하는 출력의 줄만 표시합니다. 이는 출력의 특정 부분에 집중하는 데 유용할 수 있습니다.

이 단계는 주로 관찰과 이해에 관한 것입니다. 실행할 단일 명령은 없지만, Xfce 터미널 환경 내에서 이전 단계에서 이미 생성한 결과를 해석하는 방법에 중점을 둡니다.

요약

이 랩에서는 참가자들이 다양한 명령을 통해 Nmap Scripting Engine 을 활용하는 방법을 배웠습니다. 먼저, 대상 IP 에 대해 nmap -sC를 사용하여 기본 스크립트를 실행했습니다. 여기에는 일반적인 스캔에 유용하고 안전한 스크립트가 포함됩니다. 또한 nmap --script를 사용하여 특정 스크립트를 사용하고, --script-args로 스크립트에 인수를 추가하고, --script-updatedb로 스크립트를 업데이트하고, 여러 스크립트를 한 번에 테스트하는 방법을 배웠습니다. 마지막으로, Xfce 터미널에서 스크립트 출력을 확인했습니다.