Module: Msf::Post::Linux::Packages

Includes:
System
Defined in:
lib/msf/core/post/linux/packages.rb

Instance Method Summary collapse

Methods included from System

#get_container_type, #get_cpu_info, #get_hostname, #get_mount_path, #get_path, #get_shell_name, #get_shell_pid, #get_suid_files, #get_sysinfo, #glibc_version, #has_clang?, #has_gcc?, #interfaces, #ips, #listen_tcp_ports, #listen_udp_ports, #macs, #noexec?, #nosuid?, #protected_hardlinks?, #protected_symlinks?

Methods included from Auxiliary::Report

#active_db?, #create_cracked_credential, #create_credential, #create_credential_and_login, #create_credential_login, #db, #db_warning_given?, #get_client, #get_host, #inside_workspace_boundary?, #invalidate_login, #mytask, #myworkspace, #myworkspace_id, #report_auth_info, #report_client, #report_exploit, #report_host, #report_loot, #report_note, #report_service, #report_vuln, #report_web_form, #report_web_page, #report_web_site, #report_web_vuln, #store_cred, #store_local, #store_loot

Methods included from Metasploit::Framework::Require

optionally, optionally_active_record_railtie, optionally_include_metasploit_credential_creation, #optionally_include_metasploit_credential_creation, optionally_require_metasploit_db_gem_engines

Methods included from Unix

#enum_user_directories, #get_groups, #get_session_pid, #get_users, #is_root?, #whoami

Methods included from File

#_append_file_powershell, #_append_file_unix_shell, #_can_echo?, #_read_file_meterpreter, #_read_file_powershell, #_read_file_powershell_fragment, #_shell_command_with_success_code, #_shell_process_with_success_code, #_unix_max_line_length, #_win_ansi_append_file, #_win_ansi_write_file, #_win_bin_append_file, #_win_bin_write_file, #_write_file_meterpreter, #_write_file_powershell, #_write_file_powershell_fragment, #_write_file_unix_shell, #append_file, #attributes, #cd, #chmod, #copy_file, #dir, #directory?, #executable?, #exist?, #expand_path, #exploit_data, #exploit_source, #file?, #file_local_write, #file_remote_digestmd5, #file_remote_digestsha1, #file_remote_digestsha2, #immutable?, #initialize, #mkdir, #pwd, #read_file, #readable?, #rename_file, #rm_f, #rm_rf, #setuid?, #stat, #upload_and_chmodx, #upload_file, #writable?, #write_file

Methods included from Common

#clear_screen, #cmd_exec, #cmd_exec_get_pid, #cmd_exec_with_result, #command_exists?, #create_process, #get_env, #get_envs, #initialize, #peer, #report_virtualization, #rhost, #rport

Instance Method Details

#installed_package_version(package) ⇒ Rex::Version

Determines the version of an installed package

Parameters:

  • package

    The package name to check for

Returns:

  • (Rex::Version)

    nil if OS is not supported or package is not installed

[View source]

15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/msf/core/post/linux/packages.rb', line 15

def installed_package_version(package)
  info = get_sysinfo

  if ['debian', 'ubuntu'].include?(info[:distro])
    package_version = cmd_exec("dpkg-query -f='${Version}' -W #{package}")
    # The "no package" error is language based, but "dpkg-query:" starting is not
    return nil if package_version.start_with?('dpkg-query:')

    package_version = package_version.gsub('+', '.')
    return Rex::Version.new(package_version)
  elsif ['redhat', 'fedora', 'centos'].include?(info[:distro])
    package_version = cmd_exec("rpm -q #{package}")
    return nil unless package_version.start_with?(package)

    # dnf-4.18.0-2.fc39.noarch
    # remove package name at the beginning
    package_version = package_version.split("#{package}-")[1]
    # remove arch at the end
    package_version = package_version.sub(/\.[^.]*$/, '')
    return Rex::Version.new(package_version)
  elsif ['solaris', 'oracle', 'freebsd'].include?(info[:distro])
    package_version = cmd_exec("pkg info #{package}")
    return nil unless package_version.include?('Version')

    package_version = package_version.match(/Version\s+:\s+(.+)/)[1]
    return Rex::Version.new(package_version)
  elsif ['gentoo'].include?(info[:distro])
    # https://wiki.gentoo.org/wiki/Equery
    if command_exists?('equery')
      package_version = cmd_exec("equery --quiet list #{package}")
    # https://wiki.gentoo.org/wiki/Q_applets
    elsif command_exists?('qlist')
      package_version = cmd_exec("qlist -Iv #{package}")
    else
      vprint_error("installed_package_version couldn't find qlist and equery on gentoo")
      return nil
    end
    return nil if package_version.strip.empty?

    package_version = package_version.split('/')[1]
    # make gcc-1.1 to 1.1
    package_version = package_version.sub(/.*?-/, '')
    return Rex::Version.new(package_version)
  elsif ['arch'].include?(info[:distro])
    package_version = cmd_exec("pacman -Qi #{package}")
    return nil unless package_version.include?('Version')

    package_version = package_version.match(/Version\s+:\s+(.+)/)[1]
    return Rex::Version.new(package_version)
  else
    vprint_error("installed_package_version is being called on an unsupported OS: #{info[:distro]}")
  end
  nil
end