WordPress LIER Shell Finder Kodlamak!

Bunjo

Uzman üye
14 Ara 2020
1,581
1,859
HTTParty
m9RCVr.png



kbrn6ph.png


Merhabalar ben Anka Red Team'den Bunjo,

bu konuda "Lier Shell" için bir finder kodlamayı anlatacağım.


Wordpress LIER Shell

(WordPress) Sitelere basılan shellerden bir tanesidir.

Örnek Site: L I E R SHELL

Shell içeren sitelere log bırakmamaya özen göstermeniz tavsiyedir.

Shell İçin Örnek Görsel:


4775cal.png

i7ovh1e.png


Wordpress LIER Shell Finder
Ruby:
require 'net/http'
require 'optparse'
require 'uri'

# Coded By Bunjo
# Turk Hack Team

require 'net/http': Bu satır, Ruby'de Net::HTTP sınıfını kullanabilmek için gerekli kütüphaneyi (net/http) yükler. Net::HTTP, HTTP istekleri göndermek ve HTTP yanıtlarını almak için kullanılır.

require 'optparse': Bu satır, komut satırı parametrelerini işlemek için optparse kütüphanesini yükler. OptionParser sınıfını kullanarak komut satırı argümanlarını analiz edebilir ve işleyebiliriz.

require 'uri': Bu satır, URI (Uniform Resource Identifier) işlemleri yapmak için uri kütüphanesini yükler. URI sınıfı, URL'leri ayrıştırmak ve oluşturmak için kullanılır.

Ruby:
class LIER_SHELL
  def initialize
    @path_list = ['/index.php']
    @querys = ['p=']

    @threads = []

    @params = {
      input_file: nil,
      output_file: 'output.txt'
    }

    @headers = {
      'User-Agent' => 'Mozlila/5.0 (Linux; Android 7.0; SM-G892A Bulid/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/60.0.3112.107 Moblie Safari/537.36'
    }
  end

class LIER_SHELL: Bu satır, LIER_SHELL adında bir sınıfın tanımlanacağını belirtir. Ruby'de sınıflar, nesneleri tanımlamak için kullanılır ve içinde özellikler (değişkenler) ve davranışlar (metotlar) bulunur.

def initialize: Bu satır, initialize adında bir metotun tanımlanacağını belirtir. initialize metodu, bir sınıf örneği (nesnesi) oluşturulduğunda otomatik olarak çağrılır ve sınıfın başlangıç durumunu (başlangıç değerlerini) ayarlamak için kullanılır.

@path_list = ['/index.php']: Bu satır, @path_list adında bir instance variable'ın (örnek değişkeni) tanımlandığını ve bu değişkenin değerinin ['/index.php'] olarak başlatıldığını gösterir. Bu değişken, sınıf içinde farklı URL yollarını tutmak için kullanılabilir.

@querys = ['p=']: Bu satır, @querys adında bir instance variable'ın tanımlandığını ve bu değişkenin değerinin ['p='] olarak başlatıldığını gösterir. Bu değişken, sınıf içinde farklı sorgu parametrelerini tutmak için kullanılabilir.

@threads = []: Bu satır, @threads adında bir instance variable'ın tanımlandığını ve bu değişkenin boş bir dizi olarak başlatıldığını gösterir. Bu değişken, sınıf içinde çalışan iş parçacıklarını (threads) tutmak için kullanılabilir.

@ params = { input_file: nil, output_file: 'output.txt' }: Bu satır, @params adında bir instance variable'ın tanımlandığını ve bu değişkenin değerinin bir hash (sözlük) olarak başlatıldığını gösterir. Hash, anahtar-değer çiftleri içerir. Burada input_file anahtarının değeri nil (boş) olarak, output_file anahtarının değeri ise 'output.txt' olarak başlatılmıştır. Bu değişken, sınıf içinde parametreler veya ayarlar için kullanılabilir.

@ headers = { 'User-Agent' => 'Mozlila/5.0 (Linux; Android 7.0; SM-G892A Bulid/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/60.0.3112.107 Moblie Safari/537.36' }: Bu satır, @headers adında bir instance variable'ın tanımlandığını ve bu değişkenin değerinin bir hash olarak başlatıldığını gösterir. Bu hash, HTTP isteklerinde kullanılacak başlık (header) bilgilerini içerir.

Ruby:
def check_site(url)
    @path_list.each do |each_path|
      @querys.each do |query|
        begin
          target = URI.parse(url)
          target.path += each_path
          target.query = query

          http = Net::HTTP.new(target.host, target.port)

          http.open_timeout = 10
          http.read_timeout = 10

          http.use_ssl = (target.scheme == "https")

          request = Net::HTTP::Get.new(target.path, @headers)
          response = http.request(request)

          if response
            if response.body.include?("<title>L I E R SHELL</title>")
              File.open(@params[:output_file], "a+") do |file|
                file.puts(target)
              end

              puts("#{target} --> Successfully #{response.code} ".green)
              return
            else
              puts("#{target} --> Not Vuln #{response.code} ".red)
            end
          else
            puts("#{target} --> Not Vuln ".red)
          end
        end
      rescue StandardError => err
        puts("#{target} --> Not Vuln #{err.class}".red)
        return
      rescue Net::ReadTimeout, Net::OpenTimeout
        puts("#{target} --> Not Vuln #{err.class}".red)
        return
      end
    end
  end

def check_site(url): Bu satır, check_site adında bir metot tanımlar ve url adında bir parametre alır. Bu metot, verilen URL üzerinde belirli yollar ve sorgularla HTTP istekleri yapar ve yanıtları değerlendirir.

@path_list.each do |each_path|: Bu satır, @path_list içindeki her bir yol için döngü oluşturur. @path_list sınıfın önceki kısmında tanımlanmış ve bu diziye eklenen yollar üzerinde HTTP istekleri yapılacak.

@querys.each do |query|: Bu satır, @querys içindeki her bir sorgu için döngü oluşturur. @ querys sınıfın önceki kısmında tanımlanmış ve bu diziye eklenen sorgularla HTTP istekleri yapılacak.

begin ve rescue blokları: Bu satırlar arasındaki kod, olası hata durumlarına karşı bir hata yakalama (exception handling) mekanizması sağlar. begin bloğu, olası hata durumlarını işlemek için bir başlangıç noktası belirtir. rescue blokları, farklı hata tiplerine göre işlem yapar.

target = URI.parse(url): Bu satır, verilen url üzerinde işlem yapabilmek için URI.parse metodunu kullanarak bir target URI nesnesi oluşturur.

target.path += each_path ve target.query = query: Bu satırlar, target URI nesnesinin yollarını ve sorgularını belirliyor. Her bir yoldan ve sorgudan sonra HTTP isteği yapılacak.

http = Net::HTTP.new(target.host, target.port): Bu satır, HTTP isteği yapmak için bir Net::HTTP nesnesi oluşturur ve target URL'sinin ana bilgisayarını (host) ve bağlantı noktasını (port) belirler.

http.open_timeout = 10 ve http.read_timeout = 10: Bu satırlar, HTTP isteğinin maksimum açık kalma süresini (open_timeout) ve okuma süresini (read_timeout) belirler. Burada her ikisi de 10 saniye olarak ayarlanmıştır.

http.use_ssl = (target.scheme == "https"): Bu satır, HTTPS üzerinden iletişim yapılacaksa use_ssl özelliğini true olarak ayarlar; aksi halde false olarak kalır.

request = Net::HTTP::Get.new(target.path, @headers): Bu satır, HTTP GET isteği oluşturur ve @headers içindeki başlıkları (headers) kullanarak isteği hazırlar.

response = http.request(request): Bu satır, oluşturulan HTTP isteğini gönderir ve yanıtı response değişkenine atar.

Yanıtın değerlendirilmesi: Kodun bu kısmı, HTTP yanıtını değerlendirir ve belirli bir koşula göre işlem yapar. Eğer yanıt içeriği <title>L I E R SHELL</title> içeriyorsa, bu bir zafiyet olarak kabul edilir ve sonuçlar output_file adlı dosyaya yazılır. Aksi halde yanıtı ekrana basar.


Hata durumları: rescue blokları, olası hata durumlarını yakalar ve ilgili mesajları ekrana basar. Örneğin, StandardError türündeki hataların yanı sıra belirli zaman aşımı (Net::ReadTimeout, Net::OpenTimeout) hataları da ele alınır.

Ruby:
def parse_lines(group)
    group.each do |line|
      url_line = URI.parse(line.strip)

      if url_line.scheme
        check_site(url_line)
      else
        url_line = "http://#{line.strip}"
        url_parsed = URI.parse(url_line)

        check_site(url_parsed)
      end
    end
  end

def parse_lines(group): Bu satır, parse_lines adında bir metot tanımlar ve group adında bir parametre alır. Bu parametre, parse_lines metoduna verilen dizi içindeki öğeleri temsil eder.

group.each do |line|: Bu satır, group dizisindeki her bir öğe için bir döngü oluşturur. Bu döngü, line değişkeni üzerinde çalışır ve her bir öğeyi işler.

url_line = URI.parse(line.strip): Bu satır, line öğesini bir URI nesnesine (url_line) dönüştürür. strip metodu kullanılarak öğenin başındaki ve sonundaki boşluklar silinir.

