Teste de penetração do Python: coletando nomes de usuários e grupos do AD no Linux

Feb 26 2023
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 aquisição.

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