美文网首页HIDS之Wazuh的使用记录
Wazuh联动audit监测linux系统层的攻击

Wazuh联动audit监测linux系统层的攻击

作者: jjf012 | 来源:发表于2018-12-12 18:16 被阅读0次

    利用linux的audit,可以监测到Web层面的攻击,比如通过webshell执行的命令和文件读取漏洞(这里以centos+宝塔+php为例),以及监测木马后门以及挖矿病毒用于持久化的目录——cron和自启动目录。

    redhat官方参考地址
    相关组件
    auditctl: 即时控制审计守护进程的行为的工具,比如如添加规则等等,但并不持久化,重启后消失。
    /etc/audit/audit.rules : 记录审计规则的文件,持久化。
    aureport : 查看和生成审计报告的工具。
    ausearch: 查找审计事件的工具
    auditspd : 转发事件通知给其他应用程序,而不是写入到审计日志文件中。
    autrace : 一个用于跟踪进程的命令。
    /etc/audit/auditd.conf : auditd工具的配置文件。
    augenrules: audit规则的检查和加载

    audit有三种审核规则:

    • 控制规则:修改audit自身配置的规则。
    • 文件系统规则(也称为文件监视):允许审核对特定文件或目录的操作包括读写删看。
    • 系统调用规则:允许记录指定程序所进行的系统调用。(通过webshell执行命令肯定会有异常)

    文件系统规则
    监控/etc/passwd写权限修改权限,并给个标记passwd_changes方便识别。
    auditctl -w /etc/passwd -p wa -k passwd_changes

    系统调用规则
    语法:-a action,filter -S system_call -F field=value -k key_name
    比如,定义每次在ID为1000或更大的系统用户删除或重命名文件时创建日志条目的规则
    auditctl -a always,exit -S unlink -S unlinkat -S rename -S renameat -F auid>=500 -F auid!=4294967295 -k delete
    这个always表示始终记录,never表示不予记录。
    exit表示待整个操作执行完毕后。

    审计文件操作

    为了方便wazuh分辨审计日志,用一个常量数据库来标记审计规则,可以直接触发告警,否则需要手动编写新的告警规则。

    cat /var/ossec/etc/lists/audit-keys
    
    audit-wazuh-w:write
    audit-wazuh-r:read
    audit-wazuh-a:attribute
    audit-wazuh-x:execute
    audit-wazuh-c:command
    

    如果修改了,需要重建数据库/var/ossec/bin/ossec-makelists
    这样会监视/home下的访问、读取、写入和属性修改。

    auditctl -w /home -p w -k audit-wazuh-w
    auditctl -w /home -p a -k audit-wazuh-a
    auditctl -w /home -p r -k audit-wazuh-r
    auditctl -w /home -p x -k audit-wazuh-x
    

    实际操作时,当执行cat /home/test/x.py的时候,会产生两条关于读取的日志,一条是/home/test目录,一条是/home/test/x.py

    审计用户执行的命令

    auditctl -a exit,always -F euid=0 -F arch=b64 -S execve -k audit-wazuh-c

    监测Web层面的漏洞攻击

    12月10日公开的thinkphp远程代码执行漏洞,通过这个漏洞可以进行文件读取的操作,比如尝试读取/etc/passwd,或者执行系统命令。
    这里为了方便测试,把宝塔原来自带的.user.ini重命名了下,并且修改原有的php.ini用于测试,然后重启php-fpm服务。

    1、查看web服务进程的uid,通过ps -ef得到www用户,查看/etc/passwd得到uid是1002
    2、编写审计规则

    auditctl -a always,exit -w /etc/passwd -p r -F uid=1002 -k php_lfi_or_rce
    watch option can't be given with a syscall
    

    文件监控与调用监控是不能共用的,于是换成
    auditctl -a always,exit -F path=/etc/passwd -F perm=r -F uid=1002 -k php_lfi_or_rce
    参考redhat官方

    [root@localhost php71_test_com]# cat /dev/null > /var/log/audit/audit.log 
    [root@localhost php71_test_com]# tail /var/log/audit/audit.log 
    [root@localhost php71_test_com]# tail /var/log/audit/audit.log 
    type=SYSCALL msg=audit(1544495079.023:2214): arch=c000003e syscall=2 success=yes exit=4 a0=7ffe64ecd280 a1=0 a2=1b6 a3=1 items=1 ppid=43023 pid=43025 auid=0 uid=1002 gid=1002 euid=1002 suid=1002 fsuid=1002 egid=1002 sgid=1002 fsgid=1002 tty=(none) ses=16 comm="php-fpm" exe="/www/server/php/71/sbin/php-fpm" subj=unconfined_u:system_r:initrc_t:s0 key="php_lfi_or_rce"
    type=CWD msg=audit(1544495079.023:2214):  cwd="/www/wwwroot/php71_test1_com/think-5.1.28/public"
    type=PATH msg=audit(1544495079.023:2214): item=0 name="/etc/passwd" inode=18105168 dev=fd:00 mode=0100644 ouid=0 ogid=0 rdev=00:00 obj=system_u:object_r:passwd_file_t:s0 objtype=NORMAL cap_fp=0000000000000000 cap_fi=0000000000000000 cap_fe=0 cap_fver=0
    type=PROCTITLE msg=audit(1544495079.023:2214): proctitle=7068702D66706D3A20706F6F6C20777777
    

    上述事件由四个记录组成,它们共享相同的时间戳和序列号。记录始终与type=关键字一致。每条记录由几个由空格或逗号分隔的对组成。以下事件的详细分析如下:name=value

    • a0a3记录前四个参数,均是十六进制编码。如a0=7ffe64ecd280
    • auid字段记录审核用户ID,即loginuid。此ID在登录时分配给用户,并且即使用户的身份发生更改(例如,通过使用该su - john命令切换用户帐户),也会被每个进程继承。
    • RUID:创建该进程的用户的UID为该进程的真实用户号RUID
    • EUID: 用于系统决定用户对系统资源的访问权限,通常情况下等于RUID
    • SUID: 针对某一个文件来说的,当设置文件权限后,可以使本没有相应权限的用户执行这个程序时,可以访问没有访问权限的资源。如果可执行文件所有者权限的第三位是一个小写的s就表明该执行文件拥有SUID属性。如-rwsr-xr-x. 1 root root 27832 6月 10 2014 /usr/bin/passwd
    • fsuid=1000:该fsuid字段记录启动分析过程的用户的文件系统用户标识。
    • comm="php-fpm":该comm字段记录用于调用分析过程的命令的命令行名称。
    • exe="/www/server/php/71/sbin/php-fpm"exe字段记录用于调用分析过程的可执行文件的路径。

    3、编写报警规则
    ./bin/ossec-logtest测试一下得到父规则id是80700


    修改/var/ossec/etc/etc/rules/local_rules.xml

    <group name="web_attack">
    <rule id="200001" level="10">
      <if_sid>80700</if_sid>
      <field name="audit.type">SYSCALL</field>
      <match>php_lfi_or_rce</match>
      <description>web lfi or rce attack</description>
    </rule>
    <rule id="200002" level="10">
      <if_sid>80700</if_sid>
      <field name="audit.type">SYSCALL</field>
      <match>web_command_execution</match>
      <description>web command execution attack</description>
    </rule>
    </group>
    

    验证完毕无误后重启wazuh管理端,用thinkphp和php一句话(位于网站根目录)测试一下。这里有个奇怪的地方,执行系统命令的时候会同时触发对/etc/passwd的读取??

    thinkphp测试 菜刀测试1 菜刀测试2

    看到一串长长的数字,命令执行的参数,用16进制转字符串看看

    2F62696E2F7368202D6320226364202F7777772F777777726F6F742F70687037315F74657374315F636F6D2F7468696E6B2D352E312E32382F7075626C69632F3B6E657473746174202D616E207C20677265702045535441424C49534845443B6563686F205B535D3B7077643B6563686F205B455D2220323E2631
    

    解密后

    /bin/sh -c "cd /www/wwwroot/php71_test1_com/;netstat -an | grep ESTABLISHED;echo [S];pwd;echo [E]" 2>&1
    

    4、持久化审计规则
    编辑/etc/audit/rules.d/audit.rules
    新增

    -a always,exit -F arch=b64 -F path=/etc/passwd -F perm=r -F uid=1002 -k php_lfi_or_rce
    -a always,exit -F arch=b64 -F uid=1002 -S execve -k web_command_execution
    

    augenrules --load,会提示你的规则有没有错误。

    监测挖矿病毒后门木马常用的目录

    这两个目录可以说是持久化必用的,而生产环境上线后并不会做过多的改动。那么这两个目录发生了异变,很大概率就是攻击所致。
    centos7为例,前两个目录5、6也有。参考这个,写的不错

    • 启动项目录
    /etc/rc.d/init.d
    /etc/init.d
    /usr/lib/systemd/system/
    /run/systemd/system/
    /etc/systemd/system/
    
    • 定时任务,默认编写的crontab文件会保存在 (/var/spool/cron/用户名 例如:/var/spool/cron/root)
    /var/spool/cron/* 
    /etc/crontab
    /etc/cron.d/*
    /etc/cron.daily/* 
    /etc/cron.hourly/* 
    /etc/cron.monthly/*
    /etc/cron.weekly/
    /etc/anacrontab
    /var/spool/anacron/* 这个目录会造成误报
    

    /etc/audit/rules.d/audit.rules新增

    ## Service
    -a always,exit -F arch=b64 -F dir=/etc/rc.d/init.d/ -F perm=w -k service_changed
    -a always,exit -F arch=b64 -F dir=/etc/init.d/ -F perm=w -k service_changed
    -a always,exit -F arch=b64 -F dir=/usr/lib/systemd/system/ -F perm=w -k service_changed
    -a always,exit -F arch=b64 -F dir=/run/systemd/system/ -F perm=w -k service_changed
    -a always,exit -F arch=b64 -F dir=/etc/systemd/system/ -F perm=w -k service_changed
    
    ## Cron
    -a always,exit -F arch=b64 -F path=/etc/crontab -F perm=w -k cron_changed
    -a always,exit -F arch=b64 -F path=/etc/anacrontab -F perm=w -k cron_changed
    -a always,exit -F arch=b64 -F dir=/var/spool/cron -F perm=w -k cron_changed
    #-a always,exit -F arch=b64 -F dir=/var/spool/anacron/ -F perm=w -k cron_changed
    -a always,exit -F arch=b64 -F dir=/etc/cron.d/ -F perm=w -k cron_changed
    -a always,exit -F arch=b64 -F dir=/etc/cron.daily/ -F perm=w -k cron_changed
    -a always,exit -F arch=b64 -F dir=/etc/cron.hourly/ -F perm=w -k cron_changed
    -a always,exit -F arch=b64 -F dir=/etc/cron.monthly/ -F perm=w -k cron_changed
    -a always,exit -F arch=b64 -F dir=/etc/cron.weekly/ -F perm=w -k cron_changed
    

    注意
    path=/xxxx,用来监控文件。
    dir=/xxx/,用来监控目录,包括子目录。

    宝塔新建或修改定时任务

    对应的告警规则

    <group name="system_changed">
    <rule id="300001" level="10">
      <if_sid>80700</if_sid>
      <field name="audit.type">SYSCALL</field>
      <match>service_changed</match>
      <description>linux: system service changed</description>
    </rule>     
    <rule id="300002" level="10"> 
      <if_sid>80700</if_sid>
      <field name="audit.type">SYSCALL</field>
      <match>cron_changed</match>
      <description>system cron changed</description>
    </rule>
    </group>
    

    相关文章

      网友评论

        本文标题:Wazuh联动audit监测linux系统层的攻击

        本文链接:https://www.haomeiwen.com/subject/ubuphqtx.html