hacktricks/network-services-pentesting/11211-memcache/README.md

12 KiB
Raw Blame History

11211 - Pentesting Memcache

{% hint style="success" %} 学习与实践 AWS 黑客技术:HackTricks 培训 AWS 红队专家 (ARTE)
学习与实践 GCP 黑客技术:HackTricks 培训 GCP 红队专家 (GRTE)

支持 HackTricks
{% endhint %}

协议信息

来自 维基百科:

Memcached发音mem-cashed, mem-cash-dee是一个通用的分布式 内存缓存 系统。它通常用于通过在 RAM 中缓存数据和对象来加速动态数据库驱动的网站,以减少读取外部数据源(如数据库或 API的次数。

尽管 Memcached 支持 SASL但大多数实例是 未经过身份验证 的。

默认端口: 11211

PORT      STATE SERVICE
11211/tcp open  unknown

Enumeration

Manual

要提取 memcache 实例中保存的所有信息,您需要:

  1. 找到 slabs 中的 活动项
  2. 获取之前检测到的 slabs 的 键名
  3. 通过 获取键名 来提取 保存的数据

请记住,这项服务只是一个 缓存,因此 数据可能会出现和消失

echo "version" | nc -vn -w 1 <IP> 11211      #Get version
echo "stats" | nc -vn -w 1 <IP> 11211        #Get status
echo "stats slabs" | nc -vn -w 1 <IP> 11211  #Get slabs
echo "stats items" | nc -vn -w 1 <IP> 11211  #Get items of slabs with info
echo "stats cachedump <number> 0" | nc -vn -w 1 <IP> 11211  #Get key names (the 0 is for unlimited output size)
echo "get <item_name>" | nc -vn -w 1 <IP> 11211  #Get saved info

#This php will just dump the keys, you need to use "get <item_name> later"
sudo apt-get install php-memcached
php -r '$c = new Memcached(); $c->addServer("localhost", 11211); var_dump( $c->getAllKeys() );'

手动2

sudo apt install libmemcached-tools
memcstat --servers=127.0.0.1 #Get stats
memcdump --servers=127.0.0.1 #Get all items
memccat  --servers=127.0.0.1 <item1> <item2> <item3> #Get info inside the item(s)

自动

nmap -n -sV --script memcached-info -p 11211 <IP>   #Just gather info
msf > use auxiliary/gather/memcached_extractor      #Extracts saved data
msf > use auxiliary/scanner/memcached/memcached_amp #Check is UDP DDoS amplification attack is possible

Dumping Memcache Keys

在memcache领域一个通过slab帮助组织数据的协议存在特定的命令用于检查存储的数据尽管有显著的限制

  1. 只能按slab类转储键将相似内容大小的键分组。
  2. 每个slab类的限制为一页相当于1MB的数据。
  3. 此功能是非官方的,可能随时被取消,如在社区论坛中讨论的那样。

只能从潜在的千兆字节数据中转储1MB的限制尤其显著。然而这一功能仍然可以根据特定需求提供对键使用模式的洞察。对于那些对机制不太感兴趣的人可以访问工具部分查看全面转储的实用工具。或者下面概述了使用telnet与memcached设置进行直接交互的过程。

How it Works

Memcache的内存组织至关重要。使用"-vv"选项启动memcache可以显示它生成的slab类如下所示

$ memcached -vv
slab class   1: chunk size        96 perslab   10922
[...]

要显示所有当前存在的 slabs可以使用以下命令

stats slabs

添加单个键到 memcached 1.4.13 演示了如何填充和管理 slab 类。例如:

set mykey 0 60 1
1
STORED

执行“stats slabs”命令后添加键会产生关于 slab 利用率的详细统计信息:

stats slabs
[...]

此输出显示了活动的 slab 类型、使用的块和操作统计信息,提供了有关读写操作效率的见解。

另一个有用的命令 "stats items" 提供了关于驱逐、内存限制和项目生命周期的数据:

stats items
[...]

这些统计数据允许对应用程序缓存行为进行有根据的假设,包括不同内容大小的缓存效率、内存分配和缓存大对象的能力。

转储键

对于1.4.31之前的版本,键是通过 slab 类转储的,使用:

stats cachedump <slab class> <number of items to dump>

例如,要转储类 #1 中的一个键:

stats cachedump 1 1000
ITEM mykey [1 b; 1350677968 s]
END

此方法遍历 slab 类,提取并可选地转储键值。

转储 MEMCACHE 键 (VER 1.4.31+)

在 memcache 版本 1.4.31 及以上,引入了一种新的、更安全的方法来在生产环境中转储键,利用非阻塞模式,如 发布说明 中详细说明。这种方法生成大量输出,因此建议使用 'nc' 命令以提高效率。示例包括:

echo 'lru_crawler metadump all' | nc 127.0.0.1 11211 | head -1
echo 'lru_crawler metadump all' | nc 127.0.0.1 11211 | grep ee6ba58566e234ccbbce13f9a24f9a28

DUMPING TOOLS

Table from here.

Programming Languages Tools Functionality
PHP simple script 打印键名。
Perl simple script 打印键和值
Ruby simple script 打印键名。
Perl memdump CPAN模块中的工具 Memcached-libmemcached ached/)
PHP memcache.php Memcache监控GUI也允许转储键
libmemcached peep 会冻结你的memcached进程!!! 使用时请小心。如果仍然使用它你可以绕过1MB限制真正转储所有键。

Troubleshooting

1MB Data Limit

请注意在memcached 1.4之前您无法存储大于1MB的对象因为默认的最大块大小。

Never Set a Timeout > 30 Days!

如果您尝试“设置”或“添加”一个超时大于允许的最大值的键您可能不会得到预期的结果因为memcached会将该值视为Unix时间戳。如果时间戳在过去它将完全不执行任何操作。您的命令将静默失败。

因此如果您想使用最大生命周期请指定2592000。示例

set my_key 0 2592000 1
1

消失的键在溢出时

尽管文档提到使用“incr”导致64位溢出值的情况会使值消失但需要使用“add”/“set”重新创建。

复制

memcached本身不支持复制。如果你真的需要它你需要使用第三方解决方案

命令速查表

{% content-ref url="memcache-commands.md" %} memcache-commands.md {% endcontent-ref %}

Shodan

  • port:11211 "STAT pid"
  • "STAT pid"

参考文献

{% hint style="success" %} 学习与实践AWS黑客技术HackTricks培训AWS红队专家ARTE
学习与实践GCP黑客技术HackTricks培训GCP红队专家GRTE

支持HackTricks
{% endhint %}