Преминете към съдържанието

МЕУ организира кампания за пентестове в държавната администрация

Целта на кампанията е да подобри киберсигурността в държавната администрация, като участието в нея е доброволно и не се обвързва с възнаграждение.
Прочети повече за програмата

Добре дошли в Хакинг.БГ! 

Всеки един от нас стои на раменете на гигантите, споделили знанията и опита си с нас.

Този форум е нашият начин да върнем жеста за бъдещите и текущите кадри в киберсигурността.

Стремим се да предоставим платформа, където членовете могат да развиват своите умения, като се дава приоритет на етиката, сигурността и поверителността!

AES GCM - криво проблемче.


Препоръчан пост


  • Група:  [Член]
  • Последователи:  2
  • Брой мнения:  18
  • Репутация:   13
  • Спечелени дни:  4
  • Регистриран на:  19.04.2023
  • Статус:  Оффлайн
  • Система/OS::  Windows

Здравейте, опитвам се да си сглобя едно инструментче за декрипт на паролите от Google Chrome. Ключа го получавам, зареждам си хромската база и си прочитам BLOB-а на паролата. Той е 41 байта. Първите 3 са меджик на блоба - махам ги. Следващите 12 байта са IV на AES GCM и остават 25 байта за декрипт. Декриптват се но реално незнам дължината на ИСТИНСКИТЕ данни вътре. Някой има ли идея как да ги получа. Единствения вариант който измислих е декриптнатите данни от 1-ва позиция нататък + 1 (инкрементал) да се криптат наново и да се сравнява позицията с изчетение блоб и ако е различна значи там е дължината на реалните ама ми се струва кайно дървен този метод. Ще съм благодарен ако някой има по-добра идея.

Редактирано от memwarrior
Link to comment
Сподели другаде


  • Група:  [Администратор]
  • Последователи:  7
  • Брой мнения:  51
  • Репутация:   42
  • Спечелени дни:  21
  • Регистриран на:  10.04.2023
  • Статус:  Оффлайн
  • Система/OS::  Windows

https://github.com/ohyicong/decrypt-chrome-passwords

https://ohyicong.medium.com/how-to-hack-chrome-password-with-python-1bedc167be3d

 

@memwarrior , хвърли един поглед на тези 2 линкчета, мисля ,че може да ти свършат работата за да ги имплементираш в твоя инструмент.

Hacking-Banner.png

Link to comment
Сподели другаде


  • Група:  [Член]
  • Последователи:  2
  • Брой мнения:  18
  • Репутация:   13
  • Спечелени дни:  4
  • Регистриран на:  19.04.2023
  • Статус:  Оффлайн
  • Система/OS::  Windows

преди 5 минути, Tsvetkov каза:

https://github.com/ohyicong/decrypt-chrome-passwords

https://ohyicong.medium.com/how-to-hack-chrome-password-with-python-1bedc167be3d

 

@memwarrior , хвърли един поглед на тези 2 линкчета, мисля ,че може да ти свършат работата за да ги имплементираш в твоя инструмент.

Да, точно това правя. JSON-а си го обработвам. Получавам си ключовете както си е реда, Превъртам го през DPAPI-то на Windows-а. Отварям базата на Хрома. Селектвам си от таблица logins  каквото ми трябва. Започвам да обхождам куерито и да декриптвам блоба на паролата.

(<MAGIC 3 bytes><IV 12 bytes><encrypted password>) - такъв е формата на БЛОБА.

и сега с ключа от JSON-a, IV от БЛОБ-а трябва да се декриптне последните 25 байта от БЛОБА с AES-GCM.

Декриптвам си ги и се получава: XX XX XX XX XX XX .... XX XX YY YY YY YY YY  25 байта. Където XX XX XX... е паролата YY YY YY ... са някакви данни които не ми се мисли какво са (може и някаква сол да са) и въпроса ми е:

XX XX XX XX XX не е нул терминиран за да кажа това е паролата а направо е залепен с YY YY YY YY и не мога да я принтна на екрана коректно.

