使用ZoomEye寻找APT攻击的示例分析
ZoomEye线上的数据是覆盖更新的模式,也就是说第2次扫描如果没有扫描到数据就不会覆盖更新数据,ZoomEye上的数据会保留第1次扫描获取到的banner数据,这个机制在这种恶意攻击溯源里其实有着很好的场景契合点:恶意攻击比如Botnet、APT等攻击使用的下载服务器被发现后一般都是直接停用抛弃,当然也有一些是被黑的目标,也是很暴力的直接下线!所以很多的攻击现场很可能就被ZoomEye线上缓存。
当然在ZoomEye历史api里提供的数据,不管你覆盖不覆盖都可以查询出每次扫描得到的banner数据,但是目前提供的ZoomEye历史API只能通过IP去查询,而不能通过关键词匹配搜索,所以我们需要结合上面提到的ZoomEye线上缓存数据搜索定位配合使用。
案例一:Darkhotel APT在前几天其实我在“黑科技”知识星球里提到了,只是需要修复一个“bug”:这次Darkhotel使用的IE 0day应该是CVE-2019-1367 而不是CVE-2020-0674(感谢廋肉丁@奇安信),当然这个“bug”不影响本文的主题。
从上图可以看出我们通过ZoomEye线上数据定位到了当时一个Darkhotel水坑攻击现场IP,我们使用ZoomEye SDK查询这个IP的历史记录:
╭─heige@404Team ~╰─$python Python 2.7.16 (default, Mar 15 2019, 21:13:51)[GCC 4.2.1 Compatible Apple LLVM 10.0.0 (clang-1000.11.45.5)] on darwinType "help"
, "
copyright"
, "
credits"
or "
license"
for more information.
import zoomeye
zm = zoomeye.ZoomEye(username="
xxxxx"
, password="
xxxx"
)
zm.login()
u'
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpX...'
data = zm.history_ip("
202.x.x.x"
)
22
列举ZoomEye历史数据里收录这个IP数据的时间节点及对应端口服务
...>
>
>
for i in data['
data'
]:
... print(i['
timestamp'
],i['
portinfo'
]['
port'
])
...
(u'
2020-01-28T10:58:02'
, 80)
(u'
2020-01-05T18:33:17'
, 80)
(u'
2019-11-25T05:27:58'
, 80)
(u'
2019-11-02T16:10:40'
, 80)
(u'
2019-10-31T11:39:02'
, 80)
(u'
2019-10-06T05:24:44'
, 80)
(u'
2019-08-02T09:52:27'
, 80)
(u'
2019-07-27T19:22:11'
, 80)
(u'
2019-05-18T10:38:59'
, 8181)
(u'
2019-05-02T19:37:20'
, 8181)
(u'
2019-05-01T00:48:05'
, 8009)
(u'
2019-04-09T16:29:58'
, 8181)
(u'
2019-03-24T20:46:31'
, 8181)
(u'
2018-05-18T18:22:21'
, 137)
(u'
2018-02-22T20:50:01'
, 8181)
(u'
2017-03-13T03:11:39'
, 8181)
(u'
2017-03-12T16:43:54'
, 8181)
(u'
2017-02-25T09:56:28'
, 137)
(u'
2016-11-01T00:22:30'
, 137)
(u'
2015-12-30T22:53:17'
, 8181)
(u'
2015-03-13T20:17:45'
, 8080)
(u'
2015-03-13T19:33:15'
, 21)
我们再看看被植入IE 0day的进行水坑攻击的时间节点及端口:
>>
>
for i in data['
data'
]:
... if "
164.js"
in i['
raw_data'
]:
... print(i['
timestamp'
],i['
portinfo'
]['
port'
])
...
(u'
2020-01-28T10:58:02'
, 80)
(u'
2020-01-05T18:33:17'
, 80)
(u'
2019-11-25T05:27:58'
, 80)
(u'
2019-11-02T16:10:40'
, 80)
(u'
2019-10-31T11:39:02'
, 80)
(u'
2019-10-06T05:24:44'
, 80)
很显然这个水坑攻击的大致时间区间是从2019-10-06 05:24:44到2020-01-28 10:58:02,另外这个IP很显然不是攻击者购买的VPS之类,而是直接攻击了某个特定的网站来作为“水坑”进行攻击,可以确定的是这个IP网站早在2019-10-06之前就已经被入侵了!从这个水坑的网站性质可以基本推断Darkhotel这次攻击的主要目标就是访问这个网站的用户!
我们继续列举下在2019年这个IP开了哪些端口服务,从而帮助我们分析可能的入侵点:
>>
>
for i in data['
data'
]:
... if "
2019"
in i['
timestamp'
]:
... print(i['
timestamp'
],i['
portinfo'
]['
port'
],i['
portinfo'
]['
service'
],i['
portinfo'
]['
product'
])
...
(u'
2019-11-25T05:27:58'
, 80, u'
http'
, u'
nginx'
)
(u'
2019-11-02T16:10:40'
, 80, u'
http'
, u'
nginx'
)
(u'
2019-10-31T11:39:02'
, 80, u'
http'
, u'
nginx'
)
(u'
2019-10-06T05:24:44'
, 80, u'
http'
, u'
nginx'
)
(u'
2019-08-02T09:52:27'
, 80, u'
http'
, u'
nginx'
)
(u'
2019-07-27T19:22:11'
, 80, u'
http'
, u'
nginx'
)
(u'
2019-05-18T10:38:59'
, 8181, u'
http'
, u'
Apache Tomcat/Coyote JSP engine'
)
(u'
2019-05-02T19:37:20'
, 8181, u'
http'
, u'
Apache Tomcat/Coyote JSP engine'
)
(u'
2019-05-01T00:48:05'
, 8009, u'
ajp13'
, u'
Apache Jserv'
)
(u'
2019-04-09T16:29:58'
, 8181, u'
http'
, u'
Apache httpd'
)
(u'
2019-03-24T20:46:31'
, 8181, u'
http'
, u'
Apache Tomcat/Coyote JSP engine'
)
很典型的JSP运行环境,在2019年5月的时候开了8009端口,Tomcat后台管理弱口令等问题一直都是渗透常用手段~~
顺带提一句,其实这次的攻击还涉及了另外一个IP,因为这个IP相关端口banner因为更新被覆盖了,所以直接通过ZoomEye线上搜索是搜索不到的,不过如果你知道这个IP也可以利用ZoomEye历史数据API来查询这个IP的历史数据,这里就不详细展开了。
案例二:毒云藤(APT-C-01)关于毒云藤(APT-C-01)的详细报告可以参考
https://ti.qianxin.com/uploads/2018/09/20/6f8ad451646c9eda1f75c5d31f39f668.pdf我们直接把关注点放在
“毒云藤组织使用的一个用于控制和分发攻击载荷的控制域名
http://updateinfo.servegame.org”
“然后从
hxxp://updateinfo.servegame.org/tiny1detvghrt.tmp下载 payload”
URL上,我们先尝试找下这个域名对应的IP,显然到现在这个时候还没有多大收获:
╭─heige@404Team ~╰─$ping updateinfo.servegame.orgping: cannot resolve updateinfo.servegame.org: Unknown host在奇安信的报告里我们可以看到使用的下载服务器WEB服务目录可以遍历
所以我们应该可以直接尝试搜索那个文件名“tiny1detvghrt.tmp”,果然被我们找到了
这里我们可以基本确定了updateinfo.servegame.org对应的IP为165.227.220.223 那么我们开始老套路查询历史数据:
>>
>
data = zm.history_ip("
165.227.220.223"
)
>
>
>
9
>
>
>
for i in data['
data'
]:
... print(i['
timestamp'
],i['
portinfo'
]['
port'
])
...
(u'
2019-06-18T19:02:22'
, 22)
(u'
2018-09-02T08:13:58'
, 22)
(u'
2018-07-31T05:58:44'
, 22)
(u'
2018-05-20T00:55:48'
, 80)
(u'
2018-05-16T20:42:35'
, 22)
(u'
2018-04-08T07:53:00'
, 80)
(u'
2018-02-22T19:04:29'
, 22)
(u'
2017-11-21T19:09:14'
, 80)
(u'
2017-10-04T05:17:38'
, 80)
继续看看这个tiny1detvghrt.tmp部署的时间区间:
>>
>
for i in data['
data'
]:
... if "
tiny1detvghrt.tmp"
in i['
raw_data'
]:
... print(i['
timestamp'
],i['
portinfo'
]['
port'
])
...
(u'
2018-05-20T00:55:48'
, 80)
(u'
2018-04-08T07:53:00'
, 80)
(u'
2017-11-21T19:09:14'
, 80)
最起码可以确定从2017年11月底就已经开始部署攻击了,那么在这个时间节点之前还有一个时间节点2017-10-04 05:17:38,我们看看他的banner数据:
>>
>
for i in data['
data'
]:
... if "
2017-10-04"
in i['
timestamp'
]:
... print(i['
raw_data'
])
...
HTTP/1.1 200 OK
Date: Tue, 03 Oct 2017 21:17:37 GMT
Server: Apache
Vary: Accept-Encoding
Content-Length: 1757
Connection: close
Content-Type: text/html;
charset=UTF-8<
!DOCTYPE HTML PUBLIC "
-//W3C//DTD HTML 3.2 Final//EN"
>
<
html>
<
head>
<
title>
Index of /<
/title>
<
/head>
<
body>
<
h2>
Index of /<
/h2>
<
table>
<
tr>
<
th valign="
top"
>
<
img src="
/icons/blank.gif"
alt="
[ICO]"
>
<
/th>
<
th>
<
a href="
"
>
Name<
/ a>
<
/th>
<
th>
<
a href="
?C=M;
O=A"
>
Last modified<
/ a>
<
/th>
<
th>
<
a href="
?C=S;
O=A"
>
Size<
/ a>
<
/th>
<
th>
<
a href="
?C=D;
O=A"
>
Description<
/ a>
<
/th>
<
/tr>
<
tr>
<
th colspan="
5"
>
<
hr>
<
/th>
<
/tr>
<
tr>
<
td valign="
top"
>
<
img src="
/icons/unknown.gif"
alt="
[ ]"
>
<
/td>
<
td>
<
a href="
doajksdlfsadk.tmp"
>
doajksdlfsadk.tmp<
/ a>
<
/td>
<
td align="
right"
>
2017-09-15 08:21 <
/td>
<
td align="
right"
>
4.9K<
/td>
<
td>
<
/td>
<
/tr>
<
tr>
<
td valign="
top"
>
<
img src="
/icons/unknown.gif"
alt="
[ ]"
>
<
/td>
<
td>
<
a href="
doajksdlfsadk.tmp.1"
>
doajksdlfsadk.tmp.1<
/ a>
<
/td>
<
td align="
right"
>
2017-09-15 08:21 <
/td>
<
td align="
right"
>
4.9K<
/td>
<
td>
<
/td>
<
/tr>
<
tr>
<
td valign="
top"
>
<
img src="
/icons/unknown.gif"
alt="
[ ]"
>
<
/td>
<
td>
<
a href="
doajksdlrfadk.tmp"
>
doajksdlrfadk.tmp<
/ a>
<
/td>
<
td align="
right"
>
2017-09-27 06:36 <
/td>
<
td align="
right"
>
4.9K<
/td>
<
td>
<
/td>
<
/tr>
<
tr>
<
td valign="
top"
>
<
img src="
/icons/unknown.gif"
alt="
[ ]"
>
<
/td>
<
td>
<
a href="
dvhrksdlfsadk.tmp"
>
dvhrksdlfsadk.tmp<
/ a>
<
/td>
<
td align="
right"
>
2017-09-27 06:38 <
/td>
<
td align="
right"
>
4.9K<
/td>
<
td>
<
/td>
<
/tr>
<
tr>
<
td valign="
top"
>
<
img src="
/icons/unknown.gif"
alt="
[ ]"
>
<
/td>
<
td>
<
a href="
vfajksdlfsadk.tmp"
>
vfajksdlfsadk.tmp<
/ a>
<
/td>
<
td align="
right"
>
2017-09-27 06:37 <
/td>
<
td align="
right"
>
4.9K<
/td>
<
td>
<
/td>
<
/tr>
<
tr>
<
td valign="
top"
>
<
img src="
/icons/unknown.gif"
alt="
[ ]"
>
<
/td>
<
td>
<
a href="
wget-log"
>
wget-log<
/ a>
<
/td>
<
td align="
right"
>
2017-09-20 07:24 <
/td>
<
td align="
right"
>
572 <
/td>
<
td>
<
/td>
<
/tr>
<
tr>
<
th colspan="
5"
>
<
hr>
<
/th>
<
/tr>
<
/table>
<
/body>
<
/html>
从这个banner数据里可以得出结论,这个跟第一个案例里目标明确的入侵后植入水坑不一样的是,这个应该是攻击者自主可控的服务器,从doajksdlfsadk.tmp这些文件命名方式及文件大小(都为4.9k)基本可以推断这个时间节点应该是攻击者进行攻击之前的实战演练!所以这个IP服务器一开始就是为了APT攻击做准备的,到被发现后就直接抛弃!
网络安全一直是我们关注的焦点,恶意攻击、APT攻击更是不容忽视。如何及时找出目标可能遭受的威胁成为保护系统中的重要一环。本文将利用ZoomEye进行APT攻击寻找,并分析攻击的方式、手段和防范方法。
I. ZoomEye简介
ZoomEye是一款针对互联网设备漏洞扫描、指纹识别和资产搜索的搜索引擎。它的强大之处在于精准地挖掘出互联网上的目标和漏洞,方便安全人员进行攻击行为的追踪和防范。
II. APT攻击模式的分析
APT攻击是一种高级持续性威胁,通常采用多种攻击方法,完成对特定目标的攻击行为,潜在风险极大。APT攻击常采用“黑客”手段,结合社交工程学、零日漏洞、恶意软件等方式进行攻击。
III. ZoomEye挖掘技巧以及攻击防御
利用ZoomEye检索目标主机,可发现其在互联网上的一切资产,而看到这些资产,恶意攻击者一定也看到了。为了防范这种风险,我们应该加强对自身网络系统的安全防范措施,最有效的方法就是加强运维和漏洞修补工作。
IV. 实例分析:挖掘网站漏洞
使用ZoomEye搜索网站主页,可以发现如下一些网站未经授权公开敏感信息。经过初步分析,我们访问这些网站后,发现它们的网站口令并未加密。因此,攻击者可以通过这些口令直接获取敏感信息从而实施攻击。
V. 实例分析:利用ZoomEye寻找资产信息
使用ZoomEye搜索出针对企业攻击的IP和服务器,深度挖掘IP和端口信息,可发现存在大量的未修补漏洞,恶意攻击者就可利用这些漏洞发起攻击。准确分析目标的资产信息,往往可以从根本上扼制恶意攻击造成的危害。
VI. 实例分析:借助ZoomEye寻找未公开src地址
通过ZoomEye的指纹识别功能,可以轻松地发现某些源码没有公开的站点,然后利用这些站点进一步挖掘出特定网站的大量信息。
VII. 实例分析:使用ZoomEye寻找恶意软件家族
由于APT攻击通常采用恶意软件来实现攻击,ZoomEye可以通过关键词搜索恶意软件的特征码,从而寻找出与此家族有关的信息,为攻击的监测和防范提供依据。
通过ZoomEye对目标进行攻击溯源,从资产信息的发掘、漏洞的挖掘和攻击手段的分析,不仅能有效的提高整个安全体系的效果和深度,而且可以快速了解与分析目标的资产信息,从而以更有效的方式提升整个安全体系的防攻能力。