Днес получих месечната си фактура от доставчика ми на интернет и нещо ми се стори странно.

Фактурата, съдържаща се в писмото, беше в ZIP файл с парола.

Да не говорим колко странно беше да се получи прикачен файл като ZIP в наши дни (спам, зловреден софтуер, фишинг и т.н.), паролата, която бяха избрали, ми се стори много слаба.

Това е рожденият ден на титуляря на сметката във формат YYMMDD.

Направих едно много грубо изчисление наум, докато бях на фитнес, и се оказа, че възможните комбинации са много малко. След като използвах онлайн инструмент за изчисляване на колко дни са минали (тъй като не всички комбинации биха довели до валидна дата) от 1900-01-01, се оказа, че комбинациите са само 44 075 (до 2020-09-14).

Знаейки, че оптимизирани инструменти, използващи GPU мощност за разбиване на хешове, могат да правят догадки в милиони на секунда, исках да видя колко бързо може да се разгадае паролата без да ги използвам, а само с помощта на Linux/macOS CLI (тъй като имах достъп единствено до VPS във фитнеса).

Измислих следния код, който работи на macOS:

echo {1..44000} | xargs -P 16 -n 1 -I{} date -v "-{}d" +"%y%m%d" | xargs -P 16 -I{} sh -c 'unzip -qqoP "{}" 0417160508.zip && echo "{}" && exit 255'

Командата е доста проста в работата си, въпреки че изглежда сложна.

echo {1..44000} генерира числата от 1 до 44 000 и ги предава на следващата стъпка.

xargs -P 16 -n 1 -I{} date -v "-{}d" +"%y%m%d" – взема входа от първата стъпка и генерира дати във формат YYMMDD, като използва функционалността на date да „добавя“ към дата определено количество. В случая това би извадило X дни от текущата дата. Където X е числото, генерирано в първата стъпка. По този начин можем да генерираме дати от днес назад до 1900-те.

Третата стъпка е по-интересната, затова ще я разделя на две части:

xargs -P 16 -I{} sh -c '...'

Това взема генерираните дати от стъпка 2 и изпълнява команда за всяка от тези дати. -P 16 тук означава, че това ще се изпълнява в 16 паралелни процеса, за да се ускори пресяването на данните. Същият трик е приложен и в стъпка 2, за да се ускори генерирането на дати.

Втората част е мястото, където се случват догадките:

unzip -qqoP "{}" 0417160508.zip && echo "{}" && exit 255

Това, което прави, е първо да се опита да декомпресира zip файла, използвайки паролата, генерирана в стъпка 2. Ако е успешно, то ще отпечата (echo) познатата парола и след това exit 255 принуждава xargs да спре изпълнението. Не искаме да продължаваме да гадаем, ако паролата вече е намерена.

Като цяло, беше доста лошо решение да се избере това за парола на файла, защото изпълнението на горната команда отнема само около 10 секунди, за да се разгадае правилната парола за моята фактура. Не много повече за когото и да било друг.