应急响应篇——Linux进程排查

2024-06-17 15:12:11 浏览数 (2)

Linux的进程排查总体思路和windows的不会偏差太多,具体到细则上存在差异,今天就和师傅们来探讨下Linux下的进程分析及排查。

  • 命令查看进程

由于Linux系统特性,命令通行系统,这里只需要记住两条命令就够了:

代码语言:javascript复制
ps -查看进程

具体命令用法在网上抄了给大家参考:

a 显示所有进程

-a 显示一个终端的所有进程,除了会话引线

-A 显示所有进程,等同于-e

-m 显示所有的线程

-o 用户自定义格式

c 显示进程的真实名称

-e 显示所有进程,等于“-A”

e 显示环境变量

f 显示程序间的关系

-H 显示树状结构

r 显示当前终端的进程

T 显示与此终端关联的所有进程。等同于 t (不带任何参数)

u 指定用户的所有进程

-au 显示较详细的资讯

-aux 显示所有包含其他使用者的行程

-C<命令> 列出指定命令的状况

–lines<行数> 每页显示的行数

–width<字符数> 每页显示的字符数

Up呢在环境里小试了一下反弹shell,配合grep搜索关键字很轻松就能找出来了。

所以相对来说Linux的进程排查思路可以收缩一些,不会像Windows那样及其需要发散思维。一样的,将Linux白进程分享给大家,留在文章结尾,先排除无影响的白进程再去对剩下的可疑进程逐个分析提高效率,师傅们需要的自取。

代码语言:javascript复制
Top -实时查看系统状况

一样抄了具体参数来给大家参考:

-b 批处理

-c 显示完整的治命令

-I 忽略失效过程

-s 保密模式

-S 累积模式

-i<时间> 设置间隔时间

-u<用户名> 指定用户名

-p<进程号> 指定进程

-n<次数> 循环显示的次数

运行截图:

一目了然,主要配合排查一些僵尸木马、挖矿病毒等会造成硬件资源占用异常的情况,一个静态一个动态,配合分析效率更高。

  • 排查思路详解

由于篇幅原因up不可能很详细的手把手和大家走一遍完整的流程、讨论完所有细节和变数,因为实际出现状况的时候是不可能和预想中的一模一样的,需要各位大师傅们随机应变。Up在这里呢浅浅结合了工作经验给大家分享一下我自己的思路,和大家走一遍流程:

①确定告警类型

最重要的一点,开始前绝对要明确自己要应急响应些什么,总有消息来源:发生什么了?在哪发生的?消息来源是哪里?这些信息总要对的上再开始应急响应,不可能甲方半夜爬起来没事做让你做个应急响应吧?

②根据告警类型对可疑进程进行排查

一般来说能打进来的,九成九的情况都是木马外联告警了,且大部分情况下不要说木马路径,连木马文件名可能都不一定能获取到(消息来源问题),根据已知的消息和服务器状况进行信息整合:(这篇帖子既然针对Linux那就不写操作系统分析了)服务器搭载了什么类型的服务?什么中间件?什么数据库?什么编程语言环境?来确定木马类型(但根据经验Linux中招了一般都是aspx接内存马了或者别的大马了),大致确认后对进程进行搜索,搜索木马类型、木马名称,定位至进程后根据pid查到外联端口号(根据只要他还连着就能根据端口号定位到外联IP,或者有日志审计的话在日志审计能查到、中间件日志也会有,排查起来就费心思了,下篇再细说),然后断掉进程。

③对攻击者手段进行追溯

断掉威胁优于排查入侵路径,这点是必须要明确的,先清除影响再进行深入排查。系统类型是明确的,如果是能中马到机器上先确定服务器类型,如果是后端的数据库,先排查sql注入的可能(但这个态感不太可能报不出来啊),排查弱口令(因为数据库不可能对公网开放,可能是别的服务器中了马再进行弱口令爆破)、未授权(尤其针对redis、Oracle、mongdb);如果是业务服务器,优先排查文件上传、后台未授权、越权等漏洞,以及通用漏洞等;别的类型的服务器优先排查通用漏洞,先吃透已有信息,再进行分析。

④对其他可疑进程进行排查

主要针对可能存在的横向行为、提权行为和权限维持行为等,首先排查history,是否存在黑客操作记录,如第一张图,可以排查反弹shell进程是否存在;其次是排查ssh连接记录,是否有已被当成跳板机的可能性;然后是排查所有用户、所有敏感文件夹权限,排查用户不必多说,观察是否被创建了高权限用户或是可疑新增用户,而敏感文件夹权限是以防攻击者赋予低权限用户访问修改某些文件夹的高权限,隐蔽维持权限,让安全运维人员掉以轻心。

  • 总结

