鸣  谢


VSRC感谢业界小伙伴——老陈投稿精品原创类文章。VSRC欢迎精品原创类文章投稿,优秀文章一旦采纳发布,将有好礼相送,我们为您准备的丰富奖品包括但不仅限于:MacbookAir、VSRC定制雨伞,VSRC定制水杯以及VSRC定制充电宝!(活动最终解释权归VSRC所有)

本文档将介绍:如何通过Linux审计系统auditd监测WebShell执行系统命令的行为。

测试环境:CentOS7.0_x64

auditd简介


Linux审计系统提供了一种跟踪系统上与安全相关的信息的方法。基于预先配置的规则,审核生成日志条目以记录尽可能多的关于系统上发生的事件信息。

auditd(或auditd守护进程)是Linux系统中重要的内核审计组件,其负责将审计记录写入磁盘。使用auditd可以实现如下场景的审计监控:

•      监控文件访问

•      监控系统调用

•      记录用户命令执行

•      记录安全事件

•      执行审计搜索

•      统计概要报表

•      监控网络访问

Linux审计系统架构如下图所示:

通常我们使用auditctl用来查看和控制auditd的审计行为,获取审计日志,添加或删除审计规则。如果你希望审计配置在系统重启后仍然有效,请通过系统文件/etc/audit/audit.rules进行持久化配置。

配置auditd实现进程审计监控

以root身份执行如下命令,可实现对执行系统命令这一个SYSCALL行为的监控审计。

# auditctl -D # 用于测试,清除已有规则

# auditctl -a always,exit -F arch=b64 -S execve -k rule01_exec_command

上述命令在系统审计规则中增加了一条命令执行监控规则,并且定义规则名为rule01_exec_command。

查看auditd的日志文件/var/log/audit/audit.log,可以看到该配置命令本身也产生了日志:

其中1506925689.197为审计日志的时间戳,对应2017/10/214:28:09698444为日志消息ID。

完成上述配置后,我们就可以对操作系统命令执行进行有效审计啦!

WebShell执行系统命令的监测

1、部署和执行WebShell

在网站目录/opt/www/php/部署WebShell程序shell.php,访问地址为https://example.com/shell.php。模拟黑客向该WebShell程序发起一次请求,执行系统命令:cat /etc/passwd。WebShell成功之行命令后,返回结果如下图所示:

2、查看和分析auditd审计日志

执行命令tail -f /var/log/audit/audit.log,同步查看auditd审计日志。有两组msg日志,消息id分别是:698520和698521。我们重点分析698520,先看日志内容:

上述5条消息同属于一组日志,来自规则rule01_exec_command,类型分别是:SYSCALL、EXECVE、CWD、PATH、PATH。其中,前三条日志有极高的价值。

•      type=SYSCALL:日志规则“rule01_exec_command”被触发,uid=996的用户,通过父进程ppid=18259,调用/usr/bin/bash,执行了命令sh,进程pid=13545。

•      type=SYSCALLtype=EXECVE都能看到执行的程序名称和参数

•      type=CWD则说明了,命令执行所在的目录cwd="/opt/www/php"

请注意EXECVE中出现的十六进制字符串a2=636174202F6574632F706173737764,实际为命令执行的参数。很可能,审计系统为了尽快完成日志记录,未对字符串进行翻译。将其转换后,对应的ASCII字符串是:cat /etc/passwd

第二组日志如下,主要是针对命令cat /etc/passwd的审计。基本逻辑如上,不再赘述。

3、深入分析进程及文件关系

查看当前操作系统中Web系统nginx、php-fpm相关的进程信息,如下:

注意,php-fpm: pool www就是执行WebShell命令的工作进程!

结合Web日志的内容和时间信息,我们很容易定位到WebShell的路径为操作系统文件/var/www/php/shell.php

4、梳理小结

经过对auditd日志分析,并结合操作系统进程信息、Nginx日志,可对本次WebShell执行系统命令的行为进行回溯,细节如下:

http://example.com/shell.php?cmd=cat /etc/passwd该Url触发了Nginx服务器对php-fpm的调用。对应的文件在Web目录/opt/www/php

WebShell执行系统命令过程中的进程调用关系如下:

总结&思考

至此,我们完成了基于auditd实现的WebShell执行系统命令的审计监控,希望对大家有帮助。当然,本文只是针对某个技术点应用的概念验证,如果你希望将其产品化实现,可能还需要考虑如下问题:

