বাঁধাই: অবৈধ পুনরাবৃত্তি অনুসন্ধানের জন্য ব্ল্যাকহোল?


13

আমার কাছে এমন একটি নাম সার্ভার রয়েছে যা সর্বজনীনভাবে অ্যাক্সেসযোগ্য কারণ এটি বেশ কয়েকটি ডোমেনের জন্য অনুমোদিত নাম সার্ভার

বর্তমানে সার্ভারটি ANYisc.org, ripe.net এবং অনুরূপ (এটি একটি পরিচিত বিতরণকৃত ডস আক্রমণ ) এর জন্য নকল প্রকারের অনুরোধের সাথে প্লাবিত ।

সার্ভারটি BIND চালায় এবং allow-recursionআমার ল্যানে সেট করেছে যাতে এই অনুরোধগুলি প্রত্যাখ্যান হয়। এই ক্ষেত্রে সার্ভারটি কেবলমাত্র authorityএবং additionalবিভাগগুলির সাথে রুট সার্ভারগুলি উল্লেখ করে প্রতিক্রিয়া জানায় ।

আমি কী BIND কনফিগার করতে পারি যাতে এটি কোনও প্রতিক্রিয়া না পাঠিয়েই এই অনুরোধগুলিকে সম্পূর্ণ উপেক্ষা করে?

উত্তর:


5

একই সমস্যার মুখোমুখি হয়ে, আমি সমস্ত পুনরাবৃত্তির অনুরোধগুলি উপেক্ষা করতে বেছে নিয়েছি। সমস্ত সমাধানকারীরা যখন আমার সার্ভারকে একটি অনুমোদিত সার্ভার হিসাবে ব্যবহার করতে চান তখন তারা পুনরাবৃত্তিযোগ্য ক্যোয়ারী পাঠায় না। কেবলমাত্র ভুল কনফিগার করা ক্লায়েন্ট এবং আক্রমণকারীরা, আমার নিজের ক্ষেত্রে পুনরাবৃত্ত অনুসন্ধানগুলি ব্যবহার করুন।

দুর্ভাগ্যক্রমে আমি BIND কে এটি করার কোনও উপায় খুঁজে পাইনি, তবে iptables আপনার পক্ষে যথেষ্ট ভাল, আমি ব্যবহার করেছি

iptables -t raw -I PREROUTING -i eth0 -p udp --destination-port 53 \
    -m string --algo kmp --from 30 \
    --hex-string "|01000001000000000000|" -j DROP

নাহ, সেই নিয়মটিও অনুমোদনমূলক-টাইপ অনুরোধগুলিকে ব্লক করে (কমপক্ষে আমার মেশিনে)। স্পষ্টতই এটি সমস্ত ধরণের ডিএনএস অনুরোধকে অবরুদ্ধ করে।
উদো জি

আমি ডাবল চেক করেছি এবং আমি ঠিক সেই নিয়মটি ব্যবহার করছি। লাইভ সার্ভার থেকে একটি কাট এবং পেস্ট এখানে। COMMAND: iptables -t raw -S PREROUTING। আউটপুট:, -P PREROUTING ACCEPTঅনুসরণ করে -A PREROUTING -i eth0 -p udp -m udp --dport 53 -m string --hex-string "|01000001000000000000|" --algo kmp --from 30 --to 65535 -j DROP। আমি পরীক্ষা করেছি যে এটি দিয়ে সঠিকভাবে কাজ করছে host -ar exampledomain.com dns-server.example.net। অবশ্যই আমি -rবিকল্পটি যুক্ত না করা পর্যন্ত এটি সঠিকভাবে কাজ করে নি ।
পিনো 42

ঠিক আছে, -rবিকল্পটি পার্থক্য করে। আমি ব্যক্তিগতভাবে পছন্দ করি না যে সহজ hostপ্রশ্নগুলি আর কাজ করে না এবং এটি খুব বিভ্রান্তিকর হতে পারে। এটি সম্ভবত একটি বৈধ (এখনও অবধি) উত্তম উত্তর এবং আমি আপনাকে অবদান দেব, যেহেতু এটি সমাপ্ত হতে চলেছে, এমনকি আমি OUTPUT ফিল্টার করে নিজের পদ্ধতির ব্যবহার চালিয়ে যাব।
ইউডো জি

