3

O shell imaginário - Hacking

#Programação para Internet #Linux #Lógica de Programação
Enilton Angelim
Enilton Angelim

Apresentação


Olá meu nome é Angelim e sou, ou ao menos lembro de ser, um entusiasta Linux e Shell Script. Quero compartilhar este artigo com o objetivo de complementar o curso de Linux e demonstrar como o bash é incrivelmente poderoso.


Dispositivos especiais


Para padronizar à arquitetura das distribuições Linux e facilitar a criação de certificação profissional a indústria precisou criar o FHS. Por representar uma estrutura de diretórios não damos a atenção necessária, pois leva-se um tempo a entender e perceber que tudo no Linux é sobre, virtuais ou não, arquivos e o /proc não me deixa mentir.


No padrão FHS encontramos os dispositivos em /dev e não estou falando apenas de HDs, SSDs, PenDrive, etc. Com vocês:


  • /dev/urandom - Um pseudo-device que prover um método mais eficaz para a geração de números pseudoaleatórios
  • /dev/tcp - Um pseudo-device capaz de estabelecer conexão TCP
  • /dev/udp - Um pseudo-device capaz de estabelecer conexão UDP


Exemplos


Estabelecer uma conexão ao serviço SSH


$ timeout 10 cat </dev/tcp/127.0.0.1/22
SSH-2.0-OpenSSH_5.9p1 Debian-5ubuntu1.8


Estabelecer uma conexão ao serviço SMTP


$ timeout 10 cat </dev/tcp/127.0.0.1/25
220 foo.com.br ESMTP Postfix


Estabelecer conexão e interagir com o fluxo de dados


  • Criando a função sendMail
function sendMail(){
    host=${1} #smtp server
    port=${2} #port 25 or 587
    ehlo=${3}
    auth=${4}
    user=${5}
    pass=${6}
    mailFrom=${7}
    rcptTo=${8}
    data=${9}
    exec 5<>/dev/tcp/$host/$port
    echo -e "$ehlo" >&5
    sleep 2
    echo -e "$auth" >&5
    sleep 2
    echo -e "$user" >&5
    sleep 1
    echo -e "$pass" >&5
    sleep 1
    echo -e "$mailFrom" >&5
    sleep 1
    echo -e "$rcptTo" >&5
    sleep 1
    echo -e "DATA" >&5
    sleep 1
    echo -e "$data"  >&5
    sleep 1
    echo -e '\r\n.\r\n'  >&5
    sleep 1
    timeout 6 cat <&5
    exec 5>&-
}; export -f loginOnSmtp


  • Executa o sendMail passando os valores como parâmetro da função
$ sendMail mail.foo.com.br 25 "ehlo foo.com.br\r" "auth login\r" "usernameBase64\r" "passwordBase64\r" "mail from:...\r" "rcpt to:...\r" "Subject:...\r\r...data\r"


  • Resultado
220 mailservice01.foo.com.br ESMTP Postfix
250-mailservice01.foo.com.br
250-STARTTLS
250-SIZE 1048576000
250-VRFY
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
334 VXNlcm5hbWU6
334 UGFzc3dvcmQ6
235 2.7.0 Authentication successful
250 2.1.0 Ok
250 2.1.5 Ok
354 End data with <CR><LF>.<CR><LF>
250 2.0.0 Ok: queued as 3AA095800F94
500 5.5.2 Error: bad syntax


Apenas usando descritores de arquivo facilmente consegui conectar em um serviço SMTP e enviar e-mail através do Postfix remoto sem a necessidade de bibliotecas de terceiros.


Representação gráfica da comunicação entre os descritores (FD):


Prepara o ambiente:

exec 5<>/dev/tcp/$host/$port
lsof -a -p $$ -d0,1,2,5


Saída do comando LSOF:

COMMAND  PID    USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
bash    3981 angelim    0u   CHR  136,2      0t0    5 /dev/pts/2
bash    3981 angelim    1u   CHR  136,2      0t0    5 /dev/pts/2
bash    3981 angelim    2u   CHR  136,2      0t0    5 /dev/pts/2
bash    3981 angelim    5u  IPv4  48450      0t0  TCP 192.168.0.8:41250->mailservice01.foo.com.br:smtp (ESTABLISHED)


Sobrescrevi, usando o comando exec, a entrada e a saída padrão do sistema para um descritor da minha escolha, 5, permitindo ler e inserir dados através do mesmo.


                  ---       +-----------------------+
standard input   ( 0 ) <----| 5                     |
                  ---       +-----------------------+

                  ---       +-----------------------+
standard output  ( 1 ) ---->| 5                     |
                  ---       +-----------------------+

                  ---       +-----------------------+
standard error   ( 2 ) ---->| /dev/pts/2            |
                  ---       +-----------------------+

                  ---       +-----------------------+
new descriptor   ( 5 ) ---->| connect               |
                  ---       +-----------------------+


Transferência de dados


  • Servidor


Daemon

while true; do
    filename=$(nc -l 5555)
    nc -l 5556 > $1/$(basename $filename)
done


  • Cliente


Nome do arquivo

echo eclipse.tar.gz >/dev/tcp/127.0.0.1/5555


Dados do arquivo

cat eclipse-jee-luna-SR2-linux-gtk-x86_64.tar.gz > /dev/tcp/127.0.0.1/5556


Hash md5 do arquivo original

be9391112776755e898801d3f3f51b74  eclipse-jee-luna-SR2-linux-gtk-x86_64.tar.gz


Hash md5 da cópia

be9391112776755e898801d3f3f51b74  /tmp/eclipse.tar.gz


Se você gostou dessa dica e quer conhecer mais, fiz essa biblioteca https://github.com/eniltonangelim/dry-shell para shell script.


Documento original: https://github.com/eniltonangelim/workshop/blob/master/2%C2%BA%20Workshop%20-%20O%20shell%20imagin%C3%A1rio/bash-hacker.md

1
28

Comentários (1)

0
Thiago Guedes

Thiago Guedes

25/03/2021 13:37

Muito bom, Enilton! E faz toda a diferença postar os resultados, porque às vezes quem tá lendo tem um print diferente e aí ele pode ver onde tá errando. Valeu pelo conteúdo!

None

Brasil