freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

主机入侵检测策略之基线检测
该用户已注销-0189 2021-11-27 10:49:01 352610

前言

接上篇https://www.freebuf.com/articles/web/306268.html,本篇文章主要介绍基线检测,基线检测应该是HIDS最基础的功能,不管是为了合规还是为了等保测试,基线应该说是最基础也是最重要的一项检测。

由于篇幅限制,本篇文章主要介绍基本的检测,例如特权账户检测、暴力破解和弱口令检测等。文末以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

暴力破解检测

检测规则:依旧是就监控/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中存放的密码密文格式如下:$id$salt$encrypted

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

IDMethod
1MD5
2aBlowfish (not in mainline glibc; added in some Linux distributions)
5SHA-256 (since glibc 2.7)
6SHA-512(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
1Mysql
2MongoDB
3Postgresql
4Redis
5Memcached
  1. 这几个是常用的数据库,检测逻辑是主动发起一个连接,看是否能链接成功,可以检测弱口令以及空口令的情况。
  2. 发起连接后,最后都要调用下close,确保连接关闭。
  3. Mysql检测文件的方法难检测空口令,可以用这种主动连接的方式进行检测。

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

不安全的加密算法

  • 不安全的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]++}END{for(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>

参考

  • https://blog.csdn.net/pyufftj/article/details/28012219
  • https://kknews.cc/code/pyolgke.html
  • https://github.com/jeremylong/DependencyCheck
  • https://github.com/y1ng1996/F-Scrack/blob/master/F-Scrack.py
  • https://zhuanlan.zhihu.com/p/37165658
  • https://www.maliciouskr.cc/
  • https://he1m4n6a.github.io/
  • https://wiki.silic.wiki/习科旧站:获取mysql中user.myd中hash技巧
  • https://github.com/oxff644/vluncheck
  • https://xz.aliyun.com/t/6172
# web安全 # 主机安全 # 主机安全运维
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 该用户已注销-0189 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
应急响应
该用户已注销-0189 LV.5
这家伙太懒了,还未填写个人描述!
  • 26 文章数
  • 40 关注者
vArmor代码学习下
2024-12-09
vArmor安全 | 代码学习上
2024-12-09
java字节码技术之JavaAgent 和 SecurityManager
2024-06-25