scapy는 파이썬 기반의 패킷 생성, 조작 및 스니핑, 스캐닝 등 상황에 따라 유연하게 활용 할 수 있는 툴이다.
설치 링크 :
http://www.secdev.org/projects/scapy/
http://www.secdev.org/projects/scapy/doc/installation.html#platform-specific-instructions
찾아보니 좋은 문서와 자세히 정리된 글이 있어 간단하게만 정리한다.
[그림 1] scpay 시작 화면
테스트 환경은 BT5R3에서 진행하였다. scapy 명령어 입력 시 [그림 1]과 같은 프롬프트 창이 출력되고 이 상태에서 파이썬 프로그래밍을 하거나 간단한 패킷을 생성할 수 있다. scapy의 종료는 exit().
[그림 2] scapy 설정 화면
conf 명령어 입력 시 scapy의 설정을 변경 할 수 있다. conf.iface = 'eth0' 과 같은 형식으로 수정하면 된다. ls()는 사용 가능한 프로토콜의 리스트를 출력한다. lsc() 사용 가능한 옵션을 출력한다.
패킷의 생성은 크게 두가지 방법으로 가능하다. 한가지는 패킷을 레이어링 한 후 변수에 저장하는 것이고 다른 하나는 send나 sr등의 옵션 시 간단히 생성하는 방법이 있다.
[그림 3] 변수 생성
[그림 3]은 IP패킷과 TCP 패킷을 레이어링 하여 test 변수에 저장한 것이다. scapy의 가장 큰 장점은 이렇듯 2~3계층의 프로토콜을 자유로이 레이어링이 가능하다는 것이다. test 변수를 출력하면 아래 그림과 같다.
[그림 4] test 변수 출력
[name].display() 형식으로 변수 출력이 가능하다. 변수 이름만 입력하면 간단하게 내용이 출력된다. [그림 4]는 test 변수를 출력한 결과이다. 현재는 기본으로 설정된 값이 저장되있다.
변수에 저장된 패킷을 설정하기 위해선 [name].[variable] = "value" 형식으로 값을 지정하면 된다.
[그림 5] test 패킷 설정 변경
위의 그림의 명령어를 사용하여 source, destination IP를 변경하였다. 이외에도 IP의 flag, identification, ttl, checksum 그리고 TCP의 flag, window size, sequence number, port 등 해당 프로토콜의 모든 값에 대해 조작이 가능하다. 또, 자동으로 IP주소로 변환되기 때문에 destination을 도메인 명으로 입력 가능하다.
[그림 6] 패킷 전송
send()함수를 이용하여 변수에 저장된 값의 패킷을 전송 할 수 있다.
[그림 7] 수신 패킷 내용
[그림 7]은 1.1.1.3에서 수신한 패킷의 내용으로 scapy를 이용해 전송한 패킷의 내용과 동일 함을 알 수 있다.
send()함수 외에 sr(), srp()함수를 이용하여 패킷을 전송 할 수 있다. 다만 sr() 함수는 전송한 패킷의 응답 까지 받으며 sr1() 함수는 단 하나의 응답만을 받는다. srp()함수는 2계층의 패킷을 전송하고 응답을 받으며 srp1() 또한 단 하나의 응답만을 받는다.
[그림 8] RandIP(), fuzz()
src, dst IP 그리고 MAC 주소와 더불어 패킷의 내용까지 랜덤한 값으로 설정이 가능하다. [그림 8]에서는 RandIP()함수를 이용하여 src IP를 랜덤으로 지정하였고 fuzz()함수를 통해 TCP패킷의 값을 임의로 설정하였다. 마지막 loop=1로 설정함으로써 지속적인 패킷 전송을 유도하였다. count=10의 형태의 지정도 가능하다. 아래의 그림에서 모두 다른 source IP와 TCP 패킷 값을 확인 할 수 있다.
[그림 9] RandIP(), fuzz() 결과
추가적으로 scapy 에선 스니핑과 포트스캔이 가능하고 수집한 패킷을 정렬하여 볼 수 있다. 그렇지만 아직 별 필요성을 못 느껴서, 따로 정리는 하지 않았다. 부가적인 내용이 궁금하다면 아래의 링크와 문서를 참고하기 바란다.
나중에 필요하면 더 공부하고 정리해서 업데이트 하겠다.
관련 글 :
http://www.packetinside.com/search/label/scapy
관련 문서 :
'old > Network' 카테고리의 다른 글
[정리] TCP의 기능과 패킷 구조 - 1 (3) | 2013.12.26 |
---|---|
[정리] UDP의 기능과 패킷 구조 (0) | 2013.12.25 |
[정리] 스캔방식에 따른 응답 차이 (2) | 2013.12.22 |
[정리] ARP의 기능과 패킷 구조 (0) | 2013.12.18 |
[정리] Explicit Congestion Notification? (4) | 2013.12.10 |