Snort - 03. Snort Rule 구조

리눅스/Security|2020. 10. 6. 13:50
반응형

1. Snort Rule Signiture

 

 - 스노트는 다음과 같은 룰 헤더와 옵션으로 구성된다.

 

Snort 룰 시그니처 구조

 

 

Action 유형

 명령어

내용 

 alert

  경고 발생 및 로그 기록

 log

  로그 기록

 pass

  패켓 무시

 drop

  패켓 차단 및 로그 기록 (IPS 기능으로 사용됨, 단 인라인 구조가 되어야 한다.)

 reject

  패켓 차단 및 로그 기록(TCP - TCP RST 응답, UDP - ICMP Unreachable 응답)

 sdrop

  패켓 차단 및 로그 기록 없음

 

 

Protocol 유형

 유형

내용 

 tcp

  TCP 탐지

 udp

  UDP 탐지

 ip

  IP 전체 탐지

 icmp

  ICMP 메세지 탐지

 any

  전체

 

 

SrcIP/DstIP 형식

형식

내용

 192.168.20.50/32

 192.168.20.50 Host

 192.168.20.0/24

 192.168.20.0/24 서브넷

 [192.168.20.0/24, 172.20.0.0/16]

 192.168.20.0/24, 172.20.0.0/16 서브넷

 !192.168.20.0/24

 192.168.20.0/24를 제외한 나머지 서브넷

 $HOME_NET

 내부 IP 주소 변수

 $EXTERNAL_NET

 외부 IP 주소 변수

 $XXX_SERVERS

 특정 서버 IP 주소 변수

 

 

SrcPort/DstPort

 형식

내용 

 80

  80번 포트

 1:500

  1~500번 포트

 !80

  80번 포트를 제외한 나머지 포트

 !1:500

  1~500번 포트를 제외한 나머지 포트

 any

  모든 포트

 

 

방향 지정

 형식

내용 

 ->

  요청 패켓 탐지 (응답패켓 탐지는 SrcIP/DstIP 반대로 설정)

 <>

  요청/응답 패켓 둘다 탐지

 

 

일반 옵션

 명령어

내용 

형식 

 msg

 경고 이벤트 메세지

 msg:"ICMP Ping test";

 sid

 룰 식별자 (3000000번 이상 권장)

 sid:3000001;

 rev

 룰 버전, 수정될 경우 1씩 증가

 rev:1;

 priority

 우선 순위 (값이 작을수록 먼저 매칭) 범위 : 1~10)

 priority:1;

 classtype

 스노트 룰 분류

 classtype:분류이름;

 reference

 취약점 참고 배포 URL 정보

 reference: 이름 http://~;


 

root@Snort:~# cd /etc/snort
root@Snort:/etc/snort# ls
classification.config  reference.config  snort.debian.conf
community-sid-msg.map  rules             threshold.conf
gen-msg.map            snort.conf        unicode.map

 

root@Snort:/etc/snortcat classification.config
root@Snort:/etc/snortcat reference.config

 

 

흐름 옵션

 명령어

 내용

 flow

 흐름 옵션 명령어

 to_server 또는 from_client

 클라이언트 -> 서버 패켓 룰 매칭

 to_client 또는 from_server

 서버 -> 클라이언트 패켓 룰 매칭

 established 

 세션이 연결된 상태의 패켓 룰 매칭

 statless

 세션 연결 유무와 상관 없이 룰 매칭

 flow:to_server,established

 클라이언트 -> 서버 세션 연결 패켓 룰 매칭

 

 

페이로드 탐색 옵션

 명령어

내용 

예제 

 content

  문자/숫자 탐지

 content: "xxx";

 content: "|16진수 16진수|";

 nocase

  대소문자 구분 없이 탐지

 content: "xxx"; nocase;

 offset

  지정한 바이트번째 부터 탐지(0번째 부터 시작)

 offset:3;

 depth

  지정한 바이트까지 탐지(0번째 부터 시작)

 depth:3;

 distance

  content 매칭 후 지정 위치 이후 다른 content 탐색

 content:"xxx"; content:"yyy"; distance:5;

 within

  content 매칭 후 지정 위치 안에 다른 content 탐색

 content:"xxx"; content:"yyy"; within:5;

 pcre

  정규화 표기, '/'는 시작과 끝에 표기, 16진수는 앞에 \x

 pcre:"/(http|ftp) Traffic/" 

 

 

HTTP 탐색 옵션

 명령어

