鸣  谢


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. 补充:垃圾回收机制、线程池和ORM缺点

    补充:垃圾回收机制.线程池和ORM缺点 垃圾回收机制不仅有引用计数,还有标记清除和分代回收 引用计数就是内存地址的门牌号,为0时就会回收掉,但是会出现循环引用问题,这种情况下会导致内存泄漏(即不会被用 ...

  2. mave常用指令

    Maven常用命令有以下几种: 清理 maven clean 测试 maven test 编译 maven compile 打包 maven package 部署 maven install 第一个m ...

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

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

  4. piral 基于typescript 的微前端开发框架

    piral有一个微前端开发框架,功能强大,文档比较全,扩展能力也比较好 包含以下特性: 特性 高度模块化 多框架兼容 支持资源文件的拆分 全局状态管理 独立开发和部署 CLI工具 与同类框架的比较 参 ...

  5. Layui 常用知识

    原文:https://www.cnblogs.com/30go/p/11088549.html 后台框架:Layui Admin Iframe layui.form.render();

  6. 一步一步编写AVL树

    第一步:定义结构体 typedef struct Node{ int d; //data ; //height struct Node* l=NULL; struct Node* r=NULL; No ...

  7. java_home not found in your enviroment 问题解决方法

    java_home not found in your enviroment 错误原因有一下几点 1. JAVA_HOME系统环境没配置, JAVA_HOME环境变量配置方法: <1> 右 ...

  8. 基于web公交查询系统自我安排进度

    这周完成站点信息管理

  9. python总结五

    1.is和==的区别:官方文档解释:is表示的是对象标识符,而==表示的是相等equal,is的作用是用来检查对象的标识符是否一致,也就是两个对象在内存中的地址是否一样 而==是用来检查两个对象是否相 ...

  10. shell脚本-练习1