본문 바로가기

해킹-보안

포트 스캐닝을 위한 TCP 제어 플래그의 이해

반응형

ி TCP 헤더


TCP 헤더는 6개의 Control Flag 필드가 있으며
각각 URG, ACK, PSH, RST, SYN, FIN등이 존재한다. 

이들은 TCP의 흐름을 제어하고 연결을 설정하는 기능이 있다.
각 플래그의 의미를 알아보자.


URN(Urgent pointer)
긴급한 패킷이니 우선 처리한다.
이 플래그가 1로 설정되면 순서에 관계없이 먼저 전달된다.

ACK(Acknowledgement)
요청에 대한 응답을 의미한다. TCP가 연결되면 이 플래그는 항상 1로 설정된다.

PSH(Push)
데이터 전송을 알리는 플래그다.

RST(Reset)
연결을 재설정한다. 플래그가 1로 설정됐다면 TCP 통신 도중에 강제로 연결을 종료한다.

SYN(Synchronization)
연결 요청을 위한 플래그다.

Fin(Finish)
세션 연결을 종료할 때 사용하는 플래그다.

TCP 통신은 이 플래그들을 통해 이루어지며
TCP 통신 과정인 3Way-handshake 4Way-handshake에도 사용한다.
아래의 예시 패킷을 보고 각각의 통신이 무엇을 의미하는지 확인해보자.



[TCP 3Way-handshake]
3Way-handshake는 상대와의 접속 상태를 유지하기 위해서 사용한다.
(UDP는 이러한 연결을 하지 않고 통신하기 때문에 신뢰성이 떨어진다.)
클라이언트가 서버에게 연결 요청을 의미하는 SYN 플래그를 설정하여 패킷을 전송한다.
서버는 연결 요청에 대한 응답으로 SYN, ACK 플래그를 포함하여 패킷을 보낸다.
최종적으로 클라이언트는 연결 요청을 수락하는 ACK 패킷을 보내 서버와의 통신을 시작한다.



[TCP 4Way-handshake]


4Way-handshake는 연결을 종료할 때 사용한다.
클라이언트와 서버는 연결을 종료하겠다는 의미로 FIN,ACK를 주고받은 뒤
클라이언트가 최종적으로 ACK를 보낸다. 이때 서버가 ACK를 받아야만 서버 측 소켓이 CLOSE 상태가 된다.
그 후 시간이 경과한 뒤 클라이언트도 소켓이 CLOSE 된다.

번외로 위 패킷에서 보면 알겠지만 통신 순서를 맞추기 위해서 순서 제어 번호(Seq)라는 것도 존재한다.
네트워크 상황에 따라서 도착하는 패킷의 순서가 달라질 수 있기 때문에 

이 순서 번호를 보고 패킷을 조합한다.
위 패킷을 보면 첫 번째 패킷의 ACK number(7092)가 두 번째 패킷의 Seq number로,
두 번째 패킷의 ACK number(6636)가 세 번째 패킷의 Seq number로 설정되는 것을 알 수 있다.

패킷 플래그는 세션 연결 설정뿐만 아니라 대상 시스템에 열린 포트를 알아내는
포트 스캐닝에도 사용된다. 물론 이 글을 보고 실제 운영중인 서비스에 허가 없이 사용하는 것은 금물이다.



ி 포트 스캐닝 종류




TCP SYN(full, open, connect) SCAN


각 포트마다 3 way handshaking을 모두 시도하여 열린 포트를 알아낸다.
열린 포트 : SYN-ACK 수신, ACK 발신, RST-ACK 발신
닫힌 포트 : RST-ACK 수신
반응 없는 경우 : 보안장비에서 차단

아래 사진은 TCP SYN SCAN을 수행한 패킷의 일부이다.

포트 스캐너(10.40.219.42)가 3Way-handshake를 통해 대상 시스템에 특정 포트로 연결한다.
이때 연결에 성공하면 해당 포트는 열려있다는 것을 알았으니 더 이상 연결을 유지할 필요가 없어
RST를 통해 접속을 강제로 끊는다. 

대상 시스템에 포트가 닫혀있다면 SYN,ACK 대신 RST,ACK 패킷을 수신한다.

와이어샤크 디스플레이 필터창에서 특정 플래그를 필터링하는 방법
(tcp.flags.syn==1 || tcp.flags.ack==1 || tcp.flags.reset==1)

포트를 조회하는 프로그램에는 대표적으로 nmap이 있는데
nmap 옵션 중 sT는 TCP SYN scan을 사용하여 포트를 스캔한다는 뜻이다.
아래 사진은 Nmap을 사용하여 대상 시스템에 21번 포트가 열린것을 확인하고
와이어샤크 패킷을 봤을 때의 내용이다.


Tcp syn scan의 단점은 보안 장비에 접속 로그가 남는다.
보안 장비는 용량 관계상 전체 플래그를 저장하지 않고 ACK만을 저장하는데
저 스캔 방식은 ACK까지 이루어져 보안 장비에 기록이 남게된다.
아래에서 할 half open scan은 이러한 로그를 남기지 않는다.



TCP HALF OPEN SCAN


각 포트마다 3 way handshaking을 모두 시도한다.
열린 포트 : SYN-ACK 수신, RST-ACK 발신
닫힌 포트 : RST-ACK 수신
반응 없는 경우 : 보안장비에서 차단


Half open scan은 세션을 완전히 성립하지 않고
중간에 RST 패킷을 날려 강제로 연결을 종료한다. 따라서 로그가 남지 않는다.

포트가 열려있다면 대상에게 SYN-ACK 패킷이 날라오는데 이때 RST 패킷을 보내 연결을 

강제로 종료한다.

포트가 닫힌 경우 대상 시스템에서 SYN, ACK 대신 RST,ACK 패킷을 전달한다.


근데 대상 시스템에서 이를 대응하는 방안으로 syn 패킷을 필터링한다면 

SYN 이외에 플래그를 사용하여 포트스캐닝을 해야한다. 

Halp open 스캔 중에서도 아래와 같은 방식이 있다.



STEALTH SCAN


열린 포트 : 반응 없음
닫힌 포트 : RST-ACK 수신
반응 없는 경우 : 보안장비에서 차단


TCP FIN SCAN

최초 접속 시도시 SYN 대신 FIN 패킷을 전송한다.



TCP X-MAS SCAN

모든 플래그 제어 비트가 1이거나 URG , PSH, FIN 비트가 1로 설정된 경우이다.




TCP NULL SCAN

최초 접속 시도시 syn 대신 모든 제어 비트가 0인 패킷을 전송한다.




UDP SCAN


UDP 프로토콜을 이용하여 포트를 스캔한다.
열린 포트 : 해당 통신포트에 맞는 메시지를 UDP 응답으로 전송한다.
닫힌 포트 : icmp port unreachable 수신
반응 없는 경우 : 보안장비에서 차단

UDP SCAN은 icmp 프로토콜을 이용하여 포트를 스캔한다.
포트가 닫혔다면 icmp는 목적지도달불가 패킷을 의미하는 Type 3번에
Icmp Port Unreachable Code 3으로 설정된다.

열린 포트라면 해당 통신 포트에 맞는 메시지를 뿌려준다.
예를들어 포트 스캔했을 때 NTP 서버가 열려있다면
아래처럼 NTP 서버에서 제공하는 형태의 메시지를 받게 될 것이다.




TCP ACK SCAN


방화벽의 포트 필터링 정책을 테스트하기 위한 스캔이다.
OPEN/CLOSE: RST 수신(필터링X)
필터링 : ICMP 응답 또는 무반응

TCP ACK SCAN은 포트 여부를 확인하는 것보다
대상 포트가 방화벽에 의해 필터링 되고 있는지 점검하는 용도로 많이 쓰인다.
상태기반의 방화벽이라면 이미 연결된 세션은 허용한다는 특징을 이용해서
보안 장비를 우회해 내부 네트워크를 스캔 할 수도 있다.

아래 패킷은 nmap으로 TCP ACK SCAN을 했을 때 응답 패킷이 없는 것으로 보인다.
따라서 대상 포트는 방화벽에 의해 필터링 된 상태임을 알 수 있다.


이제 대상 시스템의 방화벽을 해제하고 다시 TCP ACK SCAN을 진행한 결과
아래와 같이 RST 패킷이 반환되어 방화벽에서 해당 포트를 필터링하지 않는 것을 확인할 수 있다.


이와 비슷한 스캔으로 Window scan이 있는데 해당 스캔은 방화벽의 필터링 여부뿐만 아니라
open된 포트도 스캔할 수 있다.


Decoy SCAN


실제 스캐너 주소 외에 다양한 위조된 주소로 스캔하는 방식이다.
다양한 IP로 스캔을 하기 때문에 누가 행위자인지 알아내기 어렵다.
Port의 open/close는 tcp halp open 방식과 같다.

아래의 패킷을 보면 위조된 주소랑 실제 행위자(192.168.0.6)가 같이 섞여있는 것을 확인할 수 있다.

열린 포트는 스캐너에게 RST 패킷을 보낸다.

그런데 저 위조된 IP가 실제 존재하는 사용자라면 어떻게 될까?
위조된 IP 23.94.58.240이 실제 사용자라고 가정해보자.
이때 피해자는 위 IP로부터 SYN 패킷을 받았다.
그렇다면 피해자는 23.94.58.240에게 SYN-ACK를 응답한다.
23.94.58.240 사용자는 뜬금없이 모르는 사용자한테 SYN-ACK를 받았으므로
연결을 안한다는 의미로 피해자에게 RST 패킷을 보내게 된다.




ி NMAP 포트 스캐닝 명령어


학습적인 목적 이외에 실제 운영중인 시스템에 허가없이 사용을 금한다.

TCP Open 스캔
# nmap -sT [Target_IP]

Half Open 스캔
# nmap -sS [Target_IP]

FIN 스캔
# nmap -sF [Target_IP]

NULL 스캔
# nmap -sN [Target_IP]

XMAS 스캔
# nmap -sX [Target_IP]

ACK 스캔
# nmap -sA [Target_IP]

Window 스캔
# nmap -sW [Target_IP]

Decoy 스캔
# nmap -D RND:10 [Target_IP]
RND:10은 랜덤한 IP 주소 10개를 의미한다.

UDP 스캔
# nmap -sU [Target_IP]




반응형