ICMP 터널링 서버에서 자동화로 받는 방법으로 업데이트를 진행했습니다. 이전의 내용은 ICMP Tunneling 1편을 참고 부탁드립니다.
목적
내부망에서 논리적 망분리가 되어있어도 두 HOST간 ping이 가능할 때 ICMP Tunneling으로 데이터 전송을 할 수 있습니다. Send HOST와 Recieve HOST에서 파이썬 스크립트를 이용하여 주고 받는 자동화 스크립트를 만들었습니다.
환경
Send Host : 192.168.0.2 (Window) Recieve Host : 192.168.0.5 (MAC)
Send File
전달한 파일은 pdf 파일이며 용량은 329KB입니다.
send.py를 실행 시 파일의 용량을 계산하여 ICMP 패킷의 갯수를 정하고 패킷을 전송합니다. 해당 파일은 376개의 ICMP 패킷이 전송되었습니다.
Recieve File
Recieve Host에서 결과를 받는 스크립트를 실행 결과 376개의 loss 패킷 없이 ICMP 패킷을 받아서 icmp.pdf 파일로 저장이 됩니다.
loss 패킷 없이 패킷이 전부 전송이 되었다면 파일이 잘 조립되는 것을 확인할 수 있습니다.
Loss Packet
만약에 로스패킷이 발생되면 어떻게 되는지 확인해봅시다. data_list[14, 136]`을 확인하여 15번째, 137번째의 패킷이 loss 된것을 확인할 수 있습니다.
Send Host에서 –loss 옵션을 주어 15번째, 137번째의 패킷을 전송이 가능합니다.
Recieve HOST를 다시보면 패킷이 보내질때마다 data_list[14, 136]`이 하나씩 없어지고 data_list[] 가 [] 값이 비어있으면 패킷이 조립되어 파일이 생성되는 것을 확인할 수 있습니다.
Issue
ICMP 헤더의 seq는 16비트(2바이트)으로 최대 65535개의 패킷만 가능합니다. 즉 send를 할때 패킷 카운터가 65535가 넘을 경우 에러가 발생하니 패킷 갯수가 최대 65535개 넘지 않도록 해야합니다.
만약 ICMP 패킷 개수가 65535개가 초과할 경우 전송할 파일을 분할 압축하여 ICMP 패킷 개수가 65535가 넘지 않도록 하나씩 전송해야합니다. TEST결과 약 50MB 파일 전송까지는 한번에 가능합니다.
Code
send.py, recieve.py` 로 구성되어있습니다. 두 HOST에 scapy 모듈이 필요합니다.
- pip install scapy
소스코드 전체는 비공개하며 필요하신분이 계시면 댓글 부탁드립니다.