Conseguindo uma tty shell totalmente interativa

Edmilson Junior
4 min readAug 14, 2020

--

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")'
também é possível fazer com o python3

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):

Parece que não ao apertar TAB não conseguimos o auto-complete
Mas sim, funcionou, só não conseguimos ver qual arquivo foi usado no auto-complete ao apertar TAB

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”.

mesmo com um pequeno erro no “nano” ainda conseguimos modificar o arquivo :)

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

--

--