type
status
date
slug
summary
tags
category
icon
password
Property
Jun 23, 2023 11:48 AM
🍽️实验目的
IoTGoat 项目是一个基于OpenWrt的故意不安全的固件,由OWASP维护,作为一个平台来教育软件开发人员和安全专业人员测试物联网设备中常见的漏洞。漏洞挑战基于下面提到的 OWASP IoT Top 10,以及来自项目贡献者的“彩蛋”。有关漏洞挑战的列表,请参阅IoTGoat 挑战维基页面。
描述 | |
I1 弱密码、可猜测密码或硬编码密码 | 使用易于暴力破解的、公开可用的或不可更改的凭据,包括固件或客户端软件中的后门,这些后门授予对已部署系统的未授权访问权限。 |
I2 不安全的网络服务 | 在设备本身上运行不需要或不安全的网络服务,尤其是那些暴露在互联网上的服务,这些服务会损害信息的机密性、完整性/真实性或可用性,或者允许未经授权的远程控制。 |
I3 不安全的生态系统接口 | 设备外部生态系统中不安全的网络、后端 API、云或移动接口,允许危害设备或其相关组件。常见问题包括缺乏身份验证/授权、缺乏或弱加密以及缺乏输入和输出过滤。 |
I4 缺乏安全更新机制 | 缺乏安全更新设备的能力。这包括在设备上缺乏固件验证、缺乏安全交付(在传输过程中未加密)、缺乏防回滚机制以及由于更新而缺乏安全更改通知。 |
I5 使用不安全或过时的组件 | 使用已弃用或不安全的软件组件/库可能会导致设备受到威胁。这包括操作系统平台的不安全定制,以及使用来自受损供应链的第三方软件或硬件组件 |
I6 隐私保护不足 | 存储在设备或生态系统中的用户个人信息被不安全、不当或未经许可使用。 |
I7 不安全的数据传输和存储 | 缺乏对生态系统内任何地方的敏感数据的加密或访问控制,包括静态、传输中或处理过程中 |
I8 缺乏设备管理 | 生产中部署的设备缺乏安全支持,包括资产管理、更新管理、安全退役、系统监控和响应功能。 |
I9 不安全的默认设置 | 带有不安全默认设置或无法通过限制操作员修改配置来提高系统安全性的设备或系统。 |
I10 缺乏物理硬化 | 缺乏物理加固措施,允许潜在的攻击者获取敏感信息,这有助于未来的远程攻击或对设备进行本地控制。 |
🔍实验环境
- IoGoat V1.0
- Window11(2023.5.302)
- Kali Linux2023
- VMware
✍🏻实验步骤
I1 Weak, Guessable, or Hardcoded Passwords
我们已经有img文件(从GITHUB上下载),img镜像文件通常是磁盘镜像文件,它是一个完整的磁盘或分区的副本,包括文件系统、文件、目录和元数据等,我们注意到img镜像文件可能包含隐藏的信息或漏洞,需要通过分析和解密来获取有用的信息。
当然下载其他格式的镜像文件也可以,但不同格式的镜像文件可能需要不同的工具和方法来进行分析和解密。对于img镜像文件,可以使用一些常见的工具来进行分析,例如dd、mount、fdisk等。
一般可以将img文件挂载,然后通过文件系统访问,首先创建一个挂载点目录,例如:
然后使用mount命令将img镜像文件挂载到该目录中
本次实验中,我们直接使用
binwalk
进行扫描,binwalk
是一个常用的静态分析工具,可以用于扫描和提取镜像文件中的隐藏信息和文件。它可以自动识别和提取各种类型的文件,包括压缩文件、图像文件、音频文件、二进制文件等。使用binwalk可以快速了解镜像文件的结构和内容,并且将其解压。首先我们将下载的img文件复制到kali linux当中:
随后使用
binwalk
命令解压:其中,
-e
表示将镜像文件中的文件提取出来,方便后续的分析和处理。如果没安
装binwalk
可以使用以下命令安装:提取后可以看到镜像内的文件:
同时在目录中可以浏览:
在目录中,我们发现了找到密码文件
etc/shadow
,这是一个存储用户密码的文件,通常只有root用户才有读取权限,获取这个文件的内容可以帮助我们破解用户密码,从而获取更多的权限和信息。打开文件,内容如下:
每一行代表一个用户的密码信息,包括用户名、加密后的密码、密码过期时间等。具体的格式如下:
其中,各个字段的含义如下:
- username:用户名
- password:加密后的密码
- lastpasswordchange:上次修改密码的时间(从1970年1月1日开始的天数)
- minpasswordage:密码最小使用时间(从上次修改密码开始的天数)
- maxpasswordage:密码最大使用时间(从上次修改密码开始的天数)
- warnpasswordage:提醒用户修改密码的时间(从上次修改密码开始的天数)
- passwordinactive:密码失效时间(从上次修改密码开始的天数)
- accountexpirationdate:账户失效时间(从1970年1月1日开始的天数)
- reserved:保留字段
在发现的/etc/shadow文件中,每一行代表一个用户的密码信息,其中
root
用户的密码为$1$Jl7H1VOG$Wgw2F/C.nLNTC.4pwDa4H1
,iotgoatuser用户的密码为$1$79bz0K8z$Ii6Q/if83F1QodGmkb4Ah.
。但这些密码都是经过加密的,需要进行破解才能获取明文密码。在密码字段中,存在以下信息:
$1$
:表示加密算法为md5。
$salt$
:防止彩虹表的盐。
$hashed
:hash值。
我们可以通过暴力破解的方式进行破解,先准备密码字典。密码字典是一种常用的破解密码的工具,包含了大量常见的密码和组合,可以用于暴力破解加密后的密码。但密码字典只能破解那些使用常见密码或组合的用户,对于使用复杂密码或随机密码的用户,密码字典的效果会大打折扣。因此,在进行密码破解时,需要根据实际情况选择合适的工具和方法,提高破解的效率和成功率。
我们选用的是以下字典
运行命令
转换字典格式
生成成功,一行一个
使用Medusa进行密码爆破,Medusa是一款常用的密码爆破工具,可以用于破解各种类型的密码,包括SSH、FTP、Telnet、HTTP等。Medusa支持多线程、多协议、多种认证方式,可以快速破解弱密码,是渗透测试中常用的工具之一。
使用以下的命令进行穷举爆破:
其中,具体的参数含义如下:
- u iotgoatuser:指定要破解密码的用户名为iotgoatuser。
- P ~/SecLists/Passwords/Malware/mirai-botnet_passwords.txt:指定密码字典文件的路径为~/SecLists/Passwords/Malware/mirai-botnet_passwords.txt。
- h 192.168.220.152:指定要破解密码的目标主机IP地址为192.168.220.152。
- M ssh:指定要破解的协议为SSH。
得到结果:
尝试登录ssh,成功
I2 Insecure Network Services
在不知道其他信息的情况下,可以先使用nmap进行扫描,通过扫描目标主机的开放端口和服务信息,可以了解目标主机的网络拓扑和系统配置,发现可能存在的漏洞和攻击面。同时,nmap还可以进行服务指纹识别、操作系统识别、漏洞扫描等高级功能,帮助选手更深入地了解目标主机的情况。
在命令中,-F选项表示快速扫描模式,它会对目标主机进行快速的端口扫描,只扫描常见的端口,包括TCP端口21、22、23、25、80、443、3389等。这种扫描模式速度较快,适合对目标主机进行快速的情报收集和漏洞探测。
扫描结果如下:
可以看到,主机处于活动状态,具有5个开放端口,分别是22/tcp(SSH)、53/tcp(域名服务)、80/tcp(HTTP)、443/tcp(HTTPS)和5000/tcp(UPnP)。
upnp一般被认为是漏洞比较多的协议,因此可以尝试扫一下5000端口,使用以下命令
其中,各参数释义如下:
- p5000:指定要扫描的端口为5000,这是一个常见的Web服务端口。
- sV:开启服务指纹识别功能,可以识别目标主机上运行的服务类型和版本号。
该命令会对目标主机的5000端口进行扫描,并尝试识别该端口上运行的服务类型和版本号。通过服务指纹识别,可以了解目标主机上运行的具体服务和版本信息,进一步了解目标主机的情况,发现可能存在的漏洞和攻击面。
结果如下
扫描结果显示,对一个开放的UPnP端口(5000/tcp)的服务版本扫描。扫描结果显示该端口运行的是MiniUPnP 2.1版本,使用的是UPnP 1.1协议。
接下来可以用指定的脚本扫描详细信息
broadcast-upnp-info
是一个专门用于扫描UPnP设备的Nmap脚本。该脚本可以通过UPnP协议获取设备的详细信息,包括设备类型、制造商、型号、固件版本等。扫描结果显示中可以找到
rootDesc.xml是UPnP设备的描述文件之一,它是一个XML文档,包含了设备的基本信息、服务信息、设备类型、制造商、型号、固件版本等。UPnP设备通过提供rootDesc.xml文件来描述自己的功能和服务,使得其他设备和应用程序可以通过UPnP协议与其进行通信。rootDesc.xml文件通常可以通过HTTP协议访问,其URL通常为http://<设备IP地址>:<端口号>/rootDesc.xml。
尝试在web中访问:
可以看到开启了以下的服务:
- Layer3Forwarding服务:该服务是用于路由器的网络层转发功能,允许路由器将数据包从一个网络接口转发到另一个网络接口,以实现不同网络之间的通信。
- DeviceProtection服务:该服务是用于设备保护的,可以提供设备的安全性和隐私保护。该服务可能包括设备身份验证、访问控制、加密和安全日志记录等功能。
其中,
<controlURL>/ctl/L3F</controlURL>
是 UPnP 设备描述文档中的一个元素,它指定了 Layer3Forwarding 服务的控制 URL。控制 URL 是 UPnP 设备提供的用于控制服务的 HTTP URL,客户端可以通过该 URL 发送 SOAP 消息来调用服务的操作。在本例中,控制 URL 为 /ctl/L3F
,表示客户端可以通过向 http://设备IP地址/ctl/L3F
发送 SOAP 消息来控制 Layer3Forwarding 服务。控制消息使用SOAP协议,也以xml表示,看起来和RPC类似(但没有任何身份验证),即通告SOAP来实现服务操作。因此一旦有人使用upnp协议访问,就可以通过控制 URL 发送 SOAP 消息来控制设备的服务操作。
I3 Insecure Ecosystem Interfaces
使用说明书中的账号
root
密码iotgoathardcodedpassword
登录WEBUI,查看是否有安全风险。随后找到一个指令命令的接口
这个也可以通过binwalk提取,代码审计得到
代码在
这时可以查看启用的网络服务
这个5515非常可疑,使用nc尝试连接
发现后门
I4 Lack of Secure Update Mechanism
首先在WEBUI中查看openwrt版本
经过搜索,此时版本存在CVE-2020-7982漏洞
在用户通过
opkg install <package>
安装软件包后,opkg
会首先解析软件包列表。解析器遍历每个包条目,并根据字段类型执行不同的操作,如果是
SHA256sum
字段,解析器会调用pkg_set_sha256
:pkg_set_sha256
会尝试将SHA256sum
字段从十六进制转为二进制,并以内部形式存储:如果解码失败,程序自动结束,并不保存哈希值。
漏洞发生在
checksum_hex2bin
中:最开始,变量
s
和src
都指向同一地址。在第246行,变量
src
前进到第一个非空格字符,然而在实际进行解码时,256行的for
循环是在变量s
上进行操作,而变量s
仍旧指向字符串的起始位置。因此,如果输入的字符串开头有任何空格字符的话,程序就会尝试对空格字符进行解码,而空格字符并不是十六进制字符,所以
isxdigit()
会返回false
,解码器的循环立即终止,*len
为0
。再次检查解析器,可以看到传递给
pkg_set_sha256
的字符串是”SHA256sum:”后面的部分字符串:这就意味着这个部分字符串的第一个字符是一个空格。
软件包列表解析完成后,通过HTTP下载软件包。
接下来会进行几个验证步骤。
下载的软件包大小必须等于软件包列表中的指定大小:
如果指定了这个软件包的SHA256哈希值,该哈希值也必须匹配:
但是因为
checksum_hex2bin
没有办法对SHA256sum
字段进行解码,所以1418行之后的代码被直接跳过。I5 使用不安全或过时的组件
示例:Dnsmasq、pppd、Linux Kernel、BusyBox
查看对应的安全组件版本
- Dnsmasq
- pppd
- Linux Kernel
- busybox
漏洞检测
- Dnsmasq(2.73) 缓冲区溢出漏洞
- pppd(2.4.7) CVE-2020-8597~ppp 2.4.2 到 2.4.8 中 pppd 中的 eap.c 在 eap_request 和 eap_response 函数中存在 rhostname 缓冲区溢出
- Linux kernel(4.14.95) CVE-2018-7566、CVE-2018-9858、CVE-2018-9865等漏洞
- Busybox(1.28.4) CVE-2018-1000500 wget缺少 SSL 证书验证漏洞,该漏洞可导致任意代码执行
相应的漏洞信息和对应日志如下:
- Dnsmasq 2.73版本的缓冲区漏洞,也称为CVE-2017-14491漏洞,是一种远程代码执行漏洞,可能允许攻击者利用恶意DNS响应包执行任意代码,参考链接:https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-14491
- pppd 2.4.7版本的CVE-2020-8597漏洞是一种缓冲区漏洞,可能允许未经授权的用户在特定条件下通过发送恶意的LCP配置数据包触发拒绝服务攻击或执行任意代码,参考链接:https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-8597
- CVE-2018-7566、CVE-2018-9858、CVE-2018-9865等漏洞都涉及到JasPer图像库中的安全问题,以下是一些关于这些漏洞的详细信息和参考链接:
- Busybox是一个集成了Unix工具的小型嵌入式系统。其某些版本存在一个远程执行代码漏洞,即CVE-2018-1000500,该漏洞可能会导致攻击者在没有任何身份验证的情况下执行任意命令。以下是有关此漏洞和修复的参考链接:https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-1000500
I6 隐私保护不足
6.1 网络流量隐私
网路信息监控和窃取 -- 劫持流量,路由器安装tcpdump
通过Wireshark抓包对应端口的信息:
6.2 数据库隐私
查看本地有一个sqlite数据库并没有对该数据库文件进行加密(sensordata.db)
可以看到没有加密的数据库中包括用户的姓名、邮箱、出生年月、访问时间等多个敏感信息,十分不安全。
I7 不安全的数据传输和存储
通过查看IotGoat web的管理界面可以看到整个管理系统并没有进行身份权限的设置,任何绕过前端登录页面进入到管理后台,即可查看到全部的信息
这是一个安全漏洞,说明生态系统中存在敏感数据没有得到适当的加密和访问控制保护。这可能会导致潜在的数据泄露或滥用,对系统和用户造成重大风险。
同时查看
/cgi-bin/luci/admin/network/wireless/wl0.network1
能够看到启用了不正确的加密配置为了解决这个问题,需要采取以下措施:
- 加密敏感数据:一旦识别了敏感数据,需要对其进行加密以保护其机密性。加密算法需要选择足够强大的加密方式,例如AES加密算法。
- 实施访问控制:除了加密数据外,需要确保只有授权用户能够访问敏感数据。这可以通过实施适当的访问控制措施来实现,比如基于角色的访问控制、多因素身份验证等等。
l8 Lack of Device Management
未启用系统日志功能
登入系统管理界面发现无法查看系统日志(System Log)
未启用系统监控和审计功能
显示无日志文件
同时系统也无法使用查看系统命令logread以及系统日志进程(syslogd,logd)
I9 Insecure Default Settings
Many included in IoTGoat such as missing secure headers to prevent framing as well as CSRF protections on sensitive requests.
浏览器进去web管理界面,查看系统当前状态
查看网络请求,发现客户端会定时发送get_status请求
此时请求头的Referer:字段为https://192.168.114.129/cgi-bin/luci/admin/status/overview
使用浏览器插件Referer Control将请求的请求头Referer字段block掉
此时请求中没有Referer字段,但是请求仍然成功
由此可知系统存在CSRF漏洞
I10 Lack of Physical Hardening
物理硬化是指通过物理手段来保护设备和系统的安全性。IoTGoat是一个虚拟的IoT环境,它并不是一个真正的物理设备,所以其缺乏物理硬化措施,无法提供额外的保护措施来应对潜在的安全威胁。因此,在生产环境中使用具有物理硬化措施的IoT设备和系统是非常必要的.
📘参考文档
- 作者:百川🌊
- 链接:https://www.baichuanweb.cn/article/example-59
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。