11211 - Pentesting Memcache
协议信息
来自 维基百科:
Memcached(发音:mem-cashed, mem-cash-dee)是一个通用的分布式 内存缓存 系统。它通常用于通过在 RAM 中缓存数据和对象来加速动态数据库驱动的网站,以减少读取外部数据源(如数据库或 API)的次数。
尽管 Memcached 支持 SASL,但大多数实例是 未经过身份验证 的。
默认端口: 11211
Enumeration
Manual
要提取 memcache 实例中保存的所有信息,您需要:
找到 slabs 中的 活动项
获取之前检测到的 slabs 的 键名
通过 获取键名 来提取 保存的数据
请记住,这项服务只是一个 缓存,因此 数据可能会出现和消失。
手动2
自动
Dumping Memcache Keys
在memcache领域,一个通过slab帮助组织数据的协议,存在特定的命令用于检查存储的数据,尽管有显著的限制:
只能按slab类转储键,将相似内容大小的键分组。
每个slab类的限制为一页,相当于1MB的数据。
此功能是非官方的,可能随时被取消,如在社区论坛中讨论的那样。
只能从潜在的千兆字节数据中转储1MB的限制尤其显著。然而,这一功能仍然可以根据特定需求提供对键使用模式的洞察。对于那些对机制不太感兴趣的人,可以访问工具部分,查看全面转储的实用工具。或者,下面概述了使用telnet与memcached设置进行直接交互的过程。
How it Works
Memcache的内存组织至关重要。使用"-vv"选项启动memcache可以显示它生成的slab类,如下所示:
要显示所有当前存在的 slabs,可以使用以下命令:
添加单个键到 memcached 1.4.13 演示了如何填充和管理 slab 类。例如:
执行“stats slabs”命令后添加键会产生关于 slab 利用率的详细统计信息:
此输出显示了活动的 slab 类型、使用的块和操作统计信息,提供了有关读写操作效率的见解。
另一个有用的命令 "stats items" 提供了关于驱逐、内存限制和项目生命周期的数据:
这些统计数据允许对应用程序缓存行为进行有根据的假设,包括不同内容大小的缓存效率、内存分配和缓存大对象的能力。
转储键
对于1.4.31之前的版本,键是通过 slab 类转储的,使用:
例如,要转储类 #1 中的一个键:
此方法遍历 slab 类,提取并可选地转储键值。
转储 MEMCACHE 键 (VER 1.4.31+)
在 memcache 版本 1.4.31 及以上,引入了一种新的、更安全的方法来在生产环境中转储键,利用非阻塞模式,如 发布说明 中详细说明。这种方法生成大量输出,因此建议使用 'nc' 命令以提高效率。示例包括:
DUMPING TOOLS
Table from here.
Troubleshooting
1MB Data Limit
请注意,在memcached 1.4之前,您无法存储大于1MB的对象,因为默认的最大块大小。
Never Set a Timeout > 30 Days!
如果您尝试“设置”或“添加”一个超时大于允许的最大值的键,您可能不会得到预期的结果,因为memcached会将该值视为Unix时间戳。如果时间戳在过去,它将完全不执行任何操作。您的命令将静默失败。
因此,如果您想使用最大生命周期,请指定2592000。示例:
消失的键在溢出时
尽管文档提到使用“incr”导致64位溢出值的情况会使值消失,但需要使用“add”/“set”重新创建。
复制
memcached本身不支持复制。如果你真的需要它,你需要使用第三方解决方案:
repcached: 多主异步复制(memcached 1.2补丁集)
Couchbase memcached接口: 使用CouchBase作为memcached的替代
yrmcds: 与memcached兼容的主从键值存储
twemproxy(又名nutcracker):支持memcached的代理
命令速查表
Shodan
port:11211 "STAT pid"
"STAT pid"
参考文献
Last updated