본문 바로가기

교육/Security

Day 71 (ARP Spoofing)

반응형

<목차>

1. 목적

2. 사용 툴 & 환경

3. 실습 과정

4. 결과 확인

 

1. 목적

  이번 실습은 ARP Spoofing에 속하는 ARP redirect를 수행하는 것이다. ARP redirect를 하는 목적은 gateway로 가는 패킷을 공격자가 IP는 목적지의 IP를 그대로 사용하되, MAC 주소는 자신의 MAC주소로 하여 공격받는 쪽이 공격자를 gateway로 오인하여 패킷을 공격자가 모두 수신 가능하게 한다.

패킷 흐름 예상도

 

2. 사용 툴 & 환경

  1) Dsniff : Sniffing을 위한 자동화 동구로 가장 많이 알려진 툴이다. 스니핑을 위한 다양한 툴이 패키지처럼 구성되어 있다. Spoofing만을 단독으로는 사용하지 못하고 SniffingSpoofing을 같이 사용한다.

 

  2) Fragrouter : Sniffing의 보조도구로써 패킷릴레이를 수행한다. Sniffing에 의해 공격자가 받은 패킷이 목적지에 도달하지 못하는 상황을 방지한다.

 

  3) Arpspoof : ARP redirect 공격에 사용할 툴이다. Dsniff툴 안에 포함되어 있다.

  4) 구성 환경

  MAC주소 IP주소 OS
공격자 00-0c-29-1c-c7-bc 192.168.111.26 Cent OS 6
피해자 00-0c-29-08-87-32 192.168.111.29 Windows XP
라우터 00:0c:29:d5:f7:18 192.168.111.254 Cent OS 7

 5) 실습 목표는 피해자 장치와 라우터에 Spoofing을 하여 공격자가 패킷을 수신하게 하는것이다.

 

3. 실습 과정

gcc패키지를 설치한다.
libnet라이브러리를 설치한다.
libpcap라이브러리를 설치한다.
...
complie시 에러가 발생했다.
compile을 위한 패키지 추가 설치가 필요하다.

추가 패키지 설치가 완료되면 fragrouter의 디렉토리 하부에서 compile을 각각 수행한다.

