1. nmap
- nmap은 가장 유명한 포트 스캔 툴인 만큼 네트워크 스캐닝 툴 중에서 쉽고 유연하며 강한 기능을 제공한다
- 연결된 ip 주소들을 스캔할 수도 있고 ip를 인자로 주지 않고 도메인을 지정할 수도 있다
- 포트 스캔을 실시하면 nmap은 대상 서버에 포트 번호를 다르게 하여 SYN 패킷을 보낸다
- 열려있는 포트에서는 SYN/ACK 패킷이 돌아오며 이를 통해 TCP 프로토콜에서의 3 way handshake를 확인할 수 있다
- RST를 보내 연결을 끊어버리는 완전한 연결을 맺지 않은 하프스캔도 확인 가능하다
- 많이 사용하는 NMAP 명령어 옵션
-sT : connect() 함수를 이용한 open스캔(TCP를 이용하여 완전한 연결을 한다.)
-sS : 세션을 성립하지 않는 SYN스캔
-sF : FIN패킷을 이용한 스캔
-sN : NULL값을 이용한 스캔
-sX : X-MAS 패킷을 이용한 스캔
-sP : Ping을 이용한 스캔
-sU : UDP 포트 스캔
--top-port [Number] : 가장 많이 사용하는 포트 [Number]개
✅TCP, UDP 외에도 Ethernet/IP 스캐닝을 위해
$ nmap -Pn -sU -p44818 --script enip-info <target>
✅이런 명령어로 제품의 정보 등을 캐낼 수 있다
❗Ethernet/IP 기기 일부는 TCP 포트 44818에서 명시적, UDP 포트 2222에서 함축적 메시징
✖️NPING, Netcat, Npcap 등 포함
2. Packet Generator
1. Ostinato
- 가장 잘 알려진 패킷 생성기 툴 중 하나로 편리한 GUI와 필요한 모든 기능을 제공한다
- 포트를 지정하여 해당 포트로 패킷을 전송 (UDP, Ethernet)

2. Trex
- TRex는 리눅스 기반 패킷 생성기로 python으로 구동하기 때문에 자동화 검사와 네트워크 기기의 디버깅에 유용하다
- 거의 모든 트래픽을 생성할 수 있고 large-scale DDOS 공격과 TCP-SYN, UDP, ICMP 등을 스트림할 수 있다
3. Snort
- 실시간 트래픽 분석과 패킷 로깅을 수행하는 네트워크 침입 탐지 시스템 (IDS)
- 윈도우, 리눅스 호환
- 패킷 스니퍼
- 패킷 로거
- 네트워크 침입탐지(IDS/IPS)
- 액션, 프로토콜, 송수신 등을 지정하여 룰을 생성할 수 있다
- Action: 탐지 후 행동들
alert : 경고를 발생시킨다.
log : 로그를 기록한다.
pass : 패킷을 무시한다.
active : alert를 발생시키고 대응하는 dynamic을 유효화 한다.
dynamic : active에 의해 유효화된 경우 한쪽의 패킷을 기록한다.
drop : 패킷을 차단하고 기록한다.
- Protocol: 탐지 할 프로토콜 종류
TCP : TCP 탐지
UDP : UDP 탐지
ICMP : ICMP 탐지
IP : IP 탐지
- 송신 IP & PORP
any : 모든 포트
포트번호 : 특정 포트
포트번호:포트번호 : 포트번호 ~ 포트번호
:포트번호 : 포트번호 이하 모든 포트
포트번호: : 포트번호 이상 모든 포트
예시
211.11.22.33 80
211.11.22.0/24 443
any 80
211.11.22.33 any
any any
'$HOME_NET' 와 같이 snort.conf에서 지정한 변수를 참조할 수도 있다.
- Direction
-> : 출발지 -> 목적지 패킷 탐지
<> : 출발지 목적지 사이 모든 패킷 탐지
- 위는 룰 헤더 정보이며 바디에는 패킷 탐지를 위한 사용자 설정이 담긴다
- 세미콜론으로 옵션들을 구분
- 일반옵션 설정
msg : alert 발생 시 이벤트 명
sid : 스노트 룰 ID
99이하 : 시스템 예약 ID
100 ~ 1000000 이하 : snort 자체지정 sid
1000001 이상 : 사용자 정의 sid
rev : 룰 수정횟수 수정 시 숫자가 증가
- 페이로드 범위 설정
dsize : dzise:<바이트, dsize:바이트<>바이트 와 같이 상한선, 하한선, 범위를 지정할 수 있다.
content : 문자, 바이너리로 패턴을 탐지한다.
content: "문자"
content: | 00 01 0A AA |
content: "| 90 90 90 | /bin/sh"
offset : 검색을 시작할 byte수를 지정한다.
depth : offset부터 시작하여 검색할 byte수를 지정한다.
nocase : 대소문 자를 구별하지 않는다.
flags : TCP 제어 플래그를 지정한다. F, S, FA, FSA 등으로 지정 가능하다.
pcre : 정규식을 사용한다.
- threshold : 패킷의 발생량을 기반으로 탐지한다.
아직까지 흔히 사용 되고 있지만 공식적으론 사용을 권장하지 않는다.
비슷한 기능을 하진 detection_filter 사용이 권장된다.
type limit(로그발생기준: 임계값), threshold(로그발생기준: 패킷량), both(로그발생기준:IP)
track by_src , by_dst
count n : number events used by the thresholding
seconds m : time period over which count is accrued.
스노트 예제
- alert tcp any any < > any ①[443,465,523] (②content:"|18 03 00|"; depth: 3; ③content:"|01|"; distance: 2; within: 1; ④content:!"|00|"; within: 1; ⑤msg: "SSLv3 Malicious Heartbleed Request V2"; sid:1;)
- 목적지 포트는 443번, 465번, 523번 포트로 지정한다.
- 3byte 내에 18 03 00 바이너리 값이 있는지 검사한다.
- 첫번째 컨텐츠 2byte 떨어진 곳에서 1byte 범위 내에 01 바이너리 값이 있는지 검사한다.
- 두번째 컨첸츠 끝난 위치에서 1byte 내에 00 바이너리 값이 없는지 검사한다.
- alert 알림명으로 SSL~V2를 쓴다.
- sid번호 (스노트 룰 번호)는 1로 지정한다.
cpppo
python3 -m cpppo.server.enip.list_services -vv -a 10.0.1.10 --list-identity
- 위처럼 cpppo.server.enip 패키지를 사용하며 PLC를 파이썬 라이브러리를 이용한 명령어로 조회 및 수정을 할 수 있다
- Cpppo.server.enip 패키지는 EtherNet/IP CIP 언어를 이용한 요청을 parse하는 파이썬 프로그램을 만드는데 사용된다 (as a server)
- 혹은 해당 프로토콜로 요청을 만들어 내기도 한다 (as a client)
scapy
✖️ sniff()를 이용한 패킷 덤프, show()를 이용한 패킷 조회, send()/sr() 함수를 이용한 패킷 전송과 응답 수신, 반복 송신 loop기능 그리고 포트 스캔 기능까지!