카테고리 보관물: 정보보안솔루션

사이버 보안 사고 예방을 위한 정보보안솔루션

엘라스틱서치(Elasticsearch) SIEM 설치

정보보안 통합 솔루션 플랫폼을 이용해 애플리케이션 로그, 시스템 로그, 보안 솔루션 로그 등 다양한 이기종 장비에 대한 통합 분석이 가능하다. 보안 업무 수행 시 가장 많은 리소스를 소모하는 과정은 사고 발생 조사 과정에서 보안 이벤트 분석이다. 단편적으로 남아 있는 보안 로그를 사고 분석가나 관제팀에서 추적하면 연결고리를 찾아 분석하기 때문에 시간이 많이 소요된다. 대규모 사고 발생 시 사고분석에 오랜 시간이 걸리는 원인도 이러한 로그를 찾아 추적하고 분석하는데 시간이 많이 소요되기 때문이다.

SIEM 제품과 같은 통합 보안 솔루션은 다양한 보안로그와 시스템로그를 통합해 이상 탐지 및 사이버 보안 위협 탐지 기능을 제공한다. 대표적인 통합 플랫폼인 Elasticsearch Security 제품의 무료버전을 설치해 보자. 트라이얼 기능을 이용해 임시로 유료 기능도 활용해 볼 수 있다.

Elasticsearch Security 플랫폼은 XDR 플랫폼으로서 엔드포인트 컴포넌트인 EDR 에이전트와 중앙관리 서버(Fleet)를 포함해서 다음과 같이 구성된다. Elasticsearch 엔진과 Kibaba(키바나), 플릿(Fleet) 서버를 통해 XDR 플랫폼으로 실시간 보안 위협 탐지와 예방, 대응 기능을 제공한다.

<그림> Elasticsearch 구성도 (구축형)

https://www.elastic.co/docs/reference/fleet/add-fleet-server-on-prem

플랫폼을 구성을 위해서 가장 먼저 핵심 엔진인 Elasticsearch 패키지를 설치한다. 설치 파일은 웹 사이트에서 다운받아 설치한다.[1]


[1] https://www.elastic.co/docs/deploy-manage/deploy/self-managed/installing-elasticsearch

<그림> Elasticsearch 설치파일 다운로드 및 설치 가이드

윈도우, 리눅스 계열 운영체제에 따라 필요한 설치 파일을 다운받아 설치를 진행한다. 우분투 기반의 운영체제에서 데비안 패키지 파일을 이용해 설치하는 과정을 살펴 본다. 설치 후 30일 동안 트라이얼 라이센스를 적용하면 모든 기능을 활용하거나 테스트할 수 있다. 설치 가이드 설명을 참고해서 데비안 패키지 파일을 다운로드 받는다. 설치 환경에 따라 설치 패키지 파일명이 다르다. 맥운영 체제 기반의 가상 환경에서 설치를 하기 위해 amd64 버전이 아닌 arm64 버전의 설치 파일을 다운로드 받았다. 설치 시 플랫폼에 따라 필요한 설치 파일은 링크[1]에서 직접 확인 후 다운로드 가능하다.


[1] https://www.elastic.co/downloads/elasticsearch

그림 Elasticsearch 설치 파일
그림 Elasticsearch 설치 파일 다운로드

설치 파일 다운로드가 완료되면 패키지 설치 명령을 통해 설치를 진행한다. 명령 실행 시 설치 파일명은 다운받은 파일명에 맞게 적용한다.

sudo dpkg -i elasticsearch-9.0.0-amd64.deb

설치가 완료되면 시스템 데몬은 다시 적용하고 재부팅 이후에도 Elasticsearch 서비스가 동작하도록 등록한다. 명령은 설치 CLI 화면에 내용을 복사해서 실행한다.

그림 Elasticsearch 설정

설치 과정에서 elastic 계정 패스워드를 별도로 메모한다. 키바나(Kibana) 설치 후 시스템 로그인 과정에 인증 정보가 필요하다.

그림 Elasticsearch 설치정보

설치가 완료되면 서비스를 시작하고 정상적으로 실행되었는지 확인한다.

그림 Elasticsearch 서비스 시작

서비스 상태가 실행상태를 확인하면 설치가 완료된다. Elasticsearch 설치가 완료되면 키바나(Kibana)를 설치한다. 키바나는 사용자가 Elasticsearch SIEM 기능을 운영하기 위해 필요한 웹 기반의 사용자 GUI 이다. Kibana GUI의 주요 기능은 다음과 같다.

  • 데이터 시각화: 로그, 대시보드
  • 보안 룰 설정 및 경보 설정
  • 자산 정보 관리 및 RISK 관리
  • 보안 경고 및 사고 조사
  • 클라우드 보안 관리
그림 키바나 대시보드 예제

키바나 설치 파일은 링크[1]를 통해 다운로드 한다. 데비안 패키지 파일을 다운받기 위해 설치 파일 종류를 선택한다.


[1] https://www.elastic.co/docs/deploy-manage/deploy/self-managed/install-kibana

그림 키바나 설치 파일 다운로드

설치 파일을 다운로드 받는 방법과 설치 명령은 링크를 참고해서 설치를 진행한다. 설치 파일은 플랫폼에 필요한 설치 파일을 확인해서 다운로드 받는다. 일반적인 amd 기반의 CPU를 사용하는 플랫폼에서는 amd64 설치 파일을 다운받아 실행한다.

그림 키바나 설치

설치가 정상적으로 완료되면 Elasticsearch와 연동에 필요한 토큰 키를 생성한다. Root 권한으로 토큰키 생성 명령을 실행하면 다음 예제와 같이 키값이 생성 된다.

# /usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s kibana eyJ2ZXIiOiI4LjEzLjQiLCJhZHIiOlsiMTkyLjE2OC4yMjEuMTIxOjkyMDAiXSwiZmdyIjoiYjQ2OTc1MTA0YWI2NDA3M2I5MzAzNzYxMzExMzg5ZmQ3MzQ0YjA1N2NhZjM1NTRjYWQzYmI4Y2EzZDAyZjYxMCIsImtleSI6ImY0cE1oWThCUlFPdV82dXRvQkFYOi1ya0FKSHJhVHRPNEt4b1ZhSktUUmcifQ==

생성한 키값은 GUI를 통해 연동하기 위해 복사해 둔다. 키바나 서비스를 자동으로 시작하기 위해 시스템 서비스에 등록한다. 이후 데몬 정보를 업데이트하고 키바나 서비스를 시작해서 정상 구동을 확인한다.

# sudo /bin/systemctl enable kibana.service # sudo /bin/systemctl daemon-reload # sudo systemctl start kibana.service [sudo systemctl stop kibana.service]

정상 구동이 이뤄지면 키바나 설정 파일을 수정한다. 키바나 서버에 원격으로 접근하기 위해서 설정을 변경하다.

# vi /etc/kibana/kibana.yml

설정 파일의 “server.host” 항목을 호스트 IP 또는 0.0.0.0 으로 설정하면 원격에서 접근이 가능하다. 키바나에 원격 접근을 허용하는 경우 권한 없는 사용자의 접근을 제안하기 위해 시스템에 대한 Iptable을 활용하거나 네트워크 기반의 접근 제어를 적용하는 작업이 선행되어야 한다. 기타 설정 항목들은 향후 필요한 경우 개별 수정 할 수 있다.

그림 키바나 원격접근 설정

Elasticsearch와 키바나의 설정이 변경되면 변경된 설정을 적용하기 위해 서비스를 재시작해야 한다.

키바나의 사용시 민감한 데이터를 보호하기 위한 암호화 키를 적용할 수 있다. Root 권한으로 키바나 암호화 키를 생성한다.

#/usr/share/kibana/bin/kibana-encryption-keys generate

명령을 실행하면 암호화에 사용할 키 값이 생성된다.

그림 키바나 암호화 키 생성

생성한 키 값은 kibana.yml 파일에 복사해서 붙여 넣는다. 설정 값은 kibana.yml 파일의 제일 마지막에 새로 입력해서 넣는다.

그림 키바나 암호화 키 적용

변경된 설정을 적용하기 위해 시스템을 재시작한다. 재시작 후 정상 동작이 확인되면 GUI를 통해 접속한다.

그림 키바나 서비스 확인

브라우저를 통해 키바나 서비스에 접속 한다.

http://192.168.221.122:5601/app/home#/
그림 키바나초기 접속화면

Elasticsearch와 연동하기 위해 앞서 복사해둔 Enrollment 키값을 화면에 붙여 넣는다.

그림 키바나 Enrollment 입력

키바나 서버에서 확인 코드를 생성해서 입력한다.

그림 키바나 확인 코드 입력

# root@es02-01:/home/greg/download# /usr/share/kibana/bin/kibana-verification-code

그림 키바나 확인코드 생성
그림 키바나 구성 완료

모든 과정이 완료되면 구성 설정이 완료된다. 설치가 완료되면 브라우저를 새로 고침하고 다시 접속한다. 키바나 서버에 로그인하기 위한 화면이 나오면 앞서 복사해둔 Elastic 계정 정보를 입력한다.

그림 키바나 로그인

처음 로그인 하면 Integration 설정을 선택할 수 있다. 해당 설정은 나중에 진행하고 키바나 서버의 메뉴를 확인하기 위해 “explore on my own”을 선택한다.

그림 integration 설정 옵션

로그인이 완료되면 그림 처럼 메뉴 화면을 선택할 수 있다.

그림 키바나 메뉴

패키지 파일을 이용한 Elasticsearch와 키바나 설치 과정을 살펴 보았다.

Elastic Security EDR(Elastic Defend) 활용한 보안 사고 분석

보안 침해사고 분석

사이버 보안 침해사고가 발생하면 기업은 내부적으로 침해사고분석을 통해 공격자의 흔적을 찾아내고, 공격 당시 사건을 재구성하여 시스템에 발생한 피해를 파악 합니다.

시스템에 침해가 발생하기 까지는 많은 일들이 발생 합니다. 공격자가 시스템을 공격하고 장악하기 위해 정보 수집 과정을 거치게 됩니다. 이 과정에서 공격자는 대상 시스템의 서비스 종류, 시스템 현황, OS종류, IP대역, 포트정보, 취약점 정보 등 많은 정보를 수집하게 됩니다.

외부의 공격자가 정보 수집을 통해 충분히 공략할 대상 시스템의 약점을 파악했으면 취약점을 이용해 공격에 들어가게 됩니다. 보통 이 과정에서 많은 수의 공격이 탐지되고 차단이 됩니다. 공격자는 가능한 모든 방법을 동원해 탐지되지 않기 위해 우회 시도를 하고, 100번의 공격 중 1번의 공격이 성공하게 되면 공격 성공 단계에 이르게 됩니다. 바로 이 단계가 침해가 발생되는 시점 입니다.

시스템 장악에 성공하면 공격자는 자신의 목적에 따라 시스템에 악성코드를 설치하거나 시스템의 정보를 유출하는 행위가 이뤄지고, 많은 경우 침해사고 발생에 대한 인지는 정보 유출 또는 시스템 변조가 발생되고 이뤄지게 됩니다.

보안팀은 공격을 탐지하고 예방하기 위해 다양한 방법을 이용해 침입시도에 대해 모니터 합니다. 주로 네트워크에서 발생되는 정보를 활용하게 됩니다. 가장 많이 사용되는 정보는 침입탐지시스템에서 제공하는 정보 입니다. 시스템에 가해지는 공격시도나 공격행위에 대해 네트워크 레벨에서 사전에 분석해 파악하고, 차단하면 시스템 침해를 예방할 수 있습니다.

