# 11211 - Pentesting Memcache
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
* 你在一个**网络安全公司**工作吗?你想在HackTricks中看到你的**公司广告**吗?或者你想获得**PEASS的最新版本或下载HackTricks的PDF**吗?请查看[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)!
* 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
* 获得[**官方PEASS和HackTricks的衣物**](https://peass.creator-spring.com)
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**电报群组**](https://t.me/peass)或**关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
## 协议信息
**Memcached**(发音:mem-cashed,mem-cash-dee)是一个通用的分布式[内存缓存](https://en.wikipedia.org/wiki/Memory\_caching)系统。它经常被用于通过将数据和对象缓存在RAM中来加速动态数据库驱动的网站,以减少读取外部数据源(如数据库或API)的次数。(来自[wikipedia](https://en.wikipedia.org/wiki/Memcached))\
尽管Memcached支持SASL,但大多数实例都**没有身份验证**。
**默认端口:**11211
```
PORT STATE SERVICE
11211/tcp open unknown
```
## 枚举
### 手动
要从memcache实例中提取保存的所有信息,您需要执行以下操作:
1. 找到具有**活动项目**的**slabs**
2. 获取之前检测到的slabs的**键名**
3. 通过**获取键名**来提取**保存的数据**
请记住,此服务只是一个**缓存**,因此**数据可能会出现和消失**。
```bash
echo "version" | nc -vn -w 1 11211 #Get version
echo "stats" | nc -vn -w 1 11211 #Get status
echo "stats slabs" | nc -vn -w 1 11211 #Get slabs
echo "stats items" | nc -vn -w 1 11211 #Get items of slabs with info
echo "stats cachedump 0" | nc -vn -w 1 11211 #Get key names (the 0 is for unlimited output size)
echo "get " | nc -vn -w 1 11211 #Get saved info
#This php will just dump the keys, you need to use "get later"
sudo apt-get install php-memcached
php -r '$c = new Memcached(); $c->addServer("localhost", 11211); var_dump( $c->getAllKeys() );'
```
### 手动2
Memcached是一个高性能的分布式内存对象缓存系统,常用于加速动态Web应用程序。它使用键值对存储数据,并将数据存储在内存中,以提供快速的读取和写入操作。
#### Memcached的安全性问题
尽管Memcached是一个强大的工具,但它也存在一些安全性问题,可能会被黑客利用。以下是一些常见的安全漏洞和攻击技术:
1. 未授权访问:默认情况下,Memcached没有身份验证机制,这意味着任何人都可以访问和修改存储在其中的数据。黑客可以利用这一点来读取、修改或删除敏感数据。
2. 反射放大攻击:Memcached可以被用作反射放大攻击的工具。黑客可以发送一个小的请求,但由于Memcached的特性,它会返回一个大量的数据,从而导致目标服务器的带宽消耗过大,甚至可能导致服务不可用。
3. 缓存投毒:黑客可以通过向Memcached中注入恶意数据来破坏缓存的完整性。这可能导致应用程序返回错误的数据或执行不安全的操作。
#### Memcached的安全加固措施
为了保护Memcached免受黑客攻击,以下是一些安全加固措施:
1. 访问控制:通过配置防火墙或网络访问控制列表(ACL)来限制Memcached的访问。只允许受信任的IP地址访问Memcached服务器。
2. 身份验证和授权:使用身份验证和授权机制来限制对Memcached的访问。可以使用插件或代理服务器来实现这些功能。
3. 定期更新:及时更新Memcached的版本和补丁,以修复已知的安全漏洞。
4. 监控和日志记录:实施监控和日志记录机制,以便及时检测和响应任何异常活动。
5. 安全配置:配置Memcached以最小化安全风险。禁用不必要的功能和命令,并限制内存使用。
6. 安全审计:定期进行安全审计,以评估Memcached的安全性,并采取必要的措施来修复发现的漏洞。
#### 结论
Memcached是一个强大的工具,但在使用时需要注意安全性。通过实施适当的安全措施,可以减少黑客攻击的风险,并保护存储在Memcached中的敏感数据。
```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 #Get info inside the item(s)
```
### 自动化
Memcached是一种常见的分布式内存对象缓存系统,常用于加速动态Web应用程序。Memcached服务器使用基于键值对的存储模型,可以存储任意类型的数据。在渗透测试中,我们可以利用Memcached服务器的一些自动化工具来发现和利用潜在的安全漏洞。
#### Memcached自动化工具
以下是一些常用的Memcached自动化工具:
- **Memcrashed**:一款基于Python的Memcached DDoS攻击工具,可以利用Memcached服务器的UDP协议进行放大攻击。
- **Memcached-Stats**:一款用于收集和分析Memcached服务器统计信息的工具。
- **Memcached-Top**:一款用于监视和显示Memcached服务器性能指标的工具。
- **Memcached-Scanner**:一款用于扫描网络中的Memcached服务器的工具,可以发现未经授权的服务器。
- **Memcached-Injector**:一款用于向Memcached服务器注入数据的工具,可以测试服务器的性能和稳定性。
#### Memcached漏洞利用
以下是一些常见的Memcached漏洞利用技术:
- **未经授权访问**:通过扫描网络中的Memcached服务器,发现未经授权访问的服务器,并利用其存储和检索数据的功能。
- **DDoS攻击**:利用Memcached服务器的UDP协议进行放大攻击,向目标服务器发送大量的请求,导致目标服务器资源耗尽。
- **信息泄露**:通过访问Memcached服务器的统计信息,获取敏感信息,如缓存的数据、密钥等。
- **缓存投毒**:通过向Memcached服务器注入恶意数据,使其返回恶意响应,从而影响应用程序的正常运行。
#### 防御措施
以下是一些保护Memcached服务器的措施:
- **访问控制**:限制Memcached服务器的访问权限,只允许授权的用户或IP地址访问。
- **防火墙配置**:使用防火墙配置来限制对Memcached服务器的访问,只允许来自可信来源的请求。
- **更新和补丁**:及时更新Memcached服务器的软件版本,并应用安全补丁以修复已知的漏洞。
- **安全配置**:配置Memcached服务器以限制其资源使用和响应大小,以防止DDoS攻击。
- **监控和日志**:监控Memcached服务器的活动,并记录日志以便检测和响应潜在的安全事件。
#### 参考资料
- [Memcached官方网站](https://memcached.org/)
- [Memcached-Wikipedia](https://en.wikipedia.org/wiki/Memcached)
```bash
nmap -n -sV --script memcached-info -p 11211 #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
```
## 转储Memcache键
**如果您的memcached版本高于1.4.31,请阅读下一节以了解转储键的高级方法。**
Memcache协议提供了[命令](https://lzone.de/articles/memcached.htm)来查看按照slab(给定大小范围的数据类别)组织的数据。然而,存在一些重要的限制:
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](https://lzone.de/articles/memcached.htm)命令与您的memcached设置进行交互。 **工作原理** 首先,您需要了解memcache如何组织其内存。如果您使用“-vv”选项启动memcache,您将看到它创建的slab类别。例如
```
$ memcached -vv
slab class 1: chunk size 96 perslab 10922
slab class 2: chunk size 120 perslab 8738
slab class 3: chunk size 152 perslab 6898
slab class 4: chunk size 192 perslab 5461
[...]
```
在上面打印的配置中,memcache将在1MB大小的单个slab中保留6898个大小在121到152字节之间的数据块(6898\*152)。所有的slab默认大小都是1MB。使用以下命令打印当前存在的所有slab:
```
stats slabs
```
如果您在空的memcached 1.4.13中添加了一个键
```
set mykey 0 60 1
1
STORED
```
您现在将看到“stats slabs”命令的以下结果:
```
stats slabs
STAT 1:chunk_size 96
STAT 1:chunks_per_page 10922
STAT 1:total_pages 1
STAT 1:total_chunks 10922
STAT 1:used_chunks 1
STAT 1:free_chunks 0
STAT 1:free_chunks_end 10921
STAT 1:mem_requested 71
STAT 1:get_hits 0
STAT 1:cmd_set 2
STAT 1:delete_hits 0
STAT 1:incr_hits 0
STAT 1:decr_hits 0
STAT 1:cas_hits 0
STAT 1:cas_badval 0
STAT 1:touch_hits 0
STAT active_slabs 1
STAT total_malloced 1048512
END
```
该示例显示我们只有一个活动的slab类型#1。我们的键只有一个字节大小,适合作为最小可能的块大小。slab统计信息显示当前只有一个slab类的页面存在,并且只使用了一个块。**最重要的是,它显示了每个写操作(set,incr,decr,cas,touch)和一个get操作的计数器。使用这些计数器,您可以确定命中率!**您还可以使用“stats items”获取另一组信息,其中包含有关驱逐和内存不足计数器的有趣计数器。
```
stats items
STAT items:1:number 1
STAT items:1:age 4
STAT items:1:evicted 0
STAT items:1:evicted_nonzero 0
STAT items:1:evicted_time 0
STAT items:1:outofmemory 0
STAT items:1:tailrepairs 0
STAT items:1:reclaimed 0
STAT items:1:expired_unfetched 0
STAT items:1:evicted_unfetched 0
END
```
**我们已经可以猜到的一些事情...** 根据每个slabs类别的统计信息,我们已经可以猜到关于应用程序行为的很多事情:
1. 不同内容大小的缓存比率是多少?
* 大型HTML块的缓存效果如何?
2. 不同内容大小的内存消耗有多少?
* 简单数字计数器的内存消耗有多少?
* 会话数据的内存消耗有多少?
* 大型HTML块的内存消耗有多少?
3. 我们能缓存多少个大型对象?
当然,要回答这些问题,您需要了解应用程序的缓存对象。**现在:如何转储密钥?** 可以使用“stats cachedump”命令按slabs类别转储密钥。
```
stats cachedump
```
要在类别#1中转储我们的单个键,请运行以下命令:
```
stats cachedump 1 1000
ITEM mykey [1 b; 1350677968 s]
END
```
“cachedump” 每行返回一个项目。花括号中的第一个数字表示字节大小,第二个数字表示创建的时间戳。现在,根据键名,您还可以使用“cachedump”来转储其值。
```
get mykey
VALUE mykey 0 1
1
END
```
这就是它:遍历所有你想要的slab类,提取键名,如果需要,转储其内容。
### **转储MEMCACHE键(版本1.4.31+)**
在memcache版本1.4.31及以上版本中,有一种新的命令可以以非阻塞模式转储内存键(请阅读https://github.com/memcached/memcached/wiki/ReleaseNotes1431)。这种方法在生产环境中运行是安全的。输出不一致,但足够好以找到键、它们的确切过期时间(EXP)和最后访问时间(LA)。由于生成的输出非常庞大,建议使用'nc'命令。示例:
```
echo 'lru_crawler metadump all' | nc 127.0.0.1 11211 | head -1
key=0dLLX%253Amemcache_test_key exp=1590718787 la=1590718487 cas=2238881166 fetch=yes
echo 'lru_crawler metadump all' | nc 127.0.0.1 11211 | grep ee6ba58566e234ccbbce13f9a24f9a28
key=VQRFX%253Aee6ba58566e234ccbbce13f9a24f9a28 exp=-1 la=1590386157 cas=1776204003 fetch=yes
key=0dLLX%253Aee6ba58566e234ccbbce13f9a24f9a28 exp=-1 la=1590712292 cas=2225524871 fetch=yes
```
EXP=-1 表示该项永不过期 EXP=1590718787 (Fri May 29 02:19:47 GMT 2020) 保留了该项应该过期的Unix时间戳 LA=1590712292 (Mon May 25 05:55:57 GMT 2020) 保留了上次访问该项的Unix时间戳
### **转储工具**
有一些不同的转储工具或脚本可以帮助你打印memcache的键:
| 编程语言 | 工具 | 功能 | | |
| -------- | --------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------- | ------- |
| 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的限制,真正转储**所有**的键。 | | |
## 故障排除
### 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](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)
☁️ HackTricks云 ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
* 您在**网络安全公司**工作吗?您想在HackTricks中看到您的**公司广告**吗?或者您想获得**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品——[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
* 获取[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**电报群组**](https://t.me/peass),或在**Twitter**上**关注**我[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享您的黑客技巧。**