mirror of
https://github.com/beefproject/beef
synced 2026-06-08 13:15:56 +00:00
Merge pull request #3574 from sethumadh/bugfix/3493-3498-ntype-attribute
Fix UnknownAttributeError on NetworkHost/NetworkService.create
This commit is contained in:
@@ -268,7 +268,7 @@ module BeEF
|
||||
proxy_log_string += " [server: #{proxy_server}]"
|
||||
if config.get('beef.extension.network.enable') == true && (proxy_server =~ /^([\d.]+):(\d+)$/)
|
||||
print_debug("Hooked browser [id:#{zombie.id}] is using a proxy [ip: #{Regexp.last_match(1)}]")
|
||||
BeEF::Core::Models::NetworkHost.create(hooked_browser_id: session_id, ip: Regexp.last_match(1), type: 'Proxy')
|
||||
BeEF::Core::Models::NetworkHost.create(hooked_browser_id: session_id, ip: Regexp.last_match(1), ntype: 'Proxy')
|
||||
end
|
||||
end
|
||||
BeEF::Core::Logger.instance.register('Zombie', proxy_log_string.to_s, zombie.id.to_s)
|
||||
|
||||
@@ -29,8 +29,8 @@ class Asus_rt_n12e_get_info < BeEF::Core::Command
|
||||
|
||||
if !ip.nil? && BeEF::Filters.is_valid_ip?(ip)
|
||||
print_debug("Hooked browser found Asus RT-N12E router [ip: #{ip}]")
|
||||
BeEF::Core::Models::NetworkHost.create(hooked_browser_id: session_id, ip: ip, type: 'Asus RT-N12E Router')
|
||||
BeEF::Core::Models::NetworkService.create(hooked_browser_id: session_id, proto: 'http', ip: ip, port: 80, type: 'HTTP Server')
|
||||
BeEF::Core::Models::NetworkHost.create(hooked_browser_id: session_id, ip: ip, ntype: 'Asus RT-N12E Router')
|
||||
BeEF::Core::Models::NetworkService.create(hooked_browser_id: session_id, proto: 'http', ip: ip, port: 80, ntype: 'HTTP Server')
|
||||
end
|
||||
|
||||
clients.scan(/([\d.]+,[:\dA-F]{17})/).flatten.each do |client|
|
||||
@@ -47,14 +47,14 @@ class Asus_rt_n12e_get_info < BeEF::Core::Command
|
||||
|
||||
if !gateway.nil? && BeEF::Filters.is_valid_ip?(gateway)
|
||||
print_debug("Hooked browser found WAN gateway server [ip: #{gateway}]")
|
||||
BeEF::Core::Models::NetworkHost.create(hooked_browser_id: session_id, ip: gateway, type: 'WAN Gateway')
|
||||
BeEF::Core::Models::NetworkHost.create(hooked_browser_id: session_id, ip: gateway, ntype: 'WAN Gateway')
|
||||
end
|
||||
|
||||
if !dns_servers.nil? && dns_servers =~ /^([\d. ]+)$/
|
||||
dns_servers.split(' ').uniq.each do |dns|
|
||||
if BeEF::Filters.is_valid_ip?(dns)
|
||||
print_debug("Hooked browser found DNS server [ip: #{dns}]")
|
||||
BeEF::Core::Models::NetworkHost.create(hooked_browser_id: session_id, ip: dns, type: 'DNS Server')
|
||||
BeEF::Core::Models::NetworkHost.create(hooked_browser_id: session_id, ip: dns, ntype: 'DNS Server')
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -27,7 +27,7 @@ class Detect_airdroid < BeEF::Core::Command
|
||||
|
||||
if BeEF::Filters.is_valid_ip?(ip)
|
||||
print_debug("Hooked browser found 'Airdroid' [proto: #{proto}, ip: #{ip}, port: #{port}]")
|
||||
BeEF::Core::Models::NetworkService.create(hooked_browser_id: session_id, proto: proto, ip: ip, port: port, type: type)
|
||||
BeEF::Core::Models::NetworkService.create(hooked_browser_id: session_id, proto: proto, ip: ip, port: port, ntype: type)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -26,7 +26,7 @@ class Detect_cups < BeEF::Core::Command
|
||||
type = 'CUPS'
|
||||
if BeEF::Filters.is_valid_ip?(ip)
|
||||
print_debug("Hooked browser found 'CUPS' [proto: #{proto}, ip: #{ip}, port: #{port}]")
|
||||
BeEF::Core::Models::NetworkService.create(hooked_browser_id: session_id, proto: proto, ip: ip, port: port, type: type)
|
||||
BeEF::Core::Models::NetworkService.create(hooked_browser_id: session_id, proto: proto, ip: ip, port: port, ntype: type)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -21,7 +21,7 @@ class Cross_origin_scanner_cors < BeEF::Core::Command
|
||||
session_id = @datastore['beefhook']
|
||||
if BeEF::Filters.is_valid_ip?(ip)
|
||||
print_debug("Hooked browser found HTTP server #{ip}:#{port}")
|
||||
BeEF::Core::Models::NetworkService.create(hooked_browser_id: session_id, proto: proto, ip: ip, port: port, type: type)
|
||||
BeEF::Core::Models::NetworkService.create(hooked_browser_id: session_id, proto: proto, ip: ip, port: port, ntype: type)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -35,7 +35,7 @@ class Cross_origin_scanner_flash < BeEF::Core::Command
|
||||
type = 'HTTP Server (Flash)'
|
||||
if BeEF::Filters.is_valid_ip?(ip)
|
||||
print_debug("Hooked browser found HTTP server #{ip}:#{port}")
|
||||
BeEF::Core::Models::NetworkService.create(hooked_browser_id: session_id, proto: proto, ip: ip, port: port, type: type)
|
||||
BeEF::Core::Models::NetworkService.create(hooked_browser_id: session_id, proto: proto, ip: ip, port: port, ntype: type)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -16,7 +16,7 @@ class Detect_burp < BeEF::Core::Command
|
||||
session_id = @datastore['beefhook']
|
||||
if BeEF::Filters.is_valid_ip?(ip)
|
||||
print_debug("Hooked browser found network service [ip: #{ip}, port: #{port}]")
|
||||
BeEF::Core::Models::NetworkService.create(hooked_browser_id: session_id, proto: 'http', ip: ip, port: port, type: 'Burp Proxy')
|
||||
BeEF::Core::Models::NetworkService.create(hooked_browser_id: session_id, proto: 'http', ip: ip, port: port, ntype: 'Burp Proxy')
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -32,7 +32,7 @@ class Get_http_servers < BeEF::Core::Command
|
||||
session_id = @datastore['beefhook']
|
||||
if !ip.nil? && BeEF::Filters.is_valid_ip?(ip)
|
||||
print_debug("Hooked browser found HTTP Server [proto: #{proto}, ip: #{ip}, port: #{port}]")
|
||||
BeEF::Core::Models::NetworkService.create(hooked_browser_id: session_id, proto: proto, ip: ip, port: port, type: 'HTTP Server')
|
||||
BeEF::Core::Models::NetworkService.create(hooked_browser_id: session_id, proto: proto, ip: ip, port: port, ntype: 'HTTP Server')
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -26,7 +26,7 @@ class Get_ntop_network_hosts < BeEF::Core::Command
|
||||
type = 'ntop'
|
||||
if BeEF::Filters.is_valid_ip?(ip)
|
||||
print_debug("Hooked browser found 'ntop' [proto: #{proto}, ip: #{ip}, port: #{port}]")
|
||||
BeEF::Core::Models::NetworkService.create(hooked_browser_id: session_id, proto: proto, ip: ip, port: port, type: type)
|
||||
BeEF::Core::Models::NetworkService.create(hooked_browser_id: session_id, proto: proto, ip: ip, port: port, ntype: type)
|
||||
end
|
||||
data.to_s.scan(/"hostNumIpAddress":"([\d.]+)"/).flatten.each do |ip|
|
||||
if BeEF::Filters.is_valid_ip?(ip)
|
||||
|
||||
@@ -19,11 +19,16 @@ class Get_proxy_servers_wpad < BeEF::Core::Command
|
||||
proxy_type = Regexp.last_match(1).to_s
|
||||
ip = Regexp.last_match(2).to_s.split(':')[0]
|
||||
port = Regexp.last_match(2).to_s.split(':')[1]
|
||||
proto = 'HTTP' if proxy_type =~ /PROXY/
|
||||
proto = 'SOCKS' if proxy_type =~ /SOCKS/
|
||||
proto = case proxy_type
|
||||
when /PROXY/ then 'HTTP'
|
||||
when /SOCKS/ then 'SOCKS'
|
||||
else
|
||||
print_debug("Unexpected proxy_type from WPAD response: #{proxy_type.inspect}")
|
||||
next
|
||||
end
|
||||
if BeEF::Filters.is_valid_ip?(ip)
|
||||
print_debug("Hooked browser found #{proto} proxy [ip: #{ip}, port: #{port}]")
|
||||
BeEF::Core::Models::NetworkService.create(hooked_browser_id: session_id, proto: proto.downcase, ip: ip, port: port, type: "#{proto} Proxy")
|
||||
BeEF::Core::Models::NetworkService.create(hooked_browser_id: session_id, proto: proto.downcase, ip: ip, port: port, ntype: "#{proto} Proxy")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -33,7 +33,7 @@ class Internal_network_fingerprinting < BeEF::Core::Command
|
||||
session_id = @datastore['beefhook']
|
||||
if BeEF::Filters.is_valid_ip?(ip)
|
||||
print_debug("Hooked browser found '#{discovered}' [ip: #{ip}]")
|
||||
BeEF::Core::Models::NetworkService.create(hooked_browser_id: session_id, proto: proto, ip: ip, port: port, type: discovered)
|
||||
BeEF::Core::Models::NetworkService.create(hooked_browser_id: session_id, proto: proto, ip: ip, port: port, ntype: discovered)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -26,7 +26,7 @@ class Fingerprint_routers < BeEF::Core::Command
|
||||
session_id = @datastore['beefhook']
|
||||
if BeEF::Filters.is_valid_ip?(ip)
|
||||
print_debug("Hooked browser found network service #{service} [proto: #{proto}, ip: #{ip}, port: #{port}]")
|
||||
BeEF::Core::Models::NetworkService.create(hooked_browser_id: session_id, proto: proto, ip: ip, port: port, type: service)
|
||||
BeEF::Core::Models::NetworkService.create(hooked_browser_id: session_id, proto: proto, ip: ip, port: port, ntype: service)
|
||||
end
|
||||
when /^ip=(.+)&device=(.+)/
|
||||
ip = Regexp.last_match(1)
|
||||
@@ -34,7 +34,7 @@ class Fingerprint_routers < BeEF::Core::Command
|
||||
session_id = @datastore['beefhook']
|
||||
if BeEF::Filters.is_valid_ip?(ip)
|
||||
print_debug("Hooked browser found network device #{device} [ip: #{ip}]")
|
||||
BeEF::Core::Models::NetworkHost.create(hooked_browser_id: session_id, ip: ip, type: device)
|
||||
BeEF::Core::Models::NetworkHost.create(hooked_browser_id: session_id, ip: ip, ntype: device)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
#
|
||||
# Copyright (c) 2006-2026 Wade Alcorn - wade@bindshell.net
|
||||
# Browser Exploitation Framework (BeEF) - https://beefproject.com
|
||||
# See the file 'doc/COPYING' for copying permission
|
||||
#
|
||||
require 'extensions/network/models/network_host'
|
||||
|
||||
RSpec.describe BeEF::Core::Models::NetworkHost do
|
||||
describe 'associations' do
|
||||
it 'belongs_to hooked_browser' do
|
||||
expect(described_class.reflect_on_association(:hooked_browser)).not_to be_nil
|
||||
expect(described_class.reflect_on_association(:hooked_browser).macro).to eq(:belongs_to)
|
||||
end
|
||||
end
|
||||
|
||||
describe '.create' do
|
||||
let(:hooked_browser) { BeEF::Core::Models::HookedBrowser.create!(session: 'test_session', ip: '127.0.0.1') }
|
||||
|
||||
it 'accepts ntype as the host type attribute' do
|
||||
host = described_class.create!(
|
||||
hooked_browser_id: hooked_browser.id,
|
||||
ip: '192.168.1.1',
|
||||
ntype: 'Host'
|
||||
)
|
||||
|
||||
expect(host).to be_persisted
|
||||
expect(host.ntype).to eq('Host')
|
||||
end
|
||||
|
||||
it 'rejects type as an unknown attribute (regression guard for #3493 and #3498)' do
|
||||
expect {
|
||||
described_class.create!(
|
||||
hooked_browser_id: hooked_browser.id,
|
||||
ip: '192.168.1.1',
|
||||
type: 'Host'
|
||||
)
|
||||
}.to raise_error(ActiveModel::UnknownAttributeError, /unknown attribute 'type'/)
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,44 @@
|
||||
#
|
||||
# Copyright (c) 2006-2026 Wade Alcorn - wade@bindshell.net
|
||||
# Browser Exploitation Framework (BeEF) - https://beefproject.com
|
||||
# See the file 'doc/COPYING' for copying permission
|
||||
#
|
||||
require 'extensions/network/models/network_service'
|
||||
|
||||
RSpec.describe BeEF::Core::Models::NetworkService do
|
||||
describe 'associations' do
|
||||
it 'belongs_to hooked_browser' do
|
||||
expect(described_class.reflect_on_association(:hooked_browser)).not_to be_nil
|
||||
expect(described_class.reflect_on_association(:hooked_browser).macro).to eq(:belongs_to)
|
||||
end
|
||||
end
|
||||
|
||||
describe '.create' do
|
||||
let(:hooked_browser) { BeEF::Core::Models::HookedBrowser.create!(session: 'test_session', ip: '127.0.0.1') }
|
||||
|
||||
it 'accepts ntype as the service type attribute' do
|
||||
service = described_class.create!(
|
||||
hooked_browser_id: hooked_browser.id,
|
||||
proto: 'http',
|
||||
ip: '192.168.1.1',
|
||||
port: '80',
|
||||
ntype: 'HTTP Server'
|
||||
)
|
||||
|
||||
expect(service).to be_persisted
|
||||
expect(service.ntype).to eq('HTTP Server')
|
||||
end
|
||||
|
||||
it 'rejects type as an unknown attribute (regression guard for #3493 and #3498)' do
|
||||
expect {
|
||||
described_class.create!(
|
||||
hooked_browser_id: hooked_browser.id,
|
||||
proto: 'http',
|
||||
ip: '192.168.1.1',
|
||||
port: '80',
|
||||
type: 'HTTP Server'
|
||||
)
|
||||
}.to raise_error(ActiveModel::UnknownAttributeError, /unknown attribute 'type'/)
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user