@@ -56,6 +56,12 @@ func main() {
56
56
57
57
dumpDSE := flag .Bool ("dump" , false , "Just dump the rootDSE, no bruteforcing" )
58
58
59
+ // bruteforce usernames
60
+ mode := flag .String ("mode" , "static" , "password generator (static: read from file/stdin | generate: bruteforce len/charset)" )
61
+ minlen := flag .Int ("minlength" , 1 , "Minimum length of generated usernames" )
62
+ maxlen := flag .Int ("maxlength" , 5 , "Maximum length of generated usernames" )
63
+ charset := flag .String ("charset" , "abcdefghijklmnopqrstuvwxyz0123456789.@" , "Characters to use in bruteforcing" )
64
+
59
65
// evasive maneuvers
60
66
throttle := flag .Int ("throttle" , 0 , "Only do a request every N ms, 0 to disable" )
61
67
maxrequests := flag .Int ("maxrequests" , 0 , "Disconnect and reconnect a connection after n requests, 0 to disable" )
@@ -87,7 +93,7 @@ func main() {
87
93
88
94
var pbmax int
89
95
input := os .Stdin
90
- if * inputname != "" {
96
+ if * mode == "static" && * inputname != "" {
91
97
input , err = os .Open (* inputname )
92
98
if err != nil {
93
99
log .Fatalf ("Can't open %v: %v" , * inputname , err )
@@ -117,6 +123,12 @@ func main() {
117
123
input .Seek (0 , io .SeekStart )
118
124
pb .Finish ()
119
125
}
126
+ } else if * mode == "generate" {
127
+ for curlength := * minlen ; curlength <= * maxlen ; curlength ++ {
128
+ sg := NewStringGen (* charset , curlength )
129
+ pbmax += int (sg .Complexity ())
130
+ }
131
+ fmt .Printf ("Generating %v usernames ranging in length from %v to %v\n " , pbmax , * minlen , * maxlen )
120
132
}
121
133
122
134
names := bufio .NewScanner (input )
@@ -435,15 +447,16 @@ func main() {
435
447
}()
436
448
437
449
var pb * progressbar.ProgressBar
438
- if pbmax != 0 {
450
+ if * outputname != "" && pbmax != 0 {
439
451
pb = progressbar .NewOptions (pbmax ,
440
452
progressbar .OptionSetDescription ("Usernames nom'ed" ),
441
453
progressbar .OptionShowIts (),
442
454
)
443
455
}
444
456
445
- go func () {
446
- var line int
457
+ var line int
458
+ switch * mode {
459
+ case "static" :
447
460
for names .Scan () {
448
461
if pb != nil && line % 500 == 0 {
449
462
pb .Set (line )
@@ -458,8 +471,20 @@ func main() {
458
471
}
459
472
line ++
460
473
}
461
- close (inputqueue )
462
- }()
474
+ case "generate" :
475
+ for curlength := * minlen ; curlength <= * maxlen ; curlength ++ {
476
+ sg := NewStringGen (* charset , curlength )
477
+ for sg .Next () {
478
+ inputqueue <- sg .String ()
479
+ line ++
480
+
481
+ if pb != nil && line % 500 == 0 {
482
+ pb .Set (line )
483
+ }
484
+ }
485
+ }
486
+ }
487
+ close (inputqueue )
463
488
464
489
jobs .Wait ()
465
490
close (outputqueue )
0 commit comments