基于ELK的iis日志可視化

0x01 IIS日志格式

日志樣本

 [
  '2017-06-23', 
  '00:38:23', 
  'W3SVC2007378449',
  'ss.ss.ss.ss', 
  'GET',
  '/xxxx/', 
  '-', 
  '80', 
  '-', 
  'cc.cc.cc.cc', 
  'Mozilla/5.0+(compatible;+MSIE+9.0;+Windows+NT+6.1;+Trident/5.0)',  
  '404',
  '0', 
  '2\r\n'
]

數(shù)組對(duì)應(yīng)字段的意義:

0 - 日期
1 - 時(shí)間
2 - 服務(wù)名
3 - 服務(wù)器IP
4 - 請(qǐng)求方式
5 - 請(qǐng)求訪問頁面
6 - 查詢字符串
7 - 端口
8 - 無
9 - 客戶端IP
10 - 用戶代理
11 - 協(xié)議返回狀態(tài)
12 - 無
13 - 無

0x02 解析IIS日志寫入ELK

遍歷IIS日志目錄(這里為iis),通過split劃分日志(建議使用正則,split是偷懶的方法),將日志信息寫入redis。

下面附上思路代碼analyze_log.py

#coding: utf8
from datetime import datetime
import redis
import os
import re
import sys
import json
reload(sys)
sys.setdefaultencoding('utf-8')
<br />
def handle_time(dat, tim):
    format_time = dat + ' ' + tim
    struct_time = datetime.strptime(format_time, '%Y-%m-%d %X')
    return struct_time
<br />
def getPool():
    rhost = "localhost"
    rport = 6379
    rpassword = "redis"
    rdb = 1
    try:
        pool = redis.ConnectionPool(host=rhost, port=rport, password=rpassword, db=rdb)
        return redis.Redis(connection_pool=pool)
    except Exception as e:
        print 'redis connect error'
        return 'None'
<br />
def getLogs(dirn, fpath, fn):
    try:
        f = open(fpath+fn)
        redis_pool = getPool()
        for v in f.readlines():
            v_arr = v.split(" ")
            #iis日志樣本長度14
            if len(v_arr) == 14:
                timestamp = handle_time(v_arr[0], v_arr[1])
                doc = {
                    "create_time": v_arr[0] + ' ' + v_arr[1],
                    "unit": dirn,
                    "filelog": fn,
                    "machine_id": v_arr[2],
                    "server": v_arr[3],
                    "method": v_arr[4],
                    "path": v_arr[5],
                    "param": v_arr[6],
                    "port": v_arr[7],
                    "client": v_arr[9],
                    "agent": v_arr[10],
                    "code": v_arr[11]
                }
                redis_pool.lpush('iisvul', json.dumps(doc))
    except Exception as e:
        print e
<br />
def analyze(rootdir):
    for root,dirs,files in os.walk(rootdir): 
        for dirn in dirs:
            fpath = os.getcwd() + '/' + rootdir + '/' + dirn + '/'
            cur_files = os.listdir(fpath)
            for cur_file in cur_files:
                getLogs(dirn, fpath, cur_file)
<br />
if \_\_name\_\_ == '\_\_main\_\_':
    #日志路徑為iis
    rootdir = 'iis'
    analyze(rootdir)
    print 'end'

為了更直觀的展示日志,可以對(duì)請(qǐng)求ip做geoip,后續(xù)可在kibana中根據(jù)客戶端IP畫地圖。

logstash配置文件iisvul.conf

input{
    redis {
                host => "localhost"
                password => "redis" 
                data_type => "list"
                key => "iisvul"
                db => 1
        }
}

filter{
        geoip {
                source => "client"
                target => "geoip"
                database => "/path/to/databases/GeoLite2-City.mmdb"
        }
        date {
                match => [ "create_time", "YYYY-MM-dd HH:mm:ss"]
        }
}

output{
        elasticsearch {
                hosts => ["lcoalhost"]
                index => "iisvul"
                user => "logstash"
                password => "logstash"
        }
}

為索引iisvul建立映射,將geoip.location設(shè)置為geo_point類型。

PUT iisvul
{
  "mappings": {
    "logs": {
      "properties": {
        "geoip": {
          "dynamic": "true", 
          "properties":{
            "location":{"type":"geo_point"}
          }
        }
      }
    }
  }
}

0x03 總覽日志

繪制面板

經(jīng)過粗糙的處理,把日志信息輸入到ELK,把控總體情況。

日志總體情況.png

后續(xù)分析

一些分析日志思路:

  • 通過折線圖請(qǐng)求大量增加,可判斷被掃描的時(shí)間段

  • 通過地圖直觀判斷惡意請(qǐng)求來自國外的IP(正常情況下惡意的請(qǐng)求都會(huì)通過國外的代理進(jìn)行掃描、漏洞利用)

  • 通過請(qǐng)求參數(shù)、請(qǐng)求鏈接出現(xiàn)較少次數(shù)的排序?qū)ふ襴ebshell、上傳的小馬

  • 可以根據(jù)服務(wù)器上已成功上傳的大馬、一句話來查詢?nèi)罩?,分析入侵路?/p>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容