Linux执行命令监控详细实现原理和使用教程,以及相关工具的使用

Linux执行命令监控详细实现原理和使用教程,以及相关工具的使用。

在这里插入图片描述

0x00 背景介绍

Linux上的HIDS需要实时对执行的命令进行监控,分析异常或入侵行为,有助于安全事件的发现和预防。为了获取执行命令,大致有如下方法:

  1. 遍历/proc目录,无法捕获瞬间结束的进程。
  2. Linux kprobes调试技术,并非所有Linux都有此特性,需要编译内核时配置。
  3. 修改glic库中的execve函数,但是可通过int0x80绕过glic库,这个之前360 A-TEAM一篇文章有写到过。
  4. 修改sys_call_table,通过LKM(loadable kernel module)实时安装和卸载监控模块,但是内核模块需要适配内核版本。

确定了Hook点之后,就可以选择Hook方案了,这时有几个选择:
在应用层:

1、在ring3通过/etc/ld.so.preload劫持系统调用
2、二次开发glibc加入监控代码(据说某产品就是这么做监控的)
3、基于调试器思想通过ptrace()主动注入

在应用层做Hook的好处是不受内核版本影响,通用性较好,而且技术难度相对较低,但是缺点更明显,因为ring3层的Hook都是针对glibc库做的监控,只要直接陷入0x80中断,就可以绕过glibc库直接调用系统调用,比如近期分析的某挖矿木马:

在这里插入图片描述

既然应用层的监控行不通,那就看看内核层的监控手段:

1、API Inline Hook
2、sys_call_table Hook
3、IDT Hook
4、利用LSM(Linux Security Module)

API Inline Hook以及IDT Hook操作难度较大,而且兼容性较差,利用LSM监控API虽然性能最好,但是必须编译进内核才能使用,不可以实时安装卸载,而sys_call_table的Hook相对易于操作,作为防御者也可以直接从” /boot/System.map-uname -r ”中直接获取sys_call_table地址,也可以利用LKM(loadable kernel module)技术实现实时安装卸载,所以最后选择在内核层Hook sys_call_table实现监控。

综合上面方案的优缺点,我们选择修改sys_call_table中的execve系统调用,虽然要适配内核版本,但是能100%监控执行的命令。

Linux执行命令监控是一种安全机制,它允许系统管理员跟踪和记录用户在系统上执行的所有命令。这种监控对于确保系统安全、防止滥用和进行事后分析非常重要。以下是Linux执行命令监控的详细实现原理和使用教程。

实现原理

Linux执行命令监控的实现原理主要基于以下几个方面:

  1. 审计系统
    Linux的审计系统(auditd)是一个强大的工具,它可以记录系统调用和关键文件的更改。通过配置审计规则,管理员可以监控特定用户的命令执行情况。

  2. 命令历史记录
    Linux的history命令可以记录用户在终端会话中执行的所有命令。这个功能默认启用,并且可以通过.bash_history文件来查看。

  3. 进程监控
    使用如pstophtop等工具,可以实时监控系统上运行的进程。结合其他工具,如awkgrep,可以过滤出特定用户的进程。

  4. 日志文件
    Linux系统会生成多种日志文件,如/var/log/auth.log记录了用户的登录和注销信息,而/var/log/secure(在某些发行版中)记录了认证相关的事件。

  5. 系统调用跟踪
    通过使用如strace这样的工具,可以监控和记录进程执行的系统调用。这对于理解命令执行的底层行为非常有用。

  6. 文件系统监控
    使用inotify工具可以监控文件系统事件,如文件的创建、修改和删除。这对于跟踪命令对文件系统的影响很有帮助。

使用教程

以下是如何在Linux系统中设置和使用命令监控的教程:

1. 使用auditd监控命令执行
  • 安装auditd

    sudo apt-get install auditd audispd-plugins # Debian/Ubuntu
    sudo yum install auditd audispd-plugins # CentOS/RedHat
    
  • 配置审计规则
    使用auditctl命令添加规则,例如,监控所有用户的sudo命令:

    sudo auditctl -w /usr/bin/sudo -p x -k sudo_rule
    

    这里-w指定要监控的文件或目录,-p x表示监控所有执行权限,-k用于为规则命名。

  • 查看审计日志
    审计日志通常存储在/var/log/audit/audit.log。可以使用ausearch工具来搜索和分析日志:

    sudo ausearch -k sudo_rule
    