Link to comment
Сподели другаде


  • Група:  [Член]
  • Последователи:  2
  • Брой мнения:  18
  • Репутация:   13
  • Спечелени дни:  4
  • Регистриран на:  19.04.2023
  • Статус:  Оффлайн
  • Система/OS::  Windows

Мдааа.... който не чете ....

При AES GCM криптираните данни вървят с AUTH дата на опашката (16 байта).    <ДЪЛЖИНА НА ДАННИТЕ ОТ БЛОБА> - <AAD - 16 байта> = <Реални данни> и всичко си е ОК.

Link to comment
Сподели другаде


  • Група:  [Член]
  • Последователи:  2
  • Брой мнения:  18
  • Репутация:   13
  • Спечелени дни:  4
  • Регистриран на:  19.04.2023
  • Статус:  Оффлайн
  • Система/OS::  Windows

преди 8 минути, memwarrior каза:

Мдааа.... който не чете ....

При AES GCM криптираните данни вървят с AUTH дата на опашката (16 байта).    <ДЪЛЖИНА НА ДАННИТЕ ОТ БЛОБА> - <AAD - 16 байта> = <Реални данни> и всичко си е ОК.

Получи се прилично късо програмче:

 

{$DEFINE OSWINDOWS}
program ChromeShow;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils,
  Windows,
  mormot.core.base in '..\Mormot2\src\core\mormot.core.base.pas',
  mormot.core.json in '..\Mormot2\src\core\mormot.core.json.pas',
  mormot.core.os in '..\Mormot2\src\core\mormot.core.os.pas',
  mormot.core.variants in '..\Mormot2\src\core\mormot.core.variants.pas',
  mormot.core.buffers in '..\Mormot2\src\core\mormot.core.buffers.pas',
  mormot.crypt.core in '..\Mormot2\src\crypt\mormot.crypt.core.pas',
  mormot.db.raw.sqlite3 in '..\Mormot2\src\db\mormot.db.raw.sqlite3.pas',
  mormot.db.raw.sqlite3.static in '..\Mormot2\src\db\mormot.db.raw.sqlite3.static.pas';

Var
    UserName : Array [0..64] of widechar;
    sz : Cardinal;
    CHROME_PATH_LOCAL_STATE : string = 'C:\Users\%s\AppData\Local\Google\Chrome\User Data\Local State';
    CHROME_PATH : String = 'C:\Users\%s\AppData\Local\Google\Chrome\User Data\Default\Login Data';  // For Account.
    LS,DS: string;
    doc,oc: TDocVariantData;
    os_crypt_node,
    ekey : RawUtf8;
    ek : array[0..8192] of byte;
    ek1:string;
    ek2,
    chrome_key : RawByteString;
    bchrome_key : array [0..31] of byte;

  data : array [0..64] of byte;
  edata : array [0..64] of byte;

  ctxt: TAesGcmEngine;
  key,IV: TAesBlock;
  dst:array[0..64] of ansichar;
  bloblen: integer;
  idx,idx1 : nativeint;
  Demo: TSqlDataBase;
  R: TSqlRequest;
  passblob : RawByteString;
  spass: String;

begin
   sz:=1000;
   GetUserName(@UserName,sz);
   fmtstr(LS,CHROME_PATH_LOCAL_STATE,[System.WideCharToString(@UserName)]);
   if not doc.InitJsonFromFile(LS, JSON_OPTIONS_FAST_EXTENDED) then Exit; //=>
   os_crypt_node:=doc.Values[doc.GetValueIndex('os_crypt')];
   oc.InitJson(os_crypt_node);
   ekey := oc.Values[oc.GetValueIndex('encrypted_key')];
   base64decode(@ekey[1],@ek,length(ekey));
   ek1:=TEncoding.ansi.GetString( ek );
   Delete(ek1,1,5);
   chrome_key:=CryptDataForCurrentUserDPAPI(ek1,'',false);
   copymemory(@bchrome_key, @chrome_key[1],32);

   fmtstr(DS,CHROME_PATH,[System.WideCharToString(@UserName)]);

   demo:=TSqlDataBase.Create(DS,'');
   Demo.Synchronous := smOff;
   Demo.LockingMode := lmExclusive;
   r.Prepare(Demo.DB,'SELECT action_url, username_value, password_value FROM logins');
    while R.Step = SQLITE_ROW do
    begin
         if comparestr(r.FieldS(0),'')<>0 then
         begin
               writeln('URL:      '+r.FieldS(0));
               if comparestr(r.FieldS(1),'')<>0 then
               begin
                     writeln('Username: '+r.FieldS(1));
                     passblob:=r.FieldBlob(2);
                     bloblen:= Length(passblob);
                     copymemory(@data,(@passBlob[1]),bloblen);
                     copymemory(@IV,@data[3],12);
                     copymemory(@edata,@data[15],bloblen-12-3);
                     ctxt.Init(bchrome_key, 256);
                     ctxt.Reset(@IV, 12);
                     idx:=bloblen-15;
                     ctxt.Decrypt(@edata,@dst, idx-16, nil,0);
                     spass:=StrPas(dst);
                    Writeln('Password: '+dst);
               end;
         end;
         r.Preparenext;
         writeln(^M);
    end;
