Obtenha o SID pelo objectSid usando ldapsearch

2

Eu tenho o atributo objectSid como retornado pelo comando ldapsearch, como posso gerar SID a partir dele em formato legível por humanos?

comando ldapsearch:

ldapsearch -LLL -H ldap://dc.example.com:389 -b dc=example,dc=lk -D example\administrator -w adminPassword "(sAMAccountName=bob)" | grep -i "objectSid::" | cut -d ":" -f3 | xargs

Este comando retorna objectSid do usuário do AD "bob". Vamos dizer que retornou objectSid como:

AQUAAAAAAAUVAAAAPWW1S5rojK4mDAiG5BAAAA ==

Eu quero gerar seu SID no seguinte formato:

S-1-5-21-1270179133-2928470170-2248674342-4324

É possível fazer isso no Linux?

Referência: Obtenha um objeto pelo seu objectGUID usando ldapsearch

    
por YasithaB 23.05.2017 / 20:40

2 respostas

4

Por fim, consegui construir o SID a partir do ObjectSid. Aqui está o script de shell completo, se alguém estiver interessado.

#!/bin/bash

# Base-64 encoded objectSid
OBJECT_ID="AQUAAAAAAAUVAAAAPWW1S5rojK4mDAiG5BAAAA=="

# Decode it, hex-dump it and store it in an array
G=($(echo -n $OBJECT_ID | base64 -d -i | hexdump -v -e '1/1 " %02X"'))

# SID in HEX
# SID_HEX=${G[0]}-${G[1]}-${G[2]}${G[3]}${G[4]}${G[5]}${G[6]}${G[7]}-${G[8]}${G[9]}${G[10]}${G[11]}-${G[12]}${G[13]}${G[14]}${G[15]}-${G[16]}${G[17]}${G[18]}${G[19]}-${G[20]}${G[21]}${G[22]}${G[23]}-${G[24]}${G[25]}${G[26]}${G[27]}${G[28]}

# SID Structure: https://technet.microsoft.com/en-us/library/cc962011.aspx
# LESA = Little Endian Sub Authority
# BESA = Big Endian Sub Authority
# LERID = Little Endian Relative ID
# BERID = Big Endian Relative ID

BESA2=${G[8]}${G[9]}${G[10]}${G[11]}
BESA3=${G[12]}${G[13]}${G[14]}${G[15]}
BESA4=${G[16]}${G[17]}${G[18]}${G[19]}
BESA5=${G[20]}${G[21]}${G[22]}${G[23]}
BERID=${G[24]}${G[25]}${G[26]}${G[27]}${G[28]}

LESA1=${G[2]}${G[3]}${G[4]}${G[5]}${G[6]}${G[7]}
LESA2=${BESA2:6:2}${BESA2:4:2}${BESA2:2:2}${BESA2:0:2}
LESA3=${BESA3:6:2}${BESA3:4:2}${BESA3:2:2}${BESA3:0:2}
LESA4=${BESA4:6:2}${BESA4:4:2}${BESA4:2:2}${BESA4:0:2}
LESA5=${BESA5:6:2}${BESA5:4:2}${BESA5:2:2}${BESA5:0:2}
LERID=${BERID:6:2}${BERID:4:2}${BERID:2:2}${BERID:0:2}

LE_SID_HEX=${LESA1}-${LESA2}-${LESA3}-${LESA4}-${LESA5}-${LERID}

# Initial SID value which is used to construct actual SID
SID="S-1"

# Convert LE_SID_HEX to decimal values and append it to SID as a string
IFS='-' read -ra ADDR <<< "${LE_SID_HEX}"
for OBJECT in "${ADDR[@]}"; do
  SID=${SID}-$((16#${OBJECT}))
done

echo ${SID}
    
por 26.05.2017 / 05:47
1

Primeiro, você pode restringir o conjunto de respostas que uma consulta ldapsearch retorna incluindo os atributos desejados após o filtro, que deve ser um pouco mais rápido quando você deseja mais de um resultado.

 ldapsearch -LLL -H ldap://dc.example.com:389 -b dc=example,dc=lk -D example\administrator -w adminPassword "(sAMAccountName=bob)" ObjectSID

Segundo, quando um atributo é separado de seu valor por dois-pontos duplos :: , isso é uma indicação de que o valor é codificado em base64 . ldapsearch não está ciente do esquema, ele não sabe se uma codificação base64 atribuída é uma cadeia de texto unicode que pode ser exibida como texto em um terminal com capacidade de unicode ou, por exemplo, jpegPhoto ou qualquer outro dado que não possa ser exibido facilmente em um terminal e não decodificará tais valores para você.

echo   AQUAAAAAAAUVAAAAPWW1S5rojK4mDAiG5BAAAA== | base64 --decode

deve fazer o truque. AFAIK base64 deve estar no pacote coreutils.

O problema é que o objectSid após a decodificação base64 é ainda um valor binário que precisa ser convertido para antes de ser exibido no formato de identificador de segurança convencional de S-1-5-21-1270179133-2928470170-2248674342-4324 .

Você precisará escrever uma rotina de conversão em sua linguagem de programação / script escolhida, como por exemplo, outras já fizeram, por exemplo, em perl ou php .

    
por 23.05.2017 / 21:25

Tags