2. 查看命令历史记录
  • 查看历史命令

    history
    

    或者查看历史记录文件:

    cat ~/.bash_history
    
  • 配置历史记录
    可以编辑用户的.bashrc.bash_profile文件来更改历史记录的行为,例如,增加历史记录的大小或自动记录命令。

3. 监控进程
  • 实时监控进程

    top
    

    或者使用htop,如果已安装:

    htop
    
  • 过滤特定用户的进程

    ps -u username
    
4. 分析日志文件
  • 查看认证日志
    cat /var/log/auth.log
    
    或者使用lesstail进行分页查看。
5. 使用strace跟踪系统调用
  • 监控特定进程
    strace -p pid
    
    其中pid是要监控的进程ID。
6. 监控文件系统事件
  • 监控特定目录
    inotifywait -m -r /path/to/directory
    
    -m表示监控模式,-r表示递归监控。

Linux执行命令监控是一个涉及多个工具和机制的复杂过程。通过合理配置和使用这些工具,系统管理员可以有效地监控和记录用户的行为,从而提高系统的安全性和可审计性。需要注意的是,监控活动应当遵守相关的隐私和法律规定,确保在合法和道德的框架内进行。

0x01 总体架构

首先sys_execve监控模块,需要替换原有的execve系统调用。在执行命令时,首先会进入监控函数,将日志通过NetLink发送到用户态分析程序(如想在此处进行命令拦截,修改代码后也是可以实现的),然后继续执行系统原生的execve函数。

在这里插入图片描述

0x02 获取sys_call_table地址

获取sys_call_table的数组地址,可以通过/boot目录下的System.map文件中查找。

命令如下:
cat /boot/System.map-uname-r| grep sys_call_table
这种方式比较麻烦,在每次insmod内核模块的时候,需要将获取到的地址通过内核模块传参的方式传入。而且System.map并不是每个系统都有的,删除System.map对于系统运行无影响。

我们通过假设加偏移的方法获取到sys_call_table地址,首先假设sys_call_tale地址为sys_close,然后判断sys_call_table[__NR_close]是否等于sys_close,如果不等于则将刚才的sys_call_table偏移sizeof(void *)这么多字节,直到满足之前的判断条件,则说明找到正确的sys_call_table的地址了。

代码如下:

unsigned long **find_sys_call_table(void) {
    unsigned long ptr;
    unsigned long *p;
    pr_err("Start foundsys_call_table.\n");
        for (ptr = (unsignedlong)sys_close;
         ptr < (unsignedlong)&loops_per_jiffy;
         ptr += sizeof(void*)) {
        p = (unsigned long*)ptr;
        if (p[__NR_close] ==(unsigned long)sys_close) {
            pr_err("Foundthe sys_call_table!!! __NR_close[%d] sys_close[%lx]\n"
                    "__NR_execve[%d] sct[__NR_execve][0x%lx]\n",
                   __NR_close,
                   (unsigned long)sys_close,
                   __NR_execve,
                    p[__NR_execve]);
            return (unsignedlong **)p;
        }  
    }  
        return NULL;
}

0x03 修改__NR_execve地址

即使获取到了sys_call_table也无法修改其中的值,因为sys_call_table是一个const类型,在修改时会报错。因此需要将寄存器cr0中的写保护位关掉,wp写保护的对应的bit位为0x00010000。

代码如下:

unsigned long original_cr0;
original_cr0 = read_cr0();
write_cr0(original_cr0 & ~0x00010000);  #解除写保护
orig_stub_execve = (void *)(sys_call_table_ptr[__NR_execve]);
sys_call_table_ptr[__NR_execve]= (void *)monitor_stub_execve_hook;
write_cr0(original_cr0);        #加上写保护

在修改sys_call_hook[__NR_execve]中的地址时,不只是保存原始的execve的地址,同时把所有原始的系统调用全部保存下载。

void *orig_sys_call_table [NR_syscalls];
for(i = 0; i < NR_syscalls - 1; i ++) {
    orig_sys_call_table[i] =sys_call_table_ptr[i];
}

