서버에 로그인 (계정 환경 불러오기) 될때마다 Telegram 으로 관리자에게 알람 주는 방법

리눅스/Security|2024. 4. 18. 12:23
반응형

리눅스 서버에 로그인 (SSH 또는 로컬) 이벤트가 발생하면 Telegram bot 을 이용해 관리자에게 알람을 주는 방법입니다.

접속자의 IP 와 계정 정보를 Telegram 메세지로 발송 함으로써 보안 이슈를 감지하고 차단할 수 있습니다.

이러한 기능을 구현하려면 몇 가지 단계를 따라야 합니다.

이 작업을 수행하기 위해서는 Bash 스크립트 작성, Telegram Bot 생성, CHAT_ID 수신 허용, 그리고 Profile 환경 설정 파일에 로그인 이벤트와 스크립트를 연동하는 과정이 포함됩니다.

 


1. Telegram Bot 생성 및 API 토큰 획득

 

Telegram Bot 생성: Telegram 에서 BotFather 를 검색하여 시작합니다. /newbot 명령을 입력하고, Bot 의 이름과 유저네임을 설정합니다.

API 토큰 획득 : Bot 생성이 완료되면, BotFather 는 API 토큰을 제공합니다. 이 토큰은 HTTP API 를 통해 메시지를 보낼 때 사용됩니다.

 

텔레그램에서 @BotFather 검색 > 대화창에 /newbot 입력 이후, 요청하는 절차대로 진행하면 됩니다.

메세지 수신을 위해서는 텔레그램에서 봇이름 검색 후 대화창에서 [시작] 버튼을 눌러줍니다. 그래야 봇이 보내주는 메세지를 로그인 계정에서 받을 수 있는 허용 상태가 됩니다.

 

 

2. Bash 스크립트 작성

 

아래는 서버에 로그인 시 실행될 Bash 스크립트의 예입니다.

이 스크립트는 사용자 이름과 IP 주소를 추출하여 Telegram Bot API를 사용해 메시지를 보냅니다.

 

# vi /etc/alert_login.sh

#!/bin/bash

# Telegram 설정 (텔레그램 봇 API KEY, 수신자 CHAT_ID)

API_KEY="12345678:ABFNrluQnrwChMl1z-tA36w"
CHAT_ID="00112233"

# 로그인 정보 추출

USER=`whoami`
TTY=`tty | sed -e 's/\/dev\///'`
IP_ADDRESS=`who | grep "$TTY " | sed -e "s/.*(//" -e "s/)//"`
if ! echo "$IP_ADDRESS" | grep -q "."; then
    IP_ADDRESS="localhost"
fi

# 메시지 전송

MESSAGE="서버 로그인이 감지 되었습니다.
- 서버 : 파일 서버
- 로그인 ID : $USER
- 접속자 IP : $IP_ADDRESS"
URL="https://api.telegram.org/bot$API_KEY/sendMessage"

curl -s -X POST $URL -d chat_id=$CHAT_ID -d text="$MESSAGE" > /dev/null 2>&1 &

 

* 설명

whoami 명령 : 현재 로그인한 사용자의 이름을 반환합니다.

"$TTY " : 문자 뒤에 한칸 띄운 이유는 동일한 숫자로 시작되는 다른 TTY 를 가져오지 않기 위해서 입니다.

curl : 마지막에 null 처리하여 처리 결과를 콘솔에 출력시키지 않습니다.

 

스크립트 파일에 실행 권한을 부여합니다:

# chmod +x /etc/alert_login.sh

 

 

3. Profile 환경 설정 파일에 연결

 

서버에 로그인 시 스크립트가 자동으로 실행되도록 하려면, /etc/profile 파일에 스크립트 실행 명령어를 추가합니다:

# echo "sh /etc/alert_login.sh" >> /etc/profile

 

* 주의

위 설정은 모든 로그인 계정에서 강제로 실행됩니다.

특정 사용자의 계정에게만 적용하고자 한다면 개별 사용자의 .bash_profile 또는 .bashrc 에 스크립트를 추가하면 됩니다.

 

위의 단계를 완료하면, 서버에 로그인할 때마다 해당 사용자의 로그인 정보가 Telegram Bot 을 통해 관리자에게 알림으로 전송됩니다.

 

 

4. 쉘스크립트 암호화 (선택)

 

쉘스크립트에 Telegram Bot API KEY 와 사용자의 CHAT_ID 가 포함되어 있어 누군가 확인할 우려가 있을 경우 쉘스크립트를 바이너리 파일로 변경할 수 있습니다.

우선 필요한 패키지를 설치하고 위에서 작성했던 쉘스크립트를 암호화 합니다.

