前言

本系列文章将对HIDS做个简介,互联网团队自研一个HIDS系统,需要研发、策略、运营。研发和运营将不做介绍,本系列就对HIDS的核心(安全策略)做个简单的研究。基本上是根据自己的整理的思维导图做个梳理(暂时只研究linux的策略)

介绍

主机入侵检测系统(HIDS)是基于主机的入侵检测系统,部署在需要防护的主机服务器上的代理程序,用于监控和报告系统配置和应用程序活动。一些常见的功能包括日志分析,完整性测试、策略实施和rootkit检测。自研的HIDS可以针对特定用例进行定制,使得安全研究中可以及时方便的构建自定义规则。目前开源的入侵检测系统有大名鼎鼎的ossec、国内开源的yulong以及facebook的osquery。HIDS检测的核心数据包含命令、网络、文件三大类型,文件产生进程、进程产生网络。HIDS的各种安全策略都是通过这3种类型进行安全分析而得出的规则。

架构

目前大部分的HIDS平台建设主要分三大部分:终端Agent监控组件,Dashboard控制面板和与SIEM、运维数据等其他平台对接的接口集合

终端Agent组件:主要作用包括监控文件变更、监控服务器状态、下发一些操作指令等。

DashBoard:用来执行一些策略推送、资源管理方面的操作

MQ && Servers:用来做负载均衡并吞吐数据到数据库

Database:数据库

SIEM APIs:用来将HIDS的数据和SIEM做整合

1

功能

  1. 基础信息收集:系统版本号、系统用户、web组件、数据库、三方组件包等信息,主要用于CVE漏洞检测以及应急响应。
  2. 日志监控:主要是登录相关的日志、bash日志以及webserver产生的日志,主用用做异常登录监控、危险命令监控以及基础DOS检测。
  3. 文件监控:新增文件、敏感权限文件、核心文件变动监控、crontab文件监控,主要用于rookit检测、webshell监控等。
  4. 进程监控:主要用于木马、反弹shell、rookit等检测。
  5. 流量监控:主要用于木马,反弹shell等发生网络行为的一些异常监控。
  6. 系统命令监控:主要用于入侵后命令执行的检测。

信息搜集