简单分析,欢迎各位师傅补充。附上Linux白进程(同时附上原文连链接):

系统默认进程

systemd Systemd 可以管理所有系统资源。不同的资源统称为 Unit(单位)。Unit 一共分成12种。systemctl list-units命令可以查看当前系统的所有 Unit

kthreadd kthreadd进程由idle通过kernel_thread创建,并始终运行在内核空间, 负责所有内核线程的调度和管理,它的任务就是管理和调度其他内核线程kernel_thread

这种内核线程只有一个,它的作用是管理调度其它的内核线程。

它在内核初始化的时候被创建,会循环运行一个叫做kthreadd的函数,该函数的作用是运行kthread_create_list全局链表中维护的kthread。可以调用kthread_create创建一个kthread,它会被加入到kthread_create_list链表中,同时kthread_create会weak up kthreadd_task。kthreadd在执行kthread会调用老的接口——kernel_thread运行一个名叫“kthread”的内核线程去运行创建的kthread,被执行过的kthread会从kthread_create_list链表中删除,并且kthreadd会不断调用scheduler 让出CPU。这个线程不能关闭。

kworker "kworker" 是 Linux 内核的工作线程,用于异步处理工作队列中的任务。这些任务包括处理硬件中断、文件系统事件、管理系统内存等

ksoftirqd 在Linux内核中,ksoftirqd是一个专门用于处理软中断的线程。软中断是CPU在执行中断服务程序(ISR)期间产生的一种特殊事件,用于处理一些需要尽快完成的任务。ksoftirqd线程与硬中断处理线程(例如中断处理程序或底半部处理程序)共同协作,确保系统能够高效地响应各种硬件事件。

migration 进程迁移就是将一个进程从当前位置移动到指定的处理器上。它的基本思想是在进程执行过程中移动它,使得它在另一个计算机上继续存取它的所有资源并继续运行,而且不必知道运行进程或任何与其它相互作用的进程的知识就可以启动进程迁移操作,这意味着迁移是透明的。

这种内核线程共有32个,从migration/0到migration/31,每个处理器核对应一个migration内核线程,主要作用是作为相应CPU核的迁移进程,用来执行进程迁移操作,内核中的函数是migration_thread()

属于2.6内核的负载平衡系统,该进程在系统启动时自动加载(每个 cpu 一个),并将自己设为 SCHED_FIFO 的实时进程,然后检查 runqueue::migration_queue 中是否有请求等待处理,如果没有,就在 TASK_INTERRUPTIBLE 中休眠,直至被唤醒后再次检查。migration_thread() 仅仅是一个 CPU 绑定以及 CPU 电源管理等功能的一个接口。这个线程是调度系统的重要组成部分。

rcu_bh RCU锁机制。首先我们从概念上理解下什么叫RCU,其中读(Read):读者不需要获得任何锁就可访问RCU保护的临界区;拷贝(Copy):写者在访问临界区时,写者“自己”将先拷贝一个临界区副本,然后对副本进行修改;更新(Update):RCU机制将在在适当时机使用一个回调函数把指向原来临界区的指针重新指向新的被修改的临界区,锁机制中的垃圾收集器负责回调函数的调用。总结即是读-拷贝-更新。

rcu_sched

lru-add-drain

watchdog WatchDog是一种电子或软件定时器,用于检测计算机故障,并从计算机故障中恢复。在正常操作期间,计算机会定期重置看门狗计时器,以防止其丢失或“计时”。如果由于硬件故障或程序错误而导致计算机无法重置看门狗,则计时器将丢失并生成超时信号, 超时信号会被用于启动一个或多个纠正措施。纠正措施通常包括将计算机系统置于安全状态并恢复系统的正常运行。

这种内核线程共有32个,从watchdog/0到watchdog/31, 每个处理器核对应一个watchdog 内核线程,watchdog用于监视系统的运行,在系统出现故障时自动重新启动系统,包括一个内核 watchdog module 和一个用户空间的 watchdog 程序。

在Linux 内核下, watchdog的基本工作原理是:当watchdog启动后(即/dev/watchdog设备被打开后),如果在某一设定的时间间隔(1分钟)内/dev/watchdog没有被执行写操作, 硬件watchdog电路或软件定时器就会重新启动系统,每次写操作会导致重新设定定时器。

netns Network Namespace (以下简称netns)是Linux内核提供的一项实现网络隔离的功能,它能隔离多个不同的网络空间,并且各自拥有独立的网络协议栈,这其中便包括了网络接口(网卡),路由表,iptables规则等。例如大名鼎鼎的docker便是基于netns实现的网络隔离,今天我们就来手动实验一下netns的隔离特性。

kdevtmpfs

