Alternativen zu LogonUser für Netzwerk-Identitätswechsel (C++)
Gibt es alternativen zu LogonUser und für die Identität gegeben Konto, um Zugriff auf Netzwerk-Ressourcen? Ich bin auf der Suche nach der Methode der Imitation, die die würde lassen Sie mich schließen, um die Maschine in fremden Domäne (oder Arbeitsgruppe Maschinen für die gleiche Sache).
Für die ersten Daten die ich habe: Computer-Namen, Benutzernamen (oder Domäne\Benutzername), Klartext-Passwort.
Ich weiß, es gibt einen Weg, um eine Verbindung herzustellen, verwenden Sie WNetAddConnection, um ein \\Computername\ipc$, dann sind die meisten Netzwerk-Funktionen laufen in einem Zusammenhang mit diesem Konto, jedoch win2008 Hinzugefügt eine neue Wendung, und einige Funktionen noch den account, dieser thread läuft unter.
Ich bin mir auch bewusst, dass es einige Weg, um ein identitätstoken Verwendung von SSPI. Hat jemand experimentiert mit diesen Token, sind Sie gut für den Zugriff auf Aktien -, SCM -, remote registry und so? Ist, was WNetAddConnection ist mit?
EDIT: Zu klären, den Grund kann ich nicht verwenden LogonUser ist, weil ich brauchen, um die Identität von Benutzer in einer nicht vertrauenswürdigen Domäne oder Arbeitsgruppe
EDIT2: eine Weitere Klärung: der Artikel, den ich versuche zu implementieren ist ähnlich wie psexec, z.B.:
- Programm sollte sich nicht ändern-Hosts oder der active directory-Konfiguration (z.B.: temporäre lokale Benutzer, etc). Außerdem Annahme nicht gemacht werden kann, dass es läuft auf DC oder nicht
- es können keine Annahmen darüber gemacht, welche software ist vorinstalliert auf dem remote-host, nur die Bedingung gegeben ist, dass die windows-Dateifreigabe aktiviert ist, auf den Gegner
- Konto/Kennwort bekannt ist, arbeiten am Ziel, aber Ziel-Maschine kann in der lokalen Domäne, fremde Domäne nicht in der domain überhaupt.
EDIT3: ich würde wirklich gerne mehr darüber hören SSPI InitializeSecurityContext - /AcquireCredentialsHandle-option. Ist es jemand, der gearbeitet hat mit dieser API ausgiebig? Ist es möglich das Token zurückgegeben mit dem Identitätswechsel, so dass ein thread Zugriff auf Netzwerk-Freigaben und Dateien kopieren, etc? Kann jemand post ein funktionierendes code-snippet?
EDIT4: Dank Marsh Ray, problem aber behoben. Wenn jemand sucht, um zu sehen, proof-of-concept-code, es ist hier
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie wollen, "Zugriff auf Netzwerkressourcen", die außerhalb Ihrer Wälder, mit WNetAddConnection2/3 wie Sie bereits erwähnt, oder verwenden Sie die standard-RPC-APIs mit RPC_ C__ AUTHN__ GSS__ AUSHANDELN und und expliziten Anmeldeinformationen Struktur.
Normalerweise "impersonation" ist etwas, das passiert auf der server-Seite. Die server-Seite wird in der Lage sein, die Identität der Verbindung als das Konto, das Sie anschließen.
Aber der Schlüssel ist: Identitätswechsel macht nur Sinn für die Identität ein Konto die server zugreifen kann in seiner lokalen SAM - /domain - /forest-Verzeichnis. Wenn client und server in verschiedenen Gesamtstrukturen, Sie eindeutig nicht damit einverstanden, auf die SID eines Kontos für einen Identitätswechsel-token (außer im Fall von bekannten SIDs wie Administrator, die dienen hauptsächlich zu verwechseln, diese Art der Sache), und das scheint notwendig zu prüfen, gegen DACLs etc.
Vielleicht, was Sie wollen, ist zu nennen LogonUserEx mit der LOGON32__ ANMELDUNG__ NEUE__ CREDENTIALS-flag. Dies sollte gelingen (sogar in einem anderen Wald - es spielt eigentlich keine Authentifizierung der Anmeldeinformationen, die Sie geben) geben Sie ein token mit Benutzername/Passwort, das Sie angegeben haben. Sie können die Nutzung DuplicateToken, diesen in ein identitätstoken. Dann können Sie SetThreadToken zu ersetzen, die token auf dein thread.
IMHO ist dies nicht wirklich "impersonation", du bist einfach mit den Anmeldeinformationen völlig, aber es ermöglicht Ihnen den Zugriff auf Netzwerk-Ressourcen transparent wie die beliebigen Benutzernamen/Passwort, die Sie liefern.
Edit: ach ja, bewusst sein, dass es keinen Schutz gegen man-in-the-middle " - auf diese Art der Verbindung. Der AUFTRAGGEBER insbesondere nicht stark Authentifizierung des Servers (kurz Heldentaten, wie IPSEC), so in der Theorie kann man nicht Vertrauen alles, was der server sagt Sie.
Geht die Theorie, dass Sie übergeben Sie die Anmeldeinformationen als
SEC_WINNT_AUTH_IDENTITY
Struktur der AcquireCredentialsHandle Funktion, die erstellt das handle verwendet, in InitializeSecurityContext. Ich habe nie versucht, diese auf fremden domains, obwohl, und ich weiß nicht, ob es funktioniert.Tun dies direkt und zuverlässig über die Windows-API scheint unmöglich, plus Windows ist so viel Arbeit hinter den kulissen, um Zugriff auf Netzwerk "einfach funktionieren". Plus die Identitätswechsel-Seite der Dinge funktioniert nur bei single-thread, genannt APIs.
Aber... man kann ein ganzes Programm unter einem anderen Benutzer... wenn Sie z.B. ein Dienst ausgeführt.
So könnten Sie die Registrierung Bearbeiten, die in Ihrem main-Programm zum ausführen verschiedener Dienste unter verschiedenen Sicherheits-Token und nutzen die IPC/Sockets zu kommunizieren, mit der diese Prozesse von Ihrem Haupt-Anwendung. dh. eine ganze Reihe (oder Neustart und Neukonfiguration des gleichen Prozesses) der helper-Prozesse laufen unter dem anderen Benutzer(s), die Ihre Haupt-app missbraucht.
Ich weiß, dies ist ein hack, aber es scheint realisierbar sind 😉
Konnte Sie öffnen eine Befehlszeile ein, ordnen Sie das Laufwerk mit der Klartext-Benutzernamen und Passwort. Dann trennen Sie das Laufwerk:
http://technet.microsoft.com/en-us/library/cc756153(WS.10).aspx