首页
社区
课程
招聘
[原创]Redis常见利用方法
发表于: 2022-5-5 16:55 1519

[原创]Redis常见利用方法

2022-5-5 16:55
1519

08589235ab4009b7502207f98398a201.png

Redis常见端口

Redis是现在最受欢迎的NoSQL数据库之一,Redis是一个使用ANSI C编写的开源、包含多种数据结构、支持网络、基于内存、可选持久性的键值对存储数据库,其具备如下特性:

Redis数据结构
1cce61f86d076b72446e990c21a05f7f.png

从多路复用IO来看

在Redis中很多地方调用Linux的epoll方法来实现多路复用,而在Windows系统是没有epoll方法的,Windows下对应的是IOCP模型,

从Redis如何进行持久化来看

RDB持久化的手动备份命令是bgsave,AOF文件过大的重写命令是bgrewriteaof。

原理都是开辟一个子进程对内存进行处理(注意了是子进程,不是子线程),这就涉及到操作系统的机制了。

Redis通过Linux系统的fork函数创建子进程,共享内存里面的代码段和数据段,从而实现了持久化。

然而Windows系统是没有fork函数的。

这里使用docker快速启动Redis

638758d0cefeaf54ccc05ae6d4d3095e.png

9a2257afde6cc9b4e8291498889d44de.png

启动容器

fa59893a60fba588ba189b1052195daa.png

protected-mode的yes修改为No
7ae078ba64863b8e1c8a91cf2150d134.png

注释 bind 127.0.0.1
b3bc99f3c15bae47b7cbfa46bc34422e.png

e367a456298a8bf4cc8e30b3a22f4afc.png

dc57a8446bc23a632aad4306a55f24dd.png

如果遇到这个,就用make编译,首先卸载原来的apt安装的版本

然后make编译就可以了

Redis 默认情况下,会绑定 .0.0.0.0:6379 ,如果没有才有相关的策略,比如添加防火墙规则避免其他非信任来源 限制ip访问等,那么就会将 Redis 服务暴露到公网上。如果没有设置密码认证的话(一般为空),会导致任意用户在可以访问目标服务器的情况下,未授权访问 Redis 以及 读取 Redis 的数据。

aaa06dd14b9194372ca77e397c92098d.png

首先先来看一下info中有哪些信息
37d4bd19971540d618e488f837de80aa.png

34823a54a4d004beced5c49bc60ab6a5.png

原理

在数据库中插入一条Webshell数据,将此Webshell的代码作为value,key值随意(x),然后通过修改数据库的默认路径为/www/wwwroot/html和默认的缓冲文件shell.php,把缓冲的数据保存在文件里,这样就可以在服务器端的/www/wwwroot/html下生成一个Webshell

条件

1、redis和网站要在同一台服务器下

2、知道网站根目录的绝对路径

2、运行redis服务的用户必须有权限向目录写文件

利用方法

将dir设置为/www/wwwroot/html,将指定本地数据库存放目录设置为/www/wwwroot/html;将dbfilename设置为文件名shell.php,即指定本地数据库文件名为shell.php;再执行save或bgsave,则我们就可以写入一个路径为/www/wwwroot/html/shell.php的Webshell文件

首先我们在服务器的根目录中创建一个/www/root的文件夹并用python启动一个临时的HTTP服务
af1475d9f1f103e910620aa2fc2d9fa8.png

272537a2f42c31afc64789867dedab50.png

获取当前路径

6b1e3f33c6f02d3a8127bda015208f1b.png

设置/www/root为指定目录

fbc64a7b04e544861cdde6baa97f5340.png

写入文件

0d969ddf3638f496a2f2b455c1894a04.png

设置写文件

84bc3d0f5211628c701d0d619c2303c3.png

随后尝试访问
64d624bb049006cbbf9030cde63fa833.png

这里是肯定不会解析的,因为只是一个HTTP服务,可以看到目录下也有test.php,成功写入
1033763cb9e30316eb42790a1078fecc.png

ps: 来自Tatsumaki大佬的博客

条件

Ubuntu

29692b5557d111b1eec89f07d1fb1f1d.png

b1e591a3868475ba6d60ba306391ca92.png

在Ubuntu中尝试之后,发现并没有反弹shell回来,不知道为什么,查询了文章看到有大佬说

所以这里更换Centos尝试,搭建步骤与上文一致,发现centos确实在1分钟左右就返回了shell
829eec0c5f1b10bb4b0e61ef1e2d0049.png

按照上面CentOs和Ubuntu写文件的说法,可以来看一下写入的文件权限大小

Linux权限对应表
df829a15ae7a3bba86db528db9524304.png

3ea7002d30a08934d5044c54b9a6f343.png

可以看到CentOs中的是644
e31a42b4b0863c997a81011a5856843f.png

