使用LEEF格式时格式错误的系统日志数据包

问题描述:

我正在使用SyslogNet库从我的应用程序发送SIEM系统日志消息到第三方供应商LEEF格式的SIEM系统(在此是QRadar)。 但是,我的信息没有被发送,程序也没有产生任何异常。 我可以看到并确认该字符串与根据LEEF消息的Rfc5424的正确模板/格式相关(请参阅代码下面的示例)。使用LEEF格式时格式错误的系统日志数据包

仅指示该消息未被发送正确是表示是Wireshark跟踪的该消息是包括了只有几个字节和更重要的是被认为是恶意数据包:

Wireshark Trace

的代码如下:

using System.IO; 
using System.Text; 
using System.Reflection; 
using SyslogNet.Client; 
using SyslogNet.Client.Serialization; 
using SyslogNet.Client.Transport; 
using Severity = SyslogNet.Client.Severity; 

namespace Providers.Syslog 
{ 
public class SyslogLogger 
{ 

    private readonly SyslogSettings _syslogSettings; 
    private readonly SyslogUdpSender _syslogUdpSender; 

    public SyslogLogger(SyslogSettings syslogSettings) 
    { 
     _syslogSettings = syslogSettings; 
     _syslogUdpSender = new SyslogUdpSender(syslogSettings.SyslogServerName, syslogSettings.SyslogServerPort); 
    } 

    public void Log(string message) 
    { 
     var syslogMessage = new SyslogMessage(
      null, 
      (Facility)_syslogSettings.Facility, 
      Severity.Informational, 
      null, 
      _syslogSettings.Identity, 
      message); 
     _syslogUdpSender.Send(syslogMessage, new SyslogMessageSerializer()); 
    } 

    private class SyslogMessageSerializer : SyslogMessageSerializerBase, ISyslogMessageSerializer 
    { 
     private const int AppNameMaxLength = 32; 

     public void Serialize(SyslogMessage message, Stream stream) 
     { 
      var priorityValue = CalculatePriorityValue(message.Facility, message.Severity); 

      string timestamp = null; 
      if (message.DateTimeOffset.HasValue) 
      { 
       var dt = message.DateTimeOffset.Value; 
       var day = dt.Day < 10 ? " " + dt.Day : dt.Day.ToString(); 
       timestamp = string.Concat(dt.ToString("MMM "), day, dt.ToString(" HH:mm:ss")); 
      } 

      var headerBuilder = new StringBuilder(); 
      headerBuilder.Append("<").Append(priorityValue).Append(">"); 
      if (!string.IsNullOrEmpty(timestamp)) 
      { 
       headerBuilder.Append(timestamp).Append(" "); 
      } 
      if (!string.IsNullOrEmpty(message.HostName)) 
      { 
       headerBuilder.Append(message.HostName).Append(" "); 
      } 

      if (!message.Message.IsSiemOrientadTemplate()) 
      { 
       var appName = message.AppName; 
       headerBuilder.Append(string.IsNullOrWhiteSpace(appName) 
        ? appName 
        : (appName.Length > AppNameMaxLength ? appName.Substring(0, AppNameMaxLength) : appName) + ": "); 
       headerBuilder.Append(message.Message ?? "No Content"); 
      } 

      var encoding = new UTF8Encoding(false); 
      var bytes = encoding.GetBytes(headerBuilder.ToString()); 
      stream.Write(bytes, 0, bytes.Length); 
     } 
    } 
} 

}

例如的消息(I去除实际的数据,并把上的占位符):

LEEF:2.0 | CompanyNameString | ProduceNameString | VERSIONSTRING | INT |^| ^猫=测试 - QRADAR^SEV = 6^DescriptionString = ^时间戳= Apr 03 2017 14:48:02^userNameString = domain \ DisplayName^accountName = samAccountName^proto = Syslog

任何帮助将不胜感激,因为它已经有一段时间了,我找不到解决方案。提前致谢!

终于找到了问题。 我忽略了这样一个事实,即内容处于非SIEM系统的“if”子句中。 将此行移出子句可解决所有系统日志提供程序类型的问题。

headerBuilder.Append(message.Message ??“No Content”);