0x04 Execve进行栈平衡

除了execve之外的其他系统调用,基本只要自定义函数例如:my_sys_write函数,在此函数中预先执行我们的逻辑,然后再执行orig_sys_write函数,参数原模原样传入即可。但是execve不能模仿上面的写法,用以上的方法可能会导致Kernel Panic。
需要进行一下栈平衡,操作如下:

  1. 定义替换原始execve函数的函数monitor_stub_execve_hook
.text
.global monitor_stub_execve_hook
monitor_stub_execve_hook:
  1. 在执行execve监控函数之前,将原始的寄存器进行入栈操作:
pushq   %rbx
pushq   %rdi
pushq   %rsi
pushq   %rdx
pushq   %rcx
pushq   %rax
pushq   %r8
pushq   %r9
pushq   %r10
pushq   %r11
  1. 执行监控函数并Netlink上报操作:
    call monitor_execve_hook

  2. 入栈的寄存器值进行出栈操作

pop     %r11
pop     %r10
pop     %r9
pop     %r8
pop     %rax
pop     %rcx
pop     %rdx
pop     %rsi
pop     %rdi
pushq   %rbx
  1. 执行系统的execve函数
    jmp *orig_sys_call_table(, %rax, 8)

0x05 执行命令信息获取

监控执行命令,如果用户态使用的是相对路径执行,此模块也需要获取出全路径。通过getname()函数获取执行文件名,通过open_exec()和d_path()获取出执行文件全路径。通过current结构体变量获取进程pid,父进程名,ppid等信息。同时也获取运行时的环境变量中PWD,LOGIN相关的值。
最终将获取到的数据组装成字符串,用ascii码值为0x1作为分隔符,通过netlink_broadcast()发送到到用户态分析程序处理。

0x06 监控效果

在加载内核模块,在用户态执行netlink消息接收程序。然后使用相对路径执行命令./t my name is xxxx,然后查看用户态测试程序获取的数据。

在这里插入图片描述
在这里插入图片描述

0x07 版本支持及代码

支持内核版本:2.6.32, >=3.10.0
源代码路径:https://github.com/ysrc/yulong-hids/tree/master/syscall_hook

在Linux系统中,有多种工具可以用来监控执行命令,这些工具可以帮助系统管理员跟踪用户行为、审计系统操作或进行安全分析。以下是20个用于监控Linux执行命令的工具,以及它们的访问链接:

  1. auditd - Linux审计守护进程

    • 访问链接: https://www.linux-audit.com/
  2. syslog-ng - 灵活的日志管理工具

    • 访问链接: https://www.syslog-ng.com/
  3. rsyslog - 用于日志处理的系统服务

    • 访问链接: http://www.rsyslog.com/
  4. logrotate - 管理日志文件的轮换、压缩和删除

    • 访问链接: https://github.com/logrotate/logrotate
  5. logwatch - 监视系统日志并生成报告

    • 访问链接: https://sourceforge.net/projects/logwatch/
  6. Swatch - 监视系统日志文件的变化

    • 访问链接: http://swatch.sourceforge.net/
  7. Glog - C++日志库,支持日志监控

    • 访问链接: https://github.com/google/glog
  8. Logstash - 收集、解析和丰富日志数据

    • 访问链接: https://www.elastic.co/de/products/logstash
  9. Filebeat - 轻量级日志文件收集器

    • 访问链接: https://www.elastic.co/de/products/beats/filebeat
  10. GoAccess - 实时日志分析器和交云式查看器

    • 访问链接: https://goaccess.io/
  11. Graylog - 强大的日志管理平台

    • 访问链接: https://www.graylog.org/
  12. Fluentd - 开源数据收集器

    • 访问链接: https://www.fluentd.org/
  13. Prometheus - 监控系统和应用程序的时间序列数据库

    • 访问链接: https://prometheus.io/
  14. Netdata - 性能监控和可视化工具

    • 访问链接: https://www.netdata.cloud/
  15. Zabbix - 企业级监控解决方案

    • 访问链接: https://www.zabbix.com/
  16. Nagios - 监控系统、网络和基础设施

    • 访问链接: https://www.nagios.org/
  17. Icinga - 监控系统,Nagios的分支

    • 访问链接: https://www.icinga.com/
  18. Puppet - 配置管理平台,可以用于监控配置变更

    • 访问链接: https://puppet.com/
  19. Chef - 自动化平台,用于管理服务器和应用程序

    • 访问链接: https://www.chef.io/
  20. Ansible - 自动化工具,可以用于监控和执行任务

    • 访问链接: https://www.ansible.com/

