点击蓝字 关注我们
前言
最近有一个任务,碰到的需求和以前做过的任务一样,主要是按客户要求做溯源反制,其中就得对外部的攻击IP进行分析(其实就是对发起真实攻击的ip进行筛选排查,看能否进行溯源和反制),然后输出报告。对于 IP 地址的溯源反制,通常会从该地址的 PTR 记录、反查绑定的域名以及开放的服务入手,但从平台导出的事件中涉及的攻击IP量非常大,必须借助脚本完成网络基础信息收集。之前就在Github上找到Bywalks的TrackAttacker脚本能完成需求,并且自己加了并发功能增加其速度,因此就能更快速的完成批量的IP分析。这次就在之前的基础上进一步完善这个功能,并且分享这个批量溯源辅助脚本TrackAssist,(https://github.com/ldsaiyan/trackassist)。
另外,溯源是分析已经发生的安全事件的,而上述的需求,只是攻击者画像的其中一小部分。所以重点还是并发编程的学习嘻嘻。
具体实现
概括
TrackAssist脚本是一份用Python编写的网络信息收集工具脚本,该脚本可以对给定的带有IP地址的文本文件进行信息收集,包括IP的Address、PTR、Organization、网站域名、开放端口、网站Title、备案信息、网站域名的whois信息等,并将结果输出。整个脚本使用了协程技术,以提高并发处理能力和效率。对大批量攻击IP的溯源反制过程中主要起辅助作用。
对IP地址进行信息收集的流程,如下图所示(单IP流程):
其中IP地址的Address、PTR、Organization的信息主要由https://www.ipaddress.com网站提供,IP绑定过的网站域名由https://site.ip138.com网站提供,备案信息、网站域名的whois信息则分别由https://www.beian88.com 和 http://whois.4.cn提供。
并发处理
协程是一种用户态的轻量级线程,其执行过程类似于可以暂停和恢复的函数。其在单线程中实现并发执行任务。这样可以避免线程或进程之间的切换开销,提高并发性能。协程的优点是不需要进行线程切换和进程切换操作,因此消耗的系统资源更少,同时也不会出现由于竞争条件等问题而导致的死锁等问题。具有轻量级、启动速度快、资源占用少等优点。
上述的IP地址信息收集任务作为一个处理单元,TrackAssist脚本使用协程技术并发处理这些IP地址。协程池负责调度多个处理单元的执行,而处理单元则负责具体的信息收集工作。并发执行任务,然后通过队列来共享数据。每个协程处理完数据后将结果放到队列中,线程从队列中读取结果并输出即可。通过使用协程池和异步IO,脚本可以在较短时间内高效地完成大量信息收集任务。
在具体实现中,脚本通过 gevent 模块来使用协程技术。首先创建了一个 gevent.pool.Pool 对象和一个 gevent.queue.Queue 对象。其中 Pool 对象用于创建线程池,Queue 对象用于存储需要处理的 IP地址。接着,在 put_queue() 方法中打开 IP地址文本文件,逐一读取每个IP,将它们添加到 Queue 对象中。在 get_queue() 方法中,通过循环不断从 Queue 对象中获取 IP 地址,并调用 build() 方法进行处理。在 build() 方法中,使用 print() 函数输出了获取到的 IP 地址,并使用 time.sleep(1) 模拟了需要等待 1 秒钟才能完成处理的操作。在 run() 方法中,首先调用 put_queue() 方法将 IP地址添加到 Queue 对象中。然后通过循环创建 100个协程来处理从 Queue 对象中获取到的 IP地址,并等待所有协程处理完毕。其中运用到的协程技术是使用 gevent 提供的并发框架,所有 I/O 操作都被认为是“阻塞”,所以在遇到 I/O 操作时会自动切换到其他协程上去执行,从而实现非常高效的并发处理。具体实现的并发Demo如下:
class Coroutine():
def __init__(self):
self.pool = gevent.pool.Pool(100)
self.work = gevent.queue.Queue()
self.url = "ip.txt"
self.info = []
def put_queue(self):
with open(self.url) as f:
for url in f:
url = url.replace('\n', '')
self.work.put_nowait(url)
self.info.append(url)
def get_queue(self):
while not self.work.empty():
self.build(self.work.get_nowait())
def build(self,ip):
print(ip)
time.sleep(1)
def run(self):
self.put_queue()
for i in range(100):
self.pool.apply_async(self.get_queue)
self.pool.join()
while True: # 防止主线程结束
time.sleep(0.0001) # 避免cpu空转,浪费资源
if self.work.empty():
break
if __name__ == '__main__':
start = time.time()
test = Coroutine()
test.run()
end = time.time()
print("\nThe script spend time is %.3f seconds" % (end - start))
测试打印100个IP和200个IP运行耗时情况:
测试
运行结果,26个IP花费63秒多,如下图所示:
同样26个IP去掉并发处理进行测试,耗时8分多钟,如下图所示:
使用教程
笔者使用的是Windows作为开发环境进行测试,目前测试覆盖不全,应该还有一些坑,Orz。
安装
python -m pip install -r requirements.txt
这里需要注意nmap包和python-nmap会有import冲突的坑,得确认用的是这个库:
使用
在waf、态势平台等导出发起真实攻击的IP到IP.txt文件中。然后在脚本目录下直接运行,静待结果。
python TrackAssist.py
分析
经过工具的信息收集后,结果信息会直接打印在控制台上。其中值得关注的情况有:如果攻击IP绑定的域名存在备案信息,就能快速清楚地知道域名所有者及其邮箱等信息,从而辅助分析者进行判断;如果存在Title名为**‘s Blog等有价值信息的IP,可以试着访问排查,或许能在“关于”里找到他是谁的线索;如果存在开放的端口有3306等有反制可能并且有攻击队嫌疑的云主机,也可以试着进行反制(举例而已,攻击队云主机怎么会开个3306并且是弱口令给你,对吧)。
后续想法
能准确判断目标IP的属性是云主机还是代理等情况,方便筛选目标。
用csv输出信息收集结果,然后能借助excel进行数据筛选分析
增强指纹识别能力
参考
https://github.com/Bywalks/TrackAttacker
http://www.gevent.org/