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

195 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 11211 - 渗透测试 Memcache
<details>
<summary><strong>从零开始学习 AWS 黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS 红队专家)</strong></a><strong></strong></summary>
支持 HackTricks 的其他方式:
* 如果您想看到您的**公司在 HackTricks 中做广告**或**下载 PDF 版的 HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
* 探索[**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFT**](https://opensea.io/collection/the-peass-family)收藏品
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或在 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)** 上关注**我们。
* 通过向 [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。
</details>
## 协议信息
来自 [维基百科](https://en.wikipedia.org/wiki/Memcached)
> **Memcached**发音mem-cashedmem-cash-dee是一个通用的分布式[内存缓存](https://en.wikipedia.org/wiki/Memory\_caching)系统。它通常用于通过在 RAM 中缓存数据和对象来加速动态数据库驱动的网站,以减少必须读取外部数据源(如数据库或 API的次数。
尽管 Memcached 支持 SASL但大多数实例都是**无需身份验证的暴露状态**。
**默认端口:** 11211
```
PORT STATE SERVICE
11211/tcp open unknown
```
## 枚举
### 手动
要提取存储在 memcache 实例中的所有信息,您需要:
1. 找到具有**活动项目**的**slabs**
2. 获取之前检测到的 slabs 的**键名**
3. 通过**获取键名**来**提取保存的数据**
请记住,这项服务只是一个**缓存**,因此**数据可能会出现和消失**。
```bash
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
```bash
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)
```
### 自动化
```bash
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. 这个功能是非官方的,可能随时停止使用,如[社区论坛](https://groups.google.com/forum/?fromgroups=#!topic/memcached/1-T8I-RVGKM)中所讨论的。
仅能从潜在的几GB数据中转储1MB的限制尤为重要。然而根据具体需求这种功能仍然可以提供有关密钥使用模式的见解。对于那些对机制不太感兴趣的人访问[工具部分](https://lzone.de/cheat-sheet/memcached#tools)可以找到用于全面转储的实用程序。或者下面概述了使用telnet直接与memcached设置进行交互的过程。
### **工作原理**
Memcache的内存组织至关重要。使用"-vv"选项启动memcache会显示其生成的slab类别如下所示
```bash
$ memcached -vv
slab class 1: chunk size 96 perslab 10922
[...]
```
要显示所有当前存在的slabs使用以下命令
```bash
stats slabs
```
向memcached 1.4.13添加一个键可说明slab类是如何填充和管理的。例如
```bash
set mykey 0 60 1
1
STORED
```
执行"stats slabs"命令后添加密钥会产生关于slab利用率的详细统计信息
```bash
stats slabs
[...]
```
这个输出显示了活跃的slab类型、已使用的块以及操作统计数据为读取和写入操作的效率提供了见解。
另一个有用的命令是"stats items",它提供了有关驱逐、内存限制和条目生命周期的数据:
```bash
stats items
[...]
```
### **转储密钥**
对于1.4.31版本之前的版本可以通过以下方式按slab类转储密钥
```bash
stats cachedump <slab class> <number of items to dump>
```
例如要在类别1 中转储一个键:
```bash
stats cachedump 1 1000
ITEM mykey [1 b; 1350677968 s]
END
```
### **转储 Memcache 键(版本 1.4.31+**
从 slab 类中提取并可选地转储键值的方法。
使用 memcache 版本 1.4.31 及以上,引入了一种新的更安全的方法,用于在生产环境中转储键,利用非阻塞模式,详细信息请参阅[发布说明](https://github.com/memcached/memcached/wiki/ReleaseNotes1431)。该方法生成大量输出,因此建议使用 'nc' 命令以提高效率。示例包括:
```bash
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
```
### **转储工具**
表格[来自这里](https://lzone.de/blog).
| 编程语言 | 工具 | 功能 | | |
| --------------------- | ---------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------- | ------- |
| PHP | [简单脚本](http://snipt.org/xtP) | 打印键名。 | | |
| Perl | [简单脚本](https://wiki.jasig.org/download/attachments/13572172/memcached-clean.pl?version=1\&modificationDate=1229693957401) | 打印键和值 | | |
| Ruby | [简单脚本](https://gist.github.com/1365005) | 打印键名。 | | |
| Perl | [memdump](https://search.cpan.org/\~dmaki/Memcached-libmemcached-0.4202/src/libmemcached/docs/memdump.pod) | CPAN模块中的工具 | [Memcached-libmemcached](https://search.cpan.org/\~dmaki/Memcached-libmemc) | ached/) |
| PHP | [memcache.php](http://livebookmark.net/journal/2008/05/21/memcachephp-stats-like-apcphp/) | Memcache监控GUI还允许转储键 | | |
| libmemcached | [peep](http://blog.evanweaver.com/2009/04/20/peeping-into-memcached/) | **会冻结您的memcached进程** 在生产环境中使用时要小心。尽管如此您可以绕过1MB限制真正转储**所有**键。 | | |
## 故障排除 <a href="#troubleshooting" id="troubleshooting"></a>
### 1MB 数据限制 <a href="#1mb-data-limit" id="1mb-data-limit"></a>
请注意在memcached 1.4之前由于默认最大slab大小您无法存储大于1MB的对象。
### 永远不要设置超过30天的超时 <a href="#never-set-a-timeout--30-days" id="never-set-a-timeout--30-days"></a>
如果您尝试使用大于允许的最大超时设置“set”或“add”键则可能不会得到您期望的结果因为memcached会将该值视为Unix时间戳。此外如果时间戳在过去则根本不会执行任何操作。您的命令将悄无声息地失败。
因此如果要使用最大生存时间请指定2592000。示例
```
set my_key 0 2592000 1
1
```
### 溢出时键值消失 <a href="#disappearing-keys-on-overflow" id="disappearing-keys-on-overflow"></a>
尽管文档中提到64位溢出值会导致使用“incr”时值消失但需要使用“add”/“set”重新创建该值。
### 复制 <a href="#replication" id="replication"></a>
memcached本身不支持复制。如果确实需要您需要使用第三方解决方案
* [repcached](http://repcached.lab.klab.org/): 多主异步复制memcached 1.2补丁集)
* [Couchbase memcached接口](http://www.couchbase.com/memcached): 使用CouchBase作为memcached的替代
* [yrmcds](https://cybozu.github.io/yrmcds/): 兼容memcached的主从键值存储
* [twemproxy](https://github.com/twitter/twemproxy)又名nutcracker带有memcached支持的代理
### 命令速查表
{% content-ref url="memcache-commands.md" %}
[memcache-commands.md](memcache-commands.md)
{% endcontent-ref %}
### **Shodan**
* `port:11211 "STAT pid"`
* `"STAT pid"`
## 参考资料
* [https://lzone.de/cheat-sheet/memcached](https://lzone.de/cheat-sheet/memcached)
<details>
<summary><strong>从零开始学习AWS黑客技术成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS Red Team Expert</strong></a><strong></strong></summary>
支持HackTricks的其他方式
* 如果您想在HackTricks中看到您的**公司广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
* 探索[**PEASS Family**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或在**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live) 上**关注**我们。
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来**分享您的黑客技巧**。
</details>