shc 패키지 설치시 gcc 패키지도 필요합니다.

# apt -y install shc gcc

# shc -f /etc/alert_login.sh -o /etc/alert_login

 

/etc/profile 파일에서 쉘스크립트 실행 명령을 바이너리 파일 실행 명령으로 바꿉니다.

- 기존 : sh /etc/alert_login.sh

- 변경 : /etc/alert_login
# sed -i 's/sh \/etc\/alert_login.sh/\/etc\/alert_login/' /etc/profile

 

변경이 완료되었으면 테스트를 해봅니다. 이상이 없는 경우 기존 쉘스크립트는 삭제해 두는 것이 좋습니다.

# rm -f /etc/alert_login.sh*

 

반응형

댓글()

CentOS 8 Http 2.4 에 mod_security 설치하기 (YUM)

리눅스/Security|2020. 11. 12. 10:30
반응형

CentOS 8, yum 으로 설치된 httpd 에 mod_security 를 추가로 설치하는 방법입니다.


1. 모듈 설치

# dnf -y install mod_security


2. OWASP 룰 설치 및 적용

# cd /etc/httpd

# git clone https://github.com/SpiderLabs/owasp-modsecurity-crs.git


# cd owasp-modsecurity-crs

# cp -arp crs-setup.conf.example /etc/httpd/modsecurity.d/crs-setup.conf

# vi /etc/httpd/modsecurity.d/crs-setup.conf

문서 하단부의 pass 를 deny 로 변경

SecAction \

 "id:900990,\

  phase:1,\

  nolog,\

  deny,\

  t:none,\

  setvar:tx.crs_setup_version=320" 


# cd rules

# cp -arp ./* /etc/httpd/modsecurity.d/activated_rules/


# cd /etc/httpd/modsecurity.d/activated_rules/

# cp -arp REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf.example REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf

# cp -arp RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf.example RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf


3. 적용

# systemctl restart httpd


4. 확인

웹브라우저에서 다음과 같이 웹페이지로 공격시도를 해봅니다.


http://도메인/index.html?cmd=rm



반응형

댓글()

Snort 규칙 (공격 분류, 우선 순위 정보 포함)

리눅스/Security|2020. 10. 6. 15:02
반응형
posted by 초식사자 2010/11/30 13:58

-규칙 헤더

alert tcp $EXTERNAL_NET any -> $HOME_NET 21

 

헤더

내용

alert

alert, log, pass, dynamic, activate

출력 포맷을 의미한다. 이 출력 포맷은 연결리스트 트리 헤더의 맨 상위 부분과 비교된다.

tcp

TCP, UDP, IP,

ICMP

사용되는 프로토콜을 의미하며 연결리스트의 상위 부분과 비교된다.

$EXTERNAL_NET

·

출발지 IP 주소를 가리킨다. (기본 설정은 any)

any

any, 포트 번호

출발지 포트를 의미한다.

->

·

패킷의 방향을 가리킨다.

$HOME_NET

·

Snort 규칙에서는 $Variables를 이용한다. 변수는 snort.conf파일의 맨 앞부분에서 정의되며 나머지 부분에서 그 변수를 사용한다. Snort가 실행될 때 Snort 규칙 파서는 $HOME_NET 변수의 값을 snort.conf에 설정된 값으로 치환한다.

21

any, 포트 번호

공격의 목적지 포트이다. 해당 포트에 대한 모든 잠재적 공격을 모니터링 한다.

 

 

-규칙 옵션

(msg : "FTP EXPLOIT wu-ftpd 2.6.0 site exec format string overflow Linux"flow:to_server, establishedcontent: "|31c031db31c9b046cd8031c031db|"reference:bugtraq,1387reference:cve,CAN-2000-0573reference arachnids,287; classtype:attempted-admin; sid:344rev:4;)

 

규칙

내용

msg

경고에서 출력할 메세지이다.

flow

규칙 옵션은 탐지 플러그인과 연결되는 키워드를 포함하고 있는데 flow 옵션은 연결 리스트의 세 번째 축이며 clientserver 탐지 플러그인을 가리킨다.

clientserver 플러그인은 특정 패킷이 기존에 수립된 세션의 일부인지를 검사하기 위해 stream4 전처리기를 이용한다.

content

"|31c031db31c9b046cd8031c031db|" 패킷이 Rule Tree 노드와 일치한다는 것은 기존에 세션이 맺어졌다는 것을 의미한다. Snort는 content 옵션에 나온 문자열을 Boyer-Moore 검색 알고리즘으로 패킷과 비교한다.

Reference

