# linux应急响应

linux应急响应

应急响应指遇到重大或突发事件后所采取的措施和行动。应急响应所处置的突发事件不仅仅包括硬件、产品、网络、配置等方面的故障,也包括各类安全事件,如:黑客攻击、木马病毒、勒索病毒、Web攻击等。

处置手段

发现问题要处置,遵循原则:百分百确认是非法文件,报备记录关停,摸棱两可找负责人确认,处置看沟通结果

环境:ubantu20.04

注意:linux版本之间有差异,具体以自己的系统版本为准

开机启动项

伴随开机启动,一般生产服务器很少重启,但是为防止被控机器失联部分木马会添加开机启动项作为复活手段。

开机启动文件

etc/rc.local

文件前面是注释,最后是一条命令,每次开机重启都会自动执行该命令。如果不能确认是否是非法命令,则需要和运维确认,因为有一些服务需要开机启动

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Ensure that the script will "exit 0" on success or any other
# value on error.
#
# To enable or disable this script, just change the execution
# bits.
#
# By default, this script does nothing.

touch /root/1.txt		#创建文件

/etc/rc.d/rc.local

同上,最后也是开机时执行的命令。/etc/rc.local/etc/rc.d/rc.local的软连接

#!/bin/bash
# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
#
# It is highly advisable to create own systemd services or udev rules
# to run scripts during boot instead of using this file.
#
# In contrast to previous versions due to parallel execution during boot
# this script will NOT be run after all other services.
#
# Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
# that this script will be executed during boot.

touch /var/lock/subsys/local
touch /tmp/1.txt

/etc/rc.d/init.d/

这个目录下面放了可执行脚本或文件,需要排查是否有可疑的文件或脚本,其次,还需要检查原先的脚本是否被篡改。

可以在服务器上对关键文件做md5值,如果文件被更改,我们可以快速的定位被更改的文件

/etc/rc*.d/

开机启动的目录,里面是一些服务,也需要排查最近是否有被更改的迹象,防止一些恶意命令插入服务中。

rc0.d/ rc1.d/ rc2.d/ rc3.d/ rc4.d/ rc5.d/ rc6.d/ rcS.d/

开机启动命令

查看自启列表命令
systemctl list-unit-files

只查看服务类型的开机启动
systemctl --type service list-unit-files

重启或者查看某个服务状态
systemctl restart abrtd.service
systemctl status abrtd.service

设置服务开机启动
systemctl enable nginx.service //设置nginx开机启动
systemctl enable php-fpm.service  //php-fpm开机启动

搜索指定状态的服务
systemctl list-unit-files | grep enabled

搜索指定服务的状态
systemctl list-unit-files | grep nginx  //搜索 nginx 的开机启动状态

发现恶意服务,使用下面命令关停
sudo systemctl stop ufw.service # 停止服务
sudo systemctl disable ufw.service # 删除开启启动

启动服务
sudo systemctl start ufw.service # 启动服务
sudo systemctl enable ufw.service # 添加开启启动

排查环境变量配置文件

/etc/profile
/etc/bashrc
/etc/bash.bashrc 
~/.bashrc
~/.profile 
~/.bash_profile

这些文件用于设置系环境变量或启动程序,每次Linux登入或切换用户都会触发这些文件。如果文件中被插入了恶意语句,则每次登录或者切换用户都会执行该恶意语句。

登录时文件的触发顺序
登入-->/etc/bash.bashrc-->/etc/profile-->~/.bashrc-->~/.profile-->登入成功

~/.bash_logout文件,在登出账户时触发。

排查各项资源异常

进程

进程是Linux当前正在处理的任务,当运行某个软件时将为其创建一个进程。

ps -efcaux # 查看所有进程

image

查找进程文件位置

sudo lsof -p 1133 # 查看pid为1133的进程详细信息

一般来说,第三行显示的就是文件的路径

image

sudo ls -al /proc/1133/exe # 查看1133为948的进程文件绝对路径

image

/proc/进程号/路径下,存在许多文件

image

