|
|
|
|
|
|
|
|
|
|
|||
![]() |
|||||||||||
Piotr Konieczny
konsultant ds. bezpieczeństwa, podróżnik, |
|||||||||||
|
Czwartek, 19 października 2006 :: 20:15:00
PSI + PGP hacking
Miałem starą parę kluczy PGP. Bardzo starą. I dziś dostałem przesyłkę, zaszyfrowaną publicznym kluczem z pary. Dogrzebałem się więc na dysku do starego klucza prywatnego. Odpaliłem GnuPG i już chciałem odszyfrować przesyłke, kiedy zorientowałem się, że nie pamiętam passphrase do klucza...
Po godzinie zgadywania hasła i ciągłym komunikacje: "Invalid passphrase - try again", nagle mnie olśniło. Przecież, kiedyś podpisywałem swoje sesje jabberowe *tym* kluczem PGP (i dla wygody, zachowałem hasło w programie)!
<jid>piko@jabber.autocom.pl</jid> <password>001a00080009000600...</password> (...) <pgpSecretKeyID>A85DA27...</pgpSecretKeyID> <pgpPassphrase>4000100...</pgpPassphrase> Nie jest to moja passphrase - jeszcze nie wymyślam haseł w heksach :-) Zakładam więc, że PSI musiało jakoś sprytnie przemielić moje hasło, by "bezpiecznie" zapisać je w configu. Niech żyją programy Open Source! (i Google Code Search!) - znajduję funkcję w PSI, odpowiedzialną za hasłowanie passphrase podanej przez użytkownika i zamieram - O mój Boże, przez cały ten czas, wredne PSI trzymało móje hasło do klucza publicznego prawie całkowicie nagie! (Ale jest dobra strona nieudolności PSI - łatwo będzie "złamać" ten algorytm :-) Wystarczy skorzystać z funkcji:
QString decodePassword(const QString &pass, const QString &key)
{
QString result;
unsigned int n1, n2;
if(key.length() == 0)
return pass;
for(n1 = 0, n2 = 0; n1 < pass.length(); n1 += 4) {
ushort x = 0;
if(n1 + 4 > pass.length())
break;
x += hexChar2int(pass.at(n1))*4096;
x += hexChar2int(pass.at(n1+1))*256;
x += hexChar2int(pass.at(n1+2))*16;
x += hexChar2int(pass.at(n1+3));
QChar c(x ^ key.at(n2++).unicode());
result += c;
if(n2 >= key.length())
n2 = 0;
}
return result;
}
Nie dość, że C++, to jeszcze z Qt. Zanim skonfigurowałbym sobie środowisko do skompilowania tego cuda, minęłyby wieki... ale sprawę przecież da się załatwić perlanym jednolinijkowcem :-) i w dodatku, jak czytelnie: xerror@szynszyl:~> perl -le '($jid , $pass) = @ARGV; $pass =~ s/..(..)/chr(hex($1))/ge; print(substr(($pass^$jid), 0, length($pass)))'
Do powyższego należy przekazać dwa argumenty (oba do znalezienia w configu): pgpPassphrase i JabberID konta. Tada, mam hasło! :D
• Następny post:
Oficjalny blog Google Polska otwarty!
Chcesz być informowany o kolejnych wpisach na ten temat? Komentarze:
|
|||||||||||
|
|
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|