@@ -25,12 +25,11 @@ def initialize
25
25
] ,
26
26
'License' => MSF_LICENSE
27
27
)
28
-
29
- register_options ( [ ] , self . class )
30
28
end
31
29
32
30
def run_host ( ip )
33
- vprint_status "#{ ip } :#{ rport } - SunRPC - Enumerating programs"
31
+ peer = "#{ ip } :#{ rport } "
32
+ vprint_status "#{ peer } - SunRPC - Enumerating programs"
34
33
35
34
begin
36
35
program = 100000
@@ -44,34 +43,45 @@ def run_host(ip)
44
43
progs = resp [ 3 , 1 ] . unpack ( 'C' ) [ 0 ]
45
44
maps = [ ]
46
45
if ( progs == 0x01 )
47
- print_good ( "#{ ip } :#{ rport } - Programs available" )
48
46
while XDR . decode_int! ( resp ) == 1 do
49
47
map = XDR . decode! ( resp , Integer , Integer , Integer , Integer )
50
48
maps << map
51
49
end
52
50
end
53
51
sunrpc_destroy
52
+ return if maps . empty?
53
+ print_good ( "#{ peer } - Found #{ maps . size } programs available" )
54
+
55
+ table = Rex ::Ui ::Text ::Table . new (
56
+ 'Header' => "SunRPC Programs for #{ ip } ." ,
57
+ 'Indent' => 1 ,
58
+ 'Columns' => %w( Name Number Version Port Protocol )
59
+ )
54
60
55
- lines = [ ]
56
61
maps . each do |map |
57
- prog , vers , prot , port = map [ 0 , 4 ]
58
- prot = if prot == 0x06 ; "tcp"
59
- elsif prot == 0x11 ; "udp"
60
- end
61
- lines << "\t #{ progresolv ( prog ) } - #{ port } /#{ prot } "
62
+ prog , vers , prot_num , port = map [ 0 , 4 ]
63
+ thing = "RPC Program ##{ prog } v#{ vers } on port #{ port } w/ protocol #{ prot_num } "
64
+ if prot_num == 0x06
65
+ proto = 'tcp'
66
+ elsif prot_num == 0x11
67
+ proto = 'udp'
68
+ else
69
+ print_error ( "#{ peer } : unknown protocol number for #{ thing } " )
70
+ next
71
+ end
62
72
73
+ resolved = progresolv ( prog )
74
+ table << [ resolved , prog , vers , port , proto ]
63
75
report_service (
64
76
:host => ip ,
65
77
:port => port ,
66
- :proto => prot ,
67
- :name => progresolv ( prog ) ,
78
+ :proto => proto ,
79
+ :name => resolved ,
68
80
:info => "Prog: #{ prog } Version: #{ vers } - via portmapper"
69
81
)
70
82
end
71
83
72
- # So we don't print a line for every program version
73
- lines . uniq . each { |line | print_line ( line ) }
74
-
84
+ print_good ( table . to_s )
75
85
rescue ::Rex ::Proto ::SunRPC ::RPCTimeout
76
86
end
77
87
end
0 commit comments