系统基本信息

  • 系统版本:根据操作系统解析相应 /etc/readhat-release/etc/redhat-release/etc/gentoo-release文件系统版本信息搜集。

  • keneral信息:解析/proc/cmdline/proc/version

  • 用户信息:通过/etc/passwd文件搜集用户信息,剔除nologin的用户

  • 进程信息:通过遍历/proc目录下获取所有的进程信息,取信息参考[/proc目录结构](https://common.cnblogs.com/editor/tiny_mce/plugins/preview/ http://man7.org/linux/man-pages/man5/proc.5.html )

  • 环境变量信息:切换到各个用户,运行以下[命令](https://common.cnblogs.com/editor/tiny_mce/plugins/preview/ https://www.jianshu.com/p/fec33aed017b)。

    • set命令显示当前shell的变量,包括当前用户的变量;
    • env命令显示当前用户的变量;
    • export命令显示当前导出成用户变量的shell变量。
  • 已登录用户信息:已登录用户保存在/var/run/utmp(对应linux who命令),c函数getutxent可直接解析此文件获取信息

  • 历史登录用户信息:已登录用户保存在/var/run/utmp/(对用linux last命令),c函数getutxent可直接解析此文件获取信息

  • WEB Server进程信息:通过监控到的所有的进程信息,筛选出命令行运行了nginx|httpd|apache|tomcat|weblogic|jboss|jetty等webserver的信息。通过/proc/[pid]/cmdline获取到服务运行的命令行,一般是用于搜集webserver的版本号以及webserver的web代码路径。不同的webserver要通过不同的方法的命令和方法获得,例如nginx可以通过找到nginx的路径运行nginx –v获得版本信息,通过读取/proc/[pid]/cmdline命令行信息匹配-c的内容或者/proc/[pid]/cwd运行目录获取到web文件的路径。

  • 数据库信息进程信息:数据库配置路径和版本的获取方法和web路径获取方法类似。

  • 三方组件信息:三方组件包最常见的就是java的三方组件,获取方法是遍历webservers三方路径下的jar文件。如果是war文件部署,还需要把war包解压,然后再重复上述步骤遍历.jar文件获取到三方组件的名字和版本号。另一种更优雅获取组件的方式可能是解析web应用的pom.xml文件(并非所有java web应用程序都有),文件里的标签 ``管理着三方组件的信息。

    其他组件的搜集(例如ThinkPHP等框架),主要也就是匹配框架指纹(可能根据robots.txt文件,可能根据一个文件里的特定内容等)这个就需要大家去网上或者自己搭建搜集指纹,可以优先常用cms的识别方法,后期可慢慢优化添加其他框架。

  • crontab信息:/etc/crontab文件保存系统计划任务,/var/spool/cron/文件夹保存用户计划任务

    1
    "/etc/cron.d/", // system all
    2
    "/var/at/tabs/", // user mac:lion
    3
    "/var/spool/cron/", // user linux:centos
    4
    "/var/spool/cron/crontabs/", // user linux:debian

    上面的路径是开源HIDS里定义的

  • authorized信息:遍历所有加目录下的".ssh/authorized_keys",".ssh/authorized_keys2"文件

  • konw_host文件:遍历所有用户家目录下的.ssh/known_hosts文件

  • sudoers信息:解析/etc/sudoers/etc/sudoers.d/目录下的文件

  • iptables信息:解析/proc/net/ip_tables_names文件

  • 系统控制文件:解析系统控制配置文件

    • 系统文件路径:/etc/sysct.conf

    • 系统控制文件可能存在路径

      1
      "/run/sysctl.d/%.conf",           
      2
      "/etc/sysctl.d/%.conf",
      3
      "/usr/local/lib/sysctl.d/%.conf", 
      4
      "/usr/lib/sysctl.d/%.conf",
      5
      "/lib/sysctl.d/%.conf",
  • 其他信息(非完整):

    • memory_map:解析/proc/iomem
    • mounts:解析/proc/mounts
    • modules:解析/proc/modules
    • memory_info:解析/proc/meminfo
    • shared_memory:通过shmctl函数遍历merory id从1遍历到最大
    • uptime:通过sysctl函数获取boottime

重要文件监控

这项功能实现很简单,就是定时计算整个目录下文件或者单个的Hash值并存储起来。但是哪些文件属于重要文件就需要安全人员去研究定义,这个过程可能不是一蹴而就,一方面可能新的漏洞层出不穷,一方面是受限于个人的知识点有限,无法梳理出所有通用的漏洞策略。以下是一些我的不完全整理:

  • /bin/ps/bin/netstat/usr/sbin/lsof/usr/bin/top等命令:rookit时候hacker可能会替换这些系统命令

  • libc.so文件:ubuntu平台/usr/lib/x86_64-linux-gnu/libc.so,centos平台/lib64/libc.so.6。查看某个平台具体的libc.so文件路径,可以运行ldd ls | grep libc.so

  • 开机启动文件:

  • /etc/profile文件:本文件可设置全局的系统变量。

  • 内核模块: ls -alt /sys/module

  • 预加载文件:/etc/ld.so.preload

  • suid文件监控:全局搜索是不太现实,一般服务器负载都比较高,全局搜索耗时和对系统负担大。

    1
    "/bin",           
    2
    "/sbin",           
    3
    "/usr/bin", 
    4
    "/usr/sbin",
    5
    "/usr/local/bin", 
    6
    "/usr/local/sbin", 
    7
    "/tmp",

    搜索上述几个路径的文件,判断权限是suid和guid

日志搜集

  • /var/log/secure:Linux系统的安全日志,记录用户和工作组变化情况、用户登陆认证情况。一般入侵告警ssh被尝试爆破就是通过这个文件来进行规则制定的。
  • /var/log/wtmp:该日志文件永久记录每个用户登录、注销及系统的启动、停机的事件,这个文件是二进制文件,cat查看不了,可以使用last命令查看。此文件可用于异常用户登录检测,通过检测异常的IP和登录地进行告警。
  • history日志:监控用户输入的历史命令,后续会讲到具体做法。
  • webserver日志:主要用于应急响应或者做些cc攻击的防御,是否集成到HIDS里有待商榷。定位到日志的具体路径是难点,做简单的cc攻击防御的话,最简单可以通过ip时间段内访问频率来设置防御策略。

参考:

https://www.freebuf.com/articles/es/197337.html

https://www.freebuf.com/articles/es/194510.html

img