Skip to content

Commit

Permalink
Added CSV output format
Browse files Browse the repository at this point in the history
  • Loading branch information
k4ch0w committed Jul 3, 2017
1 parent 98958e5 commit 6912148
Show file tree
Hide file tree
Showing 4 changed files with 120 additions and 113 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
.build/
test/build
.idea/
PwnDelorean
63 changes: 0 additions & 63 deletions README.MD

This file was deleted.

1 change: 1 addition & 0 deletions git.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ type GitFile struct {
CommitId string
}


func GetRepoFilenames(repoUrl string) ([]GitFile, error){
var filenames []GitFile
dir, err := ioutil.TempDir("", "PwnDelorean")
Expand Down
168 changes: 118 additions & 50 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
"flag"
"regexp"
"strings"
"encoding/csv"
)

type Pattern struct {
Expand All @@ -21,16 +22,19 @@ type Pattern struct {
type Match struct {
Filename string
Filepath string
CommitID string
CommitIds []string
Description string
}

var dirToScanFlag = flag.String("directory", "", "Directory to scan")
var repoToScanFlag = flag.String("url", "", "Git Repo URL to scan")
var outputCSVFlag = flag.Bool("csv", false, "Output in CSV Format")
var secretFileNameLiterals = []Pattern{}
var secretFileNameRegexes = []Pattern{}
var fileContentLiterals = []Pattern{}
var fileContentRegexes = []Pattern{}

func initializePatterns(path string, info os.FileInfo, err error) error {
func initializePatterns(path string, info os.FileInfo, _ error) error {
if !info.IsDir() {
file, e := ioutil.ReadFile(path)
if e != nil {
Expand Down Expand Up @@ -59,90 +63,149 @@ func initializePatterns(path string, info os.FileInfo, err error) error {
return nil
}

func GetAllFilesInDirectory(dir string) ([]os.FileInfo, error) {
files, err := ioutil.ReadDir(dir)
return files, err
type FileStruct struct {
Filename string
Path string
}

func GetAllFilesInDirectory(dir string) ([]FileStruct, error) {
fileList := []FileStruct{}
err := filepath.Walk(dir, func(path string, f os.FileInfo, err error) error {
fileList = append(fileList, FileStruct{f.Name(), path})
return nil
})
if err != nil{
return nil, err
}
return fileList, nil
}

func appendFilesystemMatch(pattern Pattern, filestruct FileStruct, table map[string]*Match) {
name := filestruct.Filename
_, exists := table[name]
if !exists {
table[name] = &Match{filestruct.Filename, filestruct.Path,
nil,pattern.Description}
fmt.Println(fmt.Sprintf("Found match %s: %s", pattern.Description, filestruct.Path))
}
}
func appendGitMatch(pattern Pattern, filename GitFile, table map[string]*Match) {
//You can't assume a file hasn't moved directories in history
// which is why you use the filepath + filename for uniqueness
path := filename.Filepath
if len(path) == 0 {
path = "/" + filename.Name
} else {
path += filename.Name
}
_, exists := table[path]
if exists {
table[path].CommitIds = append(table[path].CommitIds, filename.CommitId)
} else {
table[path] = &Match{filename.Name, path,
[]string{filename.CommitId}, pattern.Description}
fmt.Println(fmt.Sprintf("Found match %s %s", pattern.Description, path))
}
}

func gitSecretFilenameLiteralSearch(files []GitFile) []Match {
var results []Match
var table = make(map[string]bool)
func gitSecretFilenameLiteralSearch(files []GitFile) []*Match {
var table = make(map[string]*Match)
for _, pattern := range secretFileNameLiterals {
for _, filename := range files {
if strings.Contains(filename.Name, pattern.Value) {
if table[filename.Name] {
continue
} else {
table[filename.Name] = true
path := filename.Filepath
if len(path) == 0 {
path = "/" + filename.Name
} else {
path += filename.Name
}
results = append(results, Match{filename.Name, path,
filename.CommitId, pattern.Description})
fmt.Println(fmt.Sprintf("Found match %s %s", pattern.Description, path))
}
appendGitMatch(pattern, filename, table)
}
}
}
var results []*Match
for _, values := range table {
results = append(results, values)
}
return results
}

func gitSecretFilenameRegexSearch(files []GitFile) []Match {
var results []Match
var table = make(map[string]bool)
func gitSecretFilenameRegexSearch(files []GitFile) []*Match {
var table = make(map[string]*Match)
for _, filename := range files {
for _, pattern := range secretFileNameRegexes {
if pattern.Regex.MatchString(filename.Name) && !table[filename.Name] {
path := filename.Filepath
if len(path) == 0 {
path = "/" + filename.Name
} else {
path += filename.Name
}
results = append(results, Match{filename.Name, path,
filename.CommitId, pattern.Description})
fmt.Println(fmt.Sprintf("Found match %s %s", pattern.Description, path))
if pattern.Regex.MatchString(filename.Name) {
appendGitMatch(pattern, filename, table)
break
}
}
}
var results []*Match
for _, values := range table {
results = append(results, values)
}
return results
}

func filesystemSecretFilenameLiteralSearch(files []os.FileInfo) {
func filesystemSecretFilenameLiteralSearch(files []FileStruct) []*Match {
var table = make(map[string]*Match)
for _, pattern := range secretFileNameLiterals {
for _, filename := range files {
if strings.Contains(filename.Name(), pattern.Value) {
fmt.Println(fmt.Sprintf("Found match %s in %s", pattern.Description, filename.Name()))
if strings.Contains(filename.Filename, pattern.Value) {
appendFilesystemMatch(pattern, filename, table)
}
}
}
var results []*Match
for _, values := range table {
results = append(results, values)
}
return results
}

func filesystemSecretFilenameRegexSearch(files []os.FileInfo) {
for _, filename := range files {
func filesystemSecretFilenameRegexSearch(files []FileStruct) []*Match{
var table = make(map[string]*Match)
for _, filestruct := range files {
for _, pattern := range secretFileNameRegexes {
if pattern.Regex.MatchString(filename.Name()) {
fmt.Println(fmt.Sprintf("Found match %s", filename.Name()))
if pattern.Regex.MatchString(filestruct.Filename) {
appendFilesystemMatch(pattern, filestruct, table)
break
}
}
}
var results []*Match
for _, values := range table {
results = append(results, values)
}
return results
}

var dirToScanFlag = flag.String("directory", "", "Directory to scan")
var repoToScanFlag = flag.String("url", "", "Git Repo URL to scan")

func initalize() {
err := filepath.Walk("./patterns", initializePatterns)
if err != nil {
fmt.Println(err)
}
}

func outputCSV(records [][]string) {
w := csv.NewWriter(os.Stdout)
w.WriteAll(records)
if err := w.Error(); err != nil {
fmt.Println(err)
}
}

func outputCSVFilesystem(matches []*Match){
records := [][]string{{"Filename", "Description", "Filepath", "CommitID"}}
for _, match := range matches {
records = append(records, []string{match.Filename, match.Description, match.Filepath})
}
outputCSV(records)
}

func outputCSVGitRepo(matches []*Match){
records := [][]string{{"Filename", "Description", "Filepath", "CommitID"}}
for _, match := range matches {
records = append(records, []string{match.Filename, match.Description, match.Filepath,
strings.Join(match.CommitIds, "|")})
}
outputCSV(records)
}

func main() {
initalize()
flag.Parse()
Expand All @@ -152,16 +215,21 @@ func main() {
fmt.Println(err)
os.Exit(-1)
}
filesystemSecretFilenameLiteralSearch(files)
filesystemSecretFilenameRegexSearch(files)
results := filesystemSecretFilenameLiteralSearch(files)
results = append(results, filesystemSecretFilenameRegexSearch(files)...)
if *outputCSVFlag {
outputCSVFilesystem(results)
}
} else if len(*repoToScanFlag) != 0 {
files, err := GetRepoFilenames(*repoToScanFlag)
if err != nil {
fmt.Println(err)
}
gitSecretFilenameLiteralSearch(files)
gitSecretFilenameRegexSearch(files)
//TODO: Output format for results
results := gitSecretFilenameLiteralSearch(files)
results = append(results, gitSecretFilenameRegexSearch(files)...)
if *outputCSVFlag {
outputCSVGitRepo(results)
}
} else {
flag.Usage()
os.Exit(-1)
Expand Down

0 comments on commit 6912148

Please sign in to comment.