내용 

 http_method 

 페이로드 앞부분 HTTP 메소드 패턴 매칭 

 http_uri 

 페이로드의 HTTP URI 패턴 매칭

 http_cookie

 페이로드의 HTTP 쿠키 패턴 매칭 

 http_header

 HTTP 요청/응답 Header 내용 패턴 매칭

 http_client_body

 HTTP 요청/응답 Body 내용 패턴 매칭

 http_stat_code

 HTTP 응답 상태 코드 패턴 매칭

 http_stat_message

 HTTP 응답 상태 메세지 패턴 매칭

 

 

 

 

2. Snort Rule 설정

 

 3-0. SQL injection Snort Rule 설정.txt

 

root@Snort:~# ls -l  /etc/snort/rules/local.rules
-rw-r--r-- 1 root root 199  6월 30  2015 /etc/snort/rules/local.rules

 

root@Snort:~# vi /etc/snort/rules/local.rules

# $Id: local.rules,v 1.11 2004/07/23 20:15:44 bmc Exp $
# ----------------
# LOCAL RULES
# ----------------
# This file intentionally does not come with signatures.  Put your local
# additions here.

 

alert tcp $EXTERNAL_NET any -> $HOME_NET any (msg:"SQL Injection"; content:"1' and '1'='1'"; nocase; sid:3000001; rev:1;) 

 

:q!

 

 

 

 

3. PCRE(Perl Comaptible Regular Expression)

 

 - Snort 룰 매칭시 content 정보를 세밀하게 검색할 때 사용한다.

 - PCRE 구성 요소 : 메타 문자, 수량자, 클래스, 서브패턴, 옵션

 - 사용 방법 : pcre:"/레직스/옵션";

 

 

메타 문자

 문자

내용 

예제 

설명

 ?

  0 글자, 또는 1 글자

 850?

  85, 850

 +

  1 글자 이상

 850+

  850, 8500, 85000

 *

  0 글자 이상

 850*

  85, 850, 8500, 85000

 .

  1 글자 모든거

 85.

  85 , 850~859, 85a~z, 85A~85Z

 ^

  문자 시작

 ^850

  850으로 시작

 $

  문자 끝

 850$

  850으로 끝

 _

  공백

 100_200

  100 200

 ( )

  서브패턴(문자열를 하나로 묶음)

 (850)*

  없음, 850, 850850, 850850850

 |

  OR

 (100|200)

  100 or 200

 \

  이스케이프 문자(특정 기호 표기)

 \(65013_65005\)

  (65013 65505)

 \b

  문자의 시작과 끝 (\bxyz\b)

\b850\b

  123 850 456

 \t

  Tab

  

 \r

  커서를 현재 줄 처음으로 이동

 

 캐리지 리턴

 \n

  커서를 다음 줄로 이동

 

 라인피드

 

 

수량자

 수량자

내용 

예제

설명 

 {3} 

 3개 존재하는 문자 검색

 [A-Z]{3}

대문자 A~Z 중 3글자 

{4,}

 4개 이상 존재하는 문자 검색

 [A-Z]{4,}

대문자 A~Z 중 4글자 이상 

 {2,4}

 2개 이상 4이하 존재하는 문자 검색

 cis{2,4}co

 cissco, cisssco, cissssco

 

 

탐욕적 수량자

 

<a>.*</a>

 

<a>test</a>abc<a>test</a>

 


게으른 수량자

 

<a>.*?</a>

 

<a>test</a>abc<a>test</a>

 

 

 

클래스

 클래스

내용 

 [3579]

  3, 5, 7, 9

 [2-9]

  2, 3, 4, 5, 6, 7, 8, 9

 [^2-9]

  0, 1

 [0-9a-zA-Z]

  모든 숫자/문자

 [\f\r\t\n\v]

  모든 공백

 

 

옵션

옵션 

 내용

예제

 i

  대소문자 구분 없이 검색

  pcre:"/select/i"

 s

  줄이 넘어가도 문자열을 1줄로 인식하여 . 기능 동작

  pcre:"/select/s"

 x

  패턴에 존재하는 모든 공백 무시

  pcre:"/seletc/x"

 

 

HTTP 옵션

옵션 

 내용

 예제

  M (http_method)

 HTTP 메소드 패턴 매칭

  pcre:"/get/Mi"

  U (http_uri)

 정규화된 URL 디코딩 문자열 패턴 매칭

  pcre:"/cisco/Ui"

  H (http_header)

 정규화된 HTTP 요청 메세지 Header 내용 패턴 매칭

  pcre:"/select/Hi"

  P (http_client_body)

 HTTP 요청 메세지 Body 내용 패턴 매칭

  pcre:"/select/Pi"

  S (http_stat_code)

 HTTP 응답 코드 패턴 매칭

  pcre:"/200/S"

  Y (http_stat_message)

 HTTP 응답 상태 메세지 패턴 매칭

  pcre:"/OK/Y"

 

 

