Skip to content

Commit 68c2ecc

Browse files
committed
Initial commit
0 parents  commit 68c2ecc

File tree

6 files changed

+272
-0
lines changed

6 files changed

+272
-0
lines changed

.gitignore

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
elasticApp/
2+
notes.txt
3+
__pycache__
4+
start.sh
5+
.env
6+
database.db

elasticApp.py

Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
from flask import Flask, render_template, request
2+
import shodan
3+
import re
4+
import requests as r
5+
from os import system
6+
from timeit import default_timer as timer
7+
import sqlite3
8+
from dotenv import load_dotenv
9+
from os import getenv
10+
11+
app = Flask(__name__)
12+
13+
# Shodan API key (replace 'YOUR_SHODAN_API_KEY' with your actual API key)
14+
load_dotenv()
15+
SHODAN_API_KEY = getenv('SHODAN_API_KEY')
16+
print(SHODAN_API_KEY)
17+
api = shodan.Shodan(SHODAN_API_KEY)
18+
19+
# IPv4 pattern recognition
20+
ipv4_pattern = re.compile(r'\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}:[0-9]+\b')
21+
22+
23+
@app.route('/', methods=['GET', 'POST'])
24+
def index():
25+
countries = [{"name": "Afghanistan","code": "AF"},{"name": "Åland Islands","code": "AX"},{"name": "Albania","code": "AL"},{"name": "Algeria","code": "DZ"},{"name": "American Samoa","code": "AS"},{"name": "AndorrA","code": "AD"},{"name": "Angola","code": "AO"},{"name": "Anguilla","code": "AI"},{"name": "Antarctica","code": "AQ"},{"name": "Antigua and Barbuda","code": "AG"},{"name": "Argentina","code": "AR"},{"name": "Armenia","code": "AM"},{"name": "Aruba","code": "AW"},{"name": "Australia","code": "AU"},{"name": "Austria","code": "AT"},{"name": "Azerbaijan","code": "AZ"},{"name": "Bahamas","code": "BS"},{"name": "Bahrain","code": "BH"},{"name": "Bangladesh","code": "BD"},{"name": "Barbados","code": "BB"},{"name": "Belarus","code": "BY"},{"name": "Belgium","code": "BE"},{"name": "Belize","code": "BZ"},{"name": "Benin","code": "BJ"},{"name": "Bermuda","code": "BM"},{"name": "Bhutan","code": "BT"},{"name": "Bolivia","code": "BO"},{"name": "Bosnia and Herzegovina","code": "BA"},{"name": "Botswana","code": "BW"},{"name": "Bouvet Island","code": "BV"},{"name": "Brazil","code": "BR"},{"name": "British Indian Ocean Territory","code": "IO"},{"name": "Brunei Darussalam","code": "BN"},{"name": "Bulgaria","code": "BG"},{"name": "Burkina Faso","code": "BF"},{"name": "Burundi","code": "BI"},{"name": "Cambodia","code": "KH"},{"name": "Cameroon","code": "CM"},{"name": "Canada","code": "CA"},{"name": "Cape Verde","code": "CV"},{"name": "Cayman Islands","code": "KY"},{"name": "Central African Republic","code": "CF"},{"name": "Chad","code": "TD"},{"name": "Chile","code": "CL"},{"name": "China","code": "CN"},{"name": "Christmas Island","code": "CX"},{"name": "Cocos (Keeling) Islands","code": "CC"},{"name": "Colombia","code": "CO"},{"name": "Comoros","code": "KM"},{"name": "Congo","code": "CG"},{"name": "Congo, The Democratic Republic of the","code": "CD"},{"name": "Cook Islands","code": "CK"},{"name": "Costa Rica","code": "CR"},{"name": "Cote D\"Ivoire","code": "CI"},{"name": "Croatia","code": "HR"},{"name": "Cuba","code": "CU"},{"name": "Cyprus","code": "CY"},{"name": "Czech Republic","code": "CZ"},{"name": "Denmark","code": "DK"},{"name": "Djibouti","code": "DJ"},{"name": "Dominica","code": "DM"},{"name": "Dominican Republic","code": "DO"},{"name": "Ecuador","code": "EC"},{"name": "Egypt","code": "EG"},{"name": "El Salvador","code": "SV"},{"name": "Equatorial Guinea","code": "GQ"},{"name": "Eritrea","code": "ER"},{"name": "Estonia","code": "EE"},{"name": "Ethiopia","code": "ET"},{"name": "Falkland Islands (Malvinas)","code": "FK"},{"name": "Faroe Islands","code": "FO"},{"name": "Fiji","code": "FJ"},{"name": "Finland","code": "FI"},{"name": "France","code": "FR"},{"name": "French Guiana","code": "GF"},{"name": "French Polynesia","code": "PF"},{"name": "French Southern Territories","code": "TF"},{"name": "Gabon","code": "GA"},{"name": "Gambia","code": "GM"},{"name": "Georgia","code": "GE"},{"name": "Germany","code": "DE"},{"name": "Ghana","code": "GH"},{"name": "Gibraltar","code": "GI"},{"name": "Greece","code": "GR"},{"name": "Greenland","code": "GL"},{"name": "Grenada","code": "GD"},{"name": "Guadeloupe","code": "GP"},{"name": "Guam","code": "GU"},{"name": "Guatemala","code": "GT"},{"name": "Guernsey","code": "GG"},{"name": "Guinea","code": "GN"},{"name": "Guinea-Bissau","code": "GW"},{"name": "Guyana","code": "GY"},{"name": "Haiti","code": "HT"},{"name": "Heard Island and Mcdonald Islands","code": "HM"},{"name": "Holy See (Vatican City State)","code": "VA"},{"name": "Honduras","code": "HN"},{"name": "Hong Kong","code": "HK"},{"name": "Hungary","code": "HU"},{"name": "Iceland","code": "IS"},{"name": "India","code": "IN"},{"name": "Indonesia","code": "ID"},{"name": "Iran, Islamic Republic Of","code": "IR"},{"name": "Iraq","code": "IQ"},{"name": "Ireland","code": "IE"},{"name": "Isle of Man","code": "IM"},{"name": "Israel","code": "IL"},{"name": "Italy","code": "IT"},{"name": "Jamaica","code": "JM"},{"name": "Japan","code": "JP"},{"name": "Jersey","code": "JE"},{"name": "Jordan","code": "JO"},{"name": "Kazakhstan","code": "KZ"},{"name": "Kenya","code": "KE"},{"name": "Kiribati","code": "KI"},{"name": "Korea, Democratic People\"S Republic of","code": "KP"},{"name": "Korea, Republic of","code": "KR"},{"name": "Kuwait","code": "KW"},{"name": "Kyrgyzstan","code": "KG"},{"name": "Lao People\"S Democratic Republic","code": "LA"},{"name": "Latvia","code": "LV"},{"name": "Lebanon","code": "LB"},{"name": "Lesotho","code": "LS"},{"name": "Liberia","code": "LR"},{"name": "Libyan Arab Jamahiriya","code": "LY"},{"name": "Liechtenstein","code": "LI"},{"name": "Lithuania","code": "LT"},{"name": "Luxembourg","code": "LU"},{"name": "Macao","code": "MO"},{"name": "Macedonia, The Former Yugoslav Republic of","code": "MK"},{"name": "Madagascar","code": "MG"},{"name": "Malawi","code": "MW"},{"name": "Malaysia","code": "MY"},{"name": "Maldives","code": "MV"},{"name": "Mali","code": "ML"},{"name": "Malta","code": "MT"},{"name": "Marshall Islands","code": "MH"},{"name": "Martinique","code": "MQ"},{"name": "Mauritania","code": "MR"},{"name": "Mauritius","code": "MU"},{"name": "Mayotte","code": "YT"},{"name": "Mexico","code": "MX"},{"name": "Micronesia, Federated States of","code": "FM"},{"name": "Moldova, Republic of","code": "MD"},{"name": "Monaco","code": "MC"},{"name": "Mongolia","code": "MN"},{"name": "Montserrat","code": "MS"},{"name": "Morocco","code": "MA"},{"name": "Mozambique","code": "MZ"},{"name": "Myanmar","code": "MM"},{"name": "Namibia","code": "NA"},{"name": "Nauru","code": "NR"},{"name": "Nepal","code": "NP"},{"name": "Netherlands","code": "NL"},{"name": "Netherlands Antilles","code": "AN"},{"name": "New Caledonia","code": "NC"},{"name": "New Zealand","code": "NZ"},{"name": "Nicaragua","code": "NI"},{"name": "Niger","code": "NE"},{"name": "Nigeria","code": "NG"},{"name": "Niue","code": "NU"},{"name": "Norfolk Island","code": "NF"},{"name": "Northern Mariana Islands","code": "MP"},{"name": "Norway","code": "NO"},{"name": "Oman","code": "OM"},{"name": "Pakistan","code": "PK"},{"name": "Palau","code": "PW"},{"name": "Palestinian Territory, Occupied","code": "PS"},{"name": "Panama","code": "PA"},{"name": "Papua New Guinea","code": "PG"},{"name": "Paraguay","code": "PY"},{"name": "Peru","code": "PE"},{"name": "Philippines","code": "PH"},{"name": "Pitcairn","code": "PN"},{"name": "Poland","code": "PL"},{"name": "Portugal","code": "PT"},{"name": "Puerto Rico","code": "PR"},{"name": "Qatar","code": "QA"},{"name": "Reunion","code": "RE"},{"name": "Romania","code": "RO"},{"name": "Russian Federation","code": "RU"},{"name": "RWANDA","code": "RW"},{"name": "Saint Helena","code": "SH"},{"name": "Saint Kitts and Nevis","code": "KN"},{"name": "Saint Lucia","code": "LC"},{"name": "Saint Pierre and Miquelon","code": "PM"},{"name": "Saint Vincent and the Grenadines","code": "VC"},{"name": "Samoa","code": "WS"},{"name": "San Marino","code": "SM"},{"name": "Sao Tome and Principe","code": "ST"},{"name": "Saudi Arabia","code": "SA"},{"name": "Senegal","code": "SN"},{"name": "Serbia and Montenegro","code": "CS"},{"name": "Seychelles","code": "SC"},{"name": "Sierra Leone","code": "SL"},{"name": "Singapore","code": "SG"},{"name": "Slovakia","code": "SK"},{"name": "Slovenia","code": "SI"},{"name": "Solomon Islands","code": "SB"},{"name": "Somalia","code": "SO"},{"name": "South Africa","code": "ZA"},{"name": "South Georgia and the South Sandwich Islands","code": "GS"},{"name": "Spain","code": "ES"},{"name": "Sri Lanka","code": "LK"},{"name": "Sudan","code": "SD"},{"name": "Suriname","code": "SR"},{"name": "Svalbard and Jan Mayen","code": "SJ"},{"name": "Swaziland","code": "SZ"},{"name": "Sweden","code": "SE"},{"name": "Switzerland","code": "CH"},{"name": "Syrian Arab Republic","code": "SY"},{"name": "Taiwan","code": "TW"},{"name": "Tajikistan","code": "TJ"},{"name": "Tanzania, United Republic of","code": "TZ"},{"name": "Thailand","code": "TH"},{"name": "Timor-Leste","code": "TL"},{"name": "Togo","code": "TG"},{"name": "Tokelau","code": "TK"},{"name": "Tonga","code": "TO"},{"name": "Trinidad and Tobago","code": "TT"},{"name": "Tunisia","code": "TN"},{"name": "Turkey","code": "TR"},{"name": "Turkmenistan","code": "TM"},{"name": "Turks and Caicos Islands","code": "TC"},{"name": "Tuvalu","code": "TV"},{"name": "Uganda","code": "UG"},{"name": "Ukraine","code": "UA"},{"name": "United Arab Emirates","code": "AE"},{"name": "United Kingdom","code": "GB"},{"name": "United States","code": "US"},{"name": "United States Minor Outlying Islands","code": "UM"},{"name": "Uruguay","code": "UY"},{"name": "Uzbekistan","code": "UZ"},{"name": "Vanuatu","code": "VU"},{"name": "Venezuela","code": "VE"},{"name": "Viet Nam","code": "VN"},{"name": "Virgin Islands, British","code": "VG"},{"name": "Virgin Islands, U.S.","code": "VI"},{"name": "Wallis and Futuna","code": "WF"},{"name": "Western Sahara","code": "EH"},{"name": "Yemen","code": "YE"},{"name": "Zambia","code": "ZM"},{"name": "Zimbabwe","code": "ZW"},]
26+
num_results = 0
27+
28+
if request.method == 'POST':
29+
selected_country = request.form.get('country')
30+
31+
time_before_shodan = timer()
32+
results = get_shodan_results(selected_country)
33+
print("Time for the whole thing: " + str(timer() - time_before_shodan))
34+
35+
# WHY ARE NOT WORKING WHY ARE YOU LIKE THIS
36+
num_results = len(results)
37+
return render_template('index.html', countries=countries, selected_country=selected_country, results=results, num_results=num_results)
38+
39+
return render_template('index.html', countries=countries, num_results=num_results)
40+
41+
def get_db_connection():
42+
conn = sqlite3.connect('database.db')
43+
conn.row_factory = lambda cursor, row: row[0]
44+
c = conn.cursor()
45+
return c
46+
47+
48+
def insert_into_database(host, country):
49+
# Connect to the SQLite database
50+
conn = sqlite3.connect('database.db')
51+
cursor = conn.cursor()
52+
53+
# Insert data into the table
54+
cursor.execute("INSERT INTO elastic (host, country) VALUES (?, ?);",
55+
(host, country))
56+
57+
# Commit the changes and close the connection
58+
conn.commit()
59+
conn.close()
60+
61+
def get_shodan_results(country_code):
62+
63+
print('Hi!')
64+
country_code = country_code.lower()
65+
cursor = get_db_connection()
66+
results = api.search('product:elastic "200 OK" country:{} "GB"'.format(country_code))
67+
68+
# Results of the shodan query
69+
hosts = []
70+
71+
# Temp hosts list to get content from
72+
new_hosts = []
73+
74+
# End results
75+
end_results = []
76+
77+
# for anew
78+
hosts_in_database = cursor.execute("select host from elastic where country is '{}'".format(country_code)).fetchall()
79+
80+
# DEBUG
81+
print("hosts_in_database:")
82+
print(hosts_in_database)
83+
84+
85+
# grab all IPv4 from the query results
86+
for result in results['matches']:
87+
host = result['ip_str'] + ':' + str(result['port'])
88+
if ipv4_pattern.search(host):
89+
hosts.append(host)
90+
91+
hosts_not_in_database = list(set(hosts) - set(hosts_in_database))
92+
93+
for host in hosts_not_in_database:
94+
url = "http://{}/_cat/indices?v".format(host)
95+
print("url: {}".format(url))
96+
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:100.0) Gecko/20100101 Firefox/100.0'}
97+
try:
98+
#response = r.head(url, headers=headers, timeout=5)
99+
response = r.get(url, headers=headers, timeout=5)
100+
#status, body = response.status_code, response.text
101+
status = response.status_code
102+
print(status)
103+
104+
# If they are alive and reachable
105+
if status == 200:
106+
107+
# write the new hosts into the DB
108+
insert_into_database(host,country_code)
109+
110+
# add to the shodan query result list
111+
new_hosts.append(url)
112+
except Exception as e:
113+
print(e)
114+
115+
# Get the content of the new hosts
116+
for url in new_hosts:
117+
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:100.0) Gecko/20100101 Firefox/100.0'}
118+
try:
119+
response = r.get(url, headers=headers, timeout=5)
120+
status, body = response.status_code, response.text
121+
122+
if status == 200:
123+
end_results.append((url,body))
124+
except:
125+
pass
126+
127+
return end_results
128+
129+
if __name__ == '__main__':
130+
app.run(debug=True)

