标题 | 简介 | 类型 | 公开时间 | ||||||||||||||
|
|||||||||||||||||
|
|||||||||||||||||
详情 | |||||||||||||||||
[SAFE-ID: JIWO-2025-2334] 作者: 凉笙 发表于: [2019-03-28] [2019-03-28]被用户:凉笙 修改过
本文共 [772] 位读者顶过
0x01:前言WEB层的入侵检测一般会根据agent头信息、POST包请求信息基于攻击特征结合多逻辑语句以及响应体检测,HIDS基于主机层面去检测,关于HIDS入侵检测的内容比较多,这里根据自己的经验总结通用的应急流程,应急响应是个体力活,但是很有意思,攻防对抗中,谁更了解这个系统,谁就拥有主动权。 一.Linux应急响应或入侵检测的检查项目获取了什么信息?目的又是什么?1.快照信息:HIDS可以获取服务器的当前运行情况的信息,基础信息,日志信息,便于安全监控和后期取证或深入分析; 2.异常检查:初筛作用,初步做些排查和异常检查,若发现异常,人工入侵分析; 3.入侵检测:如 rkmod 等后门特征检查,包括历史曾经发现过的后门检查; 二. 入侵检测和Linux应急检查为对应关系,二者关注什么地方和区别是什么?1.应急响应人工肉眼看,适用于经验分析; 2.入侵检测使用分析脚本以及大数据自动化处理和判断,适用于全面分析和大规模的数据分析; 3.入侵检测一般回存储到 ES 的 索引中,使用 常见的安全架构SOC分析工具来处理,也作为学习数据。 0x02:排查流程一:基础信息(1)系统版本、主机名、内核版本收集分析项:最基本的提权方式,查看内核版本,搜索对应的exp进行提权 ![]() (2)系统运行时间 分析方法:系统当前已经运行时间、时区等信息,在海量的日志里,在排除一些正常业务的日志后,以时间/IP为准线是一个比较不错的主线。 ![]() (3)网卡配置 分析方法:判断网卡是否为混杂模式来确定机器是否在嗅探流量。 ![]() (4)路由信息 分析方法:查找通过同一个路由表进出。 ![]() (5)arp信息 分析方法: 1.服务器上arp 记录应该是只有实际建立过连接的 IP 才有 arp,可以聚类检查是否有超同组业务以外的 arp 地址。 2.mc地址对应的 ip 应该是固定的,可以检查是否有 mac和 IP 不一致的,如有就是有 arp 欺骗 ![]() (6)登录用户 分析项:有无爆破以及爆破痕迹,有无异常登录痕迹 分析方法: ![]() 1.除root以为UID为0的帐号(UID为0的帐号也不一定都是可疑帐号,Freebsd默认存在toor帐号,且uid为0.(toor 在BSD官网解释为root替代帐号,属于可信帐号)) 2.非系统管理员添加的具有shell权限的帐号 ![]() (7)具有 shell 环境的用户——异常用户 分析方法: 1.查看当前环境中具有shell权限的用户,分析找出可疑用户。 2.聚合统计,发现未知的异常用户。 ![]() (8)sudo授权信息——异常用户权限 分析方法: 1.排除法,过滤掉正常用户的sudo权限,找出那些无需密码就可以执行root命令的用户。 2.在同类数据中聚合这些异常权限用户,统计可控的服务器范围 ![]() (9)登录信息 分析项: (a)last(数据源为/var/log/wtmp,wtmp文件中保存的是登录过本系统的用户的信息),统计系统所有用户的登录时间和信息,包括系统曾经进行过重启操作的重启时间信息,获取用户成功登陆的时间点和在线时长
(b)lastlog 系统中所有用户最近一次登录信息(源为/var/log/utmp文件)
(c) lastb(数据源为/var/log/btmp) 用于显示用户错误的登录列表;
3.同一类数据登录用户进行聚合统计排序,查看登录错误过多IP是否存在登录成功情况。 ![]() (10)系统敏感文件/目录 分析方法: 毋庸置疑,无论是weshell,还是后门总会对系统文件做修改的,分析有无可疑文件、系统新增文件
TMP敏感目录 最近刚爆发的WatchDogsMiner挖矿蠕虫表现为/tmp临时目录存在watchdogs文件,出现了crontab任务异常、网络异常、系统文件被删除、CPU异常卡顿等情况
(11)异常访问目标 分析方法:分析root用户登录时源IP地址,这里的是主动SSH 外联 IP。 1.获取 /root/.ssh/known_hosts文件得到root用 户登录时源IP地址 2.通过白名单过滤,判断是否有异常ssh 登录; 3.通过同类型业务聚类,判断是否有超范围访问。 ![]() 其他用户登录时源IP地址 分析方法: 这里的是主动SSH 外联 IP。 1.通过遍历 /home/目录下的用户目录,获取 /home/*/.ssh/known_hosts文件得到该用户登录时源IP地址 2.通过白名单过滤,判断是否有异常ssh 登录; 3.通过同类型业务聚类,判断是否有超范围访问。
(12)异常公钥用户 分析方法:分析异常root用户公钥登录时公钥信息 1.获取 /root/.ssh/authorized_keys文件得到root用户公钥登录时公钥信息 2.根据白名单过滤root下公钥用户,查找异常的用户。 3.在同类数据中聚合统计,找到超过范围的异常公钥用户。 ![]() 其他用户公钥登录时公钥信息 分析方法: 1.通过遍历 /home/目录下的用户目录,获取 /home/*/.ssh/authorized_keys文件得到该用户公钥登录时公钥信息 2.根据白名单过滤公钥用户,查找异常的用户。 3.找出超过范围的异常公钥用户。 ![]() (13)防火墙配置信息 分析方法: 排查对已受访问控制的服务和系统是否有不规范的防火墙信息 ![]() (14)系统中rpm包校验 分析方法: -V校验rpm包中的文件有无修改,没有提示即没有修改,主要验证8个信息
二:异常检测(1)开机启动项 /etc/init.d是 /etc/rc.d/init.d 的软链接,测试新装的linux系统必须开启的服务,其他根据自己的工作业务需求
(2)/etc/rc.local 脚本内容——异常自动执行脚本 分析方法: 1.基于白名单过滤,查找异常的执行命令 2.基于已知的特征做数量统计或异常行为分析。 ![]()
配置文件会在用户登陆之前读取,这个文件中写入了什么命令,在每次系统启动时都会执行一次,默认内容为touch /var/lock/subsys/local (3)计划任务 分析方法: 1.通过关键字发现root的恶意计划任务,如(反弹命令) 2.白名单过滤找到异常的计划任务 crontab -l 或者 crontab-c /var/spool/cron/ -l ps:/etc/crontab为系统执行计划,/var/spool/cron/为以帐号来区分每个用户的执行任务 (4)/etc/cron.d 计划任务内容——etc下异常计划任务 分析方法: 1.白名单过滤找到异常的计划任务 2.关注挖矿等计划任务 find /etc/cron.d/ |xargs grep -Ev "^#" (5)用户定义的自启动项 分析方法: 1.白名单过滤发现异常启动项。 2.统计分析,查找未知的异常自启服务 chkconfig --list (6)系统自启动项 分析方法: 1.白名单过滤发现异常启动项。 systemctl list-unit-files | grep enabled 系统启动项参考接 (7)系统内核模块运行时的文件信息 分析方法: 1.根据文件夹时间戳,再白名单过滤找到未知的恶意内核模块 2.根据安全报告/威胁情况分析有无恶意的内核模块 默认系统内核模块文件信息 ls -alt /sys/module
| 模块 | 模块 | 模块 | 模块 | (8)内核模块 分析方法: 1.白名单过滤,查找异常的内核模块。 2.相同类型统计分析,发现被植入的未知的内核模块 3.不断的根据业务扩充白名单 排查系统常见白名单 ![]() (9)运行进程 分析方法: 1.根据白名单过滤发现父进程为1的异常进程。 2.根据cpu使用率发现挖矿进程。 3.根据进程运行时间来发现异常进程。 4.查找无父进程的孤立进程 5.通过对比两种方式获取的进程数是否相等来判断是否有正在运行的进程被隐藏 6.通过rootkit分析工具,如chkproc,chkrootkit,rootkit hunter ps auxfww 案例:隐藏进程参考链接
(10)网络连接信息 分析方法: 1.发现异常监听端口进程,异常的连接通信。 2.与后面的lsof输出结果做对比来发现异常端口和连接(命令替换或者rootkit过滤不完全)。 3.同类数据中聚合统计,如:pname,dst_ip,dst_port,src_port发现其恶意控制范围 netstat -antup (11)netstat输出sockets信息 分析方法: 1.通过白名单过滤来发现具有socket连接的进程信息 netstat -plantux (12)lsof获取网络连接信息 分析方法: 1.与上面netstat获取的数据进行对比分析发现异常端口和连接 lsof -nPi | grep -v"127.0.0.1" |grep -v "::1" ps: 1.netstat无权限控制,lsof有权限控制,只能看到本用户 2.losf能看到pid和用户,可以找到哪个进程占用了这个端口 (13)进程文件 分析方法: 1.通过白名单过滤来发现异常进程。 2.发现已处于deleted状态的异常进程 find /proc -path '/proc/sys/fs'-prune -o -print |xargs ls -al | grep'exe ->' | sort -u >tmp.txt (14)进程文件MD5计算 分析方法: 1.根据版本,和已知MD5值作对比判断文件是否被替换。 2.Md5可以diff原始文件或者通过 VT跑一跑,分析有没有已知恶意程序 ![]() (15)具有SUID的可执行文件 分析方法:通过白名单顾虑发现可疑的就有suid权限的文件 已知可以用来提权的linux可执行文件有:
默认具有SUID的可执行文件如下: find / -user root -perm -4000 -print2>/dev/null ![]() (16)进程中被删除的文件 分析方法: 1.通过已删除的文件名判断是否为恶意的进程或者是被注入的恶意文件。 lsof | grep DEL (17)rootkit检测(难点) 分析方法:通过判断 /sys/module/rkmod 文件夹是否存在来判断是否感染已知的rkmod ![]() 三:日志异常检测日志对于安全来说,非常重要,他记录了系统每天发生的各种各样的事情,你可以通过它来检查错误发生的原因,或者受到攻击时攻击者留下的痕迹。日志主要的功能有:审计和监测。他还可以实时的监测系统状态,监测和追踪侵入者等等。 在linux系统中,有三个主要的日志子系统:
对日志的理解:
日志关注的内容:
(1)web日志 分析项: 1.对不存在的文件过度访问 2.看上去是url的一部分的代码(sql,html) 3.访问接受用户输入的危险页面 4.一般情况下排除用户认证失败(错误代码:401,403)、无效的请求(错误代码:400)、内部服务器错误(错误代码:500) 5.统计学,如统计访问量较多的IP、访问业务较少的动态的疑似webshell的页面 …… 当然也不同一概而论,如果排查400的错误页面,如访问shell.php,会得到日志 ![]() 稍微改变下后门,添加header一句代码之后就会是 ![]()
(2)Audit日志 Linux审计系统提供了一种跟踪系统上与安全相关的信息的方法。基于预先配置的规则,审核生成日志条目以记录尽可能多的关于系统上发生的事件信息。使用auditd可以实现如下场景的审计监控:
a).错误登录日志 分析方法: 1.根据错误登录频次发现异常登录用户、登录IP。 2.与passwd_login_users标签数据作对比,发现异常用户。 3.判断是否有超正常范围的 IP 登录记录。 4.同类数据聚合统计acct用户,数量极少的用户需要人工排查 grep -i "fail"/var/log/audit/audit.log* b).sudo操作日志 分析方法: 1.排除法,过滤掉正常用户的sudo权限 2.在同类数据中聚合这些异常权限用户,统计可控的服务器范围 grep -i "sudo"/var/log/audit/audit.log* c).信息统计 分析方法:获取系统近一个月的统计信息,如:用户数量,错误登录用户数,执行命令数,事件数等 Aureport d):其他分析 分析方法: 1.根据业务排除系统正常的操作日志 2.分析有无类似无bash环境的用户的操作记录,如apache用户的操作等 (3)bash_history 分析方法: 1.有无反弹shell 2.有无敏感的操作记录,如删除日志、端口转发等内网渗透操作 ![]() (4)登录日志 1.获取 /var/log/ 目录下 audit、btmp、wtmp、secure、cron、lastlog日志 2.异常常登录、异常用户、异常计划任务; 3.用排除法,去掉正常登录 IP,找出异常登录 IP; 4.通过白名单过滤,判断是否有异常ssh 登录; 5.统计确认是否有异常计划任务; 6.排除系统正常业务简化内容 7.通过人工确认 last 这个命令可用于查看我们系统的成功登录、关机、重启等情况,本质就是将/var/log/wtmp文件格式化输出,因此如果该文件被删除,则无法输出结果。 相关命令: ![]() lastb 这个命令用于查看登录失败的情况,本质就是将/var/log/btmp文件格式化输出。 相关命令: ![]() lastlog 这个命令用于查看用户上一次的登录情况,本质就是将/var/log/lastlog文件格式化输出。相关命令: ![]() who 这个命令用户查看当前登录系统的情况,本质就是将/var/log/utmp文件格式化输出。主要用来查看当前用户名称,以及登陆的ip地址信息,w命令与who一样,会更详细一些。 (5)系统日志 如常见的secure、cron日志,结合业务进行分析 1.linux命令组合拳的使用 ![]() 关键的信息点
0x03:半自动化以下内容可能会辣眼睛,观看时请不要喝水,linux实现常用shell,安全的小伙伴们一般都比较不一样的风格,用python实现简单的功能吧~ system()数打开一个子shell来执行系统命令,其返回值只会返回一个状态码,popen()会打开一个管道,返回结果是一个连接管道的文件对象,可以从该文件对象中读取返回结果
|