Fix UnknownAttributeError on NetworkHost/NetworkService.create

This commit is contained in:
sethumadh
2026-05-20 13:56:21 +10:00
parent 30f7ed3784
commit 0e458d5e2c
14 changed files with 100 additions and 16 deletions
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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)
@@ -23,7 +23,7 @@ class Get_proxy_servers_wpad < BeEF::Core::Command
proto = 'SOCKS' if proxy_type =~ /SOCKS/
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
+2 -2
View File
@@ -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