No, no voy a decir cómo escribir mi ransomware ransomware, minero o explotar una vulnerabilidad súper nueva, como podría pensar. Y aún más, no estoy ansioso por elevar el holívar "¿Es Linux más seguro que Windows? (Sí)". Mi objetivo era escribir un virus simple para Linux, nadie, por así decirlo, "Solo por diversión", cuya única función es distribuir su copia. Sobre lo que hice, lo contaré en este artículo. Al final, le daré un enlace a GitHub con la fuente.

Descargo de responsabilidad
Este artículo está escrito con fines educativos. El autor en ningún caso alienta a los lectores a violar las leyes de la Federación de Rusia. No repita los pasos descritos en este artículo sin leer primero el capítulo 28 del Código Penal de la Federación de Rusia.
¿Y qué haremos realmente?
Me pareció que el mecanismo de implementación más sencillo para propagar el virus se extendió a través de paquetes deb / rpm modificados. Los paquetes de formato deb y rpm son ahora la herramienta de distribución más popular para Linux. Opté por Deb, ya que el número de usuarios de distribuciones basadas en Debian prevalece sobre los usuarios de Red Hat y sus "seguidores".
También es necesario que el virus se inicie automáticamente, y después de cada cierto período de tiempo escanea la computadora en busca de paquetes deb. Para facilitar la depuración, elegí un período de 10 minutos.
¿Qué es un paquete deb?
El paquete deb es un archivo de formato
.ar que no utiliza compresión. Hay tres archivos más dentro del archivo:
debian-bynary ,
control.tar y
data.tardebian.binary es un archivo de texto que contiene una versión del formato del paquete deb, por el momento, siempre escriben "2.0" allí.
control.tar : archivo con archivos que contienen información sobre el paquete (por ejemplo, el archivo de control requerido) y los paquetes necesarios para instalar el paquete (por ejemplo, scripts preinst, postinst, prerm y postrm que se ejecutan antes / después de instalar / desinstalar el paquete). Se puede comprimir usando gzip o xz, en cuyo caso la extensión .gz o .xz se agrega al nombre del archivo, respectivamente.
data.tar : archivo con directorios que contienen archivos instalados. Los directorios están representados por un árbol, en la forma en que deben extraerse a la raíz del sistema de archivos. Se puede comprimir usando gzip, bzip2, lzma, xz.
Debemos prestar atención al archivo de control del archivo control.tar. Este archivo contiene información sobre el paquete, como el autor, la descripción, la versión, la prioridad del paquete en el sistema, etc. Me interesa el campo
dependiente , que muestra las dependencias (paquetes sin los cuales no puede funcionar desde este paquete). En este campo, nuestro virus agregará
fakeroot y
dpkg , utilidades que serán necesarias al modificar otros paquetes en la computadora infectada.
Para construir un paquete deb, se crea el directorio raíz del paquete. Se colocan directorios con archivos instalados y el directorio DEBIAN que contiene archivos de servicio, incluidos el control y las secuencias de comandos para la instalación / desinstalación. Luego
se ejecuta el comando fakeroot dpkg-deb --build ./path .
Primero hubo un demonio
Al momento de escribir el virus, todavía tenía una mala idea de lo que
era Cron , así que escribí mi propio demonio para
systemd . Creé el archivo trojan_penguin.service, que se colocará en el directorio / lib / systemd / system, y agregué lo siguiente:
[Unit] Description = XXX [Service] ExecStart=/usr/bin/trojan_penguin.sh Type=fork [Install] WantedBy=multi-user.target
ExecStart = / usr / bin / trojan_penguin.sh : aquí indiqué la ruta al archivo (al virus futuro), que debería iniciarse al iniciar el sistema.
Tipo = fork : esta línea indica que el proceso debe bifurcarse del proceso padre.
No vi la necesidad de un archivo PID, así que no lo agregué.
En los manuales para escribir su daemon, los archivos .service se proponen colocar en los directorios / usr / lib / systemd / system / o / etc / systemd / system /. Pero en mi ubunt encontré el directorio / lib / systemd / system. (Obtuve apache2.service allí). Tal vez alguien en los comentarios escriba para qué sirve este directorio y en qué se diferencia de los otros dos.
El archivo
/usr/bin/trojan_penguin.sh obtuve esto:
Estamos buscando paquetes deb en la sección / home (¿dónde más puedo encontrarlos?). Las rutas a los archivos encontrados se escriben en la variable de
lista . Luego solo itera sobre todas las líneas de la línea y para cada archivo ejecutamos el script tp_infect.sh, que infectará este archivo. Cuando escribí el virus, los scripts estaban en un directorio separado y, por conveniencia, creé una variable de
depuración en la que escribí la ruta a esta carpeta.
El demonio está listo, queda por aprender cómo ejecutarlo cuando se inicia el sistema. Para esto, escribí un script
posterior a la
instalación . Comenzará inmediatamente después de instalar el paquete infectado e indicará que nuestro virus comienza con el sistema. Lo coloqué en el directorio "/ usr / bin /" para copiarlo desde allí a los paquetes infectados.
Modificando el paquete deb
Como escribí anteriormente, los archivos contenidos en un paquete deb pueden tener diferentes permisos. No me molesté, y consideré solo el caso cuando los archivos están comprimidos usando .xz. El archivo
/usr/bin/tp_infect.sh responsable de la modificación recibió los siguientes contenidos:
Problemas con postinstall
Todo estaría bien, pero ahora tenemos un problema. Pero, ¿qué pasa si el paquete ya tiene postinstal? El postinstal original se puede escribir en diferentes idiomas (python, bash ...), tal vez incluso sea un binario. Esto no nos permitirá simplemente tomar y agregar nuestro postinstall. Resolví este problema de la siguiente manera:
Se agregó lo siguiente al script
tp_infect.sh :
Y en
postinstal , esto es esto:
Resolví un problema, pero apareció otro. Nuestro virus modificará el paquete, incluso si ya está infectado. Tras la modificación, el virus verá que hay un
postinstal en el paquete (que en realidad es nuestro), muévalo a / usr / bin /, sobrescribiendo así el original. Para evitar esto, agregué un cheque a "tp_infect.sh", tanto si modificamos este archivo como si no:
if [ -f $temp/new/usr/bin/trojan_penguin.sh ]; then rm -R $temp exit 0 fi
Poniéndolo todo junto
El virus esta listo. Aquí hay un
enlace a GitHub , como se prometió. Este virus se puede compilar en un paquete de Deb separado (ejecute makedeb.sh) desde el repositorio. Para inyectar el virus en cualquier paquete, simplemente ejecute el comando:
tp_infect.sh / deb-/
Hay dos copias del script
postinst en el repositorio
DEBIAN / postinst : esta copia solo se realiza al instalar un paquete vacío con un virus. Lo comenté para que el virus no se inicie después de la instalación y modifique los paquetes solo por comando.
usr / bin / postinst : esta copia se inserta en los paquetes infectados.
Resumen
Y la conclusión es obvia sin este artículo: no debe descargar y ejecutar programas de fuentes no verificadas.
En aras de la curiosidad, envié el paquete de virus deb a VirusTotal para su análisis. Al momento de escribir, ni un solo antivirus lo ha detectado. Aquí está el
enlace al informe. Me pregunto cuánto tiempo debería pasar y cuántos hosts deben infectarse con este virus para que los antivirus le presten atención.