zoukankan      html  css  js  c++  java
  • 另类WebShell监测机制--基于auditd

    鸣  谢


    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所有)
  • 相关阅读:
    7
    go http请求库HttpRequest
    Golang设计模式
    深挖 go 之 for-range 排坑指南
    go在并发情况下使用map
    Redis知识点总结
    go 条件与循环结构
    数据分析的数据源
    go 生产者消费者模型与发布订阅模型
    go 文件与目录操作
  • 原文地址:https://www.cnblogs.com/pshell/p/7649189.html
Copyright © 2011-2022 走看看