独角兽暑期训练营 | 某网红打印机安全分析(上)

阅读量    97090 |

分享到: QQ空间 新浪微博 微信 QQ facebook twitter

 

该课题由独角兽暑期训练营第二届学员张熙宸完成,课题完成后, 等待厂商修复相关漏洞,到现在才发布。

360独角兽安全团队每年暑假都会面向在校学生举办一次暑期训练营,申请者投递简历并提交自己想做的课题介绍后,若入选,会在360技术专家的指导下完成课题。

本系列文章会发布第二届训练营6位学员在训练营中的成果。文章相关代码后续会在训练营github代码仓库发布 。

 

前言

假期研究了一款智能打印机,后来某厂送来了一系列的待检测设备,惊讶的发现,和我研究的打印机工作机制如此类似。因此我觉得这个打印机就有了一定的代表性。写了这篇文章,总结一下IOT的一些攻击思路。研究期间,我的同事、朋友和导师给予了我很大帮助,这篇研究总结属于大家共同成果。

了解工作机制

研究对象是咕咕打印机第二代,在阅读下面内容之前,建议先在网上找一些使用教程了解一下。他的长相如下:

他的工作机制如下:

本地模式

单刀双掷开关拨到本地模式的时候,打印机这时自己会打印出来一个自己发出的热点的名称和密码。密码很简单:1234567890,应该是都写死在固件里的。连接热点是时候,允许多台设备连接,但是在我电脑连入热点之后,却抓不到他的包,不管是wireshark还是burp里都是。有兴趣的可以尝试无线网卡抓一下,当时我没有试。这种多设备连接极容易造成打印内容被窃取。

API模式

官方给了一个API的调用文档,通过构造固定格式的URL发送到服务器来控制打印机。这个web接口请求服务器打印的接口和APP请求的接口不一样。

云端模式

手机APP向服务器发送请求,服务器再发给打印机控制打印。APP在线绑定设备详情网上有很多。第一次配置打印机进行联网的过程中会产生一个广播的WiFi,这个WiFi是没有密码的,与本地模式的WiFi不一样。大概是起引导打印机连入家庭互联网的作用。APP和服务器的通信好说,那服务器怎么和打印机对接呢?使用时我发现手机发送请求,若设备没供电,当再次上电就会全部打出。因此猜测是固件里写了上电扫描之类的,开机就搜索服务器网络,扫到之后就连上,之前积压的也就打印了。此外,官方还有一个网页版APP。这个网页版的APP的接口和手机APP的接口也不一样(这个有大用处)

信息收集

硬件层面

主控是Marvell88MW300,整合Cortex-M4 MCU与Wi-Fi于单一芯片

Flash芯片是MX25L6433F

蓝牙芯片是CC2541,但在G2款中完全没有用到该芯片

固件提取思路:

人民币玩家:用烧录器(建议买RT809f ),通过上位机一键读取。不想把芯片焊下来可以用银引脚探针。要搭配烧录座。可以把芯片焊下来。可以把芯片焊下来。把芯片焊下来的话,需要搭配烧录座。建议最好焊下来,用探针的话,其他电路会造成干扰(300元左右)

普通玩家:买一块最小系统板搭配烧录座。查看需要提取的flash芯片的手册中,存储的起始地址,然后写一个例程,让主控芯片把flash下这串数据全部读取下来。(几十元左右)

填坑:

像这类的单片机程序并不像路由器固件那样的文件系统可以通过binwalk直接解压出来,而是需要通过ida之类平台的对单片机的汇编指令来反推出原本的程序逻辑,并且可能需要导入一些支持该框架的脚本。如果是默认或者错选框架的话,会导致无法读取。出现全是db这样的情况。

由于我不是二进制选手,所以我对固件的探索仅到成功提取就截止了。

web层面

抓包:得到发送地址、分析发送内容、寻找注入点、cookies利用等

