Linux应急响应实战:纯Shell脚本自动化安全排查工具LinuxGun解析

发布时间:2026/7/4 16:02:58
Linux应急响应实战:纯Shell脚本自动化安全排查工具LinuxGun解析 1. 项目概述最近在帮一个朋友处理他们公司服务器的安全事件一台对外提供Web服务的CentOS主机突然出现CPU跑满、响应缓慢的情况。登录上去一看top命令显示有个奇怪的/tmp/.X11-unix进程占用了大量资源netstat一看还有好几个异常的出站连接。这种场景下时间就是金钱每一秒的延迟都可能意味着攻击者在扩大战果。常规的手工排查从系统信息、用户、进程、网络、文件到日志一圈下来至少半小时而且很容易遗漏关键线索。这正是安全应急响应Incident Response的典型困境线索分散、命令繁杂、时间紧迫。网上虽然能找到各种检查脚本但要么功能单一要么依赖复杂环境在真实的生产环境尤其是“出事”的服务器上往往因为缺少python、perl或者网络不通而无法运行。基于这个痛点我把自己多年在甲方做安全运维和应急响应的经验沉淀成了一个纯Shell编写的工具集——LinuxGun。它的核心目标就一个在极端条件下给你一把趁手的“枪”快速、全面、自动化地完成Linux系统安全排查把分散的信息聚合成一份清晰的“战场报告”。这个工具完全用Shell编写不依赖任何外部解释器或第三方命令极少数核心系统命令除外力求在最小化环境依赖下覆盖从系统信息、用户账户、计划任务、网络连接、进程分析、文件痕迹到日志审计的完整排查链。无论是刚入行的安全工程师还是需要快速评估系统状态的管理员都能通过它快速上手形成标准化的应急检查流程。接下来我就带你深入拆解这个“应急利器”的设计思路、核心功能和使用中的那些“坑”。2. 核心设计思路与架构解析2.1 为什么选择纯Shell在应急响应的场景下环境往往是未知且受限的。你可能会遇到网络隔离服务器无法访问外网pip install、yum install想都别想。环境精简生产服务器可能只安装了最基础的运行包没有python3甚至python2版本都很老。权限限制虽然我们要求用root运行以获取全面信息但工具本身不应引入额外的权限依赖。Shell特别是Bash几乎是所有Linux/Unix系统的“母语”。一个编写良好的Shell脚本其可移植性和环境适应性是最强的。LinuxGun坚持纯Shell开发核心命令只依赖grep、awk、sed、find、ps、netstat/ss等系统自带工具确保了在绝大多数Linux发行版CentOS, RHEL, Ubuntu, Debian等上都能开箱即用。这是它在“极端条件”下依然能工作的底气。2.2 模块化与“一把梭”的平衡早期的linuxcheck.sh版本是典型的“一把梭”脚本运行后从系统信息到日志分析所有检查项顺序执行最终生成一份大而全的报告。这对于首次全面排查很有效但缺乏灵活性。比如我已经通过其他手段确认用户账户没问题只想重点排查网络连接和可疑进程运行整个脚本就显得效率低下。因此在新版的linuxGun.sh和linuxGunPro.sh中我采用了模块化函数设计。每个安全检查维度如用户分析、网络检查、进程分析都被封装成独立的函数。你可以通过命令行参数精准调用特定模块。# 只检查用户和计划任务 bash linuxGun.sh --system-user --system-crontab # 只检查网络连接和进程 bash linuxGun.sh --network --psinfo同时保留了--all参数来执行全量检查兼顾了灵活性与完整性。linuxGunPro.sh更进一步支持--inter交互模式在每个模块执行前询问用户是否继续适合在需要人工介入判断的场景下使用。2.3 规则驱动可自定义的检测引擎工具的有效性很大程度上取决于其检测规则。LinuxGun将规则与核心脚本分离存放在checkrules/目录下。这些是纯文本文件你可以根据自己面对的实际威胁进行编辑和扩充。dangerstcpports.txt,dangersudpports.txt定义你认为的高危端口。除了常见的22(SSH),3306(MySQL)你可以加入业务相关的非标准管理端口或者近期漏洞频发的服务端口。hackertoolslist.txt定义黑客工具、挖矿程序、后门软件的关键词或路径。例如xmrig,minerd,.ssh/authorized_keys异常公钥/tmp/.X11-unix这类常见恶意进程路径。dangerspslist.txt定义可疑进程名。例如kinsing一种常见的恶意软件或者伪装成系统进程的名字如kthreaddw与kthreadd相似。这种设计使得工具不再是黑盒。当你所在行业出现新型攻击手法时你可以快速更新规则文件让工具具备检测新威胁的能力而不需要修改核心脚本。2.4 分级输出与结果归档工具运行后会在当前目录生成output/linuxcheck_[IP地址]_[日期]/的目录结构。这里面的文件组织很有讲究checkresult.txt这是完整的检查报告与控制台输出一致。适合快速浏览。log/目录这里存放了工具运行过程中采集的原始数据例如passwd、shadow文件的副本ps auxf的全量输出netstat -antp的结果等。当自动化分析结果存疑时安全分析师可以深入这个目录查看原始证据进行人工研判。saveDangerResult.txt仅旧版直接输出识别出的高危项。新版将此功能融合进了主报告并通过标记如[WARNING]、[DANGER]进行高亮提示。这种“分析报告原始数据”的存档方式既满足了快速响应的需求也为后续的取证溯源提供了材料。3. 核心功能模块深度拆解与实操3.1 系统信息与用户分析 (--system-user)这是应急响应的起点。攻击者入侵后往往会建立持久化账户或提权。实操要点克隆用户检测脚本会比对/etc/passwd中的用户名和UID。攻击者常创建一个与rootUID 0或其他系统用户同UID的“克隆用户”以达到权限伪装的目的。检查逻辑是找出UID相同但用户名不同的条目。非系统用户与空口令用户通过UID范围通常认为UID1000是普通用户筛选非系统用户。检查/etc/shadow中密码字段为*或!!之外的空字段这些是空口令或未设置口令的用户是极大的风险点。SSH授权密钥(authorized_keys)遍历所有用户家目录下的.ssh/authorized_keys文件。攻击者入侵后常会写入自己的公钥以实现免密登录。脚本会列出所有找到的公钥及其所属用户你需要人工审查这些密钥是否均为已知可信来源。注意/etc/passwd中用户的shell字段为/sbin/nologin或/bin/false的用户通常不可登录但如果其authorized_keys文件中有公钥且SSH服务配置了AuthorizedKeysFile仍可能通过密钥登录。脚本会提示此类情况。3.2 计划任务与历史命令分析 (--system-crontab,--system-history)攻击者建立持久化驻留的常用手段。计划任务检查脚本会收集/etc/crontab、/etc/cron.d/、/etc/cron.hourly/daily/weekly/monthly/以及所有用户的crontab -l内容。重点排查指向/tmp、/dev/shm等可写目录的脚本或命令。调用curl、wget从外部地址下载并执行的命令。执行python、perl、bash -c等包含长串编码命令的任务。历史命令分析不只是查看当前用户的.bash_history。脚本会搜索系统内所有用户的home目录寻找.bash_history、.zsh_history、.mysql_history等文件。分析维度包括敏感命令如useradd、passwd、visudo账户操作、wget/curl [恶意URL]下载木马、chmod 777可疑权限变更、systemctl stop firewalld关闭防火墙。下载痕迹历史中出现的wget、curl、scp、rzZMODEM等命令其URL或文件名是重要线索。历史文件清空如果发现.bash_history文件异常小如只有几条命令或修改时间与当前时间很近这本身就是一个高危信号可能攻击者已清理痕迹。3.3 网络连接与进程关联分析 (--network,--psinfo)这是发现实时攻击活动最直接的模块。网络连接检查端口监听使用ss -tulnp或netstat -tulnp兼容性处理列出所有监听端口。脚本会将其与dangerstcpports.txt和dangersudpports.txt中的规则比对标记出高危端口。活跃连接列出所有ESTABLISHED、SYN_SENT等状态的连接并关联到进程PID和程序路径。特别关注出向连接到非常见IP或海外IP的22、443、53等端口可能为C2服务器或数据外传。入向连接到非业务端口的高频连接可能正在被爆破或利用。ARP表异常检查ARP表是否有IP地址冲突或MAC地址欺骗的迹象。进程深度分析基础信息ps auxf以树状形式展示进程便于发现父子关系。挖矿木马常会伪装成kworker或java等正常进程名。规则匹配利用dangerspslist.txt中的规则对进程名、命令行参数进行匹配。例如匹配命令行中包含stratumtcp矿池协议或--donate-levelXMRig参数的进程。高级隐藏进程检测linuxGunPro增强孤儿进程父进程ID为1init但并非正常系统服务的进程。进程内存映射检查/proc/[PID]/maps寻找映射了异常路径如/tmp下的匿名文件的可执行段。进程环境变量检查/proc/[PID]/environ攻击者可能通过环境变量传递配置或恶意代码。文件描述符检查/proc/[PID]/fd/大量连接到同一个socket或打开异常文件如键盘设备的进程值得怀疑。实操心得网络和进程分析一定要结合着看。发现一个可疑的外联IP立刻用netstat -anp | grep [IP]找到对应进程PID再通过ps和ls -l /proc/[PID]/exe查看进程的详细信息和真实路径。很多时候恶意进程会从/tmp或/dev/shm执行这是一个强警示信号。3.4 文件系统与日志审计 (--file)攻击总会留下文件层面的痕迹。关键文件检查SUID/SGID文件查找设置了SUID/SGID位的文件。这些文件在执行时拥有文件所有者的权限。攻击者可能会利用系统已有的SUID文件如find、vim进行提权或上传自制的SUID后门。脚本会列出所有此类文件你需要特别关注那些所有者是root但存放在/tmp、/var/tmp或用户家目录下的文件。24小时内变动的文件使用find命令查找/目录下最近24小时-mtime 0修改过的文件并排除/proc、/sys、/run等虚拟文件系统。这有助于发现攻击者上传的工具、修改的配置文件或产生的数据文件。SSH相关文件检查/etc/ssh/sshd_config配置重点关注PermitRootLogin、PasswordAuthentication、AllowUsers等安全配置。检查所有用户的.ssh/目录权限应为700authorized_keys文件权限应为600权限过松可能导致私钥泄露或未授权公钥写入。系统日志分析 脚本不是简单地打包日志而是进行初步分析/var/log/secure分析SSH登录成功/失败记录。大量的失败登录尤其针对root可能意味着爆破攻击。成功的登录记录需要与已知的运维行为进行核对。/var/log/cron查看计划任务的执行日志验证是否有异常任务被执行。/var/log/yum.log检查是否有非授权的软件安装特别是gcc、make、python等编译环境或nmap、socat等黑客工具的安装记录。lastlog、wtmp、btmp查看所有用户的登录历史、成功登录记录和失败登录记录。踩坑记录日志可能被攻击者删除或清空。脚本会检查关键日志文件如secure、cron是否存在以及文件大小。如果发现日志文件异常小如只有几KB或修改时间与系统时间严重不符这本身就是一个需要记录的高危事件。此外务必检查rsyslog/syslog服务是否正常运行以及auditd审计守护进程是否启用它们是更底层、更难以篡改的日志来源。4. 进阶功能与实战场景应用4.1 隧道检测 (--tunnel)高级攻击者会使用隧道技术将流量封装在合法协议中以绕过防火墙和IDS检测。SSH隧道检测脚本会检查sshd进程寻找本地端口转发-L、远程端口转发-R或动态转发-D的特征。例如查看是否有sshd进程监听了非标准端口如0.0.0.0:8080或者存在大量来自同一源IP但指向不同内部端口的SSH连接。HTTP/DNS/ICMP隧道这些检测模块部分待完成旨在发现异常的网络流量模式。例如检查是否有进程持续向某个外部域名发送大量的、长度异常的DNS查询请求可能是DNS隧道或者是否有异常的ICMP流量ICMP隧道。4.2 Kubernetes集群安全排查 (--k8s)随着容器化普及K8s环境成为新的攻击面。该模块专为K8s环境设计集群信息收集通过kubectl命令获取集群节点、Pod、Service、Namespace等基本信息。敏感信息扫描扫描集群内Secrets、ConfigMaps并检查其是否被不当挂载到Pod中。也会查找包含密码、密钥、token等敏感信息的文件。安全基线检查检查Pod安全策略PSP、网络策略、RBAC权限配置等是否符合安全最佳实践。注意此模块需要kubectl命令且具有相应的集群访问权限。在应急时如果攻击者已获取容器内权限此模块能帮助你快速评估集群内的横向移动风险。4.3 基线安全检查 (--baseline)除了应急该工具也可用于日常安全巡检或入侵后的安全加固验证。基线检查模块覆盖了多项安全配置密码策略检查/etc/login.defs中的密码最长/最短使用期限、最小长度等。SSH加固检查/etc/ssh/sshd_config中的协议版本应禁用SSHv1、是否允许root直接登录、是否允许密码认证建议密钥认证等。文件权限检查/etc/passwd、/etc/shadow、/etc/group等关键系统文件的权限是否过于宽松如shadow文件不应有读权限。SELinux检查SELinux是否处于 enforcing 模式。4.4 结果远程发送 (--send)这是一个非常实用的企业级功能。在完成检查后你可以将output目录打包并加密发送到远程的分析平台或SOC安全运营中心。# 先进行全量检查 bash linuxGunPro.sh --all # 将结果发送到远程服务器192.168.1.100的8080端口使用token认证 bash linuxGunPro.sh --send 192.168.1.100 8080 your_secure_token_here这需要配合tools/uploadServer/目录下的Python服务器脚本使用。该功能实现了检查与分析的物理隔离避免在已失陷的服务器上进行分析可能带来的风险如分析工具被恶意软件干扰。5. 使用流程、常见问题与避坑指南5.1 标准操作流程 (SOP)准备阶段获取目标服务器权限最好是root。将Linuxgun.zip上传至服务器或直接git clone。unzip Linuxgun.zip或进入克隆的目录。chmod x linuxGunPro.sh或linuxGun.sh。信息收集阶段首次全面排查bash linuxGunPro.sh --all。这会生成最完整的报告和原始数据。针对性排查如果已有初步怀疑方向使用模块化命令如bash linuxGunPro.sh --network --psinfo --file-systemlog。分析阶段打开output/xxx/checkresult.txt快速浏览[WARNING]和[DANGER]标记项。根据报告中的线索进入log/目录查看对应的原始数据进行深度分析和验证。结合进程、网络、文件、日志等多个维度的信息进行交叉印证。响应与归档根据分析结果采取遏制措施如kill进程、封禁IP、删除恶意文件、修复账户。使用--send功能将结果归档到安全侧用于后续溯源和报告编写。清理工具本身产生的output目录避免留下新的“痕迹”。5.2 常见问题与解决方案Q1: 脚本在某个地方卡住了或者报了一堆“command not found”错误A1: 这通常是因为目标系统的Shell环境或命令路径与开发环境不同。排查方法在脚本开头加入set -x或在运行时使用bash -x linuxGun.sh来调试查看具体在哪条命令出错。常见原因某些最小化安装的系统可能缺少netstat脚本已做了兼容性处理优先使用ss。如果缺少ip命令极少数老系统网络信息收集可能会失败。此时可以手动安装基础工具包或根据错误提示注释掉相关行。Q2: 检查结果太多如何快速定位真正的高危项A2: 这是新手常见问题。建议按优先级关注用户与权限克隆用户、空口令用户、sudoers异常添加、SSH密钥异常。进程与网络CPU/内存占用极高的未知进程、连接到可疑IP/端口的进程、监听在非业务端口的进程。文件与启动项/tmp、/dev/shm、/var/tmp下的可执行文件异常的计划任务和系统服务近期修改的SUID文件。日志大量的登录失败、非授权时间段的成功登录、异常的命令执行记录。Q3: 规则文件 (checkrules/下的文件) 如何更新A3: 这是让工具保持活力的关键。你可以从安全社区、威胁情报平台获取最新的恶意软件IOC入侵指标将其进程名、路径、域名等添加到hackertoolslist.txt。根据你业务服务器开放的服务端口调整dangerstcpports.txt。例如如果公司规定不得开放Redis端口(6379)那么任何监听6379的端口都应被视为高危。定期回顾检查结果中的“误报”优化规则的正则表达式减少干扰。Q4: 在非常老旧的系统如CentOS 5上运行有问题A4: 极老的系统可能使用bash 3.x一些新语法如关联数组declare -A可能不支持。linuxGun.sh已尽量使用兼容性语法。如果确实遇到问题可以尝试使用更基础的linuxcheck.sh旧版一把梭它的语法兼容性更好。另一个选择是在本地虚拟机搭建一个类似环境的测试机预先验证脚本的兼容性。5.3 高级技巧与注意事项善用交互模式在linuxGunPro.sh中使用--all --inter。这允许你在每个模块开始前确认。例如在分析一个负载很高的生产系统时你可以跳过一些高IO的检查如全盘查找24小时文件避免对业务造成进一步影响。结果对比对于重要服务器可以在安全状态时如刚上线或确认无风险后运行一次脚本将checkresult.txt和关键日志的哈希值存档。应急时再次运行使用diff工具对比两次结果能快速发现“变化点”这比漫无目的地搜索更高效。不要完全依赖自动化LinuxGun是强大的辅助工具但不能替代安全分析师的经验和判断。它输出的“可疑”项需要人工复核。例如一个连接到github.com的git进程很可能是正常的而一个连接到某个陌生域名的bash进程则极其可疑。注意工具自身的安全将工具上传到已失陷的服务器时确保传输通道是加密的如SCP。在服务器上运行时注意工具本身可能被监控中的恶意软件干扰或伪造输出。有条件的话可以在内存盘如/dev/shm中运行并考虑使用静态编译的BusyBox等工具进行交叉验证。法律与授权务必只在你有合法授权检查的系统上运行此工具。未经授权扫描或检查他人系统是违法行为。这个工具是我多年实战经验的结晶它不能保证发现所有高级威胁但能极大提升应急响应的速度和系统性避免遗漏低级错误。安全是一个持续对抗的过程工具在迭代人的经验和思维更需要不断更新。希望LinuxGun能成为你安全工具箱中一件可靠的工具。