鸣 谢
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:09,698444为日志消息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=SYSCALL和type=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所有)