최근 보안 사고가 연속적으로 발생하고 이로 인한 개인정보유출과 랜섬웨어로 인한 피해가 발생 하였습니다. 공격자가 공격 대상의 약점을 악용해서 큰 피해로 이어지게 만들었던 사례입니다.

개인정보 유출 사례의 경우 공격자는 제로데이 공격이 아닌 이미 알려진 악성코드를 사용했던 것으로 확인되었고, 공격자가 취약한 시스템을 알려진 악성코드를 이용해 공격이 성공하였습니다.

보안 사고 사례: BPFDoor 유즈케이스

개인정보 유출 시 사용된 공격 프로그램은 BPFDoor라 불리는 리눅스 운영체제 기반의 백도어 프로그램 입니다. 해당 공격에 사용된 악성코드는 Elastic 보안 연구소에서 2022년 보안 블로그를 통해 동작 방식 및 예방 방법에 대해 공유 하였습니다.

Elastic Security Blog: A peek behind the BPFDoor, 13 July 2022 블로그 등록

작성자: Jake King, Colson Wilhoit

  • 위협 그룹: Red Menshen (중국계 APT)
  • 도구명: BPFDoor – 리눅스 대상 백도어
  • 주요 기능: BPF 기반 정찰 및 암호화된 명령 수신
  • 분석 주제: ‘BPFDoor Scanner’ 도구는 감염 의심 호스트의 활성화를 감지하도록 설계됨

BPFDoor 는 Linux용으로 특별히 제작된 백도어 입니다. 이 백도어의 목적은 공격 대상 환경에 반복적으로 재진입하기 위해 장기간 시스템에 숨겨진 백도어 역할을 수행 합니다. 특히 BPF를 비롯한 여러 기술을 활용하여 최대한 은밀하게 작동하도록 설계 되어 있습니다.

패시브 형태로 백도어가 동작하기 때문에 평상시 가동 시간이 높은 서버나 기기, IoT/SCADA, 또는 인터넷에 접속 가능한 클라우드 시스템에 설치되도록 설계되었습니다. 특히 서비스 특성 상 메인터넌스나 재부팅이 어려운 시스템에 지속적으로 상주하여 공격자의 백도어 역할을 수행 합니다. 공격 프로그램에서 사용하는 파일은 임시 폴더에 저장되므로 서버가 재부팅 되거나 종료될 경우 백도어가 손실됩니다.

이 악성코드가 시스템에서 발견될 경우, 초기 접근(1단계) 또는 사후 공격(2단계) 페이로드가 여전히 존재하고 환경의 다른 곳에서 활성화되어 있을 가능성이 높다고 가정해야 합니다. 이 백도어는 은밀하게 침투하여 탐지되지 않을 모든 기회를 포착합니다. 샘플 코드를 통해 확인된 BPFDoor의 동작 과정 입니다.

예외 샘플 분석

주목할 점은 1~4단계가 나타나지 않는 샘플이 하나 있다는 것입니다  . 이 샘플은 초기 이름을 하드코딩된 값으로 변경하지 않고, 배치된 위치에서 실행하며, 그 외에는 동일한 동작을 모델링합니다.

  1. 실행 시 바이너리는 자신을 /dev/shm/에 복사합니다. 임시 파일 시스템인 /dev/shm은 공유 메모리를 의미하며, 프로세스 간 효율적인 통신 수단으로 사용되는 임시 파일 저장 공간입니다.
  2. 프로세스 이름을 하드코딩된 프로세스 이름인 kdmtmpflush로 변경합니다.
  3. -init 플래그로 자신을 초기화하고 자신을 fork합니다. Linux에서 fork는 호출 프로세스를 복제하여 새 프로세스를 생성하는 것을 의미합니다.
  4. 호출된 원본 바이너리를 제거하여 자신을 삭제합니다. 포크된 프로세스는 계속 실행됩니다.
  5. 포크된 프로세스의 생성 및 수정 시간 값을 변경합니다. 이를 타임스톰핑 이라고도 합니다.
  6. 자신을 위한 새로운 프로세스 환경을 생성하고 기존 프로세스를 제거하며, 새 프로세스 이름을 설정(스푸핑)합니다. 마치 마스크를 쓴 것처럼 시스템에 나타나는 방식을 변경합니다. 프로세스는 여전히 kdmtmpflush이지만, ps를 실행하면 설정된 값을 볼 수 있습니다.
  7. /var/run에 프로세스 ID(PID) 파일을 생성합니다. PID 파일은 연관된 프로그램의 프로세스 정보를 담고 있는 텍스트 파일로, 다중 시작을 방지하고, 상주 상태를 표시하며, 프로그램이 스스로를 중지하는 데 사용됩니다. 이 파일은 또 다른 임시 파일 저장 공간인 /var/run에 있습니다.
  8. 원시 네트워크 소켓을 생성합니다. Linux에서 소켓은 네트워크 통신의 엔드포인트로, 패킷의 모든 섹션을 세부적으로 지정할 수 있도록 하여 사용자가 인터넷(IP) 수준에서 자체 전송 계층 프로토콜을 구현할 수 있도록 합니다.
  9. 원시 소켓에 BPF 필터를 설정합니다. BPF를 사용하면 사용자 공간 프로그램이 모든 소켓에 필터를 연결하여 특정 유형의 데이터가 소켓을 통해 들어오도록 허용하거나 거부할 수 있습니다.
  10. 들어오는 패킷을 관찰합니다
  11. BPF 필터와 일치하고 필요한 데이터를 포함하는 패킷이 관찰되면 처리를 위해 백도어로 전달됩니다.
  12. 현재 프로세스를 다시 포크합니다.
  13. 포크된 프로세스의 작업 디렉토리를 /로 변경합니다.
  14. 포크된 프로세스의 이름을 하드코딩된 값으로 변경(스푸핑)합니다.
  15. “매직 패킷”에 전송된 비밀번호 또는 비밀번호의 존재 여부에 따라 백도어는 역방향 셸을 제공하거나 바인드 셸을 설정하거나 ping을 다시 보냅니다.

아래에서 Elastic의 Analyzer View를 활용하여 BPFDoor 프로세스 트리를 시각적으로 확인할 수 있습니다. 첫 번째 이미지는 백도어(즉, 리버스 셸, 바인드 셸 또는 핑백)가 실제로 사용되기 전의 트리를 보여주고, 두 번째 이미지는 리버스 셸이 연결되고 익스플로잇 후 활동을 수행한 후의 트리를 보여줍니다.

그림 BPFDoor 초기 호출 프로세스 트리의 Elastic Analyzer 뷰

그림 Reverse Shell연결 및 공격 성공 후 BPFDoor의 Elastic Analyzer 뷰

<동작 방식 요약>

  • BPFDoor는 단순 트래픽보다 은밀한 스텔스 정찰 기법을 사용합니다:
  • BPF 필터 활용: Berkeley Packet Filter를 통해 커널 레벨에서 ‘매직 패킷’을 감지
  • 원격 스캔 방식: TCP, UDP, ICMP 혼합 방식으로 포트 연결 시도 (예: 68/UDP → 53/UDP)
  • 포트리스닝 없는 역접속 방식: 백도어는 포트를 열지 않고 “매직 패킷” 수신 시명령 실행
  • 은폐 기법: 프로세스 이름 위장, 표준 스트림 닫기, 루트 권한으로 메모리 상 실행

Elastic Security Team은 BPFDoor 맬웨어를 분석하는 데 도움이 되는 몇 가지 도구를 만들었습니다. BPFDoor 스캐너를 사용하면 BPFDoor 맬웨어에 감염된 호스트를 스캔할 수 있으며, BPFDoor 구성 추출기를 사용하면 맬웨어의 구성이나 하드코딩된 값을 추론하여 추가 분석, 추가 시그니처 개발 또는 클라이언트를 활용한 백도어 연결에 사용할 수 있는 추가 관찰 결과를 얻을 수 있습니다.

Elastic Defend (EDR): BPFDoor 악성코드 예방

BPFDoor 백도어가 왜 그렇게 오랫동안 사용되면서 숨겨진 채로 남아 있었는지를 알기 위해 동작 방식을 설명 했습니다. Linux 운영체제의 이상 프로세스 대해 잘 모르거나 자세히 살펴보지 않았다면 쉽게 탐지되지 않을 것입니다. 탐지를 피하기 위해 은밀하게 동작하지만, 행위 기반 탐지 방식과 시그니처 기반 탐지 방식을 통해 충분히 탐지와 차단이 가능 합니다.

Elastic Endpoint 제품인 Elastic Defend에서 대응 과정을 살펴 보겠습니다.

악성코드 초기 실행 시 관찰된 동작에 주목 합니다. 특히 이상행위는 공유 메모리 위치인 /dev/shm 디렉터리에서 발견 되었습니다. 이 디렉터리는 Linux의 기본 임시 파일 시스템 위치로, RAM을 저장 공간으로 사용하며, 이 디렉터리에서 바이너리가 실행되거나 네트워크 연결을 생성하는 것은 실제로 매우 드뭅니다.

Elastic 탐지 Rule #1 Binary Executed from Shared Memory Directory  BPFDoor는 실행 중에 /dev/shm에서 기존 파일을 제거하고 자신을 복사합니다. 디렉터리에 루트 권한으로 바이너리를 실행하는 경우 이를 감지할 수 있습니다 (이 디렉터리에 쓰고 읽으려면 루트 권한이 있어야 합니다). 테스트를 통해 Elastic Defend를 통해 Exploit이 실행되는 과정이 보안 경보를 통해 탐지 되었습니다. 탐지 Rule은 Elastic SIEM Rule 중 ” 공유 메모리 디렉터리에서 실행된 바이너리(Binary Executed from Shared Memory Directory)” 로 공개되어 있습니다 .

Elastic 탐지 Rule #2 Abnormal Process ID or Lock File Created 

두 번째로 /var/run에 특정 PID 파일이 생성을 통해 악성코드 탐지 및 예방 입니다.  Osquery 통합 기능을 통해 /var/run 디렉터리에 드랍된 PID 파일이 완전히 비어있는 것을 발견했습니다. 드랍 파일 자체가 악의적인 것은 아니지만, PID 파일 크기가 0이거나 10바이트 정도인 경우는 드물기 때문에 이러한 비정상적인 동작을 탐지하기 위한 추가 탐지 Rule을 만들었습니다.

비정상 프로세스 ID 또는 잠금 파일 생성(Abnormal Process ID or Lock File Created)” 탐지 Rule은 일반적인 PID 파일을 무시하고 하위 디렉터리 없이 /var/run의 기본 디렉터리에 PID 파일을 생성하는 것을 식별합니다.

Elastic Defend (EDR): Triage(사고대응) 가이드

악의적인 행위에 대한 침입 탐지 및 차단 외에도 보안 대응 과정에도 다양한 EDR 정보가 필요 합니다. 특히 침해사고 발생으로 인한 사고 조사 과정에서 시스템 로그는 중요한 단서가 됩니다. Elastic에서 제공하는 사고대응 메뉴에 대해 살펴 보겠습니다.

Elastic Explore 메뉴 활용해 모든 이벤트 발생 내역 분석 및 조사를 수행할 수 있습니다.

<Elastic 사고 분석 관련 Triage 기능 소개>

  • 메뉴: Security > Explore > Host / Network / Users
  • 기능: Elastic Defend에서 제공하는 엔드포인트 로그 분석 활용

