本公众号发布的文章均转载自互联网或经作者投稿授权的原创,文末已注明出处,其内容和图片版权归原网站或作者本人所有,并不代表安世加的观点,若有无意侵权或转载不当之处请联系我们处理,谢谢合作!
欢迎各位添加微信号:asj-jacky
加入安世加 交流群 和大佬们一起交流安全技术
追踪“匿影”挖矿病毒僵尸网络
逆向分析病毒,通过它的原理获取整个僵尸网络
译自:https://www.malwaretech.com/2019/01/tracking-the-hide-and-seek-botnet.html
不得不说,国内在威胁情报溯源方面比国外要滞后不少。这个文章是2019.1.9日发布的。
更早是下面这个https://www.virusbulletin.com/uploads/pdf/magazine/2018/VB2018-Sendroiu-Diaconescu.pdf, 2018.11.5发布的。
而国内最早的可以看google搜索
和bing的结果
"匿影"是一个恶意蠕虫,主要是感染基于Linux
的IoT
设备和路由器。它是通过暴力破解SSH/telnet
凭据和一些旧漏洞来传播的。它的特别之处是,它没有一个C&C服务器,而是通过由被感染的设备组成的P2P网络更新。
僵尸网络连接
每个被“匿影”感染的“肉鸡”都会运行一个UDP
服务,端口是感染时指定或随机生成。新“肉鸡”都获得一个列表,每一条都是其它“肉鸡”的IP/端口
组合(称为节点)。列表长度是有限的,取决于可用内存,一般是512条。
在列表满之前,一个“肉鸡”会对列表的节点发送请求消息。
每个节点接收到消息会做两件事情:
-
把发送者的 IP/端口
添加到自身节点列表 -
会从自身节点列表抽取一条作为回答
通过这种技术,“肉鸡”可以发现其它“肉鸡”,并和它们维持连接。
为了接收更新,任何一台“肉鸡”定时向其它“肉鸡”请求配置版本号。如果一个“肉鸡”发现一个更高的版本,它会从节点下载新的配置。对僵尸网络进行更新,网络操作者只需要给单台“肉鸡”更新配置,“肉鸡”就会自动分发更新,直至整个网络升级。
追踪反制
一般来说,追踪一个P2P僵尸网络是一件相当简单的事情。可以通过向已知“肉鸡”发送请求发现新的节点。通过这种方式可以递归发现整个僵尸网络。
不幸地是,“匿影有一些反制措施
上面代码是用来处理节点请求的。一旦接收端的节点列表满了,就使用发送端IP作为列表索引。也就是说,同一个来源IP向同一个目标”肉鸡“发送多条请求,返回是同样的数据。
通过一个节点发现新的节点,再用新节点再发现另一个新的,一直下去,但当任何节点返回一个已知节点或者一个失效节点,整个流程就要中断了。
在测试中,往往在遇到一个失效节点之前,每个起点只能获取4个新节点。
节点列表随机化
这块代码是用来更新节点列表的。如果一个未知节点的请求接收了,而又没有多余空间,上面代码就会执行。
这块代码检查时间戳低7位是否为0(128秒)。如果是,从列表中随机挑选一条,用新的节点覆盖,并设置锁。
由于实际网络中的节点数目远远超过”肉鸡“的节点列表,上面代码会每隔128秒覆盖节点列表一个,那么整个列表被更换或移动需要18小时。
由于整个列表经常变动,可以缓慢地获取更多数据。
-
递归地发请求,直至遇到一个失效节点。通常是4次。 -
等待几小时,再基于之前的结果递归发请求。
通过这种方式,每隔18小时,节点列表的数目就乘以4.
新的挑战
一位研究员好心给我提供样本逆向后,他想知道我的爬虫大概要多久被”匿影“僵尸网络发现。我估算是5分钟。
一篇关于他们爬虫的文章说,用了几天才积累了1000个节点。为了在5分钟内被注意,需要发现足够多的节点,使得自身节点进入这些节点的列表,从而让它们传递下去。
节点的快速发现
第一个任务是,在18小时内从同一个节点获取多个节点响应。在上面已经提到,单个节点会向同一个IP返回同样的响应。如果是多个IP呢?
发送者IP在节点列表里作为索引,列表每一项都是唯一的。如果从两个不同的IP发送请求,应该获取到两个不同的节点数据。由于节点列表是无序的,每次被请求节点的应该可以返回2个不同的节点数据。
测试服务器上可以最多有3个IP地址,那么从每个节点可以获取3个不同的响应数据。通过3个IP,可以以3的N次方的速率来请求。但由于失效节点和收到已知节点的机会,这种速率会快速下降。
测试
为了测试,给爬虫一个节点IP,让它每秒去爬取已知的节点。下面是结果
在500个节点之前,节点的发现速度是指数级的,然后快速下掉。很大可能是因为节点列表数目限制在512。更多在线的节点会传递更远,最后,大多数节点的列表都包含相同的节点数据。
为了加速发现对等点,强制把自身加入一些节点列表。由于存在于多个节点列表中,我们将被较新的”肉鸡“发现,导致它们连接到我们。
节点污染
如果一个节点的节点列表还没满,每一个请求的来源节点都会添加进去。我们需要做的是把我们节点发送请求的端口中继出去,然后就可以看到其它节点发过来的请求了。
如果目标节点的节点列表满了,我们需要修改代码,使得每128秒只有一项被覆盖。
按照代码工作方式,当时间戳的低7位是0,第一个发送请求的节点只是简单竞争。我们发送请求的速率已经比正常的”肉鸡“要高了,但还可以进一步提高命中率。在时间戳低7位为0的时候调节速率,可以绕过这个竞争条件。
通过高速率发送和精准的计时,可以把我们IP快速扩散到整个僵尸网络
测试
为了测试,运行爬虫5分钟后停止所有外发请求。这时只有那些节点列表有我们IP的“肉鸡”才会继续连接我们。
停止外发请求后,5分钟内,连接过来的节点去重后的图表
Total
是指去重后IP的总数,responsive
是每60秒滚动时间窗口内发送请求过来,去重后的IP。
可以看到,在5分钟内收集到450个节点(大概所有在线“肉鸡”的35%)。当其它在线传送我们的IP更远,总数还在不断攀升。响应数突然下降是因为爬虫由于停止的原因从其它节点的列表里删除了。
这已经足够让其它爬虫注意到了,但还可以做得更好。
因为所有事情都在一台5美元云VPS进行,一台物理服务器可能会好得多。更大的带宽,最高的吞吐量,更小的延迟和更多的IP,可以在5分钟内遍历整个僵尸网络。
也可以使用更激进的爬虫技术,但有些“肉鸡”配置太低,可能会高压请求下宕机。
结论
在多年来P2P僵尸网络的追踪,一个事实一直存在:无法阻止坚定的安全研究员探寻出整个僵尸网络。在过去几十年,有不少P2P僵尸网络尝试阻止爬虫,最后都失败。很简单,任何限制爬虫的措施同样限制“肉鸡”自动发现的能力。僵尸网络操作者必须要权衡“肉鸡”发现的难度和僵尸网络的稳定性。
“匿影”尝试阻止爬取,却导致了不少节点丢失。
许多IoT设备是运行在内存中,一旦系统重启,感染就丢失。持久性的缺乏导致节点会快速消失,但由于“肉鸡”发现是有限的,最后会导致“肉鸡”上节点列表全是死节点。
统计
至2019年1月,“匿影”在任何时刻都有6000个离线,1300-1500个在线节点。
===============================
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论