文件 作用
cwd 符号链接(类似快捷方式)的是进程运行目录
exe 符号链接(类似快捷方式)的是执行程序的绝对路径
cmdline 符号链接(类似快捷方式)的是进程运行目录
environ 记录进程运行时系统的环境变量

CPU

CPU也称为中央处理器、主处理器或单处理器,是执行计算机指令得关键部件,某服务器突然有一个进程占用的CPU远超平时,那么可能被植入了挖矿病毒。

排查话术:CPU是否远超平时居高不下,如果是的话那么可能被植入了挖矿病毒。

top # 排名越靠前占用的CPU越多

image

如果某一个进程的cpu使用率高达80%、90%,要注意其是否是病毒(如挖矿病毒)。正常情况下,一个服务的cpu占用率不会达到这种地步,此外也不排除是遇到了业务高峰期。

可以通过

ps -ef|grep COMMAND

来查看该进程的详细信息

image

内存

程序启动时会被系统读入内存,在执行的过程也不断的在内存中申请新的空间。

排查话术:最近内存是否突然升高持续不下,如果是的话那么可能被植入了挖矿病毒。

ps -aux | sort -k4nr | head -10 # 内存占用最高的10个进程

image

网络带宽

带宽也就是网速的最高上限,比如家里的100/M带宽,就是每秒100M的传输速度,带宽分为上行和下行对应着上传下载,某服务器上行流量比往常高出几倍时,说明在外发大量的数据,重点检查是否为正常业务。

排查话术:网络流量上下行有异常吗?有异常的话是哪个IP?

网络占用需要安装软件辅助,应急时大部分情况都不允许随意安装软件,这时候就需要和运维的网络沟通,从设备上看下流量情况。

vulab@sechelper:~$ sudo apt-get install iftop # centos使用 yum install iftop
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following NEW packages will be installed:
  iftop
0 upgraded, 1 newly installed, 0 to remove and 54 not upgraded.
Need to get 36.3 kB of archives.
After this operation, 95.2 kB of additional disk space will be used.
Get:1 http://cn.archive.ubuntu.com/ubuntu focal/universe amd64 iftop amd64 1.0~pre4-6build1 [36.3 kB]
Fetched 36.3 kB in 1s (24.6 kB/s)
Selecting previously unselected package iftop.
(Reading database ... 108839 files and directories currently installed.)
Preparing to unpack .../iftop_1.0~pre4-6build1_amd64.deb ...
Unpacking iftop (1.0~pre4-6build1) ...
Setting up iftop (1.0~pre4-6build1) ...
Processing triggers for man-db (2.9.1-1) ...

使用iftop命令分析网络时,需要指定网卡,一个生产机器服务器会有很多块网卡,有管理用的、业务用的或其它的,这时候要与运维沟通区分各个网卡的用途。

ip addr # ifconfig 查看所有网卡
sudo iftop -i ens33 -P # 指定ens33网卡,分析其流量

网络连接

服务器每发出和接收一个TCP/UDP请求都能看到连接(短时间内)。

netstat 命令:

  • -a 显示所有
  • -n 数字形式展示连接端口
  • -t 仅查看TCP连接情况
  • -u 仅查看UDP连接情况
  • -p 显示相关程序名
sudo netstat -antup	#查看所有连接

image

状态 作用
LISTEN 监听TCP端口,等待远程连接
TIME-WAIT 等待一段时间确保远程TCP中断请求
ESTABLISHED 打开着的连接
SYN_RECV 接收和发送连接请求后等待确认连接请求确认的情况。
CLOSING 等待远程TCP对连接中断的确认
CLOSE 连接完全关闭
端口状态对照表

关闭进程

这里注意一下,关停服务后进程是否会”复活“,如果恶意进程被kill后重新启动,那么肯定有其它地方有自启动方法,继续排查守护进程、定时任务、系统配置、服务和系统文件。

sudo kill -9 1434

威胁情报

威胁情报是识别和分析网络威胁的过程。威胁情报平台可以查出一些域名和IP地址的信誉度,一旦发现它们存在网络攻击痕迹迅速封禁。

image

image

查到ip后,检索我们的设备有无从此ip发送来的请求或向此ip发送的请求

