| ETTERFILTER(8) | System Manager's Manual | ETTERFILTER(8) |
نام (NAME)
etterfilter - کامپایلر فیلتر برای موتور فیلترسازی محتوای ettercap
خلاصه دستور (SYNOPSIS)
etterfilter [OPTIONS] FILE
توضیحات (DESCRIPTION)
ابزار etterfilter برای کامپایل فایلهای منبع فیلتر به فایلهای باینری فیلتر استفاده میشود که توسط مفسر JIT در موتور فیلترسازی ettercap(8) قابل تفسیر هستند. برای استفاده از اسکریپتهای فیلتر در ettercap، باید آنها را کامپایل کنید. تمامی خطاهای نحوی و تجزیه در زمان کامپایل بررسی میشوند، بنابراین مطمئن خواهید بود که یک فیلتر باینری صحیح برای ettercap تولید میکنید.
گزینهها (OPTIONS)
- گزینههای عمومی (GENERAL OPTIONS)
- -o, --output <FILE>
- میتوانید فایل خروجی را برای یک فایل منبع فیلتر مشخص کنید. بهطور پیشفرض، نام فایل خروجی filter.ef است.
- -t, --test <FILE>
- با این گزینه میتوانید یک فایل فیلتر کامپایلشده را تحلیل کنید. etterfilter تمامی دستورالعملهای موجود در آن را در قالبی خوانا برای انسان چاپ خواهد کرد. این ویژگی نوعی «دیساسمبلر» برای فایلهای باینری فیلتر محسوب میشود.
- -d, --debug
- هنگام کامپایل پیامهای اشکالزدایی را چاپ میکند. برای افزایش سطح اشکالزدایی میتوانید آن را بیش از یک بار به کار ببرید (مانند etterfilter -ddd ...).
- -w, --suppress-warnings
- در صورت بروز هشدار از برنامه خارج نشود. با استفاده از این گزینه، کامپایلر اسکریپت را حتی در صورت وجود هشدار کامپایل خواهد کرد.
- گزینههای استاندارد (STANDARD OPTIONS)
- -v, --version
- چاپ نسخه و خروج.
- -h, --help
- نمایش صفحه راهنما همراه با خلاصهای کوتاه از گزینههای موجود.
- نحو اسکریپتها (SCRIPTS SYNTAX)
- یک اسکریپت
ترکیبی از
دستورالعملها
است. این
اسکریپت
بهصورت
متوالی
اجرا
میشود و
میتوانید
با
عبارتهای
if
شاخهبندی
ایجاد کنید.
تنها
عبارتهای
if و if/else
پشتیبانی
میشوند و
هیچ
حلقهای
پیادهسازی
نشده است.
نحو آن
تقریباً
شبیه به کد
زبان C است،
به جز اینکه
باید
بلوکهای if
را حتی در
صورتی که
فقط شامل یک
دستورالعمل
باشند،
درون
آکولاد ({})
قرار دهید.
نکته: باید بین if و ( یک فاصله قرار دهید. نباید بین نام تابع و ( فاصله قرار داده شود.
مثال:
if (conditions) { }
func(args...);شرطهای یک عبارت if میتوانند توابع یا مقایسهها باشند. دو یا چند شرط را میتوان با عملگرهای منطقی مانند || (یا) و && (و) به یکدیگر متصل کرد.
مثال:
if (tcp.src == 21 && search(DATA.data, "ettercap")) {
}به تقدم عملگرها توجه فرمایید. نمیتوانید از پرانتز برای گروهبندی شرطها استفاده کنید، بنابراین در ترتیب آنها دقت داشته باشید. یک && در ابتدای یک بلوک شرطی، در صورتی که نادرست ارزیابی شود، تمام آزمونهای دیگر را رد خواهد کرد. تجزیه از چپ به راست انجام میشود، هنگامی که عملگری پیدا شود: اگر && باشد و شرط قبلی نادرست باشد، کل عبارت نادرست ارزیابی میشود؛ اگر || باشد، تجزیه حتی در صورت نادرست بودن شرط قبلی ادامه مییابد.
مثال:
if (ip.proto == UDP || ip.proto == TCP && tcp.src == 80) {
}if (ip.proto == TCP && tcp.src == 80 || ip.proto == UDP) {
}شرط نخست با تمام ترافیک udp یا http مطابقت خواهد داشت. دومی نادرست است، زیرا اگر بسته tcp نباشد، کل بلوک شرطی نادرست ارزیابی میشود. اگر میخواهید شرطهای پیچیده بسازید، بهترین روش تقسیم آنها به بلوکهای if تودرتو است.
از آنجا که etterfilter از هر دو خانواده نشانیهای IP پشتیبانی میکند، باید دقت کنید که آیا از ip.proto که مختص خانواده نشانی IPv4 است استفاده میکنید یا معادل IPv6 آن یعنی ipv6.nh. بهویژه برای تطبیق پروتکل L4 با استفاده از ip.proto و/یا ipv6.nh، باید دقت داشته باشید که آیا واقعاً روی پروتکل درست عمل میکنید یا خیر. این مورد باید با استفاده از شناسه پروتکل L3 یعنی eth.proto اعمال و تثبیت شود.
مثال:
if (eth.proto == IP && ip.proto == TCP && tcp.dst == 80 || tcp.src == 80) {
}if (eth.proto == IP6 && ipv6.nh == TCP && tcp.dst == 80 || tcp.src == 80) {
}if (tcp.dst == 80 || tcp.src == 80) {
}مثال اول ترافیک http را به درستی تنها روی IPv4 مطابقت میدهد، در حالی که مثال دوم ترافیک http را تنها روی IPv6 مطابقت خواهد داد. مثال سوم ترافیک http را بدون توجه به خانواده نشانی IP آن تطبیق میدهد.
هر دستورالعمل در یک بلوک باید با یک علامت نقطهویرگول (;) پایان یابد.
مقایسهها با عملگر == پیادهسازی شدهاند و میتوانند برای مقایسه اعداد، رشتهها یا نشانیهای ip استفاده شوند. یک نشانی ip حتماً باید داخل دو علامت نقلقول تکی قرار گیرد (مانند '192.168.0.7' یا '2001:db8::2'). همچنین میتوانید از عملگرهای «کوچکتر» (<)، «بزرگتر» (>)، «کوچکتر یا مساوی» (<=) و «بزرگتر یا مساوی» (>=) استفاده کنید. مقدار سمت چپ (lvalue) یک مقایسه باید یک آفست باشد (توضیحات بیشتر در ادامه).
مثال:
if (DATA.data + 20 == "ettercap" && ip.ttl > 16) {
}انتسابها با عملگر = پیادهسازی شدهاند و مقدار سمت چپ (lvalue) میتواند یک آفست باشد (توضیحات بیشتر در ادامه). مقدار سمت راست (rvalue) میتواند یک رشته، یک عدد صحیح یا یک مقدار هگزادسیمال باشد.
مثال:
ip.ttl = 0xff;
DATA.data + 7 = "ettercap NG";همچنین میتوانید از عملیات افزایش (inc) و کاهش (dec) روی فیلدهای بسته استفاده کنید. عملگرهای مورد استفاده += و -= هستند. مقدار سمت راست میتواند یک عدد صحیح یا یک مقدار هگزادسیمال باشد.
مثال:
ip.ttl += 5;مثالهای بیشتر را میتوانید در فایل etter.filter.examples بیابید.
- تعریف آفست (OFFSET DEFINITION)
- یک آفست با
یک
اشارهگر
مجازی مشخص
میشود. به
بیان
کوتاه، یک
آفست
اشارهگری
به بافر
بسته است.
اشارهگر
مجازی یک
چندتایی
سهگانه
بهصورت <L, O, S>
است، که در
آن L لایه iso/osi،
مقدار O
آفست در آن
لایه، و S
اندازه
اشارهگر
مجازی است.
شما
میتوانید
عملیات
جبری روی یک
اشارهگر
مجازی
انجام دهید
و نتیجه
همچنان یک
آفست خواهد
بود. مشخص
کردن 'vp + n' به
یک
اشارهگر
مجازی جدید
<L, O+n, S> منجر
میشود. این
کار کاملاً
مجاز است،
چرا که ما
آفست داخلی
آن لایه را
تغییر
دادهایم.
اشارهگرهای مجازی به شکل 'name.field.subfield' هستند. برای نمونه ip.ttl اشارهگر مجازی برای فیلد Time To Live در سرایند IP یک بسته است. این مقدار بهصورت <L=3, O=9, S=1> ترجمه خواهد شد؛ در واقع این نهمین بایت از لایه ۳ است و اندازه آن ۱ بایت میباشد. مقدار 'ip.ttl + 1' همانند ip.proto است، چرا که دهمین بایت از سرایند IP همان پروتکل کپسولهشده در بسته IP است. توجه داشته باشید از آنجا که etterfilter از پردازش IPv6 نیز پشتیبانی میکند، موارد ذکرشده در بالا تنها برای بستههای IPv4 اعمال میشود، در حالی که معادل آن در IPv6 مقدار ipv6.nh خواهد بود.
فهرست تمام اشارهگرهای مجازی پشتیبانیشده در فایل etterfilter.tbl قرار دارد. شما میتوانید با افزودن یک جدول جدید یا تغییر جداول موجود، اشارهگرهای مجازی سفارشی خود را اضافه کنید. برای نحو فایل etterfilter.tbl به توضیحات ابتدای آن فایل مراجعه کنید.
- توابع اسکریپتها (SCRIPTS FUNCTIONS)
- search(where, what)
- این تابع
رشته what را
در بافر where
جستجو
میکند. این
بافر
میتواند
DATA.data یا DECODED.data
باشد. اولی
بار داده در
لایه DATA (روی
پروتکل TCP یا UDP)
است
همانگونه
که روی سیم
شبکه منتقل
میشود، و
دومی بار
داده
رمزگشایی/کشف
رمز شده
توسط
تحلیلگرها
(dissectors) است.
بنابراین اگر میخواهید در یک اتصال SSH جستجو کنید، بهتر است از DECODED.data استفاده کنید، چرا که data رمزگذاری شده خواهد بود.
رشته what میتواند باینری باشد. در این حالت باید کاراکترهای آن را اسکیپ کنید.مثال:
search(DATA.data, "\x41\x42\x43") - regex(where, regex)
- این تابع در
صورتی که regex
با بافر where
تطبیق
داشته
باشد،
مقدار درست
(true)
برمیگرداند.
نکات
ذکرشده
درباره DECODED.data
و DATA.data برای
تابع search در
مورد تابع regex
نیز صادق
است.
نکته: تابع regex تنها میتواند روی بافر رشتهای استفاده شود.
مثال:
regex(DECODED.data, ".*login.*") - pcre_regex(where, pcre_regex ... )
- این تابع یک
عبارت منظم
سازگار با
پرل (Perl Compatible Regular Expression)
را ارزیابی
میکند. شما
میتوانید
هم با DATA و هم
با DECODED تطبیق
دهید، اما
اگر عبارت
شما بافر را
تغییر
میدهد،
منطقی است
که تنها روی
DATA عمل کند.
این تابع
بسته به
عملیاتی که
مد نظر
دارید، ۲ یا
۳ پارامتر
میپذیرد.
شکل دو
پارامتری
تنها برای
تطبیق یک
الگو
استفاده
میشود. شکل
سه
پارامتری
به این معنی
است که
میخواهید
یک
جایگزینی
انجام دهید.
در هر دو
حالت،
پارامتر
دوم رشته
جستجو است.
میتوانید از n$ در رشته جایگزین استفاده کنید. این متغیرهای موقت به گروههای ایجادشده در رشته جستجو ارجاع میدهند (برای مثال pcre_regex(DATA.data, "^var1=([:digit:]*)&var2=([:digit:]*)", "var1=$2&var2=$1") مقادیر var1 و var2 را جابهجا میکند).
نکته: پشتیبانی از pcre در ettercap اختیاری است و تنها در صورتی فعال خواهد شد که libpcre را نصب داشته باشید. کامپایلر در صورت تلاش شما برای کامپایل فیلتری که حاوی عبارات pcre است و libpcre را نصب ندارید، هشدار خواهد داد. برای نادیده گرفتن هشدار از گزینه -w استفاده کنید.مثال:
pcre_regex(DATA.data, ".*foo$")
pcre_regex(DATA.data, "([^ ]*) bar ([^ ]*)", "foo $1 $2") - replace(what, with)
- این تابع
رشته what را
با رشته with
جایگزین
میکند. این
رشتهها
میتوانند
رشته
باینری
باشند و
باید اسکیپ
شوند.
جایگزینی
همواره در
DATA.data انجام
میشود،
زیرا تنها
بار
دادهای
است که به
جلو
فرستاده
میشود.
بافر DECODED.data
تنها به
صورت داخلی
استفاده
میشود و
هرگز به
شبکه ارسال
نمیگردد.
مثال:
replace("ethercap", "ettercap")
replace("\x00\x00\xa2", "\x00\x01\xa2") - inject(what)
- این تابع
محتوای
فایل what را
بعد از
بستهای که
در حال
پردازش است
تزریق
میکند. این
تابع
همواره در
DATA.data تزریق را
انجام
میدهد.
میتوانید
از آن برای
جایگزین
کردن کل
بسته با یک
بسته جعلی
استفاده
کنید؛ به
این صورت که
دقیقاً قبل
از دستور inject()
از تابع drop()
استفاده
نمایید. در
این صورت،
موتور
فیلترسازی
بسته جاری
را دور
انداخته و
بسته جعلی
را تزریق
میکند.
همچنین
میتوانید
از تابع log()
برای ذخیره
بار داده یک
بسته
استفاده
کرده و از
آن به عنوان
فایل what جهت
ارسال با
تابع inject() بهره
ببرید.
مثال:
inject("./fake_packet") - log(what, where)
- این تابع
بافر what را
در فایل where
تخلیه و
ذخیره
میکند. هیچ
اطلاعاتی
در مورد
بسته ذخیره
نمیشود و
تنها بار
داده ذخیره
میگردد؛
بنابراین
شما جریان
داده را در
فایل
خواهید دید.
اگر
میخواهید
بستهها را
به روش
پیشرفتهتری
ثبت کنید،
باید از
گزینه -L در
ettercap استفاده
کرده و آن
را با etterlog(8)
تحلیل
نمایید.
فایل where باید برای کاربر EC_UID قابل نوشتن باشد (به etter.conf(5) مراجعه کنید).مثال:
log(DECODED.data, "/tmp/interesting.log") - msg(message)
- این تابع
پیامی را در
پنجره
پیامهای
کاربر (User Messages) به
کاربر
نمایش
میدهد. این
تابع برای
آگاه ساختن
کاربر از
اینکه یک
فیلتر خاص
موفقیتآمیز
بوده است یا
خیر،
کاربرد
دارد.
مثال:
msg("Packet filtered successfully") - drop()
- این تابع
بسته را با
عنوان «دور
انداخته
شود»
علامتگذاری
میکند. این
بسته به
مقصد واقعی
ارسال
نخواهد شد.
مثال:
drop() - kill()
- این تابع
اتصالی را
که بسته
تطبیقیافته
متعلق به آن
است از بین
میبرد (قطع
میکند).
اگر یک
اتصال TCP
باشد، یک RST
به هر دو
طرف اتصال
ارسال
میشود. اگر
یک اتصال UDP
باشد، یک
پیام ICMP PORT UNREACHABLE به
مبدأ بسته
فرستاده
میشود.
مثال:
kill() - exec(command)
- این تابع یک
دستور
پوسته را
اجرا
میکند. شما
باید مسیر
کامل دستور
را مشخص
کنید، زیرا
بدون هیچ
محیط
متغیری
اجرا
میشود. هیچ
راهی برای
تعیین
موفقیتآمیز
بودن یا
نبودن
دستور وجود
ندارد.
علاوه بر
این، از
آنجا که
توسط
فرآیند
اصلی منشعب
(fork) میشود،
به صورت
ناهمگام (asynchronous)
اجرا
میگردد.
مثال:
exec("/bin/cat /tmp/foo >> /tmp/bar") - execinject(command)
- این تابع
مشابه تابع
inject عمل
میکند، با
این تفاوت
که به جای
محتویات یک
فایل، از
خروجی یک
دستور
پوسته برای
تزریق داده
استفاده
میکند. این
تابع
همواره در
DATA.data تزریق
میکند.
میتوانید
از آن برای
جایگزین
کردن کل
بسته با یک
بسته جعلی
استفاده
کنید؛ به
این صورت که
دقیقاً قبل
از دستور execinject()
از تابع drop()
استفاده
نمایید. در
این صورت،
موتور
فیلترسازی
بسته جاری
را دور
انداخته و
بسته جعلی
را تزریق
میکند.
مثال:
execinject("/bin/cat /tmp/foo") - execreplace(command)
- این تابع
مشابه تابع
replace عمل
میکند، با
این تفاوت
که به جای
محتویات یک
فایل، از
خروجی یک
دستور
پوسته برای
جایگزینی
کل داده
استفاده
میکند.
تفاوت دیگر
این است که
محتوای
بسته اصلی
در stdin به
دستور
پوسته
تحویل داده
میشود. این
تابع
همواره در
DATA.data تزریق
میکند.
میتوانید
از آن برای
جایگزین
کردن کل
بسته با یک
بسته جعلی
بر اساس
بسته اصلی
استفاده
کنید.
مثال:
execreplace("tr A-Z a-z") - random(where, offset, length)
- این تابع به
تعداد length
بایت
تصادفی در
بافر where
تولید
میکند. اگر
length از بافر
در دسترس where
بیشتر شود،
length به صورت
خودکار
کوتاه
میشود. با
offset، شروع
بایتهای
تصادفی
میتواند
به جلو درون
بافر where
منتقل شود.
مقدار where
میتواند
DATA.data یا DECODED.data یا
هر
اشارهگر
مجازی
دیگری
مانند ip.src یا
tcp.dst باشد.
مثال:
random(DATA.data, 0, 16)
random(ipv6.src, 8, 8)مثال نخست، ۱۶ بایت اول بار داده (data) را با بایتهای تصادفی جایگزین میکند.
مثال دوم، بخش میزبان (۶۴ بیت پایانی) نشانی مبدأ IPv6 را با بایتهای تصادفی جایگزین میکند در حالی که بخش شبکه IPv6 دستنخورده باقی میماند. - exit()
- این تابع
باعث توقف
اجرای کد
توسط موتور
فیلتر
میشود. این
تابع برای
توقف اجرای
اسکریپت
تحت شرایط
خاصی که
توسط یک
عبارت 'if'
بررسی شده
مفید است.
مثال:
exit()
مثالها (EXAMPLES)
در اینجا چند مثال از نحوه استفاده از etterfilter آورده شده است.
- etterfilter filter.ecf -o filter.ef
-
کامپایل فایل منبع filter.ecf به یک فایل باینری filter.ef
نویسندگان اصلی (ORIGINAL AUTHORS)
Alberto Ornaghi (ALoR) <alor@users.sf.net>
Marco Valleri (NaGA) <naga@antifork.org>
مدیران پروژه (PROJECT STEWARDS)
Emilio Escobar (exfil) <eescobar@gmail.com>
Eric Milam (Brav0Hax) <jbrav.hax@gmail.com>
توسعهدهندگان رسمی (OFFICIAL DEVELOPERS)
Mike Ryan (justfalter) <falter@gmail.com>
Gianfranco Costamagna (LocutusOfBorg) <costamagnagianfranco@yahoo.it>
Antonio Collarino (sniper) <anto.collarino@gmail.com>
Ryan Linn <sussuro@happypacket.net>
Jacob Baines <baines.jacob@gmail.com>
مشارکتکنندگان (CONTRIBUTORS)
Dhiru Kholia (kholia) <dhiru@openwall.com>
Alexander Koeppe (koeppea) <format_c@online.de>
Martin Bos (PureHate) <purehate@backtrack.com>
Enrique Sanchez
Gisle Vanem <giva@bgnett.no>
Johannes Bauer <JohannesBauer@gmx.de>
Daten (Bryan Schneiders) <daten@dnetc.org>
همچنین ببینید (SEE ALSO)
etter.filter.examples
ettercap(8) etterlog(8) etter.conf(5)
ettercap_curses(8) ettercap_plugins(8)
ettercap-pkexec(8)
| ettercap 0.8.4.1 |