Skip to content

Instantly share code, notes, and snippets.

@dstnat
Last active July 21, 2025 22:51
Show Gist options
  • Select an option

  • Save dstnat/951f258861ea3fa534df8948db3e8c5f to your computer and use it in GitHub Desktop.

Select an option

Save dstnat/951f258861ea3fa534df8948db3e8c5f to your computer and use it in GitHub Desktop.
Agente de Ciberseguridad con LangChain y Ollama
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