그동안 설치 및 실습해봤던 snort를 활용해, arp spoofing 공격을 실습하고 이를 탐지해보려고 한다.

 

snort는 피해자 pc(우분투)에 설치했고, 공격자 pc는 칼리 리눅스로 설치했다.

피해자 ip: 192.168.48.165

공격자 ip: 192.168.48.163

gateway: 192.168.48.2 (피해자 pc에 arp -a 명령어로 확인할 수 있다)

 

그럼 먼저 arp spoofing 실습을 먼저 진행해보자.

 

1) ARP Spoofing

우선, 스푸핑을 위한 도구인 fragrouter를 설치해준다.

설치를 완료해준 뒤, fragrouter를 터미널에 입력하면, 사용 방법에 대해 나온다.

첫번째 옵션으로 아래와 같이 명령어를 입력해주고,

fragrouter -B1

위 터미널은 그대로 열어둔 채로, 새로운 터미널을 연다.

그리고 root 모드로 전환한 뒤, 아래와 같이 명령어를 입력한다.

arpspoof -i eth0 -t 피해자IP Gateway (칼리리눅스에서 ifconfig를 해보면, eth0인지 ens33인지 나온다)

arpspoof -i eth0 -t 192.168.48.165 192.168.48.2

그럼 사진에서처럼 계속해서 arp replay 패킷을 반복적으로 보내게 된다.

 

이렇게 여러차례 arp replay 패킷을 보낸 뒤, 피해자 PC에서 확인해보면, 달라진 것을 확인할 수 있다.

공격 받기 전
공격 받은 후

전후를 확인하기 위해 date 명령어로 시간도 찍어줬다.

공격 받은 후, arp -a를 입력하면 공격자 ip주소인 192.168.48.163이 찍히는 것을 알 수 있다.

 

그리고 다시 칼리 리눅스로 돌아와보면, fragrouter -B1을 입력했던 터미널에서 아래와 같은 모습을 확인할 수 있다.

UDP 패킷으로 ARP Spoofing을 한 걸까?

피해자 PC에서 UDP 패킷을 Snort로 탐지해봐야겠다!

 

2) Snort로 arp spoofing 탐지

먼저, 이전 실습 내용을 로그로 저장했던 내용을 삭제해준다.

sudo rm /var/log/snort/*

 

그리고 udp 패킷 탐지를 위해 새롭게 rule을 설정해준다.

sudo gedit /usr/local/etc/rules/local.rules

나는 블로그를 참고해 아래와 같이 설정해줬다. (https://ast-216.tistory.com/25)

alert udp any any -> any any (msg:"UDP packet"; sid:1000011;)

 

그리고 간단히 실행해보았다.

snort -c /usr/local/etc/snort/snort.lua -R /usr/local/etc/rules/local.rules

 

그랬더니 아래와 같은 패킷들이 탐지되었다.

뒤쪽 이미지를 보면, 192.168.48.2, 192.168.48.165 도 보이고, arp_spoof도 보이는 것 같다.

 

제대로 확인해보기 위해, 로그로 저장해보았다.

sudo /usr/local/bin/snort -c /usr/local/etc/snort/snort.lua -s 65535 \
-k none -l /var/log/snort -i ens33 -m 0x1b

 

그리고 log 파일을 확인해보면, 그림과 같다.

아주 많은 정보가 들어있는 것 같다.

쉽게 확인하기 위해, splunk도 활용해보려고 한다.

 

3) Splunk로 arp spoofing 탐지

3-1) 시도 ①

파이어폭스에 IP주소:8000를 입력한 뒤, 저번에 설정했던 admin 계정의 아이디와 비밀번호를 입력해준다.

그리고 검색하는 곳으로 들어가서, 기본적으로 alert가 왔던 패킷의 개수를 세본다.

sourcetype="snort3:alert:json"
| stats count by dest

그럼, 공격자 IP주소인 192.168.48.163이 8개, 피해자 IP 주소인 192.168.48.165가 15개, Gateway인 192.168.48.2가 12개이다. 

 

3-2) 시도 ②

그리고, fragrouter -B1 터미널에서, 192.168.48.2.53에서 53이 포트번호일까? 싶어서

splunk에 dest_port=53을 추가해 검색해보았다.

sourcetype="snort3:alert:json" dest_port = 53
| stats count by dest

그랬더니 아래와 같은 결과가 나왔다!

dest 주소도 192.168.48.2가 맞으니, 탐지를 한거라고 봐도 되는걸까?!

 

3-3) 시도 ③

개수를 count하는 부분을 빼고, 아래와 같이 쿼리문을 입력해봤다.

sourcetype="snort3:alert:json"

그랬더니 각 로그의 여러 정보에 대해 보기 좋게 나열되었다. (json 형식의 로그 파일을 정리해준 것 같다)

그 중 UDP packet이 눈에 띄어서, 아래와 같이 명령어를 입력했더니, msg가 UDP packet인 것들만 정렬해주었다.

sourcetype="snort3:alert:json" msg="UDP packet"

그리고 왼쪽 필드들을 눌러보면, 이 패킷들 중 dest_port(destination port)가 어떤 것들이 있는지를 확인할 수 있다.

53번 포트의 경우, 칼리 리눅스에서 보냈던 패킷들의 대부분인 것 같다.

그런데 다 UDP 패킷이 사용하는 포트라면, 이걸로 공격을 탐지했다고 보기는 어려울 것 같다.

 

3-4) 시도 ④

포트번호 개수를 카운트해서 시각화를 시도해봤다.

sourcetype="snort3:alert:json"
| stats count by dest

육안으로 보기에는 0번, 1900번, 53번이 가장 많았다.

3-5) 시도 ⑤

이번엔 메세지에 arp_spoof가 있던 패킷을 검색해봤다.

sourcetype="snort3:alert:json" msg = "(arp_spoof) unicast ARP request"

그랬더니 조금 특이한 점이 보였다.

아까 msg="UDP packet"으로 검색했을 때는, b64_data(base 64로 인코딩된 결과)의 종류가 23개였다.

그런데 msg = "(arp_spoof) unicast ARP request"의 경우, b64_data의 종류가 한 개뿐이고, 이것도 AAAAAA.. 였다.

 

Snort와 Splunk의 사용법은 점점 손에 익는데, 탐지를 어떻게 더 잘할 수 있을지는 rule과 쿼리문에 따라 달라지는 것 같다.

검색해보기로는 arp spoofing을 탐지하는 실습은 많이 진행하지 않는 것 같기도 하다.

더 다양한 공격 실습을 진행하면서 탐지 능력을 길러봐야겠다!!

+ Recent posts