ধন্যবাদ! যদি আমি আরও ভাল সমাধানটি ঘুরে দেখি তবে আমি অবশ্যই এটি পোস্ট করব। আমি আপনার সাথে একমত: এটি হ্যাক is একটি কাজের একটি, কিন্তু এখনও একটি হ্যাক।
পিনো 42

2

আমি চেষ্টা করব:

zone "." {
  type redirect;
  allow-query "none";
}

রুট সার্ভারগুলিতে ক্লায়েন্টদের উল্লেখ করা প্রতিক্রিয়াগুলি "পুনর্নির্দেশ" জোন দ্বারা নিয়ন্ত্রিত হয়। এটি তাদের উত্তর না দেওয়া উচিত।

বাইন্ড 9 ডক্সে এটি ইঙ্গিত দেওয়া হয়েছে: http://ftp.isc.org/isc/bind9/cur/9.9/doc/arm/Bv9ARM.ch06.html#id2592674

আপনি "none"আপনার স্থানীয় সাবনেটের সাথে প্রতিস্থাপন করতে পারেন ।

আপনার যদি ইতিমধ্যে কোনও zone "."ঘোষণা থাকে তবে কেবল allow-query "none";এটিতে যুক্ত করুন।


zone "." { type hint; file "/etc/bind/db.root"; };Db.root রুট সার্ভারগুলির তালিকা সহ আমার একটি ঘোষণা আছে । এই ঘোষণাকে অপসারণ করা বিদেশী ডোমেনগুলির জন্য উত্তরণ থামিয়ে দেয় তবে সার্ভারটি তবে "সার্ভার ব্যর্থতা" দিয়ে সাড়া দিচ্ছে এবং এটি এখনও ডস জন্য ব্যবহার করা যেতে পারে।
উদো জি

@ ইউডিজি: আপনি কনফিগারেশনে যুক্ত allow-query "none";করার চেষ্টা করেছেন zone "."?
ফ্রেইহাইট

দেখে মনে হচ্ছে এটি কেবলমাত্র প্রবাহের ব্যান্ডউইথকে সঞ্চয় করছে যদিও এটি প্রচুর পরিমাণে হওয়া উচিত। আপনার ঠিক করার সাথে সাথে আক্রমণকারী ইতিমধ্যে আপনার সার্ভারগুলি ডাউনস্ট্রিম ব্যান্ডউইথ এবং প্রসেসিং শক্তি ব্যবহার করেছে
TheLQ

@ দ্য এল কিউ: প্রশ্নটি এটি ডিডিওএস আক্রমণ বলে উল্লেখ করে। সাধারণ ডিএনএস-ভিত্তিক ডিডিওএস আক্রমণটি হ'ল আইপি জাল করে ডিএনএস অনুসন্ধানগুলি প্রেরণ করা। যেহেতু ডিএনএসের উত্তর প্যাকেট ক্যোয়ারীর চেয়ে বড়, এটি একটি গুণক সরবরাহ করে। যদি আপনার সার্ভারটি উল্লেখযোগ্যভাবে বৃহত্তর প্যাকেটের সাথে সাড়া না দেয় তবে তারা আক্রমণে আপনার সার্ভারটি ব্যবহার করার কারণটি আপনি সরিয়ে দিয়েছেন।
ফ্রেইহাইট

@ ইউডিজি: সার্ভার ব্যর্থতার প্যাকেটটি কেবলমাত্র 31 থেকে 32, যখন মূল সার্ভারগুলির রেফারেল সম্ভবত কয়েকশ বাইট ছিল। যদি আপনার সার্ভারের উত্তরটি কোয়েরির মতো আকারের হয় বা কেবল সামান্য বিট আকারের হয় তবে আপনার সার্ভারটি ডিএনএস ডিডোস আক্রমণে অকেজো, যেহেতু আক্রমণকারীরা আপনাকে তাদের টার্গেটে প্রেরণ করার জন্য ততটাই ব্যান্ডউইথ ব্যবহার করবে। আমি বেশ কয়েকটি সম্ভাব্যরূপে কনফিগার করা প্রামাণিক নাম সার্ভারগুলির (যেমন গুগলের) বিরুদ্ধে পরীক্ষা করেছি এবং তারা "পুনরাবৃত্তির অনুরোধ করেছে তবে উপলভ্য নয়" এর সাথে জবাব দিয়েছে।
ফ্রেইহাইট

