private List <ShodanIPInformation> ParseJsonShodan(string jsonResponse) { List <ShodanIPInformation> lstShodan = new List <ShodanIPInformation>(); try { ShodanResponse result; using (MemoryStream ms = new MemoryStream(Encoding.ASCII.GetBytes(jsonResponse))) { DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(ShodanResponse)); result = (ShodanResponse)serializer.ReadObject(ms); } if (result != null) { if (result.data != null && result.data.Count > 0) { foreach (Datum m in result.data) { ShodanIPInformation shodanInfo = new ShodanIPInformation { Country = result.country_name, IPAddress = m.ip_str, OS = m.os, HostNames = m.hostnames }; if (!String.IsNullOrEmpty(m.data) && m._shodan.module.StartsWith("http", StringComparison.OrdinalIgnoreCase)) { Match serverHeader = ServerHeaderExpression.Match(m.data); if (serverHeader.Success) { shodanInfo.ServerBanner = serverHeader.Groups["serverValue"].Value.Trim(); } } lstShodan.Add(shodanInfo); } } else { ShodanIPInformation shodanInfo = new ShodanIPInformation { Country = result.country_name, IPAddress = result.ip_str, OS = result.os }; shodanInfo.HostNames.AddRange(result.hostnames); lstShodan.Add(shodanInfo); } } } catch { OnSearcherLogEvent(new EventsThreads.ThreadStringEventArgs("Couldn't parse Shodan JSON response")); } return(lstShodan); }
private ShodanIPInformation GetShodanInformation(string strIPAddress, CancellationToken cancelToken) { string json = MakeShodanRequestIP(strIPAddress, cancelToken); if (!String.IsNullOrWhiteSpace(json)) { List <ShodanIPInformation> lstSIPinfo = ParseJsonShodan(json); ShodanIPInformation SIPinfo = lstSIPinfo.FirstOrDefault(p => p.IPAddress == strIPAddress); return(SIPinfo); } else { return(null); } }
protected override int Search(IEnumerable <IPAddress> searchValues, CancellationToken cancelToken) { int resultCount = 0; foreach (IPAddress ip in searchValues) { ShodanIPInformation ipInfo = GetShodanInformation(ip.ToString(), cancelToken); if (ipInfo != null) { resultCount++; OnSearcherLinkFoundEvent(new EventsThreads.CollectionFound <ShodanIPInformation>(new[] { ipInfo })); } cancelToken.ThrowIfCancellationRequested(); } return(resultCount); }