欢迎进入UG环球官网(环球UG)!

usdt交易网(www.payusdt.vip):draytek破绽剖析

admin4周前101

USDT线下交易

U交所(www.9cx.net)是使用TRC-20协议的Usdt官方交易所,开放USDT帐号注册、usdt小额交易、usdt线下现金交易、usdt实名不实名交易、usdt场外担保交易的平台。免费提供场外usdt承兑、低价usdt渠道、Usdt提币免手续费、Usdt交易免手续费。U交所开放usdt otc API接口、支付回调等接口。

剖析复现一下几个draytek的破绽

1.CVE-2020-8515
破绽形貌如下:

DrayTek Vigor2960 1.3.1_Beta, Vigor3900 1.4.4_Beta, and Vigor300B 1.3.3_Beta, 1.4.2.1_Beta, and 1.4.4_Beta devices allow remote code execution as root (without authentication) via shell metacharacters to the cgi-bin/mainfunction.cgi URI. This issue has been fixed in Vigor3900/2960/300B v1.5.1.

我这里选取Vigor2960 1.5.0版本的固件和1.5.1版本的固件作为对比。
首先提取固件:

固件是ubi类型的,需要使用ubi_reader这个工具举行提取,提取出来之后就是一个完整的文件系统。

lighttpd是一个轻量级的web服务器,一样平常会有cgi文件作为支持,在./etc/lighttpd/lighttpd.conf中可以看到服务器的各个设置项,在剖析固件之前可以先查看一下服务器的设置文件,这样有助于我们确定剖析目的。
凭证破绽通告,问题泛起在cgi-bin目录下的mainfunction.cgi程序。
那么我们就来剖析这个文件,IDA打开,看到main函数:

在33行中获取到PATH_INFO这个环境变量,这个环境变量示意紧接在CGI程序名之后的其他路径信息,它经常作为CGI程序的参数泛起。好比:http://192.168.0.1:80/cgi-bin/mainfunction.cgi/webrestore,
那么PATH_INFO=/webrestore.
一直看到最下面:

除了通过PATH_INFO来确定要接见的路径,main函数还通过action参数来确定要执行的动作,跟进sub_B44C函数中
在0x4240c地址处有一张函数表:

遍历函数表名,而且和用户传入的action的值举行对照来确定要执行的函数。
main函数的逻辑也许理清晰了,接下来最先剖析破绽。
破绽点在登录时的keyPath参数中,通过搜索字符串定位到函数,而且这个函数位于上面的函数表中,函数名为login:

这也是为什么这个破绽能够导致未认证的下令注入,由于是发生在登录历程中的下令注入。


首先是获取keypath的值,然后举行对这个值举行check,check函数如下:

