98 lines
3.0 KiB
C#
98 lines
3.0 KiB
C#
using Newtonsoft.Json;
|
|
using skyscraper5.DNS.Protocol;
|
|
using skyscraper5.DNS.Protocol.ResourceRecords;
|
|
using skyscraper5.DNS.Protocol.ResourceRecords.Records;
|
|
using skyscraper5.Skyscraper.Plugins;
|
|
using skyscraper5.src.Skyscraper.Scraper.Dns;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Collections.Immutable;
|
|
using System.Linq;
|
|
using System.Net;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace skyscraper5.DNS
|
|
{
|
|
[SkyscraperPlugin]
|
|
internal class PluginDns : IDnsParser
|
|
{
|
|
public DnsParseResult Parse(byte[] data)
|
|
{
|
|
Header header = Header.FromArray(data);
|
|
if (!header.Response)
|
|
return new DnsParseResult();
|
|
|
|
Response response = Response.FromArray(data);
|
|
if (response.AnswerRecords.Count == 0)
|
|
return new DnsParseResult();
|
|
|
|
DnsParseResult result = new DnsParseResult();
|
|
result.Records = new List<DnsRecord>();
|
|
result.Records.AddRange(response.AnswerRecords.Where(x => x != null).Select(x => SanitizeDnsRecord(x)));
|
|
result.Records.AddRange(response.AdditionalRecords.Where(x => x != null).Select(x => SanitizeDnsRecord(x)));
|
|
|
|
return result;
|
|
}
|
|
|
|
private DnsRecord SanitizeDnsRecord(IResourceRecord record)
|
|
{
|
|
DnsRecord result = new DnsRecord();
|
|
result.Domain = record.Name.ToString();
|
|
result.RecordType = new Tuple<int, string>((int)record.Type, record.Type.ToString());
|
|
result.TTL = record.TimeToLive;
|
|
result.ResourceData = ResourceDataToString(record);
|
|
result.IP = ExtractIpAddress(record);
|
|
return result;
|
|
}
|
|
|
|
private string ResourceDataToString(IResourceRecord record)
|
|
{
|
|
SimpleDnsRecord simpleDnsRecord = record as SimpleDnsRecord;
|
|
if (simpleDnsRecord != null)
|
|
{
|
|
return simpleDnsRecord.GetDataAsString();
|
|
}
|
|
OptionRecord optionRecord = record as OptionRecord;
|
|
if (optionRecord != null)
|
|
{
|
|
string optionsJson = JsonConvert.SerializeObject(optionRecord.Options);
|
|
return optionsJson;
|
|
}
|
|
NamingAuthorityPointerResourceRecord namingAuthorityPointerResourceRecord = record as NamingAuthorityPointerResourceRecord;
|
|
if (namingAuthorityPointerResourceRecord != null)
|
|
{
|
|
string naprr = namingAuthorityPointerResourceRecord.Name.ToString();
|
|
return naprr;
|
|
}
|
|
NameServerResourceRecord nameServerResourceRecord = record as NameServerResourceRecord;
|
|
if (nameServerResourceRecord != null)
|
|
{
|
|
string nsrr = nameServerResourceRecord.NSDomainName.ToString();
|
|
return nsrr;
|
|
}
|
|
MailExchangeResourceRecord mxRecord = record as MailExchangeResourceRecord;
|
|
if (mxRecord != null)
|
|
{
|
|
string mxrr = JsonConvert.SerializeObject(new
|
|
{
|
|
Preference = mxRecord.Preference,
|
|
ExchangeDomainName = mxRecord.ExchangeDomainName.ToString()
|
|
});
|
|
return mxrr;
|
|
}
|
|
throw new NotImplementedException(record.GetType().Name.ToString());
|
|
}
|
|
|
|
private IPAddress ExtractIpAddress(IResourceRecord record)
|
|
{
|
|
IPAddressResourceRecord iparr = record as IPAddressResourceRecord;
|
|
if (iparr != null)
|
|
{
|
|
return iparr.IPAddress;
|
|
}
|
|
return null;
|
|
}
|
|
}
|
|
}
|