Compare commits

...
3 Commits
Author SHA1 Message Date
Hadi c76953882c Nil when no result & better error handling
Signed-off-by: Hadi <[email protected]>
2025-09-17 20:39:53 +02:00
Hadi 94fd83ecce fix print with private interface
Signed-off-by: Hadi <[email protected]>
2025-09-17 20:26:31 +02:00
Hadi 2d01c1639f Fix isDir condition
Signed-off-by: Hadi <[email protected]>
2025-09-17 19:47:50 +02:00
4 changed files with 21 additions and 16 deletions
+2 -2
View File
@@ -13,7 +13,7 @@ type EmailResult struct {
TargetType github_recon_settings.TargetType TargetType github_recon_settings.TargetType
Commits CommitsResult Commits CommitsResult
Spoofing SpoofingResult Spoofing *SpoofingResult
} }
func Email(settings github_recon_settings.Settings) EmailResult { func Email(settings github_recon_settings.Settings) EmailResult {
@@ -33,7 +33,7 @@ func Email(settings github_recon_settings.Settings) EmailResult {
} else { } else {
utils.PrintTitle(settings.Silent, "🎭 Spoofing test") utils.PrintTitle(settings.Silent, "🎭 Spoofing test")
result.Spoofing = Spoofing(settings) result.Spoofing = Spoofing(settings)
if result.Spoofing.AvatarURL != "" { if result.Spoofing != nil && result.Spoofing.AvatarURL != "" {
utils.PrintAvatar(settings, result.Spoofing.AvatarURL) utils.PrintAvatar(settings, result.Spoofing.AvatarURL)
} }
utils.PrintStruct(settings, result.Spoofing, 0) utils.PrintStruct(settings, result.Spoofing, 0)
+14 -11
View File
@@ -26,7 +26,8 @@ func RandomString(n int) string {
return string(b) return string(b)
} }
func Spoofing(s github_recon_settings.Settings) (response SpoofingResult) { func Spoofing(s github_recon_settings.Settings) (response *SpoofingResult) {
response = &SpoofingResult{}
name := "gh-recon-spoofing-" + RandomString(8) name := "gh-recon-spoofing-" + RandomString(8)
private := true private := true
autoInit := true autoInit := true
@@ -41,6 +42,13 @@ func Spoofing(s github_recon_settings.Settings) (response SpoofingResult) {
} }
utils.WaitForRateLimit(s, resp) utils.WaitForRateLimit(s, resp)
defer func() {
_, err = s.Client.Repositories.Delete(s.Ctx, repo.Owner.GetLogin(), name)
if err != nil {
s.Logger.Error("Error while deleting repo", "err", err)
}
}()
branch := repo.GetDefaultBranch() branch := repo.GetDefaultBranch()
if branch == "" { if branch == "" {
branch = "main" branch = "main"
@@ -57,7 +65,6 @@ func Spoofing(s github_recon_settings.Settings) (response SpoofingResult) {
ref, resp, err := s.Client.Git.GetRef(s.Ctx, repo.Owner.GetLogin(), name, refName) ref, resp, err := s.Client.Git.GetRef(s.Ctx, repo.Owner.GetLogin(), name, refName)
if err != nil { if err != nil {
s.Logger.Error("Error while getting ref", "err", err) s.Logger.Error("Error while getting ref", "err", err)
s.Logger.Warn("The temp repo was left undeleted", "repo", repo.GetHTMLURL())
return return
} }
utils.WaitForRateLimit(s, resp) utils.WaitForRateLimit(s, resp)
@@ -65,7 +72,6 @@ func Spoofing(s github_recon_settings.Settings) (response SpoofingResult) {
parentCommit, resp, err := s.Client.Git.GetCommit(s.Ctx, repo.Owner.GetLogin(), name, ref.GetObject().GetSHA()) parentCommit, resp, err := s.Client.Git.GetCommit(s.Ctx, repo.Owner.GetLogin(), name, ref.GetObject().GetSHA())
if err != nil { if err != nil {
s.Logger.Error("Error while getting parent commit", "err", err) s.Logger.Error("Error while getting parent commit", "err", err)
s.Logger.Warn("The temp repo was left undeleted", "repo", repo.GetHTMLURL())
return return
} }
utils.WaitForRateLimit(s, resp) utils.WaitForRateLimit(s, resp)
@@ -81,7 +87,6 @@ func Spoofing(s github_recon_settings.Settings) (response SpoofingResult) {
newCommit, resp, err := s.Client.Git.CreateCommit(s.Ctx, repo.Owner.GetLogin(), name, commit, nil) newCommit, resp, err := s.Client.Git.CreateCommit(s.Ctx, repo.Owner.GetLogin(), name, commit, nil)
if err != nil { if err != nil {
s.Logger.Error("Error while creating spoofed empty commit", "err", err) s.Logger.Error("Error while creating spoofed empty commit", "err", err)
s.Logger.Warn("The temp repo was left undeleted", "repo", repo.GetHTMLURL())
return return
} }
utils.WaitForRateLimit(s, resp) utils.WaitForRateLimit(s, resp)
@@ -90,7 +95,6 @@ func Spoofing(s github_recon_settings.Settings) (response SpoofingResult) {
_, resp, err = s.Client.Git.UpdateRef(s.Ctx, repo.Owner.GetLogin(), name, ref, false) _, resp, err = s.Client.Git.UpdateRef(s.Ctx, repo.Owner.GetLogin(), name, ref, false)
if err != nil { if err != nil {
s.Logger.Error("Error while updating ref to spoofed commit", "err", err) s.Logger.Error("Error while updating ref to spoofed commit", "err", err)
s.Logger.Warn("The temp repo was left undeleted", "repo", repo.GetHTMLURL())
return return
} }
utils.WaitForRateLimit(s, resp) utils.WaitForRateLimit(s, resp)
@@ -98,23 +102,22 @@ func Spoofing(s github_recon_settings.Settings) (response SpoofingResult) {
commits, _, err := s.Client.Repositories.ListCommits(s.Ctx, repo.Owner.GetLogin(), name, nil) commits, _, err := s.Client.Repositories.ListCommits(s.Ctx, repo.Owner.GetLogin(), name, nil)
if err != nil { if err != nil {
s.Logger.Error("Error while listing commits", "err", err) s.Logger.Error("Error while listing commits", "err", err)
s.Logger.Warn("The temp repo was left undeleted", "repo", repo.GetHTMLURL())
return return
} }
if len(commits) > 0 { if len(commits) > 1 {
last := commits[0] last := commits[0]
response.Username = last.GetAuthor().GetLogin() response.Username = last.GetAuthor().GetLogin()
response.Name = last.GetAuthor().GetName() response.Name = last.GetAuthor().GetName()
response.Email = last.GetAuthor().GetEmail() response.Email = last.GetAuthor().GetEmail()
response.Url = last.GetAuthor().GetHTMLURL() response.Url = last.GetAuthor().GetHTMLURL()
response.AvatarURL = last.GetAuthor().GetAvatarURL() response.AvatarURL = last.GetAuthor().GetAvatarURL()
} else {
s.Logger.Error("Only one commit found, something went wrong.", "commits", commits)
} }
_, err = s.Client.Repositories.Delete(s.Ctx, repo.Owner.GetLogin(), name) if response.Username == "" && response.Name == "" && response.Email == "" {
if err != nil { return nil
s.Logger.Error("Error while deleting repo", "err", err)
} }
return return
} }
+2 -2
View File
@@ -334,13 +334,13 @@ func findEmailsAndOccurrencesInDir(rootPath string, username string) (Emails, er
if err != nil { if err != nil {
return err return err
} }
if !d.IsDir() { if d.Type().IsRegular() {
if strings.Contains(path, ".git/logs/") { if strings.Contains(path, ".git/logs/") {
return nil return nil
} }
content, err := os.ReadFile(path) content, err := os.ReadFile(path)
if err != nil { if err != nil {
return err return nil
} }
currentFileEmails := emailRegex.FindAllString(string(content), -1) currentFileEmails := emailRegex.FindAllString(string(content), -1)
+3 -1
View File
@@ -57,7 +57,9 @@ func PrintStruct(settings github_recon_settings.Settings, s any, indent int) {
for i := 0; i < v.NumField(); i++ { for i := 0; i < v.NumField(); i++ {
field := t.Field(i).Name field := t.Field(i).Name
value := v.Field(i) value := v.Field(i)
if !value.CanInterface() {
continue
}
if !value.IsValid() || (value.Kind() == reflect.String && value.String() == "") { if !value.IsValid() || (value.Kind() == reflect.String && value.String() == "") {
continue continue
} }