84 lines
1.9 KiB
Ruby
84 lines
1.9 KiB
Ruby
# -*- coding: binary -*-
|
|
|
|
module Msf::Post::Unix
|
|
|
|
#
|
|
# Returns an array of hashes each representing a user
|
|
# Keys are name, uid, gid, info, dir and shell
|
|
#
|
|
def get_users
|
|
users = []
|
|
etc_passwd = nil
|
|
[
|
|
"/etc/passwd",
|
|
"/etc/security/passwd",
|
|
"/etc/master.passwd",
|
|
].each { |f|
|
|
if file_exist?(f)
|
|
etc_passwd = f
|
|
break
|
|
end
|
|
}
|
|
cmd_out = read_file(etc_passwd).split("\n")
|
|
cmd_out.each do |l|
|
|
entry = {}
|
|
user_field = l.split(":")
|
|
entry[:name] = user_field[0]
|
|
entry[:uid] = user_field[2]
|
|
entry[:gid] = user_field[3]
|
|
entry[:info] = user_field[4]
|
|
entry[:dir] = user_field[5]
|
|
entry[:shell] = user_field[6]
|
|
users << entry
|
|
end
|
|
return users
|
|
end
|
|
|
|
#
|
|
# Returns an array of hashes each hash representing a user group
|
|
# Keys are name, gid and users
|
|
#
|
|
def get_groups
|
|
groups = []
|
|
cmd_out = read_file("/etc/group").split("\n")
|
|
cmd_out.each do |l|
|
|
entry = {}
|
|
user_field = l.split(":")
|
|
entry[:name] = user_field[0]
|
|
entry[:gid] = user_field[2]
|
|
entry[:users] = user_field[3]
|
|
groups << entry
|
|
end
|
|
return groups
|
|
end
|
|
|
|
#
|
|
# Enumerates the user directories in /Users or /home
|
|
#
|
|
def enum_user_directories
|
|
user_dirs = []
|
|
|
|
# get all user directories from /etc/passwd
|
|
read_file("/etc/passwd").each_line do |passwd_line|
|
|
user_dirs << passwd_line.split(/:/)[5]
|
|
end
|
|
|
|
# also list other common places for home directories in the event that
|
|
# the users aren't in /etc/passwd (LDAP, for example)
|
|
case session.platform
|
|
when 'osx'
|
|
user_dirs << cmd_exec('ls /Users').each_line.map { |l| "/Users/#{l}" }
|
|
else
|
|
user_dirs << cmd_exec('ls /home').each_line.map { |l| "/home/#{l}" }
|
|
end
|
|
|
|
user_dirs.flatten!
|
|
user_dirs.compact!
|
|
user_dirs.sort!
|
|
user_dirs.uniq!
|
|
|
|
user_dirs
|
|
end
|
|
|
|
end
|