域内横向移动基础【转载】
转载自:https://www.cnblogs.com/R0ser1/p/16154463.html
利用Windwos远程连接
IPC
IPC可以通过验证用户名和密码获得相应的权限,通常在远程管理计算机和查看计算机的共享资源时使用。 建立IPC连接 有域的话一定得带上
1 |
|
输入net use即可看到建立的连接 常用的命令
1 |
|
利用Windwos计划任务
Windows 可用于创建计划任务的命令有两个,分别是 at 和 schtasks,at 在 Windows Server 2008 及之后的系统中,已经被废弃了
- 1、查看目标主机时间
- 2、上传可执行文件到目标主机
- 3、设置计划任务执行可执行文件
- 4、删除计划任务
查看主机时间
1 |
|
将 bat 程序上传到目标主机
1 |
|
利用 at 命令
1 |
|
清除id为1的任务
1 |
|
我们还可以例如直接powershell加载一个马反弹shell。像上面那种操作是不会回显的,我们可以将at计划任务直接执行系统命令然后写入文本。
1 |
|
然后使用type命令远程读取该文件
1 |
|
利用 schtasks 命令
1 |
|
这样子执行的话可能会报错,因为某些策略的问题。
[image.png]](域内横向移动基础/1648042814509-3dcd9a3e-2573-47ee-921b-1746c5e9db0a.png)
1
schtasks /create /s 1.1.1.2 /u administrator /p xxx /tn calc /sc onstart /tr C:\calc.bat /ru system /f
这样子就没问题。如果需要它马上运行我们可以
1 |
|
执行如下命令强制删除该计划任务:
1 |
|
想回显执行命令和上面操作一样,写个文件就行。
利用Windwos服务
SC
使用条件:
- 当前跳板机用户具有管理员权限(因为要创建服务)。
- 与目标机器已经建立ipc连接
做好上面步骤我们创建一个sc服务
1 |
|
注意这里的格式,“=”后面是必须空一格的,否则会出现错误。 立即启动服务
1 |
|
使用完后删除刚才创建的服务
1 |
|
我们还可以通过设置服务来关闭防火墙:
1 |
|
Hash的抓取与传递攻击
LM Hash 和 NTLM Hash
Windwos操作系统通常采用两种方法对用户的明文密码进行加密处理。域环境中的话,用户信息存储在ntds.dit,加密后为散列值。
操作系统密码一部分为LM Hash,另一部分为NTLM
Hash。在Windwos操作系统中,Hash结构通常为
username:RID:LM-HASH:NT-HASH
LM HASH的加密流程如下:
- 1、密码长度限制为14个字符
- 2、密码全部转换为大写
- 3、密码转换为16进制字符串,不足14字节用0补全
- 4、密码的16进制字符串被分成两个7byte部分
- 5、再分7bit为一组,每组末尾加0,再组成一组
- 6、上步骤得到的二组,分别作为key 为 “KGS!@#$%”进行DES加密。
- 7、将加密后的两组拼接在一起,得到最终LM HASH值。
为了解决LM HASH强度不够的问题,微软推出了NTLM HASH:
- 1、先将用户密码转换为十六进制格式。
- 2、将十六进制格式的密码进行Unicode编码。
- 3、使用MD4对Unicode编码数据进行Hash计算
因为在vista后不再支持LM HASH,因此抓到的hash中的LM HASH都是aad3b435b51404eeaad3b435b51404ee 在hash传递攻击时,可以替换成0:00000000000000000000000000000000
Hash抓取
在windows上,C:。我们可以使用相关手段获取该hash。
使用reg命令获取本地用户凭据hash:
1 |
|
然后利用mimikatz读取文件,把上述文件放在和mimikatz同目录下。
1 |
|

PwDump7

mimikatz
1 |
|

从lsass.exe中获取散列值和明文密码
1 |
|
但是这个不一定可以抓到明文密码。主要还是kb2871997的问题。kb2871997补丁会删除除了wdigest ssp以外其他ssp的明文凭据,但对于wdigest ssp只能选择禁用。用户可以选择将HKEY_LOCAL_MACHINE0来禁用。但是kb2871997对于本地Administrator(rid为500,操作系统只认rid不认用户名)和本地管理员组的域用户是没有影响的。
1 |
|
powershell
1 |
|
我们还可以导出lsass.dmp文件来使用mimikatz进行解密
- 使用任务管理器
- 使用Procdump
第一种找到程序然后导出到内存就可以。 第二种是微软官方出的工具。
1 |
|
如果要破解的话可以使用Hashcat或者在线的站点。
Hash传递攻击
使用Mimikatz进行PTH
当我们抓取到域管理员的NTLM Hash时我们可以用mimikatz获取的Administrator的Hash添加进lsass中
1 |
|

