Files
metasploit-gs/lib/msf/core/post/linux/priv.rb
T
2024-12-05 15:40:57 -05:00

199 lines
6.0 KiB
Ruby

# -*- coding: binary -*-
module Msf
class Post
module Linux
module Priv
include ::Msf::Post::Common
include ::Msf::Post::File
#
# Returns true if running as root, false if not.
#
# @return [Boolean]
# @raise [RuntimeError] If execution fails.
#
def is_root?
if command_exists?('id')
user_id = cmd_exec('id -u')
clean_user_id = user_id.to_s.gsub(/[^\d]/, '')
if clean_user_id.empty?
raise "Could not determine UID: #{user_id.inspect}"
end
return (clean_user_id == '0')
end
user = whoami
data = cmd_exec('while read line; do echo $line; done </etc/passwd')
data.each_line do |line|
line = line.split(':')
return true if line[0] == user && line[3].to_i == 0
end
false
end
#
# Multiple functions to simulate native commands added
#
#
# Creates an empty file at the specified path using the touch command
#
# @param new_path_file [String] the path to the new file to be created
# @return [String] the output of the command
#
def touch_cmd(new_path_file)
cmd_exec("> #{new_path_file}")
end
#
# Copies the content of one file to another using a command execution
#
# @param origin_file [String] the path to the source file
# @param final_file [String] the path to the destination file
# @return [String] the output of the command
#
def cp_cmd(origin_file, final_file)
file_origin = read_file(origin_file)
cmd_exec("echo '#{file_origin}' > '#{final_file}'")
end
#
# Retrieves the binary name of a process given its PID
#
# @param pid [Integer] the process ID
# @return [String] the binary name of the process
#
def binary_of_pid(pid)
binary = read_file("/proc/#{pid}/cmdline")
if binary == '' # binary.empty?
binary = read_file("/proc/#{pid}/comm")
end
if binary[-1] == "\n"
binary = binary.split("\n")[0]
end
return binary
end
#
# Generates a sequence of numbers from `first` to `last` with a given `increment`
#
# @param first [Integer] the starting number of the sequence
# @param increment [Integer] the step increment between each number in the sequence
# @param last [Integer] the ending number of the sequence
# @return [Array<Integer>] an array containing the sequence of numbers
#
def seq(first, increment, last)
result = []
(first..last).step(increment) do |i|
result.insert(-1, i)
end
return result
end
#
# Returns the number of lines, words, and characters in a file
#
# @param file [String] the path to the file
# @return [Array<Integer, Integer, Integer, String>] an array containing the number of lines, words, characters, and the file name
#
def wc_cmd(file)
[nlines_file(file), nwords_file(file), nchars_file(file), file]
end
#
# Returns the number of characters in a file
#
# @param file [String] the path to the file
# @return [Integer] the number of characters in the file
#
def nchars_file(file)
nchars = 0
lines = read_file(file).split("\n")
nchars = lines.length
lines.each do |line|
line.gsub(/ /, ' ' => '')
nchars_line = line.length
nchars += nchars_line
end
nchars
end
#
# Returns the number of words in a file
#
# @param file [String] the path to the file
# @return [Integer] the number of words in the file
#
def nwords_file(file)
nwords = 0
lines = read_file(file).split("\n")
lines.each do |line|
words = line.split(' ')
nwords_line = words.length
nwords += nwords_line
end
return nwords
end
#
# Returns the number of lines in a file
#
# @param file [String] the path to the file
# @return [Integer] the number of lines in the file
#
def nlines_file(file)
lines = read_file(file).split("\n")
nlines = lines.length
return nlines
end
#
# Returns the first `n` lines of a file
#
# @param file [String] the path to the file
# @param nlines [Integer] the number of lines to return
# @return [Array<String>] an array containing the first `n` lines of the file
#
def head_cmd(file, nlines)
lines = read_file(file).split("\n")
result = lines[0..nlines - 1]
return result
end
#
# Returns the last `n` lines of a file
#
# @param file [String] the path to the file
# @param nlines [Integer] the number of lines to return
# @return [Array<String>] an array containing the last `n` lines of the file
#
def tail_cmd(file, nlines)
lines = read_file(file).split("\n")
result = lines[-1 * nlines..]
return result
end
#
# Searches for a specific string in a file and returns the lines that contain the string
#
# @param file [String] the path to the file
# @param string [String] the string to search for
# @return [Array<String>] an array containing the lines that include the specified string
#
def grep_cmd(file, string)
result = []
lines = read_file(file).split("\n")
lines.each do |line|
if line.include?(string)
result.insert(-1, line)
end
end
return result
end
end
end
end
end