LinuxCheck
Herramienta de respuesta a emergencias / recopilación de información / detección de vulnerabilidades para Linux, que admite más de 70 comprobaciones en 13 categorías, incluyendo configuración básica, tráfico de red, tareas programadas, variables de entorno, información de usuario, servicios, bash, archivos maliciosos, rootkits del kernel, SSH, webshells, archivos de minería, procesos de minería, cadena de suministro, riesgos del servidor, etc.
Actualizaciones
Registro de cambios: 20 de abril de 2024
- Ajuste de la salida a informe Markdown
- Se descartó
ag y se usó el comando nativo grep de Linux para evitar instalaciones adicionales
- Optimización del formato del código, ya no se usa
tee -a en cada línea
- Actualización de la lógica de detección de webshells
- Actualización de la lógica de detección de
authorized_keys
- En la comprobación de riesgos del servidor se añadió detección de JDWP y Python HTTP Server
- Se añadió detección de contenedores Docker
- Se añadió detección de puerta trasera PAM
- Se añadió capacidad de subida de informes locales para manejar situaciones de respuesta en lotes de máquinas.
Registro de cambios: 05 de agosto de 2022
- Corregido el problema de demasiados registros en la comprobación de módulos del kernel
Registro de cambios: 07 de marzo de 2022
- Se añadió detección de puerta trasera SSH mediante enlace simbólico
Fecha de actualización: 17 de octubre de 2021
- Se añadió detección de malware de minería Ntpclient / WorkMiner / TeamTNT
- Se añadió lógica de detección de módulos Rootkit
- Se añadió detección de envenenamiento de Python pip
- Se añadió visualización de
$HOME/.profile
- Se añadió comprobación de riesgos del servidor (Redis)
Funcionalidades
- Comprobación de configuración básica
- Comprobación de cambios en la configuración del sistema
- Información del sistema (dirección IP / usuario / tiempo de arranque / versión del sistema / nombre de host / SN del servidor)
- Uso de CPU
- Información de usuarios conectados
- CPU TOP 15
- Memoria TOP 15
- Comprobación de espacio disponible en disco
- Montaje de discos duros
- Comprobación de software común
/etc/hosts
- Comprobación de red / tráfico
- ifconfig
- Tráfico de red
- Puertos en escucha
- Puertos abiertos al exterior
- Conexiones de red
- Estado de conexiones TCP
- Tabla de enrutamiento
- Reenvío de rutas
- Servidor DNS
- ARP
- Comprobación de modo promiscuo en la tarjeta de red
- Cortafuegos iptables
- Comprobación de tareas programadas
- Tareas programadas del usuario actual
- Tareas programadas del sistema en
/etc/
- Hora de creación de archivos de tareas programadas
- Detección de puertas traseras en crontab
- Comprobación de variables de entorno
- env
- path
- LD_PRELOAD
- LD_ELF_PRELOAD
- LD_AOUT_PRELOAD
- PROMPT_COMMAND
- LD_LIBRARY_PATH
- ld.so.preload
- Comprobación de información de usuario
- Usuarios que pueden iniciar sesión
- Fecha de modificación del archivo passwd
- sudoers
- Información de inicio de sesión (w / last / lastlog)
- Direcciones IP de inicios de sesión históricos
- Comprobación de servicios
- Servicios en ejecución de SystemD
- Hora de creación de servicios SystemD
- Comprobación de bash
- History (historial)
- Auditoría de comandos del historial
/etc/profile
$HOME/.profile
/etc/rc.local
~/.bash_profile
~/.bashrc
- Reverse shell de bash
- Comprobación de archivos
- ... archivos ocultos
- Detección de fecha de modificación de archivos del sistema
- Comprobación de archivos temporales (
/tmp, /var/tmp, /dev/shm)
- alias
- Comprobación de permisos especiales SUID
- Archivos no encontrados por procesos existentes
- Archivos modificados en los últimos siete días (mtime)
- Archivos modificados en los últimos siete días (ctime)
- Archivos grandes > 200 MB
- Auditoría de archivos sensibles (nmap, sqlmap, ew, frp, nps y otras herramientas comunes de hackers)
- Archivos sospechosos de hackers (programas como wget/curl subidos por hackers, o programas maliciosos renombrados como software legítimo, por ejemplo, archivo nps renombrado como mysql)
- Comprobación de rootkits del kernel
- Módulos sospechosos en lsmod
- Comprobación de la tabla de símbolos del kernel
- Comprobación rootkit hunter
- Comprobación de módulos .ko rootkit
- Comprobación SSH
- Fuerza bruta SSH
- Detección de SSHD
- Configuración de puerta trasera SSH
- Detección de puerta trasera SSH inetd
- Claves SSH
- Comprobación de webshells
- Comprobación de webshell PHP
- Comprobación de webshell JSP
- Comprobación de archivos / procesos de minería
- Comprobación de archivos de minería
- Comprobación de procesos de minería
- Detección de WorkMiner
- Detección de Ntpclient
- Comprobación de envenenamiento de cadena de suministro
- Detección de envenenamiento de Python PIP
- Comprobación de riesgos del servidor
- Detección de contraseña débil de Redis
- Detección de servicio JDWP
- Detección de Python http.server
- Comprobación de permisos Docker
Uso
Primera forma: instalación mediante git clone
git clone https://github.com/al0ne/LinuxCheck.git
chmod u+x LinuxCheck.sh
./LinuxCheck.sh
Segunda forma: invocación en línea directa [La invocación en línea no permite usar la capacidad de subida de informes]
bash -c "$(curl -sSL https://raw.githubusercontent.com/al0ne/LinuxCheck/master/LinuxCheck.sh)"
El archivo se guardará con el formato ipaddr_hostname_username_timestamp.log
Si se despliega en máquinas en lote, después de ejecutar el script se enviará automáticamente a una URL. Cambie webhook_url en el script por su propia dirección.
# Dirección para el reporte de informes
webhook_url='http://localhost:5000/upload'
upload_report() {
# Subir a la interfaz especificada
if [[ -n $webhook_url ]]; then
curl -X POST -F "file=@$filename" "$webhook_url"
fi
}
En su servidor, levante un servicio con Flask para recibir los informes Markdown enviados por las máquinas.
from flask import Flask, request
app = Flask(__name__)
@app.route('/upload', methods=['POST'])
def upload_file():
if 'file' not in request.files:
return "No file part", 400
file = request.files['file']
if file.filename == '':
return "No selected file", 400
if file:
filename = file.filename
file.save(filename)
return "File successfully uploaded", 200
if __name__ == '__main__':
app.run(debug=True, host="0.0.0.0", port=9999)
Referencias
La escritura de esta herramienta se basó principalmente en las siguientes herramientas/artículos y se complementó con experiencia personal:
Linenum
https://github.com/lis912/Evaluation_tools
https://ixyzero.com/blog/archives/4.html
https://github.com/T0xst/linux
https://github.com/grayddq/GScan