基线检测
基线检测应该是HIDS最基础的功能,不管是为了合规还是为了等保测试,基线应该说是最基础也是最重要的一项检测。
Sudoers检测
配置用例: user1 ALL=(ALL) NOPASSWD: ALL
对应含义: 用户 登录的主机=(可以变换的身份) 不需要密码执行: 可以执行的命令
归纳五种危险的配置:
未明确限制可以使用命令白名单的用户
ALL ALL=(root) NOPASSWD:CMD
第一个ALL表示所有用户都可以使用申请的命令白命令。 该配置扩大了可以升权的用户范围,存在潜在提权风险。
未明确限制升权后的用户
username ALL=(ALL) NOPASSWD:CMD
括号里ALL表示用户可以升权到任意用户(配置成root也是高风险),包括root和其他所有用户。该配置扩大了升权后的用户范围,存在潜在提权风险。
待升权命令的自身访问权限较低,存在被替换风险
user1 ALL=(root) NOPASSWD:/home/user1/test
/home/user1/test的自身访问权限为user1。用户获得user1权限后,可以把该命令替换为某个破坏性命令导致提权。
待升权命令仅包含命令,而没有明确参数
username ALL=(root) NOPASSWD:/bin/bash
配置了/bin/bash,没有限制对应的参数(执行的脚本),可导致执行任意脚本提权。
待升权命令中使用”*”不当
user1 ALL=(root) NOPASSWD:/sbin/ip netns exec qrouter-[0-9a-z]* timeout 5 /sbin/tcpdump -s 60 -c [1-3]*
这里申请的命令/sbin/ip,不再是单独的命令,而是加上了参数,但是该参数中使用了通配符”” 。 ””作为通配符,可以匹配任意个字符,包括空格,分号等。所以可以匹配任意命令。
检测规则:
- 上面讲了5条基本的危险配置,可以简单的归结为
(可以变换的身份)
为root|ALL
,后面为NOPASSWD
就很可能存在风险。即可提炼出正则规则,配置告警。 - 根据实际情况,如果实际业务中上面的误报多,就可以对最后一步命令的进行进一步的监控过滤。可采取白名单或者黑名单命令的形式进行监控,黑名单命令例如:
su
、sh
·、rm
等(一切可能会危害系统的命令)。如果是加了参数,就监控参数中是否包含“*”号。
不安全的加密算法
- 不安全的SSH 协议: 检测etc/ssh/sshd_config的Protocal是否支持SSH1
- 不安全/etc/shadow加密协议(弱口令检测讲解到)
低版本软件
检测规则:
- 根据信息搜集模块搜集到的版本信息,定义漏洞版本的规则,若匹配到规则则告警。包括但不限于:
- 内核系统低版本
- 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接口,主机扫描系统只要输入对应的组件的版本信息,就能得到漏洞的反馈信息。
基本检测
特权账户检测
检测规则:
- 通过之前的信息搜集模块搜集到的用户信息,判断是否存在uid=0且用户名不为root的特权账户。
异常账户检测
检测规则:
- 通过历史登录情况自动总结归纳常用登录账户和地点(或者提供添加白名单功能)
- 监控
/var/log/secure
或者/var/log/auth.log
SSH的登陆情况,若存在成功事件并且用户不在白名单上,则告警。
暴力破解检测
检测规则:
- 依旧是就监控
/var/log/secure
或者/var/log/auth.log
的登陆情况,定义一定的时间内某IP尝试登陆失败的次数大于某个阈值则告警。 - 大型互联网的机器可能经常受到攻击,不想每次都告警,可以在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) |
检测规则:
- 查看ID是否为6,不为6告警加密算法强度不够
- 定义弱口令字典,根据
编码(hash("passwd+salt"))
规则加密弱口令字典,和/etc/shadow中的encrypted比较,相等则存在弱口令,代码可参考: https://kknews.cc/code/pyolgke.html
DB弱口令空口令
Mysql
mysql弱口令探测不使用直接连接爆破,而是去爆破存储密码hash文件的user.MYD。
- 通过mysql进程pid,获取/proc/[mysql_pid]/cwd/mysql/user.MYD,
strings user.MYD
然后解析提取里面的hash值。 - mysql加密方式是通过两次SHA1加密
SHA1(SHA1($pass))
,python代码实现很简单。
其他DB
常用
1 | Mysql |
2 | MongoDB |
3 | Postgresql |
4 | Redis |
5 | Memcached |
这几个是常用的数据库,检测逻辑是主动发起一个连接,看是否能链接成功,可以检测弱口令以及空口令的情况。
发起连接后,最后都要调用下close,确保连接关闭。
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技巧