الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

كيف أستفيد من DNS في حجب موقع بناء على hostname

بدأه zaraki_kenpache في 20 أغسطس 2012 · 8 رد · 2,659 مشاهدة · في Microsoft Visual C#.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام و عليكم

وعيد مبارك

انا برمجت جدار ناري بلغة سى شارب وهو من نوع فيلتر حسب IP باستخدام winpkflt ومكتباتها ndisapi.lib و ndisapi.dll

ومشكلتي هي اذا ارد منع الوصول او الاستلام من موقع على كتابة IP يدويا

وبرنامجي يعرض جميع IP لكل حزمة مرسلة او مستلمة

كيف ادخل اسم الموقع بدلا من IP

المطلوب:كود يرسل اسم الموقع الى DNS ويرجع ب ال IP الخاص يالموقع وبلعكس

وبعد الانتعاء من البرنامج إن شاء الله سوف اعمل كتاب لشرح كيفية صنع جدار ناري وذلك لعدم وجود مصادر عربية وعدم امكانية السي شارب لاغراض امنية للويندوز من الوصول الى الحزم والسيطرة على مرورها ومنعها وتغيير معلوماتها

وهذه صورة عن البرنامج وهو يعمل

post-257301-007600000 1345421357_thumb.p

المرفقات
firewall.png
#2

جميل، بانتظار قراءة some source codes :)

راجع هذه الروابط، فيها معلومات واضحة عن كيفية الاستعلام من DNS server:

http://social.msdn.m...01-d7bbfc64ed1c

http://www.codeproje...query-component

ليس عليك أن تحدد من هو الـ DNS server

في حال وجود DNS محلي، سيرسل الطلب إليه، فإن كان الـ DNS المحلي يملك عنوان لهذا الاسم المطلوب أعاده لك، وإلا، يرسله تلقائياً إلى الـ DNS الأعلى منه (parent) في الشجرة.. وهكذا.

بالنهاية ستحصل على عنوان IP

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#3
Xacker كتب:

جميل، بانتظار قراءة some source codes :)

راجع هذه الروابط، فيها معلومات واضحة عن كيفية الاستعلام من DNS server:

http://social.msdn.m...01-d7bbfc64ed1c

http://www.codeproje...query-component

ليس عليك أن تحدد من هو الـ DNS server

في حال وجود DNS محلي، سيرسل الطلب إليه، فإن كان الـ DNS المحلي يملك عنوان لهذا الاسم المطلوب أعاده لك، وإلا، يرسله تلقائياً إلى الـ DNS الأعلى منه (parent) في الشجرة.. وهكذا.

بالنهاية ستحصل على عنوان IP

شكرا اخي على الاهتمام

بالنسبة لكودبروجيكت البرنامج ما يشتغل والكود يحتوي اكثر من عشرين ملف cs يعني صعب

وبالنسبة ل msdn الكود شغال ويستلم IP حسب الاسم ولكن المشكلة بلعكس عندما اطلب الاسم حسب الاي بي لا يعطيني متماثل لما موجود

مثلا انضر الى صورة رقم 1 و2

يطلب الاي بي لهذا المنتدى وعند استرجاع الاسم حسب الاي بي يعطيني http://d.1a.de.static.xlhost.com/ بدلا من وهو نفس الموقع اذا طلبته

وبعض المواقع يكون متماثل انظر الى صورة رقم 2 عند طلب لفيسبوك

وهذه مشكلة ساواجهها عند المقارنة اي حلول وجزاكم الله خيرا

post-257301-047342600 1345466011_thumb.p

post-257301-070222300 1345466025_thumb.p

المرفقات
ip.pngip2.png

تم تعديل هذه المشاركة بواسطة zaraki_kenpache في 20 أغسطس 2012 في 15:36

#4

للأسف المشكلة التي تتكلم عنها لا يمكن حلّها بسهولة، وهي أعقد مما تبدو عليه.

بداية الـ hostname يمكن أن يرتبط بأكثر من IP

C:\Users\Xacker>nslookup
Default Server:  UnKnown
Address:  192.168.1.1
> facebook.com
Server:  UnKnown
Address:  192.168.1.1
Non-authoritative answer:
Name:	facebook.com
Addresses:  2a03:2880:10:8f01:face:b00c:0:25
      	2a03:2880:10:cf01:face:b00c::
      	2a03:2880:2110:3f01:face:b00c::
      	2a03:2880:2110:9f01:face:b00c::
      	69.171.237.16
      	69.171.247.21
      	66.220.149.88
      	66.220.152.16
      	66.220.158.70
      	69.171.234.21

كما ترى هنا فـ facebook.com لها 4 عناوين IPv6 و 6 عناوين IPv4.

لكن لو قمت بتنفيذ ping على العنوان لحصلت على أحدهم فقط

C:\Users\Xacker>ping facebook.com
Pinging facebook.com [66.220.149.88] with 32 bytes of data:
Reply from 66.220.149.88: bytes=32 time=347ms TTL=242
Ping statistics for 66.220.149.88:
	Packets: Sent = 1, Received = 1, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
	Minimum = 347ms, Maximum = 347ms, Average = 347ms
Control-C
^C

المسألة في النهاية تتبع للعنوان الذي يحتفظ به الـ DNS الأقرب لي والذي أجابني على طلبي.

بالتالي لو أردت حجب facebook.com بشكل صحيح على جهازي، لاحتجت أن تقوم بالاستعلام عن العناوين الـ 10 الخاصة به (IPv4 + IPv6) وإضافتها لقائمة blacklist.

هل هذا يكفي؟ لا

انظر إلى الاستعلام عن الايبي الخاص بـ www.facebook.com

C:\Users\Xacker>nslookup www.facebook.com
Server:  UnKnown
Address:  192.168.1.1
Non-authoritative answer:
Name:	www.facebook.com
Addresses:  2a03:2880:2110:3f01:face:b00c::
      	69.171.247.37

حصلنا على 2 IPs مختلفة عن السابقة!

ماذا عن عناوين مخدمات البريد لديهم...

C:\Users\Xacker>nslookup
Default Server:  UnKnown
Address:  192.168.1.1
> set type=MX
> facebook.com
Server:  UnKnown
Address:  192.168.1.1
Non-authoritative answer:
facebook.com	MX preference = 10, mail exchanger = smtpin.mx.facebook.com
facebook.com	nameserver = ns5.facebook.com
facebook.com	nameserver = ns4.facebook.com
facebook.com	nameserver = ns3.facebook.com
ns3.facebook.com    	internet address = 66.220.151.20
ns4.facebook.com    	internet address = 69.171.245.32
ns5.facebook.com    	internet address = 66.220.145.65

يا إلهي! عناوين جديدة مختلفة كلّياً.

الآن فكر بالتالي:

- كيف ستقوم بحجب عنوان hostname يحصل على IP بشكل ديناميكي؟ مثلاً yourhost.dyndns.org سيحصل على عنوان.. ثم ربما بعد ساعة ستجد له عنوان آخر، هذا لآن خدمة dyndns.org تقوم بتغيير العنوان بحسب توفّره في الـ DNS لديها وبالتالي بعد برهة من الوقت تقوم مخدمات DNS الأخرى في العالم بتبادل هذه المعلومة وتحديث قواعدها أيضاً بناء على المعلومات الجديدة...

- كيف ستقوم بحجب عنوان hostname يتم فيه استخدام Apache لتحويل الزائر من IP إلى IP آخر.. مثلاً في الفريق العربي لو كتبت arabteam2000.com في المتصفح، سيتم تحويلك إلى www.arabteam2000-forum.com وذلك وفقاً لإعدادات Apache التي ضبطناها لدينا حتى يتم احتساب الزيارات جميعها في مكان واحد.

وبكل الأحوال، انتظر رد أحد الخبراء الذي دعوته للمشاركة في الموضوع.

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#5

بارك الله فيك, مجهود جيد فعلاً

يمكننا القول بصراحة أن فكرة انشاء rules بناء على الاسم بدلا من عنوان الـ IP هي فكرة مبتكرة لم نرها في تطبيقات الـ Firewall السابقة, ولكن إذا دخلنا في تحليل تعقيدات الفكرة عرفنا لماذا لم نرها في تلك التطبيقات حتى المشهورة منها. تعقيدات الفكرة لا حدود لها أبداً فكما أوضح الاستاذ Xacker في مثاله العملي, العلاقة بين الـ IP to Name في DNS هي علاقة many to many ولا حدود رقمية لعدد العناوين المنطقية التي قد ترتبط باسم معين و العكس بالعكس لا حدود رقمية لعدد الاسماء التي قد ترتبط بعنوان منطقي واحد!

حتى أنه لا يوجد standard معين يمكننا اعتماده في تحليلنا تسير عليه الشركات في ربط اسماء و ملحقات الاسماء الخاصة بها بعناوين منطقية, فمثلا ستجد من يربط الاسم و جميع الاسماء الملحقة (www.,apps,mail,webmail..... وغيرها) بعنوان منطقي واحد ومنها من يربط كل ملحق اسم بعنوان منفصل كما فعلت facebook في المثال أعلاه, ناهيك عن فكرة تغيير عنوان الـ IP لاسم معين بعد مدة من الزمن التي ذكرها Xacker و التي ستلغي تفعيل جميع الـ rules المضافة سابقاً من قبل المستخدم, متاهات الفكرة لا حصر لها فمن الصعب أو شبه المستحيل ضبط هذا الموضوع كلياً!!