抓包过程中发现了服务器ip,发现一个明文传输的用户名和密码(这个在后期的收集中经常出现),是个SOAP协议,但是构造注入并未成功。经过跟官方的交流,得知这webservice通过和客户端进行认证的,但是泄露了也不会造成很大危害,因为他进行了二次加密。这或许也印证了我为什么构造注入会不成功。

扫描:扫IP、扫二级域名、扫目录、扫端口。扫到的越多,收集到的信息越多,可能暴露的漏洞也就越多。可能存在源码泄露、上传漏洞、库未授权访问、xss、csrf、ssrf等诸多常见问题。

审代码:分析是否存在身份未校验、越权等漏洞。对于加密传输信息,是否能找到加解密方式。是否存在反序列化、是否存在不合理的处理机制,造成畸形数据注入导致系统崩溃。

测试中发现网页版APP网站http://w.memobird.cn/cn/w/login.aspx

Web API打印官方手册  open.memobird.cn/upload/webapi.pdf

咕咕机官方API源码 https://github.com/memobird/gugu-php

Webservice登录网址(用APP账号登录,但是选项都没有权限):http://139.217.205.76/Login.aspx

发现二级域名扫到一个web接口源码 http://im.memobird.cn/wse/wsesmart.asmx

发现ip开放了80、3389、11211等端口,但是都没有找到突破点。

发现源码泄露,这个config泄露了APP发包时加解密的算法、私钥。

上传目录未找到漏洞

APP层面

先在APP漏洞扫描平台

https://security.tencent.com/index.php/blog/msg/109

上扫描APP中危险函数或配置。

然后尝试脱壳:安装安卓环境:可以在夜神模拟器上按xpoesd,也可以去下Android Studio,再下个sdk,搭建脱壳机,目前市场上很多加固APP都可以被脱。

找“摘要”:AndroidManifest.xml中包含了APP的配置、包名、入口。从这里可以对整个APP框架大概了解,其中可以发现adb backup等风险配置。

找“函数”:手机APP的包和APP源码更配哦。想找加解密或者WiFi配置,蓝牙配置等的源码,搜索相关函数。在APP反编译的代码中找到了写在里面的这个用户名密码和APP加密发送数据的私钥

对于二次打包:二次打包对新手较难,主要是签名认证难以绕过或仿制。未经认证的app在安装后无法运行。根据反汇编的代码,高仿原应用程序难度也较大。直接复制粘贴反汇编代码,重新打包,会有很多错误。而且新包名若与原包相同,是不能被放到应用市场上的。

攻击思路整理并实现攻击

传输内容嗅探

不管是本地模式还是云端模式,可做中间人攻击来截获打印内容。这里我是用手机转代理到电脑上,拦截了数据包。发现传输的时间和传输的内容都以base64方式进行编码,并未进行复杂的加密。

左图是app中的预览效果。右图是网站中解码的效果,图片还原注意加上头

如何控制打印机

批量控制打印机

漏洞成因:

1.AK泄露导致越权:在官方公开的API调用实例当中,泄露一可用AK。原本进行API打印需要根据流程申请AK,有效AK泄露导致任何人都可以在未申请的情况下,成为了开发者,拥有网上打印权限.。

下图是官方API给的打印所需构造的URL及其中包含的参数:

这里解释一下各个参数的含义:

memobirdID是设备编号,双击咕咕机时会自动打印出来

useridEntifying在官方开发群中说的是为咕咕号,是在APP中“我的”中查看到的6位编号

userid是根据APP里面注册之后,就会分配一个固定的userid。因为有些用户注册了,但是没有买设备,所以会造成一些userid并没有对应的设备编号,也会存在一个userid对应多个设备编号的情况。

所以:AK(形同虚设)+时间(形同虚设)+memobirdID  + useridEntifying àuserid