请注意,上述工具的使用应遵守法律法规,并在获得授权的情况下进行。这些工具主要用于教育和安全研究目的,以提高系统的安全性。在使用这些工具时,应确保不侵犯他人的隐私和权益。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/553511.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL-笔记-06.数据高级查询

目录 6.1 连接查询 6.1.1 交叉连接&#xff08;cross join&#xff09; 6.1.2 内连接&#xff08;inner join&#xff09; 6.1.3 外连接&#xff08;outer join&#xff09; 6.1.3.1 左外连接&#xff08;left [outer] join&#xff09; 6.1.3.2 右外连接&#xff08;rig…

第2章:车辆纵向控制

2.1 车辆纵向动力学模型 注&#xff1a;车辆的纵向控制是指控制车辆行驶方向上的加减速&#xff0c;使得汽车可以按照期望的速度行驶&#xff0c;并保持安全的前后车距&#xff08;即对汽车油门 / 刹车的控制&#xff09;&#xff1b; 2.1.1 车辆纵向受力模型 &#xff1a;轮胎…

SpringBootSpringCloud升级可能会出现的问题

1.背景 之前负责过我们中台的SpringBoot和Cloud的升级&#xff0c;特次记录分享一下项目中可能出现的问题&#xff0c;方便后续的人快速定位问题。以及下述选择的解决方案都是基于让升级的服务影响和改动最小以及提供通用的解决方案的提前进行选择的。 1.1版本说明 升级前&a…

OpenCV基本图像处理操作(十)——图像特征harris角点

角点 角点是图像中的一个特征点&#xff0c;指的是两条边缘交叉的点&#xff0c;这样的点在图像中通常表示一个显著的几角。在计算机视觉和图像处理中&#xff0c;角点是重要的特征&#xff0c;因为它们通常是图像中信息丰富的区域&#xff0c;可以用于图像分析、对象识别、3D…

JavaSE中的String类

