[시스템 보안 및 실무/시스템·네트워크 보안] - NSM / Security Onion
지난 게시글에 이어 Snort 문법 중 규칙옵션 부터 시작합니다.
방화벽은 악성코드를 탐지할 수 없음. / ids는 악성코드 탐지 가능(차단 능력은 없음)
규칙옵션
규칙 헤더에 해당하는 패킷 중 특정(문자열)을 정의해 놓은 영역입니다. 옵션 종류에는 일반옵션, 흐름 옵션, 페이로드, HTTP 관련 옵션 등이 있고, 이 옵션들은 ;(세미콜론)으로 구분합니다.
일반옵션
일반옵션은 시그니처가 포함되어 있지 않습니다. 시그니처는 관제할 detection이나 특정 문자열을 의미합니다. 규칙에 대한 정보를 제공하는 옵션으로 검색하는 동안 어떤 영향도 미치지 않습니다.
detection rule name : msg : 관제 룰 이름
detection rule number : sid : nids가 생성해서 사용하는 이름
msg: 룰이 탐지될때 출력되는 메시지, 그냥 이름이라고 생각하면 됨
sid: 식별번호, 제공되는 식별자는 2,999,999번까지 있음.(무료제공) / 직접 만드는 룰은 3,000,000번부터 시작
무료제공 rule은 기존에 알려진 공격들의 signiture / 유료로 제공되는 rule / 자체 rule
Payload 옵션
Payload옵션은 악성 패킷을 탐지하는 옵션입니다.
문자열 지정 : content:"admin";
숫자 지정 : content:"|585858|";
정규표현식 지정 : pere:"/^select/";
offset은 content 패턴을 검사할 시작위치를 설정하는 것이고, 첫번째 바이트 위치가 0부터 시작합니다.
depth는 offset부터 몇바이트까지 검사할 것인지를 지정합니다.
contet:"a"
detpt:2
offset:2
-> 2번부터 2칸인 2~3바이트 사이에 a라는 값이 있는지
distance는 이전 content 패턴이 매치된 경우, 매치된 바이트로부터 몇 바이트 떨어진 위치에서 다음 content를 검사할 것인지를 지정합니다.
within은 distance부터 몇바이트 범위 내에서 지정된 패턴을 검사할 것인지 지정합니다.
content:"b
distance:3
within:3
-> 이전 값으로부터 3칸 떨어진 곳부터 3칸 즉, n~n+2사이에 b라는 값이 있는지
Threshold
Threshold는 제한된 범위를 두고 사용하는 것입니다.
그냥 이런일이 있었어! both
시간별로 이런일이 발생했었어! limit
얼마나 발생했었어! threshold
Header Rule Option
Detection Rule 예제
alert tcp $EXTERNAL_NET any -> $HOME_NET any (
msg: "TEST"; content: "S"; offset:2; depth:2;
content:"R"; distance:3; within:2; sid:1000001;)
[Rule 해석]
3번째 바이트부터 2바이트 범위에 content(S)가 있는지 검사, 패턴 검사 후 3바이트 떨어진 위치에서 2바이트 범위 내에 content(R)이 있는지 확인
alert tcp $EXTERNAL_NET any -> $HOME_NET any(
msg: "TEST"; content:|FFFF|; offset:9; depth:2; sid:1000001;)
[Rule 해석]
10번째 바이트부터 2바이트 범위에 FFFF 바이너리 패턴이 있는지 확인
alert tcp any any -> any 22 (content: "login"; depth:10;)
[Rule 해석]
첫번째 바이트부터 10바이트 범위 내에 content값이 포함되어 있는지 확인
offset이랑 depth는 세트인데 offset이 없으면 offset:0이라고 생각하면 됩니다.
drop tcp any any -> any any (msg: "SYN/FIN Drop"; flags:SF;)
[Rule 해석]
SYN와 FIN이 동시에 설정되어 있는 TCP 패킷 차단
SYN은 연결 요청, FIN는 연결 종료를 위한 플래그이므로 동시에 설정될 수 없는 비정상 패킷
비정상 패킷은 IDS/IPS의 탐지를 우회하여 공격 또는 스캐닝 을 위한 목적으로 사용되므로 이를 탐지 및 차단해야 합니다.
alert tcp any any -> any 80(
msg:"XSS Detect"; content:"GET"; offset:0; depth:3;
content:"/login.php?id=%3Cscript%3E"; distance:1; sid:1000500);
[Rule 해석]
0바이트부터 3바이트 내에서 content 값이 있는지 확인하고, 또 get을 찾은 자리로부터 1바이트 떨어진 구간에서 contet값이 있는지 확인
alert tcp any any <> any [443,465,563](
msg:"SSLv3 Malicious Heartbleed Request V2";
content: "|18 03 00|"; depth:3;
content: "|01|"; distance:2, within:1;
content: !"|00|"; within:1; sid:100300;)
[Rule 해석]
0부터 3바이트 사이에서 18 03 00을 찾고, 찾은 그문자에서 2바이트 떨어진 1바이트 구간에서 01이 있는지 확인. 그리고 그 문자를 찾은 곳에 이어 1바이트 내에 00이 포함되어 있지 않다면 관리자에게 알림
관제 rule 생성
1) Kali, Metasploitable, Client NIDS 모두 구동합니다.
2) NIDS에서 관리자 권한으로 실행합니다.
security@security:~/Desktop$ sudo su -
3) rule을 편집할 수 있는 폴더로 이동합니다.
root@security:~# cd /etc/nsm/rules
root@security:/etc/nsm/rules# ls
4) 회사 환경에 맞는 signature를 생성합니다.
root@security:/etc/nsm/rules# nano local.rules
[파일 안에 작성]
alert icmp any any -> any any ( msg:"ICMP Ping Test"; sid: 3000001; )
=> 어디에서 어디로 가든지, 어느포트로 가든지 관제사(나)에게 알려줘
5) 작성 내용을 확인합니다.
root@security:/etc/nsm/rules# cat local.rules
6) 룰을 작성하면 업데이트를 합니다.
root@security:/etc/nsm/rules# rule-update
위 명령어를 실행해서 오류가 없다면 OK 4개가 뜹니다.
만약 룰에 오류가 나서 다시 작성해야하는 경우, 룰을 작성하고 다음 코드를 실행 후 룰을 업데이트합니다.
nsm --senser --restart --only-snort-alert
7) 이제 Ping 테스트를 통해 관제 룰이 잘 작동하는지 확인합니다.
Client(Window)로 가서 cmd를 열어 아래 명령어를 입력합니다.
ping 192.168.10.20
ping 192.168.10.30
NIDS(Security Onion)으로 가서 Sguil(스구일)을 실행합니다.
스구일에서 ICMP Ping Test를 확인할 수 있습니다.
시그니처를 사용한 관제 rule 생성
telnet 공격을 감지하기 위한 관제 rule을 생성하고자합니다.
1) Kali에서 관리자 권한으로 실행합니다.
$ sudo su
2) 공격패턴을 감지합니다.
# telnet 192.168.10.20
metasploitable login과 password는 이상한 값을 넣습니다. 그러면 동일하게 뜨는 메시지가 Login incorrect 인것을 알 수 있습니다.
패스워드 크래킹: 패스워드를 알아내는 공격
관제사는 패스워드 크래킹 관련 룰을 만들어야함.
이 룰에서 시그니처를 발견해야함.
<<관제사가 발견>>
192.168.10.20의 텔넷 패스워드 크래킹 시그니처 판독해야합니다.
패스워드를 잘못 입력하는 경우는 meta가 Login incorrect를 반환해주는것을 발견해야합니다.
관제사는 룰을 만드는데 Login incorrect 이것이 많이 들어오면 나에게 알려줘, 로그를 남겨줘 라고 룰을 생성합니다.
NIDS에서 Sguil을 열어 확인해보면 GPL TELNET Bad Login을 볼 수 있습니다. GPL TELNET Bad Login을 클릭하고 하단 Show Rule을 체크하면 어떤 룰이 작동되었는지 확인할 수 있습니다. 앞쪽에 숫자는 카운트를 의미하는데, 같은 룰에 의해 관제되는 것은 새로운 목록으로 추가되는 것이 아닌 카운트가 올라갑니다. GPL은 제공되는 룰에 의한 탐지입니다.
3) 위에서 발견한 공격패턴을 가지고 패스워트 크래킹 룰을 생성해보겠습니다.
NIDS에서 룰을 작성합니다.
root@security:/etc/nsm/rules# nano local.rules
[파일 안에 작성]
alert tcp 192.168.10.20/32 23 -> any any ( msg:"Telnet Fail"; content:"login incorrect"; nocase; sid: 3000003; )
=> tcp 트래픽에 대해서 192.168.10.20/32 23에서 어디로든 가는 트래픽 중 대소문자 상관없이 login incorrect라는 문자열이 있다면 관제사(나)에게 알려줘
4) 룰을 작성하면 업데이트를 합니다.
root@security:/etc/nsm/rules# rule-update
* 오류발생시 수정후 nsm --senser --restart --only-snort-alert 명령어 실행하고 업데이트
5) 관제 룰이 작동하는지 확인합니다.
Kali에서 다음 명령어를 입력합니다. 로그인과 비밀번호는 아까와 같이 잘못된 값을 넣으면 됩니다.
# telnet 192.168.10.20
NIDS에서 Sguil을 확인해보면 Telnet Fail이 감지된 것을 알 수 있습니다.
Treshold를 사용한 관제 rule 생성
이전 실습에서 보면 로그인과 패스워드를 틀렸다고 무조건 공격으로 볼 수는 없습니다. 그래서 시그니처 값 뿐만 아니라 Treshold 값을 지정해서 룰을 만들 수 있습니다.
1) NIDS에서 룰을 작성합니다.
root@security:/etc/nsm/rules# nano local.rules
[파일 안에 작성]
alert tcp 192.168.10.20/32 23 -> any any ( msg:"Password Crack"; threshold:type both, track by_src, count 3, seconds 30; content:“login incorrect“; nocase; sid:3000003; )
=> type both : 단순히 '이런 일이 있었어~'를 체크 / content 값이 30초 동안 3건 발생하면 하나의 로그를 남기라는 의미
=> Threshold : 동일한 특정 패킷이 관리자가 설정한 시간 안에 일정 수가 발견되면 경고를 출력해주는 것
=> limit : count 동안 횟 수번째 트래픽까지 탐지 / threshold : 횟수 마다 계속 탐지 / both : count 동안 횟수 만큼 트래픽이 탐지될 시1번 만 탐지 / by_src : 출발지 패킷만 해당 / by_dst : 도착지 패킷만 해당
2) 룰을 작성하면 업데이트를 합니다.
root@security:/etc/nsm/rules# rule-update
5) 관제 룰이 작동하는지 확인합니다.
Kali에서 다음 명령어를 입력합니다. 로그인과 비밀번호는 아까와 같이 잘못된 값을 넣으면 됩니다.
# telnet 192.168.10.20
NIDS에서 Sguil을 확인해보면 Password Crack이 감지된 것을 알 수 있습니다.