1

クライアントで使用するサブドメイン ブルート フォーサーを構築しようとしています - 私はセキュリティ/侵入テストに取り組んでいます。現在、Resolv を使用して 10 秒で約 70 のホストを検索することができます。ギブ オア テイクであり、さらに多くのことを行う方法があるかどうかを知りたいと思っていました。これよりもはるかに高速な速度を実現できる、主に Python ベースの代替スクリプトを見てきました。Resolv が並行して行うリクエストの数を増やす方法や、リストを分割する必要があるかどうかはわかりません。サンプル コードには Google の DNS サーバーを使用していますが、ライブでの使用には内部サーバーを使用することに注意してください。

この問題をデバッグするための大まかなコードは次のとおりです。

require 'resolv'

def subdomains
  puts "Subdomain enumeration beginning at #{Time.now.strftime("%H:%M:%S")}"
  subs = []
  domains = File.open("domains.txt", "r") #list of domain names line by line.
  Resolv.new(:nameserver => ['8.8.8.8', '8.8.4.4'])
    File.open("tiny.txt", "r").each_line do |subdomain|
      subdomain.chomp!
    domains.each do |d|
      puts "Checking #{subdomain}.#{d}"
      ip = Resolv.new.getaddress "#{subdomain}.#{d}" rescue ""
        if ip != nil
          subs << subdomain+"."+d << ip
      end
    end
  end
  test = subs.each_slice(4).to_a
    test.each do |z|
      if !z[1].nil? and !z[3].nil?
    puts z[0] + "\t" + z[1] + "\t\t" + z[2] + "\t" + z[3]
  end
end
  puts "Finished at #{Time.now.strftime("%H:%M:%S")}"
end

subdomains

domain.txt は、google.com、bbc.co.uk、apple.com などのクライアント ドメイン名のリストです。「tiny.txt」は、ftp、www、dev、files、アップロード。次に、Resolv は files.bbc.co.uk などを検索し、存在するかどうかを知らせます。

4

2 に答える 2

0

1 つは、Google ネームサーバーを使用して新しい Resolv インスタンスを作成しているが、それを使用していないことです。getaddress 呼び出しを実行するためにまったく新しい Resolv インスタンスを作成するため、そのインスタンスはおそらく Google ではなくデフォルトのネームサーバーを使用しています。コードを次のように変更できます。

resolv = Resolv.new(:nameserver => ['8.8.8.8', '8.8.4.4'])
# ...
ip = resolv.getaddress "#{subdomain}.#{d}" rescue ""

さらに、File.readlines メソッドを使用してコードを簡素化することをお勧めします。

domains = File.readlines("domains.txt").map(&:chomp)
subdomains = File.readlines("tiny.txt").map(&:chomp)

また、悪い ip をレスキューして空の文字列に設定していますが、次の行で nil ではないことをテストしているため、すべての結果が合格するはずですが、それはあなたが望んでいることではないと思います。

コードをリファクタリングしましたが、テストしていません。これが私が思いついたものであり、より明確かもしれません:

def subdomains
  puts "Subdomain enumeration beginning at #{Time.now.strftime("%H:%M:%S")}"
  domains = File.readlines("domains.txt").map(&:chomp)
  subdomains = File.readlines("tiny.txt").map(&:chomp)

  resolv = Resolv.new(:nameserver => ['8.8.8.8', '8.8.4.4'])

  valid_subdomains = subdomains.each_with_object([]) do |subdomain, valid_subdomains|
    domains.each do |domain|
      combined_name = "#{subdomain}.#{domain}"
      puts "Checking #{combined_name}"
      ip = resolv.getaddress(combined_name) rescue nil
      valid_subdomains << "#{combined_name}#{ip}" if ip
    end
  end

  valid_subdomains.each_slice(4).each do |z|
    if z[1] && z[3]
      puts "#{z[0]}\t#{z[1]}\t\t#{z[2]}\t#{z[3]}"
    end
  end

  puts "Finished at #{Time.now.strftime("%H:%M:%S")}"
end

また、dnsruby gem ( https://github.com/alexdalitz/dnsruby ) もチェックしてみてください。Resolvよりもやりたいことがうまくいくかもしれません。

于 2016-04-20T14:52:58.170 に答える