[NULL Scan 원리]
1. TCP Flag를 NULL로 하여(아무것도 설정하지 않음) 대상 시스템으로 전송
2. 응답이 없으면 Open이나 Filtered 상태이다.
3. RST/ACK 패킷이 온다면 확실하게 Closed 상태이다.
해당 스캔 기술은 정확히 포트의 Open 상태를 점검하지 못한다.
이번 스크립트도 이전 스크립트와 마찬가지로 방화벽 기능이 On 상태에서 진행되었다.
[그림 1 - 대상 시스템의 방화벽 설정 화면]
아래는 nmap의 대상 시스템 스캔 결과이다.
[그림 2 - nmap의 대상 시스템 스캔 결과]
아무것도 잡아내지 못하는것을 볼 수 있다
아래는 내가 코딩한 스크립트의 결과이다.
[그림 3 - 내가 작성한 스크립트 결과]
스크립트의 결과가 들어있는 txt 파일을 보니 아무것도 들어있지 않다.
이번에도 마찬가지로 scapy 모듈문제인지 내 코딩이 문제인지 스크립트가 무한동작하는 현상이 나타났다.
혹시나 해서 윈도 기본방화벽은 stateful 방화벽의 일종이라고 본다고 하여 내 패킷이 정상적인 연결을 하는지 모니터링 하는것이 아닌가 하고 RST 패킷을 보내 강제로 접속을 끊어보았는데도 이상현상은 계속 되었다.
혹시 이 문제의 해결방법을 아시면 제발 답변좀 .... ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ
NULL 스캔과 FIN, XMAS 스캔은 방식이 같기 때문에 따로 만들어야 할지 고민이다..(Flag만 바꿔주면 되는거라서...)
[ACK Scan 원리]
ACK Scan은 포트 Open/Close를 점검하는 것 보다 Stateful 방화벽의 상태를 점검하는 용도로 더 많이 쓰인다.
1. ACK Flag만 설정된 패킷을 대상 시스템에 보낸다.
2. port의 Open/Close 여부 상관 없이 RST 패킷이 오게 되는데 이때는 Unfiltered 상태이다.
3. 또 RST 패킷이 오지 않거나 ICMP 패킷이 오게 되면 Filtered 상태이다.
방화벽이 설정되어 있는 Win XP SP2 시스템을 상대로 스캔을 시도 하였다.
아래는 방화벽이 설정되어 있는 모습이다.
[그림 1 - 대상 시스템의 방화벽이 설정되어 있는 모습]
처음에는 내가 작성한 스크립트가 정상적으로 작동하지 않는 듯 하여 삽질을 했지만 nmap과 비교해본 결과 정상적으로 작동하고 있었다.
아래 이미지는 nmap으로 대상 시스템을 스캔한 결과이다.
[그림 2 - nmap 스캔 결과]
아래는 내가 코딩한 스크립트 결과이다.(한가지 버그가 있다. 아래에서 설명)
[그림 3 - ack.py라는 내가 코딩한 스크립트의 스캔 결과]
nmap과 스크립트의 결과가 동일한 것을 볼 수 있다.
그런데 한가지 문제점이 있다.
스크립트가 모든 스캔을 끝마치고도 종료를 하지 않는다.
실행시간을 체크해 sys.exit()를 불러오기도 하고, 마지막 port를 체크해 sys.exit()를 불러오기도 하고 별의별 방법을 다 써봤지만 종료가 되지 않는다.
방화벽에 필터되어 응답이 오지 않는것에 대해 무한정 기다리는 것인데, 코딩이 잘못된것이 아니고 scapy 모듈자체에 문제가 있는 것 같다.
아무래도 scapy 모듈을 손봐야 할 것 같다... ㅠㅠ
[IP Spoofing Tool 원리]
1. scapy 모듈로 IP 헤더 중 src 임의로 설정
2. IP헤더에 TCP헤더나, ICMP헤더를 덧붙여 전송
해당 스크립트는 scapy 모듈로 코딩하였음
해당 스크립트는 random 함수를 통해 1~254까지 IP를 생성하게 하여 1.1.1.1 ~ 254.254.254.254까지의 IP대역을 출발지 IP로 설정하여 ICMP 패킷을 10개 전송하도록 코딩되었다.
[그림 - IP 스푸핑되어 전송되는 ICMP 패킷]
위 이미지를 보면 출발지 IP가 모두 다른것을 볼 수 있다.
[SYN Scan 원리]
1. SYN flag를 설정하고, 대상 호스트:포트로 전송
2. 해당 포트가 닫혀있다면, RST/ACK 패킷을 전송해옴
3. 해당 포트가 열려있다면, SYN/ACK 패킷을 전송해옴
해당 스크립트 구현은 scapy 네트워크 모듈로 구현 하였음.
아래 이미지는 TCP 프로토콜로 1000번 포트까지 스캔한 결과이다.
[그림 1 - 포트 스캔 결과]
아래 이미지는 스캔 대상 서버의 포트 개방 현황이다.
[그림 2 - 스캔 대상 컴퓨터의 개방된 포트 현황]
두 이미지를 살펴보면 스캔 결과가 올바르게 나오는 것을 확인 할 수 있다.
아래 이미지는 포트스캔 패킷 캡쳐 화면이다.
[그림 3 - 포트 스캔 패킷 캡쳐 화면]
해당 스크립트는 출발지 포트를 랜덤으로 설정하였기에 포트번호가 모두 다른 것이며, SYN 패킷을 보내고 닫혀 있는 포트에 대해서는 RST/ACK 패킷을 받는 것을 볼 수 있다.
python에서 지원하는 FTPlib 모듈을 이용하여 작성하였다.
[그림 1 - 클라이언트에서패스워드 찾은 장면]
[그림 2 - 서버에서 로그인 확인 장면]