살다보면 누구나 한번쯤은 VMware에 구축한 모의 서버를 nmap으로 스캔하고, wireshark로 패킷의 움직임을 보고 싶을 때가 있다.
먼저 사용할 운영체제는
● Kali Linux (공격자)
● Windows 10
● Rocky Linux 9.7 (스캔 대상 서버)
Rocky Linux에 프로토콜 설치하기
nmap으로 서버를 스캔하기 전에, 로키 리눅스에 몇 가지 서비스를 설치해두겠다. 일단 이번 글에서는 http만 주로 볼 거지만, 나중을 위해 이것저것 많이 깔아두었다.
나 같은 경우는 이렇게 구축하였다.
dnf -y install httpd*
dnf -y install ftpd*
dnf -y install vsftpd*
dnf -y install telnet*
dnf -y install bind* --skip-broken
dnf -y install tftp*
dnf -y install mariadb*
dnf -y install sendmail*
dnf -y install dovecot*
그리고 모든 서비스를 활성화시킨 뒤 firewalld를 꺼주도록 하겠다.
wireshark로 FTP / SSH 패킷 구경하기
nmap 스캐닝에 들어가기 전에, 먼저 wireshark로 FTP 접속과 SSH 접속의 패킷을 비교해서 구경해보겠다. 같은 원격 접속 이지만 보안 측면에서 완전히 다른 모습을 볼 수 있다.
FTP 접속
윈도우 cmd에서 로키 리눅스의 FTP 서버에 접속해보겠다.

이 패킷을 wireshark로 살펴보면, 보안이 취약한 FTP답게 패킷 내용이 전혀 암호화되지 않고 ID와 비밀번호가 평문 그대로 노출되는 것을 볼 수 있다.

FTP는 1971년에 만들어진 아주 오래된 프로토콜이라, 설계 당시에는 암호화 개념 자체가 거의 고려되지 않았다. 그래서 이렇게 같은 네트워크에 있는 누군가가 패킷만 캡처하면 계정 정보가 그대로 털리게 된다. 이런 이유로 요즘은 FTP 대신 SFTP나 FTPS 같은 암호화된 프로토콜을 쓴다.
SSH 접속
이번엔 SSH로 접속을 해보겠다.


wireshark를 보면 이번엔 패킷이 암호화되어 있는 것을 확인할 수 있다. FTP와 달리 내용이 알아볼 수 없는 형태로 보인다. SSH는 접속 초기에 키 교환(key exchange)을 거쳐 세션 전체를 암호화하기 때문이다.
nmap으로 스캐닝하기
이제 nmap을 활용해 스캐닝을 해보도록 하겠다. 이것은 해킹의 첫 번째 단계인 정보 수집(reconnaissance) 에 해당한다.
대상에 어떤 포트가 열려있고, 어떤 서비스가 돌아가는지를 파악하는 단계다.
nmap은 기본적으로 TCP Scan을 수행한다. 다만 정확히 말하면
● 루트(관리자) 권한으로 실행하면 기본값이 SYN Scan
● 일반 사용자 권한으로 실행하면 기본값이 TCP Connect Scan
이다. Kali Linux는 기본적으로 루트 권한으로 동작하기 때문에, Kali에서 그냥 nmap을 돌리면 SYN Scan이 기본으로 사용된다.
물론 명령어로 UDP 스캔을 하는 것도 가능하지만, 개인적으로는 추천하지 않는다. 이론상으로는 핸드셰이크가 없는 UDP가 TCP보다 빨라야 할 것 같지만, 막상 UDP 스캔을 돌려보면 30분 동안 현실과 이론의 차이를 느낄 수 있을 것이다. (UDP는 응답이 없어도 "열림"일 수 있어서 nmap이 일일이 재전송하며 기다리고, 닫힌 포트를 알려주는 ICMP 응답마저 운영체제가 속도 제한을 걸어두기 때문에 엄청나게 느려진다.)
이 TCP Scan에는 크게 3가지가 있다.
- Open Scan
- Half Open Scan
- Stealth Scan
하나씩 살펴보겠다.
1. Open Scan (TCP Connect Scan)
Open Scan은 TCP의 3-way Handshaking을 착실히 끝까지 수행하며 스캔하는 방식이다. 대표적으로 TCP Connect Scan이 있다.
nmap -sT -p 80 192.168.10.50
편의를 위해 HTTP 포트(80)만 스캔하였다.

