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:
(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:
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.
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.
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.
@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[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.
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[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
Kullanım Örneği
Okuyan herkese teşekkür ederim.
İyi forumlar!
Okuyan herkese teşekkür ederim.
İyi forumlar!