Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Betriebssysteme (https://www.delphipraxis.net/27-betriebssysteme/)
-   -   Herausfinden ob PW zu dem Benutzerkonto passt (https://www.delphipraxis.net/54075-herausfinden-ob-pw-zu-dem-benutzerkonto-passt.html)

gsh 27. Sep 2005 14:25


Herausfinden ob PW zu dem Benutzerkonto passt
 
Hi DPler

Wie kann ich herausfinden ob ein PW des mein Programm hat zum ausgewählten User passt. Also, ich hab des pw: 1234 und drei Benutzer Administrator (is immer drauf), Benutzer1 (pw: 4334), Benutzer2 (pw: 1234) nun möchte ich prüfen ob des pw von mit dem pw des Benutzer1 übereinstimmt wenn nicht ob des pw mit dem Benutzer2 übereinstimmt.

Ich hab bei google schon gesucht und da hab ich viel über die SAM datei gelesen doch leider kann ich die nicht öffnen oder auslesen :wall:


Könnt ihr mir helfen?

Luckie 27. Sep 2005 14:49

Re: Herausfinden ob PW zu dem Benutzerkonto passt
 
Liste der Anhänge anzeigen (Anzahl: 1)
Das geht über SSPI. Unit im Anhaag.

Neue Version hochgeladen, in meiner Bearbeitung waren ein paar Fehler drinne. :-?

SKolberg 27. Sep 2005 14:51

Re: Herausfinden ob PW zu dem Benutzerkonto passt
 
Hi,

normalerweise sind die Passwörter die Windows NT/2000/XP benutzt verschlüsselt und können nicht so "einfach" ausgelesen werden. Da hilft nur noch ne BruteForce Attacke...


Mfg, Steve

Nikolas 27. Sep 2005 14:52

Re: Herausfinden ob PW zu dem Benutzerkonto passt
 
Zitat:

Da hilft nur noch ne BruteForce Attacke...
Die Beschreibung oben klingt schon sehr verdächtig danach...

NicoDE 27. Sep 2005 15:26

Re: Herausfinden ob PW zu dem Benutzerkonto passt
 
Oder für lokale Accounts (keine Ahnung ob es mit ADS funktioniert)
Delphi-Quellcode:
(** )
type
  NET_API_STATUS = Integer;

function NetUserChangePassword(domainname, username, oldpassword,
  newpassword: LPCWSTR): NET_API_STATUS;
  stdcall; external 'netapi32.dll';
(**)

function VerifyUserPassword(const UserName, Password: WideString): DWORD;
var
  // make sure it's the same pointer...
  Buffer: array [0..1023] of WideChar;
begin
  lstrcpynW(Buffer, PWideChar(Password), SizeOf(Buffer) div SizeOf(WideChar));
  Result := DWORD(
    NetUserChangePassword(nil, PWideChar(UserName), Buffer, Buffer));
end;

////////////////////////////////////////////////////////////////////////////////
// Test

procedure Test;
begin
  ShowMessage(SysErrorMessage(
    VerifyUserPassword('root', 'LittlePigLittlePigLetMeIn...')
  ));
end;

RavenIV 27. Sep 2005 15:41

Re: Herausfinden ob PW zu dem Benutzerkonto passt
 
Zitat:

Zitat von SKolberg
Hi,

normalerweise sind die Passwörter die Windows NT/2000/XP benutzt verschlüsselt und können nicht so "einfach" ausgelesen werden. Da hilft nur noch ne BruteForce Attacke...


Mfg, Steve

man kann aber das zu prüfende Passwort nach der selben Methode verschlüsseln wie das Original-passwort.
Dann kann man testen, ob beide verschlüssellten Passwörter gleich sind.

gruessle

gsh 27. Sep 2005 15:41

Re: Herausfinden ob PW zu dem Benutzerkonto passt
 
Danke werds gleich mal ausbrobieren

Zitat:

Zitat von Toxman
Zitat:

Da hilft nur noch ne BruteForce Attacke...
Die Beschreibung oben klingt schon sehr verdächtig danach...

Warum denkst du eigentlich immer gleich daran des es was illegales sein könnte?

faux 27. Sep 2005 15:45

Re: Herausfinden ob PW zu dem Benutzerkonto passt
 
Zitat:

Zitat von gsh
Danke werds gleich mal ausbrobieren

Zitat:

Zitat von Toxman
Zitat:

Da hilft nur noch ne BruteForce Attacke...
Die Beschreibung oben klingt schon sehr verdächtig danach...

Warum denkst du eigentlich immer gleich daran des es was illegales sein könnte?

Das Selbe habe ich mir auch gearde gefragt. Selbst wenn du versuchen würdest, ein Passwort zu knacken, ist es noch lange nicht illegal. :roll:
Luckie hat auf seiner Homepage auch so ein Tool. Auch das ist völlig legal.

PierreB 27. Sep 2005 15:47

Re: Herausfinden ob PW zu dem Benutzerkonto passt
 
Zitat:

Luckie hat auf seiner Homepage auch so ein Tool. Auch das ist völlig legal.
Aber nur, solange es am eigenen Rechner oder mit Erlaubnis angewendet wird (vermute ich mal). :zwinker:

Luckie 27. Sep 2005 15:50

Re: Herausfinden ob PW zu dem Benutzerkonto passt
 
Nicos Methode braucht aber etwas länger als die SSPI Methode, wenn das Passwort falsch ist. Für einen BruteForce Angriff eher unpraktisch.

Harry M. 30. Sep 2005 12:13

Re: Herausfinden ob PW zu dem Benutzerkonto passt
 
Um zu Testen ob des Pass richtig ist habe ich mir einen Service geschrieben. Mit dem ging es dann problemlos weil dieser mit erhöten Rechten läuft. Mit normalen Programmen wirds nicht gehen.

Übrigens:
Was wollt ihr den noch Brute Forcen? Die Zeiten sind vorbei :lol: Ich bastel grad was da schmeiß ich den Hash rein und des Pass kommt in ca 30-60 Sek raus bei grösseren Sachen dauerts halt einige sekunden länger. Aber wie geht habe ich grad vergessen :lol:

Luckie 30. Sep 2005 12:16

Re: Herausfinden ob PW zu dem Benutzerkonto passt
 
Dann zeig mal etwas Code, das würde bestimmt hier jeden interessieren. Und wie sieht der Service aus? Wozu braucht er die erhöhten Rechte? Mit SSPI geht es eben auch ohne.

Und wie sieht deine Hash Methode aus? Benutzt du dort einen Rainbowtable oder wie machst du es? Und zum Knacken von Hashes mittels deren Hashwerte solltets du dir mal dies angucken: http://www.delphipraxis.net/internal...wtable&start=0
Wie schafst du also diese 30 bis 60 Sekunden? :gruebel:

Harry M. 30. Sep 2005 12:27

Re: Herausfinden ob PW zu dem Benutzerkonto passt
 
Nicht mekern is sicher noch verbesserungswürdig (etwa TIniFile -> TMemInifile pp.) is halt noch in der Entwicklungphase.
Delphi-Quellcode:
unit Main;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs,
  ScktComp, IniFiles;

type
  TLoginSrv = class(TService)
    ServerSocket1: TServerSocket;
    procedure ServerSocket1ClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ServiceStart(Sender: TService; var Started: Boolean);
    procedure ServiceStop(Sender: TService; var Stopped: Boolean);
  private
    { Private-Deklarationen }
  public
    AppName: String;
    AppVers: String;
    function GetServiceController: TServiceController; override;
    { Public-Deklarationen }
  end;

var
  LoginSrv: TLoginSrv;

implementation

{$R *.DFM}
////////////////////////////////////////////////////////////////////////////////
procedure ServiceController(CtrlCode: DWord); stdcall;
begin
  LoginSrv.Controller(CtrlCode);
end;
////////////////////////////////////////////////////////////////////////////////
function TLoginSrv.GetServiceController: TServiceController;
begin
  Result := ServiceController;
end;
////////////////////////////////////////////////////////////////////////////////
function GetComputerName: String;
var
  Buffer: Array[0..MAX_COMPUTERNAME_LENGTH+1] of Char;
  Size: DWORD;
begin
  size:=256;
  Windows.GetComputerName(Buffer, Size);
  Result:=StrPas(Buffer);
end;
////////////////////////////////////////////////////////////////////////////////
procedure TLoginSrv.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
  IniDat: TIniFile;
  StrList: TStringList;
  ErrCode: Cardinal;
  FileName, Username, Password: String;
begin
  FileName := ExtractFilePath(ParamStr(0))+AppName+'.tmp';

  StrList := TStringList.Create;
  StrList.Text := Socket.ReceiveText;
  StrList.SaveToFile(FileName);

  IniDat := TIniFile.Create(FileName);
  Username := IniDat.ReadString('Authentification', 'Username','');
  Password := IniDat.ReadString('Authentification', 'Password','');

  LogonUser(PChar(Username), PChar(GetComputerName), PChar(Password), LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ErrCode);

  IniDat.WriteInteger('Authentification', 'ErrCode', ErrCode);
  IniDat.WriteString('Authentification', 'ErrCodeStr', SysErrorMessage(ErrCode));
  IniDat.WriteInteger('Authentification', 'GetLastError', GetLastError);
  IniDat.WriteString('Authentification', 'GetLastErrorStr', SysErrorMessage(GetLastError));

  StrList.Clear;
  StrList.LoadFromFile(FileName);

  LoginSrv.ServerSocket1.Socket.Connections[0].SendText(StrList.Text);
  LoginSrv.ServerSocket1.Socket.Disconnect(0);

  IniDat.Free;
  StrList.Free;
  if FileExists(FileName) then DeleteFile(FileName);
end;
////////////////////////////////////////////////////////////////////////////////
procedure TLoginSrv.ServiceStart(Sender: TService;
  var Started: Boolean);
begin
  ServerSocket1.Open;
end;
////////////////////////////////////////////////////////////////////////////////
procedure TLoginSrv.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
  ServerSocket1.Close;
end;
////////////////////////////////////////////////////////////////////////////////
end.

Luckie 30. Sep 2005 12:32

Re: Herausfinden ob PW zu dem Benutzerkonto passt
 
LogonUser versucht jedesmal den Benutzer einzuloggen. Und das dauert gegenüber der SSPI Methode ewig.

Edit: Ich habe meinem vorherigen Post noch etwas hinzugefügt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:03 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz