Rootkit隐藏进程和端口检测

一、引言

Rootkit是一种特殊的恶意软件,它的功能是在安装目标上隐藏自身及指定的文件、进程和网络链接等信息,比较多见到的是Rootkit一般都和木马、后门等其他恶意程序结合使用。

rootkit检测也成为主机安全一项重要功能,针对rootkit中最常见隐藏进程、端口检测,主要分为两种检测思路,一种基于内核内存分析,一种基于应用层分析。

基于内存分析Rootkit检测可参考Rootkit检测,该方案缺点是需要增加内核模块,风险高,检测效果相对较好。

本文介绍第二种方案,unhide在应用层发现隐藏进程、端口,该方案风险小,可集成到主机安全agent中。

[[260779]]

二、应用层隐藏进程检测

1. 进程隐藏和检测方式

进程隐藏两种方式:

  • 替换ps命令,在读取/proc/pid目录时,过滤掉需隐藏进程信息
  • 加载内核模块,通过拦截proc文件系统的回调函数,过滤掉需隐藏进程信息

检测核心思想:

通过libc系统函数盲测进程pid的存活状态,再根据ps结果对比差异,判断该pid是隐藏进程。

unhide提供如下19种检测方式,大致可分为四类:一类通过procfs下的进程目录信息,第二类通过系统调用函数, 第三类通过前两类组合方式,第四类通过爆力破解(不推荐)。

  1. tab_test[TST_PROC].func = checkproc 
  2.    tab_test[TST_CHDIR].func = checkchdir 
  3.    tab_test[TST_OPENDIR].func = checkopendir 
  4.    tab_test[TST_READDIR].func = checkreaddir 
  5.    tab_test[TST_GETPRIO].func = checkgetpriority 
  6.    tab_test[TST_GETPGID].func = checkgetpgid 
  7.    tab_test[TST_GETSID].func = checkgetsid 
  8.    tab_test[TST_GETAFF].func = checksched_getaffinity 
  9.    tab_test[TST_GETPARM].func = checksched_getparam 
  10.    tab_test[TST_GETSCHED].func = checksched_getscheduler 
  11.    tab_test[TST_RR_INT].func = checksched_rr_get_interval 
  12.    tab_test[TST_KILL].func = checkkill 
  13.    tab_test[TST_NOPROCPS].func = checkallnoprocps 
  14.    tab_test[TST_BRUTE].func = brute 
  15.    tab_test[TST_REVERSE].func = checkallreverse 
  16.    tab_test[TST_QUICKONLY].func = checkallquick 
  17.    tab_test[TST_SYS_INFO].func = checksysinfo 
  18.    tab_test[TST_SYS_INFO2].func = checksysinfo2 
  19.    tab_test[TST_SYS_INFO3].func = checksysinfo3

从名字上可以看出,unhide使用chdir,opendir,readdir,getpriority,getpgid,getsid,sched_getaffinity,kill,sysinfo等libc函数。

下面分别从三类中各选择一种检测方式分析。

2. procfs检测

抽取checkreaddir检测分析:

  • 遍历/proc目录, 子文件名如果是数字,代表是一个进程pid
  • 读取进程状态task目录(/proc/pid/task), 获取各子线程号
  • 通过ps命令查找是否存在该线程
  • 对比差异,不存在判断为隐藏进程
    1. procdir = opendir("/proc");  
    2. dirproc = readdir(procdir));  
    3. taskdir = opendir(task);  
    4. dir = readdir(taskdir)  
    5. checkps(procpids,PS_THREAD) 

该类方法能检测出对第二种无效。

3. syscall检测

抽取checkgetsid检测分析:

max_pid通过读取 /proc/sys/kernel/pid_max获取:

  • 从1到max_pid遍历进程, 通过getsid返回值和错误码探测进程存活状态
  • 通过ps命令查找是否存在该进程
  • 再次通过getsid确认进程存活状态,防止在执行ps这时间内,进程退出了
  • 对比差异,不存在判断为隐藏进程
    1. ret = getsid(syspids) 
    2. checkps(syspids,PS_PROC | PS_THREAD); 
    3. ret = getsid(syspids) 

该类方法都能检测上述两种隐藏进程方式。

4. compund检测

抽取checkallquick检测分析:

  • 从1到max_pid遍历进程
  • 通过kill返回值和错误码探测进程存活状态
  • 通过getpriority返回值和错误码探测进程存活状态
  • 通过getpgid返回值和错误码探测进程存活状态
  • 通过getsid返回值和错误码探测进程存活状态
  • 通过sched_getaffinity返回值和错误码探测进程存活状态
  • 通过sched_getparam返回值和错误码探测进程存活状态
  • 通过sched_getscheduler返回值和错误码探测进程存活状态
  • 通过sched_rr_get_interval返回值和错误码探测进程存活状态
  • 通过chdir,opendir读取进程目录(/proc/pid)
  • 通过ps命令查找是否存在该进程
  • 再次通过kill确认进程存活状态,防止在执行ps这时间内,进程退出
  • 对比差异,只有进程不存在(found=0)或者进程经过11项检测(found == 11)认为是正常的,其余都判断为隐藏进程
    1. ret = kill(syspids, 0); 
    2. ret = getpriority(PRIO_PROCESS, syspids); 
    3. ret = getpgid(syspids); 
    4. ret = getsid(syspids); 
    5. ret = sched_getaffinity(syspids, sizeof(cpu_set_t), &mask); 
    6. ret = sched_getparam(syspids, &param); 
    7. ret = sched_getscheduler(syspids); 
    8. statstatusproc = stat(directory, &buffer); 
    9. statusdir = chdir(directory); 
    10. dir_fd = opendir(directory) ; 
    11. checkps(syspids,PS_PROC | PS_THREAD) 
    12. ret = kill(syspids, 0); 
    13. if (found_killbefore == found_killafter) { 
    14.      if ( ! ((found_killbefore == 0 && found == 0) || 
    15.              (found_killbefore == 1 && found == 11)) ) { 
    16.         printbadpid(syspids); 
    17.      } 

三、应用层隐藏端口检测

核心思想:通过libc系统函数bind,listen盲测端口

1. tcp隐藏端口检测

  • 从1到65535遍历端口
  • 创建一个基于tcp协议SOCK_STREAM的socket
  • 通过bind返回值和错误码探测端口状态
  • 如果被占用,通过listen 错误码是EADDRINUSE确定端口占用
  • 通过ss或netstat命令过滤tcp协议,查看端口情况
  • 对比差异,确认该端口为隐藏端口
    1. socketsocket_desc=socket(AF_INET,SOCK_STREAM,0); 
    2. bind(socket_desc,(struct sockaddr *)&address,sizeof(address)); 
    3. listen(socket_desc,1); 
    4. if(EADDRINUSE == errno) { 
    5.     checkoneport(i, tcpcommand, TCP); 

2. udp隐藏端口检测

相比tcp, udp使用SOCK_DGRAM的socket, 缺少listen这步,其余检测步骤类似

  1. socketsocket_desc=socket(AF_INET,SOCK_DGRAM,0); 
  2. bind(socket_desc,(struct sockaddr *)&address,sizeof(address)); 
  3. if(EADDRINUSE == errno) { 
  4.     checkoneport(u, udpcommand, UDP); 

四、结论

本文提供的通过应用层方式检测rootkit中最常见的隐藏进程和端口,风险性小,可无缝集成到主机安全agent中。

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/137844.html<

(0)
运维的头像运维
上一篇2025-03-02 18:03
下一篇 2025-03-02 18:04

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注