Explore 메뉴를 통해 보안 사고 조사를 진행 합니다. 특정 호스트에서 발생한 모든 행위 분석을 진행 합니다. EDR (Elastic Defend) 를 통해 수집 하는 이벤트 종류는 다음과 같습니다.

  • API (윈도우 계열 운영체제)
  • DLL and Driver Load (윈도우 계열 운영체제)
  • DNS (윈도우 계열 운영체제)
  • File
  • Network
  • Process
  • Registry (윈도우 계열 운영체제)
  • Security (윈도우 계열 운영체제)
그림 Elastic Defend 수집 로그 유형
그림 Explore 메뉴
그림 Explore 메뉴 host 분석

Elastic Defend (EDR): Triage(사고대응) 유즈케이스

악성코드 감염 또는 의심 호스트에 대한 상세 분석 과정을 Explore 메뉴를 통해 분석 합니다. 각 과정을 스크린 캡처와 분석 화면을 통해 설명 합니다.

1) 의심 대상 호스트에 대한 EDR 이벤트 분석을 위해 특정 호스트에 대한 필터를 적용 합니다. 예) “gs-demo”

그림 Explore 메뉴 Hosts 정보 분석

2) 감염 의심 정보 분석을 위해 해당 호스트의 프로세스 정보를 분석 합니다. 분석을 위해 수집된 이벤트 종류 중 process 관련 로그를 제외한 다른 정보를 Filter를 적용 합니다.

그림 EDR 이벤트 데이터셋

의심 행위가 발생한 시간 대역을 적용해 해당 시간의 연관된 프로세스 로그를 분석 합니다

분석 로그 필터 적용

필터 적용 이 완료되면 프로세스 이벤트를 시간순으로 확인해 연관 프로세스 정보를 분석 합니다.

gs-demo 호스트 프로세스 로그

특정 파일 이벤트가 발생한 시간 동안에 네트워크 패킷 로그를 동시에 확인하기 위해 2개 메시지 타입의 로그를 분석 합니다.

gs-demo 호스트 파일 이벤트와 네트워크 로그

Elastic Defend에서 수집하는 로그 필드 정보를 ECS 필드 정보를 참고할 수 있습니다.

https://www.elastic.co/guide/en/integrations/current/endpoint.html

정보 보안 통합 솔루션

실시간 보안 위협을 탐지 하기 위해 다양한 보안 솔루션을 활용 한다. 네트워크 기반의 보안 솔루션에서 부터 엔드포인트, 클라우드 기반의 다양한 보안 솔루션을 통해 보안 위협을 탐지하고 차단한다. 다양한 보안 로그 및 시스템 로그를 분석하기 위해 통합 보안 솔루션, SIEM 플랫폼을 활용한다.

XDR 플랫폼은 다양한 로그 수집을 통해 위협을 분석 한다. 실시간 로그 수집을 통해서 보안 위협을 실시간으로 탐지한다.

<그림> XDR 아키텍처 이해

정보보안 및 통합보안 관점에서 SIEM (Security Information and Event Management) 솔루션은 조직의 보안 체계를 효율적으로 관리하고 강화하기 위한 핵심 시스템이다. SIEM 솔루션의 개념과 역할, 주요 기능, 보안 관점에서의 중요성 등을 살펴보자.

여기서부터 ChatGPT 참조 정보보안 및 통합보안 관점에서 SIEM 솔루션에 대한 역할

로그 수집(Log Collection)

  • 다양한 시스템(방화벽, IDS/IPS, 서버, DB 등)에서 생성된 로그를 실시간 또는 배치 방식으로 수집.
  • 정형/비정형 로그를 수집하고 일관된 포맷으로 표준화.

이벤트 상관 분석(Correlation Analysis)

  • 서로 다른 로그/이벤트 간의 관계를 분석하여 의심스러운 보안 이벤트를 식별.
  • 예: 동일한 IP에서 5분간 여러 시스템에 로그인 실패 → 무차별 공격 가능성.

실시간 경고(Alerting) 대응

  • 사전에 정의된 룰이나 머신러닝 기반 이상행위 탐지를 통해 즉각적인 알림 대응조치 가능.

대시보드 시각화

  • 보안 상태를 실시간으로 가시화하여 운영자에게 인사이트 제공.
  • 위협 인텔리전스, 트렌드 분석 등을 직관적으로 확인 가능.

컴플라이언스 보고(Compliance & Reporting)

  • ISO 27001, GDPR, HIPAA, PCI-DSS 등의 규제 준수를 위한 감사 로그, 리포트 자동 생성.

위협 인텔리전스 연계

  • 외부의 위협 정보(악성 IP, 도메인 등)와 연동하여 분석 정밀도 향상.

SIEM (Security Information and Event Management)은 보안 정보(Security Information)와 보안 이벤트(Security Event)를 수집, 분석, 저장, 모니터링, 대응하는 통합 보안 플랫폼 이다. 주로 로그 수집, 이벤트 상관분석, 이상 행위 탐지, 실시간 경고, 컴플라이언스 지원 등을 통해 보안 가시성과 대응력을 높인다. 정보보안 통합 솔루션 관점에서 주요 활용 영역은 다음과 같다.

항목설명
위협 탐지침해사고(APT, 내부자 위협 등)를 조기에 탐지 가능
포렌식 지원사고 발생 시 원인 분석 및 시간대별 로그 추적에 활용
자동화된 대응SOAR 등과 연계해 탐지 → 분석 → 차단까지 자동화 가능
보안 거버넌스 강화전사 보안 상태를 통합 관제하며 정책 준수 여부 확인 가능
위험 기반 접근자산, 취약점, 위협의 교차 분석을 통해 위험 우선순위 설정
표 SIEM의 보안 관점 중요성

다양한 보안 이벤트 분석에 따른 한계도 명확하다.

한계설명보완 방향
오탐/과탐이벤트 상관 분석의 정확도가 낮으면 과도한 알림 발생머신러닝 기반 분석 기능 강화
운영 복잡성룰 설정 및 유지보수에 많은 자원 소모자동화된 룰 추천, 사용자 기반 정책 도입
저장 공간방대한 로그 저장 시 스토리지 비용 증가클라우드 기반 SIEM으로 전환 고려
위협 탐지 한계알려지지 않은 공격(제로데이) 탐지 어려움UEBA, AI 기반 보안 기능 연동
표 SIEM의 한계점 및 보완

여기까지 ChatGPT 참조

Snort(NDR) 솔루션 소개 및 탐지 엔지 구조 설명(헤더/바디)

스노트 는 오픈 소스 기반의 네트워크 침입탐지/차단시스템 이다. 현재 필드에서 사용중인 대부분의 침입탐지/차단시스템의 엔진이 스노트를 기반으로 만들어져 있다.

Snort® is an open source network intrusion prevention and detection system (IDS/IPS) developed by Sourcefire. Combining the benefits of signature, protocol and anomaly-based inspection, Snort is the most widely deployed IDS/IPS technology worldwide. With millions of downloads and approximately 300,000 registered users, Snort has become the de facto standard for IPS.

스노트 공식 홈페이지에서 rule파일을 배포하는데 배포하는 룰 파일은 2가지 종류가 있다. 첫번째 모든 사용자가 사용할 수 있는 Community Ruleset이 있고, 유료 회원에게 제공되는 Sourcefire VRT Certified Rulesets이 있다. 유료 사용자에게 제공되는 룰 셋에 최신버전이 포함되어 있다.

https://www.snort.org/products

라이센스타입가격
개인용$29.99 each
기업용$399 per sensor
  • The same Snort ruleset developed for our NGIPS customers, immediately upon release – 30 days faster than registered users
  • Priority response for false positives and rules
  • Snort Subscribers are encouraged to send false positives/negatives reports directly to Talos
  • For use in businesses, non-profit organizations, colleges and universities, government agencies, consultancies, etc. where Snort sensors are in use in a production or lab environment. This subscription type does not include license to redistribute the Snort Subscriber Rule Set except as described in section 2.1 of the Snort Subscriber Rule Set License.

스노트 엔진 구조에 대해 살펴 보자. 스노트 엔진의 구조 분석을 통해 침입탐지시스템 구조를 이해할 수 있다. 공개용 침입탐지 시스템인 스노트의 탐지 매커니즘이 실제로 적용되는 것을 살펴 보고, 설정 및 시그니처에 대해 알아보자. 실제로 많은 수의 상업용 침입탐지/차단 시스템이 스노트 엔진을 사용하고 있기 때문에 실제 상업용 제품과 스노트 엔진 구조가 매우 유사하다고 생각하면 된다.

​스노트의 구성은 크게 전처리기와 탐지엔진으로 구성된다. 전처리기는 스노트의 분석엔진에서 처리하기 전에 패킷에 대해 사전 검수를 진행 하는 역할을 한다. 전처리기의 종류는 프로토콜에 따라 다양하다.

​탐지엔진은 시그니처를 기반으로 패턴 매치를 하는 방식으로 스노트 엔진 구동 시 관련 시그니처를 엔진에 올려 패킷을 분석한다. 시그니처로 사용되는 룰 파일은 제공되는 룰 파일을 사용할 수 있고, 사용자에 의해 직접 제작도 가능하다.

​스노트 전처리기는 사용자에 의해 커스트마이징이 가능하고, 시그니처로 사용되는 룰파일 역시 커스트마이징 이나 직접 제작이 가능하다. 뒤 쪽에서 실제로 시그니처를 제작해보자. 먼저 시그니처 제작에 앞서 시그니처 작성 시 사용되는 변수 설정에 대해 살펴보고, 전처리기에 대해서도 살펴본 스노트 엔진의 설정과 관련된 내용은 Snort.conf 파일을 이용해 설정이 가능하다. 다음은 snort.conf 파일 일부다.

This file contains a sample snort configuration.
You can take the following steps to create your own custom configuration:
#
1) Set the variables for your network
2) Configure preprocessors
3) Configure output plugins
4) Add any runtime config directives
5) Customize your rule set

먼저 스노트 엔진에서 변수를 선언하는 방법을 살펴 보자.

 변수(Variables)

변수는 3가지 종류의 변수 선언이 가능 하다. 일반적인 변수 선언에 사용되는 var, 포트 설정 시 사용하는 portvar, IPv6관련 설정 시 사용하는 ipvar 3가지가 있다.

var HOME_NET 10.1.1.0/24
var RULE_PATH ../rules
(윈도우 시스템의 경우 절대 경로를 이용해야 합니다. ex c:\snort\rules)
단, var를 이용해 포트 변수를 선언할 때는 일반적으로 앞이나 뒤에 “PORT” 구문을 넣는다.
var HTTP_PORT [80], var PORT_HTTP [80]
var HTTP_PORT [80,8080]
var RESERVED_PORT [1:1024]
var MY_PORT [80,8080,1:1024] or var MY_PORT [80,8080,!1:1024]
portvar MY_PORTS [22,80,1024:1050]
ipvar MY_NET [192.168.1.0/24,10.1.1.0/24]
Ipvar 변수의 경우 IPv6가 지원되는 경우에만 사용하고 지원되지 않을 경우 var사용
alert tcp any any -> $MY_NET $MY_PORTS (flags:S; msg:”SYN packet”;)

참고로 변수 선언은 상수를 이용해 정적으로 선언할 수 있고, 변수를 이용해 동적으로 사용할 수 있다. 다음 예제를 보자.

정적선언

var <desired_variable_name> <variable_value>

동적선언

var <desired_variable_name> $<variable:static_default_address>

var <desired_variable_name> $<variable:?Error: the variable was undefined>

정적선언은 변수에 상수값을 선언해 사용하고, 동적 선언은 고정된 값을 사용하지 않고, 유동적인 값을 이용한다.

