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

本文主要是介绍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/

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

这篇关于Linux执行命令监控详细实现原理和使用教程,以及相关工具的使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/897208

相关文章

linux生产者,消费者问题

pthread_cond_wait() :用于阻塞当前线程,等待别的线程使用pthread_cond_signal()或pthread_cond_broadcast来唤醒它。 pthread_cond_wait() 必须与pthread_mutex 配套使用。pthread_cond_wait()函数一进入wait状态就会自动release mutex。当其他线程通过pthread

C语言中联合体union的使用

本文编辑整理自: http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=179471 一、前言 “联合体”(union)与“结构体”(struct)有一些相似之处。但两者有本质上的不同。在结构体中,各成员有各自的内存空间, 一个结构变量的总长度是各成员长度之和。而在“联合”中,各成员共享一段内存空间, 一个联合变量

C++对象布局及多态实现探索之内存布局(整理的很多链接)

本文通过观察对象的内存布局,跟踪函数调用的汇编代码。分析了C++对象内存的布局情况,虚函数的执行方式,以及虚继承,等等 文章链接:http://dev.yesky.com/254/2191254.shtml      论C/C++函数间动态内存的传递 (2005-07-30)   当你涉及到C/C++的核心编程的时候,你会无止境地与内存管理打交道。 文章链接:http://dev.yesky

揭秘未来艺术:AI绘画工具全面介绍

📑前言 随着科技的飞速发展,人工智能(AI)已经逐渐渗透到我们生活的方方面面。在艺术创作领域,AI技术同样展现出了其独特的魅力。今天,我们就来一起探索这个神秘而引人入胜的领域,深入了解AI绘画工具的奥秘及其为艺术创作带来的革命性变革。 一、AI绘画工具的崛起 1.1 颠覆传统绘画模式 在过去,绘画是艺术家们通过手中的画笔,蘸取颜料,在画布上自由挥洒的创造性过程。然而,随着AI绘画工

墨刀原型工具-小白入门篇

墨刀原型工具-小白入门篇 简介 随着互联网的发展和用户体验的重要性越来越受到重视,原型设计逐渐成为了产品设计中的重要环节。墨刀作为一款原型设计工具,以其简洁、易用的特点,受到了很多设计师的喜爱。本文将介绍墨刀原型工具的基本使用方法,以帮助小白快速上手。 第一章:认识墨刀原型工具 1.1 什么是墨刀原型工具 墨刀是一款基于Web的原型设计工具,可以帮助设计师快速创建交互原型,并且可以与团队

Linux 安装、配置Tomcat 的HTTPS

Linux 安装 、配置Tomcat的HTTPS 安装Tomcat 这里选择的是 tomcat 10.X ,需要Java 11及更高版本 Binary Distributions ->Core->选择 tar.gz包 下载、上传到内网服务器 /opt 目录tar -xzf 解压将解压的根目录改名为 tomat-10 并移动到 /opt 下, 形成个人习惯的路径 /opt/tomcat-10

Tolua使用笔记(上)

目录   1.准备工作 2.运行例子 01.HelloWorld:在C#中,创建和销毁Lua虚拟机 和 简单调用。 02.ScriptsFromFile:在C#中,对一个lua文件的执行调用 03.CallLuaFunction:在C#中,对lua函数的操作 04.AccessingLuaVariables:在C#中,对lua变量的操作 05.LuaCoroutine:在Lua中,

RecastNavigation之Poly相关类

Poly分成正常的Poly 和 OffMeshPoly。 正常的Poly 又分成 原始的Poly 和 Detail化的Poly,本文介绍这两种。 Poly的边分成三种类型: 1. 正常边:有tile内部的poly与之相邻 2.border边:没有poly与之相邻 3.Portal边:与之相邻的是外部tile的poly   由firstLink索引 得到第一个连接的Poly  通

RedHat运维-Linux文本操作基础-AWK进阶

你不用整理,跟着敲一遍,有个印象,然后把它保存到本地,以后要用再去看,如果有了新东西,你自个再添加。这是我参考牛客上的shell编程专项题,只不过换成了问答的方式而已。不用背,就算是我自己亲自敲,我现在好多也记不住。 1. 输出nowcoder.txt文件第5行的内容 2. 输出nowcoder.txt文件第6行的内容 3. 输出nowcoder.txt文件第7行的内容 4. 输出nowcode

【Linux进阶】UNIX体系结构分解——操作系统,内核,shell

1.什么是操作系统? 从严格意义上说,可将操作系统定义为一种软件,它控制计算机硬件资源,提供程序运行环境。我们通常将这种软件称为内核(kerel),因为它相对较小,而且位于环境的核心。  从广义上说,操作系统包括了内核和一些其他软件,这些软件使得计算机能够发挥作用,并使计算机具有自己的特生。这里所说的其他软件包括系统实用程序(system utility)、应用程序、shell以及公用函数库等