[유튜브] 동영상 강의 링크 (구독! 좋아요!!!)

 

Snort - 3. Snort Rule 구조   https://youtu.be/kVnHpmXGi_g



[출처] https://net123.tistory.com/579

반응형

댓글()

MongoDB 쿼리 - 페이지 출력을 위한 skip, limit 사용하기

리눅스/MongoDB|2020. 10. 6. 13:07
반응형

MongoDB 쿼리

> db.Sysdocu.find().skip(20).limit(10)


* 설명 : Sysdocu 컬렉션에서 20개의 도큐멘트를 제외하고 10개만 출력 합니다.



반응형

댓글()

MongoDB 명령어를 이용한 bson -> json 변환

리눅스/MongoDB|2020. 9. 24. 16:53
반응형

bson > json 변환


# bsondump file.bson |head


head 명령 수행시 10줄의 라인을 미리 출력해볼 수 있습니다.

전체를 변환하기 위해서는 아래와 같이 해보세요.


# bsondump file.bson > newfile.json







반응형

댓글()

error 로그에서 favicon.ico 로그 남기지 않기

리눅스/APACHE|2020. 9. 22. 08:06
반응형

httpd.conf 파일에 아래 내용 삽입하고 데몬 재시작 하면 됩니다.



Redirect 404 /favicon.ico


<Location /favicon.ico>

    ErrorDocument 404 "No favicon"

</Location>


반응형

댓글()

[fping] network 대역으로 ping 체크하기

리눅스/Network|2020. 9. 14. 07:32
반응형

패키지 설치

# apt install fping

 

버전 확인

# fping --version
fping: Version 4.2

 

스캐닝

# fping -g 192.168.10.0/24

 

1개 호스트 포트 체크 (다운된 서버도 10 milliseconds 이내 응답)

# fping -t 10 192.168.10.2

 

PHP 에서 실행할때

$cmd = "/usr/sbin/fping -t 10 192.168.10.2";
$check = shell_exec($cmd);

echo $check;

 

반응형

댓글()

MySQL 8 계정 패스워드 변경 (일반 변경, 분실 변경)

리눅스/MySQL|2020. 9. 1. 15:45
반응형

아래는 root 계정의 패스워드를 변경하는 방법입니다.

 

 

1) root 패스워드를 알고 있을 경우

 

(mysql 로그인 후)

mysql> use mysql;

mysql> alter user 'root'@'localhost' identified with mysql_native_password by '12345678';

mysql> flush privileges;

 

* 위에서 패스워드 암호형식은 mysql_native_password 또는 caching_sha2_password 가 있습니다.

 

2) root 패스워드를 모를 경우

 

# systemctl stop mysql

 

패스워드를 체크하지 않도록 설정 파일 옵션 추가

- 설정 파일 : /etc/mysql/mysql.conf.d/mysql.cnf

- 추가 옵션 : [mysqld] 섹션에 아래 옵션 추가

                       skip-grant-tables

 

# systemctl start mysql

 

# mysql -p

Enter password: (비밀번호 없이 그냥 엔터)

 

(mysql 로그인 후)

mysql> use mysql;

mysql> alter user 'root'@'localhost' identified with mysql_native_password by '12345678';

mysql> flush privileges;

 

* 위에서 패스워드 암호형식은 mysql_native_password 또는 caching_sha2_password 가 있습니다.

 

설정 파일 옵션 제거 후 다시 mysql 재시작

 

# systemctl restart mysql

 

반응형

댓글()

Let's encrypt 설치 및 무료 SSL 인증서 발급 받기 (Ubuntu 20.04, 22.04)

리눅스/APACHE|2020. 9. 1. 13:07
반응형

무료 SSL 인증서를 발급받는 방법입니다.

단, 기간은 3개월이며 만료 한 달 전부터 갱신을 할 수 있습니다.

방법은 아래와 같습니다.

 

1. Let's encrypt 설치

 

root@sysdocu:~# apt -y install letsencrypt

 

2. 인증서 발급

 

(단일 도메인 SSL 발급)

root@sysdocu:~# letsencrypt certonly -a webroot --agree-tos -m [이메일] -w [웹소스 디렉토리] -d [SSL 도메인명] --rsa-key-size 4096

 

