Powstała strona na której jest "sprawdzajka" - wpisujemy numer seryjny baterii i jeżeli należy ona do wadliwej serii otrzymujemy informację jak ją wymienić. Jak się potwierdziły moje przypuszczenia Nokia całkowicie polega na tym że numeru seryjnego należącego akurat do wadliwej serii nie zgadniemy. Jeśli uda nam się trafić na prawidłowy numer wystarczy zadzwonić do Nokia Care. Dla naszego kraju jest to numer
+48 22 203 03 10
Prawdopodobnie sam oddział nie mieści się w Polsce - na wszystkie moje próby połączenia zgłaszały się konsultantki z wyraźnym ukraińskim/rosyjskim akcentem.
Konsultantka zapyta nas o numer seryjny, dane osobowe, numer telefonu(nie ma potrzeby blefować) i model telefonu z którym zakupiliśmy wadliwą baterię - możemy sobie wybrać dowolny z tej listy:
Nokia 1100, Nokia 1100c, Nokia 1101, Nokia 1108, Nokia 1110, Nokia 1112, Nokia 1255, Nokia 1315, Nokia 1600, Nokia 2112, Nokia 2118, Nokia 2255, Nokia 2272, Nokia 2275, Nokia 2300, Nokia 2300c, Nokia 2310, Nokia 2355, Nokia 2600, Nokia 2610, Nokia 2610b, Nokia 2626, Nokia 3100, Nokia 3105, Nokia 3120, Nokia 3125, Nokia 6030, Nokia 6085, Nokia 6086, Nokia 6108, Nokia 6175i, Nokia 6178i, Nokia 6230, Nokia 6230i, Nokia 6270, Nokia 6600, Nokia 6620, Nokia 6630, Nokia 6631, Nokia 6670, Nokia 6680, Nokia 6681, Nokia 6682, Nokia 6820, Nokia 6822, Nokia 7610, Nokia N70, Nokia N71, Nokia N72, Nokia N91, Nokia E50, Nokia E60
Ten komunikat o produkcie dotyczy również następujących akcesoriów:
Bezprzewodowy moduł GPS LD-1W,
Bezprzewodowy moduł GPS Nokia LD-3W
Po podaniu wszystkich danych pozostaje tylko czekać około miesiąca, dwóch - nie wiem dlaczego weryfikacja zajmuje im tyle czasu, bo same baterii przyjeżdżają kurierem DHL, wprawdzie z Belgii ale na pewno sam transport nie zajmuje aż tyle czasu. W paczce z nową darmową baterią otrzymujemy list z marketingowym bełkotem i prośbą o oddanie starej do lokalnego punktu Nokii lub wyrzucenie do specjalnych pojemników. Tylko jak zdobyć prawidłowy serial?
Przy pomocy niezastąpionej wtyczki do Firefoxa Tamper Data zauważyłem że wpisując serial ze swojej baterii do "sprawdzajki" lub dowolny inny błedny tak naprawde nie jest on wysyłany w żaden sposób do serwera -> sprawdzanie jest wykonywane po stronie klienta -> można je zmanipulować.
Wchodzę więc w źródło strony, żadnego kodu sprawdzającego nie widzę, za to jest zewnętrzy skrypt java script: http://nds1.nokia.com/batteryreplacement/pl-PL/rcrcheckserial.js
Kod na początku przeraża ale większa jego część to implementacja algorytmu MD5 której nie ma potrzeby analizować. Myślę skoro MD5 to nie ma sensu się nawet brać za to - nie odwrócę przecież przez brute force 26 znakowego ciągu który może zawierać też litery, a nikt nie robi rainbow tables specjalnie dla numerów seryjnych baterii Nokii.
Ale fachowcy z Nokii popełnili podstawowy błąd - podzielono serial na cztery części - z każdej z tych części jest liczony osobno hash MD5 i dla każdego z tych haszy w skrypcie jest na stałe zapisana lista prawidłowych. Znacznie łatwiej niż 26-znakowy ciąg jest zbrute'ować 4 hasze dla kilku znakowych ciągów dodatkowo zakładając że składa się z samych cyfr lub maksymalnie jednej litery.
Fragment skryptu Nokii:
function rcrcheck_serial() {
var isgood=false;
var serial=document.enterserial.serial.value;
var a='';
var b='';
var c='';
if(serial.length<26) {
alert("Numer identyfikacyjny jest nieprawidłowy. Proszę sprawdzić, czy wpisano wszystkie 26 znaków z numeru identyfikacyjnego baterii.");
return false;
}
if(serial.length>26) {
alert("Numer identyfikacyjny jest nieprawidłowy. Proszę sprawdzić, czy wpisano wszystkie 26 znaków z numeru identyfikacyjnego baterii.");
return false;
}
d=md5(serial.substr(0,7));
a=md5(serial.substr(7,6));
b=md5(serial.substr(13,1));
c=md5(serial.substr(14,3));
//###
if( d!="f836e12099e0b3ebaad02eb4701bac5b" //###
&& d!="9a85cfe403a9203609ed96246909d020" //###
&& d!="c0feaa7a2dc0a98f0546ccf527f11158" //###
&& d!="d7580f38ce301d67ed47d87118ef4cb5" //###
&& d!="aaf2a9c61bc422561df6dd38dceb8ac9" //###
&& d!="b7fc55cbb9824307b7eab7e02fca188a" //###
&& d!="c712d4d95b031b113186c92f3651069a" //###
&& d!="e2dbd5f32af1dc495f25ebd539926e20" //###
) {
window.location="rcrb2.html";
return false;
}
Najpierw jest sprawdzana długość serialu potem dla pierwszych 7 cyfr(zmienna d) liczony jest hash md5 i porównywany z listą prawidłowych(dla d).
Następnie pobierane jest kolejne 6 cyfr(a) i wynik haszowania porównywany z listą dla a itd.
Napisałem prosty skrypt w Pythonie który wylicza dla każdej z 4 części wszystkie możliwe hasze - dla pierwszej jest to 10 milionów, ale dla współczesnego nawet przeciętnego komputera to dosłownie chwila. Całość wykonywała się na moim Pentium M 1,5Ghz gdy system był obciążony innymi zadaniami zaledwie 9,5 sekundy.
Efekt działania skryptu:
nusch@nuschbox ~ $ ./find_nokia.py
Pierwsze 7 cyfr:
0670393
0670397
0670398
0670399
0670400
0670448
0670512
0670521
All hashes found
Kolejne 6:
360245
363563
436243
All hashes found
Dla litery N:
N011
N012
N013
N014
N015
N016
N017
N021
N022
N023
N024
N025
N026
N027
N031
N032
N033
N034
N035
N036
N037
N041
N042
N043
N044
N045
N046
N047
N051
N052
N053
Żeby nie łamać za każdym razem MD5, zrobiłem drugi skrypt generate_nokia.py który generuje gotowe seriale - bez parametru pojedynczy, gdy jako parametr podamy liczbę - dowolną ilość. Działa tak:
nusch@nuschbox ~ $ ./generate_nokia.py 5
0670399363563N043669777385
0670393436243N182126685362
0670399436243N203070381739
0670400363563N281286258996
0670397436243N335074268733
Oba skrypty do pobrania:
generate_nokia.py
find_nokia.py