فيبدوا أن الاعتماد على IP based rules اصبح أحد الأمور الـ standard التي يجب اعتمادها في تطبيقات الـ firewall ومن الصعب جدا الخروج عنها!

على كل حال اقترح عليك إن كنت فعلا مهتماً بإنشاء ما يشبه الـ Name based rules في تطبيقك فاجعلها مثلا تتحكم بالتطبيقات التي لها صلة مباشرة بالشبكة (كالمتصفحات وغيرها) المنصبة على جهاز العميل بذات الطريقة التي يفعلها Kaspersky في خدمة الـ parent control, ولكن عليك هنا دراسة الادوات التي قد توفر لك المعلومات اللازمة لتطبيق هذه الفكرة, كالوصول إلى مدخلات المستخدم في التطبيقات الأخرى على جهاز العميل وغير ذلك, بحيث إذا استطعت من خلال الأدوات و الـ APIs الموجود التعامل مع الاسم بمعزل كامل عن عنوانه المنطقي ستكون حققت المبتغى فعلاً وبالطريقة السهلة!!

بتوفيق الله..

1

Everything will be fine when we TALK LESS, DO MORE


#6

فكرة أخرى مستوحاة من خدمة opendns قد تجعل من الـ Name based rule أمر ممكن التطبيق, إذا قمت بتضمين network sniffer ضمن تطبيقك وقمت بعمل listening على كل الـ DNS Packets الخارجة من جهاز العميل و الحجب على اساسها!

فمثلا: لو أراد المستخدم اضافة رول حجب لاسم facebook.com وجميع ملحقاته, ستقوم بمراقبة جميع عمليات الـ dns lookups الخارجة من جهاز العميل فإذا احتوت أحد الـ packets الخارجة على عنوان facebook.com تقوم بمنعه من الخروج بالتالي لن يتم ترجمة هذا الاسم إلى عنوانه المنطقي ولن يستطيع العميل الاتصال بهذا الموقع, ولمزيد من الاحترافية في حال قمت بالتقاط packet يحتوي على facebook.com يتم عرض صفحة للمستخدم توضح أنه تم منع الوصول إلى هذا الموقع عن طريق تطبيقك أو تقوم بتحويل المستخدم إلى موقع آخر و عنوان آخر على الشبكة يوضح أن الموقع محجوب

اطلع على هذه الروابط لدراسة امكانية تطبيق هذه الفكرة:

http://www.codeproject.com/script/Articles/ViewDownloads.aspx?aid=17031

انظر إلى الجدول Table 5-1. Packet analysis summary الموجود في هذا الرابط:

http://docstore.mik.ua/orelly/networking_2ndEd/tshoot/ch05_04.htm

بتوفيق الله...

1

Everything will be fine when we TALK LESS, DO MORE


#7

فكرة رائعة محمد، MikroTik مثلاً يستخدم طريقة مشابهة في الـ firewall الخاص به حسبما رأيت البارحة، ولا أدري لمَ لم تخطر في بالي ذات الفكرة! فعلاً اللي فاطر مو متل اللي جوعان (وأنا لسه ما فطرت laugh.gif)

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#8

شكرا اخواي Xacker & MoHaMMaD Pro على الاهتمام

عندما قلت اخي محمد:

انظر إلى الجدول Table 5-1. Packet analysis summary الموجود في هذا الرابط:

http://docstore.mik....oot/ch05_04.htm

وعندما رايت الجدول خاب املي لان هذا الهيكل هو اساس برنامجي وتصور باني احول الاي بي من hexa الى decimal فتصور تعقيد البرنامج

وكل برنامجي كان على اساس هذه الصورة

post-257301-011158100 1345552799_thumb.j

ال row ال 6 الاولى تسمى header والباقي يسمى data ويشمل البيانات المراد نقلها ,

والان اعرف بان هناك قسم dns massege و Query وان ل بروتوكول udp قسم خاص به

وانا كنت اظن بان نوع البروتوكول المستعمل فقط موجود في header

واحب ان انوه بان برنامجي يعمل على اساس مقارنة الاي بي فقط لا غير ,الموجودان في قسم header الاول Source IP والثاني Destination IP

