@@ -14,76 +14,111 @@ def initialize
1414 @debug_on = @config . get ( 'beef.debug' )
1515 end
1616
17- # this expects parsed JSON as input
18- def load ( data )
19- name = data [ 'name' ]
20- author = data [ 'author' ]
17+ # Load an ARE rule set
18+ # @param [Hash] ARE ruleset as JSON
19+ # @return [Hash] {"success": Boolean, "rule_id": Integer, "error": String}
20+ def load_rule_json ( data )
21+ name = data [ 'name' ] || ''
22+ author = data [ 'author' ] || ''
2123 browser = data [ 'browser' ] || 'ALL'
2224 browser_version = data [ 'browser_version' ] || 'ALL'
2325 os = data [ 'os' ] || 'ALL'
2426 os_version = data [ 'os_version' ] || 'ALL'
2527 modules = data [ 'modules' ]
26- exec_order = data [ 'execution_order' ]
27- exec_delay = data [ 'execution_delay' ]
28- chain_mode = data [ 'chain_mode' ]
28+ execution_order = data [ 'execution_order' ]
29+ execution_delay = data [ 'execution_delay' ]
30+ chain_mode = data [ 'chain_mode' ] || 'sequential'
2931
30- parser_result = BeEF ::Core ::AutorunEngine ::Parser . instance . parse (
31- name , author , browser , browser_version , os , os_version , modules , exec_order , exec_delay , chain_mode
32+ begin
33+ BeEF ::Core ::AutorunEngine ::Parser . instance . parse (
34+ name ,
35+ author ,
36+ browser ,
37+ browser_version ,
38+ os ,
39+ os_version ,
40+ modules ,
41+ execution_order ,
42+ execution_delay ,
43+ chain_mode
44+ )
45+ rescue => e
46+ print_error ( "[ARE] Error loading ruleset (#{ name } ): #{ e . message } " )
47+ return { 'success' => false , 'error' => e . message }
48+ end
49+
50+ existing_rule = BeEF ::Core ::Models ::Rule . where (
51+ name : name ,
52+ author : author ,
53+ browser : browser ,
54+ browser_version : browser_version ,
55+ os : os ,
56+ os_version : os_version ,
57+ modules : modules . to_json ,
58+ execution_order : execution_order . to_s ,
59+ execution_delay : execution_delay . to_s ,
60+ chain_mode : chain_mode
61+ ) . first
62+
63+ unless existing_rule . nil?
64+ msg = "Duplicate rule already exists in the database (ID: #{ existing_rule . id } )"
65+ print_info ( "[ARE] Skipping ruleset (#{ name } ): #{ msg } " )
66+ return { 'success' => false , 'error' => msg }
67+ end
68+
69+ are_rule = BeEF ::Core ::Models ::Rule . new (
70+ name : name ,
71+ author : author ,
72+ browser : browser ,
73+ browser_version : browser_version ,
74+ os : os ,
75+ os_version : os_version ,
76+ modules : modules . to_json ,
77+ execution_order : execution_order . to_s ,
78+ execution_delay : execution_delay . to_s ,
79+ chain_mode : chain_mode
3280 )
81+ are_rule . save
82+
83+ print_info ( "[ARE] Ruleset (#{ name } ) parsed and stored successfully." )
3384
34- if parser_result . length == 1 && parser_result . first
35- print_info "[ARE] Ruleset (#{ name } ) parsed and stored successfully."
36- if @debug_on
37- print_more "Target Browser: #{ browser } (#{ browser_version } )"
38- print_more "Target OS: #{ os } (#{ os_version } )"
39- print_more 'Modules to Trigger:'
40- modules . each do |mod |
41- print_more "(*) Name: #{ mod [ 'name' ] } "
42- print_more "(*) Condition: #{ mod [ 'condition' ] } "
43- print_more "(*) Code: #{ mod [ 'code' ] } "
44- print_more '(*) Options:'
45- mod [ 'options' ] . each do |key , value |
46- print_more "\t #{ key } : (#{ value } )"
47- end
85+ if @debug_on
86+ print_more "Target Browser: #{ browser } (#{ browser_version } )"
87+ print_more "Target OS: #{ os } (#{ os_version } )"
88+ print_more 'Modules to run:'
89+ modules . each do |mod |
90+ print_more "(*) Name: #{ mod [ 'name' ] } "
91+ print_more "(*) Condition: #{ mod [ 'condition' ] } "
92+ print_more "(*) Code: #{ mod [ 'code' ] } "
93+ print_more '(*) Options:'
94+ mod [ 'options' ] . each do |key , value |
95+ print_more "\t #{ key } : (#{ value } )"
4896 end
49- print_more "Exec order: #{ exec_order } "
50- print_more "Exec delay: #{ exec_delay } "
5197 end
52- are_rule = BeEF ::Core ::Models ::Rule . new (
53- name : name ,
54- author : author ,
55- browser : browser ,
56- browser_version : browser_version ,
57- os : os ,
58- os_version : os_version ,
59- modules : modules . to_json ,
60- execution_order : exec_order ,
61- execution_delay : exec_delay ,
62- chain_mode : chain_mode
63- )
64- are_rule . save
65- { 'success' => true , 'rule_id' => are_rule . id }
66- else
67- print_error "[ARE] Ruleset (#{ name } ): ERROR. " + parser_result . last
68- { 'success' => false , 'error' => parser_result . last }
98+ print_more "Exec order: #{ execution_order } "
99+ print_more "Exec delay: #{ exec_delay } "
69100 end
70- rescue StandardError => e
71- err = 'Malformed JSON ruleset.'
72- print_error "[ARE] Ruleset (#{ name } ): ERROR. #{ e } #{ e . backtrace } "
73- { 'success' => false , 'error' => err }
101+
102+ { 'success' => true , 'rule_id' => are_rule . id }
103+ rescue TypeError , ArgumentError => e
104+ print_error ( "[ARE] Failed to load ruleset (#{ name } ): #{ e . message } " )
105+ { 'success' => false , 'error' => e . message }
74106 end
75107
76- def load_file ( json_rule_path )
108+ # Load an ARE ruleset from file
109+ # @param [String] JSON ARE ruleset file path
110+ def load_rule_file ( json_rule_path )
77111 rule_file = File . open ( json_rule_path , 'r:UTF-8' , &:read )
78- self . load JSON . parse ( rule_file )
79- rescue StandardError => e
80- print_error "[ARE] Failed to load ruleset from #{ json_rule_path } : #{ e . message } "
112+ self . load_rule_json ( JSON . parse ( rule_file ) )
113+ rescue => e
114+ print_error ( "[ARE] Failed to load ruleset from #{ json_rule_path } : #{ e . message } " )
81115 end
82116
117+ # Load all JSON ARE rule files from arerules/enabled/ directory
83118 def load_directory
84- Dir . glob ( "#{ $root_dir} /arerules/enabled/**/*.json" ) do |rule |
85- print_debug "[ARE] Processing rule : #{ rule } "
86- load_file rule
119+ Dir . glob ( "#{ $root_dir} /arerules/enabled/**/*.json" ) do |rule_file |
120+ print_debug ( "[ARE] Processing ruleset file : #{ rule_file } " )
121+ load_rule_file ( rule_file )
87122 end
88123 end
89124 end
0 commit comments