Einzelnen Beitrag anzeigen

Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: SSL Key Log mit Indy erstellen

  Alt 3. Dez 2018, 17:52
Update: Hier eine verbesserte Version. Zum einen lese und schreibe das MasterKeyFile nun per Stream mit fmShareDenyNone, sodass gleichzeitige Zugriffe zwischen Wireshark und meinem Programm keine AV mehr produzieren. Zweitens habe ich einen Bug in Indy entdeckt, der m.M.n. in der Header-Deklaration steckt. Innerhalb von PSSL.S3 sind die Master-Secret und Client-Random um ein Byte verschoben. Dadurch klappte die Entschlüsselung mittels Wireshark beim aktuellen Indy nicht mehr. Drittens hatte ich noch einen Bug drin in der Hexformatierung, der nur zufällig und sporadisch zu korrekten NSS-Exports führte. Das ist nun auch behoben.
Delphi-Quellcode:
procedure TForm1.DoSSLStatusInfoEx(ASender: TObject;
  const AsslSocket: PSSL; const AWhere, Aret: Integer; const AType,
  AMsg: string);
var
  I, K, L: Integer;
  B: Byte;
  C: AnsiChar;
  LClientRandom, LMasterSecret, LLogLine: AnsiString;
  LMode: Word;
  S3: Pssl3_state;
  FS: TFileStream;
begin
  if Assigned(AsslSocket) and
     Assigned(AsslSocket^.session) and
     Assigned(AsslSocket^.s3) and
     (FMasterSecretFile <> '') then
  begin
    L := Length(AsslSocket^.session^.master_key) - 1;
    for I := 0 to L do begin
      B := AsslSocket^.session^.master_key[I];
      LMasterSecret := LMasterSecret + Format('%2.2x', [B]);
      if (I = L) and (LMasterSecret <> StringOfChar('0', (L+1)*2)) then begin
        L := Length(AsslSocket^.s3^.client_random) - 1;
        for K := 0 to L do begin
          S3 := AsslSocket^.s3;

          Dec(PByte(S3)); // <-- Bug irgendwo zwischen OpenSSL-DLL und Indy, Speicher von ASslSocket.S3 um ein Byte verschoben
          C := s3^.client_random[K];
          B := Ord(C);
          LClientRandom := LClientRandom + Format('%2.2x', [B]);
          if K = L then begin
            LLogLine := 'CLIENT_RANDOM ' + LClientRandom + ' ' +
                        LMasterSecret + sLineBreak;
            if LLogLine <> FLastMasterSecretLine then begin
              LMode := (fmOpenReadWrite or fmShareDenyNone);
              if not FileExists(FMasterSecretFile) then begin
                LMode := fmCreate or LMode;
              end;
              FS := TFileStream.Create(FMasterSecretFile, LMode);
              try
                FS.Position := FS.Size;
                FS.Write(LLogLine[1], Length(LLogLine));
                Exit;
              finally
                FLastMasterSecretLine := LLogLine;
                FreeAndNil(FS);
              end;
            end;
          end;
        end;
      end;
    end;
  end;
end;
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden

Geändert von Codehunter ( 4. Dez 2018 um 10:12 Uhr)
  Mit Zitat antworten Zitat