20 KiB
11211 - Pentesting Memcache
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- 你在一个网络安全公司工作吗?你想在HackTricks中看到你的公司广告吗?或者你想获得PEASS的最新版本或下载HackTricks的PDF吗?请查看SUBSCRIPTION PLANS!
- 发现我们的独家NFTs收藏品The PEASS Family
- 获得官方PEASS和HackTricks的衣物
- 加入💬 Discord群组或电报群组或关注我在Twitter上的🐦@carlospolopm。
- 通过向hacktricks repo 和hacktricks-cloud repo 提交PR来分享你的黑客技巧。
协议信息
Memcached(发音:mem-cashed,mem-cash-dee)是一个通用的分布式内存缓存系统。它经常被用于通过将数据和对象缓存在RAM中来加速动态数据库驱动的网站,以减少读取外部数据源(如数据库或API)的次数。(来自wikipedia)
尽管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
Memcached是一个高性能的分布式内存对象缓存系统,常用于加速动态Web应用程序。它使用键值对存储数据,并将数据存储在内存中,以提供快速的读取和写入操作。
Memcached的安全性问题
尽管Memcached是一个强大的工具,但它也存在一些安全性问题,可能会被黑客利用。以下是一些常见的安全漏洞和攻击技术:
-
未授权访问:默认情况下,Memcached没有身份验证机制,这意味着任何人都可以访问和修改存储在其中的数据。黑客可以利用这一点来读取、修改或删除敏感数据。
-
反射放大攻击:Memcached可以被用作反射放大攻击的工具。黑客可以发送一个小的请求,但由于Memcached的特性,它会返回一个大量的数据,从而导致目标服务器的带宽消耗过大,甚至可能导致服务不可用。
-
缓存投毒:黑客可以通过向Memcached中注入恶意数据来破坏缓存的完整性。这可能导致应用程序返回错误的数据或执行不安全的操作。
Memcached的安全加固措施
为了保护Memcached免受黑客攻击,以下是一些安全加固措施:
-
访问控制:通过配置防火墙或网络访问控制列表(ACL)来限制Memcached的访问。只允许受信任的IP地址访问Memcached服务器。
-
身份验证和授权:使用身份验证和授权机制来限制对Memcached的访问。可以使用插件或代理服务器来实现这些功能。
-
定期更新:及时更新Memcached的版本和补丁,以修复已知的安全漏洞。
-
监控和日志记录:实施监控和日志记录机制,以便及时检测和响应任何异常活动。
-
安全配置:配置Memcached以最小化安全风险。禁用不必要的功能和命令,并限制内存使用。
-
安全审计:定期进行安全审计,以评估Memcached的安全性,并采取必要的措施来修复发现的漏洞。
结论
Memcached是一个强大的工具,但在使用时需要注意安全性。通过实施适当的安全措施,可以减少黑客攻击的风险,并保护存储在Memcached中的敏感数据。
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)
自动化
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服务器的活动,并记录日志以便检测和响应潜在的安全事件。
参考资料
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
转储Memcache键
如果您的memcached版本高于1.4.31,请阅读下一节以了解转储键的高级方法。
Memcache协议提供了命令来查看按照slab(给定大小范围的数据类别)组织的数据。然而,存在一些重要的限制:
- 您只能按照slab类别(具有大致相同内容大小的键)转储键。
- 您只能转储每个slab类别的一页(1MB的数据)。
- 这是一个非官方功能,随时可能被删除。
第二个限制可能是最困难的,因为几个GB的1MB几乎没有什么。但是,观察您使用的一部分键可能是有用的。但这可能取决于您的用例。如果您不关心技术细节,只需跳转到工具部分了解哪些工具可以让您轻松转储所有内容。或者按照以下指南尝试使用telnet命令与您的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类别的统计信息,我们已经可以猜到关于应用程序行为的很多事情:
- 不同内容大小的缓存比率是多少?
- 大型HTML块的缓存效果如何?
- 不同内容大小的内存消耗有多少?
- 简单数字计数器的内存消耗有多少?
- 会话数据的内存消耗有多少?
- 大型HTML块的内存消耗有多少?
- 我们能缓存多少个大型对象?
当然,要回答这些问题,您需要了解应用程序的缓存对象。现在:如何转储密钥? 可以使用“stats cachedump”命令按slabs类别转储密钥。
stats cachedump <slab class> <number of items to dump>
要在类别#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 | 简单脚本 | 打印键名 | ||
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"
参考资料
☁️ HackTricks云 ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- 您在网络安全公司工作吗?您想在HackTricks中看到您的公司广告吗?或者您想获得PEASS的最新版本或下载PDF格式的HackTricks吗?请查看订阅计划!
- 发现我们的独家NFTs收藏品——The PEASS Family
- 获取官方PEASS和HackTricks周边产品
- 加入💬 Discord群组或电报群组,或在Twitter上关注我🐦@carlospolopm。
- 通过向hacktricks repo 和hacktricks-cloud repo 提交PR来分享您的黑客技巧。