| 1 | #!/usr/bin/env python
|
|---|
| 2 |
|
|---|
| 3 | # script to enumerate LSA privileges on a server
|
|---|
| 4 |
|
|---|
| 5 | import sys
|
|---|
| 6 | from optparse import OptionParser
|
|---|
| 7 |
|
|---|
| 8 | sys.path.insert(0, "bin/python")
|
|---|
| 9 |
|
|---|
| 10 | import samba
|
|---|
| 11 | import samba.getopt as options
|
|---|
| 12 | from samba.dcerpc import lsa, security
|
|---|
| 13 |
|
|---|
| 14 | def get_display_name(lsaconn, pol_handle, name):
|
|---|
| 15 | '''get the display name for a privilege'''
|
|---|
| 16 | string = lsa.String()
|
|---|
| 17 | string.string = name
|
|---|
| 18 |
|
|---|
| 19 | (disp_names, ret_lang) = lsaconn.LookupPrivDisplayName(pol_handle, string, 0x409, 0)
|
|---|
| 20 | return disp_names.string
|
|---|
| 21 |
|
|---|
| 22 |
|
|---|
| 23 |
|
|---|
| 24 |
|
|---|
| 25 | ########### main code ###########
|
|---|
| 26 | if __name__ == "__main__":
|
|---|
| 27 | parser = OptionParser("enumprivs [options] server")
|
|---|
| 28 | sambaopts = options.SambaOptions(parser)
|
|---|
| 29 | credopts = options.CredentialsOptionsDouble(parser)
|
|---|
| 30 | parser.add_option_group(credopts)
|
|---|
| 31 |
|
|---|
| 32 | (opts, args) = parser.parse_args()
|
|---|
| 33 |
|
|---|
| 34 | lp = sambaopts.get_loadparm()
|
|---|
| 35 | creds = credopts.get_credentials(lp)
|
|---|
| 36 |
|
|---|
| 37 | if len(args) != 1:
|
|---|
| 38 | parser.error("You must supply a server")
|
|---|
| 39 |
|
|---|
| 40 | if not creds.authentication_requested():
|
|---|
| 41 | parser.error("You must supply credentials")
|
|---|
| 42 |
|
|---|
| 43 | server = args[0]
|
|---|
| 44 |
|
|---|
| 45 | binding_str = "ncacn_np:%s[print]" % server
|
|---|
| 46 |
|
|---|
| 47 | lsaconn = lsa.lsarpc(binding_str, lp, creds)
|
|---|
| 48 |
|
|---|
| 49 | objectAttr = lsa.ObjectAttribute()
|
|---|
| 50 | objectAttr.sec_qos = lsa.QosInfo()
|
|---|
| 51 |
|
|---|
| 52 | pol_handle = lsaconn.OpenPolicy2(''.decode('utf-8'),
|
|---|
| 53 | objectAttr, security.SEC_FLAG_MAXIMUM_ALLOWED)
|
|---|
| 54 |
|
|---|
| 55 | (handle, privs) = lsaconn.EnumPrivs(pol_handle, 0, 100)
|
|---|
| 56 | for p in privs.privs:
|
|---|
| 57 | disp_name = get_display_name(lsaconn, pol_handle, p.name.string)
|
|---|
| 58 | print "0x%08x %31s \"%s\"" % (p.luid.low, p.name.string, disp_name)
|
|---|