
0dAPI الوثائق الرسمية
ابدأ!
pip install zerodai==0.0.0.20
export zerodapi_key="TU_API_KEY"
احصل على مفتاح API الخاص بك 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: النموذج الموصى به لاستدعاءات الدوال، الأفضل في استدعاءات الدوال مع سياق كبير، أخف من 0dai70b، بالإضافة إلى أنه على مستوى استدعاءات الدوال متعددة الخطوات فهو على مستوى أفضل GPT.
0dai70b (موصى به): حاليًا الأفضل (SOTA) في الأمن السيبراني، قادر على إجراء استدلالات منطقية معقدة بناءً على سياق كبير وحل اختبارات الاختراق بشكل شبه مستقل. يحتوي على استدعاءات دالة ويمكنه الرد برسائل منظمة. وهو الأبطأ ولكنه يوفر قفزة كبيرة في الجودة.
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"
}
}
]
يمكن أن يوجد أيضًا منطق تكراري بين الاستدلال والدالة يغذيان بعضهما البعض، تخيل هذه الحالة
دالة النطاقات الفرعية
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_endpoints = [ {
"name": "crawler",
"description": "This tools is used to crawle ndpoints for a host",
"parameter_definitions": {
"host": {
"type": "string",
"description": "The domain",
"required": True
}
}
}, ]
المدخل:
أحتاج الحصول على النطاقات الفرعية لـ openai.com و omegaai.io
المخرج 1. الدالة:
[
{
"tool_name": "subdomains",
"parameters": {
"domain": "openai.com"
}
},
{
"tool_name": "subdomains",
"parameters": {
"domain": "omegaai.io"
}
},
]
بعد استخراج النطاقات الفرعية من المدخل، نطبق منطق التنفيذ الخاص بنا والذي سيكون الحصول على النطاقات الفرعية...
subdomain1.openai.com
subdomain2.openai.com
subdomain3.openai.com
subdomain1.omegaai.io
subdomain2.omegaai.io
subdomain3.omegaai.io
بعد تمرير هذا إلى دالة الزاحف سيكون شيئًا مثل
المخرج 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 إذا كنا نريد تنفيذ عدة خطوات في كل تكرار لنموذج استدعاءات الدوال
##إثباتات المفهوم
تأتي هذه الـ 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 (Luis Javier Navarrete Lozano) تحت 0dAI، إذا تم استخدام المعرفة الموصوفة هنا في ورقة أخرى، فيجب إعطاء الفضل للمؤلف، باسم أول Luijait وثانيًا 0dAI