InfoSec / / 2024. 9. 30. 15:45

ELK를 통한 모니터링 서버 구축 - Snort

Snort 개요

시그니처 기반의 네트워크 침입탐지 시스템으로,

단일 쓰레드를 이용하므로 대용량 패킷 탐지에는 다소 부적절합니다.

 

대용량 패킷을 탐지할 경우에는 멀티쓰레드를 지원하는

Suricata를 사용할 것을 권장합니다.

 

▶ Snort의 작동 구조

sniff -> Preprocessor -> Detectio Engine -> Alert/Logging

 

☞ Sniff

   -> 네트워크 모니터링

Preprocessor

   -> 스니퍼로부터 전달받은 패킷을 특정 플러그인으로 전달하고

      패킷에서 특정 패턴을 탐색합니다.

Detection Engine

   -> 패킷을 전달받아 패킷과 일치하는 RuleSet(규칙)이 있으면
      해당 패킷을 Alert/Logging에게 전달합니다.

Alert/Logging

   -> Detection Engine과 일치하는 패킷이 있으면 경고 발생
   -> 경고를 로그파일, SMB, SNMP 등의 트랩으로 전송
   -> Rsyslog와 같은 툴을 사용하여 핸드폰, 이메일 등으로
       관리자에게 실시간 통보합니다.

 

IDS, IPS란?

   -> 침입 탐지는 네트워크 트래픽을 모니터링하고 해당 정보를 분석하여

      혹시 모를 침입 징후를 파악하는 과정입니다.

      이러한 침입에는 공격 시도 및 네트워크에 시급한 위협이

      될 수 있는 인시던트가 포함됩니다.

     침입 방지는 침입 탐지를 수행한 다음 감지된 인시던트를 중지하는 과정입니다.

     이러한 인시던트는 보통 패킷 손실 또는 세션 종료의 형태로 이루어집니다.

     보안 조치는 잠재적 사건을 탐지하고 중지하기 네트워크 보안 조치의 일부인

     Intrusion Detection Systems (IDS) 및 침입 방지 시스템(IPS) 으로

     사용할 수 있으며 차세대 차세대 방화벽 (NGFW)에서 기능을 포함합니다.

 

IDS/IPS의 이점

   -> IDS/IPS는 네트워크 상의 모든 트래픽을 모니터링하여 알려진 악의적인 행동을 식별합니다.

      공격자가 시도할 수 있는 공격 방법 중 하나는 디바이스 또는 소프트웨어

      내의 취약점을 공격하여 네트워크를 손상시키는 것입니다.

      IDS/IPS는 이러한 공격 시도를 식별하고, 해당 공격이 네트워크 내의

     엔드포인트를 손상시키기 전에 차단합니다.

     IDS/IPS는 공격자가 네트워크 정보를 수집하는 도중에 이를 중단시킬 수 있으므로

     네트워크 에지와 데이터센터 내부 모두에 필요한 보안 기술입니다. 

 

▶ 침입 탐지 시스템 작동 방식
인시던트 탐지에 일반적으로 사용되는 IDS 탐지 방법은 크게 3가지가 있습니다.

  ☞ 서명 기반 탐지(Signature-Based Detection)는 관측된 이벤트와 
    서명을 비교하여 잠재적인 인시던트를 식별합니다.

    서명 기반 탐지는 문자열 비교 연산을 사용하여 당시의

    활동 단위(예: 패킷 또는 로그 항목)를 비교하는 가장 단순한 탐지 방법입니다.
  ☞ 이상 징후 기반 탐지(Anomaly-Based Detection)는

    정상적인 활동이라 간주되는 활동을 관측된 이벤트와 비교하여

   중대한 차이점을 식별합니다. 이 탐지 방법은 이전까지

   알려지지 않은 위협을 식별하는 데 효과적입니다.
  ☞ 상태 유지 프로토콜 분석(Stateful Protocol Analysis)은 각 프로토콜

    상태별로 정상 프로토콜 활동에서 일반적으로 허용되는 정의의 사전 정의된

    프로필을 관측된 이벤트와 비교하여 차이점을 식별합니다.

 

▶ Snort 모드

스니퍼 모드

 -> 패킷 정보 메시지를 콘솔에 출력한다.

