TP-Link HS110 Wi-Fi是一种支持云的电源插头,可通过应用程序远程打开和关闭,并提供能量监控和调度功能。作为对物联网安全性正在进行的研究的一部分,我们通过对设备固件和Android应用程序进行反向工程,嗅探应用程序对设备和设备对应用程序的通信并模糊所使用的专有协议来进行安全性分析。
尽管发现云通信对于IoT设备而言是相当安全的,但我们发现了两种不安全的专有本地配置协议:人类可读的JSON协议“加密”,并具有易于逆转的自动密钥XOR密码和二进制DES加密的配置和调试协议( TDDP – TP-Link设备调试协议)。 TDDP已在包括路由器和接入点在内的大多数TP-Link产品线中使用,因此值得进一步研究。我们还为GitHub上的专有协议发布了Wireshark解剖器和两个python客户端。
无身份验证:本地网络上的任何人都可以打开或关闭智能插头,对其进行重置或使其无法使用
可以使用任何有效的Symantec EV证书来拦截TLS云连接(仅选中根CA)
智能插头具有两个物理按钮:一个开/关继电器开关和一个设备重置按钮,如果按下此按钮五秒钟或更长时间,该按钮将重置设备。插入后,未配置或新重置的智能插件将启动SSID为“ TP-LINK_Smart Plug_XXXX”的不安全开放式访问点,其中XXXX是四个十六进制数字。在WiGLE上进行的快速搜索揭示了一些未配置的TP-Link智能插头:
TP-Link的智能家居应用程序“ Kasa”使智能手机连接到此访问点,将UDP广播数据包发送到255.255.255.255以查找智能插头IP,然后继续使用用户在应用中输入的SSID和密码对其进行配置。然后,智能插头关闭接入点,并作为客户端连接到已配置的WiFi。
我们使用Sensepost MANA工具包执行KARMA攻击,强行取消对智能插头的身份验证,并尝试使它以相同的SSID而没有安全性地连接到恶意访问点。攻击不成功;但是,可以使用重复的取消身份验证对设备执行临时的“拒绝服务”攻击。
我们下载了该设备的当前官方固件(HS110(US)_V1_151016.zip),然后使用binwalk提取.bin文件的内容:
可以看到,固件是典型的嵌入式Linux系统,包含三个部分:
这是用于验证云服务器身份的证书。该文件包含“ VeriSign 3类公共主要证书颁发机构– G5”根证书。这意味着在建立到云的TLS连接时执行的唯一检查是,是否已通过Symantec / VeriSign CA的扩展验证(EV)证书对提供的服务器证书进行了签名(CA固定)。坚定的攻击者可以购买自己的EV证书并将其用于模拟云服务器。
所有专有服务器逻辑都包含在shd(“智能家居后台程序”)二进制文件中,该二进制文件为MIPS32 R2 Big Endian:
shd:ELF 32位MSB可执行文件,MIPS,MIPS32 rel2版本1(SYSV), 动态链接,解释器/lib/ld-uClibc.so.0,损坏的节头大小
shd二进制文件还包含OpenSSL 1.0.1j的副本(2014年10月15日),用于建立与云服务器的TLS连接。我们将shd二进制文件加载到IDA中并开始分析!
固件中提供的Busybox版本容易受到CVE-2011-2716的攻击,CVE-2011-2716是Busybox的udhcpc DHCP客户端组件中的命令注入漏洞,它允许将Shell命令注入以下DHCP选项之一:(12)主机名,(15 )域名,(40)NIS域或(66)TFTP服务器名称。为此,shell脚本调用udhcpc必须实际使用这些值。通过分析固件,我们发现shd二进制文件创建了一个shell脚本/tmp/udhcpc.script,其中包含:
#!/ bin / sh if [$ 1 =更新–o $ 1 =绑定] 然后 ifconfig $ interface $ ip网络掩码$ subnet 默认路由 路由添加默认gw $ router 回声"名称服务器$ dns" > /tmp/resolv.conf 科幻
如我们所见,主机名是硬编码的,没有使用其他任何选项。不幸的是,在这种情况下,udhcpc漏洞无法利用。
无论请求是什么,端口80上的Web服务器都会以无意义的省略号答复:
通过shd二进制文件查看,我们发现HTTP Server例程称为“ fake_httpd”,并将始终返回此硬编码的回复。
端口9999 TCP用于通过Kasa应用程序控制本地网络上的智能插头,这在TP-Link智能家居协议部分中进行了介绍。 TP-Link设备调试协议部分中介绍了端口1040 UDP。
嗅探本地无线网络流量表明,TP-Link Kasa SmartHome应用程序使用看起来像加密数据的方式与TCP端口9999上的HS110智能插头通信。
我们看到初始密钥(初始化向量)i的硬编码值为-85(= 171)。明文的第一个字节与密钥进行异或。然后将密钥设置为纯文本字节。在下一次迭代期间,下一个纯文本字节与前一个纯文本字节进行异或。解密的工作原理相同,密钥流由密文字节组成。这被称为自动密钥密码,尽管它比具有重复密钥的简单XOR加密具有更好的统计特性,但很容易被已知的明文攻击所破坏。
现在我们知道了算法和密钥,我们在LUA中实现了Wireshark解析器,该解析器会自动解密端口9999上的TP-Link智能家居数据包。事实证明该协议使用JSON,因此我们还将解密后的内容传递给JSON解析器。现在,我们可以监视Kasa应用程序与本地WiFi上的Smart Plug之间的通信:
我们提供了JSON命令的完整列表(tplink-smarthome-commands.txt)和python客户端,用于将其发送给(tplink_smartplug.py)。
要使用我们的python客户端发送命令,请使用–c info选项调用它:
我们提供了几个预定义的命令,以使用–c选项从HS110智能插头中读取信息。另外,您可以使用–j选项并提供完整的JSON字符串:
这允许发送tplink-smarthome-commands.txt中列出的任何命令。 get_sysinfo答复将包含以下信息:
我们可以使用set_relay_state命令打开和关闭HS110智能插头,将1表示为on,将0表示为off:
我们可以使用reboot命令重新启动HS110智能插头,该命令需要一个以秒为单位的delay参数:
可以将HS110智能插头重置为出厂设置,使其再次充当打开的访问点: 请注意,由于该协议不提供身份验证,因此网络上的任何人都可以发送此命令并强制重置。 在这里,恶作剧者会设置较高的延迟值,使他们有时间离开房屋。 还有其他命令可以更改MAC地址,更改设备和硬件ID,关闭设备LED(夜间模式)等。 特别令人关注的是固件刷新命令。 您可以使用以下任意网址下载固件文件: 由于修改过的图片的签名必须与四个硬编码的RSA密钥之一匹配,因此无法刷新已修改的图片(我们不会胡乱猜测为什么这里有四个密钥): 您可以指示HS110智能插头扫描附近的接入点列表: 使用命令set_stainfo(key_type 3表示WPA2)连接到具有给定SSID和密码的AP。
请注意,所有JSON命令均被接受,而与设备状态无关!仅当HS110智能插头充当AP时,才需要在未配置状态下连接到接入点。使用set_stainfo命令可以强制插件即时连接到其他WiFi。
HS110智能插件会定期尝试使用TLS连接到位于devs.tplinkcloud.com:50443的TP-Link云服务器。即使在Kasa应用程序中将HS110智能插头配置为“仅限本地”,此行为也会继续。对我们来说幸运的是,有一个命令可以更改云服务器URL:
shd二进制文件尝试使用提供的URL建立TLS 1.0连接,并检查服务器证书是否由存储在/etc/newroot2048.crt下的Symantec EV Root CA签名。拥有必要资金的攻击者可以购买有效的EV证书,并对HS110 Smart Plug和云之间的通信进行中间人攻击。
要向云注册设备,我们发出bind命令并提供有效的云帐户名和密码:
有趣的是,如果云服务器不知道Smart Plug的hwID,注册将失败。这意味着TP-Link会执行校验和或其他类型的真实性检查,或者检查设备的完整列表。无论哪种方式,这都允许TP-Link跟踪所有设备的整个使用寿命。
这使本地网络上的攻击者可以取消注册设备,从而迫使设备所有者再次注册。然后,攻击者可以捕获Kasa应用发送的绑定注册命令,并以明文形式查看所有者的tplinkcloud.com凭据!
通过分析shd二进制文件,我们在HS110智能插头中发现了隐藏的“测试模式”。可以远程调用它,也可以通过shd二进制文件的命令行参数来调用它。
可以使用–t选项启动shd二进制文件,从而使其进入测试模式:
这将调用一个名为wlan_start_art的函数,该函数看起来很有希望,因为它执行Atheros无线电测试(ART)客户端代码以对Atheros无线适配器进行性能测试。这段调试代码已经在2013年导致TP-Link路由器中的漏洞,可以使用设备Web服务器上的隐藏URL触发该漏洞:TP-Link http / tftp后门
LD_LIBRARY_PATH = / tmp 配音–I br0 –c 1 192.168.0.100 tftp –g 192.168.0.100 –r ap_bin / ap121 / art.ko –l /tmp/art.ko insmod /tmp/art.ko tftp –g 192.168.0.100 –r ap_bin / ap121 / nart.out –l /tmp/nart.out chmod + x /tmp/nart.out /tmp/nart.out –实例0&
这些命令连接到TFTP服务器,下载一个名为nart.out的文件,使其可执行并运行。这可以很容易地用于根设备。所有需要做的就是将一个名为nart.out的外壳程序脚本托管在IP地址为192.168.0.100的TFTP服务器上,位于路径ap_bin / ap121 /下。 Shell脚本将启动busybox telnetd守护程序:
但是,我们无法使用–t选项在设备上调用shd二进制文件。
7.2远程测试模式遍历shd二进制文件中的所有JSON命令,我们找到了一个名为set_test_mode的命令。这意味着可以远程启用测试模式!
这是唯一的JSON命令,作为一种原始保护,它要求请求源自IP 192.168.0.100。最简单的方法是重置HS110智能插头并连接到其AP,因为将DHCP服务器配置为发布以192.168.0.100开头的IP。接下来,发送set_test_mode命令:
这会将特殊的测试模式标志写入设备的NVRAM。引导过程中会检查该标志,如果将其设置为HS110 Smart Plug,则会引导进入测试模式。
智能插头会尝试使用SSID“ hs_test”和密码“ 12345670”连接到WPA2保护的访问点,然后打开插头的继电器:
正如预期的那样,HS110智能插头连接到我们的hs_test AP。然后,我们观察到智能插件的常规设置:通过DHCP请求IP,使用来自NTP-Pool(cn.pool.ntp.org)的服务器同步时间,并在开发人员处连接到TP-Link Cloud服务器。 tplinkcloud.com:50443。
不幸的是,智能插头的行为在测试模式下与常规启动后没有什么不同。虽然在远程测试模式代码中有对wlan_start_art函数的引用,但在一部分中没有任何引用导致它。这可能意味着对该部分的函数调用已被注释掉。
HS110智能插头的端口扫描显示了一个开放的UDP端口1040。分析shd二进制文件的setsockopt()调用,我们可以看到该端口已被名为“ TDDP”的组件绑定。该协议似乎是二进制的,并且是以非常隐秘的方式设计的,因此,除非向端口发送了完全有效的数据包,否则不会给出任何答复。对协议进行逆向工程将是一项新的重大任务,幸运的是,我们不必这样做。
在对“ TP-Link”和“ TDDP”进行大量搜索之后,我们发现该协议已在中国获得专利,专利为“ CN 102096654 A”和“ CN 102123140 B”,Google方便地将其自动翻译成英文:
完整的协议规范包含在专利说明中,并向您展示如何构造TDDP数据包。
TDDP可用于通过广播ping或发现网络上的TP-Link设备,读取和设置配置选项以及执行特定于设备的特殊命令。 TDDP通过包含在包头中的整个包的MD5摘要提供完整性:
它还使用DES加密数据包有效负载。这意味着我们读出的任何配置数据都将在回复中加密,而我们要写入的任何配置都需要加密发送。
DES密钥是通过以下方式确定的:将设备的用户名和密码连接起来,构建该字符串的MD5哈希值,然后将MD5的前半部分(16位十六进制数字或8个字节)用作DES密钥:
由于HS110智能插件不提供任何身份验证,因此用户名和密码将以admin / admin的形式硬编码到shd二进制文件中:
对于其他TP-Link设备,这意味着攻击者可以通过一种高效的方法来检查默认密码,并对登录名执行脱机蛮力攻击。通过单个UDP数据包,他们可以请求已知的信息(我们在SmartPlug中发现了“ Heartbeat” / ping请求,该请求始终返回“ ABCD0110”)或可以轻松确定(例如MAC地址)。然后可以对加密的回复进行离线暴力破解,尝试使用用户名(可能是“ admin”)和密码的不同组合。
我们提供了一个非常基本的概念验证TDDP客户端,该客户端尝试通过使用数据包类型0x03和“ SubType”标头字段中的特定十六进制值来从TP-Link设备中读取三个值之一:
0x0A返回测试字符串“ ABCD0110”,0x012返回设备ID,0x14返回hardwareID。他们可能会在其他类型的TP-Link设备上返回不同类型的信息。我们还发现了其他值,这些值更改了设备ID(0x13、0x15),硬件ID(0x12)和MAC地址(0x06)。
二进制TDDP协议值得进一步研究,因为它可用于多种TP-Link设备。 特定于设备的特殊命令(CMD_SPE_OPR)可能会发现未记录的功能,漏洞甚至后门。 下一步,应该用TDDP标头中的所有十六进制值对不同的TP-Link设备进行模糊处理,并对其行为进行监视和分析。 2018年6月19日更新:TP-Link已更新其固件。 如果安装此固件升级,则tplink_smartplug.py将不再起作用。 更新04.07.2018:我们更新了工具。 现在,它支持带有最新固件的TP-Link HS100,HS105和HS110。 还支持用主机名代替IP地址,并且现在可以将脚本作为Python模块导入。 非常感谢在GitHub上发布问题并提出请求的人员。