•      实时收集操作系统进程和进程PID等信息

•      主动识别Web进程和Web目录信息

•      对audit.log日志文件进行采集,发送到远程服务器进行收集

•      采集和关联分析Web访问日志

•      部署自研或第三方日志管理系统对进程信息进行分析

•      深入学习和理解auditd的运行机制和参数配置

•      合理配置auditd的运行参数,准确评估审计功能对系统性能的影响

•      Windows平台是否有同样的检测机制?

基于auditd的审计信息对于关键任务环境来说是至关重要的,可以用于确定安全策略的违反和审计用户操作行为。审计本身不会为您的系统提供额外的安全性;但它可以用于发现违背安全策略的行为。

auditd的功能很强大,本文只是从一个很小的功能模块进行安全应用探索,更多功能和应用场景期待各位同行的发挥!有时候,立足系统自身,也能有不错的收获。

1、关于SYSCALL

上述配置命令中使用 -S execve实现了对命令执行这一SYSCALL的监控,也可以使用 -S 59作为参数实现。执行系统命令ausyscall --dump可以查看auditd支持的所有SYSCALL选项。仔细看,你一定会有意外收获:)

[root@localhost ~]# ausyscall --dump

Using x86_64 syscall table:

0       read
1       write
2       open
3       close
4       stat
5       fstat
6       lstat
7       poll
8       lseek
9       mmap
10      mprotect
11      munmap
12      brk
13      rt_sigaction
14      rt_sigprocmask
15      rt_sigreturn
16      ioctl
17      pread
18      pwrite
19      readv
20      writev
21      access
22      pipe
23      select
24      sched_yield
25      mremap
26      msync
27      mincore
28      madvise
29      shmget
30      shmat
31      shmctl
32      dup
33      dup2
34      pause
35      nanosleep
36      getitimer
37      alarm
38      setitimer
39      getpid
40      sendfile
41      socket
42      connect
43      accept
44      sendto
45      recvfrom
46      sendmsg
47      recvmsg
48      shutdown
49      bind
50      listen
51      getsockname
52      getpeername
53      socketpair
54      setsockopt
55      getsockopt
56      clone
57      fork
58      vfork
59      execve
60      exit
61      wait4
62      kill
63      uname
64      semget
65      semop
66      semctl
67      shmdt
68      msgget
69      msgsnd
70      msgrcv
71      msgctl
72      fcntl
73      flock
74      fsync
75      fdatasync
76      truncate
77      ftruncate
78      getdents
79      getcwd
80      chdir
81      fchdir
82      rename
83      mkdir
84      rmdir
85      creat
86      link
87      unlink
88      symlink
89      readlink
90      chmod
91      fchmod
92      chown
93      fchown
94      lchown
95      umask
96      gettimeofday
97      getrlimit
98      getrusage
99      sysinfo
100     times
101     ptrace
102     getuid
103     syslog
104     getgid
105     setuid
106     setgid
107     geteuid
108     getegid
109     setpgid
110     getppid
111     getpgrp
112     setsid
113     setreuid
114     setregid
115     getgroups
116     setgroups
117     setresuid
118     getresuid
119     setresgid
120     getresgid
121     getpgid
122     setfsuid
123     setfsgid
124     getsid
125     capget
126     capset
127     rt_sigpending
128     rt_sigtimedwait
129     rt_sigqueueinfo
130     rt_sigsuspend
131     sigaltstack
132     utime
133     mknod
134     uselib
135     personality
136     ustat
137     statfs
138     fstatfs
139     sysfs
140     getpriority
141     setpriority
142     sched_setparam
143     sched_getparam
144     sched_setscheduler
145     sched_getscheduler
146     sched_get_priority_max
147     sched_get_priority_min
148     sched_rr_get_interval
149     mlock
150     munlock
151     mlockall
152     munlockall
153     vhangup
154     modify_ldt
155     pivot_root
156     _sysctl
157     prctl
158     arch_prctl
159     adjtimex
160     setrlimit
161     chroot
162     sync
163     acct
164     settimeofday
165     mount
166     umount2
167     swapon
168     swapoff
169     reboot
170     sethostname
171     setdomainname
172     iopl
173     ioperm
174     create_module
175     init_module
176     delete_module
177     get_kernel_syms
178     query_module
179     quotactl
180     nfsservctl
181     getpmsg
182     putpmsg
183     afs_syscall
184     tuxcall
185     security
186     gettid
187     readahead
188     setxattr
189     lsetxattr
190     fsetxattr
191     getxattr
192     lgetxattr
193     fgetxattr
194     listxattr
195     llistxattr
196     flistxattr
197     removexattr
198     lremovexattr
199     fremovexattr
200     tkill
201     time
202     futex
203     sched_setaffinity
204     sched_getaffinity
205     set_thread_area
206     io_setup
207     io_destroy
208     io_getevents
209     io_submit
210     io_cancel
211     get_thread_area
212     lookup_dcookie
213     epoll_create
214     epoll_ctl_old
215     epoll_wait_old
216     remap_file_pages
217     getdents64
218     set_tid_address
219     restart_syscall
220     semtimedop
221     fadvise64
222     timer_create
223     timer_settime
224     timer_gettime
225     timer_getoverrun
226     timer_delete
227     clock_settime
228     clock_gettime
229     clock_getres
230     clock_nanosleep
231     exit_group
232     epoll_wait
233     epoll_ctl
234     tgkill
235     utimes
236     vserver
237     mbind
238     set_mempolicy
239     get_mempolicy
240     mq_open
241     mq_unlink
242     mq_timedsend
243     mq_timedreceive
244     mq_notify
245     mq_getsetattr
246     kexec_load
247     waitid
248     add_key
249     request_key
250     keyctl
251     ioprio_set
252     ioprio_get
253     inotify_init
254     inotify_add_watch
255     inotify_rm_watch
256     migrate_pages
257     openat
258     mkdirat
259     mknodat
260     fchownat
261     futimesat
262     newfstatat
263     unlinkat
264     renameat
265     linkat
266     symlinkat
267     readlinkat
268     fchmodat
269     faccessat
270     pselect6
271     ppoll
272     unshare
273     set_robust_list
274     get_robust_list
275     splice
276     tee
277     sync_file_range
278     vmsplice
279     move_pages
280     utimensat
281     epoll_pwait
282     signalfd
283     timerfd
284     eventfd
285     fallocate
286     timerfd_settime
287     timerfd_gettime
288     accept4
289     signalfd4
290     eventfd2
291     epoll_create1
292     dup3
293     pipe2
294     inotify_init1
295     preadv
296     pwritev
297     rt_tgsigqueueinfo
298     perf_event_open
299     recvmmsg
300     fanotify_init
301     fanotify_mark
302     prlimit64
303     name_to_handle_at
304     open_by_handle_at
305     clock_adjtime
306     syncfs
307     sendmmsg
308     setns
309     getcpu
310     process_vm_readv
311     process_vm_writev
312     kcmp
313     finit_module
314     sched_setattr
315     sched_getattr
316     renameat2
317     seccomp
318     getrandom
319     memfd_create
320     kexec_file_load
321     bpf
322     execveat
323     userfaultfd
324     membarrier
325     mlock2
326     copy_file_range