واهم نقطة عرفتها وجزاكم الله خيرا وهي Query لاحظ اسم الهوست موجود كما في الصورة ولكن المكتبة اللي استعملها ما فيها هذا القسم لاحظ الصورة والكود

post-257301-073611900 1345556476_thumb.p

وانظر الى التعليق بلعربي

using System;
using System.Runtime.InteropServices;
using System.Text;

namespace NdisapiSpace
{
    [StructLayout(LayoutKind.Sequential, Pack = 1)]
    struct EtherAddr
    {
        public byte b1;//هنا الماك
        public byte b2;
        public byte b3;
        public byte b4;
        public byte b5;
        public byte b6;
    };

    [StructLayout(LayoutKind.Sequential, Pack = 1)]
    struct ETHER_HEADER
    {
        public EtherAddr dest;
        public EtherAddr source;
        public ushort proto;

        public const int ETH_ALEN = 6;
        public const int ETH_P_IP = 0x0800;	        /* Internet Protocol packet	*/
        public const int ETH_P_RARP = 0x8035;		/* Reverse Addr Res packet	*/
        public const int ETH_P_ARP = 0x0806;		/* Address Resolution packet	*/
    };

    [StructLayout(LayoutKind.Sequential, Pack = 1)]
    struct IPHeader  //المكتبة فقط يوجد بيها header ولا وجود ل Query
        //there are only headet in lib there are not query
    {
        /// <summary>
        /// header length : 4, version :4
        /// </summary>
        public byte IPLenVer;
        /// <summary>
        /// type of service
        /// </summary>
        public byte TOS;
        /// <summary>
        /// Total length
        /// </summary>
        public ushort Len;
        /// <summary>
        /// Identification
        /// </summary>
        public ushort ID;
        /// <summary>
        /// Fragment offset field
        /// </summary>
        public ushort Off;
        /// <summary>
        /// Time to live
        /// </summary>
        public byte TTL;
        /// <summary>
        /// Protocol
        /// </summary>
        public byte P;
        /// <summary>
        /// Checksum
        /// </summary>
        public ushort Sum;
        public uint Src;
        public uint Dest;

        public const int IP_DF = 0x4000;
        public const int IP_MF = 0x2000;
        public const int ETHER_HEADER_LENGTH = 14;

        public const int IPPROTO_TCP = 6;
        public const int IPPROTO_UDP = 17;
    };

    [StructLayout(LayoutKind.Sequential, Pack = 1)]
    struct TcpHeader
    {
        public ushort th_sport;
        public ushort th_dport;
        public uint Seq;
        public uint Ack;
        public byte Off;
        public byte Flags;
        public ushort Window;
        public ushort CheckSum;
        public ushort Urp;

        public const int TH_FIN = 0x01;
        public const int TH_SYN = 0x02;
        public const int TH_RST = 0x04;
        public const int TH_PSH = 0x08;
        public const int TH_ACK = 0x10;
        public const int TH_URG = 0x20;
    };

    [StructLayout(LayoutKind.Sequential, Pack = 1)]
    struct UdpHeader
    {
        public ushort th_sport;		// source port //هنا قسمUdpHeader الي عامل عليها علامة خطا في الصورة 
        public ushort th_dport;		// destination port 
        public ushort length;			// data length 
        public ushort th_sum;			// checksum 
    };

}

لذا انا منجبر ان يكون على اساس الاي بي فقط والان من كلمة اي حلول الى كلمة اي افكار لعمل الفلتر حسب الاسم فقط بواسطة الاي بي

المرفقات
ip-header-diagram.jpgiptable.png
#9

وايضا يا اخي محمد برنامج Network Sniffer in C# a هو برنامج يعمل على ndisapi.dll الخاصة بلويندوز الموجودة في مجلد C:\Windows و مجلد C:\Windows\System32

وهذه المكتبة خاصة بلويندوز وهي فقط تدعم وضع LISTEN mod ومعنى هذا انها فقط تنظر وتشم )sniffer) ولا تستطيع ان تدعم TUNNEL mod اللذي بامكانه السيطرة على مرور الباكيت والتلاعب ببيانات الباكيت

لهذا انا استخدم درايفر NDISRD الخاصة ب winpkflt مع هذه المكتبة ndisapi.dll لسيطرة على كارت الانترنت الخاص بلحاسب لهذا فذاك الكود لا ينفعني ومن العجيب ان ذلك البرنامج اقصد السنايفر يملك فقط ثلاثة اقسام

DNSHeader.cs وIPHeader.cs و TCPHeader.cs UDPHeader.cs ولا يملك قسم Query ايضا ولكن يملك قسم ل dns

وشكرا على الفكرة

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…