이 키워드는 서드 파티 공격 정보에 대한 참조 정보를 제공한다. 예를 들어 이 부분에는 Bugtraq, McAfee, 각 벤더의 공격 정보에 대한 URL이 들어갈 수 있다.

Classtype

Snort는 사용자가 공격을 쉽게 이해하고 우선 순위를 결정할 수 있도록 공격을 몇가지 종류로 분류해 놓았다. 각 분류는 기본 우선 순위를 가지고 있기 때문에 사용자는 자신이 관찰한 이벤트의 우선 순위를 쉽게 결정할 수 있다. (1: 높음, 2: 중간, 3: 낮음)

Sid

Snort의 규칙을 구분하는 식별자이다. Snort의 모든 규칙은 식별 번호를 가지고 있으며, 리포팅 프로그램에서 규칙을 구분하는데 사용 되기도 한다. (규칙 정보 :http://www.snort.org/snort-db )

 

설명

~99

예약되어 있음

100~1,000,000

www.snort.org에서 배포하는 규칙

1,000,001~

커스텀 규칙

 

rev

규칙의 버전 번호를 가리킨다. 오픈 소스 커뮤니티에서 만든 Snort 규칙은 false-positive를 줄이기 위해 개정 절차를 거치게 됨에 따라 rev의 값이 변한다.

 

-기타 규칙 옵션

 

규칙

내용

depth

패턴을 찾기 위해 검사할 바이트 수를 지정한다.

offset

검색을 시작할 패킷의 특정 위치를 지정한다.

nocase

대소문자를 구별하지 않는다.

session

프로토콜 세션의 평문 데이터를 화면에 출력한다. 값으로 all 또는 printable을 사용한다.

uricontent

content 문자열을 전체 패킷과 비교하는 대신 URI 부분과 비교하게 한다.

priority

classtype에서 설정된 우선순위를 수동으로 덮어쓴다.

logto

해당 규칙의 로그를 특정 파일에 남긴다.

tag

특정 규칙과 관련된 추가 패킷을 로그로 저장한다.

tag:<HOST/SESSION>,<HOW MANY>,<SECONDS/PACKETS>,<SRC/DES>;

dsize

패킷 페이로드의 길이 또는 길이 범위를 명시한다.

rpc

원격지에서 접근 가능한 RPC 서비스를 식별한다. 이 규칙을 제대로 사용하기 위해서는 UDP 프로토콜의 목적지 포트 111를 사용하는 규칙에 포함해야한다.

rpc:<APPLICATION>,<PROCEDURE>,<VERSION>;

resp

능동적으로 프로토콜 연결을 끊는다.

 

TCP 옵션

설명

rst_all

양측 연결을 끊는다.

rst_rcv

수신측 연결을 끊는다.

rst_send

송신측 연결을 끊는다.

 

 

ICMP 옵션

설명

strings:icmp_all

양측 연결을 끊는다.

icmp_host

ICMP host unreachable 메시지를 전송한다.

icmp_net

ICMP network unreachable 메시지를 전송한다.

icmp_port

ICMP port unreachable 메시지를 전송한다.

 

 


공격 우선 순위

 

심각한 공격 (우선 순위 1)

공격 분류

내용

attempted-admin

관리자 권한 획득 시도

attempted-user

일반 사용자 권한 획득 시도

shellcode-detect

실행 가능한 코드 탐지

successful-admin

관리자 권한 획득 성공

successful-user

일반 사용자 권한 획득 성공

trojan-activity

네트워크 트로이 목마 탐지

unsuccessful-user

일반 사용자 권한 획득 실패

web-application-attack

웹 애플리케이션 공격

 

 

중간 수준의 공격 (우선 순위 2)

공격 분류

내용

attempted-dos

DoS 시도

attempted-recon

정보 유출 시도

bad-unknown

잠재적인 악성 트래픽

denial-of-service

DoS 탐지

misc-attack

사소한(miscellaneous) 공격

non-standard-protocol

비표준 프로토콜 또는 이벤트

rpc-portmap-decode

RPC 쿼리 디코드

successful-dos

DoS 공격

successful-recon-largescale

대규모 정보 유출

successful-recon-limited

정보 유출

suspicious-filename-detect

수상한 파일 이름 탐지

suspicious-login

수상한 사용자 로그인 탐지

system-call-detect

시스템 콜 탐지

unusual-client-port-connection

클라이언트가 비정상적인 포트를 사용함

web-application-activity

잠재적으로 취약한 웹 애플리케이션 접근

 

 

위험도가 낮은 공격 (우선 순위 3)

공격 분류

내용

icmp-event

일반 ICMP 이벤트

misc-activity

사소한 행위

network-scan

네트워크 스캔

not-suspicious

의심스러운 트래픽이 아님

protocol-command-decode

일반적인 프로토콜 명령 디코드

string-detect

수상한 문자열 탐지

unknown

알 수 없음

 

 

Flow Control

-Flow Control 옵션은 패킷의 방향을 클라이언트 서버 통신 스트림과 관련해서 정의 할 수 있도록 한다. 이 옵션은 Snort의 TCP 재조합 모듈과 함께 동작하며 패킷 content와 방향을 클라이언트 서버 구조와 관련해서 파악할 수 있도록 한다.

 -Flow Control 옵션

 

옵션

내용

to_server

서버로 전송된 패킷에 대해 true를 리턴한다.

from_server

서버로부터 받은 패킷에 대해 true를 리턴한다.

to_client

클라이언트로 전송된 패킷에 대해 true를 리턴한다.

from_client

클라이언트로부터 받은 패킷에 대해 true를 리턴한다.

only_stream

재구성된 패킷 또는 연결이 맺어진 스트림에 속한 패킷에 의해서만 활성화된다.

no_stream

only_stream과 반대의 의미를 가진다.

established

연결이 수립된 TCP 연결 또는 세션에 속한패킷에 의해서만 활성화 된다.

stateless

상태와 관계없이 규칙을 활성화할 때 사용된다. stateless 옵션을 사용할 때는 “flow:” 접두사를 붙이지 않는다.

 

 

IP옵션

 

옵션

내용

sameip

출발지와 목적지 ip주소가 동일한 패킷을 찾는다.

fragbits

IP 헤더의 분할 비트와 예약 비트를 분석한다.

 

설명

D

분할하지 않음 (Don't Fragment)

M

분할 패킷이 남아있음 (More Fagments)

R

예약 비트 (Reserved Bit)

 

ipopts

패킷을 비교하기위해 IP옵션을 지정한다. 한 규칙에서 한 가지 IP옵션만 적용 가능하다.

 

설명

eol

IP목록의 마지막을 지정한다.

lsrr

느슨한 소스 라우팅 (loose source routing)

ssrr

엄격한 소스 라우팅 (strict source routing)

rr

라우트 기록 (Record route)

satid

IP 스트림 식별자

sec

IPSec

ts

타임스탬프

nop

옵션이 없음

 

ID

패킷의 정적 IP ID값을 검사한다.

tos

TOS (Type of Service) 값을 검사한다.

TTL

TTL(Time to Live) 값을 검사한다. >, <, = 연산자도 지원한다.

 

 

TCP옵션

 

옵션

내용

seq

패킷의 정적 TCP 순서번호를 검사한다.

flags

특정 플래그가 설정되어 있는지 설정되어 있지 않은지, 다른 플래그와 함께 사용되는지를 판단한다.

 

설명

A

ACK 플래그

F

FIN 플래그

P

PSH 플래그

R

RST 플래그

S

SYN 플래그

U

URG 플래그

0

아무 플래그도 설정 되어 있지 않음

1

예약 비트1

2

예약 비트2

+

특정 플래그가 켜져있고 그 밖에 다른 플래그도 켜져 있는지 검사한다. ex:) A+

*

명시된 플래그 중 하나의 플래그라도 일치하는지 검사한다. ex:) *AS

