parsing '/ etc / passwd' para localizar o usuário root e se o usuário pode executar o shell interativo

0

Eu quero analisar o arquivo /etc/passwd para descobrir se o usuário tem privilégios de root e pode executar o shell interativo.

de acordo com

UID 100-999 are reserved by system for administrative and system accounts/groups

o que eu entendi é que se o UID estiver entre 100 e 999, o usuário tem privilégios de root. Estou certo?

em seguida é How do you say usuário pode executar o shell interativo lendo /etc/passwd ?

PS. Eu estou analisando esses arquivos em python, eu posso implementar a lógica, eu simplesmente não sei como descobrir o usuário root e o que é o shell interativo e como encontrar um.

    
por Kishor Pawar 01.02.2016 / 05:16

2 respostas

2

Existem dois tipos de contas, sistema e usuário regular. As contas do sistema pertencem a serviços e daemons, como lightdm , dnsmasq , etc. Normalmente, você não pode fazer login nessas contas (embora haja maneiras).

Usuários comuns, como sua conta ou outras contas de pessoas, podem fazer login e interagir com o sistema operacional por meio do shell (pode ser bash , ksh , mksh , csh ou shell gráfico como Gnome ou Unity ).

As contas do sistema variam de 100 a 999 por padrão. Existe um caso especial, nobody , que possui ID de 65534 (esse é o número máximo de UID). No meu sistema, por exemplo dnsmasq , ele executa dnsmasq service.

As contas de usuário regulares têm intervalo de UID de 1.000 a 65533. Esses usuários podem efetuar login, a menos que sua senha esteja desativada ou sua entrada em /etc/passwd tenha o shell configurado como /usr/sbin/nologin ou seja impedida de alguma outra forma. Esses usuários podem ter privilégios de root se pertencerem a sudo group.

Portanto, se você quiser encontrar usuários com sudo privilege, será necessário analisar /etc/group file. Aqui está o meu:

$ awk '/sudo/' /etc/group                                      
sudo:x:27:xieerqi,testuser

Para obter apenas os usuários, use : como separador e imprima o quarto campo.

$ awk -F':' '/sudo/{print $4}' /etc/group                      
xieerqi,testuser

Em python isso é feito assim:

>>> with open("/etc/group") as file:
...    for lines in file:
...       if lines.__contains__("sudo"):
...          print lines.split(":")[3]

Aqui está uma abordagem ainda mais interessante. Que tal se quisermos pegar todos os sudo usuários e ver se eles têm um shell configurado em /etc/passwd ?

$ awk -F':' '/sudo/{gsub(/\,/,"\n");print $4 }' /etc/group | xargs -I {} grep '^{}\:.*' /etc/passwd               
xieerqi:x:1000:1000:xieerqi,,,:/home/xieerqi:/bin/mksh
testuser:x:1001:1001:,,,:/home/testuser:/bin/bash
    
por Sergiy Kolodyazhnyy 01.02.2016 / 05:39
0

Em python isso seria feito como

import grp
import pwd
print([x for x in grp.getgrnam('sudo').gr_mem if pwd.getpwnam(x).pw_shell not in ('/bin/false', '/bin/nologin')])

Em que grp.getgrnam('sudo').gr_mem retornaria todos os membros do grupo do grupo sudo e pwd.getpwnam(USER).pw_shell retornará o shell dos usuários de /etc/passwd .

Mas apenas a participação no grupo em sudo não é a única maneira de se tornar root. Seus usuários também podem ter entradas individuais em /etc/sudoers , o que lhes daria permissões de root. Então você precisaria analisar /etc/sudoers também.

    
por Germar 03.02.2016 / 02:58