본문 바로가기

개발

[Python][자동화] ICMP Type 및 Code 별 전송

1.개발 결과

 스크립트 동작으로, 점검 서버와 클라이언트 간 네트워크 구조 상 ICMP Type 및 Code 별 전송이 가능하였다. 실상 많은 노력이 들어간 형태는 아니지만, 차후 ICMP 패킷을 수동 조작하는 도구(과거 패킷 조작 도구)를 이용한 방법을 개선할 수 있었다.

1) 실행 결과

 - python 화면

단순하게 py 파일로 실행하도록 일단 구성하였다.

 - WireShark 패킷 캡쳐 화면

설정된 ICMP Type 과 ICMP Code으로 ICMP 패킷이 전송됨을 알 수 있다.

2) 목적 달성도 (90%)

  현재, ICMP 패킷을 수동으로 매번 입력하는 부분을 py 파일을 이용한 스크립트화로 개선하였기에, 반복 작업의 소요 시간을 단축 할 수 있었다.  다만 몇 가지 조건의 아쉬운 부분은 차후 필요할 시 개선이 필요하다. 

 ■ 점검대상 IP를 사용자가 직접 입력하도록 args 형태로의 구현

 ■ py 파일로 실행됨에 따른 python 및 scapy 설치 필요

 

2.개발 목적

 ICMP Type 및 Code 별 전송되는 패킷의 자동 생성

3.개발 사유

 ICMP 관련 진행사항으로 hping3 명령어 또는 패킷 조작 도구에서 수동으로 Type 및 Code를 입력하는 단순 반복 작업이 필요하거나 진행하는 부분을 확인

 

  현재 필요한 사항은 "ICMP Type 및 Code 별로 패킷을 전송"만 필요함에 따라, 스크립트 파일을 작성하여 한 번에 끝내도록 하는데 목적을 가짐

4.설계 단계

네트워크 패킷 조작 모듈 "SCAPY"를 이용하여 ICMP 패킷을 조작할 수 있도록 계획

 

1단계 : ICMP 패킷 내 Type 및 Code 설정

 ■ ICMP Type 및 Code는 RFC 792 문서 참조

 

2단계 : SCAPY를 통해 ICMP 패킷을 전송할 함수 구현 (Function)

5.구현 단계

 1) 소스코드 및 기능 설명

  - python scapy 설정

from scapy.all import *

 

 - IP 설정

# SRC/DST IP
ip_src = ""
ip_dst = ""

 

 - ICMP Type 및 Code 설정 : Type 및 Code는 RFC 792 내역을 참조

# ICMP Type and Code List
ICMP_Type_List = [0, 3, 4, 5, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]

# Type Default Code : 0
ICMP_Code_List = [0]
# Type 3 : Destination Unreachable
ICMP_3_List = [0, 1, 2, 3, 4, 5] 
# Type 5 : Redirect
ICMP_5_List = [0, 1, 2, 3]
# Type 11 : Time Exceeded
ICMP_11_List = [0, 1]

 

 - ICMP 패킷 전송 함수 구현

# ICMP Function
def ICMP_SEND(ip_src, ip_dst, icmp_type, icmp_code):
    # Create the IP and ICMP layers
    ip_layer = IP(src=ip_src, dst=ip_dst)
    icmp_layer = ICMP(type=icmp_type, code=icmp_code)
    # Combine The IP and ICMP
    packet = ip_layer/icmp_layer

    #send the ICMP Packet
    send(packet)

 

- ICMP Type 및 Code 별 패킷 전송 방식 구현

# ICMP Send Start
for ICMP_Type_item in ICMP_Type_List:
    try:
        # Type 3 : Destination Unreachable
        if ICMP_Type_item == 3:
            for ICMP_Code_item in ICMP_3_List:
                result = ICMP_SEND(ip_src, ip_dst, ICMP_Type_item, ICMP_Code_item)
                print(result)
        # Type 5 : Redirect
        elif ICMP_Type_item == 5:
            for ICMP_Code_item in ICMP_5_List:
                result = ICMP_SEND(ip_src, ip_dst, ICMP_Type_item, ICMP_Code_item)
                print(result)
        # Type 11 : Time Exceeded
        elif ICMP_Type_item == 11:
            for ICMP_Code_item in ICMP_11_List:
                result = ICMP_SEND(ip_src, ip_dst, ICMP_Type_item, ICMP_Code_item)
                print(result)
        # Default Code 0 
        else:
            for ICMP_Code_item in ICMP_Code_List:
                result = ICMP_SEND(ip_src, ip_dst, ICMP_Type_item, ICMP_Code_item)
                print(result)
    except:
        print("[Error Type : Type %s]" % ICMP_Type_item)

 2) 구현단계에서 발생된 문제점 및 해결 방법

 - 단순 코드임으로, 해당사항 없음