获取网页标题、服务器Banner,例子仅探测80端口
大家可自行修改添加其它端口识别定制Web扫描功能
如识别出特定中间件或WEB后再检测是否存在漏洞等
编译后的netscan.dll可改成任意名称Ladon均可加载
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Text.RegularExpressions;
namespace LadonDLL
{
public class scan
{
public static string run(string ip)
{
if (string.IsNullOrEmpty(ip))
return "";
else
{
//192.11.22.10 Microsoft-IIS/10.0 IIS Windows
//192.11.22.1 H3C-Miniware-Webs ER3200G2系统管理
return ip + "\t" + getURLbanner(ip) + "\t" + GetTitle(getHtml("http://" + ip,2));
}
}
private static string getURLbanner(string url)
{
////HttpWebResponse res;
if (!url.ToLower().Contains("https://") && !url.ToLower().Contains("http://"))
url = "http://" + url;
try
{
var req = (HttpWebRequest)WebRequest.CreateDefault(new Uri(url));
req.Method = "HEAD";
req.Timeout = 1000;
var res = (HttpWebResponse)req.GetResponse();
if (res.StatusCode == HttpStatusCode.OK || res.StatusCode == HttpStatusCode.Forbidden || res.StatusCode == HttpStatusCode.Redirect || res.StatusCode == HttpStatusCode.MovedPermanently)
{
return res.Server;
}
//res.Close();
return res.Server;
}
catch (WebException ex)
{
return "";
}
}
private static string GetTitle(string html)
{
if (html.Contains("<hTmlKErRor>"))
{
//return html.Replace("<hTmlKErRor>", "");
return "";
}
html = html.Replace("<br>", "");
html = html.Replace("<BR>", "");
html = html.Replace("\r\n", "");
html = html.Replace(" ", " ");
html = html.Replace("\n", "").Trim();
String regex = @"<title.+</title>";
String title = Regex.Match(html, regex).ToString();
title = Regex.Replace(title, @"[\""]+", "");
title = title.TrimStart('<');
string regex2 = @">.+</title>";
string title2 = Regex.Match(title, regex2).ToString();
title2 = title2.TrimStart('>').Replace("</title>", "").Trim();
if (title2.Length > 50)
return title2.Substring(0, 50);
return title2;
}
private static string getHtml(string url, int codingType)
{
try
{
if (!url.ToLower().Contains("https://") && !url.ToLower().Contains("http://"))
url = "http://" + url;
WebClient myWebClient = new WebClient();
if (url.ToLower().Contains("https://"))
{
System.Net.ServicePointManager.ServerCertificateValidationCallback +=
delegate(object sender, System.Security.Cryptography.X509Certificates.X509Certificate certificate,
System.Security.Cryptography.X509Certificates.X509Chain chain,
System.Net.Security.SslPolicyErrors sslPolicyErrors)
{
return true; // **** Always accept
};
}
byte[] myDataBuffer = myWebClient.DownloadData(url);
//return Encoding.Default.GetString(myDataBuffer);
string strWebData = System.Text.Encoding.Default.GetString(myDataBuffer);
//自动识别编码 不一定有<meta 比如 百度开放平台 content="text/html; charset=gbk">
//Match charSetMatch = Regex.Match(strWebData, "<meta([^>]*)charset=(\")?(.*)?\"", RegexOptions.IgnoreCase | RegexOptions.Multiline);
Match charSetMatch = Regex.Match(strWebData, "(.*)charset=(\")?(.*)?\"", RegexOptions.IgnoreCase | RegexOptions.Multiline);
string webCharSet = charSetMatch.Groups[3].Value.Trim().ToLower();
if (webCharSet != "gb2312" && webCharSet != "gbk")
{
webCharSet = "utf-8";
}
if (System.Text.Encoding.GetEncoding(webCharSet) != System.Text.Encoding.Default)
{
strWebData = System.Text.Encoding.GetEncoding(webCharSet).GetString(myDataBuffer);
}
//if (codingType == 1)
// return Encoding.Unicode.GetString(myDataBuffer);
//else if (codingType == 2)
// return Encoding.Default.GetString(myDataBuffer);//GBK 936
//else if (codingType == 3)
// return Encoding.UTF8.GetString(myDataBuffer);//65501
return strWebData;
}
catch (Exception ex)
{
//Console.WriteLine(url + " " + ex.Message);
return "<hTmlKErRor>" + ex.Message;
}
return "";
}
}
}