image

这时我们就可以确定这是一个攻击ip,直接封禁。

排查SSH后门

SSH(Secure Shell)是一种加密的网络传输协议,通常利用SSH来传输命令行界面和远程执行命令。

设置 SSH 通过密钥登录

查看账户

users	#查看用户
cat /etc/passwd	#查看用户
cat /etc/group	#查看用户组

与用户相关的关键的文件

`/etc/passwd`: 用户账户的详细信息在此文件中更新。
`/etc/shadow`: 用户账户密码在此文件中更新。
`/etc/group`: 新用户群组的详细信息在此文件中更新。
`/etc/gshadow`: 新用户群组密码在此文件中更新。

/etc/passwd内容解析

参考:Linux | 查看用户、用户组 | /etc/passwd详解 | /etc/group详解

/etc/passwd 是一个文本文件,其中包含了登录 Linux 系统所必需的每个用户的信息。它保存用户的有用信息,如
用户名:密码:用户 ID:群组 ID:用户 ID 信息:用户的家目录: Shell

/etc/passwd 文件将每个用户的详细信息写为一行,其中包含七个字段,每个字段之间用冒号 : 分隔

7 个字段的详细信息如下

  1. 用户名 (root): 已创建用户的用户名,字符长度 1 个到 12 个字符。
  2. 密码(x):代表加密密码保存在 `/etc/shadow 文件中。
  3. 用户 ID(0):代表用户的 ID 号,每个用户都要有一个唯一的 ID 。UID 号为 0 的是为 root 用户保留的,UID 号 1 到 99 是为系统用户保留的,UID 号 100-999 是为系统账户和群组保留的。
  4. 群组 ID (0):代表群组的 ID 号,每个群组都要有一个唯一的 GID ,保存在 /etc/group文件中。
  5. 用户信息(root):代表描述字段,可以用来描述用户的信息(LCTT 译注:此处原文疑有误)。
  6. 家目录(/root):代表用户的家目录。
  7. Shell(/bin/bash):代表用户使用的 shell 类型。
    • /bin/bash
      • 账户可登录,登录后使用/bin/bash解释执行脚本
    • /bin/sh
      • 账户可登录,登录后使用/bin/sh解释执行脚本
    • /bin/false
      • 不可登录,不会有任何提示。
    • /usr/sbin/nologin
      • 不可登录,拒绝用户登录。

在排查用户信息时,根据/etc/passwd的内容,其中后来创建的用户其用户id都大于1000,重点排查这些账户。如果不是公司使用的账户,及时和运维确认。

image

/etc/group内容解析

用户组的所有信息都存放在/etc/group文件中。此文件的格式是由冒号(:)隔开若干个字段,这些字段具体如下:
组名:口令:组标识号:组内用户列表

  1. 组名:组名是用户组的名称,由字母或数字构成。与/etc/passwd中的登录名一样,组名不应重复。
  2. 口令:口令字段存放的是用户组加密后的口令字。一般Linux系统的用户组都没有口令,即这个字段一般为空,或者是*。
  3. 组标识号:组标识号与用户标识号类似,也是一个整数,被系统内部用来标识组。别称GID.
  4. 组内用户列表:是属于这个组的所有用户的列表,不同用户之间用逗号(,)分隔。这个用户组可能是用户的主组,也可能是附加组。

密钥篡改

SSH登录有两种方式,一种是账户密码登录,一种是密钥登录。

在每个用户下都存在一个隐藏文件夹,可以在根下使用cd ~/.ssh进入。这个文件夹中存在一个authorized_keys 文件,此文件保存着登录的公钥。如果攻击者将自己的公钥写进文件,那么他就可以通过自己的私钥登录服务器。

vulab@sechelper:~$ cat authorized_keys 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDH9DeY9Ry/8FSlIEKEU/HH2yaPklCf36/ePIW9oS/9i7QklEqvvrPEfhpcSH0by98a+AjktEoUqt3TRLvM4IHtr7/KAP0m8cFyN0wlpvmY2rqwko3kPbaVm4sb8Qxc4IJo/0HjRvTAzNvTzzT7unWLaPZ8vUyrDVooRJWdjwbxpq0wtBvcNci7//145sTocddJDvsnwT7ulE/QIdBWHQdtclUr5zqToSZvslFZHOvoPx34+65R48CrBaucvdBPPslno6FFecQmc0Cy5CSVMr6VM67YdJp/E7RGTyl5M8KlCwXHjEabA9dUaT9oMyoR1Jb1u2m1lZWjAx1PTZ86+22XtskCizG3+hZIdwsSvGwArAhBymnkAsNZso3zqHymbnsnJpZ22FCUs/Gb4YiDjFahC61WsAmfiag6eJwLApfe086QVAcVfSLZQ82ppFRZV79PM+wu2VU0sb1zmj5F97MaF7LbZB4+QPoL9mnpOcRY6Unbs+TFyp7Pp4W8+/HbI5U=

重装覆盖

把SSH服务重新安装,安装带后门的SSH,比如在SSH中植入一个账户,就不会放在系统里,而是存在openssh软件里。

排查方法:

  • 看时间

    ls -lt /usr/bin/ssh /usr/sbin/sshd # 不可靠,时间可以被篡改
    -rwxr-xr-x 1 root root 876328 Dec  2  2021 /usr/sbin/sshd
    -rwxr-xr-x 1 root root 789448 Dec 18  2015 /usr/bin/ssh
    
    vulab@sechelper:~$ sudo touch -a -m -t 201512180130.09 /usr/bin/ssh # 篡改ssh创建时间 
    
  • 看版本

    vulab@sechelper:~$ ssh -V
    OpenSSH_8.2p1 Ubuntu-4ubuntu0.4, OpenSSL 1.1.1f  31 Mar 2020
    如果攻击者精心构造了版本信息,也是无法分辨的。如果没有在系统上简历关键文件的hash或者做安全防护,如安装一些主机安全软件,就有可能造成攻击者的登录。
    
  • openssh-backdoor

  • ssh服务是如何劫持密码

定时任务

参考:linux crontab 定时任务详解

定时任务指定时定点执行Linux程序或脚本。linux内置的cron进程能帮我们实现这些需求

crontab命令是cron table的简写,它是cron的配置文件,也可以叫它作业列表,我们可以在以下文件夹内找到相关配置文件。

  • /var/spool/cron/ 目录下存放的是每个用户包括root的crontab任务,每个任务以创建者的名字命名
  • /etc/crontab 这个文件负责调度各种管理和维护任务。
  • /etc/cron.d/ 这个目录用来存放任何要执行的crontab文件或脚本。
  • 下面这些都是检查重点对象
    • /etc/cron.hourly/ 每小时执行一次的任务
    • /etc/cron.daily/ 每天执行一次的任务
    • /etc/cron.weekly/ 每周执行一次的任务
    • /etc/cron.monthly/ 每月执行一次的任务

crontab创建定时任务

crontab [-u username]    //省略用户表表示操作当前用户的crontab
    -e      (编辑工作表)
    -l      (列出工作表里的命令/查看当前运行的定时任务)
    -r      (删除工作作/删除所有的定时任务)

我们用crontab -e进入当前用户的工作表编辑,然后选择使用vim编辑器打开

image

crontab的命令构成为 时间+动作,其时间有分、时、日、月、周五种,操作符有

  • ***** 取值范围内的所有数字
  • / 每过多少个数字
  • - 从X到Z
  • 散列数字

表达式

image

特殊的取值

* 所有,例如对于 minute 来说,* 等价于 0-59

, 数组,例如 1,3,5

- 段,例如 1-3 等价于 1,2,3

/ 间隔,例如对于 minute 来说,*/2 代表每 2 分钟

它们也可以结合在一起使用,如:1-5/2

特殊的写法

image

例如:

5 0 * * * 每天的 00:05 点

15 14 1 * * 每个月 1 号的 14:15

0 22 * * 1-5 每周从周一到周五 22:00

借助在线的 https://crontab.guru/ 工具,我们就能写出正确的表达式,并且点击 next 还可以看到任务运行的时间点。

多用户管理

linux 系统是一个多用户系统,crontab 也支持多用户,默认使用当前用户,使用 crontab -u username 便可以指定其他用户。

比如 sudo crontab -u root -e 便可编辑 root 用户的配置,不同用户的配置保存在 /var/spool/cron/crontabs 目录下。

image

除此之外,/etc/cron.allow 文件控制哪些用户可以使用 crontab,/etc/cron.deny 文件控制哪些用户不可以使用 crontab。一行一个账户名,已创建的定时任务不受影响

使用/etc/cron.allow 文件可以控制地权限用户无法创建定时任务,如果低权限用户被攻击,也无法创建定时任务。想要解除这个限制,可以直接删除该文件。

系统级的 crontab

/etc/crontab 文件中设置的是一些系统级的定时任务,其中每行都多了一个执行用户,并且直接编辑该文件而不是使用 crontab 命令来管理。

image

问题排查

所有的定时任务都是由 cron 守护进程来负责调度执行的,如果任务未按照你的预期运行,可以通过

systemctl status cron.service

查看守护进程是否 running。

image

使用

journalctl -u cron.service

还可以查看更多的日志信息。

Rootkit

Rootkit是指其主要功能为:隐藏其他程序进程的软件,可能是一个或一个以上的软件组合。在今天,Rootkit一词更多地是指被作为驱动程序,加载到操作系统内核中的恶意软件。

Rootkits是linux/unix获取root权限之后使得攻击者可以隐藏自己的踪迹和保留root访问权限的神器,通常攻击者使用 rootkit的检查系统查看是否有其他的用户登录,如果只有自己,攻击者就开始着手清理日志中的有关信息,通过rootkit的嗅探器还可以获得其他系统的用户和密码

Intel的x86处理器是通过Ring级别来进行访问控制的,级别共分4层,从Ring0到Ring3(后面简称R0、R1、R2、R3)。R0层拥有最高的权限,R3层拥有最低的权限。按照Intel原有的构想,应用程序工作在R3层,只能访问R3层的数据;操作系统工作在R0层,可以访问所有层的数据;而其他驱动程序位于R1、R2层,每一层只能访问本层以及权限更低层的数据。 这应该是很好的设计,这样操作系统工作在最核心层,没有其他代码可以修改它;其他驱动程序工作在R1、R2层,有要求则向R0层调用,这样可以有效保障操作系统的安全性。但现在的OS,包括Windows和Linux都没有采用4层权限,而只是使用2层——R0层和R3层,分别来存放操作系统数据和应用程序数据,从而导致一旦驱动加载了,就运行在R0层,就拥有了和操作系统同样的权限,可以做任何事情,而所谓的rootkit也就随之而生了。实际上,所有的内核代码都拥有根权限,当然,并不一定它们都叫做rootkit,这要看你用它来做什么。R3层的rootkit通过文件完整性检测较容易发现

image

在其他排查方法都不管用的情况下,就要排查一些Rootkit,有可能是被Rootkit隐藏了某些文件或端口。

检查rookit

chkrootkit

sudo apt install chkrootkit # 安装chkrootkit
chkrootkit	#检查rootkit

image

not foundnot infected说明没有检查到rootkit,如果出现了warning或者error说明结果里检测到了rootkit,这种方式只检查一些通用的rootkit

rkhunter

sudo apt install rkhunter # 安装rkhunter

sudo rkhunter --check	#排查

在执行过程中,重点要去看那些Warning,说明被修改过。如果无法判断是否存在问题,可以将排查出来的命令在同版本系统内拷贝一份,删除原有的命令

image

删除隐藏的rootkit

Rootkit同样可以隐藏自身,如果Rootkit在内核模块里找不到,那么就存在删除不掉的可能

  • 如果已知Rootkit名字,直接通过名字删除即可
  • 如果不知道名字,这时候需要将感染系统以文件挂载到其它Linux系统上,进行清除操作。

参考:

posted @ 2022-09-15 19:09  太簇十三  阅读(1194)  评论(0)    收藏  举报