12 KiB
11211 - 渗透测试 Memcache
从零开始学习 AWS 黑客技术,成为专家 htARTE(HackTricks AWS 红队专家)!
支持 HackTricks 的其他方式:
- 如果您想看到您的公司在 HackTricks 中做广告或下载 PDF 版的 HackTricks,请查看订阅计划!
- 获取官方 PEASS & HackTricks 商品
- 探索PEASS 家族,我们的独家NFT收藏品
- 加入 💬 Discord 群组 或 电报群组 或在 Twitter 🐦 @carlospolopm** 上关注**我们。
- 通过向 HackTricks 和 HackTricks Cloud github 仓库提交 PR 来分享您的黑客技巧。
协议信息
来自 维基百科:
Memcached(发音:mem-cashed,mem-cash-dee)是一个通用的分布式内存缓存系统。它通常用于通过在 RAM 中缓存数据和对象来加速动态数据库驱动的网站,以减少必须读取外部数据源(如数据库或 API)的次数。
尽管 Memcached 支持 SASL,但大多数实例都是无需身份验证的暴露状态。
默认端口: 11211
PORT STATE SERVICE
11211/tcp open unknown
枚举
手动
要提取存储在 memcache 实例中的所有信息,您需要:
- 找到具有活动项目的slabs
- 获取之前检测到的 slabs 的键名
- 通过获取键名来提取保存的数据
请记住,这项服务只是一个缓存,因此数据可能会出现和消失。
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组织数据的协议,存在特定命令用于检查存储的数据,尽管有明显的限制:
- 只能按slab类别转储密钥,将相似内容大小的密钥分组在一起。
- 每个slab类别只能转储一页数据,相当于1MB的数据。
- 这个功能是非官方的,可能随时停止使用,如社区论坛中所讨论的。
仅能从潜在的几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天的超时!
如果您尝试使用大于允许的最大超时设置“set”或“add”键,则可能不会得到您期望的结果,因为memcached会将该值视为Unix时间戳。此外,如果时间戳在过去,则根本不会执行任何操作。您的命令将悄无声息地失败。
因此,如果要使用最大生存时间,请指定2592000。示例:
set my_key 0 2592000 1
1
溢出时键值消失
尽管文档中提到64位溢出值会导致使用“incr”时值消失,但需要使用“add”/“set”重新创建该值。
复制
memcached本身不支持复制。如果确实需要,您需要使用第三方解决方案:
- repcached: 多主异步复制(memcached 1.2补丁集)
- Couchbase memcached接口: 使用CouchBase作为memcached的替代
- yrmcds: 兼容memcached的主从键值存储
- twemproxy(又名nutcracker):带有memcached支持的代理
命令速查表
{% content-ref url="memcache-commands.md" %} memcache-commands.md {% endcontent-ref %}
Shodan
port:11211 "STAT pid"
"STAT pid"
参考资料
从零开始学习AWS黑客技术,成为专家 htARTE(HackTricks AWS Red Team Expert)!
支持HackTricks的其他方式:
- 如果您想在HackTricks中看到您的公司广告或下载PDF格式的HackTricks,请查看订阅计划!
- 获取官方PEASS & HackTricks周边产品
- 探索PEASS Family,我们的独家NFTs
- 加入 💬 Discord群 或 电报群 或在Twitter 🐦 @carlospolopm 上关注我们。
- 通过向HackTricks和HackTricks Cloud github仓库提交PR来分享您的黑客技巧。