开源EDR(OSSEC)
开源EDR(OSSEC)基础篇- 01 -设计定位与能力输出
前言
介绍OSSEC之前,不得不提到当前比较热门的技术EDR,近几年随着大数据SIEM系统的发展,EDR(端点威胁检测与响应)技术成为了安全界万众宠爱的骄子,广泛用于威胁检测、攻击溯源和响应处理的安全场景。
而OSSEC是一款开源的跨平台的准EDR入侵检测响应系统,可以实现商业EDR 大部分的功能,可以说OSSEC是所有EDR商业产品的原型,发展至今已经有10几年的历史。
在这篇文章中,我们将讨论OSSEC这款开源产品的安全能力,尽可能完整的展现OSSEC在各种安全场景中的应用,了解这些有助于帮助企业安全管理者更好的使用这款开源安全工具来应对日趋严峻的安全问题。
1. 设计定位
1.1 主机监控
OSSEC通过文件完整性监控,日志监控,rootcheck和流程监控,全面监控企业资产系统活动的各个方面,对于安全管理提供了依据。
1.2 安全告警
当发生攻击时,OSSEC会通过发送告警日志和邮件警报让系统管理员及时感知威胁,并在短时间内进行应急处理,最大程度的避免企业遭受损失。OSSEC还可以通过syslog将告警信息导出到任何SIEM系统,譬如OSSIM进行关联安全分析。
1.3 全平台支持
最难能可贵的是,OSSEC提供了全平台系统的支持,包括Linux,Solaris,AIX,HP-UX,BSD,Windows,Mac和VMware ESX,突破性的实现了主机入侵态势感知的全覆盖。
1.4 功能扩展
OSSEC得到了第三方安全团队的支持,其中Wazuh就是基于OSSEC开发的一个高级版本,在OSSEC的自身功能的基础上进行扩展和优化。
2. 主要能力
对于一款开源工具或者是商业产品,对于使用者最先关心的就是她到底能干些什么?
以下通过迷你案例来分别展示OSSEC的主要能力,让我们暂时不关心如何配置,只关心她能实现什么价值!!
2.1 日志监控 异常行为检测
日志的监控可分为两种,一种是被动的采集,通过采集需要的日志,读取日志信息,标准化输出适应安全规则使用的内容,当匹配到内置或者自定义的规则,随后输出实时告警,从而发现异常;另一种是主动的查询,通过周期下发命令查询系统状态信息,然后进行新旧信息比对,从而发现异常。
日志监控实例
Web日志识别恶意访问
从这批日志里我们可以看到在一分钟之内,同一个来源IP地址(207.44.184.96),频繁的访问不存在的页面,出现了大量404的状态码,这意味着Web站点正在遭受扫描攻击
[root@localhost ~]# tail -n 10 /var/log/httpd/access_log
207.44.185.96 - - [23/Mar/2018:19:57:37 -0300] "GET /b2/xmlsrv/xmlrpc.php HTTP/1.0" 404 297 "-" "-"
207.44.185.96 - - [23/Mar/2018:19:57:37 -0300] "GET /blogtest/xmlsrv/xmlrpc.php HTTP/1.0" 404 303 "-" "-"
207.44.185.96 - - [23/Mar/2018:19:57:37 -0300] "GET /blog/xmlsrv/xmlrpc.php HTTP/1.0" 404 299 "-" "-"
207.44.185.96 - - [23/Mar/2018:19:57:37 -0300] "GET /blogs/xmlsrv/xmlrpc.php HTTP/1.0" 404 300 "-" "-"
207.44.185.96 - - [23/Mar/2018:19:57:37 -0300] "GET /blogs/xmlrpc.php HTTP/1.0" 404 293 "-" "-"
207.44.185.96 - - [23/Mar/2018:19:57:36 -0300] "GET /community/xmlrpc.php HTTP/1.0" 404 297 "-" "-"
207.44.185.96 - - [23/Mar/2018:19:57:33 -0300] "GET /drupal/xmlrpc.php HTTP/1.0" 404 294 "-" "-"
207.44.185.96 - - [23/Mar/2018:19:57:30 -0300] "GET /blog/xmlrpc.php HTTP/1.0" 404 292 "-" "-"
207.44.185.96 - - [23/Mar/2018:19:57:30 -0300] "GET /xmlsrv/xmlrpc.php HTTP/1.0" 404 294 "-" "-"
207.44.185.96 - - [23/Mar/2018:19:57:30 -0300] "GET /xmlrpc/xmlrpc.php HTTP/1.0" 404 294 "-" "-"
- 日志监控告警
Rule: 31151 fired (level 10) -> "Mutiple web server 400 error codes from same source ip."
用户日志识别登录异常
从这批日志里我们可以看到,同一个来源IP不断的使用通过同一个账户admin尝试SSH登录,结果都失败了,不断的失败达到一定数量,那就意味着是暴力破解行为
[root@localhost ~]# tail -n 10 /var/log/secure
Jun 26 17:40:27 xx sshd[7629]: Failed password for invalid user admin from 61.146.178.13 port 42107 ssh2
Jun 26 17:40:25 xx sshd[7629]: Invalid user admin from 61.146.178.13
Jun 26 17:40:23 xx sshd[7625]: Failed password for invalid user admin from 61.146.178.13 port 41983 ssh2
Jun 26 17:40:20 xx sshd[7625]: Invalid user admin from 61.146.178.13
Jun 26 17:40:18 xx sshd[7621]: Failed password for invalid user guest from 61.146.178.13 port 41889 ssh2
Jun 26 17:40:15 xx sshd[7621]: Invalid user guest from 61.146.178.13
Jun 26 17:40:14 xx sshd[7617]: Failed password for invalid user test from 61.146.178.13 port 41797 ssh2
- 日志监控告警
Rule: 5712 fired (level 10) -> "SSHD brute force trying to get access to the system."
系统状态变更异常
操作系统有很多系统信息,比如账号密码变更,启动项变更,服务监听变更,都是通过命令查询获知,而通过OSSEC的Command方法,可以周期下发查询命令,并对输出结果进行比对,及时感知状态变化
- 测试方法
使用nc工具,临时监听TCP端口
[root@localhost ~]# nc -l 8443
- 日志监控告警
我们从告警的输出,就可以知道服务监听的状态发生的变更,告警分别打印了,状态变更前后查询命令输出
** Alert 1499397975.7591: mail - ossec,
2018 Jul 21 12:23:15 (192.168.1.137) any->netstat -tan |grep LISTEN |egrep -v '(127.0.0.1| \\1)' | sort
Rule: 531 (level 7) -> 'Listened ports status (netstat) changed (new port opened or closed).'
ossec: output: 'netstat -tan |grep LISTEN |egrep -v '(127.0.0.1| \\1)' | sort':
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:8443 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:37498 0.0.0.0:* LISTEN
tcp 0 0 :::111 :::* LISTEN
tcp 0 0 :::22 :::* LISTEN
tcp 0 0 :::62229 :::* LISTEN
Previous output:
ossec: output: 'netstat -tan |grep LISTEN |egrep -v '(127.0.0.1| \\1)' | sort':
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:37498 0.0.0.0:* LISTEN
tcp 0 0 :::111 :::* LISTEN
tcp 0 0 :::22 :::* LISTEN
tcp 0 0 :::62229 :::* LISTEN
更多检测功能
FTP账户密码暴力破解检测
SQL注入尝试检测
E-mail账户密码暴力破解检测
文件系统状态检测
应用安装卸载检测
虚拟主机开关状态检测
...
当然OSSEC的异常行为检测功能,不会仅限于上述例子,更多的功能还藏匿于内置规则,等待挖掘,最后随着不断深入理解日志本身,你能利用OSSEC创造出更多更好用的功能。
关于OSSEC的规则部分内容会在后面的章节做详细的介绍。
2.2 Syscheck文件完整性检测 篡改行为检测
无论攻击手段有多么高明,最终的目的是以某种方式改变系统,从修改文件的病毒到改变内核的后门程序,系统的完整性总会有一些变化,Syscheck完整性检查是终端检测的重要组成部分,通过查找系统和Windows注册表中密钥文件的MD5/SHA1校验和的更改来检测系统完整性的变化,该功能的设计目的是监控操作系统中关键文件的修改情况,及时发现篡改行为。
文件完整性检测实例
命令文件替换监控
了解Linux的都知道Linux的一切皆文件,Linux 中的各种事物比如像文档、目录、键盘、监视器、硬盘、可移动媒体设备、打印机、调制解调器、虚拟终端,等等一切都可看作是文件,这就给了攻击者一个很好的攻击思路,那就是替换文件,保留原来文件的基本功能,同时嵌入后门程序,比较常见被替换的命令文件有ps
、netstat
、ss
、lsof
等等
- 测试方法
通过vim编辑器做个删除部分内容的操作,修改之前一定记得备份
[root@localhost ~]# vim /bin/netstat
- Syscheck告警
对于netstat
命令,做了/bin/netstat
文件变化的监控,收到了下面的告警信息,文件大小正常大小为155000
,告警显示文件大小从155000
改变为129238
,这样就能有效的监控命令文件是否被替换,第一时间感知到这个危险操作
** Alert 1544237296.12315: mail - ossec,syscheck,
2018 Dec 07 21:48:16 bogon->syscheck
Rule: 550 (level 7) -> 'Integrity checksum changed.'
Integrity checksum changed for: '/bin/netstat'
Size changed from '155000' to '129238'
Old md5sum was: '60523518c81d85c7d761bd6e6e9a1007'
New md5sum is : '8d07cb216d0f6cab7a9de4881f25244b'
Old sha1sum was: '428980466a122420885d6885b74b8054500367e2'
New sha1sum is : 'e9ee23fc6888b2adb7b052670c17fc9dc9281a2c'
2.3 Rootcheck后门检测 后门行为检测
Rootkit是一种特殊的恶意软件,它通过加载特殊的驱动,修改系统内核,进而达到隐藏信息的目的。Rootkit的基本功能包括提供root后门,控制内核模块的加载、隐藏文件、隐藏进程、隐藏网络端口,隐藏内核模块等,主要目的在于隐藏自己并且不被安全软件发现,Rootkit几乎可以隐藏任何软件,包括文件服务器、键盘记录器、Botnet 和 Remailer,而Rootcheck就是OSSEC提供的专门用于检测操作系统rootkit的引擎
Rootcheck For Linux
- 使用rootkit_files文件中包含的已知后门程序文件或目录特征进行扫描识别异常
- 使用rootkit_trojans文件中包含的已知被感染木马文件的签名进行扫描识别异常
- 对设备文件目录(/dev)、文件系统、隐藏进程、隐藏端口,混杂模式接口的异常检测
Rootcheck For Windows
- 通过使用win_applications_rcl文件中包含的应用特征进行扫描识别软件应用
- 通过win_audit_rcl文件中包含注册表进行扫描识别特殊注册表项的变动
- 通过win_malware_rcl文件中包含的恶意软件特征进行扫描识别恶意软件
- 通过system_audit_rcl文件中包含的服务配置项目进行配置核查以及Web类威胁静态特征进行扫描识别异常
- 通过system_audit_ssh文件中包含的SSH增强检测功能特征进行扫描识别异常
后门行为检测实例
设备目录(/dev)创建隐藏文件
- 测试方法
在/dev下创建隐藏文件
[root@localhost dev]# touch .ssh
[root@localhost dev]# chmod 777 .ssh
[root@localhost dev]# ls -a /dev | grep '^\.'
.
..
.ssh
- Rootcheck告警
rootcheck功能检测到/dev目录下存在隐藏文件,随后进行了提权操作
[root@localhost ossec]# tailf /var/ossec/logs/alerts/alerts.log
** Alert 1544791226.3893: mail - ossec,rootcheck,
2018 Dec 14 07:40:26 localhost->rootcheck
Rule: 510 (level 7) -> 'Host-based anomaly detection event (rootcheck).'
File '/dev/.ssh' present on /dev. Possible hidden file.
** Alert 1544791227.4116: mail - ossec,rootcheck,
2018 Dec 14 07:40:27 localhost->rootcheck
Rule: 510 (level 7) -> 'Host-based anomaly detection event (rootcheck).'
File '/dev/.ssh' is owned by root and has write permissions to anyone.
2.4 实时告警
通过 ossec.conf
文件配置指定规则组、指定规则ID、指定服务器(agent)触发的实时告警发给专门负责的管理员邮箱,实现职责归属明确,故障类的告警发给运维管理员、安全类的告警发给安全管理员,特别关注的告警事件发给问题处理专员等
实时告警输出实例
告警事件通过E-mail实时提醒
根据规则功能分组来确定告警发送给谁处理
<email_alerts>
<email_to>249994395@qq.com</email_to>
<email_to>75016025@qq.com</email_to>
<level>12</level>
<group>sshd,</group>
<do_not_delay/>
</email_alerts>
根据规则ID来确定告警发送给谁处理
<email_alerts>
<email_to>249994395@qq.com</email_to>
<rule_id>123, 124</rule_id>
<do_not_delay />
<do_not_group />
</email_alerts>
根据服务器(agent-id)来确定告警发送给谁处理
<email_alerts>
<email_to>249994395@qq.com</email_to>
<level>12</level>
<event_location>agent01|agent02</event_location>
<do_not_delay />
</email_alerts>
邮件告警内容
邮件主题:OSSEC Alert - localhost - Level 7 - Listened ports status (netstat) changed (new port opened or closed).
OSSEC HIDS Notification.
2018 Oct 09 11:21:37
Received From: localhost->netstat -tan |grep LISTEN |egrep -v '(127.0.0.1| \\1)' | sort
Rule: 533 fired (level 7) -> "Listened ports status (netstat) changed (new port opened or closed)."
Portion of the log(s):
ossec: output: 'netstat -tan |grep LISTEN |egrep -v '(127.0.0.1| \\1)' | sort':
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 172.16.100.213:25 0.0.0.0:* LISTEN
tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN
tcp6 0 0 :::22 :::* LISTEN
tcp6 0 0 :::80 :::* LISTEN
Previous output:
ossec: output: 'netstat -tan |grep LISTEN |egrep -v '(127.0.0.1| \\1)' | sort':
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 172.16.100.213:25 0.0.0.0:* LISTEN
tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN
tcp6 0 0 :::22 :::* LISTEN
2.5 主动响应
本文之前提到OSSEC是一款准EDR产品,其中体现的‘R’技术,就是指的的这个主动响应,我们可以根据特定的服务器或服务器组(agent)、特定的规则ID等多个条件关联触发响应动作,响应的动作可以通过脚本程序去实现个性化的需求,这些需求可以是邮件提醒,也是可以是指令下发边界安全设备或者安全组件进行访问封堵或者恢复,或者更多的本地化需求(脚本实现),当然OSSEC内置也包含一些常用的响应脚本,只需在此基础上稍加改变,就可以投入使用
Active Responses
分为command
与active-response
两个部分, 且一个能够被执行的Active Responses
规则必须同时包含command
与active-response
两个部分
主动响应处理实例
主机访问控制列表(TCP Wrappers)脚本联动实现告警响应处理
创建调用响应脚本命令
- name:定义命令名称
- executable:调用的响应脚本
- expect:输出脚本需要的参数(srcip或username)
<command>
<name>host-deny</name>
<executable>host-deny.sh</executable>
<expect>srcip</expect>
<timeout_allowed>yes</timeout_allowed>
</command>
配置主动响应规则
- command:调用响应脚本命令(上面定义)
- location:规则生效的主机范围(本地主机、服务控制端或指定的Agent等)
- rules_id:触发响应动作的规则ID条件
- timeout:响应动作的持续时间,此处动作为禁止,10s后超时允许放行
<active-response>
<command>host-deny</command>
<location>local</location>
<rules_id>5551, 5712, 5720</rules_id>
<timeout>10</timeout>
</active-response>
响应脚本
显示host.deny脚本的前10行,第七行说明脚本需要输入srcip参数,才能正常运行
[root@bogon ~]# head -n 10 /var/ossec/active-response/bin/host-deny.sh
#!/bin/sh
# Adds an IP to the /etc/hosts.deny file
# Requirements: sshd and other binaries with tcp wrappers support
# Expect: srcip
# Author: Daniel B. Cid
# Last modified: Nov 09, 2005
ACTION=$1
USER=$2
IP=$3
测试方法
重启OSSEC进程, 手动尝试多次SSH登录并且输入错误密码
主动响应日志输出
[root@bogon ~]#tail -f /var/ossec/logs/active-responses.log
Wed Dec 12 17:57:58 CST 2018 /var/ossec/active-response/bin/host-deny.sh add - A.B.C.D 1544608678.285043 5720
Wed Dec 12 17:59:28 CST 2018 /var/ossec/active-response/bin/host-deny.sh delete - A.B.C.D 1544608678.285043 5720
总结
在对OSSEC有个整体上的了解之后,我们将系统性的介绍OSSEC在各种环境中的安装与部署,包括单机部署、客户端与服务器分离部署,以及如何把告警日志数据存储到MySQL中,并通过自带的UI工具,进行展现告警。