IP리스트 조합에서 부정의 의미인 “!”(NOT) 기호를 사용 시 스노트 버전에 따라 해석에 차이가 있다. 2.7.X 이전 버전에서는 IP리스트 조합에서 각각의 객체는 OR 관계를 형성한다. 하지만 이후의 버전에서 해석되는 방식은 IP리스트 간에 “!”(NOT)이 포함되지 않을 경우에는 OR 관계를 형성하지만 “!”포함하는 객체는 OR 객체들과 AND관계를 형성한다. 예제를 살펴 보자.

var HOME_NET [10.1.1.0/24,192.168.1.0/24,!192.168.1.255]

위와 같이 선언되었을 때 HOME_NET 변수에 포함되는 IP리스트는 10.1.1.0/24 또는 192.168.1.0/24 이지만 192.168.1.255(브로드캐스트 IP) IP는 제외한다.

즉 ((10.1.1.0/24 or 192.168.1.0/24) and !192.168.1.255))로 해석된다. 참고로 IP변수에 “!any”와 같이 선언은 불가능하다.

IP리스트와 IP변수를 사용할 때 오류가 발생하지 않도록 주의해야 한다. 다음 예제는 변수 사용 시 발생할 수 있는 선언 오류다. 참고로 선언 오류가 포함된 변수를 이용해 시그니처를 제작하여 엔진 구동 시 시그니처를 사용하면 엔진에서 오류를 파악해 엔진에 올리는 것을 중지한다. 그리고 오류가 발생된 시그니처에 대해 데몬 실행 로그로 기록한다. 나중에 직접 시그니처를 제작할 때 오류가 발생되는 항목을 확인하는 방법으로 사용할 것이다.

정상 선언
ipvar EXAMPLE [1.1.1.1,2.2.2.0/24,![2.2.2.2,2.2.2.3]]
alert tcp $EXAMPLE any -> any any (msg:”Example”; sid:1;)
alert tcp [1.0.0.0/8,!1.1.1.0/24] any -> any any (msg:”Example”;sid:2;)

!any 오류
ipvar EXAMPLE any
alert tcp !$EXAMPLE any -> any any (msg:”Example”;sid:3;)

논리 오류: 선언한 IP를 부정하여 선언할 수 없다.
ipvar EXAMPLE [1.1.1.1,!1.1.1.1]

범위 오류: CIDR로 선언한 IP의 범위보다 더큰 범위로 !조건을 선언 할 수 없다.
ipvar EXAMPLE [1.1.1.0/24,!1.1.0.0/16]

IP를 변수로 사용할 때와 마찬가지로 포트를 변수로 선언하는 방법도 3가지 방식이 있다.

단일 포트 선언: 80
포트 범위 지정: 1:1024
조합: [80,21:23]

선언 가능한 포트 범위는 0부터 65535 이다. IP변수와 마찬가지로 !any 사용은 불가능하다.

포트 변수의 경우 portvar 변수로 지정해 선언 할 수 있다. IP변수나 포트변수로 var 형식으로 선언은 이후에 지원되지 않을 수 있다. 포트로 선언하는 변수의 경우 네이밍 방식을 ‘_PORT’ 또는 ‘PORT_’ 형식으로 작성한다. 이번에 살펴볼 예제도 앞선 IP변수 선언과 마찬가지로 포트 선언 시 발생할 수 있는 선언 오류 예제이다. 변수 선언 시 오류가 발생하지 않도록 주의하자.

정상 선언
portvar EXAMPLE1 80
var EXAMPLE2_PORT [80:90]
var PORT_EXAMPLE2 [1]
portvar EXAMPLE3 any
portvar EXAMPLE4 [!70:90]
portvar EXAMPLE5 [80,91:95,100:200]
alert tcp any $EXAMPLE1 -> any $EXAMPLE2_PORT (msg:”Example”; sid:1;)
alert tcp any $PORT_EXAMPLE2 -> any any (msg:”Example”; sid:2;)
alert tcp any 90 -> any [100:1000,9999:20000] (msg:”Example”; sid:3;)

!any 오류
portvar EXAMPLE5 !any
var EXAMPLE5 !any

논리 오류
portvar EXAMPLE6 [80,!80]

포트 범위 오류: 지정된 포트 범위를 초과한 포트 번호를 선언할 수 없다.
portvar EXAMPLE7 [65536]

사용 오류: IP 변수 위치에 포트 변수를 사용할 수 없다.
alert tcp $EXAMPLE1 any -> any any (msg:”Example”; sid:5;)

I룰 헤더를 구성하는 항목을 표는 다음 같다.P와 포트를 변수 선언하는 방법과 오류가 발생되지 않도록 주의해야 할 부분에 대해 살펴 보았다. 이제 패킷에 대해 사전 검수를 하는 전처리기(Preprocessor)에 대해 살펴보자.


 전처리기(Preprocessors)

앞서 전처리기의 역할이 패킷에 대한 사전 검수라고 했다. 이는 anomaly, 즉 비정상 트래픽의 경우 전처리기를 통해 처리 된다는 의미다. 비정상 헤더 구조의 패킷이나 비정상 트래픽을 전처리기에서는 구분 한다. 비정상 헤더 구조나 비정상 트래픽을 구분하기 위해서는 먼저 탐지한 패킷을 분해하는 과정이 필요하다. 이과정은 스노트 디코더를 통해 이뤄지고, 분해과정을 거쳐 전처리기에서는 패킷의 구조와 포함된 플래그 정보, 프로토콜 정보를 이용해 패킷이 갖춰야할 형식이나 프로토콜에 따른 패킷 구조를 해석한다.

출처: https://blog.snort.org/2015/04/snort-inspection-events.html

탐지된 패킷은 헤더와 메타데이터, 페이로드로 구분 된다. 패킷은 스노트 엔진의 전처리기에서 TCP/IP 헤더 정보에 대해 검증을 거치게 된다. 비정상 헤더 구조를 가지고 있거나 조각난(fragmented)패킷은 조합하여 적절성을 검사 하게된다. 이 때 서비스에 따라 관련 프로토콜 정보에 대한 해석도 같이 진행된다. 일련의 전처리기의 패킷 검사가 진행되면, 이후 스노트 분석 엔진에서 시그니처를 이용해 페이로드에 포함된 데이터를 분석해 공격 여부를 결정 한다. 패킷을 침입탐지엔진에서 분석하기 전에 사전 검수 역할을 하는 전처리기를 스노트에서는 커스터마이징도 가능하다. 다음이 설정 파일에서 전처리기에 대해 옵션을 조절할 때 사용하는 설정 방법이다.

preprocessor <name_of_processor>: <configuration_options>

설정 방법에서 알 수 있듯이 전처리기에 따라 옵션을 이용해 설정을 할 수 있다. 스노트에서 제공하는 전처리기 종류는 다음과 같다.

전처리기종류설명
frag2Frag2 전처리기는 조각난 패킷을 재조합 한다. 단편화된 패킷을 이용한 공격을 탐지하기 위해 사용 된다. 기본 설정은 60초 timeout이며 조각난 패킷을 조합하기 위해 4MB까지 버퍼를 사용한다.
frag3frag3 전처리기는 Target-based로 조각난 패킷을 재조합 한다.
Stream5전송 데이터를 끊김 없이 지속적으로 처리하는 기술, 주로 동영상이나 오디오 데이터에서 모든 데이터를 수신하기 전에 전송과 동시에 데이터의 표현을 실행할 수 있다.
sfPortscan소스파이어에서 개발한 모듈로 사전 공격 단계에 대해 탐지하는 모듈이다. 역할은 비정상 상황에 대해 탐지하는 것이다. 정상 통신이 아닌 정보를 수집하려 할 때는 사용하지 않는 포트 요청이나 IP요청이 자주 발생될 것이다. 예를 들어 정상 통신의 경우 오픈 또는 사용중인 포트나 IP로 통신이 많지, 사용하지 않는 IP또는 포트와 통신은 거의 드물다. 그래서 사용하지 않는 포트에 대해 요청이 많이 발생될 경우 비정상으로 인식을 하는 것이다. 다음은 몇 가지 비정상 상황에 대한 정의다.​• 단일 소스에서 단일 목적지로 다수의 포트를 스캔, one->one portscans주요 공격 유형 TCP Portscan, UDP Portscan, IP Portscan• 조작된(Spoofed) 소스에서 단일 목적 시스템 스캔 TCP Decoy Portscan, UDP Decoy Portscan, IP Decoy Portscan• 다수의 소스에서 단일 목적 시스템 스캔, many->one portscansTCP Distributed Portscan, UDP Distributed Portscan, IP Distributed Portscan
RPC DecodeRemote Procedure Call(RPC)는 한 프로그램이 네트웍 상의 다른 컴퓨터에 위치하고 있는 프로그램에 서비스를 요청하는데 사용되는 프로토콜이다. RPC Decode 전처리기는 는 여러 개로 단편화된 RPC 레코드를 하나의 RPC레코드로 재조합 한다. 111, 32771 포트로 통신하는 패킷에 대해 처리 한다.
Performance Monitor스노트 성능 모니터 전처리기• Attribute Table Reloads (Target Based)• Mbits/Sec (Snort)• Mbits/Sec (sniffing)• Mbits/Sec (combined)• KPkts/Sec (Snort)• KPkts/Sec (sniffing)• KPkts/Sec (combined)
HTTP InspectHTTP 통신에 대해 서버의 응답과 클라이언트의 요청을 스노트 분석 엔진에서 처리 하기 전에 normalize fields(정규화), decode를 담당한다. 추가로 각 필드에 대해서도 검색한다. 패킷 단위로 HTTP 필드를 처리하기 때문에 재조합 되지 않은 패킷을 처리하지 못한다. 재조합은 다른 모듈에 의지한다.• Decode 옵션ascii <yes|no>아스키 디코드 옵션utf 8 <yes|no>utf-8 디코드 옵션base36 <yes|no>base36 인코딩 문자의 디코드 옵션
SMTPSMTP command와 data header, body를 구분한다. ‘RCPT TO:’, ‘MAIL FROM:’ 은 SMTP 명령어 이다. Preprocessor 옵션 조절 시 해당 항목은 RCPT, MAIL로 참조 된다.
FTP/Telnet• FTP/Telnet 데이터 디코드• FTP 명령과 응답 구분• Telnet 필드 정규화
SSH탐지 가능한 공격 • Challenge-Response Overflow, CRC 32 attacks(20kb를 넘는 페이로드 전송 방식의 공격)• Secure CRT and protocol mismatch
DNS• DNS 응답 디코딩
SSL/TLSSSL Dynamic Preprocessor (SSLPP)에서 SSL과 TLS 통신에 대해 디코딩을 지원한다. 일반적으로 암호화된 트래픽은 성능 이슈와 오탐 소지 때문에 스노트 엔진에서 처리되지 않는다.
ARP SpoofARP 패킷을 디코딩하여 공격을 탐지 한다.
표 스노트 전처리기

출처: https://blog.snort.org/2015/04/snort-inspection-events.html

데이터베이스에 저장한 스노트 탐지 내역을 쿼리하고 분석할 수 있도록 웹 인터페이스를 제공하는 공개용 분석툴이 몇 가지 있다. 이중 Basic Analysis and Security Engine(BASE) 프로젝트는 Kevin Johnson이 프로젝트를 이끌고 있고, Analysis Console for Intrusion Databases(ACID) 코드를 기초로한 프로젝트 이다. ACID는 PHP기반의 다양한 종류의 침입탐지시스템, 방화벽, 네트워크 모니터툴의 이벤트 데이터베이스를 분석하고 검색할 수 있는 엔진으로 Query-builder and search interface, Packet viewer (decoder), Alert management, Chart and statistics generation 기능을 제공 한다.

https://github.com/NathanGibbs3/BASE

그림 Basic Analysis and Security Engine(BASE)

 스노트 시그니처

