method of determining which ports on a network are open and could be receiving or sending data
최근 팀 단위로 "서비스 포트 스캐너 구현" 프로젝트를 진행했다. 포트 스캐닝은 이전에 공부도 해보고, 실습도 꽤 해봤던 주제인지라 나름 자신감에 찬 상태로 개발 세션으로 돌격했다.
하지만 언제나 그렇듯 조져지는 건 나였고...
수많은 "개발" 측면에서의 어려움과 별개로, 포트 스캐닝 기법을 직접 구현한 모듈을 테스트하고 상용 tool과 비교해보며 이 주제에 대해 더 깊게 알아보고 정리하는 시간이 필요하겠다는 결론을 얻었다.
자, 그럼 늘 그랬듯이 간략하게 정리한 후 본격적으로 시작해 보자.
포트 스캐닝은 네트워크 보안 점검과 취약점 탐지를 위해 시스템의 열린 포트를 식별하는 과정이다. 이는 TCP, UDP 등의 프로토콜을 기반으로 다양한 기법(TCP Connect, SYN, ACK, UDP, XMAS 등)을 활용하며, 각 포트 상태(Open, Closed, Filtered)를 분석하여 네트워크 서비스의 상태와 보안 수준을 평가한다. 주로 네트워크 관리 및 침투 테스트에서 사용되지만, 비윤리적 목적으로 악용될 가능성도 있어 법적, 윤리적 고려가 필요하다. 방화벽, IDS/IPS 등의 기술과 결합하는 경우에는 스캐닝 방어 및 탐지를 강화할 수도 있다.
포트 스캐닝은 네트워크에서 특정 호스트의 열린 포트와 해당 포트에서 실행 중인 서비스를 식별하기 위한 기술이다. 포트는 컴퓨터가 네트워크를 통해 데이터를 주고받는 논리적인 출입구로, 각 포트는 고유한 번호로 식별된다. 스캐닝을 통해 네트워크 관리자는 시스템의 취약점, 허용된 서비스, 보안 구성 상태를 확인할 수 있다.
이러한 작업은 보안 테스트와 네트워크 진단에서 필수적으로 사용되며, 네트워크 공격을 예방하기 위한 사전 조치로서도 활용된다. 반면, 악의적인 목적으로 사용될 경우 침입의 첫 단계가 될 수 있어 양면성을 가진 기술이다.
시기 | 특징 |
---|---|
1980년대 | 기본적인 네트워크 핑(ping) 기법으로 포트 상태 점검 시작 |
1990년대 초반 | TCP/IP 프로토콜의 확산과 함께 포트 스캐닝 기술 발전 |
1997년 (Nmap 출시) | 고급 스캐닝 도구 Nmap의 등장으로 다양한 스캐닝 기법이 표준화됨 |
2000년대 이후 | IDS/IPS와 방화벽의 발전으로 스캐닝 탐지 기술 강화 |
최근 | AI 기반 분석 및 IoT 환경에서 스캐닝 적용 증가 |
포트 스캐닝은 네트워크 기술의 발전과 함께 고도화되었으며, 초기에는 단순히 열려 있는 포트를 확인하는 도구였지만, 현재는 서비스 탐지와 OS 지문 분석까지 가능하다. 특히, Nmap과 같은 도구는 스캐닝의 표준이 되었으며, 이를 통해 다양한 프로토콜과 환경에서 동작하는 포트를 분석할 수 있다.
포트 스캐닝은 네트워크 보안과 관리를 위한 핵심 도구로, 시스템이 제공하는 서비스를 식별하고 잠재적인 취약점을 발견하는 데 도움을 준다. 이를 통해 관리자는 네트워크에서 불필요한 서비스를 비활성화하거나, 방화벽 규칙을 수정하여 공격 가능성을 줄일 수 있다.
또한, 침투 테스트 과정에서 포트 스캐닝은 네트워크 공격의 진입점을 발견하거나, 보안 강화가 필요한 부분을 확인하는 데 중요한 단계를 담당한다. 따라서, 포트 스캐닝은 보안 전문가뿐 아니라 네트워크 관리자, 개발자들에게도 필수적인 기술이다. 단, 기술의 남용은 법적 문제와 윤리적 논란을 초래할 수 있어 책임감 있는 활용이 요구된다.
즉, 이 기술의 중요성은 방어뿐만 아니라, 공격 차단의 첫 단계로서 작용한다는 점에 있다. 예를 들어, 보안 테스트에서는 포트 스캐닝을 통해 예상 취약점을 사전에 파악하여 대응하게 된다.
포트는 네트워크 통신의 논리적 출입구로, 데이터를 특정 애플리케이션이나 서비스로 전달하는 역할을 한다. 포트는 각 프로토콜(TCP, UDP)에 대해 고유 번호를 가지며, 클라이언트와 서버 간의 데이터 전송을 용이하게 한다. 예를 들어, HTTP는 TCP 80번 포트를, HTTPS는 TCP 443번 포트를 사용한다.
소켓은 포트와 IP 주소가 결합된 형태로, 네트워크에서 데이터 송수신을 처리하는 단위이다. 소켓은 클라이언트와 서버 간의 연결을 유지하며, 통신 과정에서 필요한 세부 정보를 관리한다.
Port: 네트워크 데이터 전송을 위한 논리적 엔드포인트. 각 서비스는 고유한 포트 번호 사용
Socket: 포트와 IP 주소가 결합된 네트워크 통신 단위. 클라이언트-서버 연결의 핵심!
네트워크 프로토콜은 데이터를 전송하기 위한 규칙과 형식을 정의한다. TCP와 UDP는 포트 스캐닝에서 가장 자주 언급되는 프로토콜로, TCP는 연결 지향적이고 신뢰성을 보장하며, UDP는 비연결 지향적이고 속도에 중점을 둔다. 포트 번호는 IANA(Internet Assigned Numbers Authority)에 의해 관리되며, 크게 세 가지 범주로 나뉜다.
범주 | 범위 | 예시 | 설명 |
---|---|---|---|
잘 알려진 포트 | 0~1023 | FTP(21), HTTP(80), HTTPS(443) | 시스템 서비스나 프로토콜에 할당 |
등록된 포트 | 1024~49151 | MySQL(3306), MS SQL(1433) | 애플리케이션 개발자 또는 서비스 제공자가 사용하는 포트 |
동적/사설 포트 | 49152~65535 | 클라이언트의 임시 세션 생성 | 클라이언트의 임시 연결에 사용 |
포트 상태는 스캐닝 결과에서 중요한 정보를 제공하며, 네트워크 트래픽이 포트를 통해 처리되는 방식을 나타낸다.
포트 상태는 네트워크 보안 점검이나 취약점 분석 시 중요한 단서를 제공한다.
포트 스캐닝은 OSI 7계층 중 전송 계층(Transport Layer)에 주로 초점이 맞춰져 있다. 전송 계층은 TCP와 UDP 프로토콜을 통해 데이터가 어디로 전달될지 결정하며, 이는 포트 번호와 밀접하게 연관된다.
OSI 계층 모델을 이해하면 포트 스캐닝이 네트워크에서 어떻게 작동하고, 각 계층이 스캐닝에 미치는 영향을 명확히 파악할 수 있다. 이는 네트워크의 구조적 이해와 스캐닝 결과 해석에 필수적인 지식을 제공한다.
TCP 기반 스캐닝은 전송 계층의 TCP 프로토콜을 활용하여 포트 상태를 식별하는 기법이다. TCP는 신뢰성을 보장하기 위해 3-Way Handshake라는 연결 설정 과정을 거치며, 이를 이용하여 포트가 열려 있는지 확인한다. TCP 스캐닝은 정확도가 높고 포트 상태를 세부적으로 파악할 수 있어 널리 사용된다.
TCP Connect 스캔은 완전한 3-Way Handshake를 수행하여 포트 상태를 확인하는 기법이다. 스캐너는 대상 포트에 SYN 패킷을 보내 연결을 요청하고, 대상이 SYN-ACK 패킷으로 응답하면 포트가 열려 있음을 확인할 수 있다. 이후 RST(연결 종료) 패킷을 보내 연결을 종료한다.
이 기법은 운영 체제의 표준 소켓 API를 사용하므로 별도의 권한 없이 실행할 수 있지만, 완전한 연결이 이루어지기 때문에 탐지가 쉽고, 네트워크 부하가 발생할 수 있다.
TCP SYN 스캔은 3-Way Handshake를 완료하지 않고 포트 상태를 확인하는 기법으로, "Half-Open 스캔"이라고도 불린다. 스캐너는 SYN 패킷을 보내고, 대상이 SYN-ACK 패킷으로 응답하면 포트가 열려 있음을 판단한 뒤, 즉시 RST 패킷을 보내 연결을 종료한다.
이 방식은 TCP Connect 스캔에 비해 네트워크 부하가 적고 탐지가 어려운 장점이 있다. 그러나 운영 체제의 RAW 소켓 권한이 필요해 일반 사용자 계정에서는 실행이 제한될 수 있다.
TCP ACK 스캔은 방화벽 규칙을 탐지하거나, 패킷 필터링 여부를 확인하는 데 사용된다. 스캐너는 ACK 패킷을 대상 포트에 전송하며, 응답으로 RST 패킷이 도착하면 해당 포트가 필터링되지 않았음을 의미한다. 응답이 없거나 ICMP "Destination Unreachable" 메시지가 반환되면 포트가 필터링된 것으로 간주한다.
이 기법은 포트가 열려 있는지 여부를 확인하는 데 적합하지 않지만, 방화벽의 설정 상태를 파악하는 데 유용하다.
UDP 스캐닝은 비연결 지향적인 UDP 프로토콜을 기반으로 수행된다. TCP와 달리 3-Way Handshake와 같은 연결 과정이 없기 때문에, UDP 스캐닝은 작동 방식과 한계가 다르다.
UDP는 데이터 전송 속도가 빠르고 간단하지만, 오류 검출이나 전송 보장을 제공하지 않는다. 이 특성 때문에 UDP 스캐닝은 TCP 스캐닝보다 응답 분석이 어렵다. 예를 들어, 대상 포트가 열려 있어도 UDP 패킷에 대한 응답이 없을 수 있다. 반대로, 닫힌 포트는 ICMP "Destination Unreachable" 메시지로 응답하기 때문에, 이를 통해 상태를 추론할 수 있다.
또한, UDP 스캐닝은 트래픽이 증가하면 네트워크 부하를 초래할 수 있으며, 방화벽 설정에 의해 쉽게 차단될 수 있다.
UDP 스캐너는 각 포트에 임의의 UDP 패킷을 전송하고, 응답 메시지를 분석하여 상태를 판단한다.
비정상 플래그 기반 스캐닝은 TCP 플래그 조합을 비정상적으로 설정하여 포트 상태를 탐지하는 기법이다. 이 방식은 일반적인 트래픽 패턴과 달라 탐지하기 어렵고, 스텔스 스캔으로 자주 사용된다.
XMAS 스캔은 TCP 플래그(URG, PSH, FIN)를 모두 활성화한 상태로 패킷을 전송한다. 대상이 RST 패킷으로 응답하면 포트가 닫혀 있음을 의미하며, 응답이 없으면 포트가 열려 있거나 필터링된 상태로 간주된다.
이 기법은 특정 운영 체제에서만 작동하며, 방화벽이나 침입 탐지 시스템에 의해 쉽게 차단될 수 있다.
NULL 스캔은 TCP 플래그를 모두 비활성화한 상태로 패킷을 전송한다. 대상이 RST 패킷으로 응답하면 포트가 닫혀 있음을 알 수 있다. XMAS 스캔과 마찬가지로, 응답이 없으면 포트가 열려 있거나 필터링된 상태이다.
NULL 스캔은 탐지가 어려운 장점이 있지만, 최신 보안 시스템에서는 무효 패킷으로 간주되어 차단될 가능성이 크다.
FIN 스캔은 FIN 플래그만 활성화된 패킷을 전송하여 포트 상태를 확인한다. 닫힌 포트는 RST 패킷으로 응답하며, 열린 포트는 응답하지 않는다.
이 기법은 비정상 트래픽으로 간주되어 방화벽에서 차단될 가능성이 있다.
하이브리드 스캐닝은 여러 스캐닝 기법을 조합하여 수행하는 방식으로, 개별 기법의 단점을 보완하고 정확성을 높인다.
COMBO 스캔은 TCP와 UDP 스캔을 동시에 수행하거나, SYN, NULL, FIN 스캔을 결합하여 포트 상태를 분석한다. 이를 통해 방화벽 설정이나 네트워크 환경에 따라 감지되지 않는 포트를 탐지할 수 있다. 이 기법은 복잡한 네트워크에서 포괄적인 분석을 제공한다.
고급 스캐닝 기법은 타이밍을 조절하여 탐지를 회피하거나, 분산 스캐닝을 통해 다중 IP를 활용하는 방식으로 이루어진다. 예를 들어, 스텔스 스캔은 특정 시간 간격으로 패킷을 전송하여 탐지를 어렵게 만든다. 이와 같은 기술은 고급 침투 테스트나 연구 목적으로 사용된다.
TCP 3-Way Handshake는 연결 지향 프로토콜인 TCP에서 클라이언트와 서버 간의 연결을 설정하는 과정이다. 이 과정은 스캐닝 기법의 기반이 되며, SYN 스캔과 TCP Connect 스캔에서 특히 중요하다.
SYN 스캔은 이 과정을 부분적으로만 수행하여 네트워크 부하를 줄이고, TCP Connect 스캔은 이를 완전히 수행하여 포트 상태를 확인한다.
TCP 플래그는 각 패킷의 성격을 나타내며, 포트 스캐닝 결과를 해석하는 데 중요한 역할을 한다.
스캐닝 결과에서 각 플래그의 조합은 포트 상태를 명확히 구분할 수 있는 단서를 제공한다. 패킷 분석이 필요해진 경우, 와이어샤크랑 2시간 정도 놀다 보면 알게 되는 내용이긴 하다.
ICMP(Internet Control Message Protocol)는 TCP/UDP 스캐닝에서 부수적으로 발생하는 메시지를 통해 포트 상태를 확인하는 데 사용된다. 예를 들어, ICMP "Destination Unreachable" 메시지는 닫힌 포트를 나타내며, 네트워크 필터링 여부를 진단하는 데도 활용된다.
스캐닝 결과는 패킷 응답 형태를 기반으로 해석된다.
응답 패턴을 분석하여 포트 상태를 정확히 파악할 수 있다.
포트 스캐너를 구현할 때 사용하는 프로그래밍 언어는 성능, 개발 용이성, 지원 라이브러리 등 다양한 요소를 고려하여 선택해야 한다. Python은 간결한 코드와 강력한 네트워크 라이브러리(socket, scapy 등)를 통해 빠르게 개발할 수 있는 장점이 있다. 반면, C는 저수준 네트워크 접근과 높은 성능을 제공하지만 코드 작성이 복잡하다. Go는 멀티스레딩과 네트워크 처리에 최적화된 현대적 언어로, 간결한 코드와 성능을 모두 제공한다. 물론... 언어 선택은 프로젝트의 목표와 개발자의 숙련도에 따라 결정된다.
최근 수행한 프로젝트에서는 초기에 C를 이용하여 작업에 들어갔으나 최적화 및 모듈 수정 작업이 들어갈 때쯤 시간 상의 문제가 예상되어 파이썬으로 급선회했다... 다만 이번 기회에 조사해 보며 Go 언어에 조금 매력을 느끼게 되었다. 다음에 기회가 있다면 한번 찍어먹어보자!
소다맛 비버...?
소켓(Socket)은 네트워크 프로그래밍에서 데이터 송수신의 기본 단위로, 포트 스캐너 구현에 필수적이다. 대부분의 언어는 소켓 라이브러리를 제공하며, 이를 통해 TCP/UDP 연결을 생성하고 데이터 패킷을 주고받을 수 있다. 예를 들어, Python에서는 socket
모듈을 사용하여 포트를 열고 응답을 분석할 수 있다. 소켓 프로그래밍은 IP 주소와 포트를 설정하여 네트워크의 특정 서비스와 상호작용하며, 포트 상태를 탐지하는 데 사용된다.
아래는 socket
라이브러리를 사용하는 코드 예시.
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(1) # 연결 시간 제한 설정
result = s.connect_ex(('127.0.0.1', 80)) # 포트 연결 테스트
if result == 0:
print("포트 열림")
else:
print("포트 닫힘")
s.close()
포트 스캐닝은 특정 포트로 패킷을 전송하고 응답을 분석하는 과정이다. 패킷 생성은 프로토콜(TCP, UDP 등)에 따라 구조가 다르며, TCP 스캔에서는 SYN 패킷, UDP 스캔에서는 임의의 데이터 패킷을 생성한다. Python의 scapy
라이브러리나 C의 raw sockets
를 사용하면 맞춤형 패킷을 생성할 수 있다.
아래는 Scapy를 사용해 SYN 패킷을 생성하는 코드.
from scapy.all import *
syn_packet = IP(dst="127.0.0.1") / TCP(dport=80, flags="S")
send(syn_packet)
패킷 전송은 스캐닝 기법에 따라 다양하게 구현되며, 전송 후에는 응답을 캡처하고 분석하여 포트 상태를 확인한다. 그리고 이럴 때 잘 쓰이는 것이 바로 그 와이어샤크! 학부생 3학년에 들어서야 처음 써봤다는 게 아쉬울 정도로 정말 신기하고, 유능한 tool이다...
포트 스캐닝은 다수의 포트를 탐색해야 하므로 성능이 중요한 요소이다. 멀티스레딩은 여러 스레드를 병렬로 실행하여 스캐닝 속도를 크게 향상시킨다. Python에서는 threading
모듈을, Go에서는 goroutines
를 활용하여 효율적인 멀티스레딩을 구현할 수 있다. 비동기 처리(async/await)는 대규모 네트워크에서 스캐닝을 수행할 때 효율적이며, 특히 I/O 바운드 작업에서 대기 시간을 줄이는 데 유용하다. 이를 통해 스캐너는 고성능과 효율성을 동시에 확보할 수 있다.
아래는 asyncio
를 사용한 비동기 스캐닝 코드!
import asyncio
async def scan_port(ip, port):
try:
reader, writer = await asyncio.open_connection(ip, port)
print(f"포트 {port} 열림")
writer.close()
except:
print(f"포트 {port} 닫힘")
asyncio.run(scan_port('127.0.0.1', 80))
스캐닝 결과를 수집하고 분석 가능한 형태로 제공하는 것은 스캐너의 완성도를 높이는 중요한 요소이다. 결과는 단순한 텍스트 형식으로 저장될 수도 있고, 데이터베이스에 저장하여 추후 분석에 활용할 수도 있다. 결과 시각화는 데이터의 패턴을 직관적으로 이해하는 데 도움을 주며, Python의 matplotlib
나 seaborn
과 같은 라이브러리를 통해 그래프나 차트로 구현할 수 있다. 대규모 스캐닝에서는 대시보드 형태로 데이터를 표현하면 실시간 모니터링이 가능하다.
아래는 포트 상태별 결과를 원형 그래프로 시각화하는 코드.
import matplotlib.pyplot as plt
data = [50, 30, 20] # Open, Closed, Filtered 포트 수
labels = ['Open', 'Closed', 'Filtered']
plt.pie(data, labels=labels, autopct='%1.1f%%')
plt.title("포트 스캐닝 결과")
plt.show()
포트 스캐닝은 취약점 스캐닝 도구와 연계하여 네트워크의 보안을 점검하는 데 사용된다. 열린 포트를 통해 실행 중인 서비스를 탐지하고, 서비스에 내재된 취약점을 탐색함으로써 위협을 사전에 차단할 수 있다. 예를 들어, Nmap은 NSE(Nmap Scripting Engine)를 통해 특정 서비스의 취약점을 스캔하고, 공격에 노출된 포트를 식별하는 기능을 제공한다. 이를 통해 네트워크 관리자는 취약한 서비스를 업데이트하거나 비활성화할 수 있다.
포트 스캐닝은 네트워크에서 비정상적인 상태를 모니터링하는 데 유용하다. 예를 들어, 외부 침입자가 포트 스캐닝을 시도하면, 관리자는 이를 탐지하여 방화벽 규칙을 강화하거나 침입 시도를 차단할 수 있다. 네트워크 관리자는 스캐닝 데이터를 활용해 트래픽 패턴을 분석하고, 네트워크 리소스를 최적화하는 데 활용할 수 있다. 실시간 모니터링은 기업 네트워크의 가용성과 보안을 유지하는 데 핵심적인 역할을 한다.
포트 스캐닝은 네트워크 관리자가 문제를 진단하고 해결하는 데 필수적인 도구이다. 예를 들어, 특정 서비스가 응답하지 않을 경우, 스캐닝을 통해 해당 포트가 열려 있는지 확인할 수 있다. 네트워크 구성 변경 후, 서비스가 정상적으로 작동하는지 검증하는 데도 사용된다. 이는 특히 복잡한 네트워크 환경에서의 효율적인 문제 해결과 관리 작업에 큰 도움을 준다고 한다.
포트 스캐닝은 네트워크 보안 점검을 위한 유용한 도구이지만, 그 사용은 법적 및 윤리적 한계를 가진다. 예를 들어, 허가 없이 타인의 네트워크를 스캐닝하는 행위는 많은 국가에서 불법으로 간주된다. 한국에서는 정보통신망법에 따라, 무단 스캐닝은 "침입의 시도"로 해석될 수 있으며, 이에 따른 법적 처벌을 받을 수 있다.
윤리적 해커(Ethical Hacker)는 반드시 사전 동의를 얻어야 하며, 이를 기반으로 합법적이고 투명하게 작업해야 한다. 예를 들어, 회사 내부에서 네트워크 보안 평가를 위한 스캐닝은 IT 관리자의 승인을 받아야 한다. 또한, 정당한 목적으로도 스캐닝 결과가 외부에 유출되지 않도록 보안 정책을 철저히 준수해야 한다.
포트 스캐닝은 방화벽과 침입 탐지/방지 시스템(IDS/IPS)에 의해 쉽게 탐지될 수 있다.
다음은 Snort 규칙의 간단한 예시로, SYN 스캐닝을 탐지하는 방법! 10초 내에 동일한 소스에서 20개 이상의 SYN 요청이 발생할 경우 경고를 생성하는 규칙이다.
alert tcp any any -> any any (flags:S; msg:"Possible SYN scan detected"; threshold: type both, track by_src, count 20, seconds 10;)
포트 스캐닝 방어는 네트워크의 보안을 강화하기 위해 중요하다.
허니팟은 의도적으로 설정된 가짜 포트를 사용해 공격자의 스캐닝 시도를 탐지하고 분석하는 강력한 도구(/기술/시스템)이다.
허니팟은 방어뿐만 아니라 공격자의 행동 패턴을 분석하는 데도 유용하다. 예를 들어, 특정 IP가 여러 번 22번 포트(SSH)를 탐지하려고 시도한다면, 해당 IP를 블랙리스트에 추가하거나 공격자가 사용한 스캐닝 기법을 연구할 수 있다.
Nmap은 가장 널리 사용되는 포트 스캐닝 도구로, TCP SYN 스캔, UDP 스캔 등 다양한 스캐닝 기법을 지원한다.
nmap -sS -p 1-1000 192.168.1.1
위 명령은 192.168.1.1 호스트에서 TCP SYN 스캔을 통해 1~1000번 포트를 탐색한다.
nmap --script vuln 192.168.1.1
이 명령은 대상 시스템에서 알려진 취약점을 스캔한다.
Masscan은 대규모 네트워크를 빠르게 스캔하기 위한 도구로, 초당 수백만 개의 패킷을 처리할 수 있다.
장점: 높은 스캐닝 속도와 간단한 사용법.
단점: 세부적인 서비스 정보 제공에는 한계가 있다.
Masscan의 예시 사용법
masscan -p80,443 192.168.0.0/16 --rate=100000
위 명령은 192.168.0.0/16 네트워크의 80번과 443번 포트를 초당 100,000 패킷의 속도로 스캔!
Zmap은 IP 범위를 대상으로 단일 패킷 기반의 빠른 스캐닝을 수행한다.
특징: Masscan과 유사하게 대규모 네트워크를 대상으로 효율적인 스캔이 가능하다.
활용 사례: 인터넷 규모의 네트워크 분석, 학술 연구, 국가 보안 프로젝트 등에 사용된다.
Zmap의 기본 사용법
zmap -p 443 0.0.0.0/0 -o results.csv
이 명령은 전 세계 IP 주소에서 HTTPS(443번 포트)를 스캔하고 결과를 CSV로 저장한다!
도구 | 특징 | 활용 사례 |
---|---|---|
Nmap | 다양한 스캔 기법과 NSE 스크립트 지원 | 일반적인 보안 테스트 및 취약점 분석 |
Masscan | 초고속 스캐닝 도구, 대량 IP 스캔에 최적화 | 대규모 네트워크의 상태 점검 |
Zmap | 단일 패킷 기반의 효율적 스캔 | 인터넷 규모의 연구 및 분석 |
Unicornscan | 고급 트래픽 생성 및 세부 스캔 기능 제공 | 네트워크 포렌식 분석 |
Nessus | 상용 취약점 스캐너, 세부적인 취약점 분석 가능 | 기업 환경의 정기적 취약점 평가 |
Acunetix | 웹 애플리케이션 보안 테스트 및 포트 스캐닝 기능 포함 | 웹 서버 및 관련 인프라의 포트 상태 점검 |
OS 지문 분석은 포트 스캐닝 도중 대상 시스템의 운영 체제를 식별하기 위한 기술이다. TCP/IP 스택은 각 운영 체제마다 미세한 차이를 가지며, 이를 기반으로 시스템 정보를 유추할 수 있다. Nmap의 -O
옵션은 OS 지문 분석을 수행하며, TCP/IP 응답 패턴(예: TTL, 윈도우 크기, 플래그 조합)을 활용해 운영 체제를 식별한다.
nmap -O 192.168.1.1
이 명령은 대상 호스트의 포트를 스캔하면서 운영 체제를 추론한다. OS 지문 분석은 네트워크 관리자가 시스템의 구성을 확인하거나, 침투 테스트 중 공격 가능한 플랫폼을 식별하는 데 유용하다.
서비스 탐지는 열려 있는 포트에서 실행 중인 애플리케이션이나 프로토콜을 식별하는 과정이다. 단순히 포트 상태를 확인하는 것을 넘어, 서비스의 버전 정보를 추출하여 취약점을 탐지할 수 있다. Nmap의 -sV
옵션은 서비스 탐지를 수행하며, 이를 통해 실행 중인 웹 서버(예: Apache 2.4.41) 또는 데이터베이스(예: MySQL 8.0)를 식별할 수 있다.
nmap -sV -p 80,443 192.168.1.1
이 명령은 대상 호스트의 80번과 443번 포트에서 실행 중인 서비스를 탐지한다. 서비스 탐지는 보안 점검뿐만 아니라 네트워크 관리에서 중요한 정보를 제공한다.
타이밍 기반 스캐닝은 탐지를 회피하거나 네트워크를 과도하게 부하시키지 않기 위해 전송 속도와 간격을 조절하는 기법이다.
Nmap은 타이밍 옵션(-T0
부터 -T5
까지)을 제공하며, 이를 통해 스캐닝 속도와 은폐성을 조정할 수 있다.
nmap -sS -T0 192.168.1.1
위 명령은 매우 느린 속도로 SYN 스캔을 수행하여 탐지를 어렵게 만든다!
분산 포트 스캐닝은 여러 대의 장치를 사용해 대규모 네트워크를 스캔하는 기법이다. 이는 하나의 시스템에서 다수의 요청을 보낼 때 발생할 수 있는 차단을 피하고, 스캔 흔적을 분산시키는 데 유리하다. 하지만, 분산 스캐닝은 잘못 사용될 경우 DDoS(Distributed Denial of Service) 공격으로 오해받을 수 있다.
실제 사용 사례: 보안 연구 기관은 인터넷 규모의 네트워크를 분석할 때 분산 스캐닝을 활용하며, 이를 통해 취약한 디바이스를 식별한다. 다만 분산 스캐닝은 적절한 승인을 받은 후에만 수행되어야 하며, 법적 문제를 유발하지 않도록 주의해야 한다.
HTTPS와 같은 암호화된 트래픽은 포트 스캐닝의 정확성을 제한한다. 포트가 열려 있어도 데이터 내용이 암호화되어 있어, 실행 중인 서비스의 상세 정보를 파악하기 어렵다. TLS(Transport Layer Security)와 같은 암호화 프로토콜은 스캐닝 도구가 트래픽을 해독할 수 없게 한다. 이에 대한 대안으로 SNI(Server Name Indication) 분석이 있지만, 제한적이다.
5G와 SDN(Software-Defined Networking)의 등장으로 네트워크 구조는 더욱 복잡해졌다. 이러한 환경에서는 포트 스캐닝이 네트워크 트래픽의 동적 경로와 가상화된 서비스로 인해 어려움을 겪는다.
예를 들어, SDN은 전통적인 네트워크 장치가 아닌 소프트웨어 컨트롤러를 통해 트래픽을 관리하므로, 스캐닝 기법이 새로운 대응 방식을 요구한다. 그 대응 방식 중 하나가 바로 SDN API를 활용한 프로토콜 분석과 동적 네트워크 경로 추적 기술이다.
인공지능(AI)과 머신러닝(ML)은 포트 스캐닝의 효율성과 정밀도를 향상시키고 있다. ML 알고리즘은 네트워크 트래픽 패턴을 학습하여 비정상적인 트래픽을 감지하거나, 최적의 스캐닝 전략을 제안한다. 예를 들어, 비정상적으로 닫힌 포트가 반복적으로 탐지된다면, 이는 잠재적 공격 또는 구성 오류를 나타낼 수 있다.
실제로 Google Cloud는 ML 기반 네트워크 모니터링 도구를 사용하여 실시간으로 포트 상태를 분석하고 보안을 강화한다고 한다.
IoT 디바이스와 5G 네트워크의 급증은 포트 스캐닝의 새로운 과제를 제시한다. IoT 디바이스는 자주 기본 비밀번호와 알려진 취약점을 포함하고 있어, 공격의 주요 대상이 된다. 또한, 5G는 저지연과 대역폭 증가로 네트워크가 더욱 복잡해져 스캐닝 기법이 더욱 정교해야 한다.
조사해본 바에 따르면, IoT 환경에서는 네트워크 분리와 허니팟을 활용한 위협 탐지가 중요하며, 5G 환경에서는 프로토콜 분석과 AI 기반 보안 기술이 필요하다는 듯 하다. 구체적으로 어떻게 적용시킬지는... 조금 더 조사가 필요하다.
포트 스캐닝은 많은 국가에서 법적으로 제한된다. 예를 들어, 미국의 컴퓨터 사기 및 남용법(CFAA)은 무단 포트 스캐닝을 불법 행위로 간주하며, 한국에서는 정보통신망법으로 규제한다. 국제적으로도 유럽연합의 GDPR은 데이터 보호를 위한 스캐닝의 적법성을 제한한다.
그러니 스캐닝 전에 반드시 대상 네트워크 소유자의 승인을 받아야 하며, 로깅 및 데이터 보호 정책을 준수해야 한다. 착한 보안 꿈나무들은 아무데나 스캔을 뿌리고 다니지 말자!
윤리적 해커는 네트워크 취약점을 탐지하면서도, 스캐닝 도구가 대상 시스템에 부정적인 영향을 주지 않도록 책임감 있게 사용해야 한다. 예를 들어, 취약점 분석 후 고객에게 명확한 보고서를 제공하며, 결과 데이터를 외부에 유출하지 않아야 한다. 윤리적 해커는 가이드라인(예: EC-Council의 CEH 코드)을 준수해야 한다.
"인간의 최대의 의무는 성실하고 진지하게 진리를 탐구하는 데에 있다." -헤밍웨이, E.M
스캐닝은 네트워크 상태를 점검하기 위한 정당한 도구지만, 무단으로 사용될 경우 침투 테스트와 사이버 공격의 경계를 모호하게 만든다. 침투 테스트는 반드시 공식적인 계약에 따라 수행되어야 하며, 불필요한 서비스 중단을 방지해야 한다.
조금 더 구체적으로 들어가 보자면, 침투 테스트 계약서에는 스캐닝 범위, 도구, 시간, 그리고 결과 보고 방식이 명확히 포함되어야 한다. 조금 사견을 섞어 보자면... "허튼 짓"이 되지 않도록 상호 간에 철저하게 경계선을 그어 두고 들어가야 한다는 뜻으로 들린다.
Port Number | Service | Protocol | Description |
---|---|---|---|
20 | FTP Data Transfer | TCP | 파일 전송 프로토콜의 데이터 전송에 사용 |
21 | FTP Command Control | TCP | 파일 전송 프로토콜의 명령 제어 채널 |
22 | SSH | TCP | 원격 로그인 및 명령 실행을 위한 보안 프로토콜 |
23 | Telnet | TCP | 원격 로그인 프로토콜(암호화되지 않음) |
25 | SMTP | TCP | 이메일 전송 프로토콜(Simple Mail Transfer Protocol) |
53 | DNS | UDP/TCP | 도메인 이름 시스템으로 IP 주소와 도메인 이름 간 변환 |
67 | DHCP Server | UDP | 동적 호스트 구성 프로토콜 서버의 통신 포트 |
68 | DHCP Client | UDP | 동적 호스트 구성 프로토콜 클라이언트의 통신 포트 |
69 | TFTP | UDP | 간단한 파일 전송 프로토콜(Trivial File Transfer Protocol) |
80 | HTTP | TCP | 월드 와이드 웹의 하이퍼텍스트 전송 프로토콜 |
110 | POP3 | TCP | 이메일 수신 프로토콜(Post Office Protocol 3) |
123 | NTP | UDP | 네트워크 시간 동기화를 위한 프로토콜(Network Time Protocol) |
137 | NetBIOS Name Service | UDP/TCP | NetBIOS 이름 확인 서비스 |
138 | NetBIOS Datagram Service | UDP | NetBIOS 데이터그램 전송 서비스 |
139 | NetBIOS Session Service | TCP | NetBIOS 세션 서비스로 파일 및 프린터 공유 가능 |
143 | IMAP | TCP | 이메일 읽기 및 관리를 위한 인터넷 메시지 접근 프로토콜(Internet Message Access Protocol) |
161 | SNMP | UDP | 네트워크 관리 프로토콜(Simple Network Management Protocol) |
162 | SNMP Trap | UDP | SNMP 알림 전송용 |
179 | BGP | TCP | 네트워크 간 경로를 교환하기 위한 프로토콜(Border Gateway Protocol) |
194 | IRC | TCP | 인터넷 릴레이 채팅(Internet Relay Chat) |
443 | HTTPS | TCP | 보안 하이퍼텍스트 전송 프로토콜(Secure HTTP) |
465 | SMTPS | TCP | 보안 SMTP(Simple Mail Transfer Protocol Secure) |
514 | Syslog | UDP | 시스템 로그 전송 프로토콜 |
587 | SMTP with STARTTLS | TCP | STARTTLS를 사용하는 이메일 전송 |
631 | IPP | TCP/UDP | 인터넷 프린터 프로토콜(Internet Printing Protocol) |
993 | IMAPS | TCP | 보안 IMAP(Internet Message Access Protocol Secure) |
995 | POP3S | TCP | 보안 POP3(Post Office Protocol Secure) |
1433 | Microsoft SQL Server | TCP | 마이크로소프트 SQL 서버 데이터베이스 접근 포트 |
1434 | Microsoft SQL Monitor | UDP | SQL Server 탐지 및 관리 프로토콜 |
1521 | Oracle Database | TCP | 오라클 데이터베이스 서비스 |
2049 | NFS | TCP/UDP | 네트워크 파일 시스템(Network File System) |
3306 | MySQL | TCP | MySQL 데이터베이스 서비스 포트 |
3389 | Remote Desktop Protocol | TCP | 원격 데스크톱 프로토콜(Remote Desktop Protocol, RDP) |
5432 | PostgreSQL | TCP | PostgreSQL 데이터베이스 서비스 포트 |
6379 | Redis | TCP | Redis 메모리 데이터 저장소 |
8080 | HTTP Alternative | TCP | HTTP 대체 포트, 프록시 서버에서 자주 사용 |
8443 | HTTPS Alternative | TCP | HTTPS 대체 포트 |
Daily CS 시간 마다 느끼는 거지만, 정말 지식은 배워도 배워도 끝이 없는 것 같다. 알아가면 알아갈 수록, 나무가 가지를 뻗듯 새로운 내용들이 쏟아져 나온다. 덕분에 완전히 조사와 정리를 끝마쳤다고는 말할 수 없겠지만... 최근 프로젝트를 진행하며 얻은 경험을 지식으로 바꿔주는 데에는 큰 도움이 된 것 같다.
아 그런데 사진 수작업으로 올리는 거 너무 귀찮다... 좀 줄여볼까