end.
Редактирано от memwarrior
Link to comment
Сподели другаде


  • Група:  [Член]
  • Последователи:  2
  • Брой мнения:  18
  • Репутация:   13
  • Спечелени дни:  4
  • Регистриран на:  19.04.2023
  • Статус:  Оффлайн
  • Система/OS::  Windows

преди 10 минути, memwarrior каза:

 

 

 

 

Редактирано от memwarrior
Link to comment
Сподели другаде


  • Група:  [Член]
  • Последователи:  2
  • Брой мнения:  18
  • Репутация:   13
  • Спечелени дни:  4
  • Регистриран на:  19.04.2023
  • Статус:  Оффлайн
  • Система/OS::  Windows

, memwarrior каза:

Сериозна оптимизация на мърльотиите и вече е по-симпатична: (при желание мога да компилирам и при мен) И най интересното работи и със Microsoft Edge - само трябва да се коментира ненужното.

{$DEFINE OSWINDOWS}
program ChromeShow;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils,
  System.NetEncoding,
  Windows,
  mormot.core.base in '..\Mormot2\src\core\mormot.core.base.pas',
  mormot.core.json in '..\Mormot2\src\core\mormot.core.json.pas',
  mormot.core.os in '..\Mormot2\src\core\mormot.core.os.pas',
  mormot.core.variants in '..\Mormot2\src\core\mormot.core.variants.pas',
  mormot.crypt.core in '..\Mormot2\src\crypt\mormot.crypt.core.pas',
  mormot.db.raw.sqlite3 in '..\Mormot2\src\db\mormot.db.raw.sqlite3.pas',
  mormot.db.raw.sqlite3.static in '..\Mormot2\src\db\mormot.db.raw.sqlite3.static.pas';

Var
    UserName : Array [0..64] of widechar;
    sz : Cardinal;
//    CHROME_PATH_LOCAL_STATE : string = 'C:\Users\%s\AppData\Local\Google\Chrome\User Data\Local State';
//    CHROME_PATH : String = 'C:\Users\%s\AppData\Local\Google\Chrome\User Data\Default\Login Data';  // For Account.
    CHROME_PATH_LOCAL_STATE : string = 'C:\Users\%s\AppData\Local\Microsoft\Edge\User Data\Local State';
    CHROME_PATH : String = 'C:\Users\%s\AppData\Local\Microsoft\Edge\User Data\Default\Login Data';  // For Account.
    LS,DS: string;
    doc,oc: TDocVariantData;
    os_crypt_node:string;
    ek : TBytes;
    chrome_key : RawByteString;
  ctxt: TAesGcmEngine;
  dst:array[0..64] of ansichar;
  bloblen: integer;
  Demo: TSqlDataBase;
  R: TSqlRequest;
  passblob : RawByteString;
  spass: String;

