{"id":26833435,"url":"https://github.com/mr-won/snort_rule","last_synced_at":"2025-03-30T15:28:58.834Z","repository":{"id":274380869,"uuid":"922723319","full_name":"mr-won/Snort_Rule","owner":"mr-won","description":"Snort Rule ","archived":false,"fork":false,"pushed_at":"2025-01-26T23:29:56.000Z","size":8,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-18T02:27:14.765Z","etag":null,"topics":["ids","siem","snort"],"latest_commit_sha":null,"homepage":"","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mr-won.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2025-01-26T23:23:17.000Z","updated_at":"2025-01-26T23:30:39.000Z","dependencies_parsed_at":null,"dependency_job_id":"ffc46375-2503-4c6c-acf4-5a871fa99320","html_url":"https://github.com/mr-won/Snort_Rule","commit_stats":null,"previous_names":["chihyeonwon/snort_rule","mr-won/snort_rule"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mr-won%2FSnort_Rule","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mr-won%2FSnort_Rule/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mr-won%2FSnort_Rule/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mr-won%2FSnort_Rule/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mr-won","download_url":"https://codeload.github.com/mr-won/Snort_Rule/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246337910,"owners_count":20761290,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ids","siem","snort"],"created_at":"2025-03-30T15:28:58.283Z","updated_at":"2025-03-30T15:28:58.818Z","avatar_url":"https://github.com/mr-won.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"회사 업무에 필요한 Snort Rule 스노트 탐지 룰에 대해 공부한 내용을 정리하였습니다.\n```\nSnort 는 1998년 Martin Roesch에 의해 개발된 오픈 소스 기반 IDPS ( Intrusion Detection Prevention System ) 입니다.\n시그니처 기반 탐지 시스템으로서 패턴과 매칭이 될 경우 탐지되는 방식을 사용하는 시스템입니다.\n현재까지도 침입 탐지 시스템 ( IDS ) 중 가장 널리 사용되고 있는 시스템입니다.\n```\n## Snort 의 기능\nSnort 는 아래 작성된 3가지 기능을 수행합니다.    \n\n- Sniffer : 네트워크 트래픽을 캡쳐하는 기능\n- Packet Logger : 나중에 분석할 수 있도록 네트워크 트래픽을 파일에 기록하는 기능\n- IDS / IPS : 네트워크 트래픽을 분석 후 침입 탐지 및 차단 기능\n\n## Snort 동작 구조\n\nSnort 의 동작 구조는 Sniffer -\u003e Preprocessor -\u003e Detection Engine -\u003e Alert / Log 로 이루어져 있습니다.\n\n- Sniffer : Snort IDS 를 통과한 패킷을 수집합니다.\n- Preprocessor : 효율적인 공격 탐지를 위해 Plug-in을 먼저 거쳐 매칭을 확입합니다.\n- Detection Engine : Snort Rule과 매칭이 되는지 확인합니다.\n- Alert / Log : Snort Rule 매칭 결과에 따라 경고나 로그등 출력을 하게됩니다.\n\nSnort Rule 은 크게 Rule header 와 Rule Option 으로 구분됩니다.     \nex ) alert tcp any any -\u003e any 80 (msg:\"SQL injection\";content:\"'1'='1\";nocase;sid:1000001;)\n\n#### Rule Header  \n먼저 Rule header에 해당하는 내용을 먼저 살펴보도록 하겠습니다.\n\n- Action : 패턴이 매칭이 되었을 경우 할 행동을 정의\n- alert\n로그를 남기고 경고를 발생시킵니다.\n\n- log\n해당 패킷을 기록합니다.\n\n- pass\n해당 패킷을 무시합니다.\n\n- active\nalert 를 발생 시킨 후 대응하는 Dynamic 을 유효화합니다.\n\n- reject\n패킷을 차단하고 기록 후 TCP Protocol 의 경우 TCP ResetUDP Protocol 의 경우 ICMP Port Unrechable 메세지를 전송합니다.\n\n- drop\n상대방에게 응답하지 않고 패킷을 차단하고 기록합니다\n\n- sdrop\n기록을 남기지 않고 패킷을 차단합니다.\n\nProtocol : 탐지 할 프로토콜의 종류를 정의합니다. ( 규칙을 작성할 때 소문자로 작성하여야 합니다. )\n\n- TCP\nTCP 프로토콜을 탐지합니다.\n\n\n- UDP\nUDP 프로토콜을 탐지합니다.\n\n\n- ICMP\nICMP 프로토콜을 탐지합니다.\n\n\n- IP\nIP 프로토콜을 탐지합니다.\n\n\n- Any\n모든 프로토콜을 탐지합니다.\n\n#### Direction : 탐지할 방향을 정의\n\n- -\u003e\n출발지 -\u003e 목적지로 가는 패킷을 탐지합니다.\n\n- \u003c\u003e\n출발지 ~ 목적지 사이 모든 패킷을 탐지합니다.\n\n- Source IP \u0026 Port / Destination IP \u0026 Port : 출발지, 목적지 IP , Port 정의\n\n- ! ( 부정연산자 )\n부정연산자 ( ! ) 를 IP 또는 Port 앞에 기입 할 경우 해당 IP 또는 Port 번호를 제외한 주소만 매칭합니다.\n\n- Any\n모든 IP 또는 Port 를 의미합니다.\n\n- 포트번호\n지정된 포트번호를 의미합니다.\n\n- 포트번호1:포트번호2\n포트번호1 ~ 포트번호2 를 의미합니다\n\n- :포트번호\n지정된 포트번호 이하 모든 포트를 의미합니다.\n\n- 포트번호:\n지정된 포트번호 이상 모든 포트를 의미합니다.\n\n※ 여러 IP 를 작성할 경우 쉼표 ( , ) 로 IP 주소 목록을 구분하고 구분된 IP 주소 목록을 대괄호를 이용해 표시합니다.     \nex ) alert tcp ![111.111.111.0/24,192.168.1.0/24] any -\u003e [111.111.111.0/24,192.168.1.0/24] 123           \n위 예시를 해석 할 경우 111.111.111.0/24 또는 192.168.1.0/24 를 제외하고 tcp 프로토콜을 사용해 목적지 123번       \n포트로 패킷이 들어올 경우 경고를 발생이라는 정책이 됩니다.    \n \n#### Rule Option\nRule Header 가 1차적인 정책을 설정한 것이라면 Rule Option이 실제로 악의적인 내용의 패킷을 탐지하는 영역입니다.     \n다르게 말하면 Rule Option은 탐지의 정확도를 향상시켜주는 옵션입니다.        \nRule Option을 사용할 경우 모든 옵션은 세미콜론 ( ; ) 을 사용해 서로를 구분하고, 규칙 옵션 키워드는 콜론 ( : ) 을 사용해 인수와 구분합니다.      \nRule Option은 크게 일반 옵션, Payload, HTTP 옵션, 흐름 옵션으로 구분됩니다.      \n\n#### 일반 옵션 : 규칙에 대한 정보를 제공하는 옵션으로 매칭하는 동안 어떠한 영향도 미치지 않는 옵션   \n\n- msg\nSnort 규칙이 탐지될 경우 출력되는 메시지 \nmsg:“메시지 내용”;\n\n\n- sid\nSnort 규칙을 구별하는 식별자0~1,000,000 번 까지는 예약된 식별자1,000,001이상부터 사용\nsid:1000001;\n\n\n- rev\nSnort 규칙의 수정 버전을 정의수정할 경우 1씩 증가\nrev:1;\n\n\n- classtype\nSnort 규칙을 분류하는 옵션\nclsstype:분류이름;\n\n\n- priority\n우선 순위를 지정하는 옵션1 ~ 10까지 수를 사용( 값이 작을수록 우선순위가 높음 )\npriority:10;\n\n\n- reference\n해당 규칙에 참고가 되는 URL을 지정하는 옵션\nReference:래퍼런스명 http://…;\n\n- Payload\nPayload는 Snort Rule에서 실질적으로 악성 패킷을 탐지하는 옵션\n\n- content\n패킷 데이터에서 매칭할 문자열을 지정하는 옵션\ncontent:”abc”;=\u003e abc 문자열을 탐지\n\n\n- nocase\nContent 옵션 뒤에 작성하여 content 문자열을 대소문자 구분없이 탐지하도록 함\ncontent:”abc”;nocase;=\u003e Abc,ABC,aBc,abC 모두 탐지\n\n\n- offset\n패킷의 페이로드에서 매칭을 시작할 문자열의 위치를 지정하는 옵션( 지정한 바이트 만큼 떨어진 위치부터 탐색시작, 시작은 0Byte )\noffset:3;=\u003e 4Byte부터 탐색을 시작\n\n\n- distance\ncontent 옵션 값 매칭 후를 기준으로 지정된 패턴 탐색을 시작하기 전 무시해야 하는 패킷의 거리를 지정하는 옵션\ncontent:”abc”;content:”test”;distance:5;=\u003e abc 문자열 매칭 후 지점을 기준으로 5byte 이후 test 문자열 탐색\n\n\n- within\ncontent 옵션 매칭 후 다음 지정된 탐색을 진행할 범위를 지정하는 옵션\ncontent:”abc”;content:”test”;within:5;=\u003e abc 문자열 매칭 후 지점을 기준으로 5Byte 이내에 test 문자열 탐색\n\n\n\n\n#### HTTP 옵션\ncontent 옵션 값이 탐색할 범위를 HTTP 영역으로 한정할 때 사용하는 옵션\n\n- http_method\n패킷 페이로드 중 HTTP 메소드 영역에서 content 옵션 값을 매칭하는 옵션\n\n\n- http_uri / http_raw_uri\n패킷 페이로드 중 URI 영역을 탐색하는 옵션raw가 포함된 옵션은 디코딩되지 않은 페이로드를 대상으로 탐색하는 옵션\n\n\n- http_cookie\nhttp 쿠키 값을 탐색하는 옵션\n\n\n- http_header / http_raw_header\nHTTP 헤더 영역을 요청과 응답에 관계없이 탐색하는 옵션\n\n\n- http_client_body\nHTTP 바디 영역을 탐색하는 옵션\n\n\n- http_stat_code\nHTTP 응답 메시지에서 상태 코드 영역을 탐색하는 옵션\n\n\n- http_stat_msg\nHTTP 응답 메시지에서 상태 메세지 영역을 탐색하는 옵션\n\n#### 흐름 옵션 : 패턴을 매칭할 때 적용해야 하는 트래픽의 방향을 지정하는 옵션\n\n- flow\n흐름 옵션을 사용할 때 반드시 사용해야 하는 옵션\n\n\n- to_client / from_server\nServer -\u003e Client 방향으로 오는 패킷을 매칭하는 옵션\n\n\n- to_server / from_client\nClient -\u003e Server 방향으로 오는 패킷을 매칭하는 옵션\n\n\n- Established\n세션이 성립된 상태의 패킷을 매칭하는 옵션\n\n\n- statless\n세션 성립 여부와 상관 없이 매칭하는 옵션\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmr-won%2Fsnort_rule","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmr-won%2Fsnort_rule","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmr-won%2Fsnort_rule/lists"}