Aufbau einer PDF im HexEditor

Hallo,

ich übe mich gerade in Assembler und möchte die Geschwindigkeiten zwischen zwei BruteForce-Algorithmen, je in C++ und Assembler, gegeneinander testen.

Als zu crackende Datei habe ich eine simple Adobe PDF mit einem 4-stelligen Password (dauert also hoffentlich keine 2^n Billionen Jahre...).

Da ich mich nicht mit PDF-Libraries auskenne und diese auch nur ungern für eine BruteForce-Attacke nutzen möchte (der Aufwand geht wahrscheinlich sehr auf Kosten der Laufzeit), habe ich mir überlegt, die PDF binär/hexadezimal auszulesen und das verschlüsselte Passwort direkt zu suchen.
Den String kann ich dann mit meinem String schnell abgleichen.

Ob das überhaupt geht, das frage ich Euch. Kennt sich jmd. mit dem PDF-Format aus? Kann man anhand des PDF-Headers die Position des Passwortes auslesen oder ist selbst die Position verschlüsselt?

Falls es also eine Möglichkeit gäbe, die Position und somit das verschlüsselte Passwort auszulesen, wäre meine zweite Frage: Gibt es die Verschlüsselungs-Algorithmen von Adobe irgendwo als OpenSource? Die brauche ich natürlich auch, um meine Passwörter mit dem verschlüsselt ausgelesenem Passwort abzugleichen.

Vielen Dank vorab für Eure Antworten.
Gapa
 
diese auch nur ungern für eine BruteForce-Attacke nutzen möchte
Man könnte aber zumindest schauen, wie es da gelöst wurde (oder Teile des Codes nutzen, um nicht das Rad neu erfinden zu müssen ;) )
git.ghostscript.com Git - mupdf.git/tree
https://github.com/muennich/mupdf/search?utf8=✓&q=decrypt
https://github.com/muennich/mupdf/b...04aba1e014ef6e04d/source/pdf/pdf-crypt.c#L746

Kann man anhand des PDF-Headers die Position des Passwortes auslesen oder ist selbst die Position verschlüsselt?

Soweit ich mich erinnern (und in Wiki nachschlagen *hust*) kann, gab/gibt es mehrere Standards samt mehreren Verschlüsselungsverfahren. Die neureren basieren auf AES.
'Ne Referenz seitens Adobe gibts natürlich auch - 1.7, Part1, 700 Seiten,
PDF Reference and Adobe Extensions to the PDF Specification | Adobe Developer Connection
oder komplett: 1300 Seiten, wobei man sich wohl auch noch die Erweiterungen anschauen sollte:
https://www.adobe.com/devnet/acrobat/pdfs/pdf_reference_1-7.pdf

PS:
bezüglich Passwortspeicherung: Grundsätzlich bietet es sich an, eine Checksumme/einen Hash der entschlüsselten Daten zu speichern und mit diese dann zu benutzen, um festzustellen, ob die Entschlüsselung (und damit das eingegeben Passwort) korrekt waren ;)
 
Hallo CDW,

vielen Dank für deinen Post.

Bezüglich deiner GitHub-Links kann ich nach kurzem Drüberfliegen noch nicht genau sagen, ob ich dort Algorithmen zum Aufspüren eines Passwortes via Dateioperationen an der PDF finden werde, allerdings schon einmal eine Übersicht über gängige Encryption-Algos (allerdings wiederum keine Algos, nur eine Übersicht)...

Gibt es so etwas wie eine Beschreibung des PDF-Formats, quasi ähnlich einer Beschreibung des PE-Formats bei Executablen?

PS:
bezüglich Passwortspeicherung: Grundsätzlich bietet es sich an, eine Checksumme/einen Hash der entschlüsselten Daten zu speichern und mit diese dann zu benutzen, um festzustellen, ob die Entschlüsselung (und damit das eingegeben Passwort) korrekt waren ;)
Daran dachte ich auch schon, aber dafür müsste ich wiederum wissen, wo ich den Text, den ich als entschlüsselte Abgleichbasis verwende, im verschlüsselten Format finde, wo wir wieder beim Aufbau einer PDF (binär/hexadezimal) wären.
Wenn ich einen entschlüsselten Satz aus der PDF bekomme (habe ich in meinem Fall ja, allerdings kann man bei einem 'echten' BruteForce-Angriff nicht davon ausgehen, entschlüsselte Daten zu haben), dann benötige ich immer noch denselben Satz in verschlüsselter Form, damit ich meine BruteForce-Passwörter auf irgendwas anwenden kann, um es dann zu vergleichen...

