<목차>
1. 목적
2. 사용 툴 & 환경
3. 실습 과정
4. 결과 확인
1. 목적
이번 실습은 ARP Spoofing에 속하는 ARP redirect를 수행하는 것이다. ARP redirect를 하는 목적은 gateway로 가는 패킷을 공격자가 IP는 목적지의 IP를 그대로 사용하되, MAC 주소는 자신의 MAC주소로 하여 공격받는 쪽이 공격자를 gateway로 오인하여 패킷을 공격자가 모두 수신 가능하게 한다.
2. 사용 툴 & 환경
1) Dsniff : Sniffing을 위한 자동화 동구로 가장 많이 알려진 툴이다. 스니핑을 위한 다양한 툴이 패키지처럼 구성되어 있다. Spoofing만을 단독으로는 사용하지 못하고 Sniffing과 Spoofing을 같이 사용한다.
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. 실습 과정
추가 패키지 설치가 완료되면 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
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네트워크와 통신이 가능하게 라우터를 설정한후 통신이 가능하게 되었다.
실습 전에 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 |