스노트 시그니처를 크게 2가지로 구분된다. 헤더 부분과 바디부분으로 나뉜다. 간단한 스노트 시그니처를 하나 살펴 보자. 예제로 살펴볼 시그니처는 HTTP_GET라는 이름의 스노트 시그니처다. 패킷의 데이터부분(페이로드)에서 GET이라는 문자열을 검색하여 탐지 하는 시그니처다.

alert tcp any any -> 10.10.10.0/24 80 (msg:”HTTP_GET”; content:”GET”)

해당 시그니처는 다음과 같이 헤더와 바디로 나눌 수 있다.

Header “alert tcp any any -> 10.10.10.0/24 80”Body “(msg:”HTTP_GET”; content:”GET”)”

헤더부분은 IP정보와 프로토콜 정보로 이뤄지고, 바디부분에 탐지 패턴과 규칙과 관련된 정보로 이뤄진다. 그럼 헤더부분과 바디부분에 어떤 항목이 있는지 자세히 살펴보자.

룰 헤더를 구성하는 항목을 표는 다음 같다.

항목설명
Rule Actions해당 Rule에 패킷이 탐지 되었을 때 취하는 액션으로 총 8가지로 대응 한다.
ProtocolsTCP, UDP, ICMP, IP 등의 통신 프로토콜을 지정
IP Addresses출발지, 도착지 IP 주소를 지정단일 IP와 CIDR block, IP 리스트로 지정할 수 있다.
Port Numbers출발지, 도착지 Port 주소를 지정단일 Port와 범위, Port 리스트로 지정할 수 있다.
The Direction Operator->, <>!주의, <- 방향 지시자는 없음
Activate/Dynamic Rules룰 액션에서 activate, dynamic 지시에 따라 룰의 활성여부가 변동, 한 쌍으로 만든다.
표 룰 헤더 구문

헤더를 구성하는 각각의 항목은 실제 예제를 통해 살펴보자. 앞서 예제로 살펴본 스노트 시그니처의 헤더부분을 항목별로 구분해보자. 헤더의 정보를 해석해 보면 탐지된 패킷 중 프로토콜이 TCP인 패킷에 대해 검사를 하고, 출발지 IP와 포트는 별도로 지정하지 않았기 때문에 모든 출발지 IP와 포트가 해당된다. 도착지 IP와 포트는 10.10.10.0/24 대역에 80번 포트로 접속하는 패킷을 구분해서 분석 하겠다는의미가 된다. 이때 조건에 매치가 되면 스노트 엔진에서는 Alert이라는 액션을 취하겠다는 시그니처 설정을 의미한다.

액션프로토콜출발지도착지방향성
alerttcpany any0.10.10.0/24 80->
표 룰 헤더 예제

액션 항목은 Alert을 포함해 총 8가지의 액션 옵션이 있다. 모두 스노트 엔진에서 취하는 액션을 의미한다.

룰 액션
alert – 정해진 방식에 따라 Alert을 발생 시키로, 패킷을 기록한다.
log – 패킷을 기록한다.
pass – 탐지된 패킷을 무시한다.
activate – Alert을 발생 시키고, 다이나믹룰을 활성화 시킨다.
dynamic – 4번 액티브 룰에 의해 일정시간 동안 활성화되면 2번 로그 액션과 동일한 액션을 취한다.
drop – iptable을 이용해 패킷을 드랍하고 패킷을 기록한다.
reject – iptable을 이용해 패킷을 드랍하고 패킷을 기록하고, TCP reset 패킷을 출발지로전송하거나 ICMP 패킷의 경우 unreachable 메시지를 반송한다.
sdrop – iptable을 이용해 패킷을 드랍하지만 로깅을 하지 않는다.
표 스노트 룰 액션

대부분의 시그니처의 액션이 Alert을 사용하고, activate 옵션과 dynamic 옵션은 잘 사용하지 않지만 사용은 다음과 같이 사용 가능 하다.

특정 BoF공격이 발생된 후에 다이나믹 룰이 활성화 되면 50개의 패킷을 로깅한다.
공격이 성공했을 때 이후에 발생된 행위에 대해 분석하기 위한 자료로 사용한다.
activate tcp !$HOME_NET any -> $HOME_NET 143 (flags: PA; content: “|E8C0FFFFFF|/bin”; activates: 1; msg: “IMAP buffer overflow!”;)
dynamic tcp !$HOME_NET any -> $HOME_NET 143 (activated_by: 1; count: 50;)

통신 프로토콜은 TCP, UDP, ICMP, IP 4개의 프로토콜을 지원한다.

출발지와 도착지에 대한 범위를 제한하기 위해 출발지/도착지 항목에 IP나, 포트정보를 입력하게 된다. 일반적으로 출발지 정보는 공격자의 IP를 알지 못하는 경우가 대부분이기 때문에 any로 지정하는 경우가 대부분이다.
다음은 IP/포트 정보를 선언하는 몇가지 예제로 참고하기 바란다.

탐지 범위 선언 스노트 형식
IP 대역alert tcp !192.168.1.0/24 any -> 192.168.1.0/24 111 (content: “|00 01 86 a5|”; msg: “external mountd access”;)
alert tcp ![192.168.1.0/24,10.1.1.0/24] any -> [192.168.1.0/24,10.1.1.0/24] 111 (content: “|00 01 86 a5|”; msg: “external mountd access”;)
PORT 정의any port에서 도착지 ports 1 에서 1024 사이l log udp any any -> 192.168.1.0/24 1:1024
any port에서 도착지 port 6000 이하l log tcp any any -> 192.168.1.0/24 :6000
예약된 포트인 1024이하에서 도착지 port 500 이상l log tcp any :1024 -> 192.168.1.0/24 500:
도착지 port가 6000~6010이 아닌 portl log tcp any any -> 192.168.1.0/24 !6000:6010
표 스노트 룰 선언

헤더 구문의 경우 크게 복잡한 항목이 없기 때문에 여러분도 쉽게 이해하고 사용할 수 있다.

스노트 탐지 시그니처는 헤더부분만 선언 해도 사용하는데 오류는 없다. 하지만 헤더 정보 만으로는 위협을 정교하게 탐지하기 어렵기 때문에 상세 패턴을 적용해 탐지 시그니처를 생성한다.

 시그니처 바디 구성

정교한 시그니처를 만들기 위해 제공되는 옵션을 살펴 보자. 각 항목별 자세한 설명은 표를 참조하자. 바디에서 제공되는 옵션은 시그니처 특성이나 형식 정보를 나타내는 옵션과 페이로드에서 공격 패턴을 찾기 위해 사용되는 옵션이 있다. 다음 표는 형식 옵션 항목 이다.

항목설명
msg메시지 옵션에 기록된 내용이 로그와 Alert발생 시 이름으로 사용된다.<형식>msg: “<message text>”;
reference룰과 관련된 외부 취약점 정보를 참고 시 사용한다.Bugtraq http://www.securityfocus.com/bid/Cve http://cve.mitre.org/cgi-bin/cvename.cgi?name=Nessus http://cgi.nessus.org/plugins/dump.php3?id=Arachnids (currently down) http://www.whitehats.com/info/IDSMcafee http://vil.nai.com/vil/dispVirus.asp?virus k=url http://reference에 포함된 데이터는 관련 데이터를 이용해 사이트로 연결 된다.reference:nessus,10321​<형식>reference:nessus,10321;
gidgid (generator id)는 특정 룰이 발생했을 때 스노트 엔진의 어느 부분에서 룰을 발생 시켰는지 구분하기 위해 사용한다. gid 1-100은 전처리기와 디코더에서 사전에 할당되어 있다. 실제로 잘 사용하지 않는다.<형식>gid: <generator id>;
sidSid는 스노트 룰의 고유한 시그니처 ID다. 관련해서 사용 범위는 아래와 같다. • <100 Reserved for future use• 100-1,000,000 Rules included with the Snort distribution• >1,000,000 Used for local rules<형식>sid: <snort rules id>;
revRule이 얼마나 많이 수정되었는지 표기 한다. “rev:6;”의 경우 6번 수정되었음을 의미 한다.<형식>rev: <revision integer>;
classtypeClasstype은 룰이 사전에 정의된 공격 형태에 대해 어떤 유형의 공격인지를 분류할 때 사용 한다. 룰에 대해 이벤트 유형을 분류한 것이다. 하지만 classtype을 사용하기 위해서는 snort.conf 파일에 classification 옵션이 설정되어야 한다.<형식>classtype: <class name>;
priority룰의 위험도에 대해 숫자로 표기 한다. Priority 값은 중복 가능 한다.<형식>priority: <priority integer>;
metadatametadata 항목은 룰에 key-value 형식으로 추가 정보를 작성할 때 사용 한다.
KeyDescription ValueFormat
engineIndicate a Shared Library Rule”shared”
SoidShared Library Rule Genrator and SIDgid|sid
ServiceTarget-Based Service Identifier”http”
<형식>metadata: key1 value1;metadata: key1 value1, key2 value2;
표 시그니처 바디 옵션 항목

 페이로드 탐지 옵션

앞서 살펴본 옵션은 일반적인 시그니처 형식 정보를 나타내는 옵션이고, 이번에 살펴볼 옵션 항목은 페이로드에서 공격 패턴을 탐지하기 위해 사용되는 옵션이다.

