主机入侵检测策略之基线检测

Posted kali_Ma

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了主机入侵检测策略之基线检测相关的知识,希望对你有一定的参考价值。

前言

由于篇幅限制,本篇文章主要介绍基本的检测,例如特权账户检测、暴力破解和弱口令检测等。文末以Wazuh为例,介绍如何自定义基线检测。

基本检测

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

代码实现:

检查是否存在UID=0的用户(超级用户),系统默认root的UID为0

SSuperuser=`more /etc/passwd | egrep -v '^root|^#|^(\\+:\\*)?:0:0:::'| awk -F: 'if($3==0) print $1'`
if[ -n "$Superuser"];then
echo"$Tip 除root外发现超级用户:$RES"| tee -a $danger_file| $saveresult
foruser in$Superuser
do
echo$user
done
fi

异常账户检测

检测规则:

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

logdir="/var/log"
logdirfile=(/var/log/secure*)
newusers=$(less $logdirfile| grep "new user"| awk -F '[=,]''print $1,$2'| awk 'print $1,$2,$3,$9')
newgoup=$(less $logdirfile| grep "new group"| awk -F '[=,]''print $1,$2'| awk 'print $1,$2,$3,$9')
if[ -e "$logdir"]   && [ -s "$logdirfile"]  ;then
if[ -n "$newusers"];then
echo"[!!!]日志中发现新增用户:"&& echo"$newusers"
echo"[*]新增用户账号及次数如下:"&& more /var/log/secure* | grep "new user"| awk 'print $8'| awk -F '[=,]''print $2'| sort | uniq -c) 
echo"[*]日志中未发现新增加用户"| $saveresult
fi
if[ -n "$newgoup"];then
echo"[!!!]日志中发现新增用户组:"&& echo"$newgoup"
echo"[*]新增用户组及次数如下:"&& more /var/log/secure* | grep "new group"| awk 'print $8'| awk -F '[=,]''print $2'| sort | uniq -c)
echo"[*]日志中未发现新增加用户组"
fi
else
echo-e " $Tip日志文件不存在,请分析是否被清除$RES!"
fi
fi

【一>所有资源获取<一】
1、200份很多已经买不到的绝版电子书
2、30G安全大厂内部的视频资料
3、100份src文档
4、常见安全面试题
5、ctf大赛经典题目解析
6、全套工具包
7、应急响应笔记
8、网络安全学习路线

暴力破解检测

检测规则:依旧是就监控/var/log/secure或者/var/log/auth.log的登陆情况,定义一定的时间内某IP尝试登陆失败的次数大于某个阈值则告警。

PS:大型互联网的机器可能经常受到攻击,不想每次都告警,可以在1的基础上加上特定条件-失败多次后存在登陆成功的事件,则告警。

代码实现:

logdir="/var/log"
logdirfile=(/var/log/secure*)
loginsuccess=$(less $logdirfile| grep "Accepted password"| awk 'print $1,$2,$3,$9,$11')
loginfailed=$(less $logdirfile| grep "Failed password"| awk 'print $1,$2,$3,$9,$11')
systemlogin=$(less $logdirfile| egrep "sshd:session.*session opened"| awk 'print $1,$2,$3,$11')
if[ -e "$logdir"]   && [ -s "$logdirfile"]  ;then
if[ -n "$loginsuccess"];then
echo"[*]日志中分析到以下用户成功登录:"&& echo"$loginsuccess"
echo"[*]登录成功的IP及次数如下:"&& grep "Accepted "/var/log/secure* | awk 'print $11'| sort -nr | uniq -c
echo"[*]登录成功的用户及次数如下:"&& grep "Accepted"/var/log/secure* | awk 'print $9'| sort -nr | uniq -c
echo"[*]日志中未发现成功登录的情况"
fi
if[ -n "$loginfailed"];then
echo"[!!!]日志中发现以下登录失败的情况:"&& echo"$loginfailed"
echo"[!!!]登录失败的IP及次数如下:"&& grep "Failed password"/var/log/secure* | awk 'print $11'| sort -nr | uniq -c)
echo"[!!!]登录失败的用户及次数如下:"&& grep "Failed password"/var/log/secure* | awk 'print $9'| sort -nr | uniq -c)
else
echo"[*]日志中未发现登录失败的情况"
fi
if[ -n "$systemlogin"];then
echo"[*]本机登录情况:"&& echo"$systemlogin"
echo"[*]本机登录账号及次数如下:"&& more /var/log/secure* | grep -E "sshd:session.*session opened"| awk 'print $11'| sort -nr | uniq -c) 
echo"[!!!]未发现在本机登录退出情况,请注意!!!"
fi
fi

弱口令账户检测

系统弱口令
shadow中存放的密码密文格式如下: i d id idsalt$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-512(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检测文件的方法难检测空口令,可以用这种主动连接的方式进行检测。

不安全的加密算法

不安全的SSH 协议: 检测etc/ssh/sshd_config的Protocal是否支持SSH1
不安全/etc/shadow加密协议(弱口令检测讲解到)
低版本软件
检测规则:根据信息搜集模块搜集到的版本信息,定义漏洞版本的规则,若匹配到规则则告警。包括但不限于:

内核系统低版本
ssh低版本
各种DB低版本
nginx低版本
三方组件漏洞检测

三方组件一般是检测CVE漏洞, 关于CVE漏洞库的匹配, OWASP Dependency Check这款工具可以检测,如何嵌入到主机扫描系统中:

通过看OWASP Dependency Check源码自己实现类似的检测逻辑或者直接复用它的数据库,不过要定时更新。

上述的逻辑最好是单独的一个模块或者组件,提供一个API接口,主机扫描系统只要输入对应的组件的版本信息,就能得到漏洞的反馈信息。

Wazuh自定义基线检测
关于基线这块,Osqury已经很完善了。因为便捷以及各种优势,目前Wazuh已成为了很多企业的首选开源解决方案。我们上篇文章也提到过Wazuh,这里就不再展开介绍了。

Wazuh默认拥有日志分析,文件完整性检查,rootkit检测,但这些默认的规则,覆盖得比较多、比较泛,没有针对性。对此可以选择针对性的优化、把一些关键的文件、配置监控单独做成一条规则针对这些,比如在基线检测方面,可以加入一些自定义的检测脚本,用ossec检测框架去定时脚本执行,反馈结果到server端并进行分析。然后将不同告警可以设置不同的level,以区别重要程度。

例如,自定义安全检查脚本,用于检查系统安全基线配置情况:

check_system()
#检查是否存在UID=0的用户(超级用户),系统默认root的UID为0
Superuser=`more /etc/passwd | egrep -v '^root|^#|^(\\+:\\*)?:0:0:::'| awk -F: 'if($3==0) print $1'`
if[ -n "$Superuser"];then
echo'Notice:Other root account:'$Superuser
foruser in$Superuser
do
echo$user
if["$user"= "toor"];then
echo"Notice: BSD system default installation toor user, other systems default not installed toor user, if non-BSD system recommended to delete the account"
fi
done
fi
#检查相同的UID的克隆用户
uid=`awk -F: 'a[$3]++ENDfor(i in a)if(a[i]>1)print i'/etc/passwd`
if[ -n "$uid"];then
echo"Notice: The following users were found to have the same UID"
(more /etc/passwd | grep $uid| awk -F: 'print $1')
fi
#检查可登录用户
loginuser=`cat /etc/passwd  | grep -E "/bin/bash$"| awk -F: 'print $1'`
if[ -n "$loginuser"];then
echo"Notice: The following users can log in:"
foruser in$loginuser
do
echo$user
done

fi
#检查非系统本身自带用户
if[ -f /etc/login.defs ];then
uid=$(grep "^UID_MIN"/etc/login.defs | awk 'print $2')
echo"The system minimum UID is $uid"
nosystemuser=`gawk -F: 'if ($3>='$uid' && $3!=65534) print $1'/etc/passwd`
if[ -n "$nosystemuser"];then
echo"Notice: The following users are not users of the system itself:"&& echo"$nosystemuser"
fi
fi
#检查空口令用户
nopasswd=`awk -F: '($2 == "")  print $1 '/etc/shadow | grep [a-zA-Z]`

if[ -n "$nopasswd"];then

echo"Notice: account has empty passwd"&& echo"$nopasswd"
fi
#检查相同用户组名
groupname=$(more /etc/group | grep -v "^$"| awk -F: 'print $1'| uniq -d)
if[ -n "$groupname"];then
echo"Notice: Same user group name found:"&& echo"$groupname"

fi
#检查相同GID用户组
groupuid=$(more /etc/group | grep -v "^$"| awk -F: 'print $3'| uniq -d)
if[ -n "$groupuid"];then
echo"Notice: Discover the same GID user group:"&& echo"$groupuid"
fi
#检查UID=0的用户
result=`awk -F: '($3 == "0")  print $1 '/etc/passwd | grep '[^root]'`

if[ -n "$result"];then

echo'Notice:Other root account:'$result

fi
#检查密码策略
passmax=`cat /etc/login.defs | grep PASS_MAX_DAYS | grep -v ^# | awk 'print $2'`
passmin=`cat /etc/login.defs | grep PASS_MIN_DAYS | grep -v ^# | awk 'print $2'`
passlen=`cat /etc/login.defs | grep PASS_MIN_LEN | grep -v ^# | awk 'print $2'`
passage=`cat /etc/login.defs | grep PASS_WARN_AGE | grep -v ^# | awk 'print $2'`
if[ $passmax-le 90 -a $passmax-gt 0 ] &&  [ $passmin-ge 6 ]  &&  [ $passlen-ge 11 ] &&  [ $passage-ge 30 -a $passage-lt $passmax] ;then
echo" ok  "
else
echo"Notice: The password policy needs to be improved, the policy is as follows:"&& more /etc/login.defs | grep ^[^#]| grep "PASS"
fi
#检查用户口令加密情况
noenypasswd=`awk -F: 'if($2!="x") print $1'/etc/passwd`
if[ -n "$noenypasswd"];then
echo"Notice: The following user passwords are not encrypted:"&& echo"$noenypasswd"
echo-e  "Reference: \\nPASS_MAX_DAYS<=90 \\nPASS_MIN_DAYS>=6 \\nPASS_MIN_LEN>= 8 \\nPASS_WARN_AGE>=30 "
fi
echo"Notice: The password complexity policy is as follows:"&& more /etc/pam.d/system-auth | grep -v "#"
#账户过期情况
NOW=$(date "+%s")
day=$(($NOW/86400))
passwdexpired=$(grep -v ":[\\!\\*x]([\\*\\!])?:"/etc/shadow | awk -v today=$day-F: ' if (($5!="") && (today>$3+$5))  print $1 ')
if[ -n "$passwdexpired"];then
echo"The following users have expired passwords:"&& echo"$passwdexpired"
fi

check_system

check_network()
 .......
check_file()....
.....

ossec 配置文件中添加如下内容,每隔10小时进行一次扫描:

<localfile>
<log_format>command</log_format>
<command>/bin/bash /var/ossec/shell/systemCheck.sh</command>
<frequency>36000</frequency>
</localfile>
<localfile>
<log_format>command</log_format>
<command>python /var/ossec/shell/webshellScan.py</command>
<frequency>36000</frequency>
</localfile>
类似的,监控系统iptables变化、authorized_keys变化。

<localfile>
<log_format>command</log_format>
<command>iptables -L -n|md5sum|awk 'print $1'</command>
</localfile>
<localfile>                                                       
<localfile>                
<log_format>command</log_format>                            
<command>cat /root/.ssh/authorized_keys|md5sum|awk 'print $1'</command>
</localfile>

以上是关于主机入侵检测策略之基线检测的主要内容,如果未能解决你的问题,请参考以下文章

腾讯云主机安全等保三级CentOS7安全基线检查策略

阿里云安全基线 记录如下 不定时更新

SSH安全策略检测配置

YOLO系列检测器优化策略之Match positive samples和Eliminate grid sensitivity

(王道408考研操作系统)第二章进程管理-第四节3:死锁处理策略之检测和解除

使用 Pygments 检测代码片段的编程语言