Conseguindo uma tty shell totalmente interativa
Essa postagem é para ajudar os iniciantes que após conseguirem uma shell reversa não sabem como melhora-la e deixa-la totalmente interativa :), explicarei o passo a passo, se você quer apenas os comando, vá direto para o final.
Primeiro vamos entender o porque melhorar uma simples shell para uma tty shell interativa:
Ao conseguirmos nossa reverse shell em uma aplicação web sempre (sempre é uma palavra muito forte, há umas raras exceções) estaremos com as permissões do usuário www-data.
Como por padrão o usuário www-data não tem permissão de login, também não teremos certas “regalias” que usuários com permissão de login tem, como por exemplo:
- Não podemos usar alguns comandos como su ou sudo.
- Não conseguimos usar editores como o nano ou vim apropriadamente.
- Não temos o auto-complete com o tab.
- Não temos uma variedade de outros comandos :(
E o pior de tudo, sem querer apertar “crtl+c” e perder a shell :’(
Mas por que temos poucos recursos?
Sabemos que usuário em que estamos não tem permissão de login, então mesmo estando com uma shell ela não é tty, então temos que conseguir uma.
Botando a mão na massa:
Usaremos o python para conseguirmos uma pseudo-tty(pty)
python -c 'import pty;pty.spawn("/bin/bash")'
Agora já temos nossa shell interativa, então podemos executar comandos que antes não podíamos, como pro exemplo o su:
Mas ainda há alguns problemas, não podemos usar o “ctrl+c” para cancelar um comando ou script que está sendo executado sem perder nossa shell, também não é possível usar o comando “clear” ou “nano”.
Podemos ver também que os comandos que digitamos se repetem e “não temos o auto-complete”(sim, temos, mas fica muito feito):
Então vamos resolver mais esse problema.
stty:
Usaremos o stty para deixar nossa shell ainda mais completa.
Primeiro vamos parar o processo com o “ctrl + z”, após isso usaremos esse comando:
stty raw -echo && fg
explicação rápida: o comando “raw” é o responsável por fazer com que o “ctrl +c” não feche nossa shell, já o “-echo” é o responsável por fazer os comando pararem de “ecoar”. Acesse a página do manual do stty para uma explicação mais aprofundada.
Já o “fg” retoma o ultimo processo parado, que no nosso caso foi a reverse shell
após isso só apertar enter novamente e pronto
Agora podemos usar o “ctrl + c” a vontade e não perderemos nossa shell , além de termos nosso auto-complete funcionando perfeitamente e sem “ecoar” os comandos que digitamos ❤.
Mas como podemos ver ainda há algumas poucas limitações e não podemos usar o clear ou o nano.
Vemos uma mensagem de erro dizendo que o a variável “TERM” não está definida no enviromment, então teremos que defini-la.
export TERM=xterm-256color
Agora conseguimos usar praticamente todos os comandos, entre eles estão o “nano”, “clear” e “reset”.
E para ficar ainda melhor, vamos resolver o problema de quebra de linha :)
Esse problema é causado pois as rows e columns estão com o valor “0”, você usa o comando “stty -a” na máquina alvo será possível ver, então para resolver esse problemas teremos que colocar o mesmo valor que está por padrão no terminal da nossa máquina:
No meu caso rows tem o valor 24 e columns 80, então na máquina alvo executaremos:
stty rows 24 columns 80
Assim resolvemos o problema de quebra linha :)
OBS: Por padrão em uma tty normal o valor de rows e columns é mudado automaticamente dependendo do tamanho da janela do terminal, então se a janela de seu termina lestá em tela cheia e você colocar as rows e columns na máquina alvo, mesmo que você mude o tamanho da janela o valor permanecerá o mesmo e pode acontecer(provavelmente vai) de voltar a dar as quebras de linha, então ou use o tamanho que você usava na hora de colocar as rows e columns ou apenas faça o mesmo processo de modificar os valores.
Comandos:
python -c 'import pty;pty.spawn("/bin/bash")'"ctrl + z"stty raw -echo && fgaperte "enter" novamenteexport TERM=xterm-256color####em sua máquina####
#stty -a #
######################stty rows 24 columns 80 || (apenas um exemplo, modifique para a saída do seu stty -a)
Obrigado por terem lido ❤ , até a próxima