最新消息:

[转]另类WebShell监测机制–基于auditd

置顶文章 admin 2791浏览 0评论

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

测试环境:CentOS7.0_x64

auditd简介

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

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

• 监控文件访问

• 监控系统调用

• 记录用户命令执行

• 记录安全事件

• 执行审计搜索

• 统计概要报表

• 监控网络访问

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

jinglingshu_2017-10-11_13-43-071

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

jinglingshu_2017-10-11_13-43-07

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

jinglingshu_2017-10-11_13-43-07

2

查看和分析auditd审计日志

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

jinglingshu_2017-10-11_13-43-081

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

jinglingshu_2017-10-11_13-43-08

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

jinglingshu_2017-10-11_13-43-072

3

深入分析进程及文件关系

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

jinglingshu_2017-10-11_13-43-09

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

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

jinglingshu_2017-10-11_13-43-091

4

梳理小结

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

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

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

jinglingshu_2017-10-11_13-43-082

总结&思考

至此,我们完成了基于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 服务器安全审计工具

转自:https://mp.weixin.qq.com/s?__biz=MzI5ODE0ODA5MQ==&mid=2652278266&idx=1&sn=7b2f89643afaa22527644774a77b297b

 

使用:

service auditd start
auditctl -w /bin/netstat -p rwxa
auditctl -w /bin/

使用完执行service auditd stop关掉即可

转载请注明:jinglingshu的博客 » [转]另类WebShell监测机制–基于auditd

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址