利用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
-
a0
到a3
记录前四个参数,均是十六进制编码。如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
的读取??
看到一串长长的数字,命令执行的参数,用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>
网友评论