(다중 도메인 SSL 발급)

root@sysdocu:~# letsencrypt certonly -a webroot --agree-tos -m [이메일] -w [웹소스 디렉토리] -d [SSL 도메인명] -w [웹소스 디렉토리] -d [SSL 발급도메인명] --rsa-key-size 4096

 

이와 같이 실행하면 웹페이지가 정상 접근 가능한 상태일때 인증서가 발급되어 집니다.

아래 디렉토리로 이동하여 인증서 파일을 확인합니다.

 

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/[도메인]/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/[도메인]/privkey.pem

 

3. 인증서 설정

 

실제 인증서는 /etc/letsencrypt/archive/[도메인] 에 있으나, 인증서를 업데이트 할때마다 파일명이 바뀌므로

아래 위치에 있는 심볼록 링크 파일을 virtualhost 설정 항목에 넣어 주어야 자동으로 갱신된 인증서로 연결 가능합니다.

 

<VirtualHost *:443>

DocumentRoot [웹소스 디렉토리]

ServerName [도메인명]:443

...

SSLEngine on

SSLCertificateFile /etc/letsencrypt/live/[도메인명]/cert.pem

SSLCertificateKeyFile /etc/letsencrypt/live/[도메인명]/privkey.pem

SSLCertificateChainFile /etc/letsencrypt/live/[도메인명]/fullchain.pem

</VirtualHost>

 

수정 후 apache2 를 재시작하여 적용 합니다.

 

root@sysdocu:~# systemctl restart apache2

 

 

4. 인증서 갱신

 

root@sysdocu:~# vi /root/ssl-renew.sh

#!/bin/bash
/usr/bin/letsencrypt certonly -a webroot --agree-tos --renew-by-default -w [웹소스 디렉토리] -d [SSL 도메인명]
systemctl restart apache2

root@sysdocu:~# chmod 700 /root/ssl-renew.sh

 

두 달에 한 번씩 1일, 16일에 갱신 시도를 하도록 설정 합니다.

 

root@sysdocu:~# echo "01 00 01,16 */2 * root sh /root/ssl-renew.sh" >> /etc/crontab

 

반응형

댓글()

원격 DB 테이블 연결하기

리눅스/MySQL|2020. 8. 13. 11:03
반응형

DB1 에서 우선 테이블 생성(일반적인 create 문, 물론 이미 생성된 table을 사용해도 된다. 테스트를 위해 새로 create)

 

CREATE TABLE `db_test1` (
  `a1` varchar(10) DEFAULT NULL,
  `a2` varchar(10) DEFAULT NULL,
  `a3` varchar(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 

 

DB2 에서 federated 테이블을 생성해야 한다.

 

CREATE TABLE `db_test1` (
  `a1` varchar(10) DEFAULT NULL,
  `a2` varchar(10) DEFAULT NULL,
  `a3` varchar(11) DEFAULT NULL
) ENGINE=FEDERATED DEFAULT CHARSET=utf8

CONNECTION='mysql://접속ID:패스워드@도메인(또는 IP):포트/datebase명(ex:DB1)/테이블명(ex:db_test1)';

 

주의)

1. 컬럼명을 똑같이 맞춰줘야 한다.

2. 원본 데이터 db에 스키마가 바뀌면, federated 테이블을 drop하고 다시 생성해야 한다.

 -> federated 테이블은 스키마 변경 불가. 드랍하고 다시 create해야함

3. 패스워드에 '@' 골뱅이가 들어가면 안된다. 패스워드 변경해야함



출처: https://jang8584.tistory.com/245 [개발자의 길]

 

반응형

댓글()

MySQL 테이블 partition 설정 하기

리눅스/MySQL|2020. 6. 30. 12:00
반응형

1. 지원 확인


mysql 에 로그인하여 아래 명령으로 지원 여부를 확인 합니다.


mysql> show variables like '%partition%;    // have_partitioning 항목 확인


MySQL 5.6.29 버전부터는 아래 명령으로 확인이 가능 합니다.


mysql> show plugins;  // partition 항목 확인



2. 사용 예제


파티셔닝은 테이블의 데이터가 많거나 용량 사이즈가 커서 데이터 입출력이 느린 경우 사용합니다.

여기에서는 처리를 빠르게 하기 위해 데이터를 연도를 기준으로 나누는 예제를 준비 하였습니다.



1) 기존 일반 테이블을 파티셔닝 테이블로 변경


(일반 테이블 생성)