!

특정 플래그가 꺼져 있는지 검사한다.

 

ack

ack 값이 0인지 검사한다.

 

 

ICMP 옵션

 

옵션

내용

icmp_id

ICMP ID 값을 검사한다.

icmp_seq

ICMP Sequence 값을 검사한다.

icode

ICMP Code 값을 검사한다.

itype

ICMP type 값을 검사한다.

 

 

Snort 규칙 트리 구성 요소

-규칙 사슬 집합

 

규칙

설명

Activation

경고를 발생시키고 또 다른 dynamic 규칙을 활성화한다.

Dynamic

Activation 규칙에 의해 활성화 되며 트래픽을 로그로 저장한다.

Alert

경고를 발생시키고 패킷을 로그로 남긴다.

Pass

패킷을 무시한다.

Log

트래픽을 로그로 저장한다. (경고를 발생시키지 않는다. )

 

 

-Rule Tree Nodes(RTN)

규칙 사슬 각각에 대하여 프로토콜별 연결리스트가 존재하는데 프로토콜별 연결 리스트의 맨 상당 노드를 RTN이라고 부른다.

 

규칙

설명

TCP

TCP 프로토콜

UDP

UDP 프로토콜

ICMP

ICMP 프로토콜

IP

IP 프로토콜

 

 

-Option Tree Nodes(OTN)

