@@ -11,6 +11,17 @@ module NetAPI
11
11
SV_TYPE_DOMAIN_BAKCTRL = 10
12
12
SV_TYPE_DOMAIN_CTRL = 4
13
13
14
+ ERROR_ACCESS_DENIED = 5
15
+ ERROR_NOT_ENOUGH_MEMORY = 8
16
+ ERROR_INVALID_PARAMETER = 87
17
+ ERROR_INVALID_LEVEL = 124
18
+ ERROR_MORE_DATA = 234
19
+ ERROR_NO_BROWSER_SERVERS_FOUND = 6118
20
+
21
+ NERR_ClientNameNotFound = 2312
22
+ NERR_InvalidComputer = 2351
23
+ NERR_UserNotFound = 2221
24
+
14
25
def UnicodeByteStringToAscii ( str )
15
26
length = ( str . index "\0 \0 \0 " ) + 1
16
27
Rex ::Text . to_ascii ( str [ 0 ..length ] )
@@ -23,6 +34,8 @@ def netapi_buffer_free(ptr)
23
34
end
24
35
25
36
def net_server_enum ( server_type = SV_TYPE_ALL , domain = nil )
37
+ hosts = [ ]
38
+
26
39
result = client . railgun . netapi32 . NetServerEnum (
27
40
nil , # servername
28
41
100 , # level (100/101)
@@ -36,38 +49,22 @@ def net_server_enum(server_type=SV_TYPE_ALL, domain=nil)
36
49
)
37
50
38
51
case result [ 'return' ]
39
- when 5
40
- vprint_error ( "Access Denied when trying to enum hosts." )
41
- return nil
42
- when 6118
43
- vprint_error ( "No Browser servers found." )
44
- return nil
45
- when 50
46
- vprint_error ( "Request not supported." )
47
- return nil
48
- when 2184
49
- vprint_error ( "Service not installed." )
50
- return nil
51
52
when 0
52
- vprint_status ( "Success." )
53
- when 87
54
- vprint_error ( "Invalid parameter." )
53
+ hosts = read_server_structs ( result [ 'bufptr' ] , result [ 'totalentries' ] )
54
+ when ERROR_NO_BROWSER_SERVERS_FOUND
55
+ print_error ( "ERROR_NO_BROWSER_SERVERS_FOUND" )
56
+ return nil
57
+ when ERROR_MORE_DATA
58
+ vprint_error ( "ERROR_MORE_DATA" )
55
59
return nil
56
- else
57
- if result [ 'return' ] != 234
58
- vprint_status ( "Unaccounted for error code: #{ result [ 'return' ] } " )
59
- return nil
60
- end
61
60
end
62
61
63
- hosts = read_server_structs ( result [ 'bufptr' ] , result [ 'totalentries' ] )
64
-
65
62
netapi_buffer_free ( result [ 'bufptr' ] )
66
63
67
64
return hosts
68
65
end
69
66
70
- def read_server_structs ( start_ptr , count )
67
+ def read_server_structs ( start_ptr , count , domain , server_type )
71
68
base = 0
72
69
struct_size = 8
73
70
hosts = [ ]
@@ -85,21 +82,26 @@ def read_server_structs(start_ptr, count)
85
82
return hosts
86
83
end
87
84
88
- def getSessions ( hostname , username )
85
+ def net_session_enum ( hostname , username )
86
+ sessions = [ ]
87
+
89
88
result = client . railgun . netapi32 . NetSessionEnum (
90
- hostname ,
91
- nil ,
92
- username ,
93
- 10 ,
94
- 4 ,
95
- MAX_PREFERRED_LENGTH ,
96
- 4 ,
97
- 4 ,
98
- nil
89
+ hostname , # servername
90
+ nil , # UncClientName
91
+ username , # username
92
+ 10 , # level
93
+ 4 , # bufptr
94
+ MAX_PREFERRED_LENGTH , # prefmaxlen
95
+ 4 , # entriesread
96
+ 4 , # totalentries
97
+ nil # resume_handle
99
98
)
100
99
101
100
case result [ 'return' ]
102
- when 5
101
+ when 0
102
+ vprint_error ( "#{ hostname } Session identified" )
103
+ sessions = read_session_structs ( result [ 'bufptr' ] , result [ 'totalentries' ] , hostname )
104
+ when ERROR_ACCESS_DENIED
103
105
vprint_error ( "#{ hostname } Access denied..." )
104
106
return nil
105
107
when 53
@@ -108,19 +110,15 @@ def getSessions(hostname, username)
108
110
when 123
109
111
vprint_error ( "Invalid host: #{ hostname } " )
110
112
return nil
111
- when 0
112
- vprint_status ( "#{ hostname } Session identified" )
113
- when 2221 #username not found
113
+ when NERR_UserNotFound
114
114
return nil
115
+ when ERROR_MORE_DATA
116
+ vprint_error ( "#{ hostname } ERROR_MORE_DATA" )
115
117
else
116
- if result [ 'return' ] != 234
117
- vprint_error ( "Unaccounted for error code: #{ result [ 'return' ] } " )
118
- return nil
119
- end
118
+ vprint_error ( "Unaccounted for error code: #{ result [ 'return' ] } " )
119
+ return nil
120
120
end
121
121
122
- sessions = read_session_structs ( result [ 'bufptr' ] , result [ 'totalentries' ] , hostname )
123
-
124
122
netapi_buffer_free ( result [ 'bufptr' ] )
125
123
126
124
return sessions
0 commit comments