5 from optparse import OptionParser
6 from pprint import pprint
12 prompt = 'rpcclient$ '
14 def __init__(self, binding, domain, username, password):
16 self.binding = binding
18 self.username = username
19 self.password = password
23 # Default for empty line is to repeat last command - yuck
27 def onecmd(self, line):
29 # Override the onecmd() method so we can trap error returns
32 Cmd.onecmd(self, line)
33 except dcerpc.NTSTATUS, arg:
34 print 'The command returned an error: %s' % arg[1]
38 def do_help(self, line):
39 """Displays on-line help for rpcclient commands."""
40 Cmd.do_help(self, line)
42 def do_shell(self, line):
44 status = os.system(line)
46 if os.WIFEXITED(status):
47 if os.WEXITSTATUS(status) != 0:
48 print 'Command exited with code %d' % os.WEXITSTATUS(status)
50 print 'Command exited with signal %d' % os.WTERMSIG(status)
52 def do_EOF(self, line):
53 """Exits rpcclient."""
59 def do_SamrEnumDomains(self, line):
60 """Enumerate domain names."""
62 usage = 'usage: SamrEnumDomains'
68 pipe = dcerpc.pipe_connect(
70 dcerpc.DCERPC_SAMR_UUID, dcerpc.DCERPC_SAMR_VERSION,
71 self.domain, self.username, self.password)
73 connect_handle = samr.Connect(pipe)
75 for i in connect_handle.EnumDomains():
78 def do_SamrLookupDomain(self, line):
79 """Return the SID for a domain."""
81 usage = 'SamrLookupDomain DOMAIN'
83 parser = OptionParser(usage)
84 options, args = parser.parse_args(string.split(line))
90 pipe = dcerpc.pipe_connect(
92 dcerpc.DCERPC_SAMR_UUID, dcerpc.DCERPC_SAMR_VERSION,
93 self.domain, self.username, self.password)
95 connect_handle = samr.Connect(pipe)
97 print connect_handle.LookupDomain(args[0])
99 def do_SamrQueryDomInfo(self, line):
100 """Return information about a domain designated by its SID."""
102 usage = 'SamrQueryDomInfo DOMAIN_SID [info_level]'
104 parser = OptionParser(usage)
105 options, args = parser.parse_args(string.split(line))
107 if (len(args) == 0) or (len(args) > 2):
108 print 'usage:', usage
111 pipe = dcerpc.pipe_connect(
113 dcerpc.DCERPC_SAMR_UUID, dcerpc.DCERPC_SAMR_VERSION,
114 self.domain, self.username, self.password)
116 connect_handle = samr.Connect(pipe)
117 domain_handle = connect_handle.OpenDomain(args[0])
120 result = domain_handle.QueryDomainInfo(int(args[1]))
122 result = domain_handle.QueryDomainInfo()
124 pprint(result['info'])
126 def do_SamrQueryDomInfo2(self, line):
127 """Return information about a domain designated by its SID. (Windows 2000 and >)"""
129 usage = 'SamrQueryDomInfo2 DOMAIN_SID [info_level] (Windows 2000 and >)'
130 parser = OptionParser(usage)
131 options, args = parser.parse_args(string.split(line))
133 if (len(args) == 0) or (len(args) > 2):
134 print 'usage:', usage
137 pipe = dcerpc.pipe_connect(
139 dcerpc.DCERPC_SAMR_UUID, dcerpc.DCERPC_SAMR_VERSION,
140 self.domain, self.username, self.password)
142 connect_handle = samr.Connect(pipe)
143 domain_handle = connect_handle.OpenDomain(args[0])
146 result = domain_handle.QueryDomainInfo2(int(args[1]))
148 result = domain_handle.QueryDomainInfo2()
150 pprint(result['info'])
152 def do_SamrEnumDomainGroups(self, line):
153 """Return the list of groups of a domain designated by its SID."""
155 usage = 'SamrEnumDomainGroups DOMAIN_SID'
157 parser = OptionParser(usage)
158 options, args = parser.parse_args(string.split(line))
161 print 'usage:', usage
164 pipe = dcerpc.pipe_connect(
166 dcerpc.DCERPC_SAMR_UUID, dcerpc.DCERPC_SAMR_VERSION,
167 self.domain, self.username, self.password)
169 connect_handle = samr.Connect(pipe)
170 domain_handle = connect_handle.OpenDomain(args[0])
172 result = domain_handle.EnumDomainGroups()
174 for r in result['sam']['entries']:
175 print r['name']['name']
177 def do_SamrEnumDomainAliases(self, line):
178 """Return the list of aliases (local groups) of a domain designated by its SID."""
180 usage = 'SamrEnumDomainAliases DOMAIN_SID'
182 parser = OptionParser(usage)
183 options, args = parser.parse_args(string.split(line))
186 print 'usage:', usage
189 pipe = dcerpc.pipe_connect(
191 dcerpc.DCERPC_SAMR_UUID, dcerpc.DCERPC_SAMR_VERSION,
192 self.domain, self.username, self.password)
194 connect_handle = samr.Connect(pipe)
195 domain_handle = connect_handle.OpenDomain(args[0])
197 result = domain_handle.EnumDomainAliases()
199 for r in result['sam']['entries']:
200 print r['name']['name']
202 def do_SamrEnumDomainUsers(self, line):
203 """Return the list of users of a domain designated by its SID."""
205 usage = 'SamrEnumDomainUsers DOMAIN_SID [user_account_flags]'
207 parser = OptionParser(usage)
208 options, args = parser.parse_args(string.split(line))
210 if (len(args) == 0) or (len(args) > 2):
211 print 'usage:', usage
214 pipe = dcerpc.pipe_connect(
216 dcerpc.DCERPC_SAMR_UUID, dcerpc.DCERPC_SAMR_VERSION,
217 self.domain, self.username, self.password)
219 connect_handle = samr.Connect(pipe)
220 domain_handle = connect_handle.OpenDomain(args[0])
223 result = domain_handle.EnumDomainUsers(int(args[1]))
225 result = domain_handle.EnumDomainUsers()
227 for r in result['sam']['entries']:
228 print r['name']['name']
230 if __name__ == '__main__':
234 usage = 'rpcclient BINDING [options]'
236 if len(sys.argv) == 1:
240 binding = sys.argv[1]
243 if string.find(binding, ':') == -1:
244 binding = 'ncacn_np:' + binding
246 parser = OptionParser(usage)
248 parser.add_option('-U', '--username', action='store', type='string',
249 help='Use given credentials when connecting',
250 metavar='DOMAIN\\username%password',
253 parser.add_option('-c', '--command', action='store', type='string',
254 help='Execute COMMAND', dest='command')
256 options, args = parser.parse_args()
258 # Break --username up into domain, usernamd and password
260 if not options.username:
261 options.username = '%'
264 if string.find(options.username, '\\') != -1:
265 domain, options.username = string.split(options.username, '\\')
268 if string.find(options.username, '%') != -1:
269 options.username, password = string.split(options.username, '%')
271 username = options.username
275 c = rpcclient(binding, domain, username, password)
278 c.onecmd(options.command)
284 except KeyboardInterrupt:
285 print 'KeyboardInterrupt'