Oder habe ich dich falsch verstanden?:D
 
Bezüglich deiner GitHub-Links kann ich nach kurzem Drüberfliegen noch nicht genau sagen, ob ich dort Algorithmen zum Aufspüren eines Passwortes via Dateioperationen an der PDF finden werde, allerdings schon einmal eine Übersicht über gängige Encryption-Algos
Mupdf ist eine PDF Bibliothek, (die schnellste, die ich kenne ;) ), die z.B von https://en.wikipedia.org/wiki/Sumatra_PDF / https://pwmt.org/projects/zathura/ (und vermutlich noch weiteren Projekten) benutzt wird. Daher sollte sich da schon zumindest die wichtigsten Teile der üblichen "PDF-Reader-Funktionalität" wiederfinden lassen ;)
Zudem könnte man ja das Programm als Basis nehmen und den BF "einbauen" - so ersparst Du Dir den Bau eines PDF-Parsers (was, im Hinblick auf die umfangreiche Spezifikation, ziemlich friemelig werden könnte - siehe:
Code:
* Compute an encryption key (PDF 1.7 algorithm 3.2)
...
Compute an encryption key (PDF 1.7 ExtensionLevel 3 algorithm 3.2a)
...

/*
 * Compute an encryption key (PDF 1.7 ExtensionLevel 8 algorithm)
 *
 * Adobe has not yet released the details, so the algorithm reference is:
 * http://esec-lab.sogeti.com/post/The-undocumented-password-validation-algorithm-of-Adobe-Reader-X
 */
)

z.B könnte man hier ansetzen:
https://github.com/muennich/mupdf/b...04aba1e014ef6e04d/source/pdf/pdf-crypt.c#L622
Code:
/*
 * Authenticating the user password (PDF 1.7 algorithm 3.6
 * and ExtensionLevel 3 algorithm 3.11)
 * This also has the side effect of saving a key generated
 * from the password for decrypting objects and streams.
 */

static int
pdf_authenticate_user_password(fz_context *ctx, pdf_crypt *crypt, unsigned char *password, int pwlen)
{
	unsigned char output[32];
	pdf_compute_user_password(ctx, crypt, password, pwlen, output);
	if (crypt->r == 2 || crypt->r == 5 || crypt->r == 6)
		return memcmp(output, crypt->u, 32) == 0;
	if (crypt->r == 3 || crypt->r == 4)
		return memcmp(output, crypt->u, 16) == 0;
	return 0;
}
btw: ich habe auf Github verlinkt, weil man da wunderbar online den Quellcode durchsuchen kann.




(allerdings wiederum keine Algos, nur eine Übersicht)...
*hust*
Code:
FIPS-197 compliant AES implementation
https://github.com/muennich/mupdf/b...856204aba1e014ef6e04d/source/fitz/crypt-aes.c

--------------

Daran dachte ich auch schon, aber dafür müsste ich wiederum wissen, wo ich den Text, den ich als entschlüsselte Abgleichbasis verwende, im verschlüsselten Format finde, wo wir wieder beim Aufbau einer PDF (binär/hexadezimal) wären.
Wie die "Pdf Reference 1.7", Seite 127 besagt
Algorithm 3.6 Authenticating the user password

1.Perform all but the last step of Algorithm 3.4 (Revision 2) or Algorithm 3.5 (Revi-
sion 3 or greater) using the supplied password string.

2.If the result of step 1 is equal to the value of the encryption dictionary’s U entry
(comparing on the first 16 bytes in the case of Revision 3 or greater), the password
supplied is the correct user password. The key obtained in step 1 (that is, in the
first step of Algorithm 3.4 or 3.5) can be used to decrypt the document using Al-
gorithm 3.1 on page 119.
;)
bzw.
https://github.com/muennich/mupdf/b...04aba1e014ef6e04d/source/pdf/pdf-crypt.c#L540
 
Zurück
Oben