begin
   sz:=1000;
   GetUserName(@UserName,sz);
   fmtstr(LS,CHROME_PATH_LOCAL_STATE,[System.WideCharToString(@UserName)]);
   if not doc.InitJsonFromFile(LS, JSON_OPTIONS_FAST_EXTENDED) then Exit; //=>
   os_crypt_node:=doc.Values[doc.GetValueIndex('os_crypt')];
   oc.InitJson(os_crypt_node);
   ek:=TNetEncoding.Base64.DecodeStringToBytes(oc.Values[oc.GetValueIndex('encrypted_key')]);
   Delete(ek,0,5);
   chrome_key:=CryptDataForCurrentUserDPAPI(RawByteString(ek),'',false);
   fmtstr(DS,CHROME_PATH,[System.WideCharToString(@UserName)]);
   demo:=TSqlDataBase.Create(DS,'');
   Demo.Synchronous := smOff;
   Demo.LockingMode := lmExclusive;
   r.Prepare(Demo.DB,'SELECT action_url, username_value, password_value FROM logins');
    while R.Step = SQLITE_ROW do
    begin
         if comparestr(r.FieldS(0),'')<>0 then
         begin
               writeln('URL:      '+r.FieldS(0));
               if comparestr(r.FieldS(1),'')<>0 then
               begin
                     writeln('Username: '+r.FieldS(1));
                     passblob:=r.FieldBlob(2);
                     bloblen:= Length(passblob);
                     ctxt.Init(chrome_key[1], 256);
                     ctxt.Reset(@passblob[4],12);//(@IV, 12);
                     ctxt.Decrypt(@passblob[16],@dst, bloblen-15-16, nil,0);
                     spass:=StrPas(dst);
                     Writeln('Password: '+dst);
                     fillchar(dst,sizeof(dst),0);
               end;
         end;
         r.Preparenext;
         writeln(^M);
    end;
end.
 

Link to comment
Сподели другаде


  • Група:  [Администратор]
  • Последователи:  7
  • Брой мнения:  51
  • Репутация:   42
  • Спечелени дни:  21
  • Регистриран на:  10.04.2023
  • Статус:  Оффлайн
  • Система/OS::  Windows

Супер, помогнаха ли ти материалите? 🙂

Hacking-Banner.png

Link to comment
Сподели другаде

  • 3 седмици по-късно...

  • Група:  [Член]
  • Последователи:  5
  • Брой мнения:  45
  • Репутация:   40
  • Спечелени дни:  13
  • Регистриран на:  16.04.2023
  • Статус:  Оффлайн
  • Система/OS::  Windows

Здравейте,

Не е важно дали методът е "дървен" или не. Важно е да работи и да е ефективен. 

 

 

Редактирано от Avatara

Може да съм грозен, но имам свое мнение по въпроса.

Link to comment
Сподели другаде


  • Група:  [Член]
  • Последователи:  5
  • Брой мнения:  45
  • Репутация:   40
  • Спечелени дни:  13
  • Регистриран на:  16.04.2023
  • Статус:  Оффлайн
  • Система/OS::  Windows

Много Ви благодаря за полезната информация.

Останах изумен от начина по който в Google съхраняват критични данни. Ако трябва да бъда откровен, ако аз си позволя подобно нещо ще последват много сериозни санкции. Така не се работи от години, но все по-често до мен достига информация за подобна форма на съхраняване на пароли и не само. Не знам защо се прави и каква е логиката.

Това, което сте направили е изключително сериозно и Ви съветвам ако имате възможност да го публикувате в някое от специализираните издания за информационна сигурност.

Друг момент, който ме впечатли е, че ползвате Delphi при това без да прилагате C++ логика (използвате RawByteString, а не Bytes, примерно), което определено е достойно а уважение. Има декларирани, но неизползвани променливи, но вярвам, че ще се справите.

Няма значение дали сте ползвали готови решения и библиотеки. Въпросът е, че се опитвате да анализирате един конкретен проблем.

Така написаното приложение освен конзолно лесно може да бъде преобразувано в мултиплатформено. Можете спокойно да го направите и за Android и за iOS и за Linux и Windows, и да помислите за някакъв интерфейс.

Още веднъж приемето моите поздравления.

 

Редактирано от Avatara

Може да съм грозен, но имам свое мнение по въпроса.

