Portscanning with socketlib

Simple portscanner to try out the socket lib!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#!/usr/bin/env python
#new feature
import socket
import subprocess
import sys
from datetime import datetime
 
# Clear the screen
subprocess.call('clear', shell=True)
 
# Ask for input
remoteServer	= raw_input("Enter remote host to scan: ")
remoteServerIP	= socket.gethostbyname(remoteServer)
 
# Print a nice banner with information on which host we are about to scan
print "-" * 60
print "Please wait, scanning remote host", remoteServerIP
print "-" * 60
 
# Check what time scan started
t1 = datetime.now()
 
# Using the range function to specify ports (here it will scan all port between 1 and 1024)
# We also put in some error handling for catching errors
 
try:
    for port in range(1,1025):
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
	result = sock.connect_ex((remoteServerIP, port))
	if result == 0:
	    print "Port {}: \t Open".format(port)
	sock.close()
 
except KeyboardInterrupt:
    print "You pressed Ctrl+C"
    sys.exit()
 
except socket.gaierror:
    print "Hostname could not be resolved"
    sys.exit()
 
except socket.error:
    print "Couldn't conenct to server"
    sys.exit()
 
# Cehcking time again
t2 = datetime.now()
 
# Calculate diff of time,to se how long it took to run scanning
total = t2 - t1
 
# Print info to screen
print "Scanning completed in: ", total

Shodan query i terminalen

Under julledigheten fick jag lite tid över att leka lite mer med python vilket resulterade i att jag skrev ett litet program som kan utföra sökningar mot Shodan och sedan parsar ut ip nummerna och sparar dessa i en log vilken senare kan användas i till exempel metasploit.
Problem uppstog dock när jag skulle hitta på ett sätt att avsluta programet.
I version 1.0 så har jag löst det genom att page räknas upp med 1 varje för var sida och avslutas då page är mindre än 10, då Shodan bara har info på de 5-6 första sidorna i dagsläget trots att det finns flera sidor att blädra till. Inge vacker lösning så tips mottages.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#!/usr/bin/python
import urllib2, sys, re
from BeautifulSoup import BeautifulSoup
 
def info():
  help = '''
    ShodanScanner v.1.0 h-kan@h-kan.com
 
    USAGE: ./shodanscanner -q  -f
    Ex: ./shodanscanner -q apache+2.2.1 -f scan.log
    This scan for apache servers and save the IP's into scan.log.
    More advanced query's could be used like
    - apache+2.2.11 Search for apache servers running version 2.2.11
    - +country:SE Search for servers located in sweden
    - +hostname:.se Search for servers with ".se" in hostname
    - +port:22 Search for servers with service running on port 22
  	'''
  print help
 
def crawler(page):
  try:
    sock = urllib2.urlopen("http://shodan.surtri.com/?q=%s&page=%i"%(args1,page))
    homepage = sock.read()
    htmlDom = BeautifulSoup(homepage)
    links = htmlDom.findAll('a', {'href': True})
    return links
  except:
    print "[-] Connection Failed"
    sys.exit(0)
 
if __name__ == "__main__":
  page = 1
    if len(sys.argv) != 5:
      info()
      print "usage: %s -q  -f "%sys.argv[0]
      sys.exit(0)
    else:
      if sys.argv[1].lower() == "-q":
        args1 = sys.argv[2]
      if sys.argv[3].lower() == "-f":
        args2 = sys.argv[4]
    log = open(args2,"a")
    print "[+] Searching query: %s"%args1
    log.write("[+] Searching query: %s"%args1)
    log.close()
    print "[+] please wait ..."
    while page <=10:
      data = crawler(page)
      for link in data:
        log = open(args2,"a")
        if re.search("http://",link['href']):
          link = link['href'].replace("http://","")
          print "%s"%link
          log.write("%s\n"%link)
        log.close()
      page += 1

Project 1 (version och uptime funktionerna)

Första koden är skapad och den gör sitt jobb.. är osäker till om detta är den optimala lösningen men pågrund av att det rör sig om 13 klienter så lär det inte uppstå några problem.
[cce lang=”python”]
#!/usr/bin/python
# Check which version and uptime on the clients

import os
import sys
import ftplib

hosts = ["192.168.15.101",
"172.16.104.19",
"192.168.1.111",
"192.168.1.112",
"172.16.104.21",
"192.168.1.113",
"192.168.1.114",
"192.168.15.100",
"172.16.104.16",
"192.168.1.115",
"192.168.1.116",
"10.11.3.130"]

## Download /etc/borderlineversion and print the content of it

def getversion(ftp):
file = "borderlineversion"
ftp.cwd("/etc")
ftp.retrbinary("RETR " + file, open(file, "wb").write)
file = open("borderlineversion")
for line in file:
print ("Version: " +line.strip())

## Download /proc/uptime and than parse out the time from it and convert it to
## float and dived with 3600

def getuptime(ftp):
file = "uptime"
ftp.cwd("/proc")
ftp.retrbinary("RETR " + file, open(file, "wb").write)
file = open("uptime")
for line in file:
time = line.split()[0]
timefloat = float(time)
uptime = timefloat / 3600
print "Uptime: ", "%.2f" % uptime, "timmar\n"

## Loop through the list of hosts
for x in hosts:
print "Hosts: ", x
try:
ftp = ftplib.FTP(x)
ftp.login("****", "****")
except ftplib.error_perm, e:
print "Login failed %s" % e
sys.exit()
except socket.error, e:
print "Connection failed %s" % e
sys.exit()
getversion(ftp)
getuptime(ftp)

## clean up after all the work

ftp.close()
os.remove("borderlineversion")
os.remove("uptime")
[/cce]

Project 1

Har skissat ihop ett program att koda på vilket även kommer komma i användning i verkliga livet. Programet har som syfte på begäran sammla in information från 13 enheter och även kunna koppla upp sig mot en databasen klienterna hämtar information ifrån och ändra parametrar i den.

Funktionerna kan byggas ut med tiden men grund tanken är:

Funktioner som utförs mot enheterna:

  • visa enheternas version nummer
  • visa enheternas uptime
  • tanka hem sammtliga loggar från enheter och spara dem i varsin katalog.
  • packa upp och merge’a loggfilerna till en logg
  • söka igenom loggen efter omstarter och visa dessa

Funktioner som utförs mot Servern:

  • Tanka upp ny version
  • Uppgradera klienter till version
  • Nergradera klienter till version
  • Aktivera screen-blanking
  • Avaktivera screen-blanking

Jag kommer antagligen att bygga på listan efter hand och även kanske designa ett gui till programet.

All kod kommer postas här och om någon skulle läsa så är all kritik välkommen.

Med siktet på Python

Har nu tagit det stora beslutet att ta steget mot att bli en sådan där “code-junkie”.

Har levt med datorer omkring mig i stort sett hela livet men dock aldrig satt mig in i något språk mer än scriptat lite bash.

Efter att läst på lite om de olika mainstream språken föll valet på python då de passade in på mina krav bäst. Följande egenskaper stog på min lista.

  • Ska vara lätt läslig kod
  • Fungera i de flesta linux varianter utan allt för mycket konfigurering
  • Ska vara bra för att snabbt kunna koda ner program som kan hjälpa mig i det dagliga arbetet som sysa-admin i linux miljö.

Efter beslutet så var det dags att suga in sig kunskap i mängder…

Har köppt på mig “Programering i PythonISBN 978-91-44-04520-7 och “Guide to Programming with PythonISBN 978-1-4239-0112-9 och även ett konto på http://showmedo.com/ mest för att stödja grabbarna men säkert massa information att  gräva ner sig i.