
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 시그니처 필드.
시그니처를 생성할 때 모든 데이터를 지정할 필요는 없습니다. 가장 관련성 높은 패킷 부분만 지정하면 나머지 부분은 기본값으로 채워집니다. 체크섬은 항상 다시 계산됩니다.
팁: pigsty 하위 디렉토리를 살펴보십시오. 많은 시그니처 파일을 찾을 수 있으며 새 파일을 정의하는 것이 매우 간단하다는 것을 알게 될 것입니다.
네, 가능합니다. 이 기능을 사용하려면 표 2에 나열된 값을 ip 주소 유형 필드에 지정하기만 하면 됩니다.
표 2: 지리적 영역별 IP.
| 사용할 값 | 의미 |
|---|
IP 주소 유형 필드에서 값으로 user-defined-ip를 사용해야 합니다. 이 경우 명령줄 옵션 --targets를 사용해야 합니다. 자세한 내용은 pig 사용 섹션을 참조하십시오.
자신의 환경 외에도 관련성이 있다고 판단되는 pigsty 파일을 만든 경우, 이러한 유용한 파일을 포함시키기 위해 풀 리퀘스트를 열어주십시오. 미리 감사드립니다!
Pig 사용법은 매우 직관적이며 다음 네 가지 기본 옵션을 제공해야 합니다:
--signatures--gateway--net-mask--lo-iface각 옵션에 대해 더 알고 싶으신가요?... 그럼 시작해 보겠습니다:
--signatures 옵션은 pigsty 파일의 파일 경로 목록을 받습니다.--gateway 옵션은 게이트웨이 주소를 지정하는 곳입니다. pig가 이더넷 프레임도 생성(또는 생성하려고 시도)한다는 점에 유의하십시오. 따라서 게이트웨이 주소는 계층 1 데이터를 올바르게 구성하는 데 매우 중요합니다.--net-mask 옵션은 라우팅 문제를 위해 네트워크 마스크를 받습니다.--lo-iface 옵션은 생성된 패킷을 "내보낼" 로컬 네트워크 인터페이스의 이름을 지정하는 곳입니다.--no-gateway 옵션은 어떤 패킷도 네트워크 외부로 보내지 않음을 나타냅니다.DDos 기반 트래픽을 생성한다고 가정해 보겠습니다:
[email protected]:~# pig --signatures=pigsty/ddos.pigsty\
> --gateway=10.0.2.2\
> --net-mask=255.255.255.0 --lo-iface=eth0
이제 모든 것을 엉망으로 만들고 싶다면:
[email protected]:~# pig --signatures=pigsty/ddos.pigsty,pigsty/attackresponses.pigsty,\
> pigsty/badtraffic.pigsty,pigsty/backdoors.pigsty\
> --gateway=10.0.2.2 --net-mask=255.255.255.0 --lo-iface=eth0
이를 위해 --timeout=<밀리초> 옵션을 사용하십시오.
--no-echo 옵션을 사용하십시오.
--targets 옵션을 사용하십시오. 정확한 IP, IP 마스크 및 CIDR을 기반으로 목록을 지정할 수 있습니다.
다음 예를 참조하십시오:
[email protected]:~# pig --signatures=pigsty/local-mess.pigsty\
> --targets=192.30.70.3,192.30.70.*,192.30.70.0/9\
> --gateway=10.0.2.2\
> --net-mask=255.255.255.0\
> --lo-iface=eth0
로드된 시그니처가 현재 네트워크 외부로 데이터를 보내지 않을 때 유용합니다. 이를 플래그로 지정하려면 --no-gateway 옵션을 사용해야 합니다. --no-gateway 옵션을 사용하면 게이트웨이 주소를 지정할 필요가 없습니다. 패킷이 현재 세그먼트 외부로 흐르지 않기 때문입니다. 결과적으로 네트워크 마스크를 알리는 것도 무의미해집니다.
예를 들어:
[email protected]:~# pig --signatures=pigsty/local_traffic.pigsty --no-gateway --lo-iface=eth2
위의 예에서 이더넷 프레임은 더 이상 pig의 책임이 아닙니다. 따라서 pig는 --gateway 및 --net-mask 옵션이 없다고 불평하지 않습니다.
--no-gateway 옵션은 ARP 트래픽을 생성해야 하는 경우에 매우 유용합니다. pig를 사용한 ARP 스푸핑 수행에 대한 다른 문서를 참조하십시오.
하나의 시그니처만 전송한 후 호출자에게 돌아와서 어떤 일이 발생했는지 확인해야 할 수도 있습니다. 이러한 요구 사항은 이 애플리케이션을 시스템 테스트 또는 단위 테스트 지원 도구로 사용할 때 일반적입니다. 따라서 이 작업을 수행해야 하는 경우 --single-test 옵션을 사용해 보십시오:
[email protected]:~# pig --signature=pigsty/syn-scan.pigsty --targets=127.0.0.1 --single-test\
> --gateway=10.0.2.2 --net-mask=255.255.255.0 --lo-iface=eth0
이 명령을 실행한 후 pig는 syn-scan.pigsty 파일에서 하나의 시그니처만 선택하여 전송을 시도한 후 종료됩니다. 프로세스 중에 오류가 발생하면 pig는 종료 코드 1로 종료되고, 그렇지 않으면 pig는 종료 코드 0으로 종료됩니다.
기본 pig의 작동 모드는 사전 정의된 타임아웃을 존중하며 네트워크에 수많은 패킷을 쏟아내는 무한 루프입니다.
전송을 위해 로드된 패킷을 pig가 순회하는 방식을 옵션 --loop=<모드>를 사용하여 정의할 수 있습니다. 현재까지 모드는 두 가지입니다: random(기본값)과 sequential.
sequential 모드는 로드된 패킷 시그니처 목록의 끝에 도달하면 시그니처를 다시 반복합니다.
하위 작업은 패킷 제작과 관련된 유용한 작은 작업으로, 제작 세션을 도와주기 위해 pig에 포함되어 있습니다. 이러한 작업은 --sub-task=<작업 이름> 옵션을 사용하여 액세스할 수 있습니다.
실질적으로 하위 프로그램이기 때문에 하위 작업마다 고유한 특성이 있으며, 이에 대한 세부 사항은 각각의 매뉴얼에 나와 있습니다. 이에 대한 내용은 표 3을 참조하십시오.
표 3: pig 하위 작업.
현재까지는 전송 계층에 UDP 또는 TCP가 있는 IPv4 기반 패킷을 구성할 수 있습니다. 또한 ARP 패킷을 구성할 수 있습니다.
그러나 Ethernet 프레임부터 시작하여 패킷을 구성할 수도 있습니다. 좋은 점은 Ethernet 페이로드 위에 사실상 모든 것을 구성할 수 있다는 것입니다.
예를 들어, pig가 현재 cooked IPv6 구성을 지원하지 않지만, 원시 Ethernet 기반 pigsty를 사용하여 구성할 수 있습니다. 다음 예를 참조하십시오:
[ eth.hwdst = "5C:AC:4C:AA:F5:B5",
eth.hwsrc = "08:95:2A:AD:D6:4F",
eth.type = 0x86DD,
eth.payload = "\x60\x00\x00\x00\x00\x20\x3a\xff\xfe\x80\x00\x00\x00\x00\x00\x00\x0a\x95\x2a\xff\xfe\xad\xd6\x4f\xfe\x80\x00\x00\x00\x00\x00\x00\x55\x51\x00\xc2\x18\x0f\xdb\x46\x88\x00\x32\x01\xe0\x00\x00\x00\xfe\x80\x00\x00\x00\x00\x00\x00\x0a\x95\x2a\xff\xfe\xad\xd6\x4f\x02\x01\x08\x95\x2a\xad\xd6\x4f",
signature = "IPv6 from Sparta" ]
"Ethernet pigsty" 내에 대상 및 소스 MAC 주소를 포함하는 것은 선택 사항이므로, "plush field"를 사용하지 않고도 작업을 완료할 수 있습니다.
이는 환경에서 새로운 프로토콜을 테스트하거나 기타 변칙적인 재미있는 작업을 수행해야 할 때 유용합니다. 이러한 원시 방식으로 pig는 계속 유용하게 사용할 수 있습니다.
다음 데이터를 "oink.pigsty"로 저장하십시오:
[ signature = "oink",
ip.version = 4,
ip.ihl = 5,
ip.tos = 0,
ip.src = 127.0.0.1,
ip.dst = user-defined-ip,
ip.protocol = 17,
udp.dst = 1008,
udp.src = 32000,
udp.payload = "Oink!!\n" ]
다른 tty에서 UDP 모드로 netcat을 실행하여 포트 1008에서 연결을 수신 대기합니다:
[email protected]:~# nc -u -l -p 1008
이제 "oink.pigsty"를 사용하여 pig를 실행하고, 대상으로 loopback을 지정합니다:
[email protected]:~# pig --signatures=oink.pigsty --targets=127.0.0.1\
> --gateway=10.0.2.2 --net-mask=255.255.255.0 --lo-iface=eth0
netcat은 여러 번의 oink를 수신하기 시작할 것입니다. 축하합니다!! pig가 시스템에서 실행 중입니다! ;)
네트워크를 스니핑하여 인터페이스 주변에서 흐르는 이러한 UDP 패킷에 대한 더 많은 정보를 얻어 보십시오...
즐거운 시간 되세요!
| 필드 | 의미 | 프로토콜 | 데이터 타입 | 샘플 정의 |
|---|
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 |
north-american-ip | 북미의 IP 주소 |
south-american-ip | 남미의 IP 주소 |
asian-ip | 아시아의 IP 주소 |
european-ip | 유럽의 IP 주소 |
| 하위 작업 | 수행 기능 | 매뉴얼 |
|---|
pcap-import | PCAP 파일에서 pigsty 파일로 패킷 가져오기 | cat doc/pcap-import.md |
shell | 대화형 모드에서 pig 실행 | cat doc/shell.md |