khungtaskd kdevtmpfsi 是一个挖矿病毒,大多数都是 redis 程序侵入,其利用Redis未授权或弱口令作为入口,使用主从同步的方式从恶意服务器上同步恶意module,之后在目标机器上加载此恶意module并执行恶意指令。

writeback writeback进程是Linux内核中的一个常驻内存的线程,负责将dirty的数据刷新到磁盘。在Linux内核中有一个常驻内存的线程bdi_forker_thread,该线程负责为bdi_object创建writeback线程,同时检测如果writeback线程长时间处于空闲状态,bdi_forker_thread线程便会将其进行销毁。writeback线程被创建之后会处理等待的work。当以dirtyable memory作为ratio的基数计算得到的“脏页面”数目超过dirty limit,进程将阻塞进行同步的writeback,以避免其继续产生更多的dirty page。一个改进的做法是将「同步」变为「异步」:超过阈值后,强制进程(dirtier)休眠,由background的flusher thread来处理writeback

kintegrityd 云主机 野进程kintegrityds大量占cpu资源, 安全

bioset 很感谢腾讯云客服的排查,最终锁定了“bioset”。系统由于被感染的文件较多,Linux静态链接库被劫持,挖矿的进程被隐藏,所以直接是看不到的,最终我选择了将业务打包迁移后重装系统了。

kblockd 这种内核线程共有32个,从kblockd/0到kblockd/31, 每个处理器核对应一个 kblockd 内核线程。用于管理系统的块设备,它会周期地激活系统内的块设备驱动。如果拥有块设备,那么这些线程就不能被去掉。

md

edac-poller EDAC:主要用来检测物理内存 和 PCI硬件错误

kswapd0 kswapd0是一个挖矿病毒的进程,可能与tke搭建k8s平台或者安装docker的过程有关。本文介绍了如何通过检查进程信息、根源、用户、cron等方式找出和清除kswapd0和rsync进程,并提供了一个可行的脚本检查

ksmd 作为一个系统管理程序(hypervisor),Linux 有几个创新,2.6.32 内核中一个有趣的变化是 KSM(Kernel Samepage Merging) 允许这个系统管理程序通过合并内存页面来增加并发虚拟机的数量。本文探索 KSM 背后的理念(比如存储去耦合)、KSM 的实现、以及如何管理 KSM。

khugepaged 处理大内存的性能关键计算应用程序工作集已经运行在libhugetlbfs之上,然后依次运行 hugetlbfs。透明的巨型页面支持是另一种使用大页为虚拟内存提供大页支持的方法, 该支持自动提升和降低页面大小和没有hugetlbfs的缺点。

crypto 在Linux内核中提供了加密API,通过一组头文件crypto引出。整体的思路为首先创建加密上下文,并且在上下文中注册使用的算法,最后使用内核API完成加解密的操作。这里以散列计算和对称加密为例。

kthrotld kthread进程由idle通过kernel_thread ()创建,并始终运行在内核空间,负责所有内核线程的调度和管理。kthread进程负责管理和调度其他内核线程,所有的内核线程都直接或间接以kthread为父进程。我们利用ps和pstree来观察一下CentOS6.10系统上的进程。

kmpath_rdacd

kaluad kaluad是SCSI多径ALUA (非对称逻辑单元分配) 工作队列。它用于处理延迟的工作--基本上,每当一个操作产生“重试”结果时,就会将它添加到工作队列中,以便以后处理(在上面链接的源代码中查找

kpsmoused 是Linux内核中的一个驱动程序,用于支持PS/2鼠标设备。它负责处理PS/2鼠标的输入事件,并将其转换为用户空间可读取的数据。

ipv6_addrconf

deferwq

kauditd

ata_sff

scsi_eh_0

scsi_tmf_0

scsi_eh_1

scsi_tmf_1

ttm_swap

kdmflush

xfsalloc

xfs_mru_cache

xfs-buf/dm-0

xfs-data/dm-0

xfs-conv/dm-0

xfs-cil/dm-0

xfs-cil/dm-0

xfs-reclaim/dm-

xfs-log/dm-0

xfs-eofblocks/d

xfsaild/dm-0

kworker/1:1H

hwrng

kvm-irqfd-clean

kworker

xfs-buf/vda1

xfs-data/vda1

xfs-conv/vda1

events 这种内核线程共有32个,从events/0到events/31, 每个处理器核对应一个 events内核线程。用来处理内核事件很多软硬件事件(比如断电,文件变更)被转换为events,并分发给对相应事件感兴趣的线程进行响应。

rpciod 这种内核线程共有32个,从rpciod/0到rpciod/31, 每个处理器核对应一个rpciod内核线程,主要作用是作为远过程调用服务的守护进程,用于从客户端启动I/O服务,通常启动NFS服务时要用到它。

原文链接:https://blog.csdn.net/shunzi2016/article/details/138820080

0 人点赞