STUDY.md
  • [Suricata] Suricata RULES 알아보기 (IP, TCP, UDP, ICMP)
    2024년 07월 08일 19시 57분 47초에 업로드 된 글입니다.
    작성자: 방세연

    Suricata 7.0.6
    USAGE: suricata [OPTIONS] [BPF FILTER]
    
            -c <path>                            : path to configuration file
            -T                                   : test configuration file (use with -c)
            -i <dev or ip>                       : run in pcap live mode
            -F <bpf filter file>                 : bpf filter file
            -r <path>                            : run in pcap file/offline mode
            -q <qid[:qid]>                       : run in inline nfqueue mode (use colon to specify a range of queues)
            -s <path>                            : path to signature file loaded in addition to suricata.yaml settings (optional)
            -S <path>                            : path to signature file loaded exclusively (optional)
            -l <dir>                             : default log directory
            -D                                   : run as daemon
            -k [all|none]                        : force checksum check (all) or disabled it (none)
            -V                                   : display Suricata version
            -v                                   : be more verbose (use multiple times to increase verbosity)
            --list-app-layer-protos              : list supported app layer protocols
            --list-keywords[=all|csv|<kword>]    : list keywords implemented by the engine
            --list-runmodes                      : list supported runmodes
            --runmode <runmode_id>               : specific runmode modification the engine should run.  The argument
                                                   supplied should be the id for the runmode obtained by running
                                                   --list-runmodes
            --engine-analysis                    : print reports on analysis of different sections in the engine and exit.
                                                   Please have a look at the conf parameter engine-analysis on what reports
                                                   can be printed
            --pidfile <file>                     : write pid to this file
            --init-errors-fatal                  : enable fatal failure on signature init error
            --disable-detection                  : disable detection engine
            --dump-config                        : show the running configuration
            --dump-features                      : display provided features
            --build-info                         : display build information
            --pcap[=<dev>]                       : run in pcap mode, no value select interfaces from suricata.yaml
            --pcap-file-continuous               : when running in pcap mode with a directory, continue checking directory for pcaps u
            --pcap-file-delete                   : when running in replay mode (-r with directory or file), will delete pcap files tha done
            --pcap-file-recursive                : will descend into subdirectories when running in replay mode (-r)
            --pcap-buffer-size                   : size of the pcap buffer value from 0 - 2147483647
            --dpdk                               : run in dpdk mode, uses interfaces from suricata.yaml
            --af-packet[=<dev>]                  : run in af-packet mode, no value select interfaces from suricata.yaml
            --af-xdp[=<dev>]                     : run in af-xdp mode, no value select interfaces from suricata.yaml
            --simulate-ips                       : force engine into IPS mode. Useful for QA
            --user <user>                        : run suricata as this user after init
            --group <group>                      : run suricata as this group after init
            --erf-in <path>                      : process an ERF file
            --unix-socket[=<file>]               : use unix socket to control suricata work
            --reject-dev <dev>                   : send reject packets from this interface
            --include <path>                     : additional configuration file
            --set name=value                     : set a configuration value
    
    
    To run the engine with default configuration on interface eth0 with signature file "signatures.rules", run the command as:
    
    suricata -c suricata.yaml -s signatures.rules -i eth0

     

    kali리눅스에 suricata를 설치해주었다.

    규칙이 매우 방대하기 때문에 가장 대표적으로 사용되는 Meta, TCP, UDP, IP, IMCP 키워드 규칙에 대해서 정리해볼 것이다. 규칙을 작성하며 Snort와 겹치는 부분들도 많이 있어서 신기했다.

     

     

    Contents. 클릭하면 이동합니다. 🚀

       

       


      Suricata RULES

      https://docs.suricata.io/en/suricata-4.1.4/rules/intro.html

      이곳에 친절하게 나와있다.

       

      Suricata Rules는 큰 세 가지 덩어리로 쪼갤 수 있다.

      🚨ACTION : red
      drop

      🌐HEADER : green
      tcp $HOME_NET any -> $EXTERNAL_NET any

      ✒️RULE OPTIONS : blue
      (msg:”ET TROJAN Likely Bot Nick in IRC (USA +..)”; flow:established,to_server; flowbits:isset,is_proto_irc; content:”NICK “; pcre:”/NICK .*USA.*[0-9]{3,}/i”; reference:url,doc.emergingthreats.net/2008124; classtype:trojan-activity; sid:2008124; rev:2;)

       

       


       🚨Action-order 

      drop
      Pass Drop Reject Alert
      현재 패킷에 대해 패킷 스캐닝을 중지 (패킷 무시) 패킷 차단.
      (ONLY IPS/인라인 모드일 때만)
      TCP 문제, ICMP 에러 패킷이 발생할 때 패킷 차단 경고문 출력, 로그 기록

       

       


       

       

       🌐Protocol 

      tcp
        tcp udp icmp ip (ALL, ANY)
      http ftp tls smb dns dcerpc ssh smtp imap
      mmsn modbus dnp3 enip nfs ikev2 krb5 ntp dhcp

       

      Suricata에서 지원하는 프로토콜 종류이다.

       

       

       

       🌐Source and destination 

      $HOME_NET any -> $EXTERNAL_NET any

       

      출발지 목적지
      $HOME_NET
      (외부 IP 주소 변수)
      $EXTERNAL_NET
      (외부 IP 주소 변수)
      vars:
        address-groups:
          HOME_NET: "[192.168.0.0/16,10.0.0.0/8,172.16.0.0/12]"        #By using [], it is possible to set
                                                                       #complicated variables.
          EXTERNAL_NET: any
          HTTP_SERVERS: "$HOME_NET"                                    #The $-sign tells that what follows is
                                                                       #a variable.
          SMTP_SERVERS: "$HOME_NET"
          SQL_SERVERS: "$HOME_NET"
          DNS_SERVERS: "$HOME_NET"
          TELNET_SERVERS: "$HOME_NET"
          AIM_SERVERS: any

      HOME_NET에 HOME IP주소를 지정해주는 것도 가능하다.

       

      Operator Description
      ../.. ip 범위
      ! 부정/예외
      [.., ..] 그룹화

       

       

       🌐Ports (source and destination) 

      $HOME_NET any -> $EXTERNAL_NET any

       

      출발지 목적지
      any any

       

      Operator Description
      : 포트 범위
      ! 예외/부정
      [.., ..] 그룹

       

       

       🌐Direction 

      -> ->방향의 패킷만 일치
      <> 양방향 패킷 일치

       

       


       

       ✒️Rule options 

      (msg:”ET TROJAN Likely Bot Nick in IRC (USA +..)”; flow:established,to_server; flowbits:isset,is_proto_irc; content:”NICK “; pcre:”/NICK .*USA.*[0-9]{3,}/i”; reference:url,doc.emergingthreats.net/2008124; classtype:trojan-activity; sid:2008124; rev:2;)

       

      괄호 () : rule options는 괄호로 묶여야 한다.

      semicolon; : rule option value를 사용할 때 ;를 사용해야 한다. (백슬래시\ 포함)

       

      rule options에 적어주는 순서에 따라 규칙의 내용은 달라진다!

      1. <키워드 옵션>:
      2. <설정>;
      3. <키워드 옵션>;

       

       

       

       


      이제부터는 각각의 규칙을 작성하는 Syntax를 다루어볼 것이다.

       Meta Keywords 

      msg: 맥락 정보 표시 ( ; \ " )
      sid: sid ID, rules 내에 있는 규칙들
      rev: sid와 함께 사용, 버전을 나타냄
      gid: 그룹 ID (일반적으로 gid 1 사용)
      classtype 규칙과 알림 분류에 대한 정보 제공
      (sid, rev 키워드 앞에 와야 함)
      reference: 문제에 대한 해결 정보 위치 표시
      (url, CVE-데이터베이스 사용하기)
      priority: 우선순위 (가장 높은 우선순위 = 1)
      metadata: 일반적으로 [key, value] 형식
      target: 경고의 어느 쪽이 공격 타겟인지 지정
      [scr_ip|dest_ip]
      requires: Suricata 버전의 범위, 특정 기능 활성화

       

      --class 유형 심화 설명

      config classification: web-application-attack,Web Application Attack,1
      config classification: not-suspicious,Not Suspicious Traffic,3
      클래스 유형 알리는 방식 (표시) 우선순위
      web-application-attack web Application Attack 1
      not-suspicious Not Suspicious Traffic 3

       

       

       

       

       

       

       

       IP Keywords 

      ttl: IP TTL값을 확인하기 id 특정 IP ID 값에 매치시킴
      (패킷 조각화 -> 동일 ID)
      ipopts 특정 ip 옵션 설정 확인하기 geoip 트래픽의 소스, 목적지, 국가 매칭 (IPv4만 제공)
      sameip 소스 IP주소 = 대상 IP주소인지 확인 fragbits IP 헤더에 단편화 되었는지 확인 (MTU)
      ip_proto 프로토콜을 일치시킴
       🌱프로토콜 번호 (클릭!) 
      fragoffset IP 단편화 offset을 10진수 값에 일치
      ipv4.hdr IPv4 헤더 콘텐츠와 일치하기 위함 tos  
      ipv6.hdr IPv6 헤더 콘텐츠와 일치하기 위함    

       

       

       

      --ipopts: <name> 심화 설명

      rr 경로 기록
      eol 리스트 끝
      nop No Op
      ts 타임 스탬프
      sec IP 보안
      esec IP 확장 보안
      lsrr loose 소스 라우팅
      ssrr strict 소스 라우팅
      satid 스트림 식별자
      any 모든 IP 옵션

       

       

      --geoip 심화 설명

      both 소스, 대상 모두 geoip와 일치
      any 소스, 목적지 중 지리적 IP와 일치
      dest 목적지가 geoip와 일치
      src 소스가 주어진 geoip와 일치

       

       

      --fragments 심화 설명

       

      M more fragments
      D do not fragment
      R reserved bit

       

       

      --fragoffest

      < match: 특정 값보다 작을 때
      > match: 특정 값보다 클 때
      ! match: 특정 값이 제공되지 않을 때

       

       

       

       

       

       

       

       

       TCP Keywords 

       

      tcp.flags: 특정 TCP Flag bits를 확인한다
      seq: 특정 TCP 시퀸스 번호를 확인한다

      ack: 특정 TCP 번호를 확인한다.
      window: TCP window의 크기 확인
      (수신할 수 있는 byte 양)
      tcp.mss: TCP MSS 옵션 값 일치 확인
      tcp.hdr tcp.mss를 주로 사용하지만 특정 키워드를 사용할 수 없는 경우 사용됨

       

       

       

       

      -- tcp.flags 형식

      tcp.flags:[modifier]<test flags>[,<ignore flags>]; tcp.flags:[!|*|+]<FSRPAUCE0>[,<FSRPAUCE>];

       

      F FIN Finish
      S SYN Synchronize sequence numbers
      R RST Reset
      P PSH Push
      A ACK Acknowledgment
      U URG Urgent
      C CWR Congestion Window Reduced
      E ECE ECN - Echo
      0 No TCP Flags Set  

       

      일치 기준

      + bits에 대한 일치 및 기타 모든 일치
      * bits 중 하나라도 일치
      ! bits가 설정되지 않은 경우 일치

       

       

       

      --패킷의 seq 예시 (Wireshark)

      출처 : https://docs.suricata.io/en/latest/rules/header-keywords.html

       

      --패킷의 ack 예시 (Wireshark)

      출처 : https://docs.suricata.io/en/latest/rules/header-keywords.html

       

       

       

       

       

       

       

       UDP Keywords 

      alert udp any any -> any any (udp.hdr; content:"|00 08|"; offset:4; depth:2; sid:1234; rev:5;)
      udp.hdr  

       

       

       

       

       

       

       ICMP Keywords 

      itype: 특정 ICMP type (숫자)와 일치시킴
      icode: 특정 ICMP code와 매칭시킴
      icmp_id 특정 ICMP ID 값을 매칭시킴
      icmp_seq ICMP 시퀸스 번호를 알아냄
      (어떤 응답 메세지가 어떤 요청 메세지에 속한지 확인 가능)
      icmpv4.hdr  
      icmpv6.hdr  
      icmpv6.mtu  

       

       

      --ICMP Type 목록

       

       

       

       

       


       

      🦫기타 Suricata rules 관련 유용한 사이트 모음:

      참고해서 실습해볼 예정,,

       

      https://github.com/michalpurzynski/suricata-rules/blob/master/README.md

       

      suricata-rules/README.md at master · michalpurzynski/suricata-rules

      Example Suricata rules implementing some of my detection tactics - michalpurzynski/suricata-rules

      github.com

       

      https://github.com/OISF/suricata/blob/master/doc/userguide/rules/intro.rst

       

      suricata/doc/userguide/rules/intro.rst at master · OISF/suricata

      Suricata is a network Intrusion Detection System, Intrusion Prevention System and Network Security Monitoring engine developed by the OISF and the Suricata community. - OISF/suricata

      github.com

       

      https://readthedocs.org/projects/suricata/downloads/pdf/latest/

       

       

       

       

       

       

      댓글