[root@6-32 fragrouter-1.6]# cd Libnet-0.99b/
[root@6-32 Libnet-0.99b]# make clean
rm -f *.core src/*.o lib/libnet.a
if test -f test/Makefile; then \
            cd test && make clean; \
        fi
make[1]: Entering directory `/root/sniff/fragrouter-1.6/Libnet-0.99b/test'
cd Random; make clean
make[2]: Entering directory `/root/sniff/fragrouter-1.6/Libnet-0.99b/test/Random'
rm -f *.core prand_trials *.o
...
rm -f *.core get_mac *.o
make[2]: Leaving directory `/root/sniff/fragrouter-1.6/Libnet-0.99b/util/Get-mac'
make[1]: Leaving directory `/root/sniff/fragrouter-1.6/Libnet-0.99b/util'
if test -f support/bpf-lkm/etherspoof; then \
            cd support/bpf-lkm/etherspoof && make clean; \
        fi


[root@6-32 Libnet-0.99b]# ./configure
creating cache ./config.cache
checking host system type... i686-pc-linux-gnu
checking target system type... i686-pc-linux-gnu
checking build system type... i686-pc-linux-gnu
checking for gcc... gcc
checking whether the C compiler (gcc  ) works... yes
checking whether the C compiler (gcc  ) is a cross-compiler... no
checking whether we are using GNU C... yes
checking whether gcc accepts -g... yes
...
creating test/ICMP/Makefile
creating test/Random/Makefile
creating util/Makefile
creating util/Get-mac/Makefile
creating include/config.h
include/config.h is unchanged
[root@6-32 Libnet-0.99b]# make
sed -e 's/.*/#define VERSION "&"/' ./VERSION > version.h
gcc -O3 -funroll-loops -fomit-frame-pointer -pipe -Wall   -DHAVE_CONFIG_H -c src/resolve.c -o src/resolve.o
src/resolve.c: In function ‘host_lookup’:
src/resolve.c:68: warning: pointer targets in passing argument 1 of ‘sprintf’ differ in signedness
/usr/include/stdio.h:363: note: expected ‘char * __restrict__’ but argument is of type ‘u_char *’
...
ar -cr lib/libnet.a src/resolve.o src/socket.o src/checksum.o src/prand.o src/version.o src/error.o src/write_ip.o src/insert_ipo.o src/insert_tcpo.o src/error.o src/sockpacket.o src/packet_mem.o src/build_ip.o src/build_tcp.o src/build_udp.o src/build_arp.o src/build_ethernet.o src/build_icmp.o src/build_igmp.o src/build_dns.o src/build_snmp.o src/build_rip.o src/asn1.o src/hex_dump.o src/stubs.o src/if_addr.o src/arp.o src/route.o
ranlib lib/libnet.a
[root@6-32 Libnet-0.99b]# cd ../
[root@6-32 fragrouter-1.6]# cd ./libpcap-0.4/
[root@6-32 libpcap-0.4]# make clean
rm -f pcap-linux.o pcap.o inet.o gencode.o optimize.o nametoaddr.o etherent.o savefile.o bpf_filter.o bpf_image.o scanner.o grammar.o version.o libpcap.a scanner.c grammar.c version.c tokdefs.h lex.yy.c
[root@6-32 libpcap-0.4]# ./configure
creating cache ./config.cache
checking host system type... i686-pc-linux-gnu
checking target system type... i686-pc-linux-gnu
checking build system type... i686-pc-linux-gnu
checking for gcc... gcc
checking whether the C compiler (gcc  ) works... yes
...
checking for a BSD compatible install... /usr/bin/install -c
updating cache ./config.cache
creating ./config.status
creating Makefile
[root@6-32 libpcap-0.4]# make
gcc -O2 -I.  -Ilinux-include -DHAVE_MALLOC_H=1 -DHAVE_ETHER_HOSTTON=1 -DHAVE_STRERROR=1 -DHAVE_NET_IF_ARP_H=1  -c ./pcap-linux.c
gcc -O2 -I.  -Ilinux-include -DHAVE_MALLOC_H=1 -DHAVE_ETHER_HOSTTON=1 -DHAVE_STRERROR=1 -DHAVE_NET_IF_ARP_H=1  -c ./pcap.c
gcc -O2 -I.  -Ilinux-include -DHAVE_MALLOC_H=1 -DHAVE_ETHER_HOSTTON=1 -DHAVE_STRERROR=1 -DHAVE_NET_IF_ARP_H=1  -c ./inet.c
...
mv y.tab.c grammar.c
mv y.tab.h tokdefs.h
gcc -O2 -I.  -Ilinux-include -DHAVE_MALLOC_H=1 -DHAVE_ETHER_HOSTTON=1 -DHAVE_STRERROR=1 -DHAVE_NET_IF_ARP_H=1  -c ./scanner.c
gcc -O2 -I.  -Ilinux-include -DHAVE_MALLOC_H=1 -DHAVE_ETHER_HOSTTON=1 -DHAVE_STRERROR=1 -DHAVE_NET_IF_ARP_H=1  -Dyylval=pcap_lval -c grammar.c
sed -e 's/.*/char pcap_version[] = "&";/' ./VERSION > version.c
gcc -O2 -I.  -Ilinux-include -DHAVE_MALLOC_H=1 -DHAVE_ETHER_HOSTTON=1 -DHAVE_STRERROR=1 -DHAVE_NET_IF_ARP_H=1  -c ./version.c
ar rc libpcap.a pcap-linux.o pcap.o inet.o gencode.o optimize.o nametoaddr.o etherent.o savefile.o bpf_filter.o bpf_image.o scanner.o grammar.o version.o
ranlib libpcap.a
[root@6-32 libpcap-0.4]# cd ../
[root@6-32 fragrouter-1.6]# make clean
rm -f *~ *.o fragrouter
[root@6-32 fragrouter-1.6]# ./configure
loading cache ./config.cache
checking for gcc... (cached) gcc
checking whether the C compiler (gcc  ) works... yes
checking whether the C compiler (gcc  ) is a cross-compiler... no
checking whether we are using GNU C... (cached) yes
checking whether gcc accepts -g... (cached) yes
checking if the compiler understands -pipe -Wall... yes
checking for a BSD compatible install... (cached) /usr/bin/install -c
checking whether make sets ${MAKE}... (cached) yes
...
creating test/ICMP/Makefile
creating test/Random/Makefile
creating util/Makefile
creating util/Get-mac/Makefile
creating include/config.h
include/config.h is unchanged
[root@6-32 fragrouter-1.6]# make
cd ./Libnet-0.99b; make
make[1]: Entering directory `/root/sniff/fragrouter-1.6/Libnet-0.99b'
ar -cr lib/libnet.a src/resolve.o src/socket.o src/checksum.o src/prand.o src/version.o src/error.o src/write_ip.o src/insert_ipo.o src/insert_tcpo.o src/error.o src/sockpacket.o src/packet_mem.o src/build_ip.o src/build_tcp.o src/build_udp.o src/build_arp.o src/build_ethernet.o src/build_icmp.o src/build_igmp.o src/build_dns.o src/build_snmp.o src/build_rip.o src/asn1.o src/hex_dump.o src/stubs.o src/if_addr.o src/arp.o src/route.o
ranlib lib/libnet.a
...
sniff.c: In function ‘sniff_loop’:
sniff.c:131: warning: pointer targets in assignment differ in signedness
gcc -pipe -Wall -g -O2 -I./libpcap-0.4 -I./Libnet-0.99b/include   -c -o tcp_seg.o tcp_seg.c
gcc -pipe -Wall -o fragrouter attack.o fragrouter.o ip_frag.o list.o misc.o print.o send.o sniff.o tcp_seg.o  -L./libpcap-0.4 -lpcap -L./Libnet-0.99b/lib -lnet -lnsl
[root@6-32 fragrouter-1.6]# make install
cd ./Libnet-0.99b; make
make[1]: Entering directory `/root/sniff/fragrouter-1.6/Libnet-0.99b'
...
/usr/bin/install -c -m 755 fragrouter /usr/local/sbin
/usr/bin/install -c -m 644 fragrouter.8 /usr/local/man/man8

 

