소개
Snort 와 같은 침입 탐지 시스템 (IDS) 은 악성 네트워크 트래픽을 식별하기 위해 규칙에 크게 의존합니다. 잘 작성된 규칙은 시그니처 역할을 하며, 데이터 패킷에서 특정 패턴이 관찰될 때 시스템이 경고를 트리거하도록 합니다.
시그니처 기반 탐지는 공격자의 의도를 직접 이해하는 것이 아니라 알려진 패턴을 인식하는 방식으로 작동합니다. 이는 빠르고 유용하지만 완벽하지는 않습니다. 패턴이 너무 광범위하면 오탐 (false positive) 이 발생하고, 너무 좁으면 공격자가 약간의 변경만으로도 이를 회피할 수 있습니다. 따라서 좋은 규칙을 작성하는 것은 정밀도와 커버리지 사이의 균형을 맞추는 과정입니다.
이 실습에서 여러분은 보안 분석가의 역할을 수행하게 됩니다. 애플리케이션 계층 공격을 탐지할 수 있는 콘텐츠 매칭 Snort 규칙을 작성합니다. 구체적으로, PCAP(패킷 캡처) 파일에 캡처된 시뮬레이션된 SQL 인젝션 공격 페이로드를 분석하고, 기본적인 콘텐츠 매칭과 고급 정규 표현식 (PCRE) 을 모두 사용하여 HTTP 트래픽을 검사하고 악성 문자열이 감지될 때마다 경고를 발생시키는 정밀한 Snort 규칙을 작성합니다.
공격 페이로드 분석 (PCAP)
이 단계에서는 네트워크 패킷 캡처 파일을 분석하여 악성 페이로드가 어떤 모습인지 파악합니다. 탐지 규칙을 작성하기 전에 보안 분석가는 자신이 무엇을 탐지하려고 하는지 정확히 알아야 합니다.
이 순서는 중요합니다. 초보자가 흔히 하는 실수는 실제 트래픽을 검사하기 전에 시그니처를 작성하기 시작하는 것입니다. 실무에서 방어자는 일반적으로 PCAP, 로그 샘플 또는 익스플로잇 개념 증명 (PoC) 과 같은 증거물부터 시작합니다. 관찰 가능한 패턴을 이해한 후에야 이를 규칙으로 변환합니다.
실습 환경의 ~/project 디렉토리에는 sqli_attack.pcap이라는 파일이 미리 구성되어 있습니다. 이 파일에는 공격자가 웹 서버를 대상으로 SQL 인젝션 공격을 시도하는 시뮬레이션된 네트워크 패킷이 포함되어 있습니다.
이 PCAP 파일의 내용을 검사하기 위해 tcpdump라는 도구를 사용할 수 있습니다. tcpdump는 강력한 명령줄 패킷 분석기입니다. -A 플래그를 사용하면 패킷 내용을 ASCII(일반 텍스트) 로 출력할 수 있으며, 이는 HTTP 요청을 읽기에 적합합니다. -r 플래그는 tcpdump에게 실시간 네트워크 인터페이스 대신 파일에서 읽도록 지시합니다.
터미널에서 다음 명령을 실행하여 페이로드를 분석하십시오:
tcpdump -A -r sqli_attack.pcap
다음과 유사한 출력이 표시되어야 합니다:
reading from file sqli_attack.pcap, link-type EN10MB (Ethernet), snapshot length 262144
10:23:45.123456 IP 192.168.1.100.12345 > 192.168.1.10.http: Flags [P.], seq 1:78, ack 1, win 8192, length 77: HTTP: GET /login.php?user=admin'%20UNION%20SELECT%201,2,3-- HTTP/1.1
E..u..@.@............9.P..P.P.......+......GET /login.php?user=admin'%20UNION%20SELECT%201,2,3-- HTTP/1.1
Host: example.com
출력의 일반 텍스트 부분을 자세히 살펴보십시오. /login.php로 전송되는 HTTP GET 요청을 볼 수 있습니다. user 매개변수인 admin'%20UNION%20SELECT%201,2,3--에 주목하십시오.
%20은 공백 문자의 URL 인코딩 표현입니다. UNION SELECT 구문은 공격자가 자신의 악성 데이터베이스 쿼리 결과를 원래 쿼리와 결합하려는 SQL 인젝션 공격의 고전적인 시그니처입니다. 이것이 바로 우리가 탐지하고자 하는 정확한 시그니처입니다.
콘텐츠 매칭 규칙 작성
이 단계에서는 이전 단계에서 발견한 SQL 인젝션 시그니처를 탐지하기 위한 첫 번째 사용자 지정 Snort 규칙을 작성합니다.
content 키워드는 페이로드 검사의 가장 간단한 형태입니다. 리터럴 문자열을 검색하기 때문에 빠르고 이해하기 쉽습니다. 리터럴 매칭은 탐지 로직을 투명하게 만들기 때문에 시그니처의 첫 번째 초안으로 적합한 경우가 많습니다.
Snort 규칙은 특정 구문으로 작성됩니다. 기본 규칙은 **규칙 헤더 (rule header)**와 **규칙 옵션 (rule options)**으로 구성됩니다.
- 헤더는 동작, 프로토콜, 출발지/목적지 IP 주소 및 포트를 정의합니다.
- 옵션은 찾을 특정 콘텐츠와 경고가 트리거될 때 표시할 메시지를 정의합니다.
포트 80(표준 HTTP 포트) 으로 향하는 모든 TCP 트래픽에서 UNION%20SELECT라는 정확한 문자열을 찾는 규칙을 생성할 것입니다.
nano 텍스트 편집기를 사용하여 사용자 지정 규칙 파일을 엽니다:
nano ~/project/rules/local.rules
파일에 다음 줄을 추가합니다:
alert tcp any any -> any 80 (msg:"Basic SQL Injection Detected"; content:"UNION%20SELECT"; sid:1000001; rev:1;)
이 규칙의 의미를 분석해 보겠습니다:
alert: 규칙이 일치할 때 취할 동작 (경고 생성).tcp: 검사할 프로토콜.any any -> any 80: 출발지 IP 및 포트 (any) 에서 목적지 IP(any) 의 포트 80 으로 향함.msg:"...": 분석가에게 표시할 경고 메시지.content:"UNION%20SELECT": Snort 가 패킷 페이로드에서 검색할 정확한 문자열.sid:1000001: Snort ID. 사용자 지정 규칙은 1,000,000 이상의 ID 를 가져야 합니다.rev:1: 규칙의 수정 번호.
줄을 추가한 후 Ctrl+O, Enter, Ctrl+X를 눌러 파일을 저장하고 nano를 종료합니다.
cat 명령을 사용하여 규칙 파일의 내용을 확인할 수 있습니다:
cat ~/project/rules/local.rules
PCRE(정규 표현식) 구성
이 단계에서는 PCRE(Perl Compatible Regular Expressions) 를 사용하여 탐지 기능을 향상시킵니다.
정규 표현식은 하나의 정확한 바이트 시퀀스가 아닌 패턴의 집합을 설명하기 때문에 유연성을 높여줍니다. 이는 강력하지만, 과도하게 일치할 위험도 있습니다. 방어자는 공격자가 기본 동작을 유지하면서 형식을 변경할 가능성이 높을 때 PCRE 를 사용합니다.
content 키워드는 빠르고 효과적이지만 매우 경직되어 있습니다. 공격자는 종종 페이로드를 약간 변경하여 탐지를 회피하려고 합니다. 예를 들어, %20(URL 인코딩된 공백) 대신 일반 공백 (``), 여러 개의 공백 또는 더하기 기호 (+) 를 사용할 수 있습니다. 단순한 content 매칭은 이러한 변형을 놓칠 것입니다.
PCRE 를 사용하면 유연한 패턴을 작성할 수 있습니다. UNION SELECT 공격의 변형을 포착하기 위해 정규 표현식을 사용하는 두 번째 규칙을 작성할 것입니다.
규칙 파일을 다시 엽니다:
nano ~/project/rules/local.rules
첫 번째 규칙 아래의 새 줄에 다음 새 규칙을 추가합니다:
alert tcp any any -> any 80 (msg:"Advanced SQL Injection Detected"; pcre:"/UNION(%20|\s|\+)SELECT/i"; sid:1000002; rev:1;)
pcre 옵션을 분석해 보겠습니다:
pcre:"/ ... /i": 슬래시는 정규 표현식의 시작과 끝을 나타냅니다. 끝의i는 대소문자를 구분하지 않도록 설정합니다 (union,UNION,UnIoN등과 일치).UNION: UNION 이라는 단어와 일치합니다.(%20|\s|\+): 이는 OR 로직 (|) 이 포함된 캡처 그룹입니다.%20, 공백 문자 (\s), 또는 더하기 기호 (\+) 중 하나와 일치합니다.SELECT: SELECT 라는 단어와 일치합니다.
파일을 저장하고 nano를 종료합니다 (Ctrl+O, Enter, Ctrl+X).
이제 local.rules 파일에는 SQL 인젝션 시도를 포착하도록 설계된 두 개의 서로 다른 규칙이 포함되어야 합니다.
규칙 탐지 검증
마지막 단계에서는 사용자 지정 규칙을 테스트합니다. Snort 를 오프라인 모드로 실행하여 sqli_attack.pcap 파일을 읽고 local.rules에 작성한 규칙을 적용하도록 지시합니다.
종이 위에서는 올바르게 보이지만 실제 운영 환경에서는 실패할 수 있는 규칙이 있을 수 있으므로 알려진 샘플에 대해 테스트하는 것은 필수적입니다. 검증은 규칙이 의도한 트래픽에서 실제로 작동하는지 확인하며, 이는 라이브 환경에서 신뢰하기 전의 최소 요구 사항입니다.
Snort 는 다양한 플래그와 함께 실행될 수 있습니다. 사용할 플래그는 다음과 같습니다:
-q: 조용한 모드. 대형 배너와 초기화 텍스트를 억제하여 출력을 읽기 쉽게 만듭니다.-c: 사용할 구성 또는 규칙 파일을 지정합니다.-r: 읽을 PCAP 파일을 지정합니다.-A console: Snort 가 경고를 터미널 콘솔에 직접 출력하도록 지시합니다.
다음 명령을 실행하여 악성 페이로드에 대해 규칙을 테스트하십시오:
sudo snort -q -c rules/local.rules -r sqli_attack.pcap -A console
규칙이 올바르게 작성되었다면 다음과 유사한 출력이 표시되어야 합니다:
10/23-10:23:45.123456 [**] [1:1000001:1] Basic SQL Injection Detected [**] [Priority: 0] {TCP} 192.168.1.100:12345 -> 192.168.1.10:80
10/23-10:23:45.123456 [**] [1:1000002:1] Advanced SQL Injection Detected [**] [Priority: 0] {TCP} 192.168.1.100:12345 -> 192.168.1.10:80
축하합니다! 두 규칙 모두 성공적으로 트리거되었습니다. 첫 번째 규칙은 정확한 문자열과 일치했고, 두 번째 규칙은 정규 표현식을 사용하여 패턴과 일치했습니다. 여러분은 보안 분석가로서 위협을 식별하고 이를 탐지하기 위한 시그니처를 배포하는 역할을 성공적으로 수행했습니다.
요약
이 실습에서는 사용자 지정 Snort 규칙을 작성하여 네트워크 침입 탐지에 대한 실무 경험을 쌓았습니다. 원시 패킷 캡처를 분석하여 SQL 인젝션 공격의 특정 시그니처를 식별하는 것으로 시작했습니다. 그런 다음 해당 시그니처를 기본적인 콘텐츠 매칭 Snort 규칙으로 변환하는 방법을 배웠습니다. 마지막으로, 공격의 변형을 포착하기 위해 PCRE(Perl Compatible Regular Expressions) 를 구현하여 탐지 기능을 업그레이드하고, 악성 트래픽에 대해 Snort 를 실행하여 규칙을 성공적으로 검증했습니다. 이러한 기술은 네트워크 인프라 방어를 담당하는 모든 사이버 보안 전문가에게 필수적입니다.



