长亭百川云 - 文章详情

TrackAssist - 批量快速溯源辅助脚本

渗透测试网络安全

56

2024-07-14

点击蓝字 关注我们

 前言

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

进交流群 请添加管理员

备注:进群,将会自动邀请您加入 渗透测试网络安全 技术 官方 交流群

好文分享收藏赞一下最美点在看哦

 还在等什么?赶紧点击下方名片开始学习吧!

相关推荐
关注或联系我们
添加百川云公众号,移动管理云安全产品
咨询热线:
4000-327-707
百川公众号
百川公众号
百川云客服
百川云客服

Copyright ©2024 北京长亭科技有限公司
icon
京ICP备 2024055124号-2