공격 전 라우터 MAC주소이다.
fragrouter을 수행한다. background에서 수행되므로 터미널을 닫으면 안된다.
arpspoof를 수행한다. background에서 수행되므로 터미널을 닫으면 안된다.
공격할 장치 및 라우터 모두를 대상으로 arpspoof를 수행한다. background에서 수행되므로 터미널을 닫으면 안된다.
공격 후 라우터의 MAC주소가 공격자의 MAC주소로 변경된 상태이다.

4. 결과 분석

NAT구간에서 실습 1회 시도시 XP의 MAC주소는 변경되었으나. 통신이 되지 않았다.

route add -net 192.168.112.0 netmask 255.255.255.0 gw 192.168.111.254

공격자가 192.168.112.0/24네트워크와 통신이 가능하게 라우터를 설정한후 통신이 가능하게 되었다.

 

피해자가 라우터로 보내는 패킷에 목적지 MAC주소가 공격자의 MAC주소로 되어있다.
피해자가 라우터로 받은 패킷에 목적지 MAC주소가 피해자의 MAC주소로 되어있다.
라우터에서 응답하는 패킷의 목적지 MAC주소는 공격자의 MAC주소로 되어있다.

실습 전에 NAT네트워크 구성임을 알지 못해 실습이 길어졌다.

공격자 또한 사용할 라우터 외부로의 통신이 가능함을 확인 후에 실습을 진행하면 잘 진행된다. 

TCPdump를 이용해 패킷을 캡쳐하려 하였으나 TCPdump를 이용하면 헤더를 알아서 해석하고 IP주소부터 출력되어 확인이 불가능 하다.

공격에 대한 방어는 주기적으로 ARP패킷을 수신 하기 때문에 그런 ARP패킷을 감지하여 방어하는 방법이 가장 효과적이다.

 

cf) 이 설정을 이용해 redirect패킷의 수신여부도 설정이 가능하나 보장하지 않고 최선을 다한다.

vi /etc/sysctl.conf
// IPv4의 모든 redirect패킷을 수신을 enable한다.
net.ipv4.conf.all.accept_redirects = 1
// IPv4의 기본 redirect패킷을 수신을 enable한다.
net.ipv4.conf.default.accept_redirects = 1
// IPv4의 모든 rdirect packet filter를 disable한다.
net.ipv4.conf.all.rp_filter = 0
반응형

'교육 > Security' 카테고리의 다른 글

Day 72 (ARP spoofing)  (0) 2020.03.10
Day 71 (icmp redirect)  (0) 2020.03.09
Day 70 (Scan)  (0) 2020.03.06
Day 69 (TCPdump)  (0) 2020.02.28
Day 69 (John The Ripper)  (0) 2020.02.28