TrackAssist —— 批量快速溯源辅助脚本
2023-6-14 11:40:4 Author: Desync InfoSec(查看原文) 阅读量:28 收藏

点击蓝字 关注我们

 

 前言

最近有一个任务,碰到的需求和以前做过的任务一样,主要是按客户要求做溯源反制,其中就得对外部的攻击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/


文章来源: http://mp.weixin.qq.com/s?__biz=MzkzMDE3ODc1Mw==&mid=2247486437&idx=1&sn=ef3f1965257103df6f04a84cf01edae7&chksm=c27f784bf508f15df9edde37922e8ef2af5e98fbdcd2b4cf9e193f87f8830246170c94f0bce2#rd
如有侵权请联系:admin#unsafe.sh