
Lab CVE-2020-13277: vulnerabilità logica di Gitlab - accesso non autorizzato ai repository privati da parte di qualsiasi utente
Lab CVE-2020-13277: vulnerabilità logica di GitLab - accesso non autorizzato di qualsiasi utente a repository privati
CVE-2020-13277
├── README.md ............... [此 README 说明]
├── imgs .................... [辅助 README 说明的图片]
├── gitlab .................. [Gitlab 容器的挂载目录]
│ ├── Dockerfile .......... [Gitlab 的 Docker 构建文件]
│ ├── config .............. [Gitlab 配置挂载目录]
│ ├── data ................ [Gitlab 数据挂载目录]
│ ├── logs ................ [Gitlab 日志挂载目录]
│ ├── keys ................ [Gitlab 破解 License 存储目录]
│ └── runner .............. [Runner 容器的挂载目录]
├── license ................. [破解 License 的容器构建目录]
│ ├── Dockerfile .......... [License 的 Docker 构建文件]
│ └── license.rb .......... [生成破解 License 的 Ruby 脚本]
├── 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 靶场]
Il cuore di questa vulnerabilità è principalmente lo sfruttamento della funzione di backup e sincronizzazione a specchio dei repository, Mirror Repository.
La direzione di sincronizzazione del Mirror si divide in due tipi:
Questa vulnerabilità sfrutta il Mirror Repository in direzione Pull
Da notare che GitLab è disponibile in due versioni: CE (Community Edition gratuita) e EE (Enterprise Edition a pagamento), e GitLab ha dichiarato ufficialmente che questa vulnerabilità colpisce sia CE che EE nelle seguenti versioni:
>=10.6, <12.9.10>=12.10, <12.10.11>=13.0, <13.0.6Ma ciò non significa che tutte queste versioni delle Gitlab Docker Image possano essere usate per allestire il lab, perché:
In altre parole, per allestire il lab con Docker si può scegliere solo la versione GitLab-EE e crackarla (chi ha molti soldi può anche scegliere di acquistare una License) per attivare la funzionalità Mirror Repository - Pull.
Ma anche dopo aver crackato GitLab-EE, sia con 10.x, 12.x che 13.x, quando l'URL di Mirror Repository - Pull contiene un percorso locale, viene restituito l'errore Import url is blocked: Requests to localhost are not allowed.
Sebbene dopo aver impostato Allow requests to the local network from hooks and services in Admin area => Settings => Network => Outbound requests sia possibile configurare URL locali, durante la sincronizzazione dello specchio si ottiene l'errore 2:Fetching remote upstream failed: fatal: unable to access http://127.0.0.1/xxxx/: The requested URL returned error: 301. In altre parole, è utilizzabile solo il Pull del Remote Repository.
Fortunatamente, sebbene 12.x e 13.x abbiano metodi di rilevamento degli URL locali molto severi, la versione 10.x offre una soluzione: quando si configura l'URL di Pull, basta usare il nome del servizio DNS configurato localmente per aggirare il blocco.
In conclusione, l'unica opzione possibile è costruire il lab con l'immagine Docker gitlab-ee:10.6.0-ee.0.
In realtà, dalle descrizioni precedenti si capisce anche che le condizioni per sfruttare questa vulnerabilità sono piuttosto severe; in pratica, i "poveri" difficilmente possono essere colpiti da questa vulnerabilità
./keygen.sh o ./keygen.ps1./run.sh o ./run.ps1Quando in precedenza è stata generata la coppia di chiavi per il crack, la chiave pubblica è già stata scritta nel backend del container GitLab; ora è necessario caricare la chiave privata tramite il frontend su GitLab per completare il crack:
./gitlab/keys/; copiare il contenuto di .gitlab-license (la chiave privata)Enter license key, incollare la chiave privata e fare clic sul pulsante Upload license per completare il crackA questo punto la funzionalità Mirror Repository - Pull è attivata

Outbound requests, spuntare Allow requests to the local network from hooks and services e salvareA questo punto Mirror Repository - Pull supporta il pull di Repository locali

./register.sh $TOKEN o ./register.ps1 $TOKENA questo punto tutti i Repository possono usare questo Runner per eseguire script CI (Pipeline Jobs)