过滤了常用的`;|>$(
空格等下令拼接字符,看起来过滤的很严酷,然则问题不大,依然可以绕过
在unix上可以通过如下字符来执行多条下令:

%0a
%0d 
;
&
|
$(shell_command)
`shell_command`
{shell_command,}

;&|被过滤了,可以思量使用%0a来绕过,而且$(的检测也纰谬,这里是先检测当前字符是否为$,而且下一个字符得为(才会发生替换,目的是为了检测$(shellcommand)这种类型的下令执行,但并没有过滤单独的$,这样子的话空格就可以使用${IFS}来绕过。
check之后,通过snprintf函数将路径拼接在一起,类似于这样:

/tmp/rsa/private_key_keypath

后面接着再使用一个snprintf函数来将下令拼接:

openssl rsautl -inkey '/tmp/rsa/private_key_keypath' -decrypt -in /tmp/rsa/binary_login

之后将这条下令作为参数转达给run_command函数(这里我自己重名了函数),run_command如下:

使用popen函数执行这条下令,由此便造成了未授权的下令执行。
剖析完原理,来现实操作一下,以vigor2960为例:

随便输入用户名和密码,然后抓包:

可以看到以POST方式接见/cgi-bin/mainfunction.cgi,传入的action=login,要执行的动作为login,根据上面剖析的,我们修改keypatch的值为:

执行效果如下:

乐成地执行了ls。
再换一个需要空格的下令:

执行效果如下:

注重,keypatch的值前面加上'的作用是为了闭合下令中的单引号,由于在单引号笼罩中的下令是不会执行的。
现实上若是固件版本小于1.4.2.1,在rtick参数中也存在下令注入,这里使用1.4.1版本的固件来说明。
照样在login函数中:

这里会取rtick作为时间戳来天生验证码。
查找rtick或者formcaptcha这两个字符串的交织引用可以定位到验证码的天生函数:


可以看到这个函数内里直接将rtick的值作为验证码名,然后挪用system函数执行,因此只需要修改rtick就可以杀青未认证下令执行。
现实操作这一块就跳过了,感兴趣的可以自己实验。
下面来和1.5.1的版本举行对照,直接定位到login函数:

除了有过滤函数另有一个判断,判断字符是否为十六进制字符,而且check函数也完善了:

再看到rtick那里:

将rtick的值限制在数字之内防止下令注入。

2.CVE-2020-15415
破绽形貌如下:

On DrayTek Vigor3900, Vigor2960, and Vigor300B devices before 1.5.1, cgi-bin/mainfunction.cgi/cvmcfgupload allows remote command execution via shell metacharacters in a filename when the text/x-python-script content type is used, a different issue than CVE-2020-14472.

在1.5.1版本下,当接见cgi-bin/mainfunction.cgi/cvmcfgupload这个路径时,若是content type为text/x-python-script,则在filename中存在下令注入。
知道了破绽所在,直接定位已往:

看路径名预测这个是一个用来上传文件的页面。
getenv("QUERY_STRING"),若是服务器与CGI程序信息的转达方式是GET,这个环境变量的值纵然所转达的信息。这个信息经跟在CGI程序名的后面,两者中央用一个问号'?'脱离。
首先获取QUERY_STRING的值,然后判断是否存在session=字符串,若是不存在的话就进入到sub_13450函数中,跟进去看看:

看到了一个system的执行点,但该怎么行使,破绽通告中的filename并未在这里泛起,泛起filename的函数又和/cvmcfgupload路径纰谬应。
连系已有POC继续剖析:

POST /cgi-bin/mainfunction.cgi/cvmcfgupload?1=2 HTTP/1.1
Host: xxx.xxx.xxx.xxx:xxxx
Content-Length: 174
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh,en;q=0.9,zh-CN;q=0.8,la;q=0.7
Connection: close

------WebKitFormBoundary
Content-Disposition: form-data; name="abc"; filename="t';id;echo '1_"
Content-Type: text/x-python-script



------WebKitFormBoundary--

/cgi-bin/mainfunction.cgi/cvmcfgupload?1=2
使得getenv("QUERY_STRING")能够获取到值,顺遂进入到sub_13450函数;接着看到Content-Type=multipart/form-data; boundary=----WebKitFormBoundary,以及body部门的Content-Disposition等属性,这几个需要说明一下。
这篇文章中先容了multipart/form-data,在往服务器发送表单数据之前需要对数据举行编码,multipart/form-data的编码规则为不做编码,发送二进制数据。对于multipart/form-data的编码规则有以下规范特征:1.必须以POST方式发送数据;2.Content-Type花样为multipart/form-data; boundary=${boundary}。其中的boundary是长度为16的随机base64字符,浏览器会自动确立,类似下面这样:

,

Usdt第三方支付接口

菜宝钱包(www.caibao.it)是使用TRC-20协议的Usdt第三方支付平台,Usdt收款平台、Usdt自动充提平台、usdt跑分平台。免费提供入金通道、Usdt钱包支付接口、Usdt自动充值接口、Usdt无需实名寄售回收。菜宝Usdt钱包一键生成Usdt钱包、一键调用API接口、一键无实名出售Usdt。

,
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary222BPd3etU0TLTOv

不外在这个破绽行使中,WebKitFormBoundary是我们手动添加的,自然也没需要添加后面的boundary。
然后,这个boundary=----WebKitFormBoundary222BPd3etU0TLTOv
作为数据的起始符、脱离符,终结符号符相比于起始符和脱离符多了--。
数据内容主要包罗:Content-Disposition、Content-Type、数据内容等;其中数据内容前面有\n\r符号的空行;Content-Disposition是必选项,其它都是可选项;Content-Disposition 包罗了 type 和 一个名字为 name 的 parameter,type 是 form-data,name 参数的值则为表单控件(username)的名字,若是是文件,那么另有一个 filename 参数,值就是文件名。
领会了这些前置知识后再看POC就明了破绽通告中的filename在哪了,就是我们上传的文件名。
我们看到文件名:

filename="t';id;echo '1_"

双引号之内的就是文件名,t';id;echo '1_,熟悉的单引号,说明晰filename会被写到''之中,注重到filename最后另有一个_,经测试之后,发现去掉_的话下令就无法执行乐成,说明需要_来起一个指导作用。
凭证以上剖析,最终确定了破绽的发生点在上方所给截图的system挪用中,接下来继续剖析sub_13450函数
先看三个函数:

NAME
cgiGetFiles - Returns a list of CGI file variables
char **cgiGetFiles (s_cgi *parms);

DESCRIPTION
This routine returns a NULL terminated array of names of CGI file variables that are available.

RETURN VALUE
On success a NULL terminated array of strings is returned. The last element is set to NULL. If an error occurred or if no files variables are available NULL is returned.

cgiGetFiles函数返回值为一个数组指针,最后一个元素会被设置为NULL
NAME
cgiGetFile - Return information of a CGI file variable
s_file *cgiGetFile (s_cgi *parms, const char *name);

DESCRIPTION
This routine returns a pointer to a datastructure associated with the value of a CGI file variable. The pointer must not be freed.
The s_file structure is declared as follows:
typedef struct file_s {
    char   *name,
           *type,
           *filename,
           *tmpfile;
} s_file;

cgiGetFile函数返回值为s_file类型的指针
NAME
cgiEscape - HTML escape certain characters in a string
char *cgiEscape (char *string);

DESCRIPTION
This function returns a pointer to a sanitised string. It converts <, & and > into HTML entities so that the result can be displayed without any danger of cross-site scripting in a browser. The result may be passed to free(3) after use. This routine is meant to be called before any user provided strings are returned to the browser.

RETURN VALUE
cgiEscape() returns a pointer to the sanitised string or NULL in case of error.

cgiEscape函数就是防止xss攻击,将<, &和>转换成html实体,返回一个字符串指针

首先先用cgiGetFiles获得一个文件数组指针,然后进入一个循环,使用cgiGetFile获取s_file类型的指针


接着使用cgiEscape将filename举行html转义(filename位于sfile结构体中的第三个,在32位机械下,char*类型的长度为4字节,因此+8就是filename的位置),再从中寻找\,若是可以找到,就进入if代码块,之后就是将html转义之后的filename和/data/%s/%s/拼接,最后再和mkdir -p下令拼接,以是最终形成的下令就是如下所示:

mkdir -p /data/cvm/files/'<filename>'

破绽剖析完毕,来现实测试一下:

另外,在测试中发现传输数据的content-type不是需要的:

这个破绽也是一个未认证的下令执行。
最后我们再看到1.5.1.2版本的固件是若何修复这个破绽的:

简朴粗暴,直接过滤filename的值。

3.CVE-2020-19664
破绽通告:

DrayTek Vigor2960 1.5.1 allows remote command execution via shell metacharacters in a toLogin2FA action to mainfunction.cgi.

凭证形貌,破绽发生在toLogin2FA 动作中,通过字符串定位到对应函数:

首先获取环境变量,HTTP_COOKIE、REMOTE_ADDR、HTTP_HOST,接着以HTTP_COOKIE作为参数传入sub_12864函数,跟进查看:

若是参数1即HTTP_COOKIE的值存在的话就进入if代码块,若是我们是未认证用户,那么HTTP_COOKIE自然没有,直接返回-10。
然后将sub_12864函数的返回值,也就是-10拷贝到dest中,接着将dest和HTTP_HOST作为参数一并传入sub_273B0函数,跟进查看:

将a2,a3和/ *** in/auth_check.sh Interface拼接,其中a2为-10,a3为HTTP_HOST的值,然后将拼接完后的下令传入run_command函数,实现下令执行。

但遗憾的是根据这个思绪我无法实现下令执行,可能是思绪纰谬。为了弄清晰到底是那里出了问题,我选择对比固件查看差异点。
现在最新固件版本为1.5.1.2,以是我使用1.5.1.1和1.5.1.2的固件举行对比,查看那里举行了修复
由于bindiff不支持高版本IDA,以是我使用diaphora这个IDA插件来举行对照,首先用IDA打开1.5.1.1版本的manfunction.cgi
在IDA中选择File->Script file,然后选择diaphora.py,会弹出一个框:

然后点击确定,会天生一个sqlite数据库文件
再用IDA打开1.5.1.2版本的manfunction.cgi,打开diaphora.py

在diff against那里选择1.5.1.1版本的sqlite数据文件
最终会天生这样的页面:

Ratio示意两个函数的相似度,我们从中找到toLogin2FA 动作要执行的函数:

diff pseudo-code可以查看伪代码对比:

对比很清晰,左边的是1.5.1.2的伪代码,右边的是1.5.1.1的,新版本对HTTP_COOKIE处置函数举行了修改:

若是HTTP_COOKIE的值为空,那么经由处置后传入run_command的第二个则为NULL。
但我依然不清晰该若何行使该破绽,很惋惜。
凭证这个GitHub客栈形貌的,我的大致偏向应该是没问题的,若是有知道若何行使的师傅希望能见告,这里主要是说明一下我的一个思绪。

4.CVE-2020-14993
破绽通告

A stack-based buffer overflow on DrayTek Vigor2960, Vigor3900, and Vigor300B devices before 1.5.1.1 allows remote attackers to execute arbitrary code via the formuserphonenumber parameter in an authuser *** s action to mainfunction.cgi.

在1.5.1.1版本中,formuserphonenumber参数存在栈溢出
通过字符串定位到函数:

获取到formuserphonenumber的值,然后直接拷贝到栈上:

确定了v31的巨细之后就可以溢出了,而且经测试之后,vigor2960是没有开启ASLR和NX的,以是可以直接ret2shellcode,动态调试确定下来栈地址之后就能直接行使了。
这个函数在authuser *** s动作中,行使起来对照穷苦,需要认证,可以看看这篇文章,在这里就不举行行使了。

5.总结
draytek实在爆出来的破绽不止这些,不外多数是认证后的,最危险的照样CVE-2020-8515和CVE-2020-15415这两个不需要认证的破绽。
公网上draytek的数目照样很大的,仅仅只是vigor2960就存在两万多条IP。

6.参考链接
https://nosec.org/home/detail/4631.html
https://github.com/CLP-team/Vigor-Commond-Injection
https://blog.netlab.360.com/two-zero-days-are-targeting-draytek-broadband-cpe-devices/
https://baike.baidu.com/item/getenv/935515
https://manpages.debian.org/jessie/cgilib/cgiGetFiles.3.en.html
https://manpages.debian.org/jessie/cgilib/cgiGetFile.3.en.html
https://manpages.debian.org/unstable/cgilib/cgiEscape.3.en.html

上一篇 下一篇

猜你喜欢

网友评论

  • 2021-05-24 00:03:22

    怎么会不喜欢

    • 2021-06-09 20:44:38

      @allbet手机版下载 阿拉善盟网阿拉善盟网是立足于本地的一家全面的服务平台,主要提供新闻服务、民政互动、文旅攻略、信息发布以及各类生活服务,业务辐射到本地生活中的方方面面,这里既有资深的新闻专家带你看新闻,解读新闻,又有最严格专业的信息发布审核系统,保证您的财产安全,您所需要的,我们都有。专门找来的

  • 2021-06-06 00:00:32

    皇冠下载是一个开放皇冠体育代理最新登录线路、皇冠体育会员最新登录线路、皇冠代理APP下载、皇冠会员APP下载、皇冠线路APP下载、皇冠电脑版下载、皇冠手机版的平台。皇冠体育APP上登录线路最新、新2皇冠网址更新最快,皇冠体育APP开放皇冠会员注册、皇冠代理开户等业务。我撂话,会大热大火哦!

随机文章
热门文章
热评文章
热门标签