es2.png

11.8 KB
Loading

requirements.txt

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
blinker==1.7.0
2+
branca==0.7.0
3+
certifi==2023.11.17
4+
charset-normalizer==3.3.2
5+
click==8.1.7
6+
click-plugins==1.1.1
7+
colorama==0.4.6
8+
filelock==3.13.1
9+
Flask==3.0.0
10+
folium==0.15.1
11+
idna==3.6
12+
itsdangerous==2.1.2
13+
Jinja2==3.1.3
14+
MarkupSafe==2.1.3
15+
numpy==1.26.3
16+
python-dotenv==1.0.1
17+
requests==2.31.0
18+
requests-file==2.0.0
19+
shodan==1.31.0
20+
tldextract==5.1.1
21+
urllib3==2.1.0
22+
Werkzeug==3.0.1
23+
XlsxWriter==3.1.9
24+
xyzservices==2023.10.1

static/favicon.png

1.2 KB
Loading

templates/index.html

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
<!DOCTYPE html>
2+
3+
<html lang="en">
4+
<head>
5+
<meta charset="UTF-8">
6+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
7+
<title>Elastic(search²)</title>
8+
<link rel="shortcut icon" href="favicon.ico">
9+
<style>
10+
body {
11+
font-family: 'Arial', sans-serif;
12+
background-color: #f4f4f4;
13+
margin: 0;
14+
display: flex;
15+
flex-direction: column;
16+
align-items: center;
17+
justify-content: center;
18+
min-height: 100vh;
19+
}
20+
21+
h1, h2 {
22+
color: #333;
23+
}
24+
25+
form {
26+
margin-bottom: 20px;
27+
display: flex;
28+
flex-direction: column;
29+
align-items: center;
30+
}
31+
32+
label {
33+
font-weight: bold;
34+
}
35+
36+
select, button {
37+
padding: 8px;
38+
margin: 5px; /* Added margin for better spacing */
39+
font-size: 16px;
40+
}
41+
42+
button {
43+
background-color: #007bff;
44+
color: #fff;
45+
border: none;
46+
cursor: pointer;
47+
}
48+
49+
button:hover {
50+
background-color: #0056b3;
51+
}
52+
53+
ul {
54+
list-style: none;
55+
padding: 0;
56+
display: flex;
57+
flex-direction: column;
58+
align-items: center;
59+
margin-top: -50px; /* Adjusted margin-top to position above the middle */
60+
}
61+
62+
li {
63+
margin-bottom: 20px;
64+
border: 1px solid #ddd;
65+
padding: 10px;
66+
background-color: #fff;
67+
border-radius: 5px;
68+
width: 80%; /* Adjusted width for better responsiveness */
69+
}
70+
71+
pre {
72+
white-space: pre-wrap;
73+
word-wrap: break-word;
74+
margin-top: 10px;
75+
}
76+
77+
/* Additional style to center the form horizontally */
78+
form {
79+
max-width: 400px; /* Adjusted max-width for better responsiveness */
80+
width: 100%;
81+
}
82+
83+
</style>
84+
</head>
85+
<body>
86+
<h1>Elastic(search²)</h1>
87+
88+
<form method="POST">
89+
<label for="country">Select a country:</label>
90+
<select name="country" id="country">
91+
{% for country in countries %}
92+
<option value="{{ country.code }}" {% if country.code == selected_country %}selected{% endif %}>{{ country.name }}</option>
93+
{% endfor %}
94+
</select>
95+
<button type="submit">Search</button>
96+
</form>
97+
98+
{% if results %}
99+
<h2>Results: {{ num_results }}</h2>
100+
<ul>
101+
{% for url, body in results %}
102+
<li>
103+
<form method="GET" action="{{ url }}">
104+
<button type="submit" onclick=' window.open("{{ url }}","_blank"); return false;'>{{ url }}</button>
105+
</form>
106+
<pre>{{ body }}</pre>
107+
</li>
108+
{% endfor %}
109+
</ul>
110+
{% endif %}
111+
</body>
112+
</html>

0 commit comments

Comments
 (0)