Teste de penetração do Python: coletando nomes de usuários e grupos do AD no Linux
R. Eric Kiser
Imagine que você é um testador de penetração que invadiu com sucesso um servidor de aplicativos web Linux que hospeda um sistema de compras. Como esses sistemas são críticos e não devem passar por tempo de inatividade, você precisa agir de forma suave, mas rápida. É provável que você encontre vários usuários de domínio, contas de serviço e talvez até uma conta de domínio. Você navega até a /homepasta para descobrir vários usuários. Isso pode ser demorado e repetitivo, mas existe uma maneira de automatizar o processo. Neste artigo, mostrarei como escrever um script Python que lê o/home diretório, filtra nomes de usuário e, em seguida, usa esses nomes de usuário para verificar o servidor Active Directory para determinar a quais grupos o usuário pertence. Isso permitirá que você identifique rapidamente alvos em potencial e priorize seus esforços de acordo com os recursos de acesso.
Precisamos importar alguns módulos da biblioteca Python para começar. O osmódulo fornece uma maneira de interagir com o sistema operacional, incluindo acesso ao sistema de arquivos, variáveis de ambiente e execução de comandos do sistema. O subprocessmódulo fornece uma maneira de executar comandos do sistema a partir de um script Python. Ele permite que você execute comandos como se os estivesse executando a partir de uma interface de linha de comando (CLI).
import os
import subprocess
# Get a list of usernames in the Linux home directory
usernames = [f.name for f in os.scandir("/home") if f.is_dir() and not f.name.startswith(".")]
O bash -ccomando é usado para executar o id -nGcomando em um novo shell. Isso é necessário porque idé um comando interno do shell e não pode ser executado diretamente pelo subprocess.run. A usernamevariável é passada como um argumento para o id -nGcomando usando formatação de string.
O capture_output=Trueargumento informa subprocess.runpara capturar a saída do comando e o text=Trueargumento informa para retornar a saída como uma string. O shell=Trueargumento habilita a execução do shell, o que é necessário porque o idcomando é um comando interno do shell.
A saída resultante do comando é uma string contendo a lista de grupos para o usuário, que é dividida em uma lista usando o split()método. A lista de grupos resultante é armazenada na groupsvariável. A saída será formatada da seguinte forma:
username1: group1, group2, group3
username2: group2, group3, group4
username3: group1, group4, group5
# Loop over the usernames and print their groups
for username in usernames:
result = subprocess.run(f"bash -c 'id -nG {username}'", capture_output=True, text=True, shell=True)
groups = result.stdout.strip().split()
print(f"{username}: {', '.join(groups)}")
Outros artigos de teste de penetração Python por R. Eric Kiser:
Pentesting Lateral Movement: Chrome Bookmark Extraction using Python Write Python Reverse TCP Shells in less than 5.1 Min




































![O que é uma lista vinculada, afinal? [Parte 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)