
0dAPI Documentazione Ufficiale
Inizia!
pip install zerodai==0.0.0.20
export zerodapi_key="TU_API_KEY"
Ottieni la tua api key https://zerodai.com Chat Conversazionale Semplice - Senza memoria
from zerodai import zerodai
import os
zerodai.api_auth(os.getenv("zerodapi_key"))
messages = []
while True:
prompt = input("> ")
if prompt == "exit":
break
messages.append({"role": "user", "content": prompt})
messages.append({"role": "system", "content": "Eres 0dAI un asistente de ciberseguridad cuya unica función es..."})
zerodai.inference(model="0dai70b", messages=messages, temperature=0.7, stream=True)
Zerodai è una libreria di elaborazione del linguaggio naturale orientata alla cybersecurity che mira ad automatizzare parzialmente processi basati sull'elaborazione umana di informazioni, ragionamento, pianificazione ed esecuzione. Cerchiamo di creare un framework di agenti per la cybersecurity con le seguenti capacità:
È il metodo base di interazione con il modello e dispone dei seguenti parametri. È importante che questi parametri siano appresi e compresi bene, poiché sono la base della libreria.
model: Il modello linguistico da utilizzare. I modelli disponibili sono:
0dai7b: Modello base con uso illimitato, veloce e perfetto per conversazioni semplici e assistenza nella programmazione. Difende bene in cybersecurity.
0dai8x7b: Modello flessibile con una finestra di contesto ampia, livello GPT-4 per quanto riguarda il codice, buono per domande e script complessi di cybersecurity.
0daifn: Modello raccomandato per function calls, il migliore per function calls, molto contesto, più leggero di 0dai70b, inoltre a livello di function calls multi-passo è al livello del miglior gpt
0dai70b (Raccomandato): Attualmente SOTA in cybersecurity, capace di complessi ragionamenti logici basati su molto contesto e di risolvere prove di pentesting in modo semi-autonomo. Dispone di function calls e può rispondere con messaggi strutturati. È il più lento ma offre un grande salto di qualità.
messages: I messaggi che verranno inviati al modello. Qui dobbiamo capire 3 ruoli:
I messaggi devono avere questo formato:
messages = [
{"role": "system", "content": """Eres 0dAI tu función es..."""},
{"role": "user", "content": "0dAI escribe un exploit en C"},
]
functions: Le funzioni che possono essere chiamate durante l'interazione. Entreremo più nel dettaglio sulle funzioni in fn_c. In questo caso, ci restituirà semplicemente il JSON.
Una funzione si dichiara così:
function_shodan = [ {
"name": "shodan_dork",
"description": "This tools is used to generate a shodan query",
"parameter_definitions": {
"dork": {
"type": "string",
"description": "The shodan dork",
"required": True
}
}
}, ]
temperature: Controlla la casualità delle risposte del modello. A temperatura più alta, più casualità; a temperatura più bassa, meno casualità.
stream (bool): Se trasmettere la risposta in tempo reale.
from zerodai import zerodai
messages = []
messages.append({"role": "user", "content": prompt})
messages.append({"role": "system", "content": "Eres 0dAI un asistente de ciberseguridad cuya unica función es..."})
zerodai.inference(model="0dai70b", messages=messages, temperature=0.7, stream=True)
In base a una funzione o a una lista di funzioni nel parametro function, il Modello sarà in grado di generare una risposta strutturata che possa servirci dopo un'inferenza: Funzione base
function_shodan = [ {
"name": "shodan_dork",
"description": "This tools is used to generate a shodan query",
"parameter_definitions": {
"dork": {
"type": "string",
"description": "The shodan dork",
"required": True
}
}
}, ]
Risposta del modello in base a questa funzione
[
{
"tool_name": "shodan_dork",
"parameters": {
"dork": "hacked-router-help-sos"
}
}
]
Queste funzioni possono essere multi-passo o no, lo definirà il numero di posizioni del JSON, una risposta multi-passo si presenta così
[
{
"tool_name": "shodan_dork",
"parameters": {
"dork": "hacked-router-help-sos"
}
},
{
"tool_name": "shodan_dork",
"parameters": {
"dork": "\"smb\" \"authentication: disabled\""
}
},
{
"tool_name": "shodan_dork",
"parameters": {
"dork": ".docuword_exploited.txt"
}
}
]
Può esistere anche una logica ricorsiva in termini di inferenza - funzione che si retroalimentano, immaginiamo questo caso
Funzione sottodomini
funcion_subdomains = [ {
"name": "subdominios",
"description": "This tools is used to collect domains to extract subdomains",
"parameter_definitions": {
"domain": {
"type": "string",
"description": "The domain",
"required": True
}
}
}, ]
Funzione crawler
crawler_endpoints = [ {
"name": "crawler",
"description": "This tools is used to crawle ndpoints for a host",
"parameter_definitions": {
"host": {
"type": "string",
"description": "The domain",
"required": True
}
}
}, ]
Input:
Devo ottenere i sottodomini di openai.com e omegaai.io
Output 1. Funzione:
[
{
"tool_name": "subdomains",
"parameters": {
"domain": "openai.com"
}
},
{
"tool_name": "subdomains",
"parameters": {
"domain": "omegaai.io"
}
},
]
Dopo aver estratto i sottodomini dall'input, applichiamo la nostra logica di esecuzione che sarebbe ottenere i sottodomini...
subdomain1.openai.com
subdomain2.openai.com
subdomain3.openai.com
subdomain1.omegaai.io
subdomain2.omegaai.io
subdomain3.omegaai.io
Dopo aver passato questo alla funzione del crawler sarebbe qualcosa come
Output 2. Funzione:
[
{
"tool_name": "crawler",
"parameters": {
"domain": "subdominio1.openai.com"
}
},
{
"tool_name": "crawler",
"parameters": {
"domain": "subdominio1.omegaai.io"
}
},
{
"tool_name": "crawler",
"parameters": {
"domain": "subdominio2.openai.com"
}
},
{
"tool_name": "crawler",
"parameters": {
"domain": "subdominio2.omegaai.io"
}
},
{
"tool_name": "crawler",
"parameters": {
"domain": "subdominio3.openai.com"
}
},
{
"tool_name": "crawler",
"parameters": {
"domain": "subdominio3.omegaai.io"
}
},
]
fn_c Ci permette di raccogliere i parametri e il nome del tool direttamente senza dover passare attraverso quella logica di filtraggio del JSON in sé
###UTILIZZO
from zerodai import zerodai
zerodai.api_auth("TU_API_KEY")
tool_name, parameters = zerodai.fn_c(model_fn=model_fn_call, messages=messages, functions=subdomain_functions, stream=stream, multistep=False)
print(tool_name)
print(parameters)
print(parameters["domain"])
Nota: Lo standard delle funzioni è solitamente OpenAI, per questo abbiamo progettato una funzione che converte le funzioni di OpenAI nel nostro formato proprietario, esempio:
tool_name, parameters = cls.fn_c(model_fn=model_fn_call, messages=messages, functions=OpenAI2CommandR(osint_funcs), stream=stream, multistep=False)
Zerodai include un sistema di agenti che può essere esteso tramite funzioni e un modulo di esecuzione
def exec_module(tool, arguments, multitool=True):
output = ""
if tool == "Shodan":
process = subprocess.Popen(["nmap", "-Pn", next(iter(arguments.values()))], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
for line in iter(process.stdout.readline, b''):
output += line.decode('utf-8').strip()
print(line.decode('utf-8').strip())
elif tool == "XSS-Scanner" or tool == "nuclei-http":
try:
process = subprocess.Popen(["nuclei", "-t", "dns", next(iter(arguments.values()))], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, cwd="/home/omegaleitatadmin/exllamav2/0dAPI/nuclei-templates/nuclei-templates-9.8.6/")
for line in iter(process.stdout.readline, b''):
output += line.decode('utf-8').strip()
print(line.decode('utf-8').strip())
except:
pass
elif tool == "WAF-tool":
process = subprocess.Popen(["python3", "whatwaf", "-u", "https://" + next(iter(arguments.values()))], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, cwd="/home/omegaleitatadmin/exllamav2/0dAPI/WhatWaf")
for line in iter(process.stdout.readline, b''):
output += line.decode('utf-8').strip()
print(line.decode('utf-8').strip())
elif tool == "Attack":
process = subprocess.Popen(["nmap", "-Pn", next(iter(arguments.values()))], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
for line in iter(process.stdout.readline, b''):
output += line.decode('utf-8').strip()
print(line.decode('utf-8').strip())
elif tool == "OSINT":
ZeroDAI.Osint(next(iter(arguments.values())))
return output
Questo codice deve andare di pari passo con le funzioni utilizzate
python_functions = [ {
"name": "Shodan",
"description": "tool for shodan",
"parameter_definitions": {
"ip": {
"type": "string",
"description": "The ip",
"required": True
}
}
},
{
"name": "nuclei-http",
"description": "This tools is use for nuclei",
"parameter_definitions": {
"target": {
"type": "string",
"description": "The domain",
"required": True
}
}
},
{
"name": "WAF-tool",
"description": "This tools is used for waf",
"parameter_definitions": {
"webapp": {
"type": "string",
"description": "The webapp",
"required": True
}
}
},
{
"name": "Attack",
"description": "This tools is used to attack a host",
"parameter_definitions": {
"host": {
"type": "string",
"description": "The domain",
"required": True
}
}
}, ]
Questo permette di creare agenti dinamici multi-passo e multi-strumento
###Utilizzo
zerodai.agent(model="0dai70b",
messages=messages,
model_fn_call="0daifn",
temperature=0.7,
functions=python_functions,
exec_module=exec_module,
exec_module_bool=True,
multistep=True)
exec_module-bool per indicare se vogliamo usare un modulo di esecuzione (Se impostiamo True e nessun modulo di esecuzione, ne eseguirà uno predefinito)
exec_module modulo di esecuzione
functions Funzioni in accordo con il modulo di esecuzione
multistep Se vogliamo che vengano eseguiti più passaggi in ogni iterazione del modello di function calls
##Prove di concetto
Questa API include integrazioni con shodan, vari servizi di dati, censys e molto altro, questi servizi richiedono solo l'API di 0dAI:
zerodai.Osint(prompt)
prompt - Semplice messaggio in linguaggio naturale affinché il LLM effettui una ricerca nelle nostre fonti private di fughe di dati e ti dia le fughe di un utente
zerodai.Osint(prompt)
prompt - Semplice messaggio in linguaggio naturale affinché il LLM effettui una ricerca su shodan e ti dia i risultati direttamente
zerodai.rubberducky_gen(prompt)
prompt - Semplice messaggio in linguaggio naturale affinché il LLM generi un payload valido di rubber ducky
Questa API è stata sviluppata interamente da Luijait (Luis Javier Navarrete Lozano) sotto 0dAI, se si utilizzano le conoscenze qui descritte in un altro paper è necessario dare crediti all'autore, come primo nome Luijait e come secondo 0dAI