基线检测

基线检测应该是HIDS最基础的功能,不管是为了合规还是为了等保测试,基线应该说是最基础也是最重要的一项检测。

Sudoers检测

配置用例: user1 ALL=(ALL) NOPASSWD: ALL

对应含义用户 登录的主机=(可以变换的身份) 不需要密码执行: 可以执行的命令

归纳五种危险的配置:

  1. 未明确限制可以使用命令白名单的用户

    ALL ALL=(root) NOPASSWD:CMD

    第一个ALL表示所有用户都可以使用申请的命令白命令。 该配置扩大了可以升权的用户范围,存在潜在提权风险。

  2. 未明确限制升权后的用户

    username ALL=(ALL) NOPASSWD:CMD

    括号里ALL表示用户可以升权到任意用户(配置成root也是高风险),包括root和其他所有用户。该配置扩大了升权后的用户范围,存在潜在提权风险。

  3. 待升权命令的自身访问权限较低,存在被替换风险

    user1 ALL=(root) NOPASSWD:/home/user1/test

    /home/user1/test的自身访问权限为user1。用户获得user1权限后,可以把该命令替换为某个破坏性命令导致提权。

  4. 待升权命令仅包含命令,而没有明确参数

    username ALL=(root) NOPASSWD:/bin/bash

    配置了/bin/bash,没有限制对应的参数(执行的脚本),可导致执行任意脚本提权。

  5. 待升权命令中使用”*”不当

    user1 ALL=(root) NOPASSWD:/sbin/ip netns exec qrouter-[0-9a-z]* timeout 5 /sbin/tcpdump -s 60 -c [1-3]*

    这里申请的命令/sbin/ip,不再是单独的命令,而是加上了参数,但是该参数中使用了通配符”” 。 ””作为通配符,可以匹配任意个字符,包括空格,分号等。所以可以匹配任意命令。

检测规则:

  1. 上面讲了5条基本的危险配置,可以简单的归结为(可以变换的身份)root|ALL,后面为NOPASSWD就很可能存在风险。即可提炼出正则规则,配置告警。
  2. 根据实际情况,如果实际业务中上面的误报多,就可以对最后一步命令的进行进一步的监控过滤。可采取白名单或者黑名单命令的形式进行监控,黑名单命令例如:sush·、rm等(一切可能会危害系统的命令)。如果是加了参数,就监控参数中是否包含“*”号。

不安全的加密算法

  1. 不安全的SSH 协议: 检测etc/ssh/sshd_config的Protocal是否支持SSH1
  2. 不安全/etc/shadow加密协议(弱口令检测讲解到)

低版本软件

检测规则:

  1. 根据信息搜集模块搜集到的版本信息,定义漏洞版本的规则,若匹配到规则则告警。包括但不限于:
    • 内核系统低版本
    • ssh低版本
    • 各种DB低版本
    • nginx低版本

三方组件漏洞检测

三方组件一般是检测CVE漏洞, 关于CVE漏洞库的匹配, [OWASP Dependency Check](https://common.cnblogs.com/editor/tiny_mce/plugins/preview/ https://github.com/jeremylong/DependencyCheck )这款工具可以检测,如何嵌入到主机扫描系统中:

  • 通过看OWASP Dependency Check源码自己实现类似的检测逻辑或者直接复用它的数据库,不过要定时更新。
  • 上述的逻辑最好是单独的一个模块或者组件,提供一个API接口,主机扫描系统只要输入对应的组件的版本信息,就能得到漏洞的反馈信息。

基本检测

特权账户检测

检测规则:

  1. 通过之前的信息搜集模块搜集到的用户信息,判断是否存在uid=0且用户名不为root的特权账户。

异常账户检测

检测规则:

  1. 通过历史登录情况自动总结归纳常用登录账户和地点(或者提供添加白名单功能)
  2. 监控/var/log/secure或者/var/log/auth.logSSH的登陆情况,若存在成功事件并且用户不在白名单上,则告警。

暴力破解检测

检测规则:

  1. 依旧是就监控/var/log/secure或者/var/log/auth.log的登陆情况,定义一定的时间内某IP尝试登陆失败的次数大于某个阈值则告警。
  2. 大型互联网的机器可能经常受到攻击,不想每次都告警,可以在1的基础上加上特定条件-失败多次后存在登陆成功的事件,则告警。

弱口令账户检测

系统弱口令

shadow中存放的密码密文格式如下:$id$salt$encrypted

其中id是指使用的哈希算法,可取如下值:

ID Method
1 MD5
2a Blowfish (not in mainline glibc; added in some Linux distributions)
5 SHA-256 (since glibc 2.7)
6 SHA-256 (since glibc 2.7)

检测规则:

  1. 查看ID是否为6,不为6告警加密算法强度不够
  2. 定义弱口令字典,根据编码(hash("passwd+salt"))规则加密弱口令字典,和/etc/shadow中的encrypted比较,相等则存在弱口令,代码可参考: https://kknews.cc/code/pyolgke.html

DB弱口令空口令

Mysql

mysql弱口令探测不使用直接连接爆破,而是去爆破存储密码hash文件的user.MYD。

  1. 通过mysql进程pid,获取/proc/[mysql_pid]/cwd/mysql/user.MYD,strings user.MYD然后解析提取里面的hash值。
  2. mysql加密方式是通过两次SHA1加密SHA1(SHA1($pass))python代码实现很简单。

其他DB

常用

1
Mysql
2
MongoDB
3
Postgresql
4
Redis
5
Memcached
  1. 这几个是常用的数据库,检测逻辑是主动发起一个连接,看是否能链接成功,可以检测弱口令以及空口令的情况。

  2. 发起连接后,最后都要调用下close,确保连接关闭。

  3. Mysql检测文件的方法难检测空口令,可以用这种主动连接的方式进行检测。

实现逻辑参考:https://github.com/y1ng1996/F-Scrack/blob/master/F-Scrack.py

参考:

https://blog.csdn.net/pyufftj/article/details/28012219

https://zhuanlan.zhihu.com/p/37165658

https://wiki.silic.wiki/习科旧站:获取mysql中user.myd中hash技巧

https://xz.aliyun.com/t/6172