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)求訪問頁(yè)面
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日志樣本長(zhǎng)度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)求來自國(guó)外的IP(正常情況下惡意的請(qǐng)求都會(huì)通過國(guó)外的代理進(jìn)行掃描孔祸、漏洞利用)
通過請(qǐng)求參數(shù)隆敢、請(qǐng)求鏈接出現(xiàn)較少次數(shù)的排序?qū)ふ襴ebshell、上傳的小馬
可以根據(jù)服務(wù)器上已成功上傳的大馬崔慧、一句話來查詢?nèi)罩痉餍治鋈肭致窂?/p>