2、参考资料

•      auditctl(8) - Linux man page
•      Auditd - Linux 服务器安全审计工具
精彩原创文章投稿有惊喜!

欢迎投稿!

VSRC欢迎精品原创类文章投稿,优秀文章一旦采纳发布,将有好礼相送,我们为您准备的丰富奖品包括但不仅限于:MacbookAir、VSRC定制雨伞,VSRC定制水杯以及VSRC定制充电宝!(活动最终解释权归VSRC所有)

另类WebShell监测机制--基于auditd的更多相关文章

  1. 定制Asp.NET 5 MVC内建身份验证机制 - 基于自建SQL Server用户/角色数据表的表单身份验证

    背景 在需要进行表单认证的Asp.NET 5 MVC项目被创建后,往往需要根据项目的实际需求做一系列的工作对MVC 5内建的身份验证机制(Asp.NET Identity)进行扩展和定制: Asp.N ...

  2. 第十四章 netlink机制--基于Linux3.10【转】

    本文转载自:http://blog.csdn.net/shichaog/article/details/44682613 Netlink基于网络的消息机制,能够让用户和内核空间进行通信,12.3节提到 ...

  3. Netty学习摘记 —— 心跳机制 / 基于分隔符和长度的协议

    本文参考 本篇文章是对<Netty In Action>一书第十一章"预置的ChannelHandler和编解码器"的学习摘记,主要内容为通过 SSL/TLS 保护 N ...

  4. 【腾讯Bugly干货分享】彻底弄懂 Http 缓存机制 - 基于缓存策略三要素分解法

    本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/qOMO0LIdA47j3RjhbCWUEQ 作者:李 ...

  5. Http协议:彻底弄懂 Http 缓存机制 - 基于缓存策略三要素分解法

    转载:http://mp.weixin.qq.com/s/uWPls0qrqJKHkHfNLmaenQ 导语 Http 缓存机制作为 web 性能优化的重要手段,对从事 Web 开发的小伙伴们来说是必 ...

  6. 一种利用异常机制基于MVC过滤器的防止重复提交的机制分享

    防止重复提交验证机制 某些时候因为系统反应稍慢,急性子用户可能不耐烦会进行重复的提交,这个操作不仅可能造成系统负担,也可能产生垃圾数据. 出现这两种状况都是我们不希望的. 为此,在公司项目系统设计了以 ...

  7. 【转】webshell检测——使用auditd进行system调用审计

    本文档将介绍:如何通过Linux审计系统auditd监测WebShell执行系统命令的行为. 测试环境:CentOS7.0_x64 auditd简介 Linux审计系统提供了一种跟踪系统上与安全相关的 ...

  8. Android的事件处理机制详解(二)-----基于监听的事件处理机制

    基于监听的事件处理机制 前言: 我们开发的app更多的时候是需要与用户的交互----即对用户的操作进行响应 这就涉及到了android的事件处理机制; android给我们提供了两套功能强大的处理机制 ...

  9. Android的事件处理机制之基于监听的事件处理

    无论是桌面应用还是手机应用程序,面对用户的使用,经常需要处理的便是用户的各种动作,也就是需要为用户动作提供响应,这种为用户动作提供响应的机制就是事件处理. 而Android为我们提供了两套强大的响应机 ...

