Piotr Konieczny

konsultant ds. bezpieczeństwa, podróżnik,
hobbystycznie fuksiarz i gadżeciarz
szkot, prawie spadochroniarz...
nienawidzi zielonego.


« wszystkie wpisy |

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...

Nie ma co się załamywać, pomyślałem, wystarczy przecież przyznać się nadawcy, podesłać mu drugi (nowy) klucz i poprosić o ponowną przesyłkę. Prawda, że proste? Niestety, równie proste co naiwne... Inteligentny nadawca (a zwłaszcza taki, który chciał przesłać mi poufną treść), od razu zwęszy podstęp. Przecież dowolny cyberbandzior, który miałby ochotę na te zaszyfrowane dane, mógłby wygenerować nową pare kluczy, wysłać je w moim imieniu i poprosić o ponowiene przesłanie treści. Nadawca nie ma żadnej pewności, że osoba która wysyła mu nowy klucz jest mną. Nie ma, bo przecież nie potrafię się przed nim uwierzytelnić. Nie znając hasła do klucza prywatnego, nie mogę złożyć cyfrowego podpisu, który mógłby być możliwy do zweryfikowania przez klucz publiczny, będący w posiadaniu nadawcy). Jeśli nie zrozumiałeś powyższego akapitu, to czas się doszkolić z PKI - polecam mój wykład: PGP - is it possible to keep e-data secured? (jęz. pol.).

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)!

Kolejne pare minut spędziłem na znalezieniu backupu krytycznych danych (do których zaliczał się config PSI) z odpowiedniego okresu. Jak dobrze robić regularne backupy!

Ale mając config - kolejna kłoda pod nogi. Nowe PSI reformatuje stare pliki konfiguracyjne. Wniosek: potrzeba mi dokładnie takiej samej wersji PSI jakiej używałem wtedy. A była to ostro patchowana wersja... Na szczęście, stare binarki, kody źródłowe i patche ciągle leżą w sieci... Kolejne kilkanaście minut googlania i ściągania...

Odpalam PSI - no i pięknie. Program loguje sie na starym (jeszcze autocomowym) koncie i podpisuje sesję *tym* kluczem. Zaglądam w ustawienia, a tam gwiazdki... No to ściągamy revelation i lecimy pod Windows. Dupa. Revelation nie odczytuje haseł ukrytych pod gwiazdkami w programach z QT. Cholerny Trolltech!

Rzucam okiem na config i widzę:

<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

Powyższy skrypt przyda się także osobom, które zapomniały jabberowego hasła (hasła do konta). Użycie takie samo - tylko zamiast pgpPassphrase wstawiamy to, co w configu widnieje pomiędzy tagami <password>.

Czas: 2+h
Hacking skillz: 2/5
Satysfakcja: bezcenna :-)

Teraz już wiem, dlaczego paranoicy nigdy nie pozwalają programom zapamiętać haseł...

• Następny post: Oficjalny blog Google Polska otwarty!
• Poprzedni post: Line Rider - namiastka studiów na MIT

 

Chcesz być informowany o kolejnych wpisach na ten temat?
Kanał RSS: kliknij tutaj. Subskrybcja poprzez e-mail: kliknij tutaj.

 

Tagi:

« reszta wpisów | • trackback | ‡ torturuj posta!

Komentarze:

1. RPM Czwartek, 19 października 2006, 20:25:40
 

I mają rację :-)
Ostatnio otrzymane "rozkazy z Berlina" brzmiały: zmienić hasła administracyjne na wszystkich maszynach produkcyjnych. O zgrozo - 30 haseł. O zgrozo - robimy to raz na 3 miesiące.
Minęło dwa tygodnie, hasła klepiemy regularnie, co 1-2 dni. I tak nie pamiętamy wszystkich ;-)

 
2. ajot Czwartek, 19 października 2006, 21:00:50
 

Sam kilka dni temu miałem problem z zapomnianym hasłem do jabbera. Dosyć szybko udało się wygooglować tego perlowego jednolinijkowca :-)

 
3. GiM Czwartek, 19 października 2006, 23:40:08
 

oj piko, piko: http://gim.jogger.pl/2005/03/21/wreszcie.../

 
4. sziwan Piątek, 20 października 2006, 01:12:05
 

Jej, to ktoś w ogóle podaje programom hasła do zapamiętania w ten sposób? Przecież to jest broken by design, z góry wiadomo że złamanie takiego hasła jest trywialne.

Jedyne sensowne rozwiązanie to szyfrowanie bazy z hasłami zbiorczym passphrase'em. Obniża to poziom bezpieczeństwa tylko pozornie, to w sumie ciekawe zagadnienie o którym nie chce mi się teraz pisać - shameless plug dla OS X się za to zmieści — fingerprinting binarek — system zapisuje (lub nie, w zależności od decyzji) kontrolkę dla danej binarki i pyta się o hasło do keychaina tylko jeśli odcisk tej binarki się zmieni (np. update systemu).

 
5. psz Piątek, 20 października 2006, 01:46:49
 

http://forum.jabberpl.org/index.php?s=&showtopic=4382&view=findpost&p=32202

 
6. Piotr Konieczny Piątek, 20 października 2006, 01:48:41
 

psz: Dzięki. To rządzi: http://kg.alternatywa.info/smieci/psipswd2txt.php :-)

 
7. Patrys Piątek, 20 października 2006, 01:48:57
 

Bzdurny ten wstęp, wystarczy, żeby nowy klucz podpisali ludzie, którzy podpisali stary i problem uwierzytelnienia znika. Właśnie po to się podpisuje cudze klucze.

 
8. Piotr Konieczny Piątek, 20 października 2006, 01:51:58
 

Patrys: I telefon by wystarczył. Pod warunkiem, że ktoś zna mój głos... i numer. Tamten klucz nie był podpisany przez nikogo.

 
9. lidia Piątek, 20 października 2006, 06:21:28
 

hehheheh :) ile razy ja sie tak bawilam... nawet kilkugodzinne szukanie, mb'ty sciaganych programow, tysiace linijek kodu.... :) milo ze nie jestem jedyna :)

 

Dodaj komentarz:

Wyślij pustą wiadomość, aby śledzić komentarze przez bota.
Komentarze są własnością osób komentujących.
Właściciel bloga nie ponosi za nie odpowiedzialności.
Komentarze nie na temat będą usuwane.

Ofiara

Jeśli powyższy wpis przydał Ci się w jakiś sposób,

autorowi :-)

Czytelnicy:

« wszystkie wpisy