발자취

#03 포트 스캔 실습 본문

3-1/침입 탐지와 차단 시스템

#03 포트 스캔 실습

해린 2023. 4. 1. 23:45

#01 TCP와 UDP의 특징

- TCP: 신뢰성 통신 지원(3-way-handshake) -> 민감한 정보를 전달하는 경우 사용(웹서비스, 이메일 등)

- UDP: 신뢰성이 필요없는 통신, 많은 양의 데이터를 한번에 빠르게 보내는 것이 가능.  -> 빠르게 데이터를 전달하는 경우 사용(인터넷 전화, 실시간 방송 등)

 

 

#02 네트워크 도구

1. 포트 스캔(nmap)

    IP 주소 = 도로명 주소

    포트 번호 = 상세 주소(아파트의 동, 호수)

    nmap은 해당하는 IP 주소에 어떤 포트번호가 열려져 있는지(사용자가 어떤 포트를 사용하고 있는지)를 확인하는 도구.

 

 

#03 포트 스캔 실습

[1] TCP 포트 스캔

우선 실습 전에 Kali와 Xubuntu를 NAT로 연결하고, Kali는 192.168.100.128, Xubuntu는 192.168.100.20으로 설정.

 

1. Kali에서 HostOS(192.168.100.1)로 ping 전달(이때 윈도우즈에 방화벽이 있어서 핑이 안 보내질 수 있어 이 단계는 생략)

$ ping 192.168.100.1

 

 

2. Kali에서 HostOS로 nmap을 사용하여 열려 있는 포트를 확인한다.

$ nmap -sT 192.168.100.1 -p 1-65535

-> HostOS에 어떤 포트가 열려 있는지 1번부터 65535번(제일끝)까지 확인함.

 

=> 결과: 열린게 하나도 없다고 나옴. 진짜 안 쓰고 있는 것일수도, 막아둔 것일수도 있다.

 

 

3. Kali에서 Xubuntu로 nmap을 사용하여 열려있는 포트를 확인한다.

$ nmap 192.168.100.20

 

21번 포트 ftp

22번 포트 ssh

23번 포트 telnet

80번 포트 http

4개의 서비스가 되고 있다는 것을 확인할 수 있다. 이 4개가 외부에 노출된 상태에서 돌고있다...

 

 

#04 TCP 포트 스캔 실습

TCP 포트 스캔은 3-way-handshake를 이용해 포트의 개방 여부를 파악할 수 있음.

포트가 열려 있는 경우엔 SYN을 전송하면 서버 측에서는 SYN-ACK 패킷으로 응답하고,포트가 닫혀 있는 경우엔 SYN을 전송하면 서버 측에서는 RST-ACK 패킷으로 응답한다.(다만 방화벽 또는 iptables와 같은 정책에 포트 스캔이 차단되었을 때는 TCP나 UDP 관계없이 어떠한 패킷도 응답하지 않는다.)

 

 

1. Xubuntu 터미널에서 wireshark를 실행한다.

$ sudo wireshark

 

 

2. ens33을 선택한다.

 

 

 

3. Kali에서 nmap을 실행한다.

$ nmap -sT 192.168.100.20 -p 1-65535

=> Xubuntu에서 실행된 wireshark에 패킷들이 캡쳐된다.

 

 

4. Xubuntu의 wireshark에서 캡쳐된 패킷들을 확인한다.

(Filter: "tcp.stream" 입력)

열려 있는 포트로 전송된 SYN 패킷은 3-way-handshake 과정을 통해 연결이 생성되고, 이후에 RST-ACK 패킷을 전송하여 강제로 연결을 끊는 형태이다.

 

 

5. Xubuntu에서 열려 있는 포트(80)의 TCP SYN 스캔 패킷 흐름을 확인한다.

(Filter: "tcp.stream eq 0" - 이때 eq 뒤에 붙는 숫자는 조금 다를 수 있다.)

열려 있는 포트인 80번 포트는 서버에 SYN 패킷을 보내면, 서버에서 SYN-ACK로 응답하고, 다시 ACK를 보내는 과정을 거친다는 것을 확인할 수 있다.

 

 

6. Xubuntu에서 닫혀 있는 포트의 TCP SYN 스캔 패킷 흐름을 확인한다.

(Filter: "tcp.stream eq 2")

닫혀 있는 포트인 25번 포트는 서버에 SYN을 보내면, 서버에서 RST-ACK로 응답하는 과정을 거친다는 것을 확인할 수 있다.

 

 