if url_line.scheme: Bu satır, url_line nesnesinin bir şema (scheme) içerip içermediğini kontrol eder. Eğer bir şema varsa (http://, https:// gibi), bu if bloğu çalışır.

check_site(url_line): Bu satır, check_site metodunu çağırarak url_line nesnesi üzerinde belirli bir zafiyetin varlığını kontrol etmek için kullanılır. Bu metot, daha önce tanımlanmış bir metottur ve belirli bir URL üzerinde HTTP istekleri yaparak zafiyet kontrolü yapar.

else: Eğer url_line nesnesinin şeması yoksa (yani URL olarak geçerli bir formatta değilse), bu blok çalışır.

url_line = "http://#{line.strip}": Bu satır, http:// ön ekini ekleyerek line öğesini geçerli bir URL formatına (url_line) dönüştürür.

url_parsed = URI.parse(url_line): Bu satır, url_line öğesini bir URI nesnesine (url_parsed) dönüştürür.

check_site(url_parsed): Bu satır, check_site metodunu çağırarak url_parsed nesnesi üzerinde belirli bir zafiyetin varlığını kontrol etmek için kullanılır. Bu metot, daha önce tanımlanmış bir metottur ve belirli bir URL üzerinde HTTP istekleri yaparak zafiyet kontrolü yapar.
Ruby:
def print_help
    help_text = <<-'HELP_TEXT'
USAGE: ruby lier_finder.rb [options]

OPTIONS:
  -i, --input_file FILE: Define the path to the URL file.
  -o, --output_file FILE: Define the name of the output log file.
    HELP_TEXT

    puts(help_text.magenta)
  end

  def opt_parser
    begin
      OptionParser.new do |opts|
        opts.on "-i", "--input_file INPUT_FILE" do |input_file|
          if File.exist?(input_file)
            @params[:input_file] = input_file
          else
            puts("File not found: #{input_file}".red)
            exit(1)
          end
        end

        opts.on "-o", "--output_file OUTPUT_FILE" do |output_file|
          @params[:output_file] = output_file
        end
      end.parse!
    rescue Exception => exception
      puts("Error: #{exception}")
      exit
    end
  end

def print_help: Bu satır, print_help adında bir metot tanımlar. Bu metot, betiğin kullanımını gösteren bir yardım metni (help_text) oluşturur ve bu metni konsola (puts) magenta renkte basar.

help_text = <<-'HELP_TEXT' ... END: Bu satır, çok satırlı bir string ifadesi (help_text) oluşturur. <<-'HELP_TEXT' ifadesiyle başlayan satır, altındaki satırların HELP_TEXT etiketiyle bitirildiğini belirtir. Bu şekilde çok satırlı bir metin bloğu oluşturulabilir.

puts(help_text.magenta): Bu satır, help_text metnini magenta renkte konsola basar.

def opt_parser: Bu satır, opt_parser adında bir metot tanımlar. Bu metot, komut satırı parametrelerini işlemek için OptionParser sınıfını kullanır.

OptionParser.new do |opts| ... end.parse!: Bu satır, OptionParser sınıfını kullanarak komut satırı parametrelerini işlemek için bir yapı oluşturur. opts.on metoduyla komut satırı seçenekleri tanımlanır ve bu seçeneklerin değerleri alınır.

-i, --input_file INPUT_FILE: Bu satır, -i veya --input_file seçeneğiyle belirtilen giriş dosyasının yolunu belirler. Bu seçenek kullanıldığında, belirtilen dosya varsa @params[:input_file] değişkenine atanır.

-o, --output_file OUTPUT_FILE: Bu satır, -o veya --output_file seçeneğiyle belirtilen çıktı dosyasının adını belirler. Bu seçenek kullanıldığında, belirtilen ad @params[:eek:utput_file] değişkenine atanır.

File.exist?(input_file): Bu satır, verilen input_file yolunda bir dosyanın var olup olmadığını kontrol eder. Eğer dosya yoksa, hata mesajı basılır (puts) ve program exit(1) ile sonlandırılır.


rescue Exception => exception: Bu satır, OptionParser ile ilgili bir hata oluştuğunda (Exception), bu hatayı yakalar ve exception değişkenine atar. Sonrasında hata mesajı ("Error: #{exception}") basılır ve program exit ile sonlandırılır.

Ruby:
  def main
    opt_parser

    unless @params[:input_file].nil?
      lines = File.readlines(@params[:input_file]).uniq

      lines.each_slice(20) do |group_lines|
        @threads << Thread.new { parse_lines(group_lines) }
      end

      @threads.each(&:join)
      puts()
      puts("Scan Completed.".magenta)

    else
      print_help
    end
  end
end

class String
  def red
    "\e[31m#{self}\e[0m"
  end

  def green
    "\e[32m#{self}\e[0m"
  end

  def magenta
    "\e[35m#{self}\e[0m"
  end
end

lier = LIER_SHELL.new
lier.main

def main: Bu satır, main adında bir metot tanımlar. Bu metot, betiğin ana çalışma mantığını içerir.

opt_parser: Bu satır, daha önce tanımlanan opt_parser metotunu çağırarak komut satırı parametrelerini işler.

unless @params[:input_file].nil?: Bu satır, @params[:input_file] değişkeninin boş olup olmadığını kontrol eder. Eğer boş değilse (dosya belirtilmişse), unless bloğu çalışır.

lines = File.readlines(@params[:input_file]).uniq: Bu satır, @params[:input_file] değişkenine belirtilen dosyayı okur ve her satırı bir diziye (lines) atar. uniq metodu ile dizi içindeki aynı satırları tekilleştirir.

lines.each_slice(20) do |group_lines|: Bu satır, lines dizisini 20'şer satırlık gruplara ayırır ve her grup için bir blok oluşturur. Her blok, group_lines adıyla kullanılır ve içindeki satırları temsil eder.

@threads << Thread.new { parse_lines(group_lines) }: Bu satır, her bir grup için yeni bir iş parçacığı (thread) oluşturur ve bu iş parçacığı içinde parse_lines metodu çağrılır. Bu iş parçacıkları @threads dizisine eklenir.

@threads.each(&:join): Bu satır, @threads dizisindeki her bir iş parçacığının tamamlanmasını bekler (join metodu).

puts("Scan Completed.".magenta): Bu satır, taramanın tamamlandığını belirten bir mesajı magenta renkte ekrana basar.

else: Eğer @params[:input_file] değişkeni boşsa (dosya belirtilmemişse), bu blok çalışır.

print_help: Bu satır, daha önce tanımlanan print_help metotunu çağırarak kullanım talimatlarını ekrana basar.

end: main metodu tanımının sonunu belirtir.

end: LIER_SHELL sınıfının tanımının sonunu belirtir.

class String: Bu satır, String sınıfına özel metotların tanımlanacağını belirtir.

def red, def green, def magenta: Bu satırlar, String sınıfına yeni metotlar ekler. Bu metotlar, metinleri kırmızı, yeşil ve magenta renklerde göstermek için kullanılır.

lier = LIER_SHELL.new: Bu satır, LIER_SHELL sınıfının bir örneğini (lier) oluşturur.


lier.main: Bu satır, lier örneğinin main metodu aracılığıyla betiği çalıştırmasını sağlar. main metodu, betiğin ana işlevselliğini gerçekleştirir ve komut satırı parametrelerini işler, dosyaları okur ve taramayı başlatır.
Tüm Kod:
Ruby:
require 'net/http'
require 'optparse'
require 'uri'

# Coded By Bunjo
# Turk Hack Team

class LIER_SHELL
  def initialize
    @path_list = ['/index.php']
    @querys = ['p=']

    @threads = []

    @params = {
      input_file: nil,
      output_file: 'output.txt'
    }

    @headers = {
      'User-Agent' => 'Mozlila/5.0 (Linux; Android 7.0; SM-G892A Bulid/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/60.0.3112.107 Moblie Safari/537.36'
    }
  end

  def check_site(url)
    @path_list.each do |each_path|
      @querys.each do |query|
        begin
          target = URI.parse(url)
          target.path += each_path
          target.query = query

          http = Net::HTTP.new(target.host, target.port)

          http.open_timeout = 10
          http.read_timeout = 10

          http.use_ssl = (target.scheme == "https")

          request = Net::HTTP::Get.new(target.path, @headers)
          response = http.request(request)

          if response
            if response.body.include?("<title>L I E R SHELL</title>")
              File.open(@params[:output_file], "a+") do |file|
                file.puts(target)
              end

              puts("#{target} --> Successfully #{response.code} ".green)
              return
            else
              puts("#{target} --> Not Vuln #{response.code} ".red)
            end
          else
            puts("#{target} --> Not Vuln ".red)
          end
        end
      rescue StandardError => err
        puts("#{target} --> Not Vuln #{err.class}".red)
        return
      rescue Net::ReadTimeout, Net::OpenTimeout
        puts("#{target} --> Not Vuln #{err.class}".red)
        return
      end
    end
  end

  def parse_lines(group)
    group.each do |line|
      url_line = URI.parse(line.strip)

      if url_line.scheme
        check_site(url_line)
      else
        url_line = "http://#{line.strip}"
        url_parsed = URI.parse(url_line)

        check_site(url_parsed)
      end
    end
  end

  def print_help
    help_text = <<-'HELP_TEXT'
USAGE: ruby lier_finder.rb [options]

OPTIONS:
  -i, --input_file FILE: Define the path to the URL file.
  -o, --output_file FILE: Define the name of the output log file.
    HELP_TEXT

    puts(help_text.magenta)
  end

  def opt_parser
    begin
      OptionParser.new do |opts|
        opts.on "-i", "--input_file INPUT_FILE" do |input_file|
          if File.exist?(input_file)
            @params[:input_file] = input_file
          else
            puts("File not found: #{input_file}".red)
            exit(1)
          end
        end

        opts.on "-o", "--output_file OUTPUT_FILE" do |output_file|
          @params[:output_file] = output_file
        end
      end.parse!
    rescue Exception => exception
      puts("Error: #{exception}")
      exit
    end
  end

  def main
    opt_parser

    unless @params[:input_file].nil?
      lines = File.readlines(@params[:input_file]).uniq

      lines.each_slice(20) do |group_lines|
        @threads << Thread.new { parse_lines(group_lines) }
      end

      @threads.each(&:join)
      puts()
      puts("Scan Completed.".magenta)

    else
      print_help
    end
  end
end

class String
  def red
    "\e[31m#{self}\e[0m"
  end

  def green
    "\e[32m#{self}\e[0m"
  end

  def magenta
    "\e[35m#{self}\e[0m"
  end
end

lier = LIER_SHELL.new
lier.main

i7ovh1e.png


Kullanım Örneği

60jum4r.png


ygbic1a.png


Okuyan herkese teşekkür ederim.

İyi forumlar!


 

Butcherb3y

Uzman üye
1 Eyl 2022
1,526
1,134
Anıtkabir
m9RCVr.png



kbrn6ph.png


Merhabalar ben Anka Red Team'den Bunjo,

bu konuda "Lier Shell" için bir finder kodlamayı anlatacağım.


Wordpress LIER Shell

(WordPress) Sitelere basılan shellerden bir tanesidir.

Örnek Site: L I E R SHELL

Shell içeren sitelere log bırakmamaya özen göstermeniz tavsiyedir.

Shell İçin Örnek Görsel:


4775cal.png

i7ovh1e.png


Wordpress LIER Shell Finder
Ruby:
require 'net/http'
require 'optparse'
require 'uri'

# Coded By Bunjo
# Turk Hack Team

require 'net/http': Bu satır, Ruby'de Net::HTTP sınıfını kullanabilmek için gerekli kütüphaneyi (net/http) yükler. Net::HTTP, HTTP istekleri göndermek ve HTTP yanıtlarını almak için kullanılır.

require 'optparse': Bu satır, komut satırı parametrelerini işlemek için optparse kütüphanesini yükler. OptionParser sınıfını kullanarak komut satırı argümanlarını analiz edebilir ve işleyebiliriz.

require 'uri': Bu satır, URI (Uniform Resource Identifier) işlemleri yapmak için uri kütüphanesini yükler. URI sınıfı, URL'leri ayrıştırmak ve oluşturmak için kullanılır.

Ruby:
class LIER_SHELL
  def initialize
    @path_list = ['/index.php']
    @querys = ['p=']

    @threads = []

    @params = {
      input_file: nil,
      output_file: 'output.txt'
    }

    @headers = {
      'User-Agent' => 'Mozlila/5.0 (Linux; Android 7.0; SM-G892A Bulid/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/60.0.3112.107 Moblie Safari/537.36'
    }
  end

class LIER_SHELL: Bu satır, LIER_SHELL adında bir sınıfın tanımlanacağını belirtir. Ruby'de sınıflar, nesneleri tanımlamak için kullanılır ve içinde özellikler (değişkenler) ve davranışlar (metotlar) bulunur.

def initialize: Bu satır, initialize adında bir metotun tanımlanacağını belirtir. initialize metodu, bir sınıf örneği (nesnesi) oluşturulduğunda otomatik olarak çağrılır ve sınıfın başlangıç durumunu (başlangıç değerlerini) ayarlamak için kullanılır.

@path_list = ['/index.php']: Bu satır, @path_list adında bir instance variable'ın (örnek değişkeni) tanımlandığını ve bu değişkenin değerinin ['/index.php'] olarak başlatıldığını gösterir. Bu değişken, sınıf içinde farklı URL yollarını tutmak için kullanılabilir.

@querys = ['p=']: Bu satır, @querys adında bir instance variable'ın tanımlandığını ve bu değişkenin değerinin ['p='] olarak başlatıldığını gösterir. Bu değişken, sınıf içinde farklı sorgu parametrelerini tutmak için kullanılabilir.

@threads = []: Bu satır, @threads adında bir instance variable'ın tanımlandığını ve bu değişkenin boş bir dizi olarak başlatıldığını gösterir. Bu değişken, sınıf içinde çalışan iş parçacıklarını (threads) tutmak için kullanılabilir.

@ params = { input_file: nil, output_file: 'output.txt' }: Bu satır, @params adında bir instance variable'ın tanımlandığını ve bu değişkenin değerinin bir hash (sözlük) olarak başlatıldığını gösterir. Hash, anahtar-değer çiftleri içerir. Burada input_file anahtarının değeri nil (boş) olarak, output_file anahtarının değeri ise 'output.txt' olarak başlatılmıştır. Bu değişken, sınıf içinde parametreler veya ayarlar için kullanılabilir.

@ headers = { 'User-Agent' => 'Mozlila/5.0 (Linux; Android 7.0; SM-G892A Bulid/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/60.0.3112.107 Moblie Safari/537.36' }: Bu satır, @headers adında bir instance variable'ın tanımlandığını ve bu değişkenin değerinin bir hash olarak başlatıldığını gösterir. Bu hash, HTTP isteklerinde kullanılacak başlık (header) bilgilerini içerir.

Ruby:
def check_site(url)
    @path_list.each do |each_path|
      @querys.each do |query|
        begin
          target = URI.parse(url)
          target.path += each_path
          target.query = query

          http = Net::HTTP.new(target.host, target.port)

          http.open_timeout = 10
          http.read_timeout = 10

          http.use_ssl = (target.scheme == "https")

          request = Net::HTTP::Get.new(target.path, @headers)
          response = http.request(request)

          if response
            if response.body.include?("<title>L I E R SHELL</title>")
              File.open(@params[:output_file], "a+") do |file|
                file.puts(target)
              end

              puts("#{target} --> Successfully #{response.code} ".green)
              return
            else
              puts("#{target} --> Not Vuln #{response.code} ".red)
            end
          else
            puts("#{target} --> Not Vuln ".red)
          end
        end
      rescue StandardError => err
        puts("#{target} --> Not Vuln #{err.class}".red)
        return
      rescue Net::ReadTimeout, Net::OpenTimeout
        puts("#{target} --> Not Vuln #{err.class}".red)
        return
      end
    end
  end

def check_site(url): Bu satır, check_site adında bir metot tanımlar ve url adında bir parametre alır. Bu metot, verilen URL üzerinde belirli yollar ve sorgularla HTTP istekleri yapar ve yanıtları değerlendirir.

@path_list.each do |each_path|: Bu satır, @path_list içindeki her bir yol için döngü oluşturur. @path_list sınıfın önceki kısmında tanımlanmış ve bu diziye eklenen yollar üzerinde HTTP istekleri yapılacak.

@querys.each do |query|: Bu satır, @querys içindeki her bir sorgu için döngü oluşturur. @ querys sınıfın önceki kısmında tanımlanmış ve bu diziye eklenen sorgularla HTTP istekleri yapılacak.

begin ve rescue blokları: Bu satırlar arasındaki kod, olası hata durumlarına karşı bir hata yakalama (exception handling) mekanizması sağlar. begin bloğu, olası hata durumlarını işlemek için bir başlangıç noktası belirtir. rescue blokları, farklı hata tiplerine göre işlem yapar.

target = URI.parse(url): Bu satır, verilen url üzerinde işlem yapabilmek için URI.parse metodunu kullanarak bir target URI nesnesi oluşturur.

target.path += each_path ve target.query = query: Bu satırlar, target URI nesnesinin yollarını ve sorgularını belirliyor. Her bir yoldan ve sorgudan sonra HTTP isteği yapılacak.

http = Net::HTTP.new(target.host, target.port): Bu satır, HTTP isteği yapmak için bir Net::HTTP nesnesi oluşturur ve target URL'sinin ana bilgisayarını (host) ve bağlantı noktasını (port) belirler.

http.open_timeout = 10 ve http.read_timeout = 10: Bu satırlar, HTTP isteğinin maksimum açık kalma süresini (open_timeout) ve okuma süresini (read_timeout) belirler. Burada her ikisi de 10 saniye olarak ayarlanmıştır.

http.use_ssl = (target.scheme == "https"): Bu satır, HTTPS üzerinden iletişim yapılacaksa use_ssl özelliğini true olarak ayarlar; aksi halde false olarak kalır.

request = Net::HTTP::Get.new(target.path, @headers): Bu satır, HTTP GET isteği oluşturur ve @headers içindeki başlıkları (headers) kullanarak isteği hazırlar.

response = http.request(request): Bu satır, oluşturulan HTTP isteğini gönderir ve yanıtı response değişkenine atar.

Yanıtın değerlendirilmesi: Kodun bu kısmı, HTTP yanıtını değerlendirir ve belirli bir koşula göre işlem yapar. Eğer yanıt içeriği <title>L I E R SHELL</title> içeriyorsa, bu bir zafiyet olarak kabul edilir ve sonuçlar output_file adlı dosyaya yazılır. Aksi halde yanıtı ekrana basar.


Hata durumları: rescue blokları, olası hata durumlarını yakalar ve ilgili mesajları ekrana basar. Örneğin, StandardError türündeki hataların yanı sıra belirli zaman aşımı (Net::ReadTimeout, Net::OpenTimeout) hataları da ele alınır.

Ruby:
def parse_lines(group)
    group.each do |line|
      url_line = URI.parse(line.strip)

      if url_line.scheme
        check_site(url_line)
      else
        url_line = "http://#{line.strip}"
        url_parsed = URI.parse(url_line)

        check_site(url_parsed)
      end
    end
  end

def parse_lines(group): Bu satır, parse_lines adında bir metot tanımlar ve group adında bir parametre alır. Bu parametre, parse_lines metoduna verilen dizi içindeki öğeleri temsil eder.

group.each do |line|: Bu satır, group dizisindeki her bir öğe için bir döngü oluşturur. Bu döngü, line değişkeni üzerinde çalışır ve her bir öğeyi işler.

url_line = URI.parse(line.strip): Bu satır, line öğesini bir URI nesnesine (url_line) dönüştürür. strip metodu kullanılarak öğenin başındaki ve sonundaki boşluklar silinir.

if url_line.scheme: Bu satır, url_line nesnesinin bir şema (scheme) içerip içermediğini kontrol eder. Eğer bir şema varsa (http://, https:// gibi), bu if bloğu çalışır.

check_site(url_line): Bu satır, check_site metodunu çağırarak url_line nesnesi üzerinde belirli bir zafiyetin varlığını kontrol etmek için kullanılır. Bu metot, daha önce tanımlanmış bir metottur ve belirli bir URL üzerinde HTTP istekleri yaparak zafiyet kontrolü yapar.

else: Eğer url_line nesnesinin şeması yoksa (yani URL olarak geçerli bir formatta değilse), bu blok çalışır.

url_line = "http://#{line.strip}": Bu satır, http:// ön ekini ekleyerek line öğesini geçerli bir URL formatına (url_line) dönüştürür.

url_parsed = URI.parse(url_line): Bu satır, url_line öğesini bir URI nesnesine (url_parsed) dönüştürür.

check_site(url_parsed): Bu satır, check_site metodunu çağırarak url_parsed nesnesi üzerinde belirli bir zafiyetin varlığını kontrol etmek için kullanılır. Bu metot, daha önce tanımlanmış bir metottur ve belirli bir URL üzerinde HTTP istekleri yaparak zafiyet kontrolü yapar.
Ruby:
def print_help
    help_text = <<-'HELP_TEXT'
USAGE: ruby lier_finder.rb [options]

OPTIONS:
  -i, --input_file FILE: Define the path to the URL file.
  -o, --output_file FILE: Define the name of the output log file.
    HELP_TEXT

    puts(help_text.magenta)
  end

  def opt_parser
    begin
      OptionParser.new do |opts|
        opts.on "-i", "--input_file INPUT_FILE" do |input_file|
          if File.exist?(input_file)
            @params[:input_file] = input_file
          else
            puts("File not found: #{input_file}".red)
            exit(1)
          end
        end

        opts.on "-o", "--output_file OUTPUT_FILE" do |output_file|
          @params[:output_file] = output_file
        end
      end.parse!
    rescue Exception => exception
      puts("Error: #{exception}")
      exit
    end
  end

def print_help: Bu satır, print_help adında bir metot tanımlar. Bu metot, betiğin kullanımını gösteren bir yardım metni (help_text) oluşturur ve bu metni konsola (puts) magenta renkte basar.

help_text = <<-'HELP_TEXT' ... END: Bu satır, çok satırlı bir string ifadesi (help_text) oluşturur. <<-'HELP_TEXT' ifadesiyle başlayan satır, altındaki satırların HELP_TEXT etiketiyle bitirildiğini belirtir. Bu şekilde çok satırlı bir metin bloğu oluşturulabilir.

puts(help_text.magenta): Bu satır, help_text metnini magenta renkte konsola basar.

def opt_parser: Bu satır, opt_parser adında bir metot tanımlar. Bu metot, komut satırı parametrelerini işlemek için OptionParser sınıfını kullanır.

OptionParser.new do |opts| ... end.parse!: Bu satır, OptionParser sınıfını kullanarak komut satırı parametrelerini işlemek için bir yapı oluşturur. opts.on metoduyla komut satırı seçenekleri tanımlanır ve bu seçeneklerin değerleri alınır.

-i, --input_file INPUT_FILE: Bu satır, -i veya --input_file seçeneğiyle belirtilen giriş dosyasının yolunu belirler. Bu seçenek kullanıldığında, belirtilen dosya varsa @params[:input_file] değişkenine atanır.

-o, --output_file OUTPUT_FILE: Bu satır, -o veya --output_file seçeneğiyle belirtilen çıktı dosyasının adını belirler. Bu seçenek kullanıldığında, belirtilen ad @params[:eek:utput_file] değişkenine atanır.

File.exist?(input_file): Bu satır, verilen input_file yolunda bir dosyanın var olup olmadığını kontrol eder. Eğer dosya yoksa, hata mesajı basılır (puts) ve program exit(1) ile sonlandırılır.


rescue Exception => exception: Bu satır, OptionParser ile ilgili bir hata oluştuğunda (Exception), bu hatayı yakalar ve exception değişkenine atar. Sonrasında hata mesajı ("Error: #{exception}") basılır ve program exit ile sonlandırılır.

Ruby:
  def main
    opt_parser

    unless @params[:input_file].nil?
      lines = File.readlines(@params[:input_file]).uniq

      lines.each_slice(20) do |group_lines|
        @threads << Thread.new { parse_lines(group_lines) }
      end

      @threads.each(&:join)
      puts()
      puts("Scan Completed.".magenta)

    else
      print_help
    end
  end
end

class String
  def red
    "\e[31m#{self}\e[0m"
  end

  def green
    "\e[32m#{self}\e[0m"
  end

  def magenta
    "\e[35m#{self}\e[0m"
  end
end

lier = LIER_SHELL.new
lier.main

def main: Bu satır, main adında bir metot tanımlar. Bu metot, betiğin ana çalışma mantığını içerir.

opt_parser: Bu satır, daha önce tanımlanan opt_parser metotunu çağırarak komut satırı parametrelerini işler.

unless @params[:input_file].nil?: Bu satır, @params[:input_file] değişkeninin boş olup olmadığını kontrol eder. Eğer boş değilse (dosya belirtilmişse), unless bloğu çalışır.

lines = File.readlines(@params[:input_file]).uniq: Bu satır, @params[:input_file] değişkenine belirtilen dosyayı okur ve her satırı bir diziye (lines) atar. uniq metodu ile dizi içindeki aynı satırları tekilleştirir.

lines.each_slice(20) do |group_lines|: Bu satır, lines dizisini 20'şer satırlık gruplara ayırır ve her grup için bir blok oluşturur. Her blok, group_lines adıyla kullanılır ve içindeki satırları temsil eder.

@threads << Thread.new { parse_lines(group_lines) }: Bu satır, her bir grup için yeni bir iş parçacığı (thread) oluşturur ve bu iş parçacığı içinde parse_lines metodu çağrılır. Bu iş parçacıkları @threads dizisine eklenir.

@threads.each(&:join): Bu satır, @threads dizisindeki her bir iş parçacığının tamamlanmasını bekler (join metodu).

puts("Scan Completed.".magenta): Bu satır, taramanın tamamlandığını belirten bir mesajı magenta renkte ekrana basar.

else: Eğer @params[:input_file] değişkeni boşsa (dosya belirtilmemişse), bu blok çalışır.

print_help: Bu satır, daha önce tanımlanan print_help metotunu çağırarak kullanım talimatlarını ekrana basar.

end: main metodu tanımının sonunu belirtir.

end: LIER_SHELL sınıfının tanımının sonunu belirtir.

class String: Bu satır, String sınıfına özel metotların tanımlanacağını belirtir.

def red, def green, def magenta: Bu satırlar, String sınıfına yeni metotlar ekler. Bu metotlar, metinleri kırmızı, yeşil ve magenta renklerde göstermek için kullanılır.

lier = LIER_SHELL.new: Bu satır, LIER_SHELL sınıfının bir örneğini (lier) oluşturur.


lier.main: Bu satır, lier örneğinin main metodu aracılığıyla betiği çalıştırmasını sağlar. main metodu, betiğin ana işlevselliğini gerçekleştirir ve komut satırı parametrelerini işler, dosyaları okur ve taramayı başlatır.
Tüm Kod:
Ruby:
require 'net/http'
require 'optparse'
require 'uri'

# Coded By Bunjo
# Turk Hack Team

class LIER_SHELL
  def initialize
    @path_list = ['/index.php']
    @querys = ['p=']

    @threads = []

    @params = {
      input_file: nil,
      output_file: 'output.txt'
    }

    @headers = {
      'User-Agent' => 'Mozlila/5.0 (Linux; Android 7.0; SM-G892A Bulid/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/60.0.3112.107 Moblie Safari/537.36'
    }
  end

  def check_site(url)
    @path_list.each do |each_path|
      @querys.each do |query|
        begin
          target = URI.parse(url)
          target.path += each_path
          target.query = query

          http = Net::HTTP.new(target.host, target.port)

          http.open_timeout = 10
          http.read_timeout = 10

          http.use_ssl = (target.scheme == "https")

          request = Net::HTTP::Get.new(target.path, @headers)
          response = http.request(request)

          if response
            if response.body.include?("<title>L I E R SHELL</title>")
              File.open(@params[:output_file], "a+") do |file|
                file.puts(target)
              end

              puts("#{target} --> Successfully #{response.code} ".green)
              return
            else
              puts("#{target} --> Not Vuln #{response.code} ".red)
            end
          else
            puts("#{target} --> Not Vuln ".red)
          end
        end
      rescue StandardError => err
        puts("#{target} --> Not Vuln #{err.class}".red)
        return
      rescue Net::ReadTimeout, Net::OpenTimeout
        puts("#{target} --> Not Vuln #{err.class}".red)
        return
      end
    end
  end

  def parse_lines(group)
    group.each do |line|
      url_line = URI.parse(line.strip)

      if url_line.scheme
        check_site(url_line)
      else
        url_line = "http://#{line.strip}"
        url_parsed = URI.parse(url_line)

        check_site(url_parsed)
      end
    end
  end

  def print_help
    help_text = <<-'HELP_TEXT'
USAGE: ruby lier_finder.rb [options]

OPTIONS:
  -i, --input_file FILE: Define the path to the URL file.
  -o, --output_file FILE: Define the name of the output log file.
    HELP_TEXT

    puts(help_text.magenta)
  end

  def opt_parser
    begin
      OptionParser.new do |opts|
        opts.on "-i", "--input_file INPUT_FILE" do |input_file|
          if File.exist?(input_file)
            @params[:input_file] = input_file
          else
            puts("File not found: #{input_file}".red)
            exit(1)
          end
        end

        opts.on "-o", "--output_file OUTPUT_FILE" do |output_file|
          @params[:output_file] = output_file
        end
      end.parse!
    rescue Exception => exception
      puts("Error: #{exception}")
      exit
    end
  end

  def main
    opt_parser

    unless @params[:input_file].nil?
      lines = File.readlines(@params[:input_file]).uniq

      lines.each_slice(20) do |group_lines|
        @threads << Thread.new { parse_lines(group_lines) }
      end

      @threads.each(&:join)
      puts()
      puts("Scan Completed.".magenta)

    else
      print_help
    end
  end
end

class String
  def red
    "\e[31m#{self}\e[0m"
  end

  def green
    "\e[32m#{self}\e[0m"
  end

  def magenta
    "\e[35m#{self}\e[0m"
  end
end

lier = LIER_SHELL.new
lier.main

i7ovh1e.png


Kullanım Örneği

60jum4r.png


ygbic1a.png


Okuyan herkese teşekkür ederim.

İyi forumlar!


Elinize sağlık hocam
 

PanchiaNN

Junior Hunter
29 Tem 2022
136
110
United States & Türkiye
m9RCVr.png



kbrn6ph.png


Merhabalar ben Anka Red Team'den Bunjo,

bu konuda "Lier Shell" için bir finder kodlamayı anlatacağım.


Wordpress LIER Shell

(WordPress) Sitelere basılan shellerden bir tanesidir.

Örnek Site: L I E R SHELL

Shell içeren sitelere log bırakmamaya özen göstermeniz tavsiyedir.

Shell İçin Örnek Görsel:


4775cal.png

i7ovh1e.png


Wordpress LIER Shell Finder
Ruby:
require 'net/http'
require 'optparse'
require 'uri'

# Coded By Bunjo
# Turk Hack Team

require 'net/http': Bu satır, Ruby'de Net::HTTP sınıfını kullanabilmek için gerekli kütüphaneyi (net/http) yükler. Net::HTTP, HTTP istekleri göndermek ve HTTP yanıtlarını almak için kullanılır.

require 'optparse': Bu satır, komut satırı parametrelerini işlemek için optparse kütüphanesini yükler. OptionParser sınıfını kullanarak komut satırı argümanlarını analiz edebilir ve işleyebiliriz.

require 'uri': Bu satır, URI (Uniform Resource Identifier) işlemleri yapmak için uri kütüphanesini yükler. URI sınıfı, URL'leri ayrıştırmak ve oluşturmak için kullanılır.

Ruby:
class LIER_SHELL
  def initialize
    @path_list = ['/index.php']
    @querys = ['p=']

    @threads = []

    @params = {
      input_file: nil,
      output_file: 'output.txt'
    }

    @headers = {
      'User-Agent' => 'Mozlila/5.0 (Linux; Android 7.0; SM-G892A Bulid/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/60.0.3112.107 Moblie Safari/537.36'
    }
  end

class LIER_SHELL: Bu satır, LIER_SHELL adında bir sınıfın tanımlanacağını belirtir. Ruby'de sınıflar, nesneleri tanımlamak için kullanılır ve içinde özellikler (değişkenler) ve davranışlar (metotlar) bulunur.

def initialize: Bu satır, initialize adında bir metotun tanımlanacağını belirtir. initialize metodu, bir sınıf örneği (nesnesi) oluşturulduğunda otomatik olarak çağrılır ve sınıfın başlangıç durumunu (başlangıç değerlerini) ayarlamak için kullanılır.

@path_list = ['/index.php']: Bu satır, @path_list adında bir instance variable'ın (örnek değişkeni) tanımlandığını ve bu değişkenin değerinin ['/index.php'] olarak başlatıldığını gösterir. Bu değişken, sınıf içinde farklı URL yollarını tutmak için kullanılabilir.

@querys = ['p=']: Bu satır, @querys adında bir instance variable'ın tanımlandığını ve bu değişkenin değerinin ['p='] olarak başlatıldığını gösterir. Bu değişken, sınıf içinde farklı sorgu parametrelerini tutmak için kullanılabilir.

@threads = []: Bu satır, @threads adında bir instance variable'ın tanımlandığını ve bu değişkenin boş bir dizi olarak başlatıldığını gösterir. Bu değişken, sınıf içinde çalışan iş parçacıklarını (threads) tutmak için kullanılabilir.

@ params = { input_file: nil, output_file: 'output.txt' }: Bu satır, @params adında bir instance variable'ın tanımlandığını ve bu değişkenin değerinin bir hash (sözlük) olarak başlatıldığını gösterir. Hash, anahtar-değer çiftleri içerir. Burada input_file anahtarının değeri nil (boş) olarak, output_file anahtarının değeri ise 'output.txt' olarak başlatılmıştır. Bu değişken, sınıf içinde parametreler veya ayarlar için kullanılabilir.

@ headers = { 'User-Agent' => 'Mozlila/5.0 (Linux; Android 7.0; SM-G892A Bulid/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/60.0.3112.107 Moblie Safari/537.36' }: Bu satır, @headers adında bir instance variable'ın tanımlandığını ve bu değişkenin değerinin bir hash olarak başlatıldığını gösterir. Bu hash, HTTP isteklerinde kullanılacak başlık (header) bilgilerini içerir.

Ruby:
def check_site(url)
    @path_list.each do |each_path|
      @querys.each do |query|
        begin
          target = URI.parse(url)
          target.path += each_path
          target.query = query

          http = Net::HTTP.new(target.host, target.port)

          http.open_timeout = 10
          http.read_timeout = 10

          http.use_ssl = (target.scheme == "https")

          request = Net::HTTP::Get.new(target.path, @headers)
          response = http.request(request)

          if response
            if response.body.include?("<title>L I E R SHELL</title>")
              File.open(@params[:output_file], "a+") do |file|
                file.puts(target)
              end

              puts("#{target} --> Successfully #{response.code} ".green)
              return
            else
              puts("#{target} --> Not Vuln #{response.code} ".red)
            end
          else
            puts("#{target} --> Not Vuln ".red)
          end
        end
      rescue StandardError => err
        puts("#{target} --> Not Vuln #{err.class}".red)
        return
      rescue Net::ReadTimeout, Net::OpenTimeout
        puts("#{target} --> Not Vuln #{err.class}".red)
        return
      end
    end
  end

def check_site(url): Bu satır, check_site adında bir metot tanımlar ve url adında bir parametre alır. Bu metot, verilen URL üzerinde belirli yollar ve sorgularla HTTP istekleri yapar ve yanıtları değerlendirir.

@path_list.each do |each_path|: Bu satır, @path_list içindeki her bir yol için döngü oluşturur. @path_list sınıfın önceki kısmında tanımlanmış ve bu diziye eklenen yollar üzerinde HTTP istekleri yapılacak.

@querys.each do |query|: Bu satır, @querys içindeki her bir sorgu için döngü oluşturur. @ querys sınıfın önceki kısmında tanımlanmış ve bu diziye eklenen sorgularla HTTP istekleri yapılacak.

begin ve rescue blokları: Bu satırlar arasındaki kod, olası hata durumlarına karşı bir hata yakalama (exception handling) mekanizması sağlar. begin bloğu, olası hata durumlarını işlemek için bir başlangıç noktası belirtir. rescue blokları, farklı hata tiplerine göre işlem yapar.

target = URI.parse(url): Bu satır, verilen url üzerinde işlem yapabilmek için URI.parse metodunu kullanarak bir target URI nesnesi oluşturur.

target.path += each_path ve target.query = query: Bu satırlar, target URI nesnesinin yollarını ve sorgularını belirliyor. Her bir yoldan ve sorgudan sonra HTTP isteği yapılacak.

http = Net::HTTP.new(target.host, target.port): Bu satır, HTTP isteği yapmak için bir Net::HTTP nesnesi oluşturur ve target URL'sinin ana bilgisayarını (host) ve bağlantı noktasını (port) belirler.

http.open_timeout = 10 ve http.read_timeout = 10: Bu satırlar, HTTP isteğinin maksimum açık kalma süresini (open_timeout) ve okuma süresini (read_timeout) belirler. Burada her ikisi de 10 saniye olarak ayarlanmıştır.

http.use_ssl = (target.scheme == "https"): Bu satır, HTTPS üzerinden iletişim yapılacaksa use_ssl özelliğini true olarak ayarlar; aksi halde false olarak kalır.

request = Net::HTTP::Get.new(target.path, @headers): Bu satır, HTTP GET isteği oluşturur ve @headers içindeki başlıkları (headers) kullanarak isteği hazırlar.

response = http.request(request): Bu satır, oluşturulan HTTP isteğini gönderir ve yanıtı response değişkenine atar.

Yanıtın değerlendirilmesi: Kodun bu kısmı, HTTP yanıtını değerlendirir ve belirli bir koşula göre işlem yapar. Eğer yanıt içeriği <title>L I E R SHELL</title> içeriyorsa, bu bir zafiyet olarak kabul edilir ve sonuçlar output_file adlı dosyaya yazılır. Aksi halde yanıtı ekrana basar.


Hata durumları: rescue blokları, olası hata durumlarını yakalar ve ilgili mesajları ekrana basar. Örneğin, StandardError türündeki hataların yanı sıra belirli zaman aşımı (Net::ReadTimeout, Net::OpenTimeout) hataları da ele alınır.

Ruby:
def parse_lines(group)
    group.each do |line|
      url_line = URI.parse(line.strip)

      if url_line.scheme
        check_site(url_line)
      else
        url_line = "http://#{line.strip}"
        url_parsed = URI.parse(url_line)

        check_site(url_parsed)
      end
    end
  end

def parse_lines(group): Bu satır, parse_lines adında bir metot tanımlar ve group adında bir parametre alır. Bu parametre, parse_lines metoduna verilen dizi içindeki öğeleri temsil eder.

group.each do |line|: Bu satır, group dizisindeki her bir öğe için bir döngü oluşturur. Bu döngü, line değişkeni üzerinde çalışır ve her bir öğeyi işler.

url_line = URI.parse(line.strip): Bu satır, line öğesini bir URI nesnesine (url_line) dönüştürür. strip metodu kullanılarak öğenin başındaki ve sonundaki boşluklar silinir.

if url_line.scheme: Bu satır, url_line nesnesinin bir şema (scheme) içerip içermediğini kontrol eder. Eğer bir şema varsa (http://, https:// gibi), bu if bloğu çalışır.

check_site(url_line): Bu satır, check_site metodunu çağırarak url_line nesnesi üzerinde belirli bir zafiyetin varlığını kontrol etmek için kullanılır. Bu metot, daha önce tanımlanmış bir metottur ve belirli bir URL üzerinde HTTP istekleri yaparak zafiyet kontrolü yapar.

else: Eğer url_line nesnesinin şeması yoksa (yani URL olarak geçerli bir formatta değilse), bu blok çalışır.

url_line = "http://#{line.strip}": Bu satır, http:// ön ekini ekleyerek line öğesini geçerli bir URL formatına (url_line) dönüştürür.

url_parsed = URI.parse(url_line): Bu satır, url_line öğesini bir URI nesnesine (url_parsed) dönüştürür.

check_site(url_parsed): Bu satır, check_site metodunu çağırarak url_parsed nesnesi üzerinde belirli bir zafiyetin varlığını kontrol etmek için kullanılır. Bu metot, daha önce tanımlanmış bir metottur ve belirli bir URL üzerinde HTTP istekleri yaparak zafiyet kontrolü yapar.
Ruby:
def print_help
    help_text = <<-'HELP_TEXT'
USAGE: ruby lier_finder.rb [options]

OPTIONS:
  -i, --input_file FILE: Define the path to the URL file.
  -o, --output_file FILE: Define the name of the output log file.
    HELP_TEXT

    puts(help_text.magenta)
  end

  def opt_parser
    begin
      OptionParser.new do |opts|
        opts.on "-i", "--input_file INPUT_FILE" do |input_file|
          if File.exist?(input_file)
            @params[:input_file] = input_file
          else
            puts("File not found: #{input_file}".red)
            exit(1)
          end
        end

        opts.on "-o", "--output_file OUTPUT_FILE" do |output_file|
          @params[:output_file] = output_file
        end
      end.parse!
    rescue Exception => exception
      puts("Error: #{exception}")
      exit
    end
  end

def print_help: Bu satır, print_help adında bir metot tanımlar. Bu metot, betiğin kullanımını gösteren bir yardım metni (help_text) oluşturur ve bu metni konsola (puts) magenta renkte basar.

help_text = <<-'HELP_TEXT' ... END: Bu satır, çok satırlı bir string ifadesi (help_text) oluşturur. <<-'HELP_TEXT' ifadesiyle başlayan satır, altındaki satırların HELP_TEXT etiketiyle bitirildiğini belirtir. Bu şekilde çok satırlı bir metin bloğu oluşturulabilir.

puts(help_text.magenta): Bu satır, help_text metnini magenta renkte konsola basar.

def opt_parser: Bu satır, opt_parser adında bir metot tanımlar. Bu metot, komut satırı parametrelerini işlemek için OptionParser sınıfını kullanır.

OptionParser.new do |opts| ... end.parse!: Bu satır, OptionParser sınıfını kullanarak komut satırı parametrelerini işlemek için bir yapı oluşturur. opts.on metoduyla komut satırı seçenekleri tanımlanır ve bu seçeneklerin değerleri alınır.

-i, --input_file INPUT_FILE: Bu satır, -i veya --input_file seçeneğiyle belirtilen giriş dosyasının yolunu belirler. Bu seçenek kullanıldığında, belirtilen dosya varsa @params[:input_file] değişkenine atanır.

-o, --output_file OUTPUT_FILE: Bu satır, -o veya --output_file seçeneğiyle belirtilen çıktı dosyasının adını belirler. Bu seçenek kullanıldığında, belirtilen ad @params[:eek:utput_file] değişkenine atanır.

File.exist?(input_file): Bu satır, verilen input_file yolunda bir dosyanın var olup olmadığını kontrol eder. Eğer dosya yoksa, hata mesajı basılır (puts) ve program exit(1) ile sonlandırılır.


rescue Exception => exception: Bu satır, OptionParser ile ilgili bir hata oluştuğunda (Exception), bu hatayı yakalar ve exception değişkenine atar. Sonrasında hata mesajı ("Error: #{exception}") basılır ve program exit ile sonlandırılır.

Ruby:
  def main
    opt_parser

    unless @params[:input_file].nil?
      lines = File.readlines(@params[:input_file]).uniq

      lines.each_slice(20) do |group_lines|
        @threads << Thread.new { parse_lines(group_lines) }
      end

      @threads.each(&:join)
      puts()
      puts("Scan Completed.".magenta)

    else
      print_help
    end
  end
end

class String
  def red
    "\e[31m#{self}\e[0m"
  end

  def green
    "\e[32m#{self}\e[0m"
  end

  def magenta
    "\e[35m#{self}\e[0m"
  end
end

lier = LIER_SHELL.new
lier.main

def main: Bu satır, main adında bir metot tanımlar. Bu metot, betiğin ana çalışma mantığını içerir.

opt_parser: Bu satır, daha önce tanımlanan opt_parser metotunu çağırarak komut satırı parametrelerini işler.

unless @params[:input_file].nil?: Bu satır, @params[:input_file] değişkeninin boş olup olmadığını kontrol eder. Eğer boş değilse (dosya belirtilmişse), unless bloğu çalışır.

lines = File.readlines(@params[:input_file]).uniq: Bu satır, @params[:input_file] değişkenine belirtilen dosyayı okur ve her satırı bir diziye (lines) atar. uniq metodu ile dizi içindeki aynı satırları tekilleştirir.

lines.each_slice(20) do |group_lines|: Bu satır, lines dizisini 20'şer satırlık gruplara ayırır ve her grup için bir blok oluşturur. Her blok, group_lines adıyla kullanılır ve içindeki satırları temsil eder.

@threads << Thread.new { parse_lines(group_lines) }: Bu satır, her bir grup için yeni bir iş parçacığı (thread) oluşturur ve bu iş parçacığı içinde parse_lines metodu çağrılır. Bu iş parçacıkları @threads dizisine eklenir.

@threads.each(&:join): Bu satır, @threads dizisindeki her bir iş parçacığının tamamlanmasını bekler (join metodu).

puts("Scan Completed.".magenta): Bu satır, taramanın tamamlandığını belirten bir mesajı magenta renkte ekrana basar.

else: Eğer @params[:input_file] değişkeni boşsa (dosya belirtilmemişse), bu blok çalışır.

print_help: Bu satır, daha önce tanımlanan print_help metotunu çağırarak kullanım talimatlarını ekrana basar.

end: main metodu tanımının sonunu belirtir.

end: LIER_SHELL sınıfının tanımının sonunu belirtir.

class String: Bu satır, String sınıfına özel metotların tanımlanacağını belirtir.

def red, def green, def magenta: Bu satırlar, String sınıfına yeni metotlar ekler. Bu metotlar, metinleri kırmızı, yeşil ve magenta renklerde göstermek için kullanılır.

lier = LIER_SHELL.new: Bu satır, LIER_SHELL sınıfının bir örneğini (lier) oluşturur.


lier.main: Bu satır, lier örneğinin main metodu aracılığıyla betiği çalıştırmasını sağlar. main metodu, betiğin ana işlevselliğini gerçekleştirir ve komut satırı parametrelerini işler, dosyaları okur ve taramayı başlatır.
Tüm Kod:
Ruby:
require 'net/http'
require 'optparse'
require 'uri'

# Coded By Bunjo
# Turk Hack Team

class LIER_SHELL
  def initialize
    @path_list = ['/index.php']
    @querys = ['p=']

    @threads = []

    @params = {
      input_file: nil,
      output_file: 'output.txt'
    }

    @headers = {
      'User-Agent' => 'Mozlila/5.0 (Linux; Android 7.0; SM-G892A Bulid/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/60.0.3112.107 Moblie Safari/537.36'
    }
  end

  def check_site(url)
    @path_list.each do |each_path|
      @querys.each do |query|
        begin
          target = URI.parse(url)
          target.path += each_path
          target.query = query

          http = Net::HTTP.new(target.host, target.port)

          http.open_timeout = 10
          http.read_timeout = 10

          http.use_ssl = (target.scheme == "https")

          request = Net::HTTP::Get.new(target.path, @headers)
          response = http.request(request)

          if response
            if response.body.include?("<title>L I E R SHELL</title>")
              File.open(@params[:output_file], "a+") do |file|
                file.puts(target)
              end

              puts("#{target} --> Successfully #{response.code} ".green)
              return
            else
              puts("#{target} --> Not Vuln #{response.code} ".red)
            end
          else
            puts("#{target} --> Not Vuln ".red)
          end
        end
      rescue StandardError => err
        puts("#{target} --> Not Vuln #{err.class}".red)
        return
      rescue Net::ReadTimeout, Net::OpenTimeout
        puts("#{target} --> Not Vuln #{err.class}".red)
        return
      end
    end
  end

  def parse_lines(group)
    group.each do |line|
      url_line = URI.parse(line.strip)

      if url_line.scheme
        check_site(url_line)
      else
        url_line = "http://#{line.strip}"
        url_parsed = URI.parse(url_line)

        check_site(url_parsed)
      end
    end
  end

  def print_help
    help_text = <<-'HELP_TEXT'
USAGE: ruby lier_finder.rb [options]

OPTIONS:
  -i, --input_file FILE: Define the path to the URL file.
  -o, --output_file FILE: Define the name of the output log file.
    HELP_TEXT

    puts(help_text.magenta)
  end

  def opt_parser
    begin
      OptionParser.new do |opts|
        opts.on "-i", "--input_file INPUT_FILE" do |input_file|
          if File.exist?(input_file)
            @params[:input_file] = input_file
          else
            puts("File not found: #{input_file}".red)
            exit(1)
          end
        end

        opts.on "-o", "--output_file OUTPUT_FILE" do |output_file|
          @params[:output_file] = output_file
        end
      end.parse!
    rescue Exception => exception
      puts("Error: #{exception}")
      exit
    end
  end

  def main
    opt_parser

    unless @params[:input_file].nil?
      lines = File.readlines(@params[:input_file]).uniq

      lines.each_slice(20) do |group_lines|
        @threads << Thread.new { parse_lines(group_lines) }
      end

      @threads.each(&:join)
      puts()
      puts("Scan Completed.".magenta)

    else
      print_help
    end
  end
end

class String
  def red
    "\e[31m#{self}\e[0m"
  end

  def green
    "\e[32m#{self}\e[0m"
  end

  def magenta
    "\e[35m#{self}\e[0m"
  end
end

lier = LIER_SHELL.new
lier.main

i7ovh1e.png


Kullanım Örneği

60jum4r.png


ygbic1a.png


Okuyan herkese teşekkür ederim.

İyi forumlar!


Ellerine sağlık bunjommm
 

Bunjo

Uzman üye
14 Ara 2020
1,581
1,859
HTTParty

ACE Veen

Uzman üye
4 Şub 2023
1,087
544
Belirsiz
m9RCVr.png



kbrn6ph.png


Merhabalar ben Anka Red Team'den Bunjo,

bu konuda "Lier Shell" için bir finder kodlamayı anlatacağım.


Wordpress LIER Shell

(WordPress) Sitelere basılan shellerden bir tanesidir.

Örnek Site: L I E R SHELL

Shell içeren sitelere log bırakmamaya özen göstermeniz tavsiyedir.

Shell İçin Örnek Görsel:


4775cal.png

i7ovh1e.png


Wordpress LIER Shell Finder
Ruby:
require 'net/http'
require 'optparse'
require 'uri'

# Coded By Bunjo
# Turk Hack Team

require 'net/http': Bu satır, Ruby'de Net::HTTP sınıfını kullanabilmek için gerekli kütüphaneyi (net/http) yükler. Net::HTTP, HTTP istekleri göndermek ve HTTP yanıtlarını almak için kullanılır.

require 'optparse': Bu satır, komut satırı parametrelerini işlemek için optparse kütüphanesini yükler. OptionParser sınıfını kullanarak komut satırı argümanlarını analiz edebilir ve işleyebiliriz.

require 'uri': Bu satır, URI (Uniform Resource Identifier) işlemleri yapmak için uri kütüphanesini yükler. URI sınıfı, URL'leri ayrıştırmak ve oluşturmak için kullanılır.

Ruby:
class LIER_SHELL
  def initialize
    @path_list = ['/index.php']
    @querys = ['p=']

    @threads = []

    @params = {
      input_file: nil,
      output_file: 'output.txt'
    }

    @headers = {
      'User-Agent' => 'Mozlila/5.0 (Linux; Android 7.0; SM-G892A Bulid/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/60.0.3112.107 Moblie Safari/537.36'
    }
  end

class LIER_SHELL: Bu satır, LIER_SHELL adında bir sınıfın tanımlanacağını belirtir. Ruby'de sınıflar, nesneleri tanımlamak için kullanılır ve içinde özellikler (değişkenler) ve davranışlar (metotlar) bulunur.

def initialize: Bu satır, initialize adında bir metotun tanımlanacağını belirtir. initialize metodu, bir sınıf örneği (nesnesi) oluşturulduğunda otomatik olarak çağrılır ve sınıfın başlangıç durumunu (başlangıç değerlerini) ayarlamak için kullanılır.

@path_list = ['/index.php']: Bu satır, @path_list adında bir instance variable'ın (örnek değişkeni) tanımlandığını ve bu değişkenin değerinin ['/index.php'] olarak başlatıldığını gösterir. Bu değişken, sınıf içinde farklı URL yollarını tutmak için kullanılabilir.

@querys = ['p=']: Bu satır, @querys adında bir instance variable'ın tanımlandığını ve bu değişkenin değerinin ['p='] olarak başlatıldığını gösterir. Bu değişken, sınıf içinde farklı sorgu parametrelerini tutmak için kullanılabilir.

@threads = []: Bu satır, @threads adında bir instance variable'ın tanımlandığını ve bu değişkenin boş bir dizi olarak başlatıldığını gösterir. Bu değişken, sınıf içinde çalışan iş parçacıklarını (threads) tutmak için kullanılabilir.

@ params = { input_file: nil, output_file: 'output.txt' }: Bu satır, @params adında bir instance variable'ın tanımlandığını ve bu değişkenin değerinin bir hash (sözlük) olarak başlatıldığını gösterir. Hash, anahtar-değer çiftleri içerir. Burada input_file anahtarının değeri nil (boş) olarak, output_file anahtarının değeri ise 'output.txt' olarak başlatılmıştır. Bu değişken, sınıf içinde parametreler veya ayarlar için kullanılabilir.

@ headers = { 'User-Agent' => 'Mozlila/5.0 (Linux; Android 7.0; SM-G892A Bulid/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/60.0.3112.107 Moblie Safari/537.36' }: Bu satır, @headers adında bir instance variable'ın tanımlandığını ve bu değişkenin değerinin bir hash olarak başlatıldığını gösterir. Bu hash, HTTP isteklerinde kullanılacak başlık (header) bilgilerini içerir.

Ruby:
def check_site(url)
    @path_list.each do |each_path|
      @querys.each do |query|
        begin
          target = URI.parse(url)
          target.path += each_path
          target.query = query

          http = Net::HTTP.new(target.host, target.port)

          http.open_timeout = 10
          http.read_timeout = 10

          http.use_ssl = (target.scheme == "https")

          request = Net::HTTP::Get.new(target.path, @headers)
          response = http.request(request)

          if response
            if response.body.include?("<title>L I E R SHELL</title>")
              File.open(@params[:output_file], "a+") do |file|
                file.puts(target)
              end

              puts("#{target} --> Successfully #{response.code} ".green)
              return
            else
              puts("#{target} --> Not Vuln #{response.code} ".red)
            end
          else
            puts("#{target} --> Not Vuln ".red)
          end
        end
      rescue StandardError => err
        puts("#{target} --> Not Vuln #{err.class}".red)
        return
      rescue Net::ReadTimeout, Net::OpenTimeout
        puts("#{target} --> Not Vuln #{err.class}".red)
        return
      end
    end
  end

def check_site(url): Bu satır, check_site adında bir metot tanımlar ve url adında bir parametre alır. Bu metot, verilen URL üzerinde belirli yollar ve sorgularla HTTP istekleri yapar ve yanıtları değerlendirir.

@path_list.each do |each_path|: Bu satır, @path_list içindeki her bir yol için döngü oluşturur. @path_list sınıfın önceki kısmında tanımlanmış ve bu diziye eklenen yollar üzerinde HTTP istekleri yapılacak.

@querys.each do |query|: Bu satır, @querys içindeki her bir sorgu için döngü oluşturur. @ querys sınıfın önceki kısmında tanımlanmış ve bu diziye eklenen sorgularla HTTP istekleri yapılacak.

begin ve rescue blokları: Bu satırlar arasındaki kod, olası hata durumlarına karşı bir hata yakalama (exception handling) mekanizması sağlar. begin bloğu, olası hata durumlarını işlemek için bir başlangıç noktası belirtir. rescue blokları, farklı hata tiplerine göre işlem yapar.

target = URI.parse(url): Bu satır, verilen url üzerinde işlem yapabilmek için URI.parse metodunu kullanarak bir target URI nesnesi oluşturur.

target.path += each_path ve target.query = query: Bu satırlar, target URI nesnesinin yollarını ve sorgularını belirliyor. Her bir yoldan ve sorgudan sonra HTTP isteği yapılacak.

http = Net::HTTP.new(target.host, target.port): Bu satır, HTTP isteği yapmak için bir Net::HTTP nesnesi oluşturur ve target URL'sinin ana bilgisayarını (host) ve bağlantı noktasını (port) belirler.

http.open_timeout = 10 ve http.read_timeout = 10: Bu satırlar, HTTP isteğinin maksimum açık kalma süresini (open_timeout) ve okuma süresini (read_timeout) belirler. Burada her ikisi de 10 saniye olarak ayarlanmıştır.

http.use_ssl = (target.scheme == "https"): Bu satır, HTTPS üzerinden iletişim yapılacaksa use_ssl özelliğini true olarak ayarlar; aksi halde false olarak kalır.

request = Net::HTTP::Get.new(target.path, @headers): Bu satır, HTTP GET isteği oluşturur ve @headers içindeki başlıkları (headers) kullanarak isteği hazırlar.

response = http.request(request): Bu satır, oluşturulan HTTP isteğini gönderir ve yanıtı response değişkenine atar.

Yanıtın değerlendirilmesi: Kodun bu kısmı, HTTP yanıtını değerlendirir ve belirli bir koşula göre işlem yapar. Eğer yanıt içeriği <title>L I E R SHELL</title> içeriyorsa, bu bir zafiyet olarak kabul edilir ve sonuçlar output_file adlı dosyaya yazılır. Aksi halde yanıtı ekrana basar.


Hata durumları: rescue blokları, olası hata durumlarını yakalar ve ilgili mesajları ekrana basar. Örneğin, StandardError türündeki hataların yanı sıra belirli zaman aşımı (Net::ReadTimeout, Net::OpenTimeout) hataları da ele alınır.

Ruby:
def parse_lines(group)
    group.each do |line|
      url_line = URI.parse(line.strip)

      if url_line.scheme
        check_site(url_line)
      else
        url_line = "http://#{line.strip}"
        url_parsed = URI.parse(url_line)

        check_site(url_parsed)
      end
    end
  end

def parse_lines(group): Bu satır, parse_lines adında bir metot tanımlar ve group adında bir parametre alır. Bu parametre, parse_lines metoduna verilen dizi içindeki öğeleri temsil eder.

group.each do |line|: Bu satır, group dizisindeki her bir öğe için bir döngü oluşturur. Bu döngü, line değişkeni üzerinde çalışır ve her bir öğeyi işler.

url_line = URI.parse(line.strip): Bu satır, line öğesini bir URI nesnesine (url_line) dönüştürür. strip metodu kullanılarak öğenin başındaki ve sonundaki boşluklar silinir.

if url_line.scheme: Bu satır, url_line nesnesinin bir şema (scheme) içerip içermediğini kontrol eder. Eğer bir şema varsa (http://, https:// gibi), bu if bloğu çalışır.

check_site(url_line): Bu satır, check_site metodunu çağırarak url_line nesnesi üzerinde belirli bir zafiyetin varlığını kontrol etmek için kullanılır. Bu metot, daha önce tanımlanmış bir metottur ve belirli bir URL üzerinde HTTP istekleri yaparak zafiyet kontrolü yapar.

else: Eğer url_line nesnesinin şeması yoksa (yani URL olarak geçerli bir formatta değilse), bu blok çalışır.

url_line = "http://#{line.strip}": Bu satır, http:// ön ekini ekleyerek line öğesini geçerli bir URL formatına (url_line) dönüştürür.

url_parsed = URI.parse(url_line): Bu satır, url_line öğesini bir URI nesnesine (url_parsed) dönüştürür.

check_site(url_parsed): Bu satır, check_site metodunu çağırarak url_parsed nesnesi üzerinde belirli bir zafiyetin varlığını kontrol etmek için kullanılır. Bu metot, daha önce tanımlanmış bir metottur ve belirli bir URL üzerinde HTTP istekleri yaparak zafiyet kontrolü yapar.
Ruby:
def print_help
    help_text = <<-'HELP_TEXT'
USAGE: ruby lier_finder.rb [options]

OPTIONS:
  -i, --input_file FILE: Define the path to the URL file.
  -o, --output_file FILE: Define the name of the output log file.
    HELP_TEXT

    puts(help_text.magenta)
  end

  def opt_parser
    begin
      OptionParser.new do |opts|
        opts.on "-i", "--input_file INPUT_FILE" do |input_file|
          if File.exist?(input_file)
            @params[:input_file] = input_file
          else
            puts("File not found: #{input_file}".red)
            exit(1)
          end
        end

        opts.on "-o", "--output_file OUTPUT_FILE" do |output_file|
          @params[:output_file] = output_file
        end
      end.parse!
    rescue Exception => exception
      puts("Error: #{exception}")
      exit
    end
  end

def print_help: Bu satır, print_help adında bir metot tanımlar. Bu metot, betiğin kullanımını gösteren bir yardım metni (help_text) oluşturur ve bu metni konsola (puts) magenta renkte basar.

help_text = <<-'HELP_TEXT' ... END: Bu satır, çok satırlı bir string ifadesi (help_text) oluşturur. <<-'HELP_TEXT' ifadesiyle başlayan satır, altındaki satırların HELP_TEXT etiketiyle bitirildiğini belirtir. Bu şekilde çok satırlı bir metin bloğu oluşturulabilir.

puts(help_text.magenta): Bu satır, help_text metnini magenta renkte konsola basar.

def opt_parser: Bu satır, opt_parser adında bir metot tanımlar. Bu metot, komut satırı parametrelerini işlemek için OptionParser sınıfını kullanır.

OptionParser.new do |opts| ... end.parse!: Bu satır, OptionParser sınıfını kullanarak komut satırı parametrelerini işlemek için bir yapı oluşturur. opts.on metoduyla komut satırı seçenekleri tanımlanır ve bu seçeneklerin değerleri alınır.

-i, --input_file INPUT_FILE: Bu satır, -i veya --input_file seçeneğiyle belirtilen giriş dosyasının yolunu belirler. Bu seçenek kullanıldığında, belirtilen dosya varsa @params[:input_file] değişkenine atanır.

-o, --output_file OUTPUT_FILE: Bu satır, -o veya --output_file seçeneğiyle belirtilen çıktı dosyasının adını belirler. Bu seçenek kullanıldığında, belirtilen ad @params[:eek:utput_file] değişkenine atanır.

File.exist?(input_file): Bu satır, verilen input_file yolunda bir dosyanın var olup olmadığını kontrol eder. Eğer dosya yoksa, hata mesajı basılır (puts) ve program exit(1) ile sonlandırılır.


rescue Exception => exception: Bu satır, OptionParser ile ilgili bir hata oluştuğunda (Exception), bu hatayı yakalar ve exception değişkenine atar. Sonrasında hata mesajı ("Error: #{exception}") basılır ve program exit ile sonlandırılır.

Ruby:
  def main
    opt_parser

    unless @params[:input_file].nil?
      lines = File.readlines(@params[:input_file]).uniq

      lines.each_slice(20) do |group_lines|
        @threads << Thread.new { parse_lines(group_lines) }
      end

      @threads.each(&:join)
      puts()
      puts("Scan Completed.".magenta)

    else
      print_help
    end
  end
end

class String
  def red
    "\e[31m#{self}\e[0m"
  end

  def green
    "\e[32m#{self}\e[0m"
  end

  def magenta
    "\e[35m#{self}\e[0m"
  end
end

lier = LIER_SHELL.new
lier.main

def main: Bu satır, main adında bir metot tanımlar. Bu metot, betiğin ana çalışma mantığını içerir.

opt_parser: Bu satır, daha önce tanımlanan opt_parser metotunu çağırarak komut satırı parametrelerini işler.

unless @params[:input_file].nil?: Bu satır, @params[:input_file] değişkeninin boş olup olmadığını kontrol eder. Eğer boş değilse (dosya belirtilmişse), unless bloğu çalışır.

lines = File.readlines(@params[:input_file]).uniq: Bu satır, @params[:input_file] değişkenine belirtilen dosyayı okur ve her satırı bir diziye (lines) atar. uniq metodu ile dizi içindeki aynı satırları tekilleştirir.

lines.each_slice(20) do |group_lines|: Bu satır, lines dizisini 20'şer satırlık gruplara ayırır ve her grup için bir blok oluşturur. Her blok, group_lines adıyla kullanılır ve içindeki satırları temsil eder.

@threads << Thread.new { parse_lines(group_lines) }: Bu satır, her bir grup için yeni bir iş parçacığı (thread) oluşturur ve bu iş parçacığı içinde parse_lines metodu çağrılır. Bu iş parçacıkları @threads dizisine eklenir.

@threads.each(&:join): Bu satır, @threads dizisindeki her bir iş parçacığının tamamlanmasını bekler (join metodu).

puts("Scan Completed.".magenta): Bu satır, taramanın tamamlandığını belirten bir mesajı magenta renkte ekrana basar.

else: Eğer @params[:input_file] değişkeni boşsa (dosya belirtilmemişse), bu blok çalışır.

print_help: Bu satır, daha önce tanımlanan print_help metotunu çağırarak kullanım talimatlarını ekrana basar.

end: main metodu tanımının sonunu belirtir.

end: LIER_SHELL sınıfının tanımının sonunu belirtir.

class String: Bu satır, String sınıfına özel metotların tanımlanacağını belirtir.

def red, def green, def magenta: Bu satırlar, String sınıfına yeni metotlar ekler. Bu metotlar, metinleri kırmızı, yeşil ve magenta renklerde göstermek için kullanılır.

lier = LIER_SHELL.new: Bu satır, LIER_SHELL sınıfının bir örneğini (lier) oluşturur.


lier.main: Bu satır, lier örneğinin main metodu aracılığıyla betiği çalıştırmasını sağlar. main metodu, betiğin ana işlevselliğini gerçekleştirir ve komut satırı parametrelerini işler, dosyaları okur ve taramayı başlatır.
Tüm Kod:
Ruby:
require 'net/http'
require 'optparse'
require 'uri'

# Coded By Bunjo
# Turk Hack Team

class LIER_SHELL
  def initialize
    @path_list = ['/index.php']
    @querys = ['p=']

    @threads = []

    @params = {
      input_file: nil,
      output_file: 'output.txt'
    }

    @headers = {
      'User-Agent' => 'Mozlila/5.0 (Linux; Android 7.0; SM-G892A Bulid/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/60.0.3112.107 Moblie Safari/537.36'
    }
  end

  def check_site(url)
    @path_list.each do |each_path|
      @querys.each do |query|
        begin
          target = URI.parse(url)
          target.path += each_path
          target.query = query

          http = Net::HTTP.new(target.host, target.port)

          http.open_timeout = 10
          http.read_timeout = 10

          http.use_ssl = (target.scheme == "https")

          request = Net::HTTP::Get.new(target.path, @headers)
          response = http.request(request)

          if response
            if response.body.include?("<title>L I E R SHELL</title>")
              File.open(@params[:output_file], "a+") do |file|
                file.puts(target)
              end

              puts("#{target} --> Successfully #{response.code} ".green)
              return
            else
              puts("#{target} --> Not Vuln #{response.code} ".red)
            end
          else
            puts("#{target} --> Not Vuln ".red)
          end
        end
      rescue StandardError => err
        puts("#{target} --> Not Vuln #{err.class}".red)
        return
      rescue Net::ReadTimeout, Net::OpenTimeout
        puts("#{target} --> Not Vuln #{err.class}".red)
        return
      end
    end
  end

  def parse_lines(group)
    group.each do |line|
      url_line = URI.parse(line.strip)

      if url_line.scheme
        check_site(url_line)
      else
        url_line = "http://#{line.strip}"
        url_parsed = URI.parse(url_line)

        check_site(url_parsed)
      end
    end
  end

  def print_help
    help_text = <<-'HELP_TEXT'
USAGE: ruby lier_finder.rb [options]

OPTIONS:
  -i, --input_file FILE: Define the path to the URL file.
  -o, --output_file FILE: Define the name of the output log file.
    HELP_TEXT

    puts(help_text.magenta)
  end

  def opt_parser
    begin
      OptionParser.new do |opts|
        opts.on "-i", "--input_file INPUT_FILE" do |input_file|
          if File.exist?(input_file)
            @params[:input_file] = input_file
          else
            puts("File not found: #{input_file}".red)
            exit(1)
          end
        end

        opts.on "-o", "--output_file OUTPUT_FILE" do |output_file|
          @params[:output_file] = output_file
        end
      end.parse!
    rescue Exception => exception
      puts("Error: #{exception}")
      exit
    end
  end

  def main
    opt_parser

    unless @params[:input_file].nil?
      lines = File.readlines(@params[:input_file]).uniq

      lines.each_slice(20) do |group_lines|
        @threads << Thread.new { parse_lines(group_lines) }
      end

      @threads.each(&:join)
      puts()
      puts("Scan Completed.".magenta)

    else
      print_help
    end
  end
end

class String
  def red
    "\e[31m#{self}\e[0m"
  end

  def green
    "\e[32m#{self}\e[0m"
  end

  def magenta
    "\e[35m#{self}\e[0m"
  end
end

lier = LIER_SHELL.new
lier.main

i7ovh1e.png


Kullanım Örneği

60jum4r.png


ygbic1a.png


Okuyan herkese teşekkür ederim.

İyi forumlar!


çok güzel tool
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.