写点什么

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

  • 2021 年 12 月 08 日
  • 本文字数:4890 字

    阅读完需:约 16 分钟

前言

由于篇幅限制,本篇文章主要介绍基本的检测,例如特权账户检测、暴力破解和弱口令检测等。文末以 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"];thenecho"${Tip} 除root外发现超级用户:$RES"| tee -a $danger_file| $saveresultforuser in$Superuserdoecho$userdonefi
复制代码

异常账户检测

检测规则:


通过历史登录情况自动总结归纳常用登录账户和地点(或者提供添加白名单功能)监控/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"]  ;thenif[ -n "$newusers"];thenecho"[!!!]日志中发现新增用户:"&& echo"$newusers"echo"[*]新增用户账号及次数如下:"&& more /var/log/secure* | grep "new user"| awk '{print $8}'| awk -F '[=,]''{print $2}'| sort | uniq -c) echo"[*]日志中未发现新增加用户"| $saveresultfiif[ -n "$newgoup"];thenecho"[!!!]日志中发现新增用户组:"&& echo"$newgoup"echo"[*]新增用户组及次数如下:"&& more /var/log/secure* | grep "new group"| awk '{print $8}'| awk -F '[=,]''{print $2}'| sort | uniq -c)echo"[*]日志中未发现新增加用户组"fielseecho-e " ${Tip}日志文件不存在,请分析是否被清除${RES}!"fifi
复制代码


【一>所有资源获取<一】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"]  ;thenif[ -n "$loginsuccess"];thenecho"[*]日志中分析到以下用户成功登录:"&& echo"$loginsuccess"echo"[*]登录成功的IP及次数如下:"&& grep "Accepted "/var/log/secure* | awk '{print $11}'| sort -nr | uniq -cecho"[*]登录成功的用户及次数如下:"&& grep "Accepted"/var/log/secure* | awk '{print $9}'| sort -nr | uniq -cecho"[*]日志中未发现成功登录的情况"fiif[ -n "$loginfailed"];thenecho"[!!!]日志中发现以下登录失败的情况:"&& 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)elseecho"[*]日志中未发现登录失败的情况"fiif[ -n "$systemlogin"];thenecho"[*]本机登录情况:"&& echo"$systemlogin"echo"[*]本机登录账号及次数如下:"&& more /var/log/secure* | grep -E "sshd:session.*session opened"| awk '{print $11}'| sort -nr | uniq -c) echo"[!!!]未发现在本机登录退出情况,请注意!!!"fifi
复制代码

弱口令账户检测

系统弱口令 shadow 中存放的密码密文格式如下:salt$encrypted


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


ID  Method1  MD52a  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.htmlDB弱口令空口令Mysqlmysql弱口令探测不使用直接连接爆破,而是去爆破存储密码hash文件的user.MYD。
复制代码


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


1  Mysql2  MongoDB3  Postgresql4  Redis5  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为0Superuser=`more /etc/passwd | egrep -v '^root|^#|^(\+:\*)?:0:0:::'| awk -F: '{if($3==0) print $1}'`if[ -n "$Superuser"];thenecho'Notice:Other root account:'$Superuserforuser in$Superuserdoecho$userif["${user}"= "toor"];thenecho"Notice: BSD system default installation toor user, other systems default not installed toor user, if non-BSD system recommended to delete the account"fidonefi#检查相同的UID的克隆用户uid=`awk -F: '{a[$3]++}END{for(i in a)if(a[i]>1)print i}'/etc/passwd`if[ -n "$uid"];thenecho"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"];thenecho"Notice: The following users can log in:"foruser in$loginuserdoecho$userdone
fi#检查非系统本身自带用户if[ -f /etc/login.defs ];thenuid=$(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"];thenecho"Notice: The following users are not users of the system itself:"&& echo"$nosystemuser"fifi#检查空口令用户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"];thenecho"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"];thenecho"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] ;thenecho" ok "elseecho"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"];thenecho"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 "fiecho"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"];thenecho"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>
复制代码


用户头像

我是一名网络安全渗透师 2021.06.18 加入

关注我,后续将会带来更多精选作品,需要资料+wx:mengmengji08

评论

发布
暂无评论
主机入侵检测策略之基线检测