소개
이 실습에서는 효율적인 네트워크 정찰을 위한 고성능 TCP 포트 스캐너인 Masscan 의 사용법을 배웁니다. 소스 코드로부터 Masscan 을 직접 빌드하여 설치하고, 스캔 파라미터를 설정하며, 사설 네트워크 대역을 대상으로 스캔을 실행한 뒤 그 결과를 분석하는 실무 경험을 쌓게 됩니다.
실습을 마칠 때쯤이면 스캔 대상을 정의하고, 고속 스캔을 실행하며, 출력된 결과를 해석하여 오픈 포트를 식별하고, 보고 및 추가 분석을 위해 결과를 일반적인 파일 형식으로 내보내는 데 능숙해질 것입니다.
소스 코드에서 Masscan 설치하기
첫 번째 단계에서는 Masscan 을 컴파일하고 설치합니다. Masscan 은 단 몇 분 만에 인터넷 전체를 스캔할 수 있을 정도로 놀라운 속도를 자랑하는 포트 스캐너입니다. 최신 버전을 사용하기 위해 소스 코드에서 직접 설치를 진행하겠습니다. 실습 환경에는 필요한 빌드 도구와 라이브러리가 이미 설치되어 있습니다.
먼저, 이번 실습의 작업 공간인 ~/project 디렉토리로 이동합니다.
cd ~/project
그 다음, git을 사용하여 공식 GitHub 저장소에서 Masscan 소스 코드를 다운로드합니다.
git clone https://github.com/robertdavidgraham/masscan --depth 1
이 명령은 소스 코드가 포함된 masscan이라는 새 디렉토리를 생성합니다. 해당 디렉토리로 들어갑니다.
cd masscan
이제 make 명령을 사용하여 소스 코드를 컴파일합니다. 이 명령은 디렉토리 내의 Makefile을 읽어 실행 가능한 바이너리 파일을 빌드합니다.
make
컴파일이 완료되면 bin 디렉토리 안에 masscan 실행 파일이 생성된 것을 확인할 수 있습니다. 버전을 확인하여 빌드가 잘 되었는지 검증합니다.
./bin/masscan --version
다음과 유사한 출력이 나타나야 합니다.
Masscan version 1.3.9-integration ( https://github.com/robertdavidgraham/masscan )
Compiled on: Aug 29 2025 11:15:09
Compiler: gcc 11.4.0
OS: Linux
CPU: x86 (64 bits)
GIT version: unknown
마지막으로, masscan 명령을 시스템 어디에서나 사용할 수 있도록 /usr/local/bin과 같은 표준 위치에 설치합니다. 제공된 Makefile에는 이 작업을 처리해주는 install 타겟이 포함되어 있습니다.
sudo make install
이 명령은 masscan 바이너리를 시스템의 PATH에 포함된 /usr/local/bin/으로 복사합니다. 이제 어느 디렉토리에서든 Masscan 을 실행할 수 있습니다.
설치 상태를 확인합니다.
masscan --version
버전 번호가 정상적으로 출력된다면 Masscan 이 올바르게 설치된 것입니다.
스캔 대상 범위 정의하기
스캔을 실행하기 전에 대상이 될 IP 주소를 정의해야 합니다. 이번 실습에서는 빠른 실행을 위해 사설 IP 주소 대역의 작은 부분 집합에 집중할 것입니다. 이러한 제한된 내부 대역을 스캔하는 것은 학습 목적으로 안전하고 효율적인 방법입니다.
대상 범위를 나열할 파일을 생성하겠습니다. 먼저 메인 프로젝트 디렉토리에 있는지 확인합니다.
cd ~/project
그 다음, nano 텍스트 편집기를 사용하여 targets.txt라는 파일을 만듭니다.
nano targets.txt
nano 편집기에서 시연을 위해 다음의 작은 IP 대역들을 각각 한 줄씩 입력합니다. 이 대역들은 IP 주소 블록을 간결하게 표현하는 방식인 CIDR(Classless Inter-Domain Routing) 표기법으로 작성되었습니다.
192.168.1.0/24
172.17.0.0/24
10.0.0.0/24
파일을 저장하려면 Ctrl+O를 누른 뒤 Enter를 눌러 파일 이름을 확인합니다. 편집기를 종료하려면 Ctrl+X를 누릅니다.
파일을 저장한 후 cat 명령으로 내용을 확인합니다.
cat targets.txt
방금 입력한 세 개의 CIDR 대역이 출력되어야 합니다.
192.168.1.0/24
172.17.0.0/24
10.0.0.0/24
이 파일은 다음 단계에서 Masscan 이 어떤 네트워크를 스캔할지 알려주는 입력 데이터 역할을 하게 됩니다. 각 대역은 256 개의 IP 주소만 포함하고 있어 스캔이 보통 1 분 이내로 매우 빠르게 완료될 것입니다.
고속 포트 스캔 실행하기
Masscan 설치와 대상 정의가 완료되었으므로 이제 포트 스캔을 수행할 준비가 되었습니다. 이번 단계에서는 정의한 IP 대역을 대상으로 주요 포트들에 대한 시연 스캔을 실행합니다.
targets.txt 파일이 있는 ~/project 디렉토리에 있는지 확인합니다.
cd ~/project
이제 다음 masscan 명령을 실행합니다. Masscan 은 패킷 전송을 위해 로우 소켓 (raw sockets) 을 사용하므로 높은 권한이 필요하여 sudo를 함께 사용해야 합니다.
sudo masscan -p22,80,443,8080 -iL targets.txt --rate 1000 -oG scan_results.gnmap
명령어 옵션의 의미는 다음과 같습니다.
-p22,80,443,8080: 스캔할 주요 포트 (SSH, HTTP, HTTPS 및 대체 HTTP 포트) 를 지정합니다. 이렇게 대상을 좁히면 스캔이 더 빨리 끝납니다.-iL targets.txt:targets.txt파일로부터 대상 IP 범위를 읽어오도록 지시합니다.--rate 1000: 패킷 전송 속도를 초당 1000 개로 설정합니다. 실습 환경에서 안전한 속도입니다.-oG scan_results.gnmap: 결과를 "grep"으로 검색하기 쉬운 형식으로scan_results.gnmap파일에 저장합니다. 이 형식은 명령줄 도구로 파싱하기 매우 편리합니다.
스캔이 진행되는 동안 Masscan 은 진행 상황을 화면에 표시합니다. 대상 범위가 작기 때문에 스캔은 1 분 이내에 완료될 것입니다.
Starting masscan 1.3.9-integration (http://bit.ly/14GZzcT) at 2025-08-29 03:20:16 GMT
Initiating SYN Stealth Scan
Scanning 768 hosts [4 ports/host]
스캔이 끝나면 디렉토리에 scan_results.gnmap 파일이 생성됩니다. cat 명령으로 내용을 확인해 보세요.
cat scan_results.gnmap
출력 결과에는 오픈 포트가 발견된 호스트들이 나열됩니다. 컨테이너 환경 내의 사설 대역을 스캔하고 있으므로 Docker 브리지 네트워크에서 일부 오픈 포트가 발견될 수 있습니다. 발견된 오픈 포트는 다음과 같은 형식으로 표시됩니다.
## Masscan 1.3.9-integration scan initiated Fri Aug 29 03:20:16 2025
## Ports scanned: TCP(4;22-22,80-80,443-443,8080-8080) UDP(0;) SCTP(0;) PROTOCOLS(0;)
Timestamp: 1756437619 Host: 172.17.0.1 () Ports: 22/open/tcp//ssh//
## Masscan done at Fri Aug 29 03:20:31 2025
스캔 결과에 따르면 4 개의 특정 포트 (22, 80, 443, 8080) 에 대해 768 개의 호스트를 스캔했으며, 약 15 초 만에 완료되었습니다. 이 예시에서 Masscan 은 172.17.0.1(Docker 브리지 게이트웨이) 에서 SSH(22 번 포트) 가 열려 있음을 찾아냈습니다. 이는 네트워크 대역에서 활성화된 서비스를 빠르게 찾아내는 Masscan 의 능력을 잘 보여줍니다.
출력 형식의 주요 포인트:
- 타임스탬프는 각 발견이 이루어진 시점을 나타냅니다.
Host: IP () Ports: 포트/상태/프로토콜//서비스//형식은 명확한 서비스 식별 정보를 제공합니다.- Masscan 은 컨테이너화된 환경에서 흔히 볼 수 있는 Docker 브리지의 SSH 서비스를 찾아냈습니다.
오픈 포트 검토하기
스캔을 마친 후 다음 단계는 결과를 분석하여 오픈 포트를 식별하는 것입니다. scan_results.gnmap 파일에 모든 정보가 담겨 있지만, 다른 도구들을 활용해 가장 중요한 데이터만 추출할 수 있습니다.
먼저 ~/project 디렉토리에 있는지 확인합니다.
cd ~/project
.gnmap 형식은 파싱하기 쉽게 설계되었습니다. 오픈 포트에 해당하는 모든 줄을 빠르게 찾으려면 grep 명령을 사용합니다.
grep "open" scan_results.gnmap
이 명령은 파일을 필터링하여 "open"이라는 단어가 포함된 줄만 표시합니다. 출력 결과는 각 호스트와 해당 오픈 포트를 나열하며 다음과 같이 나타납니다.
Timestamp: 1756437619 Host: 172.17.0.1 () Ports: 22/open/tcp//ssh//
스캔한 네트워크에서 어떤 포트가 가장 많이 열려 있는지 요약해서 보려면 명령 파이프라인을 구성할 수 있습니다. 다음 명령은 포트 번호만 추출하여 정렬한 뒤, 중복된 항목의 개수를 셉니다.
grep -oP '\d+/open' scan_results.gnmap | sort | uniq -c
이 강력한 한 줄 명령어를 분석해 보겠습니다.
grep -oP '\d+/open': Perl 호환 정규식 (-P) 을 사용하여 숫자 뒤에/open이 붙은 패턴을 찾아 해당 부분만 추출 (-o) 합니다.sort: 오픈 포트 목록을 알파벳 순으로 정렬하여 동일한 포트끼리 그룹화합니다.uniq -c: 인접한 동일한 줄을 하나로 합치고 각 줄이 몇 번 나타났는지 횟수 (-c) 를 앞에 붙입니다.
출력 예시는 다음과 같으며, 이는 한 개의 호스트에서 22 번 포트 (SSH) 가 열려 있음을 의미합니다.
1 22/open
이 기법은 네트워크에 노출된 서비스의 전반적인 현황을 파악하는 데 매우 유용합니다. 이 사례에서는 SSH 가 스캔에서 발견된 유일한 서비스임을 알 수 있는데, 이는 게이트웨이가 SSH 접속을 제공하는 Docker 브리지 네트워크의 전형적인 모습입니다.
스캔 결과 내보내기
보고서를 작성하거나 추가 작업을 수행할 때는 스캔 결과를 보다 구조화된 형식으로 내보내야 할 때가 많습니다. 이번 단계에서는 스캔 결과를 스프레드시트 프로그램에서 쉽게 불러올 수 있는 CSV(Comma-Separated Values) 파일로 변환해 보겠습니다.
~/project 디렉토리에 있는지 확인합니다.
cd ~/project
grep과 sed를 조합하여 .gnmap 파일을 파싱하고 깔끔한 CSV 파일을 만들 것입니다. sed는 정규식을 사용하여 데이터를 추출하고 형식을 재구성할 수 있는 강력한 스트림 편집기입니다.
다음 명령을 실행하여 scan_results.csv를 생성합니다.
grep "open" scan_results.gnmap | sed 's/.*Host: \([^ ]*\) .*Ports: \([0-9]*\)\/open\/\([^/]*\).*/\1,\2,\3/' > scan_results.csv
이 명령의 작동 원리는 다음과 같습니다.
grep "open" scan_results.gnmap: 먼저 오픈 포트가 있는 줄만 필터링합니다.sed 's/.*Host: \([^ ]*\) .*Ports: \([0-9]*\)\/open\/\([^/]*\).*/\1,\2,\3/': 정규식을 사용하여 Masscan 출력 형식에서 IP 주소, 포트 번호, 프로토콜을 추출하고 이를 쉼표로 구분된 CSV 형식으로 재구성합니다.> scan_results.csv: 최종 출력을scan_results.csv라는 새 파일로 저장합니다.
이제 새로 생성된 CSV 파일을 확인해 봅니다.
cat scan_results.csv
출력 결과는 호스트와 오픈 포트가 쉼표로 구분된 깔끔한 목록으로 나타납니다.
172.17.0.1,22,tcp
이러한 구조화된 형식은 팀원과 공유하거나, 데이터베이스에 입력하거나, 다른 보안 도구의 입력값으로 사용하기에 이상적입니다. CSV 형식은 IP 주소, 포트 번호, 프로토콜을 읽기 쉬운 형태로 보여줍니다.
요약
이 실습을 통해 고속 네트워크 스캐닝을 위한 Masscan 사용의 핵심을 성공적으로 학습했습니다. 소스 코드로부터 도구를 직접 설치하는 것부터 결과를 분석하고 내보내는 것까지 전체 워크플로우를 실습했습니다.
학습한 주요 내용은 다음과 같습니다.
- 리눅스 환경에서 소스 코드를 이용한 소프트웨어 컴파일 및 설치 방법.
- CIDR 표기법을 사용한 스캔 대상 정의.
- 포트, 속도, 출력 형식을 지정하여 포트 스캔 실행.
grep,sort,uniq와 같은 명령줄 도구를 활용한 스캔 결과 분석.- 보고를 위해 데이터를 구조화된 CSV 형식으로 내보내기.
이러한 기술은 빠르고 효율적이며 책임감 있는 방식으로 네트워크 정찰을 수행하기 위한 견고한 토대가 될 것입니다.



