SMB1/SMB2 Negotiate replies

This commit is contained in:
gpotter2 2022-02-07 09:20:16 +01:00
parent 7590b02a2f
commit 5b97b738e9
3 changed files with 1180 additions and 13 deletions

View file

@ -21,22 +21,22 @@ authors = ["_Frky <3105926+Frky@users.noreply.github.com>"]
edition = "2018" edition = "2018"
[dependencies] [dependencies]
bitflags = "1.2.1"
byteorder = "1.4.3"
chrono = "0.4.19"
clap = "3.0.5"
dns-parser = "0.8.0"
flate2 = "1.0"
itertools = "0.10.3"
lazy_static = "1.4.0"
log = "0.4.11"
netdevice = "0.1.1"
pcap = "0.9.1" pcap = "0.9.1"
pcap-file = "1.1.1" pcap-file = "1.1.1"
pnet = "0.29.0" pnet = "0.29.0"
clap = "3.0.5"
log = "0.4.11"
stderrlog = "0.5.0"
itertools = "0.10.3"
rand = "0.8.4" rand = "0.8.4"
dns-parser = "0.8.0"
netdevice = "0.1.1"
bitflags = "1.2.1"
lazy_static = "1.4.0"
siphasher = "0.3" siphasher = "0.3"
chrono = "0.4.19" stderrlog = "0.5.0"
byteorder = "1.4.3"
flate2 = "1.0"
[[bin]] [[bin]]
name = "masscanned" name = "masscanned"

View file

@ -39,12 +39,17 @@ use ghost::GHOST_PATTERN_SIGNATURE;
mod rpc; mod rpc;
use rpc::{RPC_CALL_TCP, RPC_CALL_UDP}; use rpc::{RPC_CALL_TCP, RPC_CALL_UDP};
mod smb;
use smb::{SMB1_PATTERN_MAGIC, SMB2_PATTERN_MAGIC};
const PROTO_HTTP: usize = 1; const PROTO_HTTP: usize = 1;
const PROTO_STUN: usize = 2; const PROTO_STUN: usize = 2;
const PROTO_SSH: usize = 3; const PROTO_SSH: usize = 3;
const PROTO_GHOST: usize = 4; const PROTO_GHOST: usize = 4;
const PROTO_RPC_TCP: usize = 5; const PROTO_RPC_TCP: usize = 5;
const PROTO_RPC_UDP: usize = 6; const PROTO_RPC_UDP: usize = 6;
const PROTO_SMB1: usize = 7;
const PROTO_SMB2: usize = 8;
struct TCPControlBlock { struct TCPControlBlock {
proto_state: usize, proto_state: usize,
@ -100,6 +105,16 @@ fn proto_init() -> Smack {
PROTO_RPC_UDP, PROTO_RPC_UDP,
SmackFlags::ANCHOR_BEGIN | SmackFlags::WILDCARDS, SmackFlags::ANCHOR_BEGIN | SmackFlags::WILDCARDS,
); );
smack.add_pattern(
SMB1_PATTERN_MAGIC,
PROTO_SMB1,
SmackFlags::ANCHOR_BEGIN | SmackFlags::WILDCARDS,
);
smack.add_pattern(
SMB2_PATTERN_MAGIC,
PROTO_SMB2,
SmackFlags::ANCHOR_BEGIN | SmackFlags::WILDCARDS,
);
smack.compile(); smack.compile();
smack smack
} }
@ -129,13 +144,13 @@ pub fn repl<'a>(
let mut i = 0; let mut i = 0;
let mut tcb = ct.get_mut(&cookie).unwrap(); let mut tcb = ct.get_mut(&cookie).unwrap();
let mut state = tcb.proto_state; let mut state = tcb.proto_state;
id = PROTO_SMACK.search_next(&mut state, &data.to_vec(), &mut i); id = PROTO_SMACK.search_next(&mut state, data, &mut i);
tcb.proto_state = state; tcb.proto_state = state;
} else { } else {
/* proto over else (e.g., UDP) */ /* proto over else (e.g., UDP) */
let mut i = 0; let mut i = 0;
let mut state = BASE_STATE; let mut state = BASE_STATE;
id = PROTO_SMACK.search_next(&mut state, &data.to_vec(), &mut i); id = PROTO_SMACK.search_next(&mut state, data, &mut i);
/* because we are not over TCP, we can afford to assume end of pattern */ /* because we are not over TCP, we can afford to assume end of pattern */
if id == NO_MATCH { if id == NO_MATCH {
id = PROTO_SMACK.search_next_end(&mut state); id = PROTO_SMACK.search_next_end(&mut state);
@ -149,6 +164,8 @@ pub fn repl<'a>(
PROTO_GHOST => ghost::repl(data, masscanned, &mut client_info), PROTO_GHOST => ghost::repl(data, masscanned, &mut client_info),
PROTO_RPC_TCP => rpc::repl_tcp(data, masscanned, &mut client_info), PROTO_RPC_TCP => rpc::repl_tcp(data, masscanned, &mut client_info),
PROTO_RPC_UDP => rpc::repl_udp(data, masscanned, &mut client_info), PROTO_RPC_UDP => rpc::repl_udp(data, masscanned, &mut client_info),
PROTO_SMB1 => smb::repl_smb1(data, masscanned, &mut client_info),
PROTO_SMB2 => smb::repl_smb2(data, masscanned, &mut client_info),
_ => { _ => {
debug!("id: {}", id); debug!("id: {}", id);
None None

1150
src/proto/smb.rs Normal file

File diff suppressed because it is too large Load diff