mysql> create table test (id int(10) AUTO_INCREMENT PRIMARY KEY, Name varchar(20), Insert_time DATETIME);


(파티셔닝 적용)


mysql> alter table test PARTITION BY RANGE (TO_DAYS(Insert_time))

(

PARTITION p2017 VALUES LESS THAN (TO_DAYS('2018-01-01')),

PARTITION p2018 VALUES LESS THAN (TO_DAYS('2019-01-01')),

PARTITION p2019 VALUES LESS THAN (TO_DAYS('2020-01-01')),

PARTITION p2020 VALUES LESS THAN (TO_DAYS('2021-01-01')),

partition eternal values less than MAXVALUE

);


위 네 개의 조건에 해당되지 않는 데이터는 (2021년 이후 데이터) eternal 이라는 파티션에 저장 하도록 했습니다.

   (생략 가능)

* 파티션 이름은 반드시 영문으로 시작해야 합니다.

* LESS 는 미만을 뜻합니다.

* 추후에 2021년도 파티션 생성을 원할 경우 MAXVALUE 삭제 후 2021 년, MAXVALUE 를 차례로 다시 생성하는 방법으로 추가가 가능합니다.


mysql> alter table test drop partition eternal;

mysql> alter table test add partition (PARTITION p2021 VALUES LESS THAN (TO_DAYS('2022-01-01'))); 

mysql> alter table test add partition (PARTITION eternal VALUES LESS THAN MAXVALUE);


* 파티션 설정 쿼리 실행시 PRIMARY KEY 관련 에러가 출력 될 수 있습니다.

ERROR 1503 (HY000) at line 25: A PRIMARY KEY must include all columns in the table's partitioning function


이경우 show create table {테이블 이름} 을 실행하여 출력 내용을 참고 합니다.


PRIMARY KEY (`id`) 이렇게 있으면 안되고

KEY `id` (`id`) 이렇게 되어 있어야 됩니다.



2) 처음부터 파티셔닝 테이블 생성


mysql> CREATE TABLE test (

  id int(10) AUTO_INCREMENT,

  Name varchar(20),

  Insert_time DATETIME,

  KEY id (id)

) ENGINE=InnoDB CHARSET=utf8

PARTITION BY RANGE(TO_DAYS(Insert_time)) (

  PARTITION p2017 VALUES LESS THAN (TO_DAYS('2018-01-01')),

  PARTITION p2018 VALUES LESS THAN (TO_DAYS('2019-01-01')),

  PARTITION p2019 VALUES LESS THAN (TO_DAYS('2020-01-01')),

  PARTITION p2020 VALUES LESS THAN (TO_DAYS('2021-01-01')),

  partition eternal values less than MAXVALUE

);



3) 파티션 추가 & 삭제


위에서 파티션 추가 예시처럼 사용하시면 됩니다.

mysql> alter table test add partition (PARTITION p2021 VALUES LESS THAN (TO_DAYS('2022-01-01'))); 

mysql> alter table test drop partition p2021;



4) 파티션 없는 일반 테이블로 변경 (데이터 합치기)


mysql> alter table test remove partitioning;



반응형

댓글()

CMD 에서 명령 결과를 변수에 저장하기

리눅스/OS 일반|2020. 6. 4. 17:00
반응형
명령프롬프트에서 실행
(배치파일에서 사용할때는 %F 대신 %%F 를 사용)

FOR /F "tokens=* USEBACKQ" %F IN (`c:\mysql\bin\mysql.exe -uID -p"PW" test -N -e "select name from members where id='12'"`) DO ( SET var=%F )

이렇게 명령을 수행한 경우 var 라는 변수에 들어갑니다.

* 참고
내용 확인은 아래와 같이 합니다.

echo %var%



반응형

댓글()

Ubuntu 18.04 에 /etc/rc.local 이 안보일 경우

리눅스/OS 일반|2020. 6. 2. 15:59
반응형

우선 아래 경로에 파일이 있는지 확인 합니다.

# ls -al /lib/systemd/system/rc-local.service 

 

파일이 있을 경우, 아래와 같이 파일에 내용 추가 합니다.

echo -e "[Install]\nWantedBy=multi-user.target" >> /lib/systemd/system/rc-local.service

 

스크립트 파일을 생성합니다.

# touch /etc/rc.local

# chmod 755 /etc/rc.local

 

그리고 부팅시 자동 구동 되도록 해주면 됩니다.

# systemctl enable rc-local.service

# systemctl start rc-local.service

 

 

반응형

댓글()