패킷 로깅 모드

 -> 패킷 정보를 로그에 기록한다.

NIDS 모드

 -> 패킷을 탐지하여 경고 메시지를 출력한다.

IPS 모드

 -> 패킷을 탐지하여 차단한다 -> 인라인 모드시

 

◆ Snort의 구조

 

Q1> 신종 바이러스가 발생하였다.

     이 바이러스를 차단할때 사용할 침입방지 시스템은?

     => 침입차단시스템

 

Q2> 트로이목마 해킹이 발생하였다.
     이 바이러스를 차단할때 사용할 침입방지 시스템은?
     => 침입탐지시스템

 

 

Kali Linux에 Snort 설치

레드햇 계열 -> /etc/yum.repo.d

데비안 계열 -> /etc/apt/sources.list

 

# 저장소 소스 리스트 백업

mv /etc/apt/sources.list /etc/apt/sources.list.bak

 

# 설치된 업데이터 제거

find /var/lib/apt/lists -type f -exec rm {} \;

 

# Snort 설치를 위한 새로운 저장소 생성

gedit /etc/apt/sources.list

deb http://archive.ubuntu.com/ubuntu/ focal main restricted universe multiverse
deb-src http://archive.ubuntu.com/ubuntu/ focal main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu/ focal-updates main restricted universe multiverse
deb-src http://archive.ubuntu.com/ubuntu/ focal-updates main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu/ focal-security main restricted universe multiverse
deb-src http://archive.ubuntu.com/ubuntu/ focal-security main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu/ focal-backports main restricted universe multiverse
deb-src http://archive.ubuntu.com/ubuntu/ focal-backports main restricted universe multiverse
deb http://archive.canonical.com/ubuntu focal partner
deb-src http://archive.canonical.com/ubuntu focal partner

 

# 업데이트 설치

apt update -y

에러가 발생할 경우 인증키 오류이므로 인증키를 등록해 주어야 합니다.
인증키는 에러문에 NO_PUBKEY 형태로 두번 출력됩니다.

 

apt-key adv--keyserver key.server.ubuntu --recv-keys 인증키1
apt-key adv--keyserver key.server.ubuntu --recv-keys 인증키2

 

# 이제 다시 업데이트를 실행합니다.

apt update -y

인증키를 등록해 주면 update가 잘 됨을 확인했습니다.

 

# snort 설치

apt install -y snort

 

# snort 실행

snort

잘 실행되면 설치가 잘 된 것입니다.

 

 

Web UI Snort 설치 및 사용

# WEB UI Snort 설치하기 (웹으로 pcap 파일 분석 기능)

 

# snort 서비스 중지

service snort stop

update-rc.d snort disable

 

# snort 환경설정 권한변경

chmod a+r /etc/snort/snort.conf

 

# Web Snort 설치

pip install websnort

 

# Web Snort 실행

websnort

 

# 웹 브라우저에서 Web Snort 서버 접속

http://서버IP:8080

 

출력된 웹 페이지에 PCAP파일을 업로드하면

패킷 분석을 실행합니다.

 

 

Kali Linux를 통한 모의 공격

▶ ELK SERVER : CentOS 7.9

Hacker : Kali-2024-2

Snort : Kali-2024-2

Target : Kali-2024-2 (웹서버에서 운영중인 게시판)

모니터링 : Wireshark, ELK

 

 

snort 환경설정

# 로그파일 위치 설정

gedit /etc/default/snort

 

# 20라인 구문 확인

LOGDIR="/var/log/snort"

 

 

NAT 사용시 snort 환경설정

# NAT 사용시에만 맞는 IP로 변경

gedit /etc/snort/snort.debian.conf

 

# 17라인 구문 수정 (NAT, VMnet 주소 기입)

DEBIAN_SNORT_HOME_NET="192.168.0.0/16"

 

# 19라인 구문 수정 (랜카드 이름 기입)
DEBIAN_SNORT_INTERFACE="eth0"

 

 

 

Snort의 구조 확인

cd /etc/snort/rules

 

 

해당 디렉터리에 Snort의 기본 룰셋이 정의되어 있습니다.

