另类WebShell监测机制--基于auditd

鸣  谢


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

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

测试环境:CentOS7.0_x64

auditd简介


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

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

•      监控文件访问

•      监控系统调用

•      记录用户命令执行

•      记录安全事件

•      执行审计搜索

•      统计概要报表

•      监控网络访问

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

另类WebShell监测机制--基于auditd

通常我们使用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,可以看到该配置命令本身也产生了日志:

另类WebShell监测机制--基于auditd

其中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成功之行命令后,返回结果如下图所示:

另类WebShell监测机制--基于auditd

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

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

另类WebShell监测机制--基于auditd

上述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

另类WebShell监测机制--基于auditd

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

另类WebShell监测机制--基于auditd

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

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

另类WebShell监测机制--基于auditd

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

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

另类WebShell监测机制--基于auditd

4、梳理小结

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

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

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

另类WebShell监测机制--基于auditd

总结&思考

至此,我们完成了基于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所有)
上一篇:Linux中shell script的使用


下一篇:关于java代码执行fping拿不到输出的问题