Ubuntu中也是644,那么如果真如那篇文章所说,必须是600才会执行的话,那么确实Ubuntu无法执行(

条件

这里就用Centos7搭建的redis作为环境

首先配置ssh密钥登录

62b64f1e2b3777bee65fa638073bfdf1.png

然后重启sshd服务

随后尝试连接会提示
c0bf8661c2f54e3b0fc9dd79993555b2.png

随后在Mac上生成密钥

设置.ssh目录

写入公钥

8cd7c5fdb6fd92634bfb8f8e7b126930.png

随后就可以使用shh直接连接了
e30c2cd9ed76c300db3bc6aa4451fd32.png

原理

若/etc/passwd和/etc/shadow中同时存在密码,系统会使用/etc/passwd中的密码进行验证 /etc/passwd-是/etc/passwd的备份,成功登录系统后,通过替换/etc/passwd-文件,可以恢复root用户的原密码

Linux存账户密码一般会有/etc/passwd和/etc/shadow,如果两个出现冲突的话,会以/etc/passwd为准。

另外,/etc/passwd的权限一般是644,比/etc/shadow的640要高。而且,redis写入是覆盖的,也就是说,写入进去覆盖之后,其他的都没了,这个过程是有创且不可逆的。

这里用到一个大佬的dockerfile: https://github.com/justonly1/DockerRedis

或者docker直接下载也可以

8c0cc21bca1ca8576346b1f97179f335.png

b975fbdc60254eba78f10d31a58404ff.png

随后生成一串密码为YourNewPasswd%1024的密文

另外这段代码

mac下会这样
a35d15e21877f46dded9b9303d4ad4dd.png

在kali下就好了
eafff4d578885f1f23347729955d9eea.png

然后写入/etc/passwd

然后就可以使用YourNewPasswd%1024这个密码登录了
3ecd53aa41b8f3d08cf67e75165af515.png

这里用vulhub的靶场

da717cd0c076c9d146f2c7910ad5a60e.png

c4386984ffcb3c010408d4e2eb90ee3d.png

exp用这个https://github.com/n0b0dyCN/redis-rogue-server.git

这执行的时候会遇到错误
49b76596a0ffde61e70c7e5ce4afb020.png

4b42cd5655b94ad27ec9cbff9b88cb39.png

多跑几次就行
a96b81bcbad61ce257602b134d6961aa.png

https://2018.zeronights.ru/wp-content/uploads/materials/15-redis-post-exploitation.pdf

https://www.1024sou.com/article/611764.html

 
 
 
 
 
docker search redis
docker search redis
docker pull redis
docker pull redis
 
docker run -itd run -p 6379:6379 -d redis
docker run -itd run -p 6379:6379 -d redis
wget http://download.redis.io/releases/redis-3.2.11.tar.gz
tar -zxvf redis-3.2.11.tar.gz
vim redis.conf
make
wget http://download.redis.io/releases/redis-3.2.11.tar.gz
tar -zxvf redis-3.2.11.tar.gz
vim redis.conf
make
 
cp ./redis-server /usr/local/bin/
cp ./redis-server /usr/local/bin/
 
apt remove redis-server
apt remove redis-server
https://github.com/microsoftarchive/redis/releases
https://github.com/microsoftarchive/redis/releases
wget http://download.redis.io/redis-stable.tar.gz
tar -xzvf redis-stable.tar.gz
cd redis-stable
make
cp src/redis-cli /usr/local/bin/
wget http://download.redis.io/redis-stable.tar.gz
tar -xzvf redis-stable.tar.gz
cd redis-stable
make
cp src/redis-cli /usr/local/bin/
brew tap ringohub/redis-cli
brew install redis-cli
brew tap ringohub/redis-cli
brew install redis-cli
在未授权的情况下,可以利用 Redis 自身提供的 config 命令进行写入shell、写SSH公钥、创建计划任务反弹shell 等。其思路都是先将 Redis 的本地数据库存放目录设置为 特定的目录,然后将 dbfilename \(本地数据库文件名\) 设置为你想写入的文件名称,最后在执行 save 或 bgsave 保存,那么就看在制定的目录下写入指定的文件了。
在未授权的情况下,可以利用 Redis 自身提供的 config 命令进行写入shell、写SSH公钥、创建计划任务反弹shell 等。其思路都是先将 Redis 的本地数据库存放目录设置为 特定的目录,然后将 dbfilename \(本地数据库文件名\) 设置为你想写入的文件名称,最后在执行 save 或 bgsave 保存,那么就看在制定的目录下写入指定的文件了。
redis-cli -h ip //无需密码登录
redis-cli -h host -p port -a password   //使用redis密码登入redis服务
info
redis-cli -h ip //无需密码登录
redis-cli -h host -p port -a password   //使用redis密码登入redis服务
info
 
 
 
 
 
 
 
 
 
 
 
 
Config get dir
Config get dir

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 3
支持
分享
最新回复 (4)
雪    币: 246
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
非常感谢分享~~
2022-5-28 20:38
0
雪    币: 144
活跃值: (178)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢分享知识
2022-6-26 07:43
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
4
大佬docker启动redis的命令里多了一个run
2023-4-11 10:28
0
雪    币: 137
活跃值: (156)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
最近在学,感谢分享,
2023-4-20 07:05
0
游客
登录 | 注册 方可回帖
返回
//