이 룰의 정의에 따라서 침입을 감지하게 됩니다.

 

실습에서는 해당 룰셋을 사용하지 않고 직접 입력해서 사용하겠습니다.

그러기 위해 기존 룰셋을 사용하지 않도록 환경설정 파일을 변경합니다.

# 기존 환경설정 파일 백업

cp /etc/snort/snort.conf /etc/snort/snort.conf.bak

 

# 환경설정 파일 편집

vim /etc/snort/snort.conf

578번 라인부터 696라인까지 참조하는 rules파일이 정의되어 있습니다.

이 룰셋들을 사용하지 않기 위해서 주석처리 해줍니다.

 

VIM에서 주석처리 하는 방법)

# 578라인으로 이동

578입력 후 SHIFT+G

 

# 시작행부터 마지막행까지 일괄 주석처리

:시작행,마지막행s/^/#/

 

sed 명령어를 이용하여 주석처리 하는 방법)

# vim으로 넣었던 #를 삭제하기

sed -i "s/\#include \$RULE_PATH/include \$RULE_PATH/" /etc/snort/snort.conf

 

=> snort.conf에 포함된 #include \$RULE_PATH 문자열을 include \$RULE_PATH로 변경

 

# 다시 # 주석 삽입하기

sed -i "s/include \$RULE_PATH/\#include \$RULE_PATH/" /etc/snort/snort.conf

 

 

 

Snort로 탐지하기

Snort 탐지 설정

# 외부에서의 Ping을 탐지하도록 설정

gedit /etc/snort/snort.conf

 

# 51라인 구문수정 (내부 설정)

ipvar HOME_NET 탐지할IP

 

# 54라인 구문확인 (외부 설정)

ipvar EXTERNAL_NET any

 

 

Snort 룰의 구조

이런 룰이 있을 때,

 

▶ 헤더 부분

alert tcp $EXTERNAL_NET any -> $TELNET_SERVERS 23

 

     
alert Rule Action => 어떻게 처리할 것인지 결정
=> alert로 사용하면 IDS로 동작
=> drop, reject로 사용하면 IPS로 동작
tcp Protocols TDP,CUP,ICMP, IP 등
$EXXTERNAL_NET Source_IP Address 출발지 아이피 주소 또는 대역
any Source_Port Numbers 출발지 아이피가 사용하는 포트번호
-> Direction Operator 방향지시자 → 좌측에서 우측으로 진행
<> 양방향 진행
(←는 지원하지 않음)
$Telnet_SERVERS Destination_IP Address 목적지 아이피 주소 또는 대역
23 Destination_Port Numbers 목작지 아이피가 사용하는 포트번호

 

 

▶ 옵션 부분

(msg:"TELNET Solaris memory mismanagement exploit attempt"; flow:to_server,established; content:"|A0 23 A0 10 AE 23 80 10 EE 23 BF EC 82 05 E0 D6 90|%|E0|"; classtype:shellcode-detect; sid:1430; rev:7;)

 

 

 룰 생성하기

# 로컬 룰 사용 허용

gedit /etc/snort/snort

 

# 571라인 주석 해제

include $RULE_PATH/local.rules

 

 

# 로컬 룰 수정

gedit /etc/snort/rules/local.rules

 

# 마지막 라인에 삽입

# ICMP Detect
alert icmp 192.168.5.0/24 any -> 192.168.5.216/32 any (msg:"ICMP Request DETECT"; itype:8; sid:3000001; rev:1;)
alert icmp 192.168.5.216/32 any -> 192.168.5.0/24 any (msg:"ICMP Response DETECT"; itype:0; sid:3000002; rev:2;)

=> ping을 주는것과 받는것 탐지

 

# snort 데몬 재실행

(설정파일을 수정하면 반드시 데몬을 재실행 해주어야 함)

systemctl restart snort

 

 

Snort 실행 및 로그파일 보기

# snort 실행

snort -q -A console -b -c /etc/snort/snort.conf

 

이후 외부에서 ping으로 Kali Linux IP로 접근하면 로그가 표시됩니다.

# Snort 로그 저장 디렉터리

ll /var/log/snort

 

# Snort 로그 보기

snort -de -r /var/log/snort/로그파일명

 

  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유