hacktricks/network-services-pentesting/11211-memcache
2023-08-03 19:12:22 +00:00
..
memcache-commands.md Translated to Chinese 2023-08-03 19:12:22 +00:00
README.md Translated to Chinese 2023-08-03 19:12:22 +00:00

11211 - Pentesting Memcache

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

协议信息

Memcached发音mem-cashedmem-cash-dee是一个通用的分布式内存缓存系统。它经常被用于通过将数据和对象缓存在RAM中来加速动态数据库驱动的网站以减少读取外部数据源如数据库或API的次数。来自wikipedia
尽管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

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中的敏感数据。

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给定大小范围的数据类别组织的数据。然而存在一些重要的限制

  1. 您只能按照slab类别具有大致相同内容大小的键转储键。
  2. 您只能转储每个slab类别的一页1MB的数据
  3. 这是一个非官方功能,随时可能被删除。

第二个限制可能是最困难的因为几个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类的页面存在并且只使用了一个块。**最重要的是它显示了每个写操作setincrdecrcastouch和一个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块的缓存效果如何
  1. 不同内容大小的内存消耗有多少?
  • 简单数字计数器的内存消耗有多少?
  • 会话数据的内存消耗有多少?
  • 大型HTML块的内存消耗有多少
  1. 我们能缓存多少个大型对象?

当然,要回答这些问题,您需要了解应用程序的缓存对象。现在:如何转储密钥? 可以使用“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本身不支持复制。如果确实需要需要使用第三方解决方案

命令速查表

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

Shodan

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

参考资料

☁️ HackTricks云 ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