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

12 KiB
Raw Blame History

11211 - 渗透测试 Memcache

从零开始学习 AWS 黑客技术,成为专家 htARTEHackTricks AWS 红队专家)

支持 HackTricks 的其他方式:

协议信息

来自 维基百科

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

尽管 Memcached 支持 SASL但大多数实例都没有身份验证

**默认端口:**11211

PORT      STATE SERVICE
11211/tcp open  unknown

枚举

手动

要提取存储在 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领域一种通过slabs组织数据的协议存在用于检查存储数据的特定命令尽管存在显著的限制

  1. 只能按slab类别转储密钥将相似内容大小的密钥分组在一起。
  2. 每个slab类别只能转储一页数据相当于1MB的数据。
  3. 此功能是非官方的,可能随时停止使用,如社区论坛中所讨论的。

仅能从潜在的几GB数据中转储1MB的限制尤为重要。然而根据具体需求此功能仍可提供有关密钥使用模式的见解。对于那些对机制不太感兴趣的人访问工具部分可发现用于全面转储的实用程序。或者下面概述了使用telnet直接与memcached设置进行交互的过程。

工作原理

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

转储 Memcache 键(版本 1.4.31+

从 slab 类中提取并可选地转储键值的方法。

使用 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

转储工具

表格来自这里

编程语言 工具 功能
PHP 简单脚本 打印键名。
Perl 简单脚本 打印键和值
Ruby 简单脚本 打印键名。
Perl memdump CPAN模块中的工具 Memcached-libmemcached ached/)
PHP memcache.php Memcache监控GUI还允许转储键
libmemcached peep 会冻结您的memcached进程 在生产环境中使用时要小心。尽管如此您可以绕过1MB限制真正转储所有键。

故障排除

1MB 数据限制

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

永远不要设置超过30天的超时

如果您尝试使用超过允许的最大值的超时“设置”或“添加”键则可能不会得到您期望的结果因为memcached会将该值视为Unix时间戳。此外如果时间戳在过去它将什么也不做。您的命令将悄无声息地失败。

因此如果要使用最大生存期请指定2592000。示例

set my_key 0 2592000 1
1

溢出时键值消失

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

复制

memcached本身不支持复制。如果确实需要需要使用第三方解决方案

命令速查表

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

Shodan

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

参考资料

从零开始学习AWS黑客技术成为专家 htARTEHackTricks AWS Red Team Expert

支持HackTricks的其他方式