vic_npc

nmap-wazuh

Jun 2nd, 2024
156
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Smarty 16.03 KB | Cybersecurity | 0 0
  1.  
  2. ChatGPT
  3. Claro, aquí tienes una guía paso a paso detallada para la instalación y configuración de la integración de Nmap y ChatGPT con Wazuh.
  4.  
  5. Parte 1: Configuración en el Servidor Wazuh
  6. 1.1: Agregar Reglas de Wazuh
  7. Editar el archivo de reglas locales
  8.  
  9. Abre el archivo /var/ossec/etc/rules/local_rules.xml:
  10. bash
  11. Copiar código
  12. sudo nano /var/ossec/etc/rules/local_rules.xml
  13. Agregar las siguientes reglas dentro del archivo:
  14.  
  15. xml
  16. Copiar código
  17. <group name="linux,nmap,">
  18.   <rule id="100100" level="3">
  19.     <decoded_as>json</decoded_as>
  20.     <field name="nmap_port">\.+</field>
  21.     <field name="nmap_port_service">\.+</field>
  22.     <description>NMAP: Host scan. Port $(nmap_port) is open and hosting the $(nmap_port_service) service.</description>
  23.     <options>no_full_log</options>
  24.   </rule>
  25. </group>
  26.  
  27. <group name="linux,chat_gpt">
  28.   <rule id="100101" level="5">
  29.     <if_sid>100100</if_sid>
  30.     <field name="nmap_port">\d+</field>
  31.     <description>NMAP: Host scan. Port $(nmap_port) is open.</description>
  32.   </rule>
  33.   <rule id="100103" level="5">
  34.     <if_sid>100100</if_sid>
  35.     <field name="nmap_port_service">^\s$</field>
  36.     <description>NMAP: Port $(nmap_port) is open but no service is found.</description>
  37.   </rule>
  38. </group>
  39. Guardar y cerrar el archivo presionando Ctrl + X, luego Y y Enter.
  40.  
  41. 1.2: Crear el Script de Integración de ChatGPT
  42. Crear el archivo del script de integración
  43.  
  44. Crea el archivo /var/ossec/integrations/custom-chatgpt.py:
  45. bash
  46. Copiar código
  47. sudo nano /var/ossec/integrations/custom-chatgpt.py
  48. Copiar el contenido del script en el archivo:
  49.  
  50. python
  51. Copiar código
  52. #!/var/ossec/framework/python/bin/python3
  53. import json
  54. import sys
  55. import time
  56. import os
  57. from socket import socket, AF_UNIX, SOCK_DGRAM
  58. try:
  59.     import requests
  60.     from requests.auth import HTTPBasicAuth
  61. except Exception as e:
  62.     print("No module 'requests' found. Install: pip install requests")
  63.     sys.exit(1)
  64.  
  65. debug_enabled = False
  66. pwd = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
  67. print(pwd)
  68.  
  69. json_alert = {}
  70. now = time.strftime("%a %b %d %H:%M:%S %Z %Y")
  71.  
  72. log_file = '{0}/logs/integrations.log'.format(pwd)
  73. socket_addr = '{0}/queue/sockets/queue'.format(pwd)
  74.  
  75. def main(args):
  76.     debug("# Starting")
  77.     alert_file_location = args[1]
  78.     apikey = args[2]
  79.     debug("# API Key")
  80.     debug(apikey)
  81.     debug("# File location")
  82.     debug(alert_file_location)
  83.     with open(alert_file_location) as alert_file:
  84.         json_alert = json.load(alert_file)
  85.     debug("# Processing alert")
  86.     debug(json_alert)
  87.     msg = request_chatgpt_info(json_alert,apikey)
  88.     if msg:
  89.         send_event(msg, json_alert["agent"])
  90.  
  91. def debug(msg):
  92.     if debug_enabled:
  93.         msg = "{0}: {1}\n".format(now, msg)
  94.     print(msg)
  95.     f = open(log_file,"a")
  96.     f.write(str(msg))
  97.     f.close()
  98.  
  99. def collect(data):
  100.   nmap_port_service = data['nmap_port_service']
  101.   choices = data['content']
  102.   return nmap_port_service, choices
  103.  
  104. def in_database(data, nmap_port_service):
  105.   result = data['nmap_port_service']
  106.   if result == 0:
  107.     return False
  108.   return True
  109.  
  110. def query_api(nmap_port_service, apikey):
  111.   headers = {
  112.         'Authorization': 'Bearer ' + apikey,
  113.         'Content-Type': 'application/json',
  114.     }
  115.   json_data = {
  116.         'model': 'gpt-3.5-turbo',
  117.         'messages': [
  118.             {
  119.                 'role': 'user',
  120.                 'content': 'In 4 or 5 sentences, tell me about this service and if there are past vulnerabilities: ' + nmap_port_service,
  121.             },
  122.         ],
  123.     }
  124.   response = requests.post('https://api.openai.com/v1/chat/completions', headers=headers, json=json_data)
  125.   if response.status_code == 200:
  126.       ip = {"nmap_port_service": nmap_port_service}
  127.       new_json = {}
  128.       new_json = response.json()["choices"][0]["message"]
  129.       new_json.update(ip)
  130.       json_response = new_json
  131.       data = json_response
  132.       return data
  133.   else:
  134.       alert_output = {}
  135.       alert_output["chatgpt"] = {}
  136.       alert_output["integration"] = "custom-chatgpt"
  137.       json_response = response.json()
  138.       debug("# Error: The chatgpt encountered an error")
  139.       alert_output["chatgpt"]["error"] = response.status_code
  140.       alert_output["chatgpt"]["description"] = json_response["errors"][0]["detail"]
  141.       send_event(alert_output)
  142.       exit(0)
  143.  
  144. def request_chatgpt_info(alert, apikey):
  145.     alert_output = {}
  146.     if not "nmap_port_service" in alert["data"]:
  147.         return(0)
  148.     data = query_api(alert["data"]["nmap_port_service"], apikey)
  149.     alert_output["chatgpt"] = {}
  150.     alert_output["integration"] = "custom-chatgpt"
  151.     alert_output["chatgpt"]["found"] = 0
  152.     alert_output["chatgpt"]["source"] = {}
  153.     alert_output["chatgpt"]["source"]["alert_id"] = alert["id"]
  154.     alert_output["chatgpt"]["source"]["rule"] = alert["rule"]["id"]
  155.     alert_output["chatgpt"]["source"]["description"] = alert["rule"]["description"]
  156.     alert_output["chatgpt"]["source"]["full_log"] = alert["full_log"]
  157.     alert_output["chatgpt"]["source"]["nmap_port_service"] = alert["data"]["nmap_port_service"]
  158.     nmap_port_service = alert["data"]["nmap_port_service"]
  159.     if in_database(data, nmap_port_service):
  160.       alert_output["chatgpt"]["found"] = 1
  161.     if alert_output["chatgpt"]["found"] == 1:
  162.         nmap_port_service, choices = collect(data)
  163.         alert_output["chatgpt"]["nmap_port_service"] = nmap_port_service
  164.         alert_output["chatgpt"]["choices"] = choices
  165.         debug(alert_output)
  166.     return(alert_output)
  167.  
  168. def send_event(msg, agent = None):
  169.     if not agent or agent["id"] == "000":
  170.         string = '1:chatgpt:{0}'.format(json.dumps(msg))
  171.     else:
  172.         string = '1:[{0}] ({1}) {2}->chatgpt:{3}'.format(agent["id"], agent["name"], agent["ip"] if "ip" in agent else "any", json.dumps(msg))
  173.     debug(string)
  174.     sock = socket(AF_UNIX, SOCK_DGRAM)
  175.     sock.connect(socket_addr)
  176.     sock.send(string.encode())
  177.     sock.close()
  178.  
  179. if __name__ == "__main__":
  180.     try:
  181.         bad_arguments = False
  182.         if len(sys.argv) >= 4:
  183.             msg = '{0} {1} {2} {3} {4}'.format(now, sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4] if len(sys.argv) > 4 else '')
  184.             debug_enabled = (len(sys.argv) > 4 and sys.argv[4] == 'debug')
  185.         else:
  186.             msg = '{0} Wrong arguments'.format(now)
  187.             bad_arguments = True
  188.         f = open(log_file, 'a')
  189.         f.write(str(msg) + '\n')
  190.         f.close()
  191.         if bad_arguments:
  192.             debug("# Exiting: Bad arguments.")
  193.             sys.exit(1)
  194.         main(sys.argv)
  195.     except Exception as e:
  196.         debug(str(e))
  197.         raise
  198. Guardar y cerrar el archivo presionando Ctrl + X, luego Y y Enter.
  199.  
  200. Otorgar permisos de ejecución y modificar el propietario y grupo del script:
  201.  
  202. bash
  203. Copiar código
  204. sudo chmod 750 /var/ossec/integrations/custom-chatgpt.py
  205. sudo chown root:wazuh /var/ossec/integrations/custom-chatgpt.py
  206. 1.3: Configurar el Archivo ossec.conf
  207. Editar el archivo ossec.conf:
  208.  
  209. bash
  210. Copiar código
  211. sudo nano /var/ossec/etc/ossec.conf
  212. Agregar el siguiente bloque de integración dentro del bloque <ossec_config>:
  213.  
  214. xml
  215. Copiar código
  216. <!-- ChatGPT Integration -->
  217. <integration>
  218.   <name>custom-chatgpt.py</name>
  219.   <hook_url>https://api.openai.com/v1/chat/completions</hook_url>
  220.   <api_key>YOUR_CHATGPT_API_KEY</api_key>
  221.   <level>5</level>
  222.   <rule_id>100101</rule_id>
  223.   <alert_format>json</alert_format>
  224. </integration>
  225. Reemplaza YOUR_CHATGPT_API_KEY con tu clave API de ChatGPT.
  226.  
  227. Guardar y cerrar el archivo presionando Ctrl + X, luego Y y Enter.
  228.  
  229. 1.4: Agregar la Regla de Integración
  230. Editar el archivo de reglas locales nuevamente:
  231.  
  232. bash
  233. Copiar código
  234. sudo nano /var/ossec/etc/rules/local_rules.xml
  235. Agregar la siguiente regla:
  236.  
  237. xml
  238. Copiar código
  239. <group name="local,linux,">
  240.   <rule id="100102" level="6">
  241.     <field name="chatgpt.nmap_port_service">\w+</field>
  242.     <description>The service $(chatgpt.nmap_port_service) is on an open port.</description>
  243.   </rule>
  244. </group>
  245. Guardar y cerrar el archivo presionando Ctrl + X, luego Y y Enter.
  246.  
  247. 1.5: Reiniciar el Manager de Wazuh
  248. Reiniciar el manager de Wazuh para aplicar los cambios:
  249.  
  250. bash
  251. Copiar código
  252. sudo systemctl restart wazuh-manager
  253. Parte 2: Configuración en los Endpoints
  254. Configuración en Ubuntu
  255. 2.1: Instalar Dependencias
  256. Actualizar paquetes e instalar Python, pip y Nmap:
  257.  
  258. bash
  259. Copiar código
  260. sudo apt-get update && sudo apt-get install python3 python3-pip nmap
  261. sudo pip3 install python-nmap
  262. 2.2: Crear el Script de Nmap
  263. Crear el archivo del script de Nmap:
  264.  
  265. bash
  266. Copiar código
  267. sudo nano /var/ossec/nmapscan.py
  268. Copiar el contenido del script:
  269.  
  270. python
  271. Copiar código
  272. #!/var/ossec/framework/python/bin/python3
  273. import nmap
  274. import time
  275. import json
  276. import platform
  277.  
  278. def scan_subnet(subnet):
  279.     nm = nmap.PortScanner()
  280.     nm.scan(subnet)
  281.     results = []
  282.     for host in nm.all_hosts():
  283.         for proto in nm[host].all_protocols():
  284.             if proto not in ["tcp", "udp"]:
  285.                 continue
  286.             lport = list(nm[host][proto].keys())
  287.             lport.sort()
  288.             for port in lport:
  289.                 hostname = ""
  290.                 json_output = {
  291.                     'nmap_host': host,
  292.                     'nmap_protocol': proto,
  293.                     'nmap_port': port,
  294.                     'nmap_hostname': "",
  295.                     'nmap_hostname_type': "",
  296.                     'nmap_port_name': "",
  297.                     'nmap_port_state': "",
  298.                     'nmap_port_service': ""
  299.                 }
  300.                 if nm[host]["hostnames"]:
  301.                     hostname = nm[host]["hostnames"][0]["name"]
  302.                     hostname_type = nm[host]["hostnames"][0]["type"]
  303.                     json_output['nmap_hostname'] = hostname
  304.                     json_output['nmap_hostname_type'] = hostname_type
  305.                 if 'name' in nm[host][proto][port]:
  306.                     json_output['nmap_port_name'] = nm[host][proto][port]['name']
  307.                 if 'state' in nm[host][proto][port]:
  308.                     json_output['nmap_port_state'] = nm[host][proto][port]['state']
  309.                 if 'product' in nm[host][proto][port] and 'version' in nm[host][proto][port]:
  310.                     service = nm[host][proto][port]['product'] + " " + nm[host][proto][port]['version']
  311.                     json_output['nmap_port_service'] = service
  312.                 results.append(json_output)
  313.     return results
  314.  
  315. def append_to_log(results, log_file):
  316.     with open(log_file, "a") as active_response_log:
  317.         for result in results:
  318.             active_response_log.write(json.dumps(result))
  319.             active_response_log.write("\n")
  320.  
  321. subnets = ['127.0.0.1']
  322.  
  323. if platform.system() == 'Windows':
  324.     log_file = "C:\\Program Files (x86)\\ossec-agent\\active-response\\active-responses.log"
  325. elif platform.system() == 'Linux':
  326.     log_file = "/var/ossec/logs/active-responses.log"
  327. else:
  328.     log_file = "/Library/Ossec/logs/active-responses.log"
  329.  
  330. for subnet in subnets:
  331.     results = scan_subnet(subnet)
  332.     append_to_log(results, log_file)
  333.     time.sleep(2)
  334. Guardar y cerrar el archivo presionando Ctrl + X, luego Y y Enter.
  335.  
  336. 2.3: Configurar el Agente Wazuh
  337. Editar el archivo ossec.conf:
  338.  
  339. bash
  340. Copiar código
  341. sudo nano /var/ossec/etc/ossec.conf
  342. Agregar el siguiente bloque dentro de <ossec_config>:
  343.  
  344. xml
  345. Copiar código
  346. <!-- Run nmap python script -->
  347. <localfile>
  348.   <log_format>full_command</log_format>
  349.   <command>python3 /var/ossec/nmapscan.py</command>
  350.   <frequency>604800</frequency>
  351. </localfile>
  352. Guardar y cerrar el archivo presionando Ctrl + X, luego Y y Enter.
  353.  
  354. 2.4: Reiniciar el Agente Wazuh
  355. Reiniciar el agente Wazuh:
  356.  
  357. bash
  358. Copiar código
  359. sudo systemctl restart wazuh-agent
  360. Configuración en Windows
  361. 2.5: Instalar Dependencias
  362. Instalar Python 3.8.7 o superior (con pip preinstalado):
  363. Asegúrate de marcar las opciones "Install launcher for all users (recommended)" y "Add Python to PATH".
  364. Instalar Microsoft Visual C++ 2015 Redistributable.
  365. Instalar Nmap v7.94 o superior: Añade Nmap a PATH.
  366. 2.6: Instalar la Biblioteca python-nmap
  367. Abrir PowerShell como administrador y ejecutar:
  368.  
  369. powershell
  370. Copiar código
  371. pip3 install python-nmap
  372. 2.7: Crear el Script de Nmap
  373. Crear el archivo del script de Nmap:
  374.  
  375. powershell
  376. Copiar código
  377. New-Item -Path "C:\Program Files (x86)\ossec-agent\nmapscan.py" -ItemType "file"
  378. Editar el archivo del script:
  379.  
  380. powershell
  381. Copiar código
  382. notepad "C:\Program Files (x86)\ossec-agent\nmapscan.py"
  383. Copiar el contenido del script en el archivo Notepad y guardarlo:
  384.  
  385. python
  386. Copiar código
  387. #!/var/ossec/framework/python/bin/python3
  388. import nmap
  389. import time
  390. import json
  391. import platform
  392.  
  393. def scan_subnet(subnet):
  394.     nm = nmap.PortScanner()
  395.     nm.scan(subnet)
  396.     results = []
  397.     for host in nm.all_hosts():
  398.         for proto in nm[host].all_protocols():
  399.             if proto not in ["tcp", "udp"]:
  400.                 continue
  401.             lport = list(nm[host][proto].keys())
  402.             lport.sort()
  403.             for port in lport:
  404.                 hostname = ""
  405.                 json_output = {
  406.                     'nmap_host': host,
  407.                     'nmap_protocol': proto,
  408.                     'nmap_port': port,
  409.                     'nmap_hostname': "",
  410.                     'nmap_hostname_type': "",
  411.                     'nmap_port_name': "",
  412.                     'nmap_port_state': "",
  413.                     'nmap_port_service': ""
  414.                 }
  415.                 if nm[host]["hostnames"]:
  416.                     hostname = nm[host]["hostnames"][0]["name"]
  417.                     hostname_type = nm[host]["hostnames"][0]["type"]
  418.                     json_output['nmap_hostname'] = hostname
  419.                     json_output['nmap_hostname_type'] = hostname_type
  420.                 if 'name' in nm[host][proto][port]:
  421.                     json_output['nmap_port_name'] = nm[host][proto][port]['name']
  422.                 if 'state' in nm[host][proto][port]:
  423.                     json_output['nmap_port_state'] = nm[host][proto][port]['state']
  424.                 if 'product' in nm[host][proto][port] and 'version' in nm[host][proto][port]:
  425.                     service = nm[host][proto][port]['product'] + " " + nm[host][proto][port]['version']
  426.                     json_output['nmap_port_service'] = service
  427.                 results.append(json_output)
  428.     return results
  429.  
  430. def append_to_log(results, log_file):
  431.     with open(log_file, "a") as active_response_log:
  432.         for result in results:
  433.             active_response_log.write(json.dumps(result))
  434.             active_response_log.write("\n")
  435.  
  436. subnets = ['127.0.0.1']
  437.  
  438. if platform.system() == 'Windows':
  439.     log_file = "C:\\Program Files (x86)\\ossec-agent\\active-response\\active-responses.log"
  440. elif platform.system() == 'Linux':
  441.     log_file = "/var/ossec/logs/active-responses.log"
  442. else:
  443.     log_file = "/Library/Ossec/logs/active-responses.log"
  444.  
  445. for subnet in subnets:
  446.     results = scan_subnet(subnet)
  447.     append_to_log(results, log_file)
  448.     time.sleep(2)
  449. 2.8: Convertir el Script en un Ejecutable
  450. Abrir PowerShell como administrador y usar pyinstaller para crear un ejecutable:
  451.  
  452. powershell
  453. Copiar código
  454. pip install pyinstaller
  455. pyinstaller -F "C:\Program Files (x86)\ossec-agent\nmapscan.py"
  456. Mover el archivo nmapscan.exe generado a C:\Program Files (x86)\ossec-agent\nmapscan.exe.
  457.  
  458. 2.9: Configurar el Agente Wazuh
  459. Editar el archivo ossec.conf:
  460.  
  461. powershell
  462. Copiar código
  463. notepad "C:\Program Files (x86)\ossec-agent\ossec.conf"
  464. Agregar el siguiente bloque dentro de <ossec_config>:
  465.  
  466. xml
  467. Copiar código
  468. <!-- Run nmap python script -->
  469. <localfile>
  470.   <log_format>full_command</log_format>
  471.   <command>C:\Program Files (x86)\ossec-agent\nmapscan.exe</command>
  472.   <frequency>604800</frequency>
  473. </localfile>
  474. Guardar y cerrar el archivo en Notepad.
  475.  
  476. 2.10: Reiniciar el Agente Wazuh
  477. Reiniciar el agente Wazuh:
  478.  
  479. powershell
  480. Copiar código
  481. Restart-Service -Name wazuh
  482. Con estos pasos, habrás configurado la integración de Nmap y ChatGPT con Wazuh tanto en el servidor como en los endpoints de manera detallada y organizada. Si tienes alguna duda o necesitas más detalles, no dudes en preguntar.
Add Comment
Please, Sign In to add comment