프로토콜 연결리스트 안에는 OTN이라고 불리는 규칙 옵션이 존재한다.

 

규칙

설명

Content

Boyer-Moore 패턴 비교 알고리즘에서 검사하는 컨텐츠

Flow

탐지 플러그인으로의 링크

 

 

패킷 비교

alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS

(msg:"WEB-IIS..\.. access"; flow:to_server,established; content : "|2e2e5c2e2e|"; reference: bugtraq,2218; reference:cve, CAN-199-0299; classtype:web-application-attack; sid:974; rev:6;)

 
 

 

 

 

과정

설명

규칙 헤더 검색

패킷이 탐지 엔진에 도착하면 Snort는 Activation, Dynamic, Alert, Pass, Log 순으로 규칙 헤더를 검색한다. 위 규칙의 출력 포맷은 Alert이기 때문에 Snort는 Activation과 Dynamic에서는 이 규칙을 찾지 못한다.

RTN 검색

그 다음에 Alert 사슬로 이동하는데 패킷을 비교하는 방법은 패킷의 프로토콜에 따라 다르다. TCP 노드 리스트에서는 IP와 Port 정보가 일치하는 규칙을 찾는다.

OTN 검사

일치하는 규칙을 찾았으면 그 RTN의 열을 따라가면서 각 OTN을 검사하여 일치하는 규칙을 찾는다.

옵션노드에는 탐지 플러그인을 가리키는 포인터와 문자열 검색 알고리즘을 사용하여 검사할 패턴이 존재한다.

※flow 플러그인은 패킷이 기존에 연결된 세션에 일치하는지를 검사한다.

패킷 내용 검색

규칙이 content 옵션을 포함하고 있을 경우 문자열 검색 알고리즘을 이용하여 패킷의 내용을 검색한다. content 옵션에는 2진, 텍스트, 그리고 2가지를 혼합한 형식의 데이터가 들어올 수 있다.

※Snort 2.0은 Aho-corasick, Wu-Manber, Boyer-Moore 세가지 패턴 매칭 알고리즘이 사용가능하다.

경고 발생

일치하는 규칙을 찾았으면 트리 구조를 빠져 나온 뒤 Alert 트리의 맨 꼭대기로 돌아와서 명시된 출력 포맷을 상용하여 경고를 발생시키고 모든 과정이 종료된다.

 

 

Pass 규칙

-특정 트래픽을 무시하고 싶은 경우 BPF 필터 언어를 사용하거나 Pass 규칙을 사용한다.

-Pass 규칙을 활성화 하려면 Snort 규칙 처리 순서를 변경해야하기 때문에 -o 옵션을 사용하여 규칙 처리 순서를 Pass, Activation, Dynamic, Alert, Log 순으로 바꾸어주어야 한다.

-Pass 규칙을 사용하는 경우 서명과 일치하는 모든 패킷은 무시한다.

※Pass 규칙은 모든 패킷을 통과시킬 우려가 있기 때문에 조심하여 사용해야 한다.

 

pass tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS

(flow:to_server,established; content:"|2e2e5c2e2e|";)

 

Log 규칙

-Log 규칙은 규칙과 일치하는 모든 패킷을 경고를 발생시키지 않고 단지 정의된 출력 포맷으로 로그로 저장하기 위해 사용된다.

※Log 규칙은 2진 모드로 실행된 Snort에서 제대로 동작하지 않는다.

 

log tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS

(flow:to_server,established; content:"|2e2e5c2e2e|";)

 

Dynamic, Activation 규칙

dynamic, Activation 규칙을 사용하면 패킷에 대한 경고를 발생시킨 뒤, 그 후에 따라오는 패킷들을 로그로 저장할 수 있다.

-activate 규칙의 activates 값과 dynamic 규칙의 activated_by 값이 두 규칙을 이어주는 역할을 한다.

 

EXTERNAL_NET에서 HTTP 서버로 향하는 트래픽 128개를 로그로 저장

activate tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS

(msg:"WEB-IIS ..\.. aceess";flow:to_server,established; activates:25;content : "|2e2e5c2e2e|"; reference:bugtraq,2218;reference:cve,CAN-199-0229;classtype:web-application-attack;sid:974;rev:6;)

dynamic tcp $EXTERNAL_NET any -< $HTTP_SERVERS $HTTP_PORTS

(activated_by:25; count:128;)

 


[출처] http://leekyu.net/board_03/522

반응형

댓글()

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

반응형

댓글()

httpd (apache2) 설정을 이용한 웹취약점 보완

리눅스/Security|2020. 3. 17. 13:57
반응형