1.定义方式 常见的三种字符串构造 public class Test1 {public static void main(String[] args) {// 使用常量串构造String str1 "abc";System.out.println(str1);// 直接newString对象String str2 new String("ABC");System.out.println(str2);// 使用…

【Linux学习】Linux指令(四)

文章标题 &#x1f680;zip/unzip指令&#xff1a;&#x1f680;tar指令&#xff08;重要&#xff09;&#xff1a;&#x1f680;uname –r指令&#xff1a;&#x1f680;关机指令&#x1f680;几个常用操作 &#x1f680;zip/unzip指令&#xff1a; zip 与 unzip的安装 yum i…

Day20-【Java SE高级】单元测试 反射 注解 动态代理

一、单元测试 就是针对最小的功能单元(方法)&#xff0c;编写测试代码对其进行正确性测试。 1. 咱们之前是如何进行单元测试的?有啥问题? 只能在main方法编写测试代码&#xff0c;去调用其他方法进行测试。无法实现自动化测试&#xff0c;一个方法测试失败&#xff0c;可能…

学习在Debian系统上安装Shadowsocks教程

学习在Debian系统上安装Shadowsocks教程 安装shadowsocks-libev及其所需的依赖启动Shadowsocks服务&#xff1a;如果你想要通过代理本地流量&#xff0c;你可以使用ss-local&#xff1a;启动并设置ss-local&#xff1a;查看状态本地连接 安装shadowsocks-libev及其所需的依赖 …

量化交易为什么独宠Python

“我在学一门叫Python的语言”。“什么是Python&#xff0c;没听说过啊&#xff0c;为什么不学C啊”。这是发生在2014年&#xff0c;上海的一家量化基金&#xff0c;量化研究员和老板之间的对话。 “我想问一下关于Python的课程&#xff0c;什么时候能开班”。“Python啊&#…

数据结构-栈和队列刷题集(长期更新)

文章目录 万能计算器的实现以及源码分析1. leetcode 150 逆波兰表达式求值 万能计算器的实现以及源码分析 /*** 我们尝试写一个完整版的计算器,由于计算机不能很好的识别括号,所以一般要转换为逆波兰表达式求解* 思路解析 :* 1. 输入一个 中缀表达式* 2. 中缀表达式转化为list…

Python 数据结构和算法实用指南(一)

原文&#xff1a;zh.annas-archive.org/md5/66ae3d5970b9b38c5ad770b42fec806d 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 前言 数据结构和算法是信息技术和计算机科学工程学习中最重要的核心学科之一。本书旨在提供数据结构和算法的深入知识&#xff0c;以及编程…

28岁转行嵌入式适合转嵌入式吗?

转行到嵌入式领域是一个很好的选择&#xff0c;特别是如果你对电子技术、嵌入式系统和软硬件交互感兴趣的话。我这里有一套嵌入式入门教程&#xff0c;不仅包含了详细的视频 讲解&#xff0c;项目实战。如果你渴望学习嵌入式&#xff0c;不妨点个关注&#xff0c;给个评论222&a…

信息系统项目管理师0054:运维和服务(4信息系统管理—4.1管理方法—4.1.4运维和服务)

点击查看专栏目录 文章目录 4.1.4运维和服务1.运行管理和控制2.IT服务管理3.运行与监控4.终端侧管理5.程序库管理6.安全管理7.介质控制8.数据管理4.1.4运维和服务 信息系统的运维和服务应从信息系统运行的视角进行整合性的统筹规划,包括对信息系统、应用程序和基础设施的日常控…

C语言的OJ判题机设计与实现

1. 接收判题入参 判题需要作答代码、测试输入和期望输出、编译器名称、时空限制。对于支持special judge的还需要传入是否为sj和sj代码。推荐使用消息队列&#xff0c;应对高并发的比赛情况会比较好。 但是消息队列是异步的&#xff0c;我为了快点实现能提交后在当前页面获得判…

Elasticsearch:(一)ES简介

搜索引擎是什么&#xff1f;在不少开发者眼中&#xff0c;ES似乎就是搜索引擎的代名词&#xff0c;然而这实际上是一种误解。搜索引擎是一种专门用于从互联网中检索信息的技术工具&#xff0c;它主要可以划分为元搜索引擎、全文搜索引擎和垂直搜索引擎几大类。其中&#xff0c;…

AIGC算法1:Layer normalization

1. Layer Normalization μ E ( X ) ← 1 H ∑ i 1 n x i σ ← Var ⁡ ( x ) 1 H ∑ i 1 H ( x i − μ ) 2 ϵ y x − E ( x ) Var ⁡ ( X ) ϵ ⋅ γ β \begin{gathered}\muE(X) \leftarrow \frac{1}{H} \sum_{i1}^n x_i \\ \sigma \leftarrow \operatorname{Var}(…

【中级软件设计师】上午题08-UML(下):序列图、通信图、状态图、活动图、构件图、部署图

上午题08-UML 1 序列图2 通信图3 状态图3.1 状态和活动3.2 转换和事件 4 活动图5 构件图&#xff08;组件图&#xff09;6 部署图 【中级软件设计师】上午题08-UML(上)&#xff1a;类图、对象图、用例图 UML图总和 静态建模&#xff1a;类图、对象图、用例图 动态建模&#xff…

【简单介绍下PostCSS】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

仿真测试的应用领域

仿真测试在各种领域中都有广泛的应用&#xff0c;以下是一些应用最广泛的场景&#xff1a; 工业制造&#xff1a;通过模拟制造过程&#xff0c;可以预测产品的质量和性能&#xff0c;优化生产流程&#xff0c;降低成本。航空航天&#xff1a;飞机、导弹、航天器等的设计和研发…

AWS Key disabler:AWS IAM用户访问密钥安全保护工具

关于AWS Key disabler AWS Key disabler是一款功能强大的AWS IAM用户访问密钥安全保护工具&#xff0c;该工具可以通过设置一个时间定量来禁用AWS IAM用户访问密钥&#xff0c;以此来降低旧访问密钥所带来的安全风险。 工具运行流程 AWS Key disabler本质上是一个Lambda函数&…
最新文章