패킷을 보면 SYN → SYN,ACK → ACK 로 3-way Handshaking을 완료한 후, RST,ACK로 연결을 끊는 것을 볼 수 있다.
연결이 완전히 확립되었기 때문에, 이 접속은 스캔당하는 서버의 로그에 고스란히 남게 된다. 누가 접속했다가 끊었다는 기록이 남는 것이다. 그래서 은밀함과는 거리가 멀다. 대신 권한이 필요 없고 가장 정확하다는 장점이 있다.
2. Half Open Scan (SYN Scan)
Half Open Scan에는 SYN Scan이 있다.
nmap -sS -p 80 192.168.10.50

SYN Scan은 3-way Handshaking을 끝까지 완성하지 않는다. 서버로부터 SYN,ACK를 받은 직후 ACK 대신 RST를 보내 연결을 끊어버린다. 핸드셰이크가 확립되지 않기 때문에, 정식 "연결"로 간주되지 않아 (오래된 서버 기준으로는) 애플리케이션 로그에 남지 않는다.
다만 "로그가 안 남는다"는 건 일부 오래된 서버에 한정된 이야기다. 요즘 서버나 IDS/방화벽은 대부분 SYN 패킷 자체도 로깅하고, 짧은 시간에 수많은 SYN이 들어오면 "SYN 스캔 탐지"로 잡아낸다. 그래도 Connect Scan보다는 흔적이 적고 빠르기 때문에, 그리고 권한만 있으면 기본값이라서 가장 많이 쓰이는 방식이다.
3. Stealth Scan (FIN, NULL, X-MAS, ACK)
Stealth Scan은 정상적인 핸드셰이크 흐름을 아예 무시하고, 비정상적인 플래그 조합을 보내서 서버의 반응을 떠보는 방식이다.
이 스캔들이 왜 작동하는지부터 짚고 가면 이해가 훨씬 쉽다. 핵심은 RFC 793(TCP 표준) 에 적힌 규칙이다.
● 열린 포트는 SYN/RST/ACK가 없는 이상한 패킷을 받으면 그냥 무시한다
● 닫힌 포트는 어떤 패킷이든 받으면 RST로 응답한다
즉 nmap은 이 규칙을 거꾸로 이용한다. 이상한 플래그를 던져놓고
● 응답이 없으면 → 이 포트는 Open 상태
● RST가 오면 → 이 포트는 Closed 상태
라고 판단하는 것이다. 정상 연결을 안 만들기 때문에 로그가 덜 남는다는 게 Stealth라는 이름의 이유다.
FIN Scan
nmap -sF -p 80 192.168.10.50

FIN은 원래 세션이 연결된 상태에서 "이제 종료하자" 는 의미의 플래그다. 그런데 FIN Scan은 처음부터 다짜고짜 FIN을 보내버린다. 서버 입장에서는 연결한 적도 없는데 종료하자는 플래그를 보내오는 클라이언트(공격자) 인 셈이다. 그래서 열린 포트는 이 패킷을 그냥 무시하고 아무 응답도 하지 않는다.
NULL Scan
nmap -sN -p 80 192.168.10.50

NULL Scan은 TCP의 6개 플래그(URG, ACK, PSH, RST, SYN, FIN)를 전부 비워서 보낸다.
역시 비정상 패킷이므로 열린 포트는 응답하지 않는다.
X-MAS Scan
nmap -sX -p 80 192.168.10.50

X-MAS Scan은 FIN, PSH, URG 세 플래그를 켜서 보낸다. 패킷에 플래그가 크리스마스 트리 전구처럼 켜져 있다고 해서 X-MAS라는 이름이 붙었다. 마찬가지로 열린 포트는 무응답이다.
ACK Scan
nmap -sA -p 80 192.168.10.50