1

সাধারণত, আমি পরামর্শ দেব:

বাইন্ড লগ এবং রেকর্ড আইপস চালু করুন যা প্রত্যাখাত উত্তর পেয়ে যায়। ফেলফ্যানবান প্রোগ্রাম ইনস্টল করুন, ব্ল্যাকহোল অ্যাকশন যুক্ত করুন: http://pastebin.com/k4BxrAeG (/etc/fail2ban/ferences.d ফাইলটিতে নিয়ম রাখুন)

/Etc/fail2ban/filter.d তে বাইন্ড ফিল্টার ফাইল তৈরি করুন (ডিবাগিং দরকার!)

[Definition]
failregex = ^.* security: info: client #<HOST>: query \(cache\) .* denied

ব্যর্থ 2ban.conf সম্পাদনা করুন, বিভাগ যুক্ত করুন:

[bindban]

enabled  = true
filter   = bind
# "bantime" is the number of seconds that a host is banned.
bantime  = 6000
# A host is banned if it has generated "maxretry" during the last "findtime"
# seconds.
findtime  = 60
# "maxretry" is the number of failures before a host get banned.
maxretry = 150
action   = blackhole
logpath  = /var/log/named.log

আশা করি এটি সাহায্য করবে!


TODO: বাইন্ড লগ ফাইল উদাহরণ।
Andrei Mikhaltsov

1

বেসিক ধারণাটি ডিএনএস প্রতিক্রিয়াটিকে বেঁধে দেওয়া হিসাবে শ্রেণীবদ্ধ করা যাক এবং প্রত্যাখ্যানকে চুপচাপ উপেক্ষা করাতে রূপান্তর করতে iptables ব্যবহার করুন।

নামযুক্ত.কনফ বিকল্প বিভাগের সহজ অংশটি অস্বীকার করা হয়েছে:

allow-recursion { none;};

অথবা অবশ্যই স্থানীয় ব্যতিক্রমগুলির জন্য আপনার প্রিয় এসিএল ...

পরবর্তী পাগল iptables জাদু, প্রয়োজন হিসাবে "-o eth0" সামঞ্জস্য বা মুছে ফেলুন। এই কমান্ডটি ইউডিপির আগে 20 বাইট আইপিভি 4 স্তর শিরোনাম গ্রহণ করে।

iptables -A OUTPUT -o eth0 -p udp --sport 53 -m string --from 30 --to 32 --hex-string "|8105|" --algo bm -j DROP

নিম্নলিখিত বিটস সেট সহ ডিএনএস প্রতিক্রিয়ার পতাকা ক্ষেত্রের এই কীগুলি

  • ডিএনএস প্রতিক্রিয়া
  • পুনরাবৃত্তি কোয়েরি
  • উত্তর কোড প্রত্যাখ্যান

নিয়মটি পরীক্ষার জন্য কিছু প্রতিক্রিয়া জানাতে মেলে যখন ডিবাগে "প্রতিক্রিয়া প্রেরণে ত্রুটি: হোস্টটি অগ্রহণযোগ্য" হ'ল লক্ষণীয় লগ বার্তা b

অবশ্যই স্বীকার করতে হবে এটি কিছুটা অর্থহীন অনুশীলন। যদি কোনও পরিবর্ধণ না থাকে তবে কোনও আক্রমণকারী ঠিক তত সহজেই টিসিপি এসওয়াইএনকে প্রতিবিম্বিত করতে পারে। শেষ পর্যন্ত ডিএনএস টিসিপি ব্যবহার করা বা ইস্টলেকের ডিএনএস কুকিজ মোতায়েনের ব্যতীত অন্য কোন কার্যকর সমাধান করা যায় না।


0

আপনি কি স্ট্রিং isc.org ব্লক করার চেষ্টা করেছেন বা এর জন্য হেক্স স্ট্রিংটি ব্লক করার চেষ্টা করেছেন?

