본문 바로가기

computer forensics

멀웨어 Datper의 흔적을 조사하는 ~ 로그 분석 도구 (Splunk · ELK 스택)를 활용 한 조사

728x90
Splunk 편


먼저 Splunk에서 Datper 통신 로그를 추출하기 위해 다음에 서술 방식으로 사용자 검색 명령을 만듭니다. 이 방법으로 만든 명령은 Splunk 6.3 이상에서 사용할 수 있는지 확인합니다.

Splunk 사용자 지정 검색 명령 작성 및 조사
사용자 지정 검색 명령을 다음과 같이 작성하십시오. 보다 상세한 절차에 대해서는 Splunk Documentatio [1] 을 참고하십시오.

  1. Splunklib 설치 
    다음과 같은 Web 페이지에서 SplunkSDK (SoftwareDevelopmentKit) for Python을 다운로드하고 그 안에 포함되어있는 splunklib 폴더를 $ SPLUNK_HOME / etc / apps / search / bin에 복사합니다. 
    Splunk SDK for Python 
    http://dev.splunk.com/goto/sdk-python

  2. 사용자 지정 검색 명령 스크립트 설치 
    사용자 지정 검색 명령 스크립트 datper_splunk.py을 $ SPLUNK_HOME / etc / apps / search / bin에 저장합니다. 
    또한 사용자 지정 검색 명령 스크립트는 GitHub에서 공개하고 있기 때문에, 다음의 Web 페이지에서 다운로드하여 이용하시기 바랍니다. 
    JPCERTCC / aa-tools · GitHub 
    https://github.com/JPCERTCC/aa-tools/blob/master/datper_splunk.py

  3. 구성 설정 
    $ SPLUNK_HOME / etc / apps / search / local에 2 개의 설정 파일을 만들고 각각 다음과 같이 설명합니다. 이미 파일이 존재하는 경우에도 같은 내용을 추가합니다. 

    commands.conf
    [datper] 
    filename = datper_splunk.py 
    streaming = true 
    chunked = true 
    local = true
    

    authorize.conf
    [capability :: run_script_datper] 
    [role_admin] 
    run_script_datper = enabled
    
    또한, 위의 예에서는 datper라는 이름의 사용자 지정 검색 명령을 작성하는 설정을합니다.

  4. Splunk 재시작 
    변경 한 구성을 반영하기 위해 Splunk를 다시 시작합니다. 재부팅 후 datper이라는 새로운 사용자 지정 검색 명령을 사용할 수 있습니다.

  5. 실행 
    만든 사용자 지정 검색 명령을 실행합니다. 사용자 지정 검색 명령 datper을 실행하면 Splunk의 각 이벤트 (인덱스 로그)에 대해 "is_datper"라는 필드가 생성되어 판정 결과 "yes"또는 "no"가 부여됩니다. 프록시 로그에서 날짜와 Datper의 판정 결과, 통신 목적지 IP 주소, URL을 표시하는 검색 문을 실행 한 결과의 예를 그림 1에 나타냅니다. 검색 본문의 index 및 table은 각각의 환경에 맞게 변경하십시오.
    index = proxy_log | datper | search is_datper = yes | table _time, is_datper, dst_ip, url
    
acreport-search-datper_01.png
그림 1 : 사용자 정의 검색 명령 datper 실행 결과 
클릭하면 확대됩니다


ELK 스택 편

다음으로 구축 된 ELK 스택 환경이 이미있는 것으로, Datper 통신을 조사하기위한 설정을 추가하는 방법을 소개합니다. 또한 프록시 로그는 Squid를 대상으로하고 있습니다. 또한 검증에 사용한 Elasticsearch, Logstash, Kibana 버전은 모든 5.5.1입니다.

