OSSEC 源码解析

 OSSEC 源码解析

一、克隆 OSSEC 仓库:

git clone https://github.com/ossec/ossec-hids.git

要分析 OSSEC 的规则引擎源码,你需要查看 OSSEC 的源代码仓库,特别是与规则解析执行相关的部分

 

二、客户端 OSSEC Agent

配置文件说明:https://www.51cto.com/article/407645.html

ossec.conf:            主配置文件,指定要监控的目录、进程、文件类型等;警报输出,如邮件通知、Syslog服务器等
local_rules.xml:       Rootkit检测规则文件中定义特定的rootkit检测规则。例如,可以添加规则来检测已知的rootkit特征或异常行为。

(一)、规则解析与执行代码

src/rules.c:           这个文件中包含了处理规则文件的函数,如,加载和解析规则文件。
src/lua/rules_lua.c:   这部分代码处理 Lua 脚本的加载和执行。src/lua/rules_lua.c 和 src/lua/rules_lua.h:这些文件包含了与 Lua 脚本交互的代码。

关键函数:

load_rules():加载和解析规则文件。
execute_rules():执行匹配的规则。
lua_execute_rule():在 Lua 环境中执行规则。 这个函数会调用 Lua 解释器来执行具体的规则脚本。例如,你可以查看如何传递日志数据到 Lua 脚本,并如何从脚本中获取结果。

 

OSSEC Agent
平台 程序入口 :start_agent 进程/服务 子线程 消息接收
Windows平台

后台服务入口:  win_agent.c::main() //src\win32

=> win_service.c::os_WinMain() ->     //src\win32
                       OssecServiceStart()
=> win_agent.c::local_start()               //src\win32
=> start_agent.c::start_agent(1);         //src\client-agent

 

win_agent.c::skthread()

receiver-win.c :: receiver_thread()

 

=*=> receiver-win.c :: receiver_thread()
=> win_execd.c :: WinExecdRun()
=> exec.c :: ExecCmd_Win32() --> CreateProcess

Windows平台

前端Windows窗口程序入口点:os_win32ui.c::WinMain() ->    //src\win32\ui

DlgProc()

     
Linux平台 入口: main.c::main()                                                 //src\client-agent
=> agentd.c::AgentdStart(dir, uid, gid, user, group)   //src\client-agent
=> start_agent.c::start_agent(1);                                //src\client-agent
     

=*=> main.c::main()
=> agentd.c::AgentdStart()
=> receiver.c:: receive_msg()

 

(二)rootkit检测

关于rootkit检测部分的源码位于 ossec-hids\src\rootcheck 目录下:

 整体代码结构,详见: https://blog.csdn.net/weixin_34749048/article/details/112639273

run_check.c       :: start_daemon()  
run_rk_check.c    :: run_rk_check()  
check_rc_policy.c :: check_rc_winaudit()    // 审计
                  -> check_rc_winmalware()  // 恶意软件
                  -> check_rc_winapps()     // windows app的特征
common_rcl.c      :: rkcl_get_entry()       //* rootcheck功能实现的核心函数
                  -> _rkcl_getrootdir()
                  -> _rkcl_getfp()
                  -> rkcl_get_vars()
common.c          :: rk_check_file(char *file, char *pattern)
win-common.c      :: is_registry(char *entry_name, char *reg_option, char *reg_value)  
common.c          :: rk_check_dir(const char *dir, const char *file, char *pattern)
                  -> is_process(char *value, OSList *p_list)

 

 

  

附录 A:编译连接与安装配置

参考:https://www.anquanke.com/post/id/238774

Makefile
     
Windows平台 src/Makefie win32/ossec-agent.exe: win32/icon.o win32/win_agent.o win32/win_service.o $(filter-out syscheckd/seechanges.o, ${syscheck_o}) ${rootcheck_o} $(filter-out client-agent/main.o, $(filter-out client-agent/agentd.o, $(filter-out client-agent/event-forward.o, ${client_agent_o}))) $(filter-out logcollector/main.o, ${os_logcollector_o}) ${os_execd_o} ${ossec_libs} ${ZLIB_LIB}
${OSSEC_CCBIN} -DARGV0=\"ossec-agent\" -DOSSECHIDS ${OSSEC_CFLAGS} $^ ${OSSEC_LDFLAGS} -o $@
Linux平台    
posted @ 2024-10-29 12:03  suntroop  阅读(97)  评论(0)    收藏  举报