然后回弹出一个新的窗口,这时访问远程主机或服务,就不用提供明文密码了,如下,我们列出了域控制器DC的c盘目录(要使用主机名,不能用IP,否则报错):
之后,攻击者便可以利用Windows7跳板机任意访问内网其他机器中的文件,进行上传、下载等操作,还可以在目标机器上运行其他命令,以获取目标机器的目录结构、用户列表等信息。
MSF进行PTH
在msf中常用的模块有
1 |
|
以第二个为例攻击内网的其他机器
成功进行横向移动,这里注意这里的smbpass选项,其可以为明文密码,也可以为Hash,但Hash必须是完整的,如果不知道前面的LM
Hash部分,可以像上面那样用0代替
利用PsExec
利用Psexec.exe
下载地址:https://docs.microsoft.com/zh-cn/sysinternals/downloads/psexec psexec 是 windows 下非常好的一款远程命令行工具。psexec的使用不需要对方主机开方3389端口,只需要对方开启admin$共享 (该共享默认开启)。但是,假如目标主机开启了防火墙,psexec也是不能使用的,会提示找不到网络路径。由于PsExec是Windows提供的工具,所以杀毒软件将其列在白名单中。 PsExec的基本原理:
- 通过ipc$连接,释放二进制文件psexecsvc.exe到目标
- 通过服务管理SCManager远程创建一个psexec服务,并启动服务
- 客户端连接执行命令,服务端通过服务启动相应的程序执行命令并回显数据
- 运行结束后删除服务
PsExec前提条件:
- 对方主机开启了 admin$ 共享,如果关闭了admin$共享,会提示:找不到网络名
- 对方未开启防火墙
- 如果是工作组环境,则必须使用administrator用户连接(因为要在目标主机上面创建并启动服务),使用其他账号(包括管理员组中的非administrator用户)登录都会提示访问拒绝访问。
- 如果是域环境,即可用普通域用户连接也可以用域管理员用户连接。连接普通域主机可以用普通域用户,连接域控只能用域管理员账户。
操作命令如下:
1 |
|
- -accepteula:第一次运行psexec会弹出确认框,使用该参数就不会弹出确认框
- -u:用户名
- -p:密码
- -s:以system权限运行运程进程,获得一个system权限的交互式shell。如果不使用该参数,会获得一个连接所用用户权限的shell