ELK 스택 설정

  1. 스크립트 설치 
    다음과 같은 Web 페이지에서 datper_elk.py을 다운로드하여 원하는 디렉토리에 설치합니다. 
    JPCERTCC / aa-tools · GitHub 
    https://github.com/JPCERTCC/aa-tools/blob/master/datper_elk.py
    이상에서는 스크립트를 / opt / bin에 설치 한 것으로합니다.

  2. Logstash 설정 
    Logstash 프록시 로그를 읽고 스크립트 Datper 통신 여부 판정 결과의 필드를 추가하도록 구성 파일을 만듭니다. 
    이미 프록시 로그를 읽는 설정이 작성된 경우에는 2.1의 설정을 날려 2.2로 이동합니다. 

    2.1. input 설정
    input { 
      file { 
        type => "squid" 
        start_position => "beginning" 
        path => "/var/log/squid3/access.log"] 
      } 
    }
    
    Logstash은 기본적으로 로그에 새로 추가 된 행을 처리하도록되어 전체 로그 파일을 가져올 경우 "start_position =>"begining ""의 설정이 필요합니다. 
    "path"는 캡처 로그 파일을 작성합니다. 

    2.2. filter 설정
    filter { 
      if [type] == "squid"{ 
        grok { 
          match => "message", "% {NUMBER : timestamp} \ s + % {NUMBER : response_time} % {IP : src_ip} % {WORD : squid_request_status} / % {NUMBER : http_status_code} % {NUMBER : reply_size_include_header} % {WORD : http_method} % {WORD : http_protocol} : // % {HOSTNAME : dst_host} % {NOTSPACE : request_url} % {NOTSPACE : user} % {WORD : squid } / (? : - | % {IP : dst_ip}) % {NOTSPACE : content_type} "] 
          add_tag =>"squid "] 
        } 
        date { 
          match =>"timestamp ","UNIX "] 
        } 
        ruby { 
          code = > 'require "open3" 
                   message = event.get ( "message") 
                   cmd = "/opt/bin/datper_elk.py \'# {message} \ ' "
                   stdin, stdout, stderr = Open3.popen3 (cmd) 
                   event.set ( "datper"stdout.read) 
                   ' 
        } 
      } 
    }
    

    위의 설정은 grok 필터 Squid 로그에서 각 필드를 추출하여 date 필터에서 UNIX 시간의 타임 스탬프를 날짜 형식으로 변환합니다. 위의 예는 Squid의 기본 로그 형식의 경우 설정이며, 로그 형식이 combined의 경우는 다음과 같이 COMBINEDAPACHELOG 패턴 등을 사용하여 필드를 추출하여 date 필터의 패턴을 변경해야합니다 .
        grok { 
          match => { 
    "message"=> "% {COMBINEDAPACHELOG} % {WORD : squid_request_status} % {WORD : squid}" 
    } 
        } 
        date { 
          match => "timestamp", "dd / MMM / yyyy : HH : mm : ss Z "] 
        }
    

    ruby 필터는 스크립트를 실행하고 스크립트에서 반환 된 결과를 datper 필드로 추가합니다. ruby 필터 code에 cmd를 스크립트의 위치는 "1 스크립트 설치"에서 설치 한 장소를 설명합니다. 또한, 상기 ruby ​​필터 code는 Logstash5.0 이후 Event API에 맞춘 기술이며, 이전 버전에서는 다음과 같이 기술 할 필요가 있습니다.
    code => 'require "open3" 
             message = event [ "message"] 
                   cmd = "/opt/bin/datper_elk.py \'# {message} \ '" 
                   stdin, stdout, stderr, status = Open3.popen3 (cmd) 
                   event [ "datper"] = stdout.read 
                   '
    

    2.3 output 설정
    output { 
       elasticsearch { 
           hosts => "localhost : 9200" 
           index => "squid-access" 
       } 
    }
    

    hosts에 Elasticsearch의 호스트 이름, index 이름에 원하는 이름을 설정합니다. 
    Logstash에 2.1에서 2.3의 설정이 포함 된 설정 파일을 읽어 들여 실행하고 로그 파일이 문제없이 받아 들여지는 Elasticsearch에 인덱스가 만들어집니다.

  3. Kibana에서 인덱스 패턴 생성 및 로그 검색 
    Kibana의 Web UI에 액세스하여 인덱스 이름을 입력하여 패턴을 만듭니다. 그림 2는 "2. Logstash 설정"의 설명에서 볼 수 있듯이 인덱스 이름을 squid-access, time filter 필드를 timestamp하고 있습니다.
    acreport-search-datper_02.png
    그림 2 : 인덱스 패턴 생성 
    클릭하면 확대됩니다

    Discover 화면을 보면 datper 필드에 스크립트에 의한 판정 결과가 그림 3과 같이 들어 있습니다.
    acreport-search-datper_03.png
    그림 3 : Discover 화면 
    클릭하면 확대됩니다

    또한 기존의 인덱스에 datper 필드를 추가 할 경우에는 Elasticsearch URL과 인덱스 이름을 지정하고 datper_elk.py을 실행하여 필드를 추가 할 수 있습니다. Elasticsearch의 URL이 http : // localhost : 9200 프록시 로그 인덱스 이름이 squid-access의 경우의 실행 예는 다음과 같습니다.
    /opt/bin/datper_elk.py http : // localhost : 9200 squid-access


728x90