Refactoring to allow for scans on other ports
This commit is contained in:
		
							parent
							
								
									c15840886d
								
							
						
					
					
						commit
						8ba57b7618
					
				
							
								
								
									
										76
									
								
								onionscan.go
								
								
								
								
							
							
						
						
									
										76
									
								
								onionscan.go
								
								
								
								
							|  | @ -1,28 +1,18 @@ | ||||||
| package main | package main | ||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
|  | 	"github.com/s-rah/onionscan/protocol" | ||||||
| 	"github.com/s-rah/onionscan/report" | 	"github.com/s-rah/onionscan/report" | ||||||
| 	"github.com/s-rah/onionscan/scans" |  | ||||||
| 	"h12.me/socks" |  | ||||||
| 	"io/ioutil" |  | ||||||
| 	"log" |  | ||||||
| 	"net/http" |  | ||||||
| 	"strings" | 	"strings" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| type OnionScan struct { | type OnionScan struct { | ||||||
| 	TorProxyAddress string | 	TorProxyAddress string | ||||||
| 	Client          *http.Client |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func Configure(torProxyAddress string) *OnionScan { | func Configure(torProxyAddress string) *OnionScan { | ||||||
| 	onionScan := new(OnionScan) | 	onionScan := new(OnionScan) | ||||||
| 	onionScan.TorProxyAddress = torProxyAddress | 	onionScan.TorProxyAddress = torProxyAddress | ||||||
| 	dialSocksProxy := socks.DialSocksProxy(socks.SOCKS5, onionScan.TorProxyAddress) |  | ||||||
| 	transportConfig := &http.Transport{ |  | ||||||
| 		Dial: dialSocksProxy, |  | ||||||
| 	} |  | ||||||
| 	onionScan.Client = &http.Client{Transport: transportConfig} |  | ||||||
| 	return onionScan | 	return onionScan | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -40,63 +30,17 @@ func (os *OnionScan) Scan(hiddenService string) (*report.OnionScanReport, error) | ||||||
| 
 | 
 | ||||||
| 	report := report.NewOnionScanReport(hiddenService) | 	report := report.NewOnionScanReport(hiddenService) | ||||||
| 
 | 
 | ||||||
| 	// It's Port Scanning Time.
 | 	// HTTP
 | ||||||
| 	log.Printf("Checking %s ssh(22)\n", hiddenService) | 	hps := new(protocol.HTTPProtocolScanner) | ||||||
| 	_, err := socks.DialSocksProxy(socks.SOCKS5, os.TorProxyAddress)("", hiddenService+":22") | 	hps.ScanProtocol(hiddenService, os.TorProxyAddress, report) | ||||||
| 	if err != nil { |  | ||||||
| 		log.Printf("Failed to connect to service on port 22\n") |  | ||||||
| 	} else { |  | ||||||
| 		// TODO SSH Checking
 |  | ||||||
| 	} |  | ||||||
| 
 | 
 | ||||||
| 	log.Printf("Checking %s http(80)\n", hiddenService) | 	// SSH
 | ||||||
| 	// It's Port Scanning Time.
 | 	sps := new(protocol.SSHProtocolScanner) | ||||||
| 	_, err = socks.DialSocksProxy(socks.SOCKS5, os.TorProxyAddress)("", hiddenService+":80") | 	sps.ScanProtocol(hiddenService, os.TorProxyAddress, report) | ||||||
| 	if err != nil { |  | ||||||
| 		log.Printf("Failed to connect to service on port 80\n") |  | ||||||
| 	} else { |  | ||||||
| 		// FIXME This should probably be moved to it's own file now.
 |  | ||||||
| 		response, err := os.Client.Get("http://" + hiddenService) |  | ||||||
| 
 | 
 | ||||||
| 		if err != nil { | 	// Ricochet
 | ||||||
| 			return report, err | 	rps := new(protocol.RicochetProtocolScanner) | ||||||
| 		} | 	rps.ScanProtocol(hiddenService, os.TorProxyAddress, report) | ||||||
| 
 |  | ||||||
| 		// Initial Attempt at Resolving Server Type
 |  | ||||||
| 		log.Printf("Attempting to Derive Server Type from Headers..\n") |  | ||||||
| 		report.ServerVersion = response.Header.Get("Server") |  | ||||||
| 		log.Printf("\tServer Version: %s\n", report.ServerVersion) |  | ||||||
| 
 |  | ||||||
| 		// Apache mod-status Check
 |  | ||||||
| 		os.ScanPage(hiddenService, "/server-status", report, scans.ApacheModStatus) |  | ||||||
| 		os.ScanPage(hiddenService, "/", report, scans.StandardPageScan) |  | ||||||
| 
 |  | ||||||
| 		os.ScanPage(hiddenService, "/style", report, scans.CheckDirectoryListing) |  | ||||||
| 		os.ScanPage(hiddenService, "/styles", report, scans.CheckDirectoryListing) |  | ||||||
| 		os.ScanPage(hiddenService, "/css", report, scans.CheckDirectoryListing) |  | ||||||
| 		os.ScanPage(hiddenService, "/uploads", report, scans.CheckDirectoryListing) |  | ||||||
| 		os.ScanPage(hiddenService, "/images", report, scans.CheckDirectoryListing) |  | ||||||
| 		os.ScanPage(hiddenService, "/img", report, scans.CheckDirectoryListing) |  | ||||||
| 		os.ScanPage(hiddenService, "/static", report, scans.CheckDirectoryListing) |  | ||||||
| 
 |  | ||||||
| 		// Lots of Wordpress installs which don't lock down directory listings
 |  | ||||||
| 		os.ScanPage(hiddenService, "/wp-content/uploads", report, scans.CheckDirectoryListing) |  | ||||||
| 
 |  | ||||||
| 		// Common with torshops created onions
 |  | ||||||
| 		os.ScanPage(hiddenService, "/products", report, scans.CheckDirectoryListing) |  | ||||||
| 		os.ScanPage(hiddenService, "/products/cat", report, scans.CheckDirectoryListing) |  | ||||||
| 	} |  | ||||||
| 
 | 
 | ||||||
| 	return report, nil | 	return report, nil | ||||||
| } | } | ||||||
| 
 |  | ||||||
| func (os *OnionScan) ScanPage(hiddenService string, page string, report *report.OnionScanReport, f func(scans.Scanner, string, int, string, *report.OnionScanReport)) { |  | ||||||
| 	response, err := os.Client.Get("http://" + hiddenService + page) |  | ||||||
| 	if err != nil { |  | ||||||
| 		log.Printf("Error connecting to %s%s %s\n", hiddenService, page, err) |  | ||||||
| 		return |  | ||||||
| 	} |  | ||||||
| 	defer response.Body.Close() |  | ||||||
| 	contents, _ := ioutil.ReadAll(response.Body) |  | ||||||
| 	f(os, page, response.StatusCode, string(contents), report) |  | ||||||
| } |  | ||||||
|  |  | ||||||
|  | @ -0,0 +1,74 @@ | ||||||
|  | package protocol | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"github.com/s-rah/onionscan/scans" | ||||||
|  | 	"github.com/s-rah/onionscan/report" | ||||||
|  | 	"net/http" | ||||||
|  | 	"io/ioutil" | ||||||
|  | 	"h12.me/socks" | ||||||
|  | 	"log" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type HTTPProtocolScanner struct { | ||||||
|  | 	Client          *http.Client | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (hps * HTTPProtocolScanner) ScanProtocol(hiddenService string, proxyAddress string, report *report.OnionScanReport) { | ||||||
|  | 
 | ||||||
|  | 	// HTTP
 | ||||||
|  | 	log.Printf("Checking %s http(80)\n", hiddenService) | ||||||
|  | 	_, err := socks.DialSocksProxy(socks.SOCKS5, proxyAddress)("", hiddenService+":80") | ||||||
|  | 	if err != nil { | ||||||
|  | 		log.Printf("Failed to connect to service on port 80\n") | ||||||
|  | 	} else { | ||||||
|  | 		log.Printf("Found potential service on http(80)\n") | ||||||
|  | 		dialSocksProxy := socks.DialSocksProxy(socks.SOCKS5, proxyAddress) | ||||||
|  | 		transportConfig := &http.Transport{ | ||||||
|  | 			Dial: dialSocksProxy, | ||||||
|  | 		} | ||||||
|  | 		hps.Client = &http.Client{Transport: transportConfig} | ||||||
|  | 		// FIXME This should probably be moved to it's own file now.
 | ||||||
|  | 		response, err := hps.Client.Get("http://" + hiddenService) | ||||||
|  | 
 | ||||||
|  | 		if err != nil { | ||||||
|  | 			log.Printf("Failed to connect to service on port 80\n") | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		// Initial Attempt at Resolving Server Type
 | ||||||
|  | 		log.Printf("Attempting to Derive Server Type from Headers..\n") | ||||||
|  | 		report.ServerVersion = response.Header.Get("Server") | ||||||
|  | 		log.Printf("\tServer Version: %s\n", report.ServerVersion) | ||||||
|  | 
 | ||||||
|  | 		// Apache mod-status Check
 | ||||||
|  | 		hps.ScanPage(hiddenService, "/server-status", report, scans.ApacheModStatus) | ||||||
|  | 		hps.ScanPage(hiddenService, "/", report, scans.StandardPageScan) | ||||||
|  | 
 | ||||||
|  | 		hps.ScanPage(hiddenService, "/style", report, scans.CheckDirectoryListing) | ||||||
|  | 		hps.ScanPage(hiddenService, "/styles", report, scans.CheckDirectoryListing) | ||||||
|  | 		hps.ScanPage(hiddenService, "/css", report, scans.CheckDirectoryListing) | ||||||
|  | 		hps.ScanPage(hiddenService, "/uploads", report, scans.CheckDirectoryListing) | ||||||
|  | 		hps.ScanPage(hiddenService, "/images", report, scans.CheckDirectoryListing) | ||||||
|  | 		hps.ScanPage(hiddenService, "/img", report, scans.CheckDirectoryListing) | ||||||
|  | 		hps.ScanPage(hiddenService, "/static", report, scans.CheckDirectoryListing) | ||||||
|  | 
 | ||||||
|  | 		// Lots of Wordpress installs which don't lock down directory listings
 | ||||||
|  | 		hps.ScanPage(hiddenService, "/wp-content/uploads", report, scans.CheckDirectoryListing) | ||||||
|  | 
 | ||||||
|  | 		// Common with torshops created onions
 | ||||||
|  | 		hps.ScanPage(hiddenService, "/products", report, scans.CheckDirectoryListing) | ||||||
|  | 		hps.ScanPage(hiddenService, "/products/cat", report, scans.CheckDirectoryListing) | ||||||
|  | 	} | ||||||
|  | 	log.Printf("\n") | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (hps * HTTPProtocolScanner) ScanPage(hiddenService string, page string, report *report.OnionScanReport, f func(scans.Scanner, string, int, string, *report.OnionScanReport)) { | ||||||
|  | 	response, err := hps.Client.Get("http://" + hiddenService + page) | ||||||
|  | 	if err != nil { | ||||||
|  | 		log.Printf("Error connecting to %s%s %s\n", hiddenService, page, err) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	defer response.Body.Close() | ||||||
|  | 	contents, _ := ioutil.ReadAll(response.Body) | ||||||
|  | 	f(hps, page, response.StatusCode, string(contents), report) | ||||||
|  | } | ||||||
|  | @ -0,0 +1,9 @@ | ||||||
|  | package protocol | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"github.com/s-rah/onionscan/report" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type ProtocolScanner interface { | ||||||
|  | 	ScanProtocol(hiddenService string, proxyAddress string, report *report.OnionScanReport) | ||||||
|  | } | ||||||
|  | @ -0,0 +1,24 @@ | ||||||
|  | package protocol | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"github.com/s-rah/onionscan/report" | ||||||
|  | 	"h12.me/socks" | ||||||
|  | 	"log" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type RicochetProtocolScanner struct { | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (rps *RicochetProtocolScanner) ScanProtocol(hiddenService string, proxyAddress string, report *report.OnionScanReport) { | ||||||
|  | 	// Ricochet
 | ||||||
|  | 	log.Printf("Checking %s ricochet(9878)\n", hiddenService) | ||||||
|  | 	_, err := socks.DialSocksProxy(socks.SOCKS5, proxyAddress)("", hiddenService+":9878") | ||||||
|  | 	if err != nil { | ||||||
|  | 		log.Printf("Failed to connect to service on port 9878\n") | ||||||
|  | 	} else { | ||||||
|  | 		log.Printf("Detected possible ricochet instance\n") | ||||||
|  | 		// TODO: Actual Analysis
 | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | @ -0,0 +1,23 @@ | ||||||
|  | package protocol | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"github.com/s-rah/onionscan/report" | ||||||
|  | 	"h12.me/socks" | ||||||
|  | 	"log" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type SSHProtocolScanner struct { | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (sps *SSHProtocolScanner) ScanProtocol(hiddenService string, proxyAddress string, report *report.OnionScanReport) { | ||||||
|  | 	// SSH
 | ||||||
|  | 	log.Printf("Checking %s ssh(22)\n", hiddenService) | ||||||
|  | 	_, err := socks.DialSocksProxy(socks.SOCKS5, proxyAddress)("", hiddenService+":22") | ||||||
|  | 	if err != nil { | ||||||
|  | 		log.Printf("Failed to connect to service on port 22\n") | ||||||
|  | 	} else { | ||||||
|  | 		// TODO SSH Checking
 | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | } | ||||||
		Loading…
	
		Reference in New Issue