항목설명
content문자열 기반의 패턴 매치의 스노트 룰에서 가장 핵심 옵션 항목으로 데이터 페이로그 값에서 원하는 문자열을 탐지 하기 위해 사용하는 옵션이 content 항목 이다.문자열 앞에 “!”을 사용할 경우 reverse개념으로 사용할 수 있다. ; \ “ 3개 캐릭터의 경우 구문 오류를 발생 시킬 수 있다. 반드시 이스케이 처리를 해야 한다.<형식>content: [!] “<content string>”;<example>alert tcp any any -> any 139 (content:”|5c 00|P|00|I|00|P|00|E|00 5c|”;)alert tcp any any -> any 80 (content:!”GET”;) GET문자를 포함하지 않는 TCP 80 트랙픽을 탐지 한다.
nocase대소문자를 구분할 경우 ‘A’탐지 패턴은 ‘a’ 패킷을 탐지할 수 없게 된다. 대소문자를 구분하지 않게 하려면 nocase 옵션을 사용 한다.<형식>nocase;
rawbytes탐지된 패킷 내용 데이터를 원시 데이터로 유지하여 비교한다. 앞서 살펴본 전처리기에선 일부 공격 패턴의 경우 엔진에서 정규화 시키기 때문에 패킷 원본과 비교가 필요 할 때 사용하는 옵션 이다.
depth페이로드에서 찾은 내용의 범위를 지정 한다. 10으로 지정하면 페이로드 처음 시작에서 10바이트 안에서 패턴 검색을 한다.불필요한 부분을 건너뛸 수 있어 엔진을 효율적으로 사용할 수 있지만 이벤트 누락이 발생될 수 있으므로 사용 시 주의해야 하는 옵션 이다.depth옵션을 사용하기 위해서는 반드시 content 옵션이 depth옵션 앞에 와야 한다.<형식>depth: <number>;
offset페이로드에서 찾을 내용의 시작 위치를 지정 한다. 10으로 지정하면 페이로드 처음 시작에서 10바이트 떨어진 곳에서부터 패턴 검색을 한다.불필요한 부분을 건너뛸수 있어 엔진을 효율적으로 사용할 수 있지만 이벤트 누락이 발생될 수 있으므로 사용 시 주의해야 하는 옵션 이다.offset옵션을 사용하기 위해서는 반드시 content옵션이 offset옵션 앞에 와야 한다.<형식>offset: <number>;<example>alert tcp any any -> any 80 (content: “cgi-bin/phf”; offset:4; depth:20;)
distance룰 작성 시 이전 항목의 content와 매치되는 부분을 찾으면 distance에서 지정한 byte만큼 떨어진 지점부터 다음 content에 포함된 항목을 페이로드에서 찾는다.content옵션이 distance 옵션 앞에 와야 한다.<형식>distance: <byte count>;<example>alert tcp any any -> any any (content:”ABC”; content: “DEF”; distance:1;)페이로드에서 ABC문자열을 찾으면 distance 1바이트 만큼 떨어진 곳에서부터 DEF 문자열을 찾습니다. (offset의 확장개념)
within룰 작성 시 이전 항목의 content와 매치되는 부분을 찾으면 매치된 부분부터 within에서 지정한 byte 내의 다음 content에 포함된 항목을 페이로드에서 찾는다.content옵션이 within옵션 앞에 와야 한다. (distance옵션과 같이 사용 된다.)<형식>within: <byte count>;<example>alert tcp any any -> any any (content:”ABC”; content: “EFG”; within:10;)
uricontentUricontent 옵션을 사용하면 URI필드에서 핵심적인 부분만을 검색하여 패턴문자열과 검색 한다. 핵심적인 부분의 의미는 NORMALIZED를 통해 일종의 정규화를 거쳐 공격 구문만을 추리는 형태이다.예를 들어 다음과 같이 directory traversal 공격 URI가 탐지 되었을 경우/scripts/..%c0%af../winnt/system32/cmd.exe?/c+ver정규화(normalized)를 거쳐 “/winnt/system32/cmd.exe?/c+ver” 구문을 추출하고, 해당 문자열과 공격패턴을 비교 한다.정규화를 사용하는 옵션이기 때문에 반대 옵션인 rawbytes와 같이 사용할 수 없다.<URI정규화 예제>/cgi-bin/aaaaaaaaaaaaaaaaaaaaaaaaaa/..%252fp%68f?/cgi-bin/phf?<형식>uricontent:[!]<content string>;
urilenURI필드의 사이즈를 옵션으로 사용 한다. 공격 패턴 매치와 비교하고 추가로 탐지한 URI의 길이가 범위에 포함되는지 여부도 비교 한다. 비교 조건으로 크거나, 작거나, 같거나, 특정 범위 4가지 조건이 있다.urilen: 5urilen: < 5urilen: 5<>10<형식>urilen: int<>int;urilen: [<,>] <int>;<example>alert tcp any any -> any 80 (msg:”urilen”; content:”pattern”; urilen:5;)“pattern” 문자열이 포함될 경우 URI길이가 5바이트 인지 추가로 비교
isdataat페이로드의 특정 위치에 데이터가 존재하는지 확인하거나 옵션을 이용해 이전 content 패턴과 매치 후 상대적인 위치에 대해 데이터가 존재하는지 확인 하는 옵션 이다.<형식>isdataat:[!] <int>[,relative];<example>alert tcp any any -> any 111 (content:”PASS”; isdataat:50,relative; content:!”|0a|”; within:10;)111포트로 향하는 패킷에 “PASS” 문자열이 확인되면 50바이트 이후 시점에서 newline의 hex값(0a)을 찾는데 찾은 범위는 50바이트 떨어진 시점에서 10바이트 안에서 찾는다.
pcrePerl 기반의 정규표현식을 사용할 수 있게 하는 옵션 이다.<형식>pcre:[!]”(/<regex>/|m<delim><regex><delim>)[ismxAEGRUBPHMCOIDKYS]”;
표 페이로드 탐지 옵션

페이로드에서 시그니처를 탐지하기 위해 사용하는 옵션 중 정교한 탐지 패턴을 구현하기 위해 사용하는 옵션이 pcre 옵션이다. content 항목은 단순 문자열 매치 기반이기 때문에 우회 공격이 발생되면 지정된 문자열로 탐지가 불가능해 질 수 있다. 그래서 이렇게 변화 가능한 상황을 가정해 탐지 유연성을 갖도록 pcre 옵션을 사용한다. 탐지 문자열은 정규표현식을 지원한다.

엘라스틱서치(Elasticsearch)를 활용한 웹 로그 분석

SIEM 솔루션 또는 XDR 솔루션은 다양한 로그 수집을 통해 위협을 분석 한다. 실시간 로그 수집을 통해서 보안 위협을 실시간으로 탐지한다. 통합로그분석 솔루션이라고 부르는 해당 제품은 다양한 보안 솔루션 이벤트를 수집하고 단편적으로 식별하기 어려운 보안 위협을 분석 할 수 있다.

많은 기업에서 다양한 보안 제품을 사용한다. 실시간으로 수집되는 보안 이벤트를 사람이 직접 분석하는 것은 불가능에 가까운 일이다. 대규모 IT 인프라 환경에서 보안운영을 위해 XDR 솔루션은 필수로 사용되는 솔루션 이다.

실시간 위협 분석과 함께 침해사고가 발생할 경우 또는 Threat Hunting 활동을 수행하기 위해서 XDR 솔루션을 이용한다. 수많은 보안 제품의 개별 시스템 로그를 분석해 사고 원인을 조사하거나 침입의 흔적을 찾는 것은 많은 리소스가 필요한 작업이다. 효율적인 분석 업무를 위해 XDR 솔루션을 이용해 통합분석을 수행한다.

가트너 정의를 참고 해보면 다양한 상업용 솔루션이 있다는 것을 알 수 있다.

XDR을 활용한 보안 위협 분석 – 웹 로그 분석

보안사고 조사를 수행하고 사고 대응을 수행하는 분석가 입장에서는 단일 인터페이스를 통해 여러 솔루션 로그를 검색하고 상관 관계를 분석할 수 있기 때문에 효율적인 사고조사를 수행할 수 있다. XDR 솔루션의 경우 대용량의 로그를 보관하고 있기 때문에 사고분석에 필요한 로그 분석에 많이 사용 된다. 시스템 정보를 수집하고 보관하여 침해사고 조사 시 시스템 유실로 인한 사고 조사 영향을 최소화할 수 있다.

사고 분석을 위해 오픈소스 제품을 이용 공격 경로를 분석하는 방법을 살펴 본다. 사용할 제품 설치 과정을 엘라스틱 공식 웹 사이트를 통해서 확인 할 수 있다. 

https://www.elastic.co/kr/downloads/elasticsearch

lastic을 이용해 로그 수집과 분석을 위해서 가장 많이 구성하는 방식은 엘라스틱 엔진과 로그 분석을 위한 로그스태쉬, 시각화를 위해 사용하는 키바나 조합 이다. 흔히 ELK (Elastic /Logstash/Kibana)라고 부른다.

https://www.elastic.co/guide/en/logstash/current/deploying-and-scaling.html

그림 ELK 구성

설치 방법은 공식 사이트에서 운영 체제에 맞춰 설치 파일을 다운로드하고 설치 가이드에 따라 설치할 수 있다. 엘라스틱과 키바나 설치를 완료하고 로그인에 성공하면 로그 분석을 수행 할 수 있다. 로그를 연동하고 상관 분석 룰을 이용해 보안 위협을 탐지하는 기능은 무료로 사용할 수 있다. 수집된 로그를 머신 러닝을 이용하거나 대용량으로 클러스터 구성을 하는 경우에는 유료 기능을 이용해야 한다.

그림 로그인 화면

설치를 완료하면 간단한 로그 분석 실습을 수행한다. 최근 ChatGPT를 보안 업무에 활용하는 시도가 많이 이뤄진다. 로그를 재현하는 과정을 예를 들어 본다. 취약한 로그를 재현하기 위해서 가상 머신에 시스템을 구축해서 관련 로그를 추출해야 했다. 이 작업을 ChartGPT를 이용해서 엘라스틱에서 분석에 사용할 공격 로그 샘플을 확보해 보자.

그림 ChatGPT 샘플로그 활용

ChatGPT 질의 ‘엘라스틱서치 분석용 웹로그 샘플 IIS 해킹 로그 샘플’

아래는 IIS (인터넷 정보 서비스) 서버에서 발생한 해킹 시도에 대한 웹 로그 샘플입니다. 이 샘플은 일반적인 해킹 시도 패턴을 보여주기 위한 예시입니다.2023-06-24 10:15:32 192.168.0.100 GET /wp-admin/ – 80 – 203.0.113.1 Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/90.0.4430.212+Safari/537.36 – 404 404 0 152023-06-24 10:17:21 192.168.0.100 GET /login.php – 80 – 203.0.113.1 Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/90.0.4430.212+Safari/537.36 – 404 404 0 212023-06-24 10:18:09 192.168.0.100 GET /administrator/ – 80 – 203.0.113.1 Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/90.0.4430.212+Safari/537.36 – 404 404 0 142023-06-24 10:19:45 192.168.0.100 GET /phpMyAdmin/ – 80 – 203.0.113.1 Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/90.0.4430.212+Safari/537.36 – 404 404 0 192023-06-24 10:21:10 192.168.0.100 GET /wp-login.php – 80 – 203.0.113.1 Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/90.0.4430.212+Safari/537.36 – 404 404 0 162023-06-24 10:22:37 192.168.0.100 GET /dbadmin/ – 80 – 203.0.113.1 Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/90.0.4430.212+Safari/537.36 – 404 404 0 15위 로그 샘플에서 다음 정보를 확인할 수 있습니다:2023-06-24 10:15:32: 로그가 기록된 날짜와 시간.192.168.0.100: 로그가 발생한 서버의 IP 주소.GET: HTTP 요청 메서드./wp-admin/, /login.php, /administrator/, /phpMyAdmin/, /wp-login.php, /dbadmin/: 해커가 접근을 시도한 경로.80: 사용된 포트 번호.203.0.113.1: 해커의 IP 주소.Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/90.0.4430.212+Safari/537.36: 해커의 사용자 에이전트(User-Agent).404: 응답 상태 코드 (파일을 찾을 수 없음).404 404 0 15: 응답 크기 및 응답 시간 등의 추가 정보.이 로그에서는 해커가 일반적인 관리자 경로(/wp-admin/, /administrator/)와 데이터베이스 관리 도구(/phpMyAdmin/, /dbadmin/) 등에 접근을 시도한 것을 확인할 수 있습니다. HTTP 응답 상태 코드가 404인 경우, 서버는 해당 경로에 대한 리소스를 찾을 수 없음을 나타냅니다.

다운받은 샘플 로그를 엘라스틱서치에 추가해서 분석가가 사고 원인 분석을 위해 확인하는 항목을 살펴 볼수 있다. 자세한 과정은 영상을 참고할 수 있다.

분석가가 사용하는 도구 – XDR (엘라스틱)

샘플로 다운받은 공격 로그는 웹 사이트의 관리 페이지에 대한 접근 시도 공격 이다. 무작위 스캔성 공격 시도 시 접근 경로가 로그에 남기 때문에 공격자가 접근한 URL과 공격 성공 여부를 분석해야 한다. 이 경우 분석가는 공격 시 접근한 경로가 저장되는 필드를 선택해서 분석 한다.

로그를 분석하는 사례를 매우 많다. 공격 유형에 따라 수집할 로그 종류가 다르고 분석가가 주목해야할 필드 정보도 다르다. 엘라스틱을 이용해서 사고 대응 시 로그 분석 과정을 간단하게 살펴 보았다.

침입탐지시스템(NDR) 이해

침입탐지시스템은 크게 2가지 형태의 탐지 방식을 갖고 있다. 시그니처 기반(misuse detection)과 행위기반이상(anomaly detection) 탐지 방식이다.

  • 시그니처기반 이상탐지(misuse detection)

