鸣  谢

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所有)


我们聆听您宝贵建议


不知道,大家都喜欢阅读哪些类型的信息安全文章?

不知道,大家都希望我们更新关于哪些主题的干货?

现在起,只要您有任何想法或建议,欢迎直接回复本公众号留言!

精彩留言互动的热心用户,将有机会获得VSRC赠送的精美奖品一份!

同时,我们也会根据大家反馈的建议,选取热门话题,进行原创发布!

源链接

Hacking more

...