아래 모듈을 사용하여 헤더 정보를 수정함으로써 XSS 등 여러가지 웹 취약점을 보완할 수 있습니다.

Virtualhost 안에 아래 내용을 넣거나 apache2.conf 등 메인 설정 파일에 등록하여 사용이 가능합니다.

아래 내용 적용 후 ZAP 등의 웹취약점 점검 도구를 이용하면 차이가 확연히 드러납니다.


<IfModule mod_headers.c>

    Header always set Strict-Transport-Security "max-age=15768000; includeSubDomains; preload"

    Header always set X-Content-Type-Options "nosniff"

    Header always set X-XSS-Protection "1; mode=block"

    Header always set X-Frame-Options "SAMEORIGIN" # ssl 설정에서는 이 부분을 적용하면 iframe 으로 해당 페이지를 불러오지 못하는 현상이 발생하므로 아래 옵션 사용법을 참고하여 불러오려는 도메인 주소를 등록합니다.

    Header always set X-Download-Options "noopen"

    Header always set X-Permitted-Cross-Domain-Policies "none"

    Header set Set-Cookie HttpOnly;Secure

</IfModule>


[참고]

X-Frame-Options 옵션은 아래와 같은 값으로 설정이 가능합니다.

"deny" : frame 으로 무조건 불러올 수 없다. 같은 도메인일 경우에도 접근 불가.

"sameorigin" : 같은 도메인일 경우 frame 으로 불러올 수 있다.

"allow-from" : 특정 도메인들을 frame으로 불러올 수 있도록 허용할 수 있다.

// 이런 형태로 사용합니다. "allow-from https://sysdocu.tistory.com/"


또 XSS 취약점이 여전히 존재한다면 아래와 같이 modsecurity 를 설치하여 해결이 가능합니다.

실제로 이 두 가지 셋팅만으로 High 단계의 취약점을 모두 해결 하였습니다.


# apt -y update


# apt -y install libapache2-mod-security2


# vi /etc/modsecurity/modsecurity.conf

SecRuleEngine On


# systemctl restart apache2



반응형

댓글()

웹취약점 점검 도구 OWASP ZAP 설치 및 실행방법

리눅스/Security|2020. 3. 6. 08:20
반응형

웹취약점 점검 도구 오와스프 잽 (OWASP ZAP) 은 java 8 이상의 버전을 필요로 합니다.



[ 환경 구성 ]

# yum -y install java                // CentOS 에서 설치

# apt -y install default-jdk    // Ubuntu 에서 설치



[ 설치 및 데몬 가동 ]

# cd /usr/local/src


(2020-03-05 기준 최신버전)

# wget https://github.com/zaproxy/zaproxy/releases/download/v2.9.0/ZAP_2.9.0_Linux.tar.gz


# tar xvzf ZAP_2.9.0_Linux.tar.gz ZAP_2.9.0/


# cd ZAP_2.9.0/


# ./zap.sh -daemon -host 0.0.0.0 -port 8080 -config proxy.behindnat=true -config api.addrs.addr.name=.*


브라우저에서 http://서버IP:8080 으로 접속하면 API 정보 페이지가 뜹니다.

해당 데몬은 API 설명을 보는 페이지 같습니다.

데몬이 실행되어 있지 않아도 아래와 같이 스캐닝이 가능합니다.



[ 스캐닝 ]

command line 에서 스캐닝 하기

# ./zap.sh -cmd -quickurl http://sysdocu.tistory.com -quickout /usr/local/src/report.xml -quickprogress



* 참고 (웹취약점 점검 도구 유/무료 성능 비교)

http://sectooladdict.blogspot.com/2017/11/wavsep-2017-evaluating-dast-against.html



[ 웹서비스 ]

웹서비스를 위해 php 파일을 만들고 shell_exec 로 실행할 경우 apache2 는 www-data 사용자의 권한을 갖게 되므로 아래와 같이 추가 작업을 해주어야 정상 동작 합니다.


로컬에서 www-data 권한으로 구동 되는지 우선 확인 합니다.


# sudo -u www-data /var/www/html/zap/zap.sh -cmd -quickurl http://sysdocu.tistory.com -quickout /var/www/html/report/sysdocu.tistory.com_20200310_144400.xml -quickprogress

Found Java version 11.0.6

Available memory: 16000 MB

Using JVM args: -Xmx4000m

Unable to create home directory: /var/www/.ZAP/

Is the path correct and there's write permission?


퍼미션 에러가 출력 되었으므로 해당 디렉토리를 만들고 권한을 부여 합니다.

# mkdir /var/www/.ZAP/

# chown www-data.www-data /var/www/.ZAP/



반응형

댓글()

