前言:

当我们发现了异常或攻击IP时,不知道该IP信息,那么这时就需要威胁情报来进行支撑,借以IP信誉来监控存在的威胁源,利用威胁情报加以得出攻击者的IP画像。

0x01 IP信誉

目前我们能从攻击者那里获取到主要数据是使用的工具指纹,浏览器指纹,攻击代码等偏向于基础设施的数据。

威胁情报提供的数据具有时效性,滞后性等特点,一些被标记了的恶意IP在经过一段时间后就会被洗白(动态IP特性),成为正常IP,所以我们不能够把这些IP永久的定义为恶意IP,如果我们把恶意IP直接做ACL的话,有可能会造成正常的流量无法访问,所以就需要对恶意IP进行时效性的判断。

IP/Domain 信誉类情报:

解释:能够提供实时IP情报和画像信息,获得IP的基础属性信息,如是否IDC主机、动态IP、傀儡机、VPN、代理IP等。

IP/Domain 信誉类情报也就是在线查询恶意IP库,通过开源情报或者收费情报来查询IP的信誉。IP信誉的数据可以让我们了解这个IP是不是一个恶意的攻击IP、IP的具体信息、是否已被控制的IP。通过这些数据,我们可以知道我们监控到的恶意IP或域名是不是一个危险的域名,这样我们可以了解这个IP类信誉的大概情况。

缺点: 这些数据有可能不准,同一个IP的位置、接入方式、标记很有可能在不同的威胁情报平台上有着不同的结果。非常容易导致信息不对称而产生误报。

情报的获取

开源情报:情报获取主要从各大威胁情报厂商那里获得。
收费情报:收费情报有大量详细和海量的数据,可以更好的知道详情。
自建情报:主要为搭建蜜罐(互联网节点蜜罐)、用户、公开情报等各个地方进行情报收集。

0x02 实际应用

这里我们选择国外开源情报站做情报获取。
国外开源威胁情报站 https://www.alienvault.com
我们通过开源威胁情报的接口来查询恶意IP或者域名。
此开源情报主要包含的搜索信息有:

1.IP地址
2.文件校验: MD5,SHA1,SHA256,pehash,imphashdomain, Hostnames (subdomains), Email, URL, URI, CIDRrules, File paths,MUTEX name,CVEnumbers
3.公开的API接口可以使用
Python: https://github.com/AlienVault-Labs/OTX-Python-SDK
Java : https://github.com/AlienVault-Labs/OTX-Java-SDK
GO: https://github.com/AlienVault-OTX/OTX-Go-SDK

ip信誉获取测试代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#!/usr/bin/python
#coding:utf-8

import urllib2
import json
import time
import sys
import socket
from OTXv2 import OTXv2
import IndicatorTypes

reload(sys);
sys.setdefaultencoding('utf-8');

url = 'http://ip.taobao.com/service/getIpInfo.php?ip='
API_KEY = '81e2cb4c1cbeaab5492d268a6aab0af7583a8f36b7656187577b98bda8913e68' #change your API_Key
OTX_SERVER = 'https://otx.alienvault.com/'

def getValue(results, keys):
if type(keys) is list and len(keys) > 0:
if type(results) is dict:
key = keys.pop(0)
if key in results:
return getValue(results[key], keys)
else:
return None
else:
if type(results) is list and len(results) > 0:
return getValue(results[0], keys)
else:
return results
else:
return results

def CheckIp(otx, ip):
alerts = []
result = otx.get_indicator_details_by_section(IndicatorTypes.IPv4, ip, 'general')

# Return nothing if it's in the whitelist
validation = getValue(result, ['validation'])
if not validation:
pulses = getValue(result, ['pulse_info', 'pulses'])
if pulses:
for pulse in pulses:
if 'name' in pulse:
alerts.append('In pulse: ' + pulse['name'])
return alerts

def checkTaobaoIP(ip):
try:
response = urllib2.urlopen(url + ip, timeout=10)
result = response.readlines()
data = json.loads(result[0])
#sys.exit(1)
if data['data']['city'] == "内网IP":
return
return "%15s => %s-%s-%s" % (ip,data['data']['country'],data['data']['region'],data['data']['city'])
except Exception,err:
print "[error] %s" % err
print "%s" %ip
return "%15s: time out" % ip

def IsMalicious(ip):
otx = OTXv2(API_KEY, server=OTX_SERVER)
alerts = CheckIp(otx,ip)
if len(alerts) > 0:
result = 'potentially malicious'
reference = 'https://otx.alienvault.com/indicator/ip/' + ip
checkTaobaoIP(ip)
print "%s %15s %s %s " % (checkTaobaoIP(ip),ip, result, reference)
else:
print "%s %15s not malicious" % (checkTaobaoIP(ip),ip)


if __name__ == '__main__':
#查询IP地址
ip = "111.172.133.49"

'''
f = open('iplist.txt','r')
line = f.readlines()
for ip in line:
ip = ip.replace("\n","")
IsMalicious(ip)
'''
#开始查询
IsMalicious(ip)

这里主要使用PythonSDK来进行演示获取,以下为通过IP获取信誉的结果
获取这个IP所绑定过的DNS解析
ip_qb1
这个IP所注册绑定过的域名
ip_qb2
这个IP所使用过的历史传播木马
ip_qb3
对IP进行信誉判断,存在威胁的会给出威胁信息结果地址,安全的IP会给出不存在威胁的结果
ip_qb4

0x03 结语

使用威胁情报可以了解IP信誉,获取恶意IP画像,反查攻击者信息和动机。