.\" etterfilter -- کامپایلر فیلتر برای فایل‌های فیلتر ettercap .\" .\" This program is free software; you can redistribute it and/or modify .\" it under the terms of the GNU General Public License as published by .\" the Free Software Foundation; either version 2 of the License, or .\" (at your option) any later version. .\" .\" This program is distributed in the hope that it will be useful, .\" but WITHOUT ANY WARRANTY; without even the implied warranty of .\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the .\" GNU General Public License for more details. .\" .\" You should have received a copy of the GNU General Public License .\" along with this program; if not, write to the Free Software .\" Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. .\" .\" .de Sp .if n .sp .if t .sp 0.4 .. .TH ETTERFILTER "8" "" "ettercap 0.8.4.1" .SH "نام (NAME)" etterfilter \- کامپایلر فیلتر برای موتور فیلترسازی محتوای ettercap .SH "خلاصه دستور (SYNOPSIS)" .B etterfilter [\fIOPTIONS\fR] \fIFILE\fR .SH "توضیحات (DESCRIPTION)" ابزار etterfilter برای کامپایل فایل‌های منبع فیلتر به فایل‌های باینری فیلتر استفاده می‌شود که توسط مفسر JIT در موتور فیلترسازی ettercap(8) قابل تفسیر هستند. برای استفاده از اسکریپت‌های فیلتر در ettercap، باید آن‌ها را کامپایل کنید. تمامی خطاهای نحوی و تجزیه در زمان کامپایل بررسی می‌شوند، بنابراین مطمئن خواهید بود که یک فیلتر باینری صحیح برای ettercap تولید می‌کنید. .SH "گزینه‌ها (OPTIONS)" .TP .B "گزینه‌های عمومی (GENERAL OPTIONS)" .TP \fB\-o\fR, \fB\-\-output \fR می‌توانید فایل خروجی را برای یک فایل منبع فیلتر مشخص کنید. به‌طور پیش‌فرض، نام فایل خروجی filter.ef است. .TP \fB\-t\fR, \fB\-\-test \fR با این گزینه می‌توانید یک فایل فیلتر کامپایل‌شده را تحلیل کنید. etterfilter تمامی دستورالعمل‌های موجود در آن را در قالبی خوانا برای انسان چاپ خواهد کرد. این ویژگی نوعی «دیس‌اسمبلر» برای فایل‌های باینری فیلتر محسوب می‌شود. .TP \fB\-d\fR, \fB\-\-debug\fR هنگام کامپایل پیام‌های اشکال‌زدایی را چاپ می‌کند. برای افزایش سطح اشکال‌زدایی می‌توانید آن را بیش از یک بار به کار ببرید (مانند etterfilter \-ddd ...). .TP \fB\-w\fR, \fB\-\-suppress\-warnings\fR در صورت بروز هشدار از برنامه خارج نشود. با استفاده از این گزینه، کامپایلر اسکریپت را حتی در صورت وجود هشدار کامپایل خواهد کرد. .TP .B "گزینه‌های استاندارد (STANDARD OPTIONS)" .TP \fB\-v\fR, \fB\-\-version\fR چاپ نسخه و خروج. .TP \fB\-h\fR, \fB\-\-help\fR نمایش صفحه راهنما همراه با خلاصه‌ای کوتاه از گزینه‌های موجود. .TP .B "نحو اسکریپت‌ها (SCRIPTS SYNTAX)" یک اسکریپت ترکیبی از دستورالعمل‌ها است. این اسکریپت به‌صورت متوالی اجرا می‌شود و می‌توانید با عبارت‌های .B if شاخه‌بندی ایجاد کنید. تنها عبارت‌های .B if و .B if/else پشتیبانی می‌شوند و هیچ حلقه‌ای پیاده‌سازی نشده است. نحو آن تقریباً شبیه به کد زبان C است، به جز اینکه باید بلوک‌های .B if را حتی در صورتی که فقط شامل یک دستورالعمل باشند، درون آکولاد .RB ( { } ) قرار دهید. .Sp نکته: باید بین .B if و .B ( یک فاصله قرار دهید. نباید بین نام تابع و .B ( فاصله قرار داده شود. .Sp مثال: .br if (conditions) { } .br func(args...); .Sp شرط‌های یک عبارت .B if می‌توانند توابع یا مقایسه‌ها باشند. دو یا چند شرط را می‌توان با عملگرهای منطقی مانند .B || (یا) و .B && (و) به یکدیگر متصل کرد. .Sp مثال: .br if (tcp.src == 21 && search(DATA.data, "ettercap")) { .br } .Sp به تقدم عملگرها توجه فرمایید. نمی‌توانید از پرانتز برای گروه‌بندی شرط‌ها استفاده کنید، بنابراین در ترتیب آن‌ها دقت داشته باشید. یک .B && در ابتدای یک بلوک شرطی، در صورتی که نادرست ارزیابی شود، تمام آزمون‌های دیگر را رد خواهد کرد. تجزیه از چپ به راست انجام می‌شود، هنگامی که عملگری پیدا شود: اگر .B && باشد و شرط قبلی نادرست باشد، کل عبارت نادرست ارزیابی می‌شود؛ اگر .B || باشد، تجزیه حتی در صورت نادرست بودن شرط قبلی ادامه می‌یابد. .Sp مثال: .br if (ip.proto == UDP || ip.proto == TCP && tcp.src == 80) { .br } .Sp if (ip.proto == TCP && tcp.src == 80 || ip.proto == UDP) { .br } .Sp شرط نخست با تمام ترافیک udp یا http مطابقت خواهد داشت. دومی نادرست است، زیرا اگر بسته tcp نباشد، کل بلوک شرطی نادرست ارزیابی می‌شود. اگر می‌خواهید شرط‌های پیچیده بسازید، بهترین روش تقسیم آن‌ها به بلوک‌های .B if تودرتو است. .Sp از آنجا که etterfilter از هر دو خانواده نشانی‌های IP پشتیبانی می‌کند، باید دقت کنید که آیا از .B ip.proto که مختص خانواده نشانی IPv4 است استفاده می‌کنید یا معادل IPv6 آن یعنی .BR ipv6.nh . به‌ویژه برای تطبیق پروتکل L4 با استفاده از .B ip.proto و/یا .BR ipv6.nh ، باید دقت داشته باشید که آیا واقعاً روی پروتکل درست عمل می‌کنید یا خیر. این مورد باید با استفاده از شناسه پروتکل L3 یعنی .B eth.proto اعمال و تثبیت شود. .Sp مثال: .br if (eth.proto == IP && ip.proto == TCP && tcp.dst == 80 || tcp.src == 80) { .br } .Sp if (eth.proto == IP6 && ipv6.nh == TCP && tcp.dst == 80 || tcp.src == 80) { .br } .Sp if (tcp.dst == 80 || tcp.src == 80) { .br } .Sp مثال اول ترافیک http را به درستی تنها روی IPv4 مطابقت می‌دهد، در حالی که مثال دوم ترافیک http را تنها روی IPv6 مطابقت خواهد داد. مثال سوم ترافیک http را بدون توجه به خانواده نشانی IP آن تطبیق می‌دهد. .Sp هر دستورالعمل در یک بلوک باید با یک علامت نقطه‌ویرگول .RB ( ; ) پایان یابد. .Sp مقایسه‌ها با عملگر .B == پیاده‌سازی شده‌اند و می‌توانند برای مقایسه اعداد، رشته‌ها یا نشانی‌های ip استفاده شوند. یک نشانی ip حتماً باید داخل دو علامت نقل‌قول تکی قرار گیرد (مانند '192.168.0.7' یا '2001:db8::2'). همچنین می‌توانید از عملگرهای «کوچک‌تر» .RB ( < )، «بزرگ‌تر» .RB ( > )، «کوچک‌تر یا مساوی» .RB ( <= ) و «بزرگ‌تر یا مساوی» .RB ( >= ) استفاده کنید. مقدار سمت چپ (lvalue) یک مقایسه باید یک آفست باشد (توضیحات بیشتر در ادامه). .Sp مثال: .br if (DATA.data + 20 == "ettercap" && ip.ttl > 16) { .br } .Sp انتساب‌ها با عملگر .B = پیاده‌سازی شده‌اند و مقدار سمت چپ (lvalue) می‌تواند یک آفست باشد (توضیحات بیشتر در ادامه). مقدار سمت راست (rvalue) می‌تواند یک رشته، یک عدد صحیح یا یک مقدار هگزادسیمال باشد. .Sp مثال: .br ip.ttl = 0xff; .br DATA.data + 7 = "ettercap NG"; .Sp همچنین می‌توانید از عملیات افزایش (inc) و کاهش (dec) روی فیلدهای بسته استفاده کنید. عملگرهای مورد استفاده .B += و .B \-= هستند. مقدار سمت راست می‌تواند یک عدد صحیح یا یک مقدار هگزادسیمال باشد. .Sp مثال: .br ip.ttl += 5; مثال‌های بیشتر را می‌توانید در فایل etter.filter.examples بیابید. .TP .B "تعریف آفست (OFFSET DEFINITION)" یک آفست با یک اشاره‌گر مجازی مشخص می‌شود. به بیان کوتاه، یک آفست اشاره‌گری به بافر بسته است. اشاره‌گر مجازی یک چندتایی سه‌گانه به‌صورت است، که در آن L لایه iso/osi، مقدار O آفست در آن لایه، و S اندازه اشاره‌گر مجازی است. شما می‌توانید عملیات جبری روی یک اشاره‌گر مجازی انجام دهید و نتیجه همچنان یک آفست خواهد بود. مشخص کردن 'vp + n' به یک اشاره‌گر مجازی جدید منجر می‌شود. این کار کاملاً مجاز است، چرا که ما آفست داخلی آن لایه را تغییر داده‌ایم. .Sp اشاره‌گرهای مجازی به شکل 'name.field.subfield' هستند. برای نمونه .B ip.ttl اشاره‌گر مجازی برای فیلد Time To Live در سرایند IP یک بسته است. این مقدار به‌صورت ترجمه خواهد شد؛ در واقع این نهمین بایت از لایه ۳ است و اندازه آن ۱ بایت می‌باشد. مقدار 'ip.ttl + 1' همانند .B ip.proto است، چرا که دهمین بایت از سرایند IP همان پروتکل کپسوله‌شده در بسته IP است. توجه داشته باشید از آنجا که etterfilter از پردازش IPv6 نیز پشتیبانی می‌کند، موارد ذکرشده در بالا تنها برای بسته‌های IPv4 اعمال می‌شود، در حالی که معادل آن در IPv6 مقدار .B ipv6.nh خواهد بود. .Sp فهرست تمام اشاره‌گرهای مجازی پشتیبانی‌شده در فایل etterfilter.tbl قرار دارد. شما می‌توانید با افزودن یک جدول جدید یا تغییر جداول موجود، اشاره‌گرهای مجازی سفارشی خود را اضافه کنید. برای نحو فایل etterfilter.tbl به توضیحات ابتدای آن فایل مراجعه کنید. .TP .B "توابع اسکریپت‌ها (SCRIPTS FUNCTIONS)" .TP .B search(\fIwhere\fR, \fIwhat\fR) این تابع رشته .I what را در بافر .I where جستجو می‌کند. این بافر می‌تواند .B DATA.data یا .B DECODED.data باشد. اولی بار داده در لایه DATA (روی پروتکل TCP یا UDP) است همان‌گونه که روی سیم شبکه منتقل می‌شود، و دومی بار داده رمزگشایی/کشف رمز شده توسط تحلیل‌گرها (dissectors) است. .br بنابراین اگر می‌خواهید در یک اتصال SSH جستجو کنید، بهتر است از .B DECODED.data استفاده کنید، چرا که .B data رمزگذاری شده خواهد بود. .br رشته .I what می‌تواند باینری باشد. در این حالت باید کاراکترهای آن را اسکیپ کنید. .Sp مثال: .br search(DATA.data, "\\x41\\x42\\x43") .TP .B regex(\fIwhere\fR, \fIregex\fR) این تابع در صورتی که .I regex با بافر .I where تطبیق داشته باشد، مقدار درست (true) برمی‌گرداند. نکات ذکرشده درباره .B DECODED.data و .B DATA.data برای تابع search در مورد تابع regex نیز صادق است. .Sp نکته: تابع regex تنها می‌تواند روی بافر رشته‌ای استفاده شود. .Sp مثال: .br regex(DECODED.data, ".*login.*") .TP .B pcre_regex(\fIwhere\fR, \fIpcre_regex\fR ... ) این تابع یک عبارت منظم سازگار با پرل (Perl Compatible Regular Expression) را ارزیابی می‌کند. شما می‌توانید هم با DATA و هم با DECODED تطبیق دهید، اما اگر عبارت شما بافر را تغییر می‌دهد، منطقی است که تنها روی DATA عمل کند. این تابع بسته به عملیاتی که مد نظر دارید، ۲ یا ۳ پارامتر می‌پذیرد. شکل دو پارامتری تنها برای تطبیق یک الگو استفاده می‌شود. شکل سه پارامتری به این معنی است که می‌خواهید یک جایگزینی انجام دهید. در هر دو حالت، پارامتر دوم رشته جستجو است. .br می‌توانید از n$ در رشته جایگزین استفاده کنید. این متغیرهای موقت به گروه‌های ایجادشده در رشته جستجو ارجاع می‌دهند (برای مثال pcre_regex(DATA.data, "^var1=([:digit:]*)&var2=([:digit:]*)", "var1=$2&var2=$1") مقادیر var1 و var2 را جابه‌جا می‌کند). .br نکته: پشتیبانی از pcre در ettercap اختیاری است و تنها در صورتی فعال خواهد شد که libpcre را نصب داشته باشید. کامپایلر در صورت تلاش شما برای کامپایل فیلتری که حاوی عبارات pcre است و libpcre را نصب ندارید، هشدار خواهد داد. برای نادیده گرفتن هشدار از گزینه .B \-w استفاده کنید. .Sp مثال: .br pcre_regex(DATA.data, ".*foo$") .br pcre_regex(DATA.data, "([^ ]*) bar ([^ ]*)", "foo $1 $2") .TP .B replace(\fIwhat\fR, \fIwith\fR) این تابع رشته .I what را با رشته .I with جایگزین می‌کند. این رشته‌ها می‌توانند رشته باینری باشند و باید اسکیپ شوند. جایگزینی همواره در .B DATA.data انجام می‌شود، زیرا تنها بار داده‌ای است که به جلو فرستاده می‌شود. بافر .B DECODED.data تنها به صورت داخلی استفاده می‌شود و هرگز به شبکه ارسال نمی‌گردد. .Sp مثال: .br replace("ethercap", "ettercap") .br replace("\\x00\\x00\\xa2", "\\x00\\x01\\xa2") .TP .B inject(\fIwhat\fR) این تابع محتوای فایل .I what را بعد از بسته‌ای که در حال پردازش است تزریق می‌کند. این تابع همواره در .B DATA.data تزریق را انجام می‌دهد. می‌توانید از آن برای جایگزین کردن کل بسته با یک بسته جعلی استفاده کنید؛ به این صورت که دقیقاً قبل از دستور inject() از تابع drop() استفاده نمایید. در این صورت، موتور فیلترسازی بسته جاری را دور انداخته و بسته جعلی را تزریق می‌کند. همچنین می‌توانید از تابع log() برای ذخیره بار داده یک بسته استفاده کرده و از آن به عنوان فایل .I what جهت ارسال با تابع inject() بهره ببرید. .Sp مثال: .br inject("./fake_packet") .TP .B log(\fIwhat\fR, \fIwhere\fR) این تابع بافر .I what را در فایل .I where تخلیه و ذخیره می‌کند. هیچ اطلاعاتی در مورد بسته ذخیره نمی‌شود و تنها بار داده ذخیره می‌گردد؛ بنابراین شما جریان داده را در فایل خواهید دید. اگر می‌خواهید بسته‌ها را به روش پیشرفته‌تری ثبت کنید، باید از گزینه .B \-L در ettercap استفاده کرده و آن را با etterlog(8) تحلیل نمایید. .br فایل .I where باید برای کاربر EC_UID قابل نوشتن باشد (به etter.conf(5) مراجعه کنید). .Sp مثال: .br log(DECODED.data, "/tmp/interesting.log") .TP .B msg(\fImessage\fR) این تابع پیامی را در پنجره پیام‌های کاربر (User Messages) به کاربر نمایش می‌دهد. این تابع برای آگاه ساختن کاربر از اینکه یک فیلتر خاص موفقیت‌آمیز بوده است یا خیر، کاربرد دارد. .Sp مثال: .br msg("Packet filtered successfully") .TP .B drop() این تابع بسته را با عنوان «دور انداخته شود» علامت‌گذاری می‌کند. این بسته به مقصد واقعی ارسال نخواهد شد. .Sp مثال: .br drop() .TP .B kill() این تابع اتصالی را که بسته تطبیق‌یافته متعلق به آن است از بین می‌برد (قطع می‌کند). اگر یک اتصال TCP باشد، یک RST به هر دو طرف اتصال ارسال می‌شود. اگر یک اتصال UDP باشد، یک پیام ICMP PORT UNREACHABLE به مبدأ بسته فرستاده می‌شود. .Sp مثال: .br kill() .TP .B exec(\fIcommand\fR) این تابع یک دستور پوسته را اجرا می‌کند. شما باید مسیر کامل دستور را مشخص کنید، زیرا بدون هیچ محیط متغیری اجرا می‌شود. هیچ راهی برای تعیین موفقیت‌آمیز بودن یا نبودن دستور وجود ندارد. علاوه بر این، از آنجا که توسط فرآیند اصلی منشعب (fork) می‌شود، به صورت ناهمگام (asynchronous) اجرا می‌گردد. .Sp مثال: .br exec("/bin/cat /tmp/foo >> /tmp/bar") .TP .B execinject(\fIcommand\fR) این تابع مشابه تابع .B inject عمل می‌کند، با این تفاوت که به جای محتویات یک فایل، از خروجی یک دستور پوسته برای تزریق داده استفاده می‌کند. این تابع همواره در .B DATA.data تزریق می‌کند. می‌توانید از آن برای جایگزین کردن کل بسته با یک بسته جعلی استفاده کنید؛ به این صورت که دقیقاً قبل از دستور execinject() از تابع drop() استفاده نمایید. در این صورت، موتور فیلترسازی بسته جاری را دور انداخته و بسته جعلی را تزریق می‌کند. .Sp مثال: .br execinject("/bin/cat /tmp/foo") .TP .B execreplace(\fIcommand\fR) این تابع مشابه تابع .B replace عمل می‌کند، با این تفاوت که به جای محتویات یک فایل، از خروجی یک دستور پوسته برای جایگزینی کل داده استفاده می‌کند. تفاوت دیگر این است که محتوای بسته اصلی در stdin به دستور پوسته تحویل داده می‌شود. این تابع همواره در .B DATA.data تزریق می‌کند. می‌توانید از آن برای جایگزین کردن کل بسته با یک بسته جعلی بر اساس بسته اصلی استفاده کنید. .Sp مثال: .br execreplace("tr A-Z a-z") .TP .B random(\fIwhere\fR, \fIoffset\fR, \fIlength\fR) این تابع به تعداد \fBlength\fR بایت تصادفی در بافر \fBwhere\fR تولید می‌کند. اگر \fBlength\fR از بافر در دسترس \fBwhere\fR بیشتر شود، \fBlength\fR به صورت خودکار کوتاه می‌شود. با \fBoffset\fR، شروع بایت‌های تصادفی می‌تواند به جلو درون بافر \fBwhere\fR منتقل شود. مقدار \fBwhere\fR می‌تواند \fIDATA.data\fR یا \fIDECODED.data\fR یا هر اشاره‌گر مجازی دیگری مانند \fIip.src\fR یا \fItcp.dst\fR باشد. .Sp مثال: .br random(DATA.data, 0, 16) .br random(ipv6.src, 8, 8) .Sp مثال نخست، ۱۶ بایت اول بار داده (data) را با بایت‌های تصادفی جایگزین می‌کند. .br مثال دوم، بخش میزبان (۶۴ بیت پایانی) نشانی مبدأ IPv6 را با بایت‌های تصادفی جایگزین می‌کند در حالی که بخش شبکه IPv6 دست‌نخورده باقی می‌ماند. .TP .B exit() این تابع باعث توقف اجرای کد توسط موتور فیلتر می‌شود. این تابع برای توقف اجرای اسکریپت تحت شرایط خاصی که توسط یک عبارت 'if' بررسی شده مفید است. .Sp مثال: .br exit() .SH "مثال‌ها (EXAMPLES)" در اینجا چند مثال از نحوه استفاده از etterfilter آورده شده است. .TP .B etterfilter filter.ecf \-o filter.ef .Sp کامپایل فایل منبع filter.ecf به یک فایل باینری filter.ef .SH "نویسندگان اصلی (ORIGINAL AUTHORS)" Alberto Ornaghi (ALoR) .br Marco Valleri (NaGA) .SH "مدیران پروژه (PROJECT STEWARDS)" Emilio Escobar (exfil) .br Eric Milam (Brav0Hax) .SH "توسعه‌دهندگان رسمی (OFFICIAL DEVELOPERS)" Mike Ryan (justfalter) .br Gianfranco Costamagna (LocutusOfBorg) .br Antonio Collarino (sniper) .br Ryan Linn .br Jacob Baines .SH "مشارکت‌کنندگان (CONTRIBUTORS)" Dhiru Kholia (kholia) .br Alexander Koeppe (koeppea) .br Martin Bos (PureHate) .br Enrique Sanchez .br Gisle Vanem .br Johannes Bauer .br Daten (Bryan Schneiders) .SH "همچنین ببینید (SEE ALSO)" .I "etter.filter.examples" .br .I "ettercap(8)" .I "etterlog(8)" .I "etter.conf(5)" .I "ettercap_curses(8)" .I "ettercap_plugins(8)" .I "ettercap\-pkexec(8)" .LP