httpd 2.4.41 에 mod_security 2.9.1 + OWASP 설치

리눅스/Security|2019. 12. 17. 12:38
반응형

httpd 는 2.4.11 이상의 버전에서 OWASP 룰을 사용하도록 합니다.

2.4.10 이전 버전에서는 OWASP 설정 파일 사용시 특정라인 구분을 이해하지 못하는 버그가 있습니다.

아래 예제는 2.4.41 환경에서 진행 했습니다.



1. mod_security 2.9.1 설치


# cd /usr/local/src

# wget https://src.fedoraproject.org/lookaside/pkgs/mod_security/modsecurity-2.9.1.tar.gz/0fa92b852abc857a20b9e24f83f814cf/modsecurity-2.9.1.tar.gz

# tar xvzf modsecurity-2.9.1.tar.gz

# cd modsecurity-2.9.1

# ./configure

# make

# make install

# cp -arp modsecurity.conf-recommended /usr/local/apache/conf/modsecurity.conf

# cp unicode.mapping /usr/local/apache/conf/



2. OWASP (Open Web Application Security Project) 룰 설치


룰은 편의를 위해 apache/conf 에 들어가서 다운로드 하도록 합니다.


# cd /usr/local/apache/conf

# git clone https://github.com/SpiderLabs/owasp-modsecurity-crs.git

# cd owasp-modsecurity-crs

# mv crs-setup.conf.example crs-setup.conf

# vi crs-setup.conf


# 추가

SecRuleEngine On

SecAuditEngine On

SecAuditLog /usr/local/apache/logs/mod_security.log

SecAuditLogParts ABCFHZ

SecDataDir /tmp 


* 또는 아래 룰 배포 사이트에서 원하는 버전을 수동으로 다운 받아 사용할 수 있습니다.

https://github.com/SpiderLabs/owasp-modsecurity-crs/releases


# wget https://github.com/SpiderLabs/owasp-modsecurity-crs/archive/v3.2.0.tar.gz

# tar xvzf v3.2.0.tar.gz



3. 아파치 설정


설정 파일을 열어 모듈을 추가 합니다.


# vi ../httpd.conf


LoadModule security2_module modules/mod_security2.so