시그니처기반 이상탐지(misuse detection)은 침입탐지시스템 분석 엔진에서 패킷 정보를 수집하고 수집한 패킷에 대해 공격 시그니처 데이터베이스와 비교하여 공격 여부를 판단 한다. 이는 시그니처 데이터베이스에 존재하는 특정 패턴과 일치하는 경우 공격으로 판단하고 시그니처 데이터베이스에 있는 내용에 대해서만 공격 여부를 검증 한다. 다음이 흔히 웹 스캔을 시도했을 때 발생되는 URL요청의 일부로 이러한 URL요청을 데이터베이스에 저장하고 사용자의 요청에 해당 구문이 포함되는지를 확인해 공격성 여부를 판단하는 것이다.

/../../../common_menu.js
../../../../../../../../../../../../../../../proc/self/environ%00
source=/msadc/../../../../../boot.ini
page=\\..\\..\\..\\..\\..\\..\\..\\..\\winnt\\win.ini
/etc/passwd
/cgi-shl/win-c-sample.exe
/cgi.cgi/php.cgi
/server-status
표 웹 스캔 공격 탐지 패

시그니처 기반 위협 탐지 방식의 장점과 단점을 살펴보자.

시그니처기반 이상탐지(misuse detection)
장점
시그니처 기반 탐지라고 애기하는 Misuse detection은 특정 시그니처를 이용해 패킷에 포함된 데이터를 확인해 공격 여부를 판단 한다. 시그니처기반 이상탐지(misuse detection)에서 사용하는 시그니처는 공격과 관련된 특정한 행동, 변수, 인자값 등이 포합 된다.
시그니처 기반 탐지 방식은 다양한 이점이 있다. 그 중 한가지로 필드에 알려진 많은 수의 공격 행위가 시그니처로 작성 되었기 때문에 공격행위에 대해 다양하게 탐지가 가능하다. 공격 탐지 패턴을 이용해 쉽게 탐지할 공격 유형을 정의 하고 선택할 수 있다. 또한 시그니처 기반으로 탐지 시스템을 네트워크에 설치하면 별도의 학습과정 없이 바로 활성화 하여 탐지 및 방어를 할 수 있다. 마지막으로 탐지된 이벤트에 대해 쉽게 탐지 유형을 파악하여 적절한 행동을 취할 수 있다.
단점
다양한 이점만큼 다양한 문제점이 있다.
공격자의 공격행위에는 다수의 부가적인 행위가 포함 된다. 예를 들어 웹 공격을 시도하며사용하는 매개변수(특히 SQL Injection)가 사용자에 의해 변경될 경우 탐지 패턴이 없으면 탐지가 불가능해진다. 이처럼 시그니처를 이용해 공격 탐지 시 예측 가능한 변수를 포함하는데 한계가 있다. 또한 공격행위를 탐지 하기 위해서는 모든 행위에 대해 시그니처를 가지고 있어야 한다. 바꿔 말하면 시그니처가 존재하지 않는 공격 행위는 탐지가 불가능 하다는 의미가 된다. 이는 잦은 시그니처 업데이트가 필요함을 의미 하게된다. 공격자가 탐지를 우회할 목적으로 시그니처를 테스트 하고, 우회 가능한 공격 방식을 개발할 수도 있다.

행위기반 이상탐지(anomaly detection)

행위기반 이상탐지(anomaly detection)은 시스템 관리자가 특정한 사례 또는 환경에 대해 정상범위를 미리 정의 한다. 이는 트래픽이 될 수 있고, 웹 서버를 사용하는 사용자의 수가 될 수도 있다. 이 외에도 기준으로 사용 할 수 있는 항목으로 포트, IP, 프로토콜, 패킷 사이즈 등도 사용할 수 있다. 공격 또는 비정상을 구분하는 방법은 앞서 언급한 정상 범위, 즉 사전에 정의된 상황(프로파일)과 다른 상황이 발생되면 이를 비정상 상황으로 탐지 하는 방식 이다. 예로 평소에 웹서버에 접속하는 사용자가 오후 1시에 3만~4만명 사이라고 가정해 보자. 어느날 오후 1시에 웹서버에 접속하는 사용자 수가 1000명으로 줄어 들거나 10만명으로 갑자기 늘어날 경우 침입탐지시스템에서 이를 통보 하게 되는 것이다

그림 비정상상황탐지

그림 비정상상황탐지

행위 기반 이상탐지 방식의 장점과 단점을 살펴보자.

장점

행위기반 이상탐지(anomaly detection) 방식을 사용하기 위해서는 앞서 언급 한데로 먼저 정상 상황에 대한 정의(프로파일)가 필요 하다. 정상이라고 정의한 상황을 기준으로 변칙적인 상황이 발생될 경우 비정상 상황으로 판단 한다.

시스템에 사용자가 추가 또는 삭제 되는 경우 바로 행동 기반 방식에 의해 탐지가 가능 할 수 있다. 이는 일반적으로 사용자가 추가/삭제가 자주 발생하지 않는다는 가정하에서 사용자가 추가 또는 삭제되는 정상 행위에 대해 하나의 비정상 상황으로 가정하고 탐지할 수 있다는 의미다. 두번째로 각각 개별 환경에 따라 기준 또는 정상으로 정의한 상황이 틀리기 때문에 공격을 시도하는 입장에서는 탐지를 우회할 방법을 찾기가 매우 어렵다. 시그니처 기반의, 예를 들면 스노트룰의 경우 웹 상에 탐지 패턴이 공개되어 있기 때문에 언제든지 패턴을 획득하여 우회할 방법을 찾을 수 있지만 사용자 또는 시스템관리자가 정의한 개별 상황은 추측을 통해 우회 방법을 찾기가 매우 어렵다.

단점

대부분의 침입탐지시스템에서 행위기반 이상탐지(anomaly detection) 시스템은 몇 가지 문제를 갖게 된다. 먼저 비정상 상황에 대한 구분을 위해서는 반드시 적절한 기준이나 프로파일을 가지고 있어야 탐지가 가능하다는 점이다. 만약 기준 상황을 정의하는 기간 동안 공격이 발생되어 해당 기준 상황에 공격 행위가 포함될 경우 이 또한 정상 상황으로 판단될 수 있다. 이보다 큰 문제는 시스템의 복잡성과 임계치 설정이 매우 어렵다는 것이다. 만약 공격 행위나 상황이 정상 상황에 너무 가까워서 탐지가 되지 않을 수도 있고, 반대로 정상 사용자를 공격자로 탐지할 수도 있다.

이상탐지 기법을 기반으로 네트워크 또는 호스트의 보안 위협을 분석 한다. 침입분석대상의 사이버 보안 위협을 분석하는 방식을 살펴보자.

침입분석대상

앞서 침입탐지시스템에서 공격 행위를 변별하기 사용하는 2가지 방식을 살펴 보았다. 이번에는 이러한 탐지 방식을 적용하는 계층에 대해 살펴 보기로 하자.

공격 시도를 네트워크상에서 탐지 할 것인지 더 하위 레벨인 시스템에서 탐지 할 것인지에 대한 결정이다. 이 두가지 초점에 따라 탐지 매커니즘을 적용하는 대상에 차이가 발생 한다. 네크워크상에서 송/수신 되는 패킷의 데이터를 분석해 공격을 판단할 것인지, 시스템의 프로세스를 분석해 공격을 판단할 것인지 목적에 따라 차이가 발생 한다.

네트워크 감시(병목 감시)

일반 적으로 네트워크 환경을 구성할 때 웹 서버 및 서비스에 사용할 시스템을 IDC에 설치 하게 된다. 설치된 서버의 경우 동일 IP대역을 할당 받아 특정 범위의 서브넷 범위 안에서 네트워크 환경을 구성 한다. 병목 감시는 동일한 서브넷에 전달되는 모든 패킷에 대해 공격 여부를 탐지 하는 방식으로, 병목 처러 패킷이 집중되는 지점에서 서버로 전달되는 모든 패킷을 분석하고 공격 시도를 분별하는 방식이다.

이 때 사용되는 방법이 미러링 방식과 인라인 방식이 있는데 이는 네트워크 상에 침입탐지 시스템을 어떤 식으로 구성하는 냐를 일커는 용어이다. 스위치 장비나 기타 네트워크 장비에서 전체 트래픽을 침입탐지시스템으로 미러링하여 패킷을 검사 하거나 인라인 모드로 침입탐지시스템을 설치해 감시 하는 방식 이다. 이 구성에 대해 구체적인 형태는 뒤쪽 탐지 구성에서 다시한번 살펴 보기로 하자. 이처럼 네트워크상에서 네트워크 패킷을 감시하는 시스템을 Network Intrusion Detection System(NIDS)라 한다. 네트워크 기반의 침입탐지 시스템(NIDS)과 호스트 기반의 침입탐지 시스템(HIDS)의 가장 큰 차이가 바로 감시 대상의 차이인데, 앞서 설명한 미러링, 인라인 방식으로 네트워크 병목에서 공격 트래픽을 감시하는 것이 NIDS이다. HIDS와의 구분은 감시하는 트래픽이 단일 시스템인지 아니면 전체 네트워크 트래픽인지 차이이다. NIDS는 모든 네트워크 패킷을 검사하고, HIDS는 오로지 특정 호스트에 수신되는 트래픽만을 검사한다. 그럼 단일 호스트를 대상으로 트래픽을 감시하는 HIDS에 대해 살펴보자.

호스트 감시

앞서 NIDS와 HIDS의 차이에 대해 간단하게 언급 하였다. HIDS는 패킷 분석 외에도 침입시도를 탐지 하기 위해 다양한 방법으로 시스템을 감시 한다. 호스트 단위로 감시할 경우 다양한 시스템에서 발생되는 정보까지 활용할 수 있는 장정이 있다. 가장 많이 연동해 분석하는 정보를 다음과 같다.

감시항목설명
Log Parsing시스템에 저장되는 로그는 공격 시도를 확인 할 수 있는 좋은 소스 중 하나다. 많은 침입탐지시스템이 시스템 로그를 연동해 공격 행위가 탐지 되면 경고를 발생 시킨다. 일부 공격의 경우 시스템 로그에 공격 로그를 남기기 때문에 로그를 통해 공격을 감지 할 수 있다. 다음은 호스트 단위의 침입탐지시스템의 공격 탐지 로그다. sshd[3698]: fatal: Local: crc32 compensation attack: network attack detected
System Call Monitoring호스트 기반의 침입탐지시스템은 운영체제의 커널모니터를 통해 잠재적으로 위험한 프로그램의 시스템 콜을 감시 할 수 있다. HIDS에서는 요청된 시스템 콜이 비정상으로 판단되면 경고를 발생 시키거나 호출된 시스템 콜을 막는 방식으로 침입시도를 찾아내고 차단한다.
Filesystem Watching또 다른 기능은 중요한 파일의 사이즈를 감시하고 있다가 변환가 생기면 경고를 발생 시키는 방식이다. 중요한 시스템 파일이나 바이너리 파일의 크기가 변경될 경우 조작된 바이너리 파일로 교체된 것일 수 있기 때문에 경고를 발생 시키는 것이다. 파일 시스템 감시 방식를 이용해 웹 서버에서는 웹 경로의 파일 변조가 발생되는지 감시하여 웹 페이지가 위조 되거나 변조 되는 것을 탐지 한다.

탐지구성