Link to comment
Сподели другаде


  • Група:  [Член]
  • Последователи:  2
  • Брой мнения:  18
  • Репутация:   13
  • Спечелени дни:  4
  • Регистриран на:  19.04.2023
  • Статус:  Оффлайн
  • Система/OS::  Windows

, Avatara каза:

Много Ви благодаря за полезната информация.

Останах изумен от начина по който в Google съхраняват критични данни. Ако трябва да бъда откровен, ако аз си позволя подобно нещо ще последват много сериозни санкции. Така не се работи от години, но все по-често до мен достига информация за подобна форма на съхраняване на пароли и не само. Не знам защо се прави и каква е логиката.

Метода си е много ТРИКИ.... Генерално блоба е криптиран през DPAPI. То е базирано на уникален сесиен ключ за текущия юзер (за това се грижат Майкрософт). И дефакто  CryptData ползува този ключ но ЮЗЕРА НЕ ГО ВИЖДА (той се генерира при създаване на акаунта в машината). 😉 Е, естествено падне ли първо ниво оттам AES GCM не е проблем. .... но си е трики защото само юзера който знае паролата на акаунта може да си види какво е сторвал в гугълските писания.

😉

за публикуване ....  не е "топлата вода" че да е така значима.

, Avatara каза:

Друг момент, който ме впечатли е, че ползвате Delphi при това без да прилагате C++ логика (използвате RawByteString, а не Bytes, примерно), което определено е достойно а уважение. Има декларирани, но неизползвани променливи, но вярвам, че ще се справите.

еееее като за драфт си е добре. в първия пост (където съм объркал цвета на поста и седи тъмно) там е много по-зле. Иначе го очовечих. Сложих му и getopt в командната линия да избираш тъпа на броузера (CHROME/EDGE) сега е човешко. За RawByteString ... MORMOT-a си го искаше.... той поне се води "модерен" фреймуърк.

 

, Avatara каза:

Няма значение дали сте ползвали готови решения и библиотеки. Въпросът е, че се опитвате да анализирате един конкретен проблем.

Няма готови решения. Единствено и само MORMOT 2 на Synapse (опънсорс е ) заради това че имаше всички необходими примитиви вътре иначе само си представи: JSON, BASE64, SQLITE3, SQL QUERY, AES GCM .... да започнеш да ги събираш на едно място като библиотеки си е малко омотване.... 🙂 

 

, Avatara каза:

Така написаното приложение освен конзолно лесно може да бъде преобразувано в мултиплатформено. Можете спокойно да го направите и за Android и за iOS и за Linux и Windows, и да помислите за някакъв интерфейс.

За толкова платформен ентусиазъм надали ще проимам ама мога в свободното време да помисля за FIREFOX подръжка и някой друг по-популярен броузър.

, Avatara каза:

Още веднъж приемето моите поздравления.

 

........ дефакто идеята за това парче код дойде от там че наистина ми притрябва такова нещо и тръгнах да запускам разни питонски писаници и като настана една веселба с тази и онази библиотека и не ми издржаха нервите.

Link to comment
Сподели другаде

Join the conversation

Можете да публикувате сега и да се регистрирате по-късно. If you have an account, sign in now to post with your account.

Гост
Отговори на тази тема

×   Поставено като форматиран текст.   Вместо това поставете като обикновен текст

  Разрешени са само 75 емотикони.

×   Вашата връзка е вградена автоматично.   Вместо това се показва като връзка

×   Вашето предишно съдържание е възстановено.   Изчистване на редактора

×   Не можете да качите директно снимка. Качете или добавете изображението от линк (URL)

  • Регистрирайте се

    Регистрирайте се за да използвате пълната функционалност на форума 🙂

HACKING.BG Партньори

Asset3.png.df693f7661f6e8a7a3ec208659eda80b.pngtransparent1.png.c15979e1dc997cdd3a9941e342368a9b.png2.png.3e2592eadc660ecc831f1fdd569e8eb4.png600_489534840.png.72981fb02b90f1986dd7ade4d561e6d0.pngcyberclub-logo-text.png.6e9d11752e2eade43d40337d83365e48.png

×
×
  • Създай ново...

Важна информация!

Политика за сигурност и условия на ползване Privacy Policy