terça-feira, 14 de setembro de 2010

Como Localizar e Obter Informações sobre o Administrador do Domínio

Alguns administradores de rede, tem como prática renomear o usuário Administrador do domínio com o intuito de aumentar a segurança contra ataques. Porém é uma falsa impressão de segurança já que é possível localizar o Administrador do domínio mesmo que ele tenha sido renomeado ou movido entre as OUs do domínio. Como isto é possível? veremos a seguir.

Quando um objeto é criado no Active Directory é atribuído a este objeto um identificador único chamado de SID (Security Identifier), mesmo renomeado ou movendo o objeto o SID é preservado. Como o usuário Administrador do domínio é o primeiro usuário a ser criado no momento em que o servidor é promovido a Domain Controller, ele sempre irá ter o SID terminando em 500. Há um artigo da Microsoft descrito abaixo com maiores detalhes sobre a atribuição do SID.

Customizamos um script VBScript capaz de consultar os SIDs dos usuários do domínio e identificar o usuário que possui o SID terminando com 500 (o Administrador do domínio), retornando informações como seu nome, logon, caminho LDAP e se a conta está habilitada ou não. Como estamos trabalhando apenas com consulta LDAP não é necessário ser membro de um grupo com permissões de segurança especificas para obter o retorno, basta ter uma conta com o acesso mais simples no domínio (Domain Users).

Well-known security identifiers in Windows operating systems

Salve o script abaixo como AD_GetAdmin.vbs e execute.

'******************************************************
'* Autor: Maikon Demacq
'* Versão: 1.0
'* Última Modificação: 14/09/2010
'*
'* Este script contempla:
'* Localiza o Administrador do Dominio e retorna
'* informações da conta
'*
'* Sintaxe:
'* Cscript AD_GetAdmin.vbs Parâmetros
'******************************************************
On Error Resume Next

Main

Sub Main
Const ADS_UF_ACCOUNTDISABLE = 2
Set objRootDSE = GetObject("LDAP://RootDSE")
strDNSDomain = objRootDSE.Get("defaultNamingContext")
Set adoCommand = CreateObject("ADODB.Command")
Set adoConnection = CreateObject("ADODB.Connection")
adoConnection.Provider = "ADsDSOObject"
adoConnection.Open "Active Directory Provider"
adoCommand.ActiveConnection = adoConnection
strBase = "<LDAP://" & strDNSDomain & ">"
strFilter = "(objectCategory=user)"
strAttributes = "distinguishedName,cn,sAMAccountName,userAccountControl,objectSID"
strQuery = strBase & ";" & strFilter & ";" & strAttributes & ";subtree"
adoCommand.CommandText = strQuery
adoCommand.Properties("Page Size") = 100
adoCommand.Properties("Timeout") = 30
adoCommand.Properties("Cache Results") = False
Set adoRecordset = adoCommand.Execute
Do Until adoRecordset.EOF
  strHexSid = OctetToHexStr(adoRecordset.Fields("objectSid").Value)
  strDecSid = HexStrToDecStr(strHexSid)
  If Right(strDecSid,4) = "-500" Then
    strUAC = adoRecordset.Fields("userAccountControl").Value
    If strUAC AND ADS_UF_ACCOUNTDISABLE Then
      strACC = "Disable"
    Else
      strACC = "Enable"
    End If
    strCN = adoRecordset.Fields("cn").Value
    strSAM = adoRecordset.Fields("sAMAccountName").Value
    strDN = adoRecordset.Fields("distinguishedName").value
    Wscript.Echo "User Account: " & strCN & vbcrlf & "Logon Account: " & strSAM & vbcrlf & "Account Status: " & strACC & vbcrlf & "DN: " & strDN & vbcrlf & "SID: " & strDecSid
    strFlag = 1
  End If
  If strFlag = 1 Then
    Wscript.Quit(0)
  End If
  adoRecordset.MoveNext
Loop
adoRecordset.Close
adoConnection.Close
End Sub

Function OctetToHexStr(arrbytOctet)
  Dim k
  OctetToHexStr = ""
  For k = 1 To Lenb(arrbytOctet)
    OctetToHexStr = OctetToHexStr & Right("0" & Hex(Ascb(Midb(arrbytOctet, k, 1))), 2)
  Next
End Function

Function HexStrToDecStr(strSid)
  Dim arrbytSid, lngTemp, j
  ReDim arrbytSid(Len(strSid)/2 - 1)
  For j = 0 To UBound(arrbytSid)
    arrbytSid(j) = CInt("&H" & Mid(strSid, 2*j + 1, 2))
  Next
  HexStrToDecStr = "S-" & arrbytSid(0) & "-" & arrbytSid(1) & "-" & arrbytSid(8)
  lngTemp = arrbytSid(15)
  lngTemp = lngTemp * 256 + arrbytSid(14)
  lngTemp = lngTemp * 256 + arrbytSid(13)
  lngTemp = lngTemp * 256 + arrbytSid(12)
  HexStrToDecStr = HexStrToDecStr & "-" & CStr(lngTemp)
  lngTemp = arrbytSid(19)
  lngTemp = lngTemp * 256 + arrbytSid(18)
  lngTemp = lngTemp * 256 + arrbytSid(17)
  lngTemp = lngTemp * 256 + arrbytSid(16)
  HexStrToDecStr = HexStrToDecStr & "-" & CStr(lngTemp)
  lngTemp = arrbytSid(23)
  lngTemp = lngTemp * 256 + arrbytSid(22)
  lngTemp = lngTemp * 256 + arrbytSid(21)
  lngTemp = lngTemp * 256 + arrbytSid(20)
  HexStrToDecStr = HexStrToDecStr & "-" & CStr(lngTemp)
  lngTemp = arrbytSid(25)
  lngTemp = lngTemp * 256 + arrbytSid(24)
  HexStrToDecStr = HexStrToDecStr & "-" & CStr(lngTemp)
End Function

Nenhum comentário:

Postar um comentário