네트워크 침입탐지 시스템은 네트워크 구성에 따라 미러링 방식과 인라인 방식으로 구성 한다. 먼저 미러링 구성은 원 암드(one armed) 방식이라고도 하는데 한쪽으로 팔을 뻗은 것처럼 복사된 패킷을 탐지 분석 한다. 스위치의 각 포트에 흐르는 트래픽을 특정 포트로 복사해 패킷을 미러 시켜 패킷을 검사 한다. 인라인 방식은 라우터와 스위치 사이(구성에 따라 위치는 바뀔 수 있다.)에 침입탐지시스템을 설치 한다. 인라인 방식은 침입차단장비 구성 시 많이 사용 된다. 인라인 구성 시 공격 패킷은 침입차단장비에서 차단 하거나 강제로 리셋 패킷을 전달하여 침입 시도한 공격자의 통신을 차단한다.

그림 미러링 방식과 인라인 방식 탐지

그림 미러링 방식과 인라인 방식 탐지

침입탐지 시스템 탐지우회 방법

공격 행위를 탐지 하기 위해 다양한 기법과 알고리즘이 사용되듯이 탐지를 피하기 위해서도 많은 기법이 끊임 없이 사용 된다. 해킹을 시도하는 공격자는 침입탐지시스템에서 탐지되는 것을 피하기 위해 다양한 방법으로 우회를 시도 한다. 많은 우회 기법이 있지만 예제로 우회기법과 관련해서 이중 디코딩을 통한 탐지 우회 방법과 패킷 프레그먼트 2가지 방법에 대해 살펴 보자

침입탐지시스템에서 탐지를 우회하기 위해 악성코드 제작자는 쉘 코드 작성 시 인코딩하여 작성 한다. 인코딩 한 코드의 경우 디코드 과정을 거쳐 패킷 분석이 필요하다. 소개할 사례는 인코딩된 소스 코드 중 악의적인 목적의 공격 코드에 자주 포함되는 NOP코드를 인코딩하여 우회 시도하는 방법에 대해 살펴보고 디코딩하는 방법을 살펴 보자.

NOP (no-operation) 코드 인코딩

90             NOP

90             NOP

Exploit 코드 제작자는 작성한 쉘 코드가 실행될 정확한 메모리 상의 위치를 추정하기 어렵다. 이는 각은 운영체제에서 사용하는 프로그램이나 설치된 패키지에 따라 정확한 주소값이 달라지기 때문이다. 오버 플로우 또는 언더플로우 등의 공격을 통해 시스템 처리 루틴의 주소 값을 조작하는 단계에 성공했다고 해도, 최종 목적지인 공격자가 작성한 프로그램 코드, 즉 쉘코드가 실행 되는 지점으로 돌아와야 한다. 그렇기 때문에 일정 부분 쉘 코드 앞에 여유 공간을 확보해 리턴 주소가 공격자가 작성한 쉘 코드를 지나치지 않도록 Exploit 코드를 제작한다.

이 때 쉘 코드 앞의 일정 부분을 NOP코드(0x90)로 채워 여유 공간을 확보 한다. 리턴값이 NOP코드를 만나면 아무것도 수행하지 않고 지나쳐 공격자가 작성한 쉘 코드에 이르게 되어 코드가 실행 된다. 많은 Exploit 코드에 NOP코드가 포함되는데 침입탐지시스템에서는 과도한 NOP코드 사용을 exploit코드로 탐지 한다. 탐지를 우회하기 위해 코드 제작자는 여러 가지 방법으로 NOP코드를 인코딩 하고, 침입탐지시스템에서는 이를 탐지 하기 위해 디코딩기법을 적용하거나 인코딩한 데이터를 탐지 패턴으로 사용하게 된다. 인코딩 기법으로 자주 사용되는 몇 가지 방식을 살펴보자.

URL 인코딩

“%”형식으로 표기 되는 인코딩 방식 이다. 관련 함수는 3가지 종류가 있다.

escape() / unescape() encodeURIComponent() / decodeURIComponent() encodeURI() / decodeURI()

실제 인코딩하는 방식으로 앞에서 본 NOP코드를 HEX값으로 %u9090로 표기하고 실제 코드를 사용할 때는 별도의 변화 과정을 다음과 같이 거친다.

unescape(“%u9090”);

또 다른 퍼센티지 인코딩 방식으로 다음과 같이 변화하기도 한다.  아스키 형태의 텍스트를 다음과 같이 HEX값으로 변환하면 아래와 같이 변화한다.

ASCII 문자표현 > www.test.com/test.asp HEX 코드변환 > %77%77%77%2E%74%65%73%74%2E%63%6F%6D%2F%74%65%73%74%2E%61%73%70

인코딩된 문자열은 인터넷의 인코딩 코드 변환 사이트를 통해서 손쉽게 확인할 수 있다.

16 비트(“\uXXXX”) 인코딩

“\u9090”; 16진수 hex값으로 문자값을 인코딩 한다. 다음은 calc.exe 프로그램 실행 시키는 쉘코드다.

31 F6 56 64 8B 76 30 8B 76 0C 8B 76 1C 8B 6E 08 8B 36 8B 5D 3C 8B 5C 1D 78 01 EB 8B 4B 18 8B 7B 20 01 EF 8B 7C 8F FC 01 EF 31 C0 99 32 17 66 C1 CA 01 AE 75 F7 66 81 FA 10 F5 E0 E2 75 CF 8B 53 24 01 EA 0F B7 14 4A 8B 7B 1C 01 EF 03 2C 97 68 2E 65 78 65 68 63 61 6C 63 54 87 04 24 50 FF D5 CC땦땙??<?x?Kg腎? ?|륕?핚2f좽췼?괋鎚??S$??J??,.exehcalcT?$P螂

위 코드의 HEX값을 “\uXXXX” 형태로 encoding하면 아래와 같은 형태로 변형된다. 보여지는것만 틀린뿐 실제 수행되는 내용은 동일하다.

\uf631\u6456\u768b\u8b30\u0c76\u768b\u8b1c\u086e \u368b\u5d8b\u8b3c\u1d5c\u0178\u8beb\u184b\u7b8b \u0120\u8bef\u8f7c\u01fc\u31ef\u99c0\u1732\uc166 \u01ca\u75ae\u66f7\ufa81\uf510\ue2e0\ucf75\u538b \u0124\u0fea\u14b7\u8b4a\u1c7b\uef01\u2c03\u6897 \u652e\u6578\u6368\u6c61\u5463\u0487\u5024\ud5ff

엔티티 인코딩

엔티티 인코딩 방식 예제를 보자. 앞서 NOP코드는 16진수 값으로 0x9090, 10진수 37008 이다. 해당 값을 엔티티 인코딩 방식으로 다음과 같이 인코딩 할 수 있다.

“&#x9090;” or “&#37008;”

프레그먼트(Fragment)

스노트 기반의 침입탐지 시스템의 특징이 패킷을 기반으로 특정 문자열이나 헤더값을 검사 하기 때문에 조각난 패킷(fragmented)의 경우 데이터에 포함된 공격 구문을 바로 찾기 어려울 수 있다. 이러한 이유로 스노트 엔진에서는 전처리기라는(preprocessor) 모듈을 통해 조각난 패킷을 재조합 하는 과정을 거치게 된다. 물론 성능의 한계로 무한 재조합은 현실적으로 불가능하다.

이러한 조각난 패킷은 탐지 시스템의 서비스 거부 공격에도 사용되기도 한다. 아주 작게 패킷을 조각내 공격 대상 시스템에 전송하여 패킷을 수신한 시스템에서 재조합에 많은 리소스가 사용되게 만들어 리소스를 고갈 시키는 방식이다. 그러면 대상 시스템은 패킷 조합에 리소스를 과도하게 사용하여 서비스 제공이 불가능한 상태가 된다.

서비스 거부 공격 외에 탐지 우회하기 위한 방법으로도 사용된다.

대부분 네트워크 기반 침입탐지 장비가 병목에 설치된다. 침입탐지시스템 엔진은 네트워크에서 캡쳐한 패킷의 공격성 여부를 판단하고 액션을 취한다. 하지만 침입탐지시스템이 탐지한 모든 패킷이 대상 호스트로 도달하지 않을 수도 있다. 각각의 단편화된 패킷은 각각 TTL설정에 의해서 도착지 IP까지 도착하지 못하고 네트워크에서 유실 될 수도 있다. 침입탐지 시스템을 우회하기 위해 공격 패킷을 조각 내고, 각각의 패킷의 TTL을 다르게 설정해 호스트까지 도착하는 패킷을 선택할 수 있다.

9개의 조각난 패킷을 침입탐지 시스템에서 재조합해 “cmdo.bexe”라는 구문을 탐지 했다고 가정 하자. 탐지한 “cmdo.bexe” 구문이 공격성이 없는 것으로 판단하고 패킷을 처리했으나, 호스트에서는 9개 중 2개를 뺀 7개의 패킷을 수신하였다. 수신된 패킷은 조합 결과 “cmd.exe” 구문이 포함되어 시스템 명령이 실행 되었다.

프레그먼트 패킷번호공격구문목적시스템 도달여부
1C수신
2M수신
3D수신
4O미수신
5.수신
6B미수신
7E수신
8X수신
9E수신

표 패킷 수신/미수신

공격자는 “cmd.exe”를 실행하기 위해 중간에 눈가림으로 사용할 ‘o’와 ‘b’가 포함된 패킷을 보내야 했다. 하지만 목적지 호스트에 모든 패킷이 도착했을 때는 ‘o’와 ‘b’가 포함되면 안됐다. 그래서 공격자는 TTL값을 다르게 설정해 필요 없는 패킷을 서버에 도착하기 전에 없앴다. 목적지 호스트에 도착하는 패킷의 TTL값보다 작은 값을 설정해 패킷을 중간에 사라지게 한것이다.

이를 타켓 베이스(Target-based) 공격 방식이라 얘기 한다.

시스템 전체 전송 단위(Maximum Transmission Unit)

통신 과정에 프레그먼트되지 않고 전송되는 패킷의 사이즈는 제한이 있다. 이는 패킷을 제각각 사이즈로 생성하여 생기는 통신 장애를 방지하기 위해 사전에 프레그먼트되지 않고 전송되는 퍄킷 사이즈를 정한 것이다.

물론 일부 개발과정에서 사이즈를 넘는 패킷을 만들어 사용하기도 한다. 동영상 데이터의 경우 패킷 사이즈를 초과하는 경우가 자주 발생하는데 이로 인해 일부 네트워크 장비나 통신 장비에서는 비정상 패킷으로 처리하여 통신이 끊기거나 지연되는 경우가 종종 발생 하곤 한다.

다음은 프로토콜 별 MTU 설정에 대한 자료다.

형식시스템 전체 전송 단위 (바이트)
Internet IPv4 Path MTUAt least 576[1]
Internet IPv6 Path MTUAt least 1280[2]
Ethernet v21500[3]
Ethernet (802.3)1492[3]
Ethernet Jumbo Frames1500-9000
802.112272[4]
802.54464
FDDI4500[3]

표 프로토콜 별 시스템 전체 전송 단위

코드를 인코딩하거나, 조각 내어 침입탐지시스템이나 기타 탐지에 대해 우회하는 시도에 대해 살펴 보았다. 물론 탐지를 우회하는 기법은 매우 다양하다. 언급한 2가지 방식은 이 중 일부이다. 침입탐지 시스템에서는 혹은 여러분은 공격자에 의한 공격이 정상 또는 어렵게 보이는 데이터로 가장하고 들어 올 수 있다는 것을 침입시도를 확인할 때 항상 유념해야 한다. 자, 이제 네트워크에서 이뤄지는 해킹 시도를 탐지하기 위해 네트워크 상의 어떤 위치에서 침입탐지 시스템이 운영되고 어떤 트래픽을 감시 하는지 살펴보자.