利用MSF的Psexec模块
常用模块
1 |
|
使用exploit/windows/smb/psexec_psh,该模块生成的payload主要是有powershell实现的。powershell作为Windows自带的脚本运行环境,免杀效果比由exploit/windows/smb/psexec生成的exe版payload好。但是,因为Windows 7、Windows Server 2008及以上版本的操作系统才默认有powershell,所以如果遇到默认不含powershell的Windows XP或Windows Server 2003,就要使用由exploit/windows/smb/psexec生成的exe版本的payload。
注意:在使用psexec执行远程命令时,会在目标系统中创建一个psexec服务。命令执行后,psexec服务将会被自动删除。由于创建或删除服务时会产生大量的日志,所以会在攻击溯源时通过日志反推攻击流程。
利用WMI
WMI是由一系列工具集组成的,可以通过/node选项使用端口135上的远程过程调用(RPC)进行通信以进行远程访问,它允许系统管理员远程执行自动化管理任务,例如远程启动服务或执行命令
通过渗透测试发现,在使用wmiexec进行横向移动时,Windows操作系统默认不会将WMI的操作记录在日志中,同时攻击脚本无需写入到磁盘,具有极高的隐蔽性。因为在这个过程中不会产生日志,所以,对网络管理员来说增加了攻击溯源的成本。而对攻击者来说,其恶意行为被发现的可能性有所降低、隐蔽性有所提高。由此,越来越多的APT开始使用WMI进行攻击,利用WMI可以进行信息收集、探测、反病毒、虚拟机检测、命令执行、权限持久化等操作。
注意:使用WMIC连接远程主机,需要目标主机开放135和445端口。(135 端⼝是 WMIC 默认的管理端⼝,而 wimcexec 使⽤445端⼝传回显)
远程桌面
1 |
|
查询进程信息
1 |
|
远程创建进程
1 |
|
使用WMIC远程执行命令,在远程系统中启动WMIC服务(目标服务器需要开放其默认135端口,WMIC会以管理员权限在远程系统中执行命令)。如果目标服务器开启了防火墙,WMIC将无法连接。另外由于wmic命令没有回显,需要使用IPC$和type命令来读取信息。需要注意的是,如果WMIC执行的是恶意程序,也不会留下日志。下面我们介绍一下几个可以用来执行wmi远程命令的工具。
利用WMIEXEC
wmiexec是对windows自带的wmic做了一些强化,让渗透变得更容易。比较好用的在这里介绍几种。wmiexec需要提供账号密码进行远程连接,但是如果没有破解出账号和明文密码,也可以配合哈希传递或票据注入功能一起使用,先进行传递或注入,然后再使用WMIEXEC即可。
Impacket中的wmiexec.py
该脚本是impacket工具包中的一个工具,主要在从Linux像Windows进行横向渗透时使用,十分强大,可以走socks代理进入内网。 下载地址:https://github.com/CoreSecurity/impacket/blob/master/examples/wmiexec.py
1 |
|
如果对wmiexec.py指定-hashes选项的话,则可进行哈希传递。 当然还有exe版本的。同理命令
利用DCOM
DCOM(分布式组件对象模型)是微软基于组件对象模型(COM)的一些列概念和程序接口,COM提供了一套允许在同一台计算机上的客户端和服务器之间通信的接口。通过DCOM,客户端程序对象能够向网络中的另一台计算机上的服务器程序对象发送请求 下面通过一个实验来讲解如何使用DCOM在远程主机上面执行命令。在使用该方法的条件如下:
- 需要关闭目标系统的防火墙,如果目标主机DC没有关闭防火想的话会报错
- 在远程主机上执行命令时,必须使用具有本地管理员权限的账号。
调用MMC20.Application远程执行命令
1 |
|
如果你开始链接了IPC那么你输入ipc的IP,直接远程拿shell执行他都没问题呢
调用9BA05972-F6A8-11CF-A442-00A0C90A8F39
同理,看你连IPC没,这里记录本地。
1 |
|

SPN及其kerberoast攻击
spn是服务主体的名称,是服务实例(如:HTTPS,MYSQL)的唯一标识。
SPN介绍
Kerberos认证过程使用SPN将服务实例与服务登录账户相关联,如果想使用 Kerberos 协议来认证服务,那么必须正确配置SPN。如果在整个林或域中的计算机上安装多个服务实例,则每个实例都必须具有自己的 SPN。如果客户端可能使用多个名称进行身份验证,则给定服务实例可以具有多个SPN。SPN 始终包含运行服务实例的主机的名称,因此服务实例可以为其主机的每个名称或别名注册SPN。一个用户账户下可以有多个SPN,但一个SPN只能注册到一个账户。在内网中,SPN扫描通过查询向域控服务器执行服务发现。这对于红队而言,可以帮助他们识别正在运行重要服务的主机,如终端,交换机等。SPN的识别是kerberoasting攻击的第一步。 SPN分为两种类型:
- 注册在活动目录机器(Computers)当一个服务的权限为 Local System 或 Network Service,则SPN注册在机器帐户(Computers)下。
- 注册在活动目录的域用户账户(Users),当一个服务的权限为一个域用户,则SPN注册在域用户下

SPN的用法
0 注册一个SPN setspn -S MSSQLSvc/w2k8.hacker.lab user1 1 查看当前域内所有的SPN: setspn -Q / 2 查看指定域hacker.lab注册的SPN:setspn -T hacker.lab -Q / 如果指定域不存在,则默认切换到查找本域的SPN 3 查找本域内重复的SPN: setspn -X 4 删除指定SPN:setspn -D SQLServer/w2k8.hacker.lab:1433 user2 5 查找指定用户/主机名注册的SPN:setspn -L username/hostname 6 zh
SPN作用举例
当某用户需要访问MySQL服务时,系统会以当前用户的身份向域控查询SPN为MySQL的记录。当找到该SPN记录后,用户会再次与KDC通信,将KDC发放的TGT作为身份凭据发送给客户,并将需要访问的SPN发送给KDC。KDC中的TGS服务对TGT进行解密。确认无误后,由TGS将一张允许访问该SPN所对应的服务的ST服务票据和该SPN所对应的服务的地址发送给用户,用户使用该票据即可访问MySQL服务。
SPN信息收集
setspn
Windows系统自带的setspn可以查询域内的SPN,前提是域任意的用户
1 |
|

