Simple is IT, 누구나 보고 누구나 깨닫는 IT

SCAPY을 이용한 패킷범죄 :) 본문

Simple is IT/Network

SCAPY을 이용한 패킷범죄 :)

currenjin 2020. 4. 26. 21:39

SCAPY

네트워크 패킷을 보내고, 빼았고 패킷을 위조할 수 있는 프로그램 (Python)

SCAPY의 주요 특징

Send, Receive 기능을 사용 할 수 있고 둘 다 사용 가능하기도 하다.

DataLink Layer Frame, Network Layer Packet을 전송할 수 있다.

p0f()와 arpachepoison과 같은 고레벨 함수로 보안 도구들이 하는 대부분의 일을 할 수 있다.

응답은 쉽게 분해하고 재사용 할 수 있다.

설치 경로

: git clone https://github.com/secdev/scapy.git

시작은 간단하다.

--> 불러들인 scapy directory 속의 run_scapy 파일을 실행한다. (관리자 권한 필수)

scapy의 설정들이 어떻게 되어있는지 확인해보자.

>>> conf

ASN1_default_codec = <ASN1Codec BER[1]>

AS_resolver = <scapy.as_resolvers.AS_resolver_multi object at 0x7f6eb8db5978>

BTsocket = <BluetoothRFCommSocket: read/write packets on a connected L2CAP...

L2listen = <L2ListenSocket: read packets at layer 2 using Linux PF_PACKET ...

L2socket = <L2Socket: read/write packets at layer 2 using Linux PF_PACKET ...

L3socket = <L3PacketSocket: read/write packets at layer 3 using Linux PF_P...

L3socket6 = functools.partial(<L3PacketSocket: read/write packets at layer ...

...

crypto_valid_advanced = False

debug_dissector = False

debug_match = False

debug_tls = False

default_l2 = <class 'scapy.packet.Raw'>

dot15d4_protocol = None

emph = <Emphasize []>

except_filter = ''

extensions_paths = '.'

fancy_prompt = True

geoip_city = None

histfile = '/root/.scapy_history'

iface = 'ens33'

...

wepkey = ''

내용들이 많다. 해당 설정정보를 바꾸고자 한다면 그냥 값을 입력해주면 된다.

>>> conf.iface='eth1' // 간단하다.

Layer List

>>> ls() // 괄호 안에 TCP, IP 등의 프로토콜을 삽입하면 해당 프로토콜의 필드를 보여준다.

AH : AH

AKMSuite : AKM suite

ARP : ARP

BOOTP : BOOTP

BTLE_DATA : BTLE data header

BTLE_PPI : BTLE PPI header

BTLE_RF : BTLE RF info header

BTLE_SCAN_REQ : BTLE scan request

BTLE_SCAN_RSP : BTLE scan response

CookedLinux : cooked linux

CtrlPDU : CtrlPDU

DHCP : DHCP options

DHCP6 : DHCPv6 Generic Message

...

TIP: You may use explore() to navigate through all layers using a clear GUI

나의 경로 상에 존재하는 pcap 파일을 읽어들이는 명령이다.

>>> a=rdpcap("test.pcap")

>>> a

<test.pcap: TCP:5543 UDP:347 ICMP:0 Other:197> // 다음과 같은 결과가 출력된다.

테스트 환경의 구성

구성도

해당 라우터의 running config 이며 라우팅까지 마친 상태이다.

Host에서의 Ping Test도 원활한 상태

위와 같은 환경에서 여러 테스트를 진행해보자.

send() 명령을 이용해 패킷을 전송

Host에서 출발지 주소를 조작해 Ping // Ping의 프로토콜은 ICMP이다.

정상적으로 패킷이 전송이 된 상태이다.

WireShark의 캡쳐화면을 보았을 때 Ping에 대한 요청은 정상적으로 이루어져있다.

하지만 응답을 하는 과정에서 ARP Type의 통신이 정상적으로 이루어지지 않는다.

WHY?

--> 간단하다. 요청을 받았던 192.168.10.20에게 응답을 하려 했으나 해당하는 IP의 MAC주소를 알지 못 하기 때문이다.

그렇다면 우린 이렇게 생각할 수 있다.

출발지를 사용하고있는 IP로 조작해 Ping을 해보자.

일단 정상적으로 패킷을 보낸 상황

WireShark의 캡쳐화면이다.

요청과 응답이 아주 순조롭게 이루어져있다.

웃긴 상황이다.

해당 IP를 소유하고 있는 Router의 입장에서는 보내지도 않은 요청에 대한 응답을 받고있는 격이다.

출발지 IP를 Router 상단의 GW주소로 변경해보았을 때

마찬가지로 Router가 요청에 대한 응답이 GW를 향한다. ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ



Comments