Last active
July 21, 2025 22:51
-
-
Save dstnat/951f258861ea3fa534df8948db3e8c5f to your computer and use it in GitHub Desktop.
Agente de Ciberseguridad con LangChain y Ollama
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import os | |
| import re | |
| import paramiko | |
| import json | |
| from typing import Union, List, Dict | |
| from langchain_community.llms import Ollama | |
| from langchain_community.tools import tool | |
| from langchain.agents import AgentExecutor, create_react_agent | |
| from langchain_core.prompts import PromptTemplate | |
| from langchain.agents.agent import AgentOutputParser | |
| from langchain_core.agents import AgentAction, AgentFinish | |
| # --- Configuración SSH para Kali --- | |
| KALI_SSH_HOST = "192.168.56.181" # ¡IP de tu máquina Kali actualizada y verificada! | |
| KALI_SSH_USER = "dstnat" | |
| KALI_SSH_PASS = "semeter*410" | |
| # --- Definir Herramientas --- | |
| @tool | |
| def nmap_recon_scan(target: str) -> str: | |
| """ | |
| Realiza un escaneo de reconocimiento exhaustivo usando nmap en el objetivo especificado. | |
| Escanea los puertos del 1 al 1000, detecta versiones de servicios (-sV), ejecuta scripts por defecto (-sC), | |
| y es muy verboso (-vvv). | |
| El objetivo puede ser una IP, un rango de IPs, o un hostname. | |
| Ejemplo de uso: nmap_recon_scan("192.168.1.1") | |
| """ | |
| try: | |
| client = paramiko.SSHClient() | |
| client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) | |
| client.connect(hostname=KALI_SSH_HOST, username=KALI_SSH_USER, password=KALI_SSH_PASS) | |
| command = f"nmap -p 1-1000 --open -sS -sC -sV -n -vvv -Pn {target}" | |
| stdin, stdout, stderr = client.exec_command(command) | |
| output = stdout.read().decode().strip() | |
| error = stderr.read().decode().strip() | |
| client.close() | |
| if error: | |
| return f"Error al ejecutar nmap_recon_scan remoto en {target}: {error}" | |
| if not output: | |
| return f"No se encontraron resultados para {target}. Asegúrate de que el objetivo esté activo y sea accesible desde Kali." | |
| return output | |
| except Exception as e: | |
| return f"Error al intentar conectar a Kali o ejecutar nmap_recon_scan: {e}. Asegúrate de que Kali esté encendida, sea accesible por SSH, y las credenciales sean correctas." | |
| @tool | |
| def nmap_vulnerability_scan(target: str, ports: str, script_category_or_names: str = "vuln") -> str: | |
| """ | |
| Realiza un escaneo de vulnerabilidades utilizando scripts de Nmap NSE | |
| en los puertos específicos de un objetivo. | |
| Los 'ports' deben ser una lista de puertos separados por comas (ej. "22,80,443"). | |
| 'script_category_or_names' puede ser una categoría de scripts Nmap (ej. "vuln", "discovery") | |
| o una lista de nombres de scripts específicos separados por comas (ej. "smb-enum-shares,smb-vuln-ms17-010"). | |
| Ejemplo de uso: | |
| - Escaneo general: nmap_vulnerability_scan("192.168.1.1", "22,80", "vuln") | |
| - Escaneo SMB específico: nmap_vulnerability_scan("192.168.1.1", "445", "smb-enum-shares,smb-vuln-ms17-010") | |
| """ | |
| try: | |
| client = paramiko.SSHClient() | |
| client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) | |
| client.connect(hostname=KALI_SSH_HOST, username=KALI_SSH_USER, password=KALI_SSH_PASS) | |
| command = f"nmap -p {ports} --script={script_category_or_names} {target}" | |
| stdin, stdout, stderr = client.exec_command(command) | |
| output = stdout.read().decode().strip() | |
| error = stderr.read().decode().strip() | |
| client.close() | |
| if error: | |
| return f"Error al ejecutar nmap_vulnerability_scan remoto en {target} en puertos {ports} con scripts {script_category_or_names}: {error}" | |
| if not output or "Host is up" not in output: | |
| return f"No se encontraron resultados de vulnerabilidades para {target}. Asegúrate de que el objetivo esté activo y sea accesible desde Kali." | |
| return output | |
| except Exception as e: | |
| return f"Error al intentar conectar a Kali o ejecutar nmap_vulnerability_scan: {e}. Asegúrate de que Kali esté encendida, sea accesible por SSH, y las credenciales sean correctas." | |
| @tool | |
| def nuclei_scan(target_url: str) -> str: | |
| """ | |
| Realiza un escaneo de vulnerabilidades web utilizando Nuclei en la URL especificada. | |
| La URL debe incluir el esquema (http:// o https://) y el puerto si no es el predeterminado (ej. http://192.168.56.180:80). | |
| Utiliza plantillas de vulnerabilidades comunes de Nuclei. | |
| Ejemplo de uso: nuclei_scan("http://192.168.56.180:80") | |
| """ | |
| try: | |
| client = paramiko.SSHClient() | |
| client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) | |
| client.connect(hostname=KALI_SSH_HOST, username=KALI_SSH_USER, password=KALI_SSH_PASS) | |
| command = f"nuclei -u {target_url} -t cves/ -t exposures/ -t http/ -t vulnerabilities/ -silent -no-color" | |
| stdin, stdout, stderr = client.exec_command(command) | |
| output = stdout.read().decode().strip() | |
| error = stderr.read().decode().strip() | |
| client.close() | |
| if error and "No results found" not in error and "No targets specified" not in error: | |
| return f"Error al ejecutar nuclei_scan remoto en {target_url}: {error}" | |
| if not output: | |
| return f"No se encontraron hallazgos de Nuclei para {target_url}." | |
| return output | |
| except Exception as e: | |
| return f"Error al intentar conectar a Kali o ejecutar nuclei_scan: {e}. Asegúrate de que Kali esté encendida, sea accesible por SSH, y las credenciales sean correctas." | |
| @tool | |
| def searchsploit_lookup(query: str) -> str: | |
| """ | |
| Busca exploits y shellcodes en la base de datos de Exploit-DB usando searchsploit. | |
| La 'query' puede ser el nombre de un software, un servicio, o una versión específica (ej. "vsftpd 2.3.4", "openssh 7.9p1", "apache 2.4"). | |
| Ejemplo de uso: searchsploit_ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment