소개
모의 해킹이나 네트워크 보안 평가를 수행할 때, 스캔을 실행하는 것은 절반의 과정일 뿐입니다. 스캔 결과를 적절하게 문서화하고 저장하는 것은 보고서 작성, 진행 상황 추적, 그리고 다른 보안 도구로 데이터를 전달하는 데 매우 중요합니다.
출력 형식을 선택하는 것은 결과물을 어떻게 활용할지에 영향을 미칩니다. 사람이 읽기 쉬운 형식은 빠른 검토에 적합하며, 구조화된 형식은 자동화에 최적화되어 있습니다. 성숙한 워크플로우는 보통 두 가지 형식을 모두 보존합니다.
업계 표준 네트워크 매퍼인 Nmap 은 다양한 요구 사항을 충족하기 위해 여러 출력 형식을 제공합니다. 가장 일반적인 세 가지 형식은 Normal(사람이 읽을 수 있는 형식), Grepable(명령줄 파싱을 위해 설계된 형식), XML(다른 소프트웨어로 가져오기 위한 구조화된 데이터) 입니다.
이 실습에서는 이 세 가지 출력 형식을 생성하는 방법과 기본적인 Linux 명령줄 도구를 사용하여 결과를 파싱하고 유용한 정보를 추출하는 방법을 배웁니다.
Normal 형식으로 출력 (-oN)
이 단계에서는 Nmap 스캔 결과를 Normal 형식으로 저장하는 방법을 배웁니다. Normal 형식은 기본적으로 Nmap 스캔을 실행할 때 터미널 화면에 표시되는 내용을 그대로 복사한 것입니다. 가독성이 매우 뛰어나 결과를 빠르게 검토하거나 텍스트 문서로 동료와 공유하기에 적합합니다.
이 형식은 파이프라인이 아닌 사람을 위해 최적화되어 있습니다. 스캔 결과를 보고서 형태로 읽는 분석가가 즉각적인 대상일 때 가장 적합한 선택입니다.
스캔 결과를 Normal 형식으로 저장하려면 -oN 플래그 뒤에 생성할 파일 이름을 입력합니다. 로컬 머신 (127.0.0.1) 을 스캔하여 열린 포트를 찾고 결과를 저장해 보겠습니다.
터미널에서 다음 명령을 실행하여 스캔을 수행하고 normal_scan.txt로 저장합니다.
nmap -p 22,8080 -oN normal_scan.txt 127.0.0.1
스캔이 완료되면 cat 명령을 사용하여 파일 내용을 확인할 수 있습니다. 스캔 중에 화면에 출력되었던 내용과 정확히 동일한 결과가 표시됩니다.
cat normal_scan.txt
열린 포트와 해당 서비스가 표시된 다음과 유사한 출력을 볼 수 있습니다.
## Nmap 7.80 scan initiated Sat Mar 7 16:07:07 2026 as: nmap -p 22,8080 -oN normal_scan.txt 127.0.0.1
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000057s latency).
PORT STATE SERVICE
22/tcp open ssh
8080/tcp open http-proxy
## Nmap done at Sat Mar 7 16:07:07 2026 -- 1 IP address (1 host up) scanned in 0.02 seconds
Grepable 형식으로 출력 (-oG)
이 단계에서는 Grepable 출력 형식을 살펴봅니다. Normal 형식은 사람이 읽기에는 좋지만, 정보가 여러 줄에 걸쳐 있어 프로그래밍 방식으로 처리하기는 어렵습니다. Grepable 형식은 단일 호스트에 대한 모든 정보를 한 줄의 긴 텍스트로 배치하여 이 문제를 해결합니다.
데이터를 이처럼 평탄화하면 셸 기반의 파싱이 실용적으로 변합니다. 이는 직접 읽기 편한 형식이 아니라 다운스트림 도구를 위해 출력을 가공하는 전형적인 사례입니다.
이 형식은 grep, awk, cut과 같은 Linux 명령줄 도구와 함께 사용하도록 특별히 설계되었습니다. Grepable 출력을 생성하려면 -oG 플래그를 사용합니다.
다음 명령을 실행하여 동일한 스캔을 수행하되, 이번에는 결과를 grepable_scan.txt라는 이름의 Grepable 형식으로 저장합니다.
nmap -p 22,8080 -oG grepable_scan.txt 127.0.0.1
이제 새로 생성된 파일의 내용을 확인합니다.
cat grepable_scan.txt
출력은 Normal 형식과 상당히 다르게 보일 것입니다. 호스트 정보와 모든 열린 포트가 한 줄로 압축된 것을 확인하세요.
## Nmap 7.80 scan initiated Sat Mar 7 16:07:20 2026 as: nmap -p 22,8080 -oG grepable_scan.txt 127.0.0.1
Host: 127.0.0.1 (localhost) Status: Up
Host: 127.0.0.1 (localhost) Ports: 22/open/tcp//ssh///, 8080/open/tcp//http-proxy///
## Nmap done at Sat Mar 7 16:07:20 2026 -- 1 IP address (1 host up) scanned in 0.02 seconds
이 구조 덕분에 "open"과 같은 특정 키워드를 검색하고 해당 IP 주소를 추출하는 작업이 매우 쉬워지며, 이는 다음 단계에서 실습하게 됩니다.
XML 형식으로 출력 (-oX)
이 단계에서는 XML 출력을 생성하는 방법을 배웁니다. XML(eXtensible Markup Language) 은 다양한 소프트웨어 애플리케이션에서 널리 지원되는 매우 구조화된 형식입니다.
평가 규모가 커질수록 기계가 읽을 수 있는 구조화된 출력의 중요성이 커집니다. 스캔 결과를 다른 도구로 옮겨야 할 때, 임시적인 텍스트 파싱은 유지 관리가 어렵고 비용이 많이 듭니다.
모의 해킹 환경에서 XML 은 Nmap 스캔 결과를 Metasploit Framework, 취약점 스캐너, 또는 사용자 정의 보고 스크립트와 같은 다른 보안 도구로 가져와야 할 때 선호되는 형식입니다. XML 출력 파일을 만들려면 -oX 플래그를 사용합니다.
다음 명령을 실행하여 스캔을 수행하고 결과를 xml_scan.xml로 저장합니다.
nmap -p 22,8080 -oX xml_scan.xml 127.0.0.1
cat 명령을 사용하여 XML 파일의 내용을 검사할 수 있습니다.
cat xml_scan.xml
출력은 구조화된 XML 태그의 거대한 블록 형태입니다. 사람이 빠르게 읽기에는 적합하지 않지만, 기계가 파싱하기에는 완벽한 형식입니다.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE nmaprun>
<?xml-stylesheet href="file:///usr/bin/../share/nmap/nmap.xsl" type="text/xsl"?>
<!-- Nmap 7.80 scan initiated Sat Mar 7 16:07:30 2026 as: nmap -p 22,8080 -oX xml_scan.xml 127.0.0.1 -->
<nmaprun scanner="nmap" args="nmap -p 22,8080 -oX xml_scan.xml 127.0.0.1" start="1772870850" startstr="Sat Mar 7 16:07:30 2026" version="7.80" xmloutputversion="1.04">
...
<host starttime="1772870850" endtime="1772870850"><status state="up" reason="conn-refused" reason_ttl="0"/>
<address addr="127.0.0.1" addrtype="ipv4"/>
<hostnames>
<hostname name="localhost" type="PTR"/>
</hostnames>
<ports><port protocol="tcp" portid="22"><state state="open" reason="syn-ack" reason_ttl="0"/><service name="ssh" method="table" conf="3"/></port>
...
Awk 를 사용한 Grepable 출력 파싱
마지막 단계에서는 Grepable 출력 형식을 실무에 활용해 봅니다. 모의 해킹에서 흔히 발생하는 시나리오는 대규모 네트워크를 스캔하여 특정 포트가 열려 있는 호스트를 찾고, 해당 호스트의 IP 주소만 추출하여 다른 도구 (예: 비밀번호 크래커나 취약점 공격 도구) 에 입력하는 것입니다.
이를 위해 grep과 awk라는 강력한 Linux 텍스트 처리 도구를 사용합니다. grep 명령은 특정 단어가 포함된 줄을 필터링하고, awk는 해당 줄에서 특정 열을 추출할 수 있습니다.
먼저, Grepable 파일에서 "open"이라는 단어가 포함된 줄만 표시하도록 필터링하는 방법을 살펴보겠습니다.
grep "open" grepable_scan.txt
이 명령은 호스트와 열린 포트가 포함된 줄을 출력합니다.
Host: 127.0.0.1 (localhost) Ports: 22/open/tcp//ssh///, 8080/open/tcp//http-proxy///
이제 IP 주소만 추출해 보겠습니다. Grepable 형식에서 IP 주소는 항상 줄의 두 번째 "단어"(또는 열) 에 위치합니다. grep의 출력을 파이프 (|) 를 통해 awk로 전달하고 두 번째 열 ($2) 을 출력하도록 지정할 수 있습니다.
다음 명령을 실행하여 IP 주소를 추출하고 open_hosts.txt라는 새 파일에 저장합니다.
grep "open" grepable_scan.txt | awk '{print $2}' > open_hosts.txt
새 파일의 내용을 확인해 봅니다.
cat open_hosts.txt
IP 주소만 출력되는 것을 확인할 수 있습니다.
127.0.0.1
이 간단한 명령 조합을 익히면 방대한 스캔 파일을 빠르게 파싱하여 평가의 다음 단계에 필요한 대상만 정확하게 추출할 수 있습니다.
요약
이 실습에서는 다양한 출력 형식을 사용하여 Nmap 스캔 결과를 효과적으로 문서화하고 관리하는 방법을 배웠습니다. 사람이 읽기 위한 Normal 형식 (-oN), 명령줄 파싱을 위한 Grepable 형식 (-oG), 그리고 도구 통합을 위한 XML 형식 (-oX) 을 살펴보았습니다. 마지막으로 grep 및 awk와 같은 Linux 텍스트 처리 유틸리티를 사용하여 Grepable 출력 파일에서 특정 대상 정보를 추출하는 실습을 진행했습니다. 이러한 기술은 보안 평가 중에 데이터를 정리하고 워크플로우를 간소화하는 데 필수적입니다.