7. Kali에서 열려진 포트들을 확인한다.

$ nmap -sT 192.168.100.20 -p 1-65535

 

 

8. Xubuntu에서 패킷이 오고 간 현황을 파악하기 위해 Wireshark 메뉴에서 [Statistic] - [Conversations]을 실행한다.

[TCP - 65537] 탭을 누르고 들어가 Port B를 오름차순 정렬한다.

A는 source(Kali)이고, B는 destination(Xubuntu)이다.

 

닫힌 포트는 128바이트가 보내지고, 열린 포트인 21, 22, 23번은 208 바이트가 보내지고 있는 것을 확인할 수 있다. 숫자는 조금씩 다를 수 있으니 열린 포트와 닫힌 포트에서 보내지는 바이트 크기가 다르다는 것만 확인하면 될 것 같다.

 

Duration은 걸린 시간인데, 열린 포트에서 좀 더 많은 시간이 걸린 것을 확인할 수 있다.

 

 

[2] TCP stealth 스캔 - TCP Half Open 스캔

stealth 스캔이란?

정상적인 3-way-handshake 과정이 완료되지 않게 하여 로그가 남지 않도록 포트를 스캔하는 것.

 

TCP Half Open 스캔

TCP half open 스캔은 3-way-handshake 과정에서 SYN 패킷을 받는 서버가 SYN-ACK 패킷을 응답한 뒤 ACK 패킷이 돌아올 것을 기다리는 반쯤 열린 상태를 말한다.

 

- 포트가 열린 경우: [SYN] - [SYN+ACK] - [RST]

- 포트가 닫힌 경우: [SYN] - [RST+ACK]

=> 정상적인 TCP 포트 스캔과 다르게 SYN+ACK에 대해 ACK가 아닌 RST을 전달함

 

 

실습

1. Xubuntu 터미널에서 wireshark를 실행한 후 ens33을 눌러 들어간다.

$ sudo wireshark

 

 

2. Kali에서 nmap을 실행한다

$ sudo nmap -sS 192.168.100.20 -p 1-65535

-> 정상적인 TCP 스캔은 -sT 옵션을 사용하지만 half open 스캔 시 -sS 옵션을 사용 (SYN+ACK에 RST을 보냄)

 

3. Xubuntu의 와이어샤크에서 SYN과 RST+ACK를 확인할 수 있다.

 

4. 필터 부분에 tcp.stream eq ~를 입력하여 열려 있는 패킷의 흐름을 파악한다.

21번 포트의 패킷 흐름을 보면 [SYN] - [SYN+ACK] - [RST]인 것을 확인할 수 있다.

 

 

5. 닫힌 패킷의 흐름도 파악한다.

닫혀있는 포트인 995 포트의 패킷 흐름을 보면 [SYN] - [RST, ACK]인 것을 확인할 수 있다.

 

 

[3] UDP 포트 스캔

UDP는 신뢰성 없는 통신 방식이므로 닫힌 포트에게서 ICMP 프로토콜의 Unreachable 패킷이 수신된다. 도착하지 않았음을 알려주는 것.

ICMP를 가장 많이 사용하는 명령어의 예로는 ping이 있다. ping을 보낼 때 정상적으로 메시지가 나오면 정상적으로 전달이 되었다는 뜻으로 보면 되는 것이다.

 

- 열린 포트: [UDP 패킷] - 응답 없음

- 닫힌 포트: [UDP 패킷] - [ICMP의 Unreachable 메시지]

 

 

실습

1. Kali에서 nmap을 실행한다.

$ sudo nmap -sU 192.168.100.20 -p 1-100

-> 이땐 -sU 옵션을 사용한다(UDP)

-> 65535까지하면 너무 오래걸리니까 100까지만

 

2. Xubuntu에서 캡쳐되는 패킷을 확인한다.

192.168.100.128에서 192.168.100.20으로 들어올 때는 UDP를 사용하고, 나갈 때는 ICMP를 사용하는 것을 확인할 수 있다.

 

3. 열린 포트를 확인한다 => 없다

1번에서 볼 수 있듯이 현재 UDP에서는 열린 포트가 없다는 것을 알 수 있다.

 

4. 닫혀있는 포트를 확인한다.

UDP로 보내면 ICMP Unreachable 메시지를 보내오는 것을 확인할 수 있다.