ACK Scan은 위의 셋과 목적이 조금 다르다. FIN/NULL/X-MAS가 "포트가 열렸는지 닫혔는지"를 보는 거라면, ACK Scan은 "방화벽이 이 포트를 필터링하고 있는지" 를 알아내는 용도다.
● RST가 돌아오면 → 방화벽이 막지 않음 (unfiltered)
● 응답이 없거나 ICMP 에러가 오면 → 방화벽이 필터링 중 (filtered)
즉 ACK Scan으로는 포트의 open/closed를 알 수 없고, 방화벽 존재 여부를 매핑하는 데 쓰인다.
같은 Stealth 계열로 묶이지만 쓰임새가 다르다.
Stealth Scan은 정말 로그에 남지 안는가
위에서 SYN Scan이나 Stealth Scan은 연결을 확립하지 않아서 로그가 남지 않는다고 했다.
그렇다면 정말로 요즘 시대에도 로그가 남지 않는가는 다른 문제이다.
어느 로그냐에 따라 다르다.
로그는 한 종류가 아니다
서버에서 로그가 남을 수 있는 것은 여러 개다.
1: Application (sshd, httpd 등)
2: OS / Kernel TCP Stack
3: Firewalld Log (iptables/firewalld, Windows Firewall)
4: IDS/IPS (Snort, Suricata)
5: SIEM / 네트워크 모니터링
Stealth Scan이 로그가 안 남는다는 건 ,Application Log에만 해당하는 이야기였다.
Application Log에는 남지 않음
SYN Scan이나 FIN/NULL/X-MAS Scan은 3-way Handshaking을 완성하지 않는다.
그러면 TCP 연결이 정식으로 확립되지 않고, 애플리케이션(sshd, httpd 같은 프로그램)은 그 연결을 보지도 못한다.
커널 TCP 스택 선에서 처리되고 끝나기 때문이다.
그래서 /var/log/secure나 httpd 액세스 로그 같은 Applicarion 로그에는 남지 않는다. 이것이 "Stealth(은밀한)"라는 이름의 원래 의미다. 1990년대에는 이게 큰 의미가 있었다.
다른 Log
● 방화벽 로그 - iptables/firewalld나 Windows Firewall은 수상한 패킷을 로깅하도록 설정할 수 있다.
기존 연결도 없는데 갑자기 FIN 패킷이 날아오면 명백히 비정상이라 로그로 남길 수 있다.
● IDS/IPS (Snort, Suricata) - 이 도구들은 raw 패킷을 직접 감시하면서 스캔 패턴을 탐지하라고 만들어진 것이다. FIN/NULL/X-MAS 스캔이나, 짧은 시간에 여러 포트로 날아가는 SYN 다발은 교과서적인 스캔 시그니처라서 이 도구들에 기본 룰로 다 들어있다. 던지는 순간 알람이 뜬다.
● 속도 기반 탐지 - 시그니처가 없어도, nmap을 기본 속도로 돌리면 몇 초 만에 수백~수천 개의 포트를 두드린다. 이 트래픽 패턴 자체가 너무 튀어서 SIEM이나 네트워크 모니터링에 비정상 트래픽으로 바로 걸린다.
Stateful Firewall에서의 이야기.
요즘 방화벽은 대부분 stateful(연결 상태를 추적하는) 방식이라고 한다.
Stateful 방화벽은 현재 살아있는 연결들을 상태 테이블로 관리한다. 그런데 FIN/NULL/X-MAS 패킷은 어떤 기존 연결에도 속하지 않는 패킷이다. 방화벽 입장에서는 이것이 명백한 out-of-state(상태 위반) Packet이라서
● 그냥 버려버린다 -> 열린 포트든 닫힌 포트든 응답이 안 와서 nmap이 전부 open|filtered로 잘못 판단
● 동시에 수상한 패킷으로 로그/알람을 남긴다
즉 stateful 방화벽 앞에서는 Stealth Scan이 효과도 없고 더 눈에 띄는 이중고를 겪는다.
차라리 평범한 SYN 패킷이 정상 트래픽에 섞여 덜 튀는 경우도 있다고 한다.
실전에서의 스캔 방식
요즘 환경에서 탐지를 진짜 피하려면, 스캔 방식(-sF 같은 것)이 아니라 타이밍과 분산을 사용해야 한다고 한다.
● 느린 스캔 (-T0, -T1): 패킷을 몇 분에 하나씩 찔끔찔끔 보내 속도 기반 탐지를 회피한다.
대신 전체 스캔에 몇 시간~며칠이 걸린다.
● Decoy 스캔 (-D): 가짜 출발지 IP를 여러 개 섞어 진짜 공격자를 숨긴다.
● Idle/Zombie 스캔 (-sI): 제3의 좀비 호스트를 경유해 내 IP를 아예 드러내지 않는다.
● 패킷 단편화 (-f): 패킷을 잘게 쪼개 시그니처 매칭을 회피한다.
모두 속도를 희생하는 스캔 방식이다.
실제로는 느리지만 들키지 않게 스캔한다는 것 같다,
정리.
앞에서 일부 오래된 서버가 로그가 안남는다 했지만 정확히 말하면 "오래된 서버"보다 IDS나 방화벽 로깅 같은 방어 장치가 없는 서버 라고 하는 게 맞다.
최신 OS라도 IDS가 없고 방화벽 로깅을 안 켜놨으면 Stealth Scan이 그대로 안 잡히고, 반대로 구형 시스템이라도 앞단에 IDS가 있으면 다 잡히기 때문이다.
포트가 닫혀 있으면 무조건 RST
여기서 중요한 것은, 포트가 닫혀 있는 경우에는 어떤 스캔을 하든 RST(보통 RST,ACK)가 돌아온다는 점이다. FIN을 보내든, NULL을 보내든, 정상적으로 SYN을 보내든, 포트가 닫혀 있다면 응답은 RST다.
그래서 위의 Stealth Scan들이 성립하는 것이다.
보낸 패킷 열린 포트 닫힌 포트
| SYN (-sS) | SYN,ACK | RST |
| FIN / NULL / X-MAS | 무응답 | RST |
열린 포트에서 무응답과 RST로 갈리기 때문에, nmap이 이 차이로 포트 상태를 추론하는 것이다.
FIN / NULL / X-MAS는 윈도우엔 통하지 않음
이 부분이 실전에서 정말 중요하다. 위에서 설명한 "열린 포트는 무응답" 규칙은 RFC 793을 제대로 지키는 운영체제(리눅스, 유닉스 계열)에서만 통한다.
Windows는 RFC 793을 그대로 따르지 않는다. 윈도우는 열린 포트든 닫힌 포트든 무조건 RST로 응답해버린다. 그래서 윈도우를 대상으로 FIN/NULL/X-MAS 스캔을 돌리면, 모든 포트가 닫혀 있다고 잘못 나온다.
그래서 우리가 지금 Rocky Linux를 대상으로 할 때는 이 스캔들이 잘 동작하지만, 만약 Windows 10을 대상으로 같은 스캔을 돌리면 결과가 전혀 다르게 나올 것이다. 직접 두 OS에 같은 스캔을 돌려서 비교해보면 이 차이가 확 느껴진다. (이것 자체가 OS를 추측하는 단서가 되기도 한다.)
마치며...
Nmap과 Wireshark를 사용해 몇가지 놀이들을 해봤다.
정보수집 단계는 어떻게 보면 해킹에서 가장 중요한 부분이라 생각한다.
그리고 FTP 원격접속에서 비밀번호가 그대로 노출되는 걸 보고 안쓰는데는 이유가 다 있다는 생각을 했다.
'네트워크보안' 카테고리의 다른 글
| wireshark, dnsiff, tcpdump를 이용한 sniffing에 대하여 (0) | 2026.06.03 |
|---|---|
| hydra, medusa를 사용한 Password Attack에 대하여 (0) | 2026.06.02 |
| DNS Server Set up과 DNS Scanning (0) | 2026.05.29 |
| Nmap 명령어 정리 (0) | 2026.05.28 |
| 사설, 공인 IP에 대하여(네트워크 기초) (0) | 2026.05.27 |