64 lines
2.0 KiB
Ruby
64 lines
2.0 KiB
Ruby
#
|
|
# Copyright (c) 2006-2015 Wade Alcorn - wade@bindshell.net
|
|
# Browser Exploitation Framework (BeEF) - http://beefproject.com
|
|
# See the file 'doc/COPYING' for copying permission
|
|
#
|
|
module BeEF
|
|
module Extension
|
|
module ETag
|
|
|
|
require 'sinatra/base'
|
|
require 'singleton'
|
|
|
|
class ETagMessages
|
|
include Singleton
|
|
attr_accessor :messages
|
|
|
|
def initialize()
|
|
@messages={}
|
|
end
|
|
end
|
|
|
|
class ETagWebServer < Sinatra::Base
|
|
def create_ET_header
|
|
inode = File.stat(__FILE__).ino
|
|
size = 3
|
|
mtime = (Time.now.to_f * 1000000).to_i
|
|
return "#{inode.to_s(16)}L-#{size.to_s(16)}L-#{mtime.to_s(16)}L"
|
|
end
|
|
|
|
get '/:id/start' do
|
|
data = ETagMessages.instance.messages[params[:id].to_i]
|
|
|
|
$etag_server_state = {} unless defined?($etag_server_state)
|
|
$etag_server_state[params[:id]] = {}
|
|
$etag_server_state[params[:id]][:cur_bit] = -1
|
|
$etag_server_state[params[:id]][:last_header] = create_ET_header
|
|
$etag_server_state[params[:id]][:message] = data
|
|
|
|
headers "ETag" => $etag_server_state[params[:id]][:last_header]
|
|
body "Message start"
|
|
end
|
|
|
|
get '/:id' do
|
|
return "Not started yet" if !defined?($etag_server_state) || $etag_server_state[params[:id]].nil?
|
|
if $etag_server_state[params[:id]][:cur_bit] < $etag_server_state[params[:id]][:message].length - 1
|
|
$etag_server_state[params[:id]][:cur_bit] += 1
|
|
else
|
|
$etag_server_state.delete(params[:id])
|
|
status 404
|
|
return "Bing"
|
|
end
|
|
|
|
if $etag_server_state[params[:id]][:message][$etag_server_state[params[:id]][:cur_bit]] == '1'
|
|
$etag_server_state[params[:id]][:last_header] = create_ET_header
|
|
end
|
|
|
|
headers "ETag" => $etag_server_state[params[:id]][:last_header]
|
|
body "Bit"
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|