Improve comments & improve cameraccess speed

This commit is contained in:
Brendan LE GLAUNEC
2017-09-25 19:17:24 +02:00
committed by Brendan Le Glaunec
parent ecdac00145
commit 4c9d23acb1
6 changed files with 38 additions and 37 deletions
+2 -2
View File
@@ -162,7 +162,7 @@ func attackCameraRoute(target Stream, routes Routes, resultsChan chan<- Stream,
} }
// AttackCredentials attempts to guess the provided targets' credentials using the given // AttackCredentials attempts to guess the provided targets' credentials using the given
// dictionary or the default dictionary if none was provided by the user // dictionary or the default dictionary if none was provided by the user.
func AttackCredentials(targets []Stream, credentials Credentials, timeout time.Duration, log bool) (results []Stream, err error) { func AttackCredentials(targets []Stream, credentials Credentials, timeout time.Duration, log bool) (results []Stream, err error) {
attacks := make(chan Stream) attacks := make(chan Stream)
defer close(attacks) defer close(attacks)
@@ -197,7 +197,7 @@ func AttackCredentials(targets []Stream, credentials Credentials, timeout time.D
} }
// AttackRoute attempts to guess the provided targets' streaming routes using the given // AttackRoute attempts to guess the provided targets' streaming routes using the given
// dictionary or the default dictionary if none was provided by the user // dictionary or the default dictionary if none was provided by the user.
func AttackRoute(targets []Stream, routes Routes, timeout time.Duration, log bool) (results []Stream, err error) { func AttackRoute(targets []Stream, routes Routes, timeout time.Duration, log bool) (results []Stream, err error) {
attacks := make(chan Stream) attacks := make(chan Stream)
defer close(attacks) defer close(attacks)
BIN
View File
Binary file not shown.
+2 -4
View File
@@ -67,8 +67,6 @@ func main() {
} }
} }
streams, _ = cmrdr.AttackRoute(streams, routes, time.Duration(options.Timeout)*time.Millisecond, options.EnableLogs)
prettyPrint(streams) prettyPrint(streams)
} }
@@ -84,10 +82,10 @@ func prettyPrint(streams []cmrdr.Stream) {
if len(streams) > 0 { if len(streams) > 0 {
for _, stream := range streams { for _, stream := range streams {
if stream.CredentialsFound && stream.RouteFound { if stream.CredentialsFound && stream.RouteFound {
fmt.Printf("%s\tDevice RTSP URL:\t%s\n", green("\xE2\x96\xB6"), blue(cmrdr.RTSPURL(stream))) fmt.Printf("%s\tDevice RTSP URL:\t%s\n", green("\xE2\x96\xB6"), blue(cmrdr.GetCameraRTSPURL(stream)))
success++ success++
} else { } else {
fmt.Printf("%s\tAdmin panel URL:\t%s %s\n", red("\xE2\x96\xB6"), yellow(cmrdr.AdminPanelURL(stream)), white("You can use this URL to try attacking the camera's admin panel instead.")) fmt.Printf("%s\tAdmin panel URL:\t%s %s\n", red("\xE2\x96\xB6"), yellow(cmrdr.GetCameraAdminPanelURL(stream)), white("You can use this URL to try attacking the camera's admin panel instead."))
} }
fmt.Printf("\tDevice model:\t\t%s\n\n", stream.Device) fmt.Printf("\tDevice model:\t\t%s\n\n", stream.Device)
+17 -14
View File
@@ -41,8 +41,8 @@ const (
INSANE = 5 INSANE = 5
) )
// RunNmap runs nmap on the specified targets's specified ports, using the given nmap speed // NmapRun runs nmap on the specified targets's specified ports, using the given nmap speed.
func RunNmap(targets, ports string, resultFilePath string, nmapSpeed int, enableLogs bool) error { func NmapRun(targets, ports, resultFilePath string, nmapSpeed int, enableLogs bool) error {
// Prepare nmap command // Prepare nmap command
cmd := exec.Command( cmd := exec.Command(
"nmap", "nmap",
@@ -82,9 +82,9 @@ func RunNmap(targets, ports string, resultFilePath string, nmapSpeed int, enable
return nil return nil
} }
// ParseNmapResult returns a slice of streams from an NMap XML result file // NmapParseResults returns a slice of streams from an NMap XML result file.
// To generate one yourself, use the -X option when running NMap // To generate one yourself, use the -X option when running NMap.
func ParseNmapResult(nmapResultFilePath string) ([]Stream, error) { func NmapParseResults(nmapResultFilePath string) ([]Stream, error) {
var streams []Stream var streams []Stream
// Open & Read XML file // Open & Read XML file
@@ -94,7 +94,7 @@ func ParseNmapResult(nmapResultFilePath string) ([]Stream, error) {
} }
// Unmarshal content of XML file into data structure // Unmarshal content of XML file into data structure
result := &NmapResult{} result := &nmapResult{}
err = xml.Unmarshal(content, &result) err = xml.Unmarshal(content, &result)
if err != nil { if err != nil {
return streams, err return streams, err
@@ -124,26 +124,29 @@ func ParseNmapResult(nmapResultFilePath string) ([]Stream, error) {
return streams, nil return streams, nil
} }
// Discover scans the target networks and tries to find RTSP streams within them // Discover scans the target networks and tries to find RTSP streams within them.
// targets - string: The addresses //
// targets can be:
//
// - a subnet (e.g.: 172.16.100.0/24) // - a subnet (e.g.: 172.16.100.0/24)
// - an IP (e.g.: 172.16.100.10) // - an IP (e.g.: 172.16.100.10)
// - a hostname (e.g.: localhost) // - a hostname (e.g.: localhost)
// - a range of IPs (e.g.: 172.16.100.10-172.16.100.20) // - a range of IPs (e.g.: 172.16.100.10-20)
// - a mix of all those separated by commas (e.g.: localhost,172.17.100.0/24,172.16.100.10-172.16.100.20,0.0.0.0). //
// ports - string : // ports can be:
//
// - one or multiple ports and port ranges separated by commas (e.g.: 554,8554-8560,18554-28554) // - one or multiple ports and port ranges separated by commas (e.g.: 554,8554-8560,18554-28554)
func Discover(targets string, ports string, nmapResultPath string, speed int, log bool) ([]Stream, error) { func Discover(targets, ports, nmapResultPath string, speed int, log bool) ([]Stream, error) {
var streams []Stream var streams []Stream
// Run nmap command to discover open ports on the specified targets & ports // Run nmap command to discover open ports on the specified targets & ports
err := RunNmap(targets, ports, nmapResultPath, speed, log) err := NmapRun(targets, ports, nmapResultPath, speed, log)
if err != nil { if err != nil {
return streams, err return streams, err
} }
// Get found streams from nmap results // Get found streams from nmap results
streams, err = ParseNmapResult(nmapResultPath) streams, err = NmapParseResults(nmapResultPath)
if err != nil { if err != nil {
return streams, err return streams, err
} }
+4 -4
View File
@@ -27,12 +27,12 @@ func replace(streams []Stream, new Stream) []Stream {
return updatedSlice return updatedSlice
} }
// RTSPURL generates a stream's RTSP URL // GetCameraRTSPURL generates a stream's RTSP URL
func RTSPURL(stream Stream) string { func GetCameraRTSPURL(stream Stream) string {
return "rtsp://" + stream.Username + ":" + stream.Password + "@" + stream.Address + ":" + fmt.Sprint(stream.Port) + "/" + stream.Route return "rtsp://" + stream.Username + ":" + stream.Password + "@" + stream.Address + ":" + fmt.Sprint(stream.Port) + "/" + stream.Route
} }
// AdminPanelURL returns the URL to the camera's admin panel // GetCameraAdminPanelURL returns the URL to the camera's admin panel
func AdminPanelURL(stream Stream) string { func GetCameraAdminPanelURL(stream Stream) string {
return "http://" + stream.Address + "/" return "http://" + stream.Address + "/"
} }
+13 -13
View File
@@ -15,47 +15,47 @@ package cmrdr
import "encoding/xml" import "encoding/xml"
// NmapResult is the structure that holds all the information from an NMap scan // NmapResult is the structure that holds all the information from an NMap scan
type NmapResult struct { type nmapResult struct {
XMLName xml.Name `xml:"nmaprun"` XMLName xml.Name `xml:"nmaprun"`
Hosts []Host `xml:"host" validate:"required"` Hosts []host `xml:"host" validate:"required"`
} }
// Host represents a host discovered during a scan // Host represents a host discovered during a scan
type Host struct { type host struct {
XMLName xml.Name `xml:"host"` XMLName xml.Name `xml:"host"`
Address Address `xml:"address"` Address address `xml:"address"`
Ports Ports `xml:"ports"` Ports ports `xml:"ports"`
} }
// Address is a host's address discovered during a scan // Address is a host's address discovered during a scan
type Address struct { type address struct {
XMLName xml.Name `xml:"address"` XMLName xml.Name `xml:"address"`
Addr string `xml:"addr,attr"` Addr string `xml:"addr,attr"`
AddrType string `xml:"addrType,attr"` AddrType string `xml:"addrType,attr"`
} }
// Ports is the list of openned ports on a host // Ports is the list of openned ports on a host
type Ports struct { type ports struct {
XMLName xml.Name `xml:"ports"` XMLName xml.Name `xml:"ports"`
Ports []Port `xml:"port"` Ports []port `xml:"port"`
} }
// Port is a port found on a host during a scan // Port is a port found on a host during a scan
type Port struct { type port struct {
XMLName xml.Name `xml:"port"` XMLName xml.Name `xml:"port"`
PortID uint `xml:"portid,attr"` PortID uint `xml:"portid,attr"`
State State `xml:"state"` State state `xml:"state"`
Service Service `xml:"service"` Service service `xml:"service"`
} }
// State is the state of a port // State is the state of a port
type State struct { type state struct {
XMLName xml.Name `xml:"state"` XMLName xml.Name `xml:"state"`
State string `xml:"state,attr" validate:"required,eq=open"` State string `xml:"state,attr" validate:"required,eq=open"`
} }
// Service represents the service that a port provides // Service represents the service that a port provides
type Service struct { type service struct {
XMLName xml.Name `xml:"service"` XMLName xml.Name `xml:"service"`
Name string `xml:"name,attr" validate:"required,eq=rtsp"` Name string `xml:"name,attr" validate:"required,eq=rtsp"`
Product string `xml:"product,attr"` Product string `xml:"product,attr"`