
0dAPI Официальная документация
Начинаем!
pip install zerodai==0.0.0.20
export zerodapi_key="TU_API_KEY"
Получите свой api key https://zerodai.com Простой разговорный чат - без памяти
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 — это библиотека обработки естественного языка, ориентированная на кибербезопасность, которая стремится частично автоматизировать процессы, основанные на человеческой обработке информации, рассуждении, планировании и выполнении. Мы стремимся создать фреймворк агентов для кибербезопасности со следующими возможностями:
Это основной метод взаимодействия с моделью, который имеет следующие параметры. Важно хорошо изучить и понять эти параметры, так как они являются основой библиотеки.
model: Языковая модель для использования. Доступные модели:
0dai7b: Базовая модель с неограниченным использованием, быстрая, отлично подходит для простых разговоров и помощи в программировании. Хорошо справляется с задачами кибербезопасности.
0dai8x7b: Гибкая модель с большим окном контекста, на уровне GPT-4 в коде, хороша для сложных вопросов и сценариев кибербезопасности.
0daifn: Рекомендуемая модель для function calls, лучшая в этой области, много контекста, легче чем 0dai70b, а также по многошаговым function calls на уровне лучшего GPT.
0dai70b (Рекомендуется): В настоящее время SOTA в кибербезопасности, способен выполнять сложные логические рассуждения на основе большого контекста и полуавтономно решать задачи пентеста. Имеет function calls и может отвечать структурированными сообщениями. Самый медленный, но предлагает огромный скачок качества.
messages: Сообщения, которые будут отправлены модели. Здесь необходимо понять 3 роли:
Сообщения должны быть в этом формате:
messages = [
{"role": "system", "content": """Eres 0dAI tu función es..."""},
{"role": "user", "content": "0dAI escribe un exploit en C"},
]
functions: Функции, которые могут быть вызваны во время взаимодействия. Мы подробнее рассмотрим функции в разделе fn_c. В данном случае это просто даст нам JSON.
Функция объявляется так:
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: Управляет случайностью ответов модели. Чем выше температура, тем больше случайности; чем ниже, тем меньше случайности.
stream (bool): Следует ли передавать ответ в реальном времени.
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)
На основе функции или списка функций в параметре function Модель сможет сгенерировать структурированный ответ, который может быть полезен после инференса: Базовая функция
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
}
}
}, ]
Ответ модели на основе этой функции
[
{
"tool_name": "shodan_dork",
"parameters": {
"dork": "hacked-router-help-sos"
}
}
]
Эти функции могут быть как многошаговыми, так и нет; это определяется количеством позиций в JSON. Многошаговый ответ выглядит так:
[
{
"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"
}
}
]
Также может существовать рекурсивная логика, где инференс и функция взаимно дополняют друг друга. Представим такой случай:
Функция subdominios (субдомены)
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
}
}
}, ]
Функция 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:
Нужно получить субдомены openai.com и omegaai.io
Output 1. Функция:
[
{
"tool_name": "subdomains",
"parameters": {
"domain": "openai.com"
}
},
{
"tool_name": "subdomains",
"parameters": {
"domain": "omegaai.io"
}
},
]
После извлечения субдоменов из input применяется наша логика выполнения: получаем субдомены...
subdomain1.openai.com
subdomain2.openai.com
subdomain3.openai.com
subdomain1.omegaai.io
subdomain2.omegaai.io
subdomain3.omegaai.io
После передачи этого в функцию краулера будет примерно так:
Output 2. Функция:
[
{
"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 Позволяет нам собирать параметры и имя инструмента напрямую, без необходимости проходить через логику фильтрации самого JSON.
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"])
Примечание: Стандарт функций обычно — OpenAI; для этого мы разработали функцию, которая преобразует функции OpenAI в наш собственный формат, например:
tool_name, parameters = cls.fn_c(model_fn=model_fn_call, messages=messages, functions=OpenAI2CommandR(osint_funcs), stream=stream, multistep=False)
Zerodai включает систему агентов, которую можно расширять с помощью функций и модуля выполнения:
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
Этот код должен идти вместе с используемыми функциями:
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
}
}
}, ]
Это позволяет создавать динамические многошаговые и мультиинструментальные агенты.
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 — указывает, хотим ли мы использовать модуль выполнения (если установлено True, а модуля выполнения нет, выполнится модуль по умолчанию).
exec_module — модуль выполнения.
functions — функции, соответствующие модулю выполнения.
multistep — хотим ли мы выполнять несколько шагов на каждой итерации модели function calls.
Этот API включает интеграции с shodan, различными сервисами данных, censys и многим другим; эти сервисы требуют только API от 0dAI:
zerodai.Osint(prompt)
prompt — Простое сообщение на естественном языке для LLM, чтобы выполнить поиск в наших частных источниках утечек данных и предоставить утечки по пользователю.
zerodai.Osint(prompt)
prompt — Простое сообщение на естественном языке для LLM, чтобы выполнить поиск в shodan и напрямую получить результаты.
zerodai.rubberducky_gen(prompt)
prompt — Простое сообщение на естественном языке для LLM, чтобы сгенерировать валидную нагрузку для rubber ducky.
Этот API полностью разработан Luijait (Луис Хавьер Наваррете Лосано) под брендом 0dAI. Если знания, описанные здесь, используются в другой работе, необходимо указать авторство: первым именем Luijait, вторым — 0dAI.