<IfModule security2_module>

    Include conf/owasp-modsecurity-crs/crs-setup.conf

    Include conf/owasp-modsecurity-crs/rules/*.conf

</IfModule>


* mod_security 는 mod_unique_id 모듈을 필요로 합니다.

   기존 설정에 활성화 되어있지 않을 경우, 주석을 해제하여 활성화 하도록 합니다.


설정을 적용합니다.


# /usr/local/apache/bin/apachectl restart





반응형

댓글()

PAM 을 이용하여 sshd, vsftpd 계정별 IP 접근 제어

리눅스/Security|2019. 8. 9. 16:08
반응형

[sshd]

 

[root@sysdocu ~]# vi /etc/ssh/sshd_config

UsePAM yes    // 사용 설정

[root@sysdocu ~]# service sshd restart

 

[root@sysdocu ~]# vi /etc/pam.d/sshd

account    required     pam_access.so  // 맨 첫줄에 추가하여 access.conf 파일을 참조하도록 한다.

 

 

[vsftpd]

 

[root@sysdocu ~]# vi /etc/vsftpd/vsftpd.conf

pam_service_name=vsftpd    // 사용 설정 (연결할 파일명 명시)

[root@sysdocu ~]# service vsftpd restart

 

[root@sysdocu ~]# vi /etc/pam.d/vsftpd

account    required     pam_access.so  // 맨 첫줄에 추가하여 access.conf 파일을 참조하도록 한다.

 

 

[공통]

 

[root@sysdocu ~]# vi /etc/security/access.conf

- : sysdocu : ALL EXCEPT 192.168.10.2.  // 맨 하단에 추가 (반드시 IP뒤에 점을 찍어줘야 한다)

* 설명 : sysdocu 계정은 192.168.10.2 번 IP 를 제외하고 Block 처리 된다.

 

* 룰 설명 (콜론 : 으로 구분)

- 는 차단, + 는 허용

sysdocu 는 계정 (sysdocu superman 등 띄어쓰기로 설정 가능. 전체를 의미하는 ALL 또는 아래와 같이 EXCEPT 도 가능)

192.168.10.2. 192.168.10.0/24. 등으로 여러개를 추가 할 수 있다. (ALL EXCEPT 는 뒤에것을 제외한 모든것이라는 의미)

 

 

 

반응형

댓글()

간단한 iptables 기본 방화벽 형식 (특정 IP, PORT 제외하고 모두 차단)

리눅스/Security|2019. 2. 12. 16:16
반응형

*filter

:INPUT ACCEPT [0:0]

:FORWARD ACCEPT [0:0]

:OUTPUT ACCEPT [0:0]

-A INPUT -m tcp -p tcp -s 192.168.10.2 -d 192.168.10.2 -j ACCEPT  // 본 서버에서는 로컬 모든 포트 접속 가능하게 한다.

-A INPUT -m tcp -p tcp -s 192.168.10.3 -d 192.168.10.2 --dport 222 -j ACCEPT

-A INPUT -m tcp -p tcp -s 192.168.10.4 -d 192.168.10.2 --dport 222 -j ACCEPT

-A INPUT -m tcp -p tcp -d 192.168.10.2 -j DROP

COMMIT



192.168.10.3 / 4 : client
192.168.10.2 : server



룰 문제 없음 확인.

반응형

댓글()

CentOS 7 에 iptables 설치

리눅스/Security|2019. 2. 12. 13:22
반응형

구글링을 좀 했더니 CentOS 7 부터는 firewalld 라는 방화벽 데몬이 따로 돌아간단다. 

예전처럼 iptables를 사용하기 위해서는 systemctl 설정을 좀 건드려 줘야한다.



우선 작동 중인 firewalld 데몬을 중지 시킨 후 재부팅 시에도 올라오지 않도록 설정한다.


systemctl stop firewalld

systemctl mask firewalld



다음으로 iptables 명령어와 연관된 패키지를 설치한다. 

CentOS 설치할 때의 옵션에 따라 설치 되었을 수도 있다. 

나는 웹 서버 구성으로 설치 했더니 이미 설치 되어 있었다.


yum -y install iptables-services



iptables 서비스 데몬이 재부팅시에 자동으로 올라오도록 만들자

systemctl enable iptables



기본 룰셋 위치는 /etc/sysconfig/iptables 이다.



[출처] https://luckyyowu.tistory.com/286 [요우의 내맘대로 블로그]

반응형

댓글()

CentOS 7, OpenVAS 9 에서 PDF 파일 생성되지 않을때

리눅스/Security|2019. 2. 7. 12:07
반응형

CentOS 7 에 설치된 OpenVAS 9 에서 PDF 리포트가 생성되지 않을때 확인할 방법입니다.


먼저 아래와 같이 명령을 실행하면 PDF 리포트 가능 여부가 확인됩니다.

# openvas-check-setup


 ...

 Step 9: Checking presence of optional tools ...

       OK: pdflatex found.

       WARNING: PDF generation failed, most likely due to missing LaTeX packages. The PDF report format will not work.

       SUGGEST: Install required LaTeX packages.

 ...


그러면 아래와 같이 필요 패키지를 설치해보세요

 # yum install texlive-collection-latexextra

그래도 The package texlive-collection-latexextra is not available 라는 메세지가 출력되며 설치되지 않는다면, 아래와 같은 방법으로 해결해야 합니다.


1) 기존 설치 파일 모두 제거

# yum remove openvas openvas-manager


2) textlive 설치

# cd/usr/local/src

# wget http://mirror.ctan.org/systems/texlive/tlnet/install-tl-unx.tar.gz

# tar xvzf install-tl-unx.tar.gz

# cd install-tl-*

# ./install-tl


"options (O)" 누른 뒤 "create symlinks (L)" 를 선택 합니다.


for the texlive-binaries to: /usr/bin

manpages to: /usr/share/man

to: /usr/share/info


다시 메인페이지로 돌아가서 설치를 합니다.

Now return (R) to the main menu an install (I) texlive 


그다음, openvas-manager 를 설치해야 하는데, 그냥 yum install 할 경우 textlive 가 잘못 설치되어질 수 있으므로

openvas-manager 패키지만 받아 의전성 무시하고 설치를 합니다.


# yum install --downloadonly --downloaddir=/tmp openvas-manager

# rpm -i --nodeps openvas-manager-*.rpm


그리고 나머지 openvas 를 설치합니다. openvas 설치시 greenbone-security-assistant 도 같이 설치됩니다.

# yum install openvas


추가 파일 설치 및 환경 설정을 합니다.

# openvas-setup


gsad 구동 상태에서 아래와 같이 설정 상태를 체크하면, PDF 리포트 생성 가능한것이 보입니다.


 # openvas-check-setup

 ...

 Step 9: Checking presence of optional tools ...

       OK: pdflatex found.

       OK: PDF generation successful. The PDF report format is likely

 to work.

 ...



[출처] http://alfaiacomlinux.blogspot.com/2018/04/openvas-dont-download-pdf-files-in.html

반응형

댓글()