/* sc * 2 to get to the transaction name */
#define SERVICE_SMB_STATUS_SUCCESS 0x00000000
+#define SERVICE_SMB_MORE_PROCESSING_REQUIRED 0xc0000016
#define SERVICE_SMB_TRANSACTION_COMMAND 0x25
#define SERVICE_SMB_COMMAND_SESSION_SETUP_ANDX_RESPONSE 0x73
#define SERVICE_SMB_COMMAND_NEGOTIATE_PROTOCOL 0x72
for (i=0; i<(NBNS_NAME_LEN/2); i++)
{
int j = 2 * i;
- if (lbl_data->data[j] < 'A' || lbl_data->data[j] > 'Z')
+ if (lbl_data->data[j] < 'A' or lbl_data->data[j] > 'Z')
return -1;
name[i] = (uint8_t)(((uint8_t)(lbl_data->data[j] - 'A')) << 4);
j++;
- if (lbl_data->data[i] < 'A' || lbl_data->data[i] > 'Z')
+ if (lbl_data->data[i] < 'A' or lbl_data->data[i] > 'Z')
return -1;
name[i] |= (uint8_t)(lbl_data->data[j] - 'A');
}
if (lbl_data->zero)
return -1;
for (i=0; i<NBNS_NAME_LEN; i++)
- if (lbl_data->data[i] < 'A' || lbl_data->data[i] > 'Z')
+ if (lbl_data->data[i] < 'A' or lbl_data->data[i] > 'Z')
return -1;
return 0;
}
lbl = (const NBNSLabel*)(*data);
*data += sizeof(NBNSLabel);
tmp = ntohs(lbl->type);
- if (tmp != NBNS_NB && tmp != NBNS_NBSTAT)
+ if (tmp != NBNS_NB and tmp != NBNS_NBSTAT)
return -1;
return 0;
}
if (size < sizeof(NBNSHeader))
goto fail;
hdr = (const NBNSHeader*)data;
- if ((hdr->Opcode > NBNS_OPCODE_QUERY &&
- hdr->Opcode < NBNS_OPCODE_REGISTRATION) ||
- (hdr->Opcode > NBNS_OPCODE_REFRESHALT &&
+ if ((hdr->Opcode > NBNS_OPCODE_QUERY and
+ hdr->Opcode < NBNS_OPCODE_REGISTRATION) or
+ (hdr->Opcode > NBNS_OPCODE_REFRESHALT and
hdr->Opcode < NBNS_OPCODE_MHREGISTRATION))
{
goto fail;
{
if (unicode)
{
- if (*size != 0 && ((*offset) % 2))
+ if (*size != 0 and ((*offset) % 2))
{
(*offset)++;
(*data)++;
}
}
-static inline void smb_find_domain(const uint8_t* data, uint16_t size, const int,
- AppIdSession& asd)
+static inline void smb_find_domain(const uint8_t* data, uint16_t size,
+ AppIdSession& asd, AppidChangeBits& change_bits)
{
const ServiceSMBHeader* smb;
const ServiceSMBAndXResponse* resp;
if (size < sizeof(*smb) + sizeof(wc))
return;
smb = (const ServiceSMBHeader*)data;
- if (smb->status != SERVICE_SMB_STATUS_SUCCESS)
+ if (smb->status != SERVICE_SMB_STATUS_SUCCESS and
+ smb->status != SERVICE_SMB_MORE_PROCESSING_REQUIRED)
return;
if (!(smb->flags[0] & SERVICE_SMB_FLAGS_RESPONSE))
return;
resp = (const ServiceSMBAndXResponse*)data;
np = (const ServiceSMBNegotiateProtocolResponse*)data;
wc = 2 * (uint16_t)*data;
- offset = 1;
+ offset = 0;
data++;
size--;
if (size < (wc + sizeof(byte_count)))
return;
smb_domain_skip_string(&data, &byte_count, &offset, unicode);
smb_domain_skip_string(&data, &byte_count, &offset, unicode);
- if (byte_count != 0 && (offset % 2))
+ if (byte_count != 0 and (offset % 2))
{
data++;
byte_count--;
capabilities = LETOHL_UNALIGNED(&np->capabilities);
if (capabilities & SERVICE_SMB_CAPABILITIES_EXTENDED_SECURITY)
return;
- unicode = (capabilities & SERVICE_SMB_CAPABILITIES_UNICODE) || unicode;
+ unicode = (capabilities & SERVICE_SMB_CAPABILITIES_UNICODE) or unicode;
}
else if (wc != 26)
return;
data++;
}
}
- if (!found && byte_count == 1 && *data == 0)
+ if (!found and byte_count == 1 and *data == 0)
{
byte_count--;
}
- if (byte_count && smb->command != SERVICE_SMB_COMMAND_NEGOTIATE_PROTOCOL)
+ if (byte_count and smb->command != SERVICE_SMB_COMMAND_NEGOTIATE_PROTOCOL and
+ smb->command != SERVICE_SMB_COMMAND_SESSION_SETUP_ANDX_RESPONSE)
return;
}
else
data++;
}
}
- if (byte_count && smb->command != SERVICE_SMB_COMMAND_NEGOTIATE_PROTOCOL)
+ if (byte_count and smb->command != SERVICE_SMB_COMMAND_NEGOTIATE_PROTOCOL)
return;
}
- if ( pos && (!asd.netbios_domain) )
- asd.netbios_domain = snort_strdup(domain);
+ if (pos)
+ asd.set_netbios_domain(change_bits, (const char *)domain);
}
NbssServiceDetector::NbssServiceDetector(ServiceDiscovery* sd)
switch (hdr->type)
{
case NBSS_TYPE_RESP_POSITIVE:
- if (hdr->flags || hdr->length)
+ if (hdr->flags or hdr->length)
goto fail;
nd->state = NBSS_STATE_FLOW;
break;
case NBSS_TYPE_RESP_NEGATIVE:
- if (hdr->flags || ntohs(hdr->length) != 1)
+ if (hdr->flags or ntohs(hdr->length) != 1)
goto fail;
if (data >= end)
goto fail;
- if (*data < 0x80 || (*data > 0x83 && *data < 0x8F) || *data > 0x8F)
+ if (*data < 0x80 or (*data > 0x83 and *data < 0x8F) or *data > 0x8F)
goto fail;
data++;
break;
nd->length = ((uint32_t)(hdr->flags & 0x01)) << 16;
nd->length |= (uint32_t)ntohs(hdr->length);
tmp = end - data;
- if (tmp >= sizeof(NB_SMB_BANNER) &&
- nd->length >= sizeof(NB_SMB_BANNER) &&
+ if (tmp >= sizeof(NB_SMB_BANNER) and
+ nd->length >= sizeof(NB_SMB_BANNER) and
!memcmp(data, NB_SMB_BANNER, sizeof(NB_SMB_BANNER)))
{
if (nd->serviceAppId != APP_ID_DCE_RPC)
if (nd->length <= tmp)
{
smb_find_domain(data + sizeof(NB_SMB_BANNER),
- nd->length - sizeof(NB_SMB_BANNER), dir, args.asd);
+ nd->length - sizeof(NB_SMB_BANNER), args.asd, args.change_bits);
}
}
- else if (tmp >= 4 && nd->length >= 4 &&
- !(*((const uint32_t*)data)) &&
+ else if (tmp >= 4 and nd->length >= 4 and
+ !(*((const uint32_t*)data)) and
dcerpc_validate(data+4, ((int)std::min(tmp, nd->length)) - 4) > 0)
{
nd->serviceAppId = APP_ID_DCE_RPC;
}
break;
case NBSS_TYPE_RESP_RETARGET:
- if (hdr->flags || ntohs(hdr->length) != 6)
+ if (hdr->flags or ntohs(hdr->length) != 6)
goto fail;
if (end - data < 6)
goto fail;
switch (hdr->type)
{
case NBSS_TYPE_KEEP_ALIVE:
- if (hdr->flags || hdr->length)
+ if (hdr->flags or hdr->length)
goto fail;
break;
case NBSS_TYPE_MESSAGE:
nd->length = ((uint32_t)(hdr->flags & 0x01)) << 16;
nd->length += (uint32_t)ntohs(hdr->length);
tmp = end - data;
- if (tmp >= sizeof(NB_SMB_BANNER) &&
- nd->length >= sizeof(NB_SMB_BANNER) &&
+ if (tmp >= sizeof(NB_SMB_BANNER) and
+ nd->length >= sizeof(NB_SMB_BANNER) and
!memcmp(data, NB_SMB_BANNER, sizeof(NB_SMB_BANNER)))
{
if (nd->serviceAppId != APP_ID_DCE_RPC)
}
if (nd->length <= tmp)
{
- smb_find_domain(data + sizeof(NB_SMB_BANNER), nd->length, dir, args.asd);
+ smb_find_domain(data + sizeof(NB_SMB_BANNER), nd->length, args.asd,
+ args.change_bits);
}
}
- else if (tmp >= 4 && nd->length >= 4 &&
- !(*((const uint32_t*)data)) &&
+ else if (tmp >= 4 and nd->length >= 4 and
+ !(*((const uint32_t*)data)) and
!(dcerpc_validate(data+4, ((int)std::min(tmp, nd->length)) - 4) > 0))
{
nd->serviceAppId = APP_ID_DCE_RPC;
data += sizeof(NBDgmHeader);
if (hdr->zero)
goto fail;
- if (!hdr->first || hdr->more)
+ if (!hdr->first or hdr->more)
goto fail;
switch (hdr->type)
goto fail;
if (data >= end)
goto fail;
- if (end-data >= (int)sizeof(NB_SMB_BANNER) &&
+ if (end-data >= (int)sizeof(NB_SMB_BANNER) and
!memcmp(data, NB_SMB_BANNER, sizeof(NB_SMB_BANNER)))
{
if (!args.asd.is_service_detected())
goto not_mailslot;
data += sizeof(mailslot);
browser = (const ServiceSMBBrowserHeader*)data;
- if (browser->command != SERVICE_SMB_MAILSLOT_HOST &&
+ if (browser->command != SERVICE_SMB_MAILSLOT_HOST and
browser->command != SERVICE_SMB_MAILSLOT_LOCAL_MASTER)
{
goto not_mailslot;
data += sizeof(NBDgmError);
if (end != data)
goto fail;
- if (err->code < NBDGM_ERROR_CODE_MIN ||
+ if (err->code < NBDGM_ERROR_CODE_MIN or
err->code > NBDGM_ERROR_CODE_MAX)
{
goto fail;
CHECK_EQUAL(service, APPID_UT_ID);
CHECK_EQUAL(client, APPID_UT_ID);
CHECK_EQUAL(payload, APPID_UT_ID);
- STRCMP_EQUAL("Published change_bits == 000000000000000000", test_log);
+ STRCMP_EQUAL("Published change_bits == 0000000000000000000", test_log);
service = APP_ID_NONE;
client = APP_ID_NONE;
STRCMP_EQUAL(mock_session->tsession->get_tls_host(), APPID_UT_TLS_HOST);
STRCMP_EQUAL(mock_session->tsession->get_tls_first_alt_name(), APPID_UT_TLS_HOST);
STRCMP_EQUAL(mock_session->tsession->get_tls_cname(), APPID_UT_TLS_HOST);
- STRCMP_EQUAL("Published change_bits == 000000000100011000", test_log);
+ STRCMP_EQUAL("Published change_bits == 0000000000100011000", test_log);
mock_session->tsession->set_tls_host("www.cisco.com", 13, change_bits);
mock_session->tsession->set_tls_cname("www.cisco.com", 13, change_bits);
STRCMP_EQUAL(mock_session->tsession->get_tls_host(), APPID_UT_TLS_HOST);
STRCMP_EQUAL(mock_session->tsession->get_tls_cname(), APPID_UT_TLS_HOST);
STRCMP_EQUAL(mock_session->tsession->get_tls_org_unit(), "Cisco");
- STRCMP_EQUAL("Published change_bits == 000000000100011000", test_log);
+ STRCMP_EQUAL("Published change_bits == 0000000000100011000", test_log);
string host = "";
val = appid_api.ssl_app_group_id_lookup(flow, (const char*)(host.c_str()), nullptr,
STRCMP_EQUAL(mock_session->tsession->get_tls_host(), APPID_UT_TLS_HOST);
STRCMP_EQUAL(mock_session->tsession->get_tls_cname(), APPID_UT_TLS_HOST);
STRCMP_EQUAL(mock_session->tsession->get_tls_org_unit(), "Google");
- STRCMP_EQUAL("Published change_bits == 000000000100000000", test_log);
+ STRCMP_EQUAL("Published change_bits == 0000000000100000000", test_log);
mock().checkExpectations();
}
// Detect changes in service, client, payload, and misc appid
mock().checkExpectations();
- STRCMP_EQUAL("Published change_bits == 000000000001111100", test_log);
+ STRCMP_EQUAL("Published change_bits == 0000000000001111100", test_log);
delete &asd->get_api();
delete asd;
// Detect changes in service, client, payload, and misc appid
mock().checkExpectations();
- STRCMP_EQUAL("Published change_bits == 000000000001111100", test_log);
+ STRCMP_EQUAL("Published change_bits == 0000000000001111100", test_log);
delete &asd->get_api();
delete asd;
delete flow;
change_bits_to_string(change_bits, str);
STRCMP_EQUAL(str.c_str(), "created, reset, service, client, payload, misc, referred, host,"
" tls-host, url, user-agent, response, referrer, dns-host, service-info, client-info,"
- " user-info, netbios-name");
+ " user-info, netbios-name, netbios-domain");
// Failure of this test is a reminder that enum is changed, hence translator needs update
- CHECK_EQUAL(APPID_MAX_BIT, 18);
+ CHECK_EQUAL(APPID_MAX_BIT, 19);
}
int main(int argc, char** argv)