针对 Memcached 的攻防基础
0x01 一些常见的 Nosql 数据库
1
2
3
4memcached 基于纯内存缓存,也就是说,服务只要一重启所有数据就会丢失,但它操作简单,易于上手,相对高效
redis 既可以基于内存缓存亦可基于硬盘持久存储,另外,它所支持的数据类型相对较多,功能也较完善
MongDB
...
此次演示环境1
2
3CentOS6_x86_64 ip: 192.168.3.65
OldLnmp ip: 192.168.3.42
Ubuntu16.04.3 ip: 192.168.3.12
0x02 Memcached 缓存实际中简单的应用场景1
2基于纯内存缓存,速度快,同样,也是基于 C客户端 / S服务端 的工作模式,而libevent其实就是一个支持epoll/kqueue异步I/O模型的接口
Memcached 在实际生产中主要是用来存放用户经常要访问到的一些高频关键字,加快数据库命中,减轻后端数据库压力,提高数据响应速度...
0x03 安装并启动memcached 服务端,默认它会监听在tcp和udp的11211端口上1
2
3
4# rpm -qa libevent libevent-devel nc telnet memcached
# yum install libevent libevent-devel nc telnet -y
# yum install memcached -y
# which memcached
关于 memcached 自身的各类选项具体用途说明1
2
3
4
5
6
7
8
9-l 指定要监听在哪个ip地址上
-m 指定用于缓存数据的最大内存,默认是64M
-p 指定memcached服务的端口,默认是11211
-d 让memcached在后台运行
-u 指定运行该服务的用户,在yum安装时会自动创建一个memcached用户
-c 并发连接数,默认是1024
-P 指定pid文件位置
-M 禁用LRU,默认如果内存空间满了会自动使用LRU算法进行数据清除
-vv 显示详细启动信息
单实例及多实例 memcached 服务启动方式,其实很简单,只需要在启动时改下服务端口即可,此处要注意,严禁直接用root身份来运行memcached服务,另外,建议不要用默认端口,可以用个高端口,防止别人扫描1
2# memcached -l 192.168.3.65 -m 32m -p 11211 -d -u memcached -c 8192 -P /tmp/11211.pid
# memcached -l 192.168.3.65 -m 32m -p 11212 -d -u memcached -c 8192 -P /tmp/11212.pid
1 | # lsof -i :11211 |
0x04 注意,操作memcached是无需任何认证的,也就是说,只要连到对应的服务端口上就可直接对其进行各类数据的增删改查
,这也是它最容易出现错误配置的地方1
2
3
4
5
6
7
8
9
10
11
12
13# telnet 192.168.3.65 11211
set 相当于mysql的 insert
set keyname 0[数据格式] 过期时间[0表示不过期] 值大小[单位字节]
get 相当于mysql的 select
get keyname
replace 相当于mysql的 update
replace keyname 0 0 新值大小
delete 相当于mysql的 delete
delete keyname
0x05 安装php的 memcache 客户端扩展,因为后续主要还是通过php / python / java
此类脚本对memcached进行各种增删改查1
2
3
4
5
6
7
8
9
10
11
12
13# wget https://pecl.php.net/get/memcache-2.2.7.tgz
# tar xf memcache-2.2.7.tgz
# cd memcache-2.2.7
# /usr/local/php/bin/phpize
# ./configure --enable-memcache --with-php-config=/usr/local/php/bin/php-config
# make && make install
# vi /usr/local/php/etc/php.ini
extension_dir = "/usr/local/php-5.6.32/lib/php/extensions/no-debug-non-zts-20131226/"
extension=memcache.so
# pkill php-fpm
# /usr/local/php/sbin/php-fpm
# /usr/local/nginx/sbin/nginx -t
# /usr/local/nginx/sbin/nginx -s reload
0x06 实际生产中的 memcached 预热注意事项1
2起监控 -> 起存储 -> 起web -> 起缓存 -> ...
一般都是按照从后端往前端慢慢起,最先起数据库存储,然后再对memcached逐个进行预热,减小后端数据库瞬间压力
0x07 memcached 内存管理机制,关于memcached的底层运作细节和性能优化,并非此处重点,就不做详述了,有兴趣大家可以自行去翻阅资料深入研究,当然,直接去读源码无疑是最精准的,前提是得有那个能力 ^_^1
2基于 malloc 的内存管理机制,容易产生内存碎片
基于 slab 的内存管理机制
0x08 memcached 简单性能调优1
2
3提高命中率
减少内存浪费[slab]
...
0x09 memcached 纯图形化管理小工具memadmin
,基于php编写,使用非常简单,直接丢到网站目录中访问即可,个人建议生产中最好不要用容易被人扫目录扫到1
2
3
4
5
6# wget http://www.junopen.com/memadmin/memadmin-1.0.12.tar.gz
# tar xf memadmin-1.0.12.tar.gz
# mv memadmin /usr/local/nginx/html/bwapp/bWAPP/
# vi /usr/local/nginx/html/bwapp/bWAPP/memadmin/config.php 务必要记得修改默认账号密码
$config['user'] = "admin";
$config['passwd'] = "admin";
0x10 配置专用 session 共享服务器,只需要在php.ini中修改下面的选项即可1
2
3# vi /usr/local/php/etc/php.ini
session.save_handler = memcache
session.save_path = "tcp://memcached服务器所在的ip:11211"
0x11 关于memcached的一些安全问题,首先,我们还是先来看看仅仅利用memcached我们能干些什么1
2
3
4泄露敏感信息,如各类账号密码,配置信息
随意对memcached缓存进行增删改查
各种RCE exp利用
...
0x12 关于memcached未授权访问的简单利用过程,实际渗透中可以用它来搜集一些敏感些信息,如各类账号密码,服务配置等…1
# nmap -Pn -sT -p 11211 --script=memcached-info.nse 192.168.3.65
1 | # telnet 192.168.3.65 11211 |
0x13 利用iptables对memcached限制ip访问,如,只允许192.168.3.42这个ip访问1
2
3
4# iptables -F
# iptables -P INPUT DROP
# iptables -A INPUT -p tcp -s 192.168.3.42 --dport 11211 -j ACCEPT
# iptables -A INPUT -p udp -s 192.168.3.42 --dport 11211 -j ACCEPT
0x14 最后,注意多去关注官方发布的各种高危补丁,适时进行修补
后话:
现在估计用的已经比较少了,服务比较简单,利用的方式也很有限,所以这里也就不多啰嗦了,实际渗透过程中注意把搜集到的各类敏感信息相互配合利用,往往效果更佳,祝大家好运 ^_^