2.服务器校验机制不完善:官方在要求绑定的时候,输入的useridEntifying需为咕咕号,文档中却说用户自定义。在官方公开的API源码(官方放在GitHub了:https://github.com/memobird/gugu-php)当中分析却是,useridentifying未做任何处理,相当于架空该参数,在有设备编号的情况下直接返回userid

所以:AK(形同虚设)+ 时间(形同虚设)+memobirdID →   userid

因为:memobirdID(16字节)+userid(1-6字节不等)→  打印

    memobirdID  →  userid

考虑:爆破memobirdID  →    得到userid

    memobirdID + userid →   打印,但memobirdID太长,爆破困难,并且猜测userid可能是递增,可能是统计用户量的值。

尝试:memobirdID  ←   userid

    爆破userid →   得到 memobirdID

    memobirdID + userid →   打印

3.加解密方式泄露:

在APP网页版中,点击打印

我们抓到了一个与userid有关,能返回smartguid( 值=memobirdID )的包

但是不管是发送还是响应,都是密文。我们要是想爆破简短的userid,就需要懂得他的加密方式,发送我们爆破,加密后的userid,他才会返回给我们smartguid。

这时我们之前扫到的那个config就有用了。这里面是加密算法

或者在APP中也可发现蛛丝马迹

加解密分析:

因为:GetSmartCoreByUserID,返回了加密的Smartguid

猜测:parameter应该是加密的userid。

验证:抓到的包中标黄的目录文件是之前泄露的源码,这里面有request发出前的加解密方式,大意是利用时间戳和私钥进行DES加解密,而且时间戳只精确到秒的十位,个位不参与。在github上找到一个别人写的py脚本

解密验证了猜想。

所以:userid  → 加密的Smartguid

尝试:加密的Smartguid →  明文Smartguid

因为:userid(明)→ ← userid(密)

猜测: Smartguid (明)→ ← Smartguid (密)

尝试:用与userid相同的解密方式,解密Smartguid,发现失败。而且respond的时间戳和加密不是一个系统时段上的,估计算法可能也不一样了 。

4.打印所需参数可逆推

在点击查看已绑定的咕咕机的详情的时候

抓到这样一个能返回smartguid的明文的包!就是我们期待已久的:加密的Smartguid à明文Smartguid

这是两个危害比较严重的逆推:

明文和密文可以逆推

userid和smartguid逆推

这样导致所需打印参数通过爆破全部能获取

漏洞利用:根据导师写的脚本(附在github里),可在网络中爬到众多打印机,进而控制他们

钓鱼控制打印机

安卓API 8以上,备份设置默认开启。在开发者未经处理的情况下,会导致用户名和密码直接被备份。当备份到其他设备上时,该设备可直接登录被备份人的身份。

当前主流APP认识到此设置风险,纷纷将备份数据设置为需要重新登录才可以恢复。但众多小众APP并未意识到,导致隐私严重泄露

漏洞利用:

利用思路:在网上找到了一个脚本可以在电脑上批量检测手机中开了allowbackup的APP并批量备份。https://sobug.com/article/detail/16

预计一部手机中三分之一以上的APP可能会被波及。导致此手机中大量账号及其他敏感信息泄露。

尝试:我们学校的APP存在此配置问题,会导致学生身份证,学号等泄露。亦可以尝试一些租房APP,可能会有更多泄露。下图是咕咕机APP中备份文件中暴露的用户名和密码。

蓝牙控制打印机

此漏洞涉及型号为GT1,为纯蓝牙通信模式。以下研究全部属于我导师:

研究目标

上面有对二代的打印机进行分析,发现旗下还有一款三代用蓝牙控制的打印机,与二代不通的是三代是无法进行远程打印的,只能通过手机的蓝牙和打印机链接,打印机无法自己链接服务器,但是可以通过云端接口将打印的数据传给手机,然后手机与打印机进行蓝牙链接之后打印机自动打印纸条,我们下篇会对对这款打印机进行安全分析。

分享到: QQ空间 新浪微博 微信 QQ facebook twitter
|推荐阅读
|发表评论
|评论列表
加载更多