
Pig (Packet intruder generator로 이해될 수 있습니다)는 Linux 패킷 제작 도구입니다.
Pig를 사용하여 IDS/IPS 등 다른 것들을 테스트할 수 있습니다.
Pig는 즉시 사용 가능한 잘 알려진 공격 시그니처 모음을 제공하며, 필요에 따라 이 컬렉션을 더 구체적인 항목으로 확장할 수 있습니다.
현재까지는 TCP, UDP, ICMP 기반의 전송 계층을 가진 IPv4 시그니처를 만들 수 있습니다.
또한 ARP 프로토콜 기반의 시그니처를 만들 수 있으며, Ethernet 프레임부터 패킷을 구성할 수도 있습니다.
여기에 2600 잡지의 SPRING 2016 호에 실린 제 기사로 오셨다면, 이 작은 Pig가 그 이후로 계속 진화해 왔으므로 다음 문서 섹션을 계속 읽어보시기 바랍니다.
매우 간단합니다:
[email protected]:~/src# git clone https://github.com/rafael-santiago/pig pig
[email protected]:~/src# cd pig
[email protected]:~/src/pig# git submodule update --init
pig를 빌드하려면 Hefesto를 사용해야 합니다. Hefesto를 시스템에서 작동시키는 단계를 따르십시오. 그런 다음 pig의 하위 디렉토리 src로 이동하여 다음 명령을 실행하십시오:
[email protected]:~/src/pig/src# hefesto
이 명령 후에 src/bin 경로에서 pig 바이너리를 찾을 수 있습니다. src/bin에서 상대 경로로 바이너리를 사용하거나 설치할 수 있습니다.
어떤 이유로 빌드 문제가 발생한다면 BUILD.md에 있는 몇 가지 설명을 읽어보시기 바랍니다.
설치하려면 src 하위 디렉토리 안에 있어야 하며 다음을 호출하십시오:
[email protected]:~/src/pig/src# hefesto --install
제거하려면 src 하위 디렉토리 안에서 다음을 호출하십시오:
[email protected]:~/src/pig/src# hefesto --uninstall
Pigsty 파일은 패킷 시그니처 집합을 정의할 수 있는 일반 텍스트 파일입니다. 따라야 할 특정 구문이 있습니다. pigsty 파일의 예를 살펴보십시오:
[ signature = "Hello",
ip.version = 4,
ip.ihl = 5,
ip.tos = 0,
ip.src = 192.30.70.10,
ip.dst = 192.30.70.3,
ip.protocol = 17,
udp.dst = 1008,
udp.src = 32000,
udp.payload = "Hello!!" ]
기본적으로 모든 시그니처 데이터는 대괄호 [ ... ] 사이에 있어야 합니다.
이 영역 안에서는 field = data 형식으로 정보가 제공됩니다.
컴퓨터 네트워크에 대한 경험이 있다면 표 1에 나열된 대부분의 필드가 여러분에게 의미가 있을 것입니다. 이러한 필드를 사용하여 추가 시그니처를 만드십시오.
표 1: pig 시그니처 필드.
| 필드 | 의미 | 프로토콜 | 데이터 타입 | 샘플 정의 |
|---|---|---|---|---|
signature | 시그니처 이름 | - | 문자열 | signature = "Udp flood" |
eth.hwdst | 이더넷 대상 MAC | Ethernet | MAC | eth.hwdst = "00:de:ad:be:ef:00" |
eth.hwsrc | 이더넷 소스 MAC | Ethernet | MAC | eth.hwsrc = "00:de:ad:be:ef:00" |
eth.type | 이더타입 | Ethernet | 숫자 | eth.type = 0x0800 |
eth.payload | 이더넷 페이로드 | Ethernet | 문자열 | eth.payload = "f\x00ob\x04r" |
ip.version | IP 버전 | IP | 숫자 | ip.version = 4 |
ip.ihl | 인터넷 헤더 길이 | IP | 숫자 | ip.ihl = 5 |
ip.tos | 서비스 유형 | IP | 숫자 | ip.tos = 0 |
ip.tlen | 전체 길이 | IP | 숫자 | ip.tlen = 20 |
ip.id | 패킷 ID | IP | 숫자 | ip.id = 0xbeef |
ip.flags | IP 플래그 | IP | 숫자 | ip.flags = 4 |
ip.offset | 프래그먼트 오프셋 | IP | 숫자 | ip.offset = 0 |
ip.ttl | TTL | IP | 숫자 | ip.ttl = 64 |
ip.protocol | 프로토콜 | IP | 숫자 | ip.protocol = 6 |
ip.checksum | 체크섬 | IP | 숫자 | ip.checksum = 0 |
ip.src | 소스 주소 | IP | IP 주소 | ip.src = 192.30.70.3 |
ip.dst | 대상 주소 | IP | IP 주소 | ip.dst = 192.30.70.3 |
ip.payload | IP 원시 페이로드 | IP | 문자열 | ip.payload = "\x01\x02" |
tcp.src | 소스 포트 | TCP | 숫자 | tcp.src = 80 |
tcp.dst | 대상 포트 | TCP | 숫자 | tcp.dst = 21 |
tcp.seqno | 시퀀스 번호 | TCP | 숫자 | tcp.seqno = 10202 |
tcp.ackno | 확인 응답 번호 | TCP | 숫자 | tcp.ackno = 10200 |
tcp.size | TCP 길이 | TCP | 숫자 | tcp.size = 4 |
tcp.reserv | TCP 예약 필드 | TCP | 숫자 | tcp.reserv = 0 |
tcp.urg | TCP urg 플래그 | TCP | 비트 | tcp.urg = 0 |
tcp.ack | TCP ack 플래그 | TCP | 비트 | tcp.ack = 1 |
tcp.psh | TCP psh 플래그 | TCP | 비트 | tcp.psh = 0 |
tcp.rst | TCP rst 플래그 | TCP | 비트 | tcp.rst = 0 |
tcp.syn | TCP syn 플래그 | TCP | 비트 | tcp.syn = 0 |
tcp.fin | TCP fin 플래그 | TCP | 비트 | tcp.fin = 0 |
tcp.wsize | TCP 윈도우 크기 | TCP | 숫자 | tcp.wsize = 0 |
tcp.checksum | 체크섬 | TCP | 숫자 | tcp.checksum = 0 |
tcp.urgp | 긴급 포인터 | TCP | 숫자 | tcp.urgp = 0 |
tcp.payload | 페이로드 | TCP | 문자열 | tcp.payload = "\x01abc" |
udp.src | 소스 포트 | UDP | 숫자 | udp.src = 53 |
udp.dst | 대상 포트 | UDP | 숫자 | udp.dst = 7 |
udp.size | UDP 길이 | UDP | 숫자 | udp.size = 8 |
udp.checksum | 체크섬 | UDP | 숫자 | udp.checksum = 0 |
udp.payload | 페이로드 | UDP | 숫자 | udp.payload = "boo!" |
icmp.type | ICMP 유형 | ICMP | 숫자 | icmp.type = 0 |
icmp.code | ICMP 코드 | ICMP | 숫자 | icmp.code = 0 |
icmp.checksum | 체크섬 | ICMP | 숫자 | icmp.checksum = 0 |
icmp.payload | 페이로드 | ICMP | 문자열 | icmp.payload = "ping!" |
arp.hwtype | ARP 하드웨어 유형 | ARP | 숫자 | arp.hwtype = 0x1 |
arp.ptype | ARP 프로토콜 유형 | ARP | 숫자 | arp.ptype = 0x0800 |
arp.hwlen | ARP 하드웨어 길이 | ARP | 숫자 | arp.hwlen = 6 |
arp.opcode | ARP 연산 코드 | ARP | 숫자 | arp.opcode = 2 |
arp.hwsrc | ARP 소스 하드웨어 주소 | ARP | MAC | arp.hwsrc = "de:ad:be:ef:0:0" |
arp.psrc | ARP 소스 프로토콜 주소 | ARP | IP 주소 | arp.psrc = 192.30.70.3 |
arp.hwdst | ARP 대상 하드웨어 주소 | ARP | MAC | arp.hwdst = "de:ad:be:ef:0:0" |
arp.pdst | ARP 대상 프로토콜 주소 | ARP | IP 주소 | arp.pdst = 192.30.70.3 |
시그니처를 생성할 때 모든 데이터를 지정할 필요는 없습니다. 가장 관련성 높은 패킷 부분만 지정하면 나머지 부분은 기본값으로 채워집니다. 체크섬은 항상 다시 계산됩니다.
팁: pigsty 하위 디렉토리를 살펴보십시오. 많은 시그니처 파일을 찾을 수 있으며 새 파일을 정의하는 것이 매우 간단하다는 것을 알게 될 것입니다.
네, 가능합니다. 이 기능을 사용하려면 표 2에 나열된 값을 ip 주소 유형 필드에 지정하기만 하면 됩니다.
표 2: 지리적 영역별 IP.