HIDS之Wazuh的使用记录

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

2018-12-12  本文已影响0人  jjf012

利用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有三种审核规则:

文件系统规则
监控/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

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/
/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>
上一篇 下一篇

猜你喜欢

热点阅读