随机推荐

  1. 关于selectpicker的多选问题

    刚开始拿到这个需要求的时候,我时很没有头绪的,再前期做的时候是将这个多选的作为一个数组,传入到后端,然后再插入数据库中,然后根据关系表查询,因为但是考虑显示的问题,不知道怎么将多选的数据显示出来,我就 ...

  2. 【java异常】Unexpected error occurred in scheduled task. java.lang.StackOverflowError: null

    可能是栈溢出(StackOverFlow) 背景:我用定时器new东西 原因:频率太快了好像!

  3. mybatis学习3

    parameterType(输入类型) 传递简单类型::使用#{}占位符,或者${}进行sql拼接 传递pojo对象: Mybatis使用ognl表达式解析对象字段的值,#{}或者${}括号中的值为p ...

  4. python输出带颜色字体

    方法1: (参考https://suixinblog.cn/2019/01/print-colorful.html) 使用Python中自带的print输出带有颜色或者背景的字符串 书写语法 prin ...

  5. 【转】C++11新特性——lambda表达式

    C++11的一大亮点就是引入了Lambda表达式.利用Lambda表达式,可以方便的定义和创建匿名函数.对于C++这门语言来说来说,“Lambda表达式”或“匿名函数”这些概念听起来好像很深奥,但很多 ...

  6. [ZJJOI2013]K大数查询 整体二分

    [ZJJOI2013]K大数查询 链接 luogu 思路 整体二分. 代码 #include <bits/stdc++.h> #define ll long long using name ...

  7. 余弦相似度-Cosine Similar(转载)

    余弦相似度用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小.相比距离度量,余弦相似度更加注重两个向量在方向上的差异,而非距离或长度上. 与欧几里德距离类似,基于余弦相似度的计算方法也是把用 ...

  8. VueCli3新特性

    升级VueCli3的理由: 1.构建速度大大加快,之前看到一个升级的例子是2的3倍速度,具体可以在自己迁移一个项 目测试下,这里的优化有默认开启了多核构建.缓存 并行和缓存 2.webpack被内置到 ...

  9. 逻辑运算符/三元运算符/Scanner

    逻辑运算符 &(并且) , |(或者) , !(非) , ^(异或) , &&(短路与) , ||(短路或) 注意事项: a:逻辑运算符一般用于连接boolean类型的表达式或 ...

  10. thinkphp 6.0 swoole扩展websocket使用教程

    前言 ThinkPHP即将迎来最新版本6.0,针对目前越来越流行Swoole,thinkphp也推出了最新的扩展think-swoole 3.0. 介绍 即将推出的tp6.0,已经适配swoole.并 ...