小伙伴们,有没有碰到过服务器莫名其妙突然卡顿、风扇狂转、4路E7加4路泰坦扫雷卡成10帧的情况?恭喜你,电脑被“挖矿”了!
本期我们就来谈谈处理Linux服务器(工作站)感染挖矿病毒的方法。
TLDR: 根据攻击者和攻击手段的不同,普通人没有办法可以100%确定地清除系统感染的恶意软件,建议备份重要数据后直接重装系统,重装完成后按照我们之前文章的办法进行加固。确定防护加固完成后,恢复用户数据时,需甄别并剔除可执行文件和其他可能有风险的文件。
注:本文所有清除操作建议使用Live CD启动服务器,而不要直接在已感染病毒的系统中操作,否则,您修改的密码可能被监听、您修复的文件可能被隐藏的病毒改回、您的操作可能使用了被篡改的工具根本不会生效、甚至您的操作过程还有可能被全程监控。
〇、本文操作使用Shell命令行方式并需要root权限执行,如果您不熟悉,建议直接放弃阅读本文然后重装系统。
一、定位清除占用CPU/GPU的进程
入门姿势:
使用top命令可以定位高CPU占用的进程
# top
在top程序运行界面中点键盘C键即可按照CPU占用排序进程并人工定位异常进程
使用ps命令也可以定位高CPU占用的进程
# ps -eo cmd,pcpu,pid,user --sort -pcpu | head
找到高CPU占用的进程后,使用ls命令即可定位程序实际路径
# ls -l /proc/{pid}/exe
使用kill命令停止进程
# kill -9 {pid}
使用rm命令删除可疑的程序文件(注意命令正确性,敲错命令可能删错数据)
# rm -f {path}
GPU占用排查过程与上文过程类似,Nvidia显卡官方驱动自带命令nvidia-smi可以用于查看GPU占用情况,命令如下:
# nvidia-smi -q -d utilization -l
命令运行后会持续显示当前GPU占用情况,定位进程pid后可以用上文方法定位程序实际位置并处理。
放弃姿势:
1. 如果恶意程序使用了隐藏或者伪装技术则上述操作不一定可以精确定位其位置;
2. 如果恶意程序还有其他植入的后门,则恶意程序还会再次启动;
二、定位并清除未知网络连接的进程
入门姿势:
使用ss命令可以定位网络监听和对外连接情况,TCP协议使用下面的命令:
# ss -anpt
此命令显示所有TCP监听与链接,包含程序名、pid,定位恶意网络连接后进行处置。
查看UDP协议命令为:
# ss -anpu
不同的是,UDP没有状态,所以只会显示本端信息,如果要获取对端信息,需要使用tcpdump命令:
# tcpdump -i {网卡名} host {本地IP} and udp port {本地端口号}
从命令输出信息中,可以查看与之通信的对端IP和端口信息。如果信息没有加密,还可以保存抓包并进一步调试通讯内容。
获得连接目标IP地址后,可以使用公开的安全情报数据库服务查看IP是否为已知恶意IP,常见的有:
微步:https://x.threatbook.cn
360: https://ti.360.net
放弃姿势:
1. 网络调查命令同样只在恶意程序没有使用伪装与隐藏技术的前提下才有效;
2. 有些攻击使用动态IP地址作为目标,IP地址不会记录在公开的威胁情报中;
3. 越来越多的网络流量使用了加密技术,网络抓包无法进行有效的数据分析;
4. 还存在更高端的攻击方法,如ICMP隧道,DNS隧道等。普通用自行调查难度更大,故此处未列出;
5. 调查时不仅要检查外部发起到本地的连接,还需要检查本地主动发起的连接,防火墙对已经被渗透的机器作用不大;
三、查找并修复异常的用户账户
入门姿势:
服务器被“挖矿”病毒感染,经常是由于用户使用了弱口令所致。如果是root用户或者有sudo权限的用户使用了弱口令,建议停止阅读本文并直接重装。其他普通用户建议备份用户数据后,删除用户及关联数据并重建,恢复用户数据时,需甄别并剔除可执行文件和其他可能有风险的文件。
使用root用户可以修改任何用户密码:
# passwd {用户名}
普通用户可以修改自己密码:
$ passwd
Linux系统ssh默认支持无密码登录,如果您不熟悉这项功能,强烈建议自行学习一下并开始使用。默认用户密钥位于~/.ssh/authorized_keys中,您可以用以下命令查看其内容:
$ cat ~/.ssh/authorized_keys
为了防止攻击者增加其他密钥信任文件,可以查看sshd_config的配置进行确认:
# grep AuthorizedKeysFile /etc/ssh/sshd_config
通常我们建议禁止root用户直接从ssh连接系统,而是管理员用户首先使用普通权限用户登录系统后,在有需要root权限操作时,临时使用sudo命令获得root权限。我们同时建议禁止密码方式远程登录,并强制所有用户使用证书方式登陆。可以用以下命令检查root用户当前登陆设置
# grep Root /etc/ssh/sshd_config
检查ssh是否允许密码登录:
# grep Password /etc/ssh/sshd_config
运行上述命令时,还应留意相关配置,防止黑客恶意修改,例如:允许没有密码的用户远程登录。
一旦系统root权限失陷,系统任何用户和任何文件均不可信,即使没有植入后门程序,也有可能增加用户或者修改系统内置用户配置作为入侵的后门。这可以通过检查/etc/passwd和/etc/shadow文件进行确认。
passwd文件格式如下:
1为用户名
2是密码字段,通常此字段为x,代表密码存放于shadow文件中,否则可能已被篡改
3、4分别是uid和gid,除了root用户外,其他用户uid和gid不应为0,否则可能已被篡改
5为用户全名,一般情况不重要
6为用户主目录路径,调查用户登陆权限时,目录内文件内容一定要查看
7为用户默认shell程序路径,此字段应为/etc/shells文件中的一项,或者为/usr/sbin/nologin、/bin/false,如果程序不是这些,或者对应程序被篡改,说明系统已经失陷
shadow文件格式如下:
1为用户名
2为加密后的密码,任何不以!开始的密码对应的用户都有可能可以远程密码登录,需仔细甄别其是否为系统合法用户
其他字段与本文关系不大,可自行上网查看
注意:除了检查shadow中密码字段外,还需要检查passwd中对应的用户主目录的内容才能确定用户是否可以远程登录,不要忘记,Linux默认支持无密码登录。
使用以下命令在linux下查看隐藏文件:
# ls -a
放弃姿势:
1. 攻击者使用后门程序可以绕过系统用户管理机制获得用户权限;
2. 即使只有普通用户使用了弱口令,攻击者依然可以通过本地漏洞获得root权限。参考sudo与polkit本地提权漏洞;
3. 如果有隐藏的后门程序,或系统不完整的情况,所有的修复均可能没有意义;
四、定位并清除系统自启动恶意程序
入门姿势:
攻击者想要持续控制被攻击目标,最简单的方法就是让恶意程序随系统启动。Linux系统中主要存在两种类型的启动程序设置,分别是,SysV形式的启动脚本和systemd系统管理机制。
SysV启动位置有:
/etc/init
/etc/init.d
/etc/rc.d
/etc/rc[0-6].d
/etc/rc.local
/etc/inittab
systemd启动位置有:
/etc/systemd
~/.config/systemd/user
注意:SysV和systemd并不是互斥的,检查应同时检查其对应位置的每个子目录的每个文件,并应根据发行版本的不同,检查系统脚本是否引入了其他启动位置,进行递归检查。
其他的启动位置:
Xserver启动位置有:
/etc/xdg/autostart
~/.config/autostart
系统启动命令行也可能引入外部启动参数,可以用以下命令查看:
# cat /proc/cmdline
放弃姿势:
1. Linux系统启动位置庞大繁杂,根据不同发行版本又有不同,部分脚本复杂度极高,这些都决定人工对其完整检查发现问题不具有性价比;
2. 安装不同的程序可能还会引入新的启动加载点,进一步增加了调查的难度;
3. 攻击者可能采用增加文件、修改文件、链接外部文件等各种手段,攻击目标经常是不易发现或迷惑性强的位置,人工调查难于发现;
4. 上述检查位置并不能覆盖所有启动检查项,具体启动项目名称和位置完全是所使用发行版本设计人员个人习惯和偏好决定,除非对特定系统非常熟悉,普通人检查很可能出现遗漏;
五、定位并清除定时启动的恶意程序
入门姿势:
Linux定时任务也是攻击者常用的恶意文件植入手段,常见的有cron、systemd-timers、at、自建驻留进程。
Cron任务常见的位置有:
/etc/crontab
/etc/cron.*
/var/spool/cron/
还可以使用以下命令查看当前用户的cron任务列表:
# crontab -l
systemd-timers的位置在/etc/systemd子目录下,可以用以下命令查看:
# systemctl list-unit-files | grep timer
at调度命令列表可以用以下命令查看:
$ at -l
常驻进程的定时任务根据进程设计者而定,无法统一方法查看,所以此类问题只能靠使用Live CD启动系统,然后清除所有可疑的自启动文件实现。
放弃姿势:
1. 定时任务本身比较简单,但是检查时需区分哪些是系统自带的,哪些是是被修改或增加了,如果没有正确识别,可能造成系统本身工作不正常;
2. 除了检查配置脚本本身,还需要检查其调用的目标脚本以及目标脚本调用的脚本和程序,“子子孙孙无穷尽”,实际工作量和难度也不能轻视;
六、定位并清除被篡改或增加的系统文件
入门姿势:
简单粗暴感染系统可执行文件和动态链接文件是恶意程序的祖传手艺了。不同Linux发行版包含命令可以用于对比程序安装完成后是否修改,从而发现被篡改的程序。
Redhat系统可以使用以下命令:
# rpm -Va
Debian/Ubuntu系统可以使用以下命令:
# dpkg -l | awk '/^ii/ { print $2 }' | xargs debsums | grep -vE 'OK$'
还可以使用专业杀毒软件进行全盘扫描,发现被感染文件。
放弃姿势:
1. 系统自带检查工具并不存储所有安装文件的信息,所以此检查过程不完全可靠;
2. 系统自带检查工具本身也可能被篡改,检查可能没有意义;
3. 如果恶意程序感染用户自己安装的文件,则检查完全不能发现文件异常;
4. Linux下的专业杀毒软件并不广泛,且杀毒软件很难发现脚本中的恶意代码;
七、查找并修复常见的系统配置文件与参数
入门姿势:
狡猾的猎手会在最出其不意的地方隐藏自己。Shell环境变量就是用户最容易忽视的地方。PATH/LD_LIBRARY_PATH/LD_PRELOAD/LD_AUDIT/alias篡改可以实现用户执行命令时主动触发恶意代码执行。
PATH变量:
此变量决定用户执行程序时系统定位目标程序的方式,默认情况下,普通用户会包含/bin, /usr/bin, /usr/local/bin等内容,root用户额外有/sbin, /usr/sbin, /usr/local/sbin等内容。如果攻击者篡改PATH变量的内容,可能导致用户运行了自己预料之外的恶意程序。可以使用以下命令查看PATH当前内容:
# env | grep PATH
LD_LIBRARY_PATH/LD_PRELOAD/LD_AUDIT等变量:
此类变量影响动态链接程序运行时链接的实际依赖代码,默认情况下,这些变量都应为空。如果攻击者篡改变量的内容,用户在运行程序的同时,不知不觉加载并运行恶意代码。可以用以下命令查看类似变量的内容:
# env | grep LD_
注意:配置文件/etc/ld.so.preload可以实现类似的功能,检查时不应忽略。
alias命令:
alias命令为shell内置命令,可以让用户改变一个命令运行的实际语义。攻击者可以利用此命令实现张冠李戴,让用户常见命令加载恶意代码执行,甚至隐藏或改变常见命令的结果。例如,以下命令可以让用户的ls命令永远返回空目录:
$ alias ls=echo
可以单独运行alias命令查看当前所有命令别名:
$ alias
系统环境变量通常受系统及用户目录配置文件的影响,系统配置文件位置有:
/etc/profile
/etc/profile.d
/etc/environment
/etc/bashrc
用户目录配置文件有:
~/.profile
~/.bashrc
~/.bash_profile
~/.bash_logout
~/.zshrc
如果用户使用X Window服务,配置文件还包括:
~/.xprofile
~/.xinitrc
注意:攻击者也可能直接在配置文件中植入恶意代码,用户登录时自动触发。而系统中可以写入恶意代码的配置文件也远远不止这些。
修改/etc/modprobe*或者/etc/modules*文件可以让系统加载恶意的内核模块代码;
修改/etc/initcpio或者/etc/initramfs文件可以让恶意代码写入到系统启动的早期内存镜像中;
同样,修改/etc/yum或者/etc/apt处的文件可能让你的系统升级操作替攻击者下载恶意代码;
甚至修改/etc/hosts也可以让你经常访问的网站变为黑客控制的投毒站点。
总之,这个可能被更改的列表的长度基本上只取决于攻击者的想象力。
放弃姿势:
1. 列表太长了,这里列不完,修复比重装还累;
2. 都改成这样了,还有必要修复么?
八、检查和修复系统业务文件
入门姿势:
黑手终于伸向你自己的业务程序和数据了。攻击者进入系统,修改了你网站的代码,或者给你的网站增加了一点代码,还可能,就是从你网站代码的漏洞进来的,怎么办?
根据你服务器进程的用户身份,如果是root用户身份,那么请停止阅读,备份数据,重装系统,修复代码漏洞,然后用专用非特权用户重新部署服务。部署时确认除了必要的用户上传目录外,服务用户不具有系统内任何文件的写入权限。如果是普通用户身份,备份数据后,删除用户所属的任何文件,修复漏洞后重新来过。
如果攻击者拥有系统文件写入权限,可能被写入恶意代码的位置包括但不限于:
l 修改服务器配置文件,或者服务目录配置文件,增加或修改服务的内容,形成后门
l 修改或者增加服务目录程序文件,植入一句话木马后门
l 增加服务目录包,为自己准备一个豪华版木马后门
l 增加或修改默认服务管理密码,例如,帮你的tomcat管理目录增加或者修改一个用户,使它变成一个后门
除非你为自己程序的每个文件保留了一份签名信息和文件名录,否则,在海量的程序代码中发现被攻击者修改或者增加的文件,几乎不可能。只能告诉自己吃一堑长一智了。
当业务遭受这种攻击时,“挖矿”可能是你最少需要担心的。此时服务器业务数据既可以被窃取,也可以被篡改。甚至,有经验的黑客还能在数据库中植入精心设计的触发器或者存储过程形成的后门程序,即使你恢复数据,他也能随时回来。
放弃姿势:
冰冻三尺非一日之寒,如果系统出现了这样的问题,那么,很有可能系统开发和部署的整个思路需要推倒重新来过。先不要考虑如何修复,首先止损;
九、检查并修复系统启动加载器与内核文件
入门姿势:
系统运行在病毒上,听起来是不是很新鲜刺激?对的,理论上,黑客可以把恶意代码植入系统引导器、磁盘的引导扇区、甚至BIOS硬件模块或者路由器的nvram配置区内。
事实上,上个世纪臭名昭著的CIH病毒就是针对系统启动代码和BIOS硬件本身进行攻击的。而公开消息称,美国网军有攻击硬件底层代码的病毒作为武器。这种情况,如果商业杀毒软件无法检测到病毒,可能只能请病毒专家了。
当然,为了避免这种情况发生,您可以试试secure boot(安全引导)功能,这需要BIOS和支持的操作系统相互配合完成。具体技术细节,可以查看主板和操作系统的官方文档。
放弃姿势:
如果您自行发现并解决了这种问题,请您给我们指教!
十、结语
人外有人,山外有山,现实中难免会有我们尚不掌握的病毒潜伏手段。Linux系统内核自身就有上千万行代码,系统安装完成就有上万文件,在此规模的系统中查找精心设计的恶意程序无异大海捞针,我们再次建议中病毒的用户备份数据后直接重装。小编并非专业黑客,知识水平有限,如有大侠能够补充本文遗漏,请不吝赐教!
投稿邮箱:lxzheng#(自己替换#)xjtu.edu.cn