GetUserSPNs
GetUserSPNs 是 Kerberoast 工具集中的一个 powershell
脚本,用来查询域内注册的 SPN。
PowerView
PowerView 是由 Will Schroeder(https://twitter.com/harmj0y)开发的 Powershell 脚本,在 Powersploit 和 Empire 工具里都有集成,PowerView 相对于上面几种是根据不同用户的 objectsid 来返回,返回的信息更加详细
1 |
|

Kerberoasting
介绍 Kerberos 的认证流程时说到,在 KRB_TGS_REP 中,TGS 会返回给 Client 一张票据 ST,而 ST 是由 Client 请求的 Server 端密码进行加密的。当 Kerberos 协议设置票据为 RC4 方式加密时,我们就可以通过爆破在 Client 端获取的票据 ST,从而获得 Server 端的密码。 根据扫描出的结果使用微软提供的类 KerberosRequestorSecurityToken 发起 kerberos 请求,申请 ST 票据。
Kerberoasting攻击一
1 |
|

Kerberos 协议中请求的票据会保存在内存中,可以通过 klist
命令查看当前会话存储的 kerberos 票据。 使用 mimikatz
导出。
1 |
|

使用 kerberoast 工具集中的 tgsrepcrack.py 工具进行离线爆破,一搜就有了。
Kerberoasting攻击二
Kerberoasting攻击方式一中需要通过 mimikatz 从内存中导出票据,Invoke-Kerberoast 通过提取票据传输时的原始字节,转换成 John the Ripper 或者 HashCat 能够直接爆破的字符串。 使用 Invoke-Kerberoast 脚本 (这里使用的是 Empire 中的 Invoke-Kerberoast.ps1)。
1 |
|
–outputformat 参数可以指定输出的格式,可选 John the Ripper 和 Hashcat
两种格式 使用 HASHCAT 工具进行破解:
NTLM-Relay
上面都是主动性的攻击,那么NTLM-Relay就是被动式的。在这个NTLM Relay中,我们就是要将截获的Net-NTLM Hash重放来进行攻击,从而实现对其他机器的控制,所以严格意义上应该叫作Net-NTLM Relay。 为看重放这个Net-NTLM-Relay,首先我们得获取这个Net-NTLM-Hash。由于SMB、HTTP、LDAP、MSSQL等协议都可以携带NTLM认证的三类消息,所以只要是使用SMB、HTTP、LDAP、MSSQL等协议来进行NTLM认证的程序,都可以尝试向攻击者发送Net-NTLMhash从而让攻击者截获用户的Net-NTLMhash。然后一下思路
利用LLMNR和NetBIOS
简单介绍一下这两个
LLMNR
本地链路多播名称解析(LLMNR)是一种域名系统数据包格式,当局域网中的 DNS 服务器不可用时,DNS 客户端就会使用 LLMNR 解析本地网段中机器的名称,直到 DNS 服务器恢复正常为止。 从 Windows Vista 开始支持 LLMNR ,Linux 系统也通过 systemd 实现了此协议,同时 LLMNR 也支持 IPv6
NetBIOS
NetBIOS 协议是由 IBM 公司开发,主要用于数十台计算机的小型局域网,根据 NetBIOS 协议广播获得计算机名称,并将其解析成相应的 IP 地址。 从 Windows NT 以后版本的所有操作系统中都可以使用 NetBIOS,不过 NetBIOS 不支持 IPv6.
也就是说缓存中找不到,dns也请求失败的话,windwos就会从LLMNR和NetBIOS中解析。这时候客户端就会将未经身份验证的UDP广播到网络询问是否是本地系统名称,从而允许网络上的任何机器响应并声称是目标机器,所以我们就可以利用工具伪装从而让受害者交出凭证。
利用
当受害者机器尝试登陆攻击者机器,Responder 就可以获取受害者机器用户的
Net-NTLM 哈希值。 Responder
项目地址:https://github.com/lgandx/Responder Responder 不支持
Windows,这里使用 Kali 进行演示。 Kali监听着 win7去连接
如上图所示我们就获取到了Net-NTLM
hash了然后就可以使用hashcat等进行破解
利用WPAD
WPAD 网络代理自动发现协议是一种客户端使用DCHP、DNS、LLMNR、NBNS协议来定位一个代理配置文件(PAC)URL的方法。WPAD通过让浏览器自动发现代理服务器,查找存放PAC 文件的主机来定位代理配置文件,下载编译并运行,最终自动使用代理访问网络。 也就是说你上网的配置,如果游览器设置了自动检测,客户端上网的时候就会问,谁是WPAD服务器,然后拿这个pac去上网。
攻击手法V1
例如我们游览器访问一个网站,如果输错了一个域名。默认一般就是提示法访问或者错的。那我们现在伪造wpad服务的话。 kali监听
1 |
|
游览器需要自动检测代理 然后访问任意域名
攻击手法V2
最重要的不过还是权限。大家应该知道smb
relay,但是这个漏洞很早就在MS08-068补丁中被修复了。但是这个不妨碍我们在未校验smb签名等情况下进行NTLM-Relay转发。我们执行responder,首先关闭掉smb,给接下来的ntlmrelayx使用。
1 |
|
当访问不存在的机器的时候。会中继到域控机器从而拿到hash
为啥不Relay到其他域控,因为域内就域控默认开启smb签名。其他的机器是没有开的。
SMB-Relay
NTLM-Relay的话基本就是要破解hash。而Relay最有效的就是可以直接控制该服务器(包括但不限于在远程服务器上执行命令,上传exe到远程命令上执行,dump 服务器的用户hash等等等等)。 主要有两种场景详细见:https://www.anquanke.com/post/id/194069#h2-4
工作组环境
这个实用性比较差。在工作组环境里面,工作组中的机器之间相互没有信任关系,每台机器的账号密码Hash只是保存在自己的SAM文件中,这个时候Relay到别的机器,除非两台机器的账号密码一样(如果账号密码一样,我为啥不直接pth呢),不然没有别的意义了,这个时候的攻击手段就是将机器reflect回机子本身。因此微软在ms08-068中对smb reflect到 smb 做了限制,防止了同一主机从SMB协议向SMB协议的Net-NTLMhash relay。这个补丁在CVE-2019-1384(Ghost Potato)被绕过。
域环境
域环境底下域用户的账号密码Hash保存在域控的 ntds.dit里面。如下没有限制域用户登录到某台机子,那就可以将该域用户Relay到别人的机子,或者是拿到域控的请求,将域控Relay到普通的机子,比如域管运维所在的机子。(为啥不Relay到其他域控,因为域内就域控默认开启smb签名)
Responder中的MultiRelayx.py
1 |
|

现在 SMB 已经由 MultiRelay.py 脚本来进行中继,我们需要修改一下responder的配置文件 Responder.conf,不让其对 hash 进行抓取。将SMB和HTTP的On改为Off:
1 |
|
在DC随便传递一个SMB流量 另一边直接拿到Shell
Impacket中的smbrelayx.py
首先运行如下
1 |
|

然后我们在在任意一台机器访问我们的恶意SMB服务器 就是我们这个Kali
1 |
|
就如上图所示直接回显命令,实战中大多是我们直接生成一个msf的木马,然后使用-e参数
1 |
|
在监听msf会话的时候需要注意的是,我们要设置set AutoRunScript migrate在成功得到session后自动迁移进程,如果没有自动迁移进程,那么在Removing file的时候,会话也随之关闭了。
Impcaket中的ntlmrelayx.py
上面NTML-Relay提到过这个但是只是Hash的利用。这里我们使用一些参数进行Shell的获取。或者其他命令回显也是OK的
1 |
|
Kerberos票据传递及其委派攻击[
kerberos的票据传递可以查看https://www.cnblogs.com/R0ser1/p/16086323.html Kerberos委派攻击可以查看https://www.cnblogs.com/R0ser1/p/16154451.html
Exchange邮件
等后面环境搭了再补上吧,其中还有几个cve的大杀器
参考
1 |
|