我们现在生活在互联网安全军备竞赛中,您的个人信息处于平衡之中。一个好的防火墙可以走很长的路,但它们并非万无一失。在这篇文章中,我想向您展示一个隐藏的系统,该系统正在努力扫描数千甚至数百万个毫无戒心的设备。我将展示该系统如何有效地收集每台设备的个人IP地址并将其交给扫描仪,扫描仪继续对每个毫无戒心的受害者运行端口/安全扫描以查找漏洞。
当我注意到源源不断的未经请求的网络扫描正在冲击我的设备时,第一个危险信号就出现了。最令人费解的是,被攻击的设备具有随机的IPv6地址,并且没有在DNS或任何公共记录中发布。出于所有意图和目的,它们都安全地隐藏在我的实验室网络中。
想象一下当防火墙开始记录大量数据包时我的惊讶,这些数据包来自遥远的互联网地址,直接针对我的隐藏设备。他们被直接瞄准了。
那么他们是怎么知道未公开的IP地址的呢?这些地址的长度为128位,这是一个难以想象的数字范围。Unguessable是描述设备上使用的随机地址的唯一方式。
我的下一步是在防火墙日志中搜索发送到这些可能触发扫描的扫描仪的任何出站流量。没有——没有一个出站数据包被发送到扫描仪。扫描仪有我的隐藏地址,即使我的设备从未连接到它们。
在这篇文章中,我将回顾我的步骤,因为我剖析了这个收集ip地址然后将它们传递给另一个系统以闪电般的速度扫描的高级系统。
如果您是数十亿Debian、Ubuntu或Raspbian用户中的一员,或者如果您有运行这些操作系统的服务器,并且您有IPv6地址,那么很可能您的设备已经被扫描过。我实验室网络中的目标设备都运行基于Debian的Linux Raspbian发行版。
Debian是Linux操作系统的一个发行版。它以其极简主义的方法和在支持ARM计算机体系结构方面的巨大成功而闻名。它在云服务器、路由器和新近流行的 35 美元信用卡大小的Raspberry Pi计算机(它们运行Raspbian)上运行。它与“NTP 时间守护程序”打包在一起,预先配置为查询一组特定的时间提供程序。
最近我还了解到池的其他部分包含收割机,包括RedHat NTP池。
从采集到扫描——需要多长时间?
收集和扫描您的地址只需不到五秒钟的时间。整个扫描过程不到一秒钟,扫描了100多个常见的TCP和UDP端口。
他们是如何获得我的随机 IPV6 地址的?
它是否已在DNS中注册?不。可以猜到吗?否。方法如下:我的计算机向公共网络时间协议(NTP)池发出正常请求以设置其时钟。除了NTP,服务器还必须运行某种应用程序或脚本来获取入站数据包的源IP。但是我有点超前了,我仍然需要描述我是如何得出这个结论的。
使用NTP有多普遍?
现在几乎每台计算机都将时间设置为原子标准。大多数情况下,计算机会使用 NTP 将其时钟同步到计算机配置定义的公共NTP服务器。
每台计算机的 NTP 服务器地址通常由制造商预先配置,或者在Raspberry Pi的情况下,它被放入Raspbian固件映像 (/etc/ntp.conf)。
使用IPv6从Debian获取NTP时间?您可能正在被Shodan扫描。
NTP使用池或服务器组的概念。Ntp.org聚合了公共池并使它们可以使用诸如0.Debian.pool.ntp.org之类的名称。
什么是端口扫描?这类似于穿过停车场并拉动门把手以查看哪些门未锁定。正如汽车可以包含贵重物品一样,计算机也可以包含贵重物品,包括个人数据。
端口扫描可以合乎道德地使用,但也可能被恶意使用。例如,邪恶的黑客利用端口扫描结果,根据他们在端口扫描期间检测到的软件来识别潜在的受害者。另一方面,研究人员使用端口扫描数据来编制有关整个互联网的报告,如Shodan上所见(链接)。这是启动端口扫描的两个主要原因。
这些扫描是否专门针对我?好吧,不,不完全是。这些扫描确实针对Debian系统,但并不专门针对个人。
数百万台设备使用Debian NTP服务器。这些设备中越来越多的人拥有IPv6地址。
什么是IPV6?
Internet协议版本6(IPv6)是最新版本的网络协议,可将您的数据传输到您的家庭或办公室网络以及整个Internet。这是互联网的一次非常重要的升级,它将使网络连接设备在过去二十年或更长时间里持续加速增长,实现无限增长。
新协议的采用正在全球网络的幕后进行。在大多数情况下,这是一个透明的升级。当您走路时,您知道脚下有一条人行道,您可能不太在意它是由混凝土还是其他材料制成的。它最大的卖点是IP版本6提供的大量地址。因此您可以将恒温器和冰箱连接到互联网。
Ipv6提供了许多安全功能。随机主机寻址是其中之一 - 也称为临时地址或隐私扩展。
随机寻址?
这指的是所谓的“隐私扩展”,它为设备提供了一种方法,可以为自己分配一个IP地址,该地址一半是家庭/网络前缀,一半是随机位。这应该提供一种通过使其地址几乎不可猜测来隐藏设备的方法。但众所周知,默默无闻的安全根本算不上安全。该扫描仪网络的运营商正在利用这样一个事实,即只要设备建立传出连接(例如将其时钟设置为NTP服务器),这些隐私地址就会暴露出来
但是临时地址是安全的,对吧?
是和不是。它们当然有帮助,并且拥有一个不包含您的MAC地址的临时的、有点随机的IPv6地址是朝着正确方向迈出的一步,在该临时地址的生命周期内,仍然有可能接收到流量。两个设备都分配了临时地址。这两种设备都在防火墙后面,用户不使用它们进行互联网通信。唯一运行的服务是NTP和偶尔的包管理器更新。
另请参阅RFC5157(“IPv6对网络扫描的影响”)
让SHODAN做肮脏的工作
扫描似乎是通过Shodan的扫描API进行的。执行扫描的IP已注册到Shodan主机名。下面是一些示例(这些是在我的防火墙上发出扫描数据包的一些扫描仪:
2604:a880:0800:0010:0000:0000:0970:a001 = thor.scan6.shodan.io。
2604:a880:0800:0010:0000:0000:00fe:d001 = gateway.scan6.shodan.io。
2604:a880:0800:0010:0000:0000:0092:2001 = bone.scan6.shodan.io。
2604:a880:0800:0010:0000:0000:00fd:7001 = burger.scan6.shodan.io。
2604:a880:0800:0010:0000:0000:0089:c001 = rock.scan6.shodan.io。
2607:ff10:00c5:0509:bcde:00d0:fde8:e28d =?Carinet ISP。
这个很奇怪,只见过两次。
地址究竟是如何收集的?
很明显,我们可以看到对收割机执行ntp时间同步将导致后续扫描,但收割机如何捕获我的IP信息?他们是在抓取ntp日志文件还是防火墙日志?好吧,为了缩小可能性列表的范围,我尝试使用netcat针对已知的收割机直接探测ntp端口。结果?我被扫描了!因此,似乎甚至不需要真正的NTP请求,一个简单的空数据包到收割机的ntp端口就足以收割。这表明可能存在防火墙日志抓取器、scapy脚本或其他低级别的IP收集方式,并且还表明这些时间服务器上的ntp应用程序本身可能没有以任何方式定制。
新:一时兴起,我尝试向受影响的服务器 (2604:a880:0400:00d0:0000:0000:0009:b00d) 上的端口321发送一个空数据包,你瞧,它触发了一次扫描。因此,收集似乎完全独立于服务器上运行的NTP服务。
人们可以用扫描数据做什么?
对于初学者,他们可以收集有和没有防火墙的IPv6地址的比例——因为如果他们有防火墙,则不会响应任何扫描探测(如果没有防火墙,一些或所有数据包将响应,如果没有其他端口关闭响应)。此外,他们知道哪些服务不受客户端防火墙的保护。最后,最令人不安的是,他们可能也在探测客户端中的漏洞,在这种情况下,如果他们选择这样做,他们将很清楚如何将间谍软件/恶意软件/病毒加载到客户端上。
日志分析的进展。
最初,我一直在使用嵌入式Splunk查询将扫描与采集器相关联,但我发现很难而且几乎不可能获取主要查询的某些属性,稍微调整它们,并将它们提供给搜索传出数据包的第 2 阶段查询触发了扫描仪。通过使用Splunk API接口并编写一个小的Python脚本,我能够在相对较短的时间内完成我所需要的。该脚本花了两天时间编写,它每天运行大约10秒来分析防火墙日志。它生成的结果为我节省了数小时的手动工作,这在我看来是一个胜利!
他们用什么方法收割?
我的大部分测试都集中在使用免费的NTP服务器获取时间,然后分析以下扫描。不过,我走得更远,试图找出端口上是否需要真正的NTP流量。事实证明,事实并非如此。只需向端口123发送一个空数据包就足以触发扫描。因此,我们可以得出结论,IP收集操作很可能是在数据包级别寻找目标,而不是某种自定义NTP应用程序。很可能有一个Scapy脚本正在运行或一个防火墙日志抓取器,它正在收集传入连接的IP地址,然后将其传递给驻留在其他地方的端口扫描器。
测试服务器设置
我如何配置我的测试服务器,以便它在每次联系收割机时都使用唯一的ipv6 地址?这部分有点技术性,我将在下面提供示例,但总的来说,我提高了随机IPv6地址过期并因此重新生成和分配的速率。通过调整sysctl,这在Linux和Mac上非常容易。但是,我不建议在您的桌面上使用这些设置,因为它们可能会导致您的连接中断,因为您在IP的有效期到期时正在使用该IP。
配置文件
# BH - 用于测试。关闭 SLAAC。
net.ipv6.conf.all.autoconf=0
net.ipv6.conf.default.autoconf=0# BH - 隐私扩展 - 用更小的东西覆盖默认的 1 天长 tempaddr 有效期。
# 这应该有助于缩小 ipv6 地址收集服务器的范围,等等。
net.ipv6.conf.all.use_tempaddr=2
net.ipv6.conf.default.use_tempaddr=2
net.ipv6.conf.eth0.use_tempaddr=2
net.ipv6.conf.all.temp_prefered_lft=1200
net.ipv6.conf.all.temp_valid_lft=2400
net.ipv6.conf.default.temp_prefered_lft=1200
net.ipv6.conf.default.temp_valid_lft=2400
net.ipv6.conf.eth0.temp_prefered_lft=1200
net.ipv6.conf.eth0.temp_valid_lft=2400
上述设置导致地址过期并每20分钟分配一次。这刚好高于协议可能开始不稳定的最低推荐值。这个速率非常适合每30分钟运行一次测试,并且每个测试都有自己唯一的ipv6地址。
当然,我的每个时间请求都有一个唯一的源地址,这使得回溯触发扫描的请求变得微不足道——因为扫描的目标将匹配时间请求的源,而时间请求的目的地是收割机。
哪些 NTP 服务器正在收集数据?
默认情况下,运行Debian的系统预先配置了五个时间服务器地址池:0-3.debian.pool.ntp.org。目前提供一些ipv6地址的是2.debian.poo..ntp.org主机名:
$ host 2.debian.pool.ntp.org
2.debian.pool.ntp.org has IPv6 address 2604:a880:400:d0::9:b002
2.debian.pool.ntp.org has IPv6 address 2604:a880:400:d0::9:b00e
2.debian.pool.ntp.org has IPv6 address 2001:470:e949:a::1
2.debian.pool.ntp.org has IPv6 address 2604:a880:1:20::a7:f004
以f004结尾的地址是已知的收割机。还有更多。下面我确认了十几个。我正在运行另一个脚本,它遍历池中的每个地址并发出时间请求,以查看它是否触发扫描。
针对池的DNS查找仅返回少数IPv6地址,但它们最终都会返回。可以返回数百甚至数千个IP。这是在大量可用服务器上分发ntp客户端的有效方式,在网络中很常见。然而,它确实让获得IPv6 NTP服务器的完整列表变得有些困难,因此我们可以检查每个服务器的收集行为。
NTP是一个有趣的协议。为了获得最准确的时间读数,它会在对时钟进行最终调整之前访问一些不同的服务器。这意味着在给定的同步周期内,它可能会访问六个不同的时间服务器。这使得确定哪个ntp服务器正在收集和触发扫描变得更加困难。我尽最大努力通过使用较短的tempaddr生命周期和我漂亮的侦探脚本来完成一些繁重的工作来减轻这一挑战。
我编写了一个名为detective.py(github链接)的Python脚本来帮助完成一些繁重的工作和日志分析。它执行防火墙日志分析以发现扫描操作。然后,它转换来自主要搜索的属性并执行第二个查询,以非常准确地发现哪些出站数据包最有可能触发扫描。
示例应用程序输出:
检测到扫描: startTime=2016-01-13T19:33:10.000+00:00 numPortsScanned=117 SRC=2604:a880:0800:0010:0000:0000:0970:a001 DST=my:prefix:my:prefix:7c0d:e6cb:8719:7d94 durationSeconds=0.0 startTimeEpoch=1452713590.0
这些数据包中的一个或多个可能触发了扫描...
lag=47.0s @2016-01-13T19:32:25.000+00:00 epoch=1452713545 my:prefix:my:prefix:7c0d:e6cb:8719:7d94:42539 -> 2604:a880:0001:0020:0000:0000:00a7:f007:123
lag=7.0s @2016-01-13T19:33:05.000+00:00 epoch=1452713585 my:prefix:my:prefix:7c0d:e6cb:8719:7d94:59081 -> 2604:a880:0001:0020:0000:0000:00a7:f009:123检测到扫描:startTime=2016-01-13T20:01:19.000+00:00 numPortsScanned=110 SRC=2604:a880:0800:0010:0000:0000:0089:c001 DST=my:prefix:my:prefix:c10a:acd0:af40:c259 durationSeconds=0.0 startTimeEpoch=1452715279.0
这些数据包中的一个或多个可能触发了扫描...
lag=8.0s @2016-01-13T20:01:13.000+00:00 epoch=1452715273 my:prefix:my:prefix:c10a:acd0:af40:c259:58417 -> 2604:a880:0001:0020:0000:0000:00a7:f00c:123检测到扫描: startTime=2016-01-13T19:12:02.000+00:00 numPortsScanned=114 SRC=2604:a880:0800:0010:0000:0000:00ba:4001 DST=my:prefix:my:prefix:95b4:83a9:31a7:02e6 durationSeconds=0.0 startTimeEpoch=1452712322.0
这些数据包中的一个或多个可能触发了扫描...
lag=6.0s @2016-01-13T19:11:58.000+00:00 epoch=1452712318 my:prefix:my:prefix:95b4:83a9:31a7:02e6:52382 -> 2604:a880:0001:0020:0000:0000:00a7:f005:123
在使用我方便的Python脚本(Github 链接)获取可能的收割机列表后,我通过向他们请求时间、使用ntpdate并检查查询收割机时立即进行的后续扫描来逐个确认每个收割机。
我还想出了一些基本的bash代码来对每个嫌疑人进行手术式探测,同时不让ntp建立其他连接:
ip6tables -I OUTPUT -j DROP
for I in 0 1 2 3 4 5 6 7 8 9 A B C D E F ; do
export IPADDR=2604:a880:0001:0020:0000:0000:00a7:f00${I}
echo Triggering $I
ip6tables -I OUTPUT -m state --state NEW ! -d $I -j DROP
ip6tables -L OUTPUT -v -n;
ntpdate $I
ip6tables -D OUTPUT 1
sleep 1205 # Wait long enough for IPv6 temp address to refresh
done这有助于确认一堆可疑的收割机。我想出了以下列表:
2604:a880:0400:00d0:0000:0000:0009:b001 (DNS: robot.data.shodan.io)
2604:a880:0400:00d0:0000:0000:0009:b002
2604:a880:0400:00d0:0000:0000:0009:b003
2604:a880:0400:00d0:0000:0000:0009:b004
2604:a880:0400:00d0:0000:0000:0009:b005
2604:a880:0400:00d0:0000:0000:0009:b006
2604:a880:0400:00d0:0000:0000:0009:b007
2604:a880:0400:00d0:0000:0000:0009:b008
2604:a880:0400:00d0:0000:0000:0009:b009
2604:a880:0400:00d0:0000:0000:0009:b00a
2604:a880:0400:00d0:0000:0000:0009:b00b
2604:a880:0400:00d0:0000:0000:0009:b00c
2604:a880:0400:00d0:0000:0000:0009:b00d
2604:a880:0400:00d0:0000:0000:0009:b00d
2604:a880:0400:00d0:0000:0000:0009:b00e
2604:a880:0400:00d0:0000:0000:0009:b00f2604:a880:0001:0020:0000:0000:00a7:f001 (DNS: abend.data.shodan.io)
2604:a880:0001:0020:0000:0000:00a7:f002
2604:a880:0001:0020:0000:0000:00a7:f003
2604:a880:0001:0020:0000:0000:00a7:f004
2604:a880:0001:0020:0000:0000:00a7:f005
2604:a880:0001:0020:0000:0000:00a7:f006
2604:a880:0001:0020:0000:0000:00a7:f007
2604:a880:0001:0020:0000:0000:00a7:f008
2604:a880:0001:0020:0000:0000:00a7:f009
2604:a880:0001:0020:0000:0000:00a7:f00a
2604:a880:0001:0020:0000:0000:00a7:f00b
2604:a880:0001:0020:0000:0000:00a7:f00c
2604:a880:0001:0020:0000:0000:00a7:f00d
2604:a880:0001:0020:0000:0000:00a7:f00e
2604:a880:0001:0020:0000:0000:00a7:f00f2a03:b0c0:0003:00d0:0000:0000:0018:b001 (DNS: analog.data.shodan.io)
2a03:b0c0:0003:00d0:0000:0000:0018:b002
2a03:b0c0:0003:00d0:0000:0000:0018:b003
2a03:b0c0:0003:00d0:0000:0000:0018:b004
2a03:b0c0:0003:00d0:0000:0000:0018:b005
2a03:b0c0:0003:00d0:0000:0000:0018:b006
2a03:b0c0:0003:00d0:0000:0000:0018:b007
2a03:b0c0:0003:00d0:0000:0000:0018:b008
2a03:b0c0:0003:00d0:0000:0000:0018:b009
2a03:b0c0:0003:00d0:0000:0000:0018:b00a
2a03:b0c0:0003:00d0:0000:0000:0018:b00b
2a03:b0c0:0003:00d0:0000:0000:0018:b00c
2a03:b0c0:0003:00d0:0000:0000:0018:b00d
2a03:b0c0:0003:00d0:0000:0000:0018:b00e
2a03:b0c0:0003:00d0:0000:0000:0018:b00f
收割机正在使用Digital Ocean IP范围。默认情况下,Digital Ocean提供地址范围为1-F(15 个地址)的“droplet”(服务器或服务实例的名称),服务器可以分配其中一个或所有地址。
上面的15个块中的每个块可能是一个服务器,每个都在不同的网络区域中。
GeoIP查找显示“机器人”服务器位于旧金山, “异常终止”服务器位于纽约,而“模拟”服务器位于德国法兰克福。
暂时不清楚。您可以设置一个蜜罐服务器并触发对其进行扫描,然后查看它发现一个或多个易受攻击的服务后会发生什么。如果你这样做了,请回来告诉我你的结果:)
扫描结果很可能被保存到一个庞大的数据库中,例如Shodan在IPv4世界中所做的那样。查看网站以亲自查看。
在我们知道此操作背后的人的真实意图之前,我们至少可以假设数据可以并且将会被报告,并且在最坏的情况下会被利用并注入恶意软件。
扫描背后的意图是什么?
暂时不清楚。您可以设置一个蜜罐服务器并触发对其进行扫描,然后查看它发现一个或多个易受攻击的服务后会发生什么。如果你这样做了,请回来告诉我你的结果:)
扫描结果很可能被保存到一个庞大的数据库中,例如Shodan在IPv4世界中所做的那样。查看网站以亲自查看。
在我们知道此操作背后的人的真实意图之前,我们至少可以假设数据可以并且将会被报告,并且在最坏的情况下会被利用并注入恶意软件。
如何判断我是否被扫描?
这取决于 - 你有防火墙吗?如果是这样,希望它记录丢弃的数据包。通常有两个地方会安装防火墙来保护您的计算机:在计算机本身或在您的网关设备上。Comcast和其他ISP仅对阻止入站IPv6的硬件进行认证,以保护您免受此类攻击。您必须在路由器设置中明确允许入站连接,或者使用默认情况下不提供相同保护的未经认证的设备。
下一步的工作:我正在与NTP池维护人员合作深入研究这一点,并按照适当的渠道查出任何违反政策的活动。
评论已关闭。