এটি আমার পক্ষে কাজ করেছে:

iptables -A INPUT -p udp -m string --hex-string "| 03697363036f726700 |" --algo বিএম -j ড্রপ


সার্ভারের যে সমস্ত ডোমেনটির প্রতিক্রিয়া জানানো উচিত সেগুলি চিহ্নিত করা, উপরেরগুলিকে অনুমতি দেওয়ার জন্য এবং অন্য সমস্ত ইউডিপি / 53 ট্র্যাফিক ছেড়ে দেওয়া কি ভাল হবে না?
ফ্রেইহাইট

আমি ইতিমধ্যে ইউডিপি প্রতিক্রিয়াগুলিকে ইতিমধ্যে ব্লক করছি যা রুট সার্ভারগুলিকে উল্লেখ করছে: iptables -A OUTPUT -p udp -m string -hex-string "|726f6f742d73657276657273|" –algo bm –to 65535 -j DROPতবে আমি সত্যিই এমন একটি সমাধান পছন্দ করব যা কেবলমাত্র BIND কনফিগারেশনের উপর ভিত্তি করে সম্ভব, যদি তা সম্ভব হয় তবেই।
ইউডো জি

এটি দুর্বল। আপনি ডোমেন হিসাবে যা ইচ্ছা স্টিং তৈরি করতে পারেন। আমরা এখনই সেই সমস্যার মুখোমুখি এবং স্থির নাম দিয়ে এটি ব্লক করার উপায় নয়'bnrexex.www.sf97.net/A/IN' 'whzpkacpxpiuycm.www.tpa.net.cn/A/IN'
3h4x

0

এই আক্রমণটিকে এমপ্ল্লিফাইড অস্বীকৃতি অফ পরিষেবা বলা হয়। আপনার বাঁধাইটি সঠিকভাবে কনফিগার করা উচিত তবে ট্রাফিকটি প্রথমে আপনার বাঁধাইতে না পারা উচিত। আপনার নেটওয়ার্কে এটি করতে সক্ষম এমন প্রথম নেটওয়ার্ক ডিভাইসে এটিকে ব্লক করুন। আমার একই সমস্যা ছিল এবং এটি ডিফাল্ট স্নোটার নিয়মের সাথে মোকাবিলা করেছি:

সতর্কতা udp $ EXTERNAL_NET যে কোনও -> OM HOME_NET 53 (msg: "প্রোটোকল-ডিএনএস অতিরিক্ত টাইপ যে কোনও - সম্ভাব্য ডস"; বাইট_স্টেস্ট: 1,! & 0 0FF8,2; সামগ্রী: "| 00 00 এফএফ 00 01 |"; "; সনাক্তকরণ_ফিল্টার: ট্র্যাক বাই_এসসিআর, গণনা 30, সেকেন্ড 30; মেটাডেটা: পরিষেবা ডিএনএস; রেফারেন্স: ইউআরএল, ফক্সপা.ইউজ / 2010/07/21 / থ্রোয়ার্টিং-দ্য-ইস্ক-ওআরগ-ডিএনএস-ডিডোস /; ক্লাসটাইপ: চেষ্টা-ডস; এসিড : 21817; রেভ: 4;)


0

প্রথম, আমি জানি এটি একটি পুরানো প্রশ্ন তবে ...

আমি কয়েক দশক ধরে আমার নিজস্ব প্রামাণিক, নন রিকার্সিভ, ডিএনএস সার্ভার চালিয়ে যাচ্ছি, তবে কোনও ডিএনএস ভিত্তিক ডিডিওএস আক্রমণে কখনও শিকার হয়ে উঠি নি - এখনও অবধি, যখন আমি একটি নতুন আইএসপিতে চলে এসেছি। হাজার হাজার বানোয়াট ডিএনএস অনুসন্ধানগুলি আমার লগগুলিকে প্লাবিত করেছিল এবং আমি সত্যিই বিরক্ত হয়ে পড়েছিলাম - আমার সার্ভারে প্রভাব সম্পর্কে এতটা নয়, বরং এটি আমার লগগুলিকে বিশৃঙ্খল করে এবং অপব্যবহারের অস্বস্তি বোধ করে। দেখে মনে হচ্ছে আক্রমণকারী আমার ডিএনএসকে "অনুমোদিত নাম সার্ভার আক্রমণ " ব্যবহার করার চেষ্টা করছে ।

সুতরাং আমি বুঝতে পেরেছি, যদিও আমি আমার অভ্যন্তরীণ নেটওয়ার্কে পুনরাবৃত্ত অনুসন্ধানগুলি সীমাবদ্ধ করি (অন্য সব অস্বীকার করে), আমি বরং স্পুফড আইপি ঠিকানাগুলিতে নেতিবাচক প্রতিক্রিয়াগুলি ফেরত দেওয়ার চেয়ে আমার সিপিইউ চক্রগুলিকে আইপ্যাবেলে ম্যাচিংয়ে ব্যয় করি (আমার লগগুলিতে কম বিশৃঙ্খলা কম) নেটওয়ার্ক ট্র্যাফিক এবং আমার নিজস্ব একটি উচ্চতর সন্তুষ্টি স্তর)।

অন্য সবার মতো করা হিসাবে আমি শুরু করেছিলাম , কোন ডোমেনের নাম অনুসন্ধান করা আছে তা খুঁজে বার করে সেই ডোমেনে একটি টার্গেট ডিআআরপি দিয়ে একটি স্ট্রিং ম্যাচ তৈরি করেছি। তবে আমি শীঘ্রই বুঝতে পেরেছিলাম যে আমি বিপুল পরিমাণে বিধি-বিধান নিয়ে শেষ করব, যার মধ্যে প্রতিটি সিপিইউ চক্র গ্রহণ করছে। তো এখন কি করা? যেহেতু আমি একটি পুনরাবৃত্ত নামের সার্ভারটি চালাচ্ছি না আমি বুঝতে পেরেছিলাম যে আমি যে বাস্তব অঞ্চলে অনুমোদিত তা আমি মেলিং করতে পারি এবং আমি সমস্ত কিছু বাদ দিই।

আইপেটেবলগুলিতে আমার ডিফল্ট নীতি হ'ল এসিসিপিটি, যদি আপনার নীতিটি ড্রপ হয় তবে আপনাকে নিম্নলিখিত সমাধানটি ব্যবহার করতে চাইলে আপনার সম্ভবত কিছু সামঞ্জস্য করা দরকার।

আমি আমার জোন কনফিগারেশন একটি পৃথক ফাইলে রাখি (/etc/bind/name.conf.local), আসুন এটি উদাহরণ হিসাবে ব্যবহার করুন:

zone "1.168.192.in-addr.arpa" { // Private
        type master;
        allow-query { 192.168.1.0/24; 127.0.0.1; };
        allow-transfer { 127.0.0.1; };
        file "/etc/bind/db.192.168.1";
};

zone "home.example.net" { // Private
        type master;
        allow-query { 192.168.1.0/24; 127.0.0.1; };
        allow-transfer { 127.0.0.1; };
        file "/etc/bind/pri/db.home.example.net";
};

zone "example.net" {
        type master;
        file "/etc/bind/pri/db.example.net";
        allow-transfer { 127.0.0.1; 8.8.8.8; };
};

zone "example.com" {
        type slave;
        masters { 8.8.8.8; };
        file "sec.example.com";
        allow-transfer { 127.0.0.1; };
        notify no;
};

zone "subdomain.of.example.nu" {
        type slave;
        masters { 8.8.8.8; };
        file "sec.subdomain.of.example.nu";
        allow-transfer { 127.0.0.1; };
        notify no;
};

আমার প্রথম দুটি জোনে "// ব্যক্তিগত" মন্তব্যটি নোট করুন, আমি এটিকে বৈধ অঞ্চলগুলির তালিকা থেকে বাদ দেওয়ার জন্য নিম্নলিখিত স্ক্রিপ্টে এটি ব্যবহার করি।

#!/usr/bin/perl
# zone2iptables - Richard Lithvall, april 2014
#
# Since we want to match not only example.net, but also (for example)
# www.example.net we need to set a reasonable maximum value for a domain
# name in our zones - 100 character should be more that enough for most people
# and 255 is the absolute maximum allowed in rfc1034.
# Set it to 0 (zero) if you would like the script to fetch each zone (axfr)
# to get the actual max value.
$maxLengthOfQueryName=255;
$externalInterface="eth1";

print "# first time you run this, you will get error on the 3 first commands.\n";
print "# It's here to make it safe/possible to periodically run this script.\n";
print "/sbin/iptables -D INPUT -i $externalInterface -p udp --dport 53 -j DNSvalidate\n";
print "/sbin/iptables -F DNSvalidate\n";
print "/sbin/iptables -X DNSvalidate\n";
print "#\n";
print "# now, create the chain (again)\n";
print "/sbin/iptables -N DNSvalidate\n";
print "# and populate it with your zones\n";
while(<>){
        if(/^zone\s+"(.+)"\s+\{$/){
                $zone=$1;
                if($maxLengthOfQueryName){
                        $max=$maxLengthOfQueryName;
                } else {
                        open(DIG,"dig -t axfr +nocmd +nostats $zone |");
                        $max=0;
                        while(<DIG>){
                                if(/^(.+?)\.\s/){
                                        $max=(length($1)>$max)?length($1):$max;
                                }
                        }
                        close(DIG);
                }
                printf("iptables -A DNSvalidate -m string --from 40 --to %d --hex-string \"",($max+42));
                foreach $subdomain (split('\.',$zone)){
                        printf("|%02X|%s",length($subdomain),$subdomain);
                }
                print("|00|\" --algo bm -j RETURN -m comment --comment \"$zone\"\n");
        }
}
print "# and end the new chain with a drop\n";
print "/sbin/iptables -A DNSvalidate -j DROP\n";
print "# And, at last, make the new chain active (on UDP/53)\n";
print "/sbin/iptables -A INPUT -i $externalInterface -p udp --dport 53 -j DNSvalidate\n";

যুক্তি হিসাবে জোন কনফিগারেশন ফাইলের সাথে উপরের স্ক্রিপ্টটি চালান।

root:~/tmp/# ./zone2iptables.pl /etc/bind/named.conf.local 
# first time you run this, you will get error on the 3 first commands.
# It's here to make it safe/possible to periodically run this script.
/sbin/iptables -D INPUT -i eth1 -p udp --dport 53 -j DNSvalidate
/sbin/iptables -F DNSvalidate
/sbin/iptables -X DNSvalidate
#
# now, create the chain (again)
/sbin/iptables -N DNSvalidate
# and populate it with your zones
iptables -A DNSvalidate -m string --from 40 --to 297 --hex-string "|07|example|03|net|00|" --algo bm -j RETURN -m comment --comment "example.net"
iptables -A DNSvalidate -m string --from 40 --to 297 --hex-string "|07|example|03|com|00|" --algo bm -j RETURN -m comment --comment "example.com"
iptables -A DNSvalidate -m string --from 40 --to 297 --hex-string "|09|subdomain|02|of|07|example|02|nu|00|" --algo bm -j RETURN -m comment --comment "subdomain.of.example.nu"
# and end the new chain with a drop
/sbin/iptables -A DNSvalidate -j DROP
# And, at last, make the new chain active (on UDP/53)
/sbin/iptables -A INPUT -i eth1 -p udp --dport 53 -j DNSvalidate

কোনও স্ক্রিপ্টে আউটপুট সংরক্ষণ করুন, এটিকে শেলের সাথে পাইপ করুন বা নতুন চেইন তৈরি করতে আপনার টার্মিনালে অনুলিপি করুন এবং পেস্ট করুন এবং সমস্ত অবৈধ ডিএনএস কোয়েরি ফিল্টার আউট করুন।

চালানোর পক্ষ থেকে / sbin / iptables- র -L DNSvalidate -nvx নতুন শৃঙ্খল প্রতিটি নিয়ম উপর প্যাকেট (এবং বাইট) কাউন্টারে দেখতে (আপনি আরো কার্যকর করা তালিকার শীর্ষে সবচেয়ে প্যাকেট জোন স্থানান্তর করতে চান পারে)।

আশা করি যে কেউ এটি দরকারী খুঁজে পেতে পারেন :)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.