@@ -16,38 +16,58 @@ def report_response(response, rhost, proto, desired_headers = %w(User-Agent Serv
16
16
return false
17
17
end
18
18
19
- # We know it is SIP, so report
20
- report_service (
21
- host : rhost ,
22
- port : rport ,
23
- proto : proto . downcase ,
24
- name : 'sip'
25
- )
26
-
27
- # Do header extraction as necessary
19
+ # Extracted headers, stored as a hash where the key is the header name
20
+ # and the value is a list of all values seen for the header, covering the
21
+ # case where the same header value is seen multiple times
28
22
extracted_headers = { }
29
23
unless desired_headers . nil? || desired_headers . empty?
30
24
desired_headers . each do |desired_header |
31
25
next unless ( found_header = options_response . header ( desired_header ) )
32
26
extracted_headers [ desired_header ] ||= [ ]
33
- extracted_headers [ desired_header ] |= found_header
27
+ extracted_headers [ desired_header ] |= found_header
34
28
end
29
+ end
35
30
36
- # report on any extracted headers
37
- extracted_headers . each do |k , v |
38
- report_note (
39
- host : rhost ,
40
- port : rport ,
41
- proto : proto . downcase ,
42
- type : "sip_header.#{ k . gsub ( /-/ , '_' ) . downcase } " ,
43
- data : v . join ( ',' )
44
- )
45
- end
31
+ # Create a SIP OPTIONS fingerprint hash
32
+ fprint = {
33
+ 'code' => options_response . code ,
34
+ 'message' => options_response . message
35
+ }
36
+
37
+ # compact the header values, append the header information to the
38
+ # fingerprint hash
39
+ extracted_headers . each_pair do |k , v |
40
+ value = v . join ( ',' )
41
+ extracted_headers [ k ] = value
42
+ fprint [ 'header_' + k . gsub ( '-' , '_' ) . downcase ] = value
43
+ end
44
+
45
+ # Create a summary of the response
46
+ status = options_response . status_line . dup
47
+ unless extracted_headers . keys . empty?
48
+ status << ": #{ extracted_headers } "
46
49
end
47
50
48
- status = "#{ endpoint } #{ options_response . status_line } "
49
- status += ": #{ extracted_headers } " unless extracted_headers . empty?
50
- print_status ( status )
51
+ # Report the service with the status information
52
+ report_service (
53
+ host : rhost ,
54
+ port : rport ,
55
+ proto : proto . downcase ,
56
+ name : 'sip' ,
57
+ info : status
58
+ )
59
+
60
+ # Report the fingerprint information
61
+ report_note (
62
+ host : rhost ,
63
+ port : rport ,
64
+ proto : proto . downcase ,
65
+ type : "sip.options.fingerprint" ,
66
+ data : fprint
67
+ )
68
+
69
+ # Display the actual result to the user
70
+ print_status ( endpoint + " " + status )
51
71
true
52
72
end
53
73
0 commit comments