55 "github.com/SummerSec/SpringExploit/cmd/commons/attack"
66 "github.com/SummerSec/SpringExploit/cmd/commons/utils"
77 "github.com/fatih/structs"
8+ "github.com/panjf2000/ants/v2"
89 log "github.com/sirupsen/logrus"
910 "net/url"
1011 "sync"
@@ -57,35 +58,75 @@ func (r *Runner) Run() {
5758 k := r .options .Thread
5859 var wg sync.WaitGroup
5960 hashmap := structs .Map (& r .options )
61+ defer ants .Release ()
62+ // TODO: check if options are valid
63+ if k <= 0 {
64+ k = 500
65+ }
66+ log .Info ("Running with " , k , " threads" )
67+ pool , err1 := ants .NewPool (k + 1 , ants .WithPreAlloc (true ))
68+ if err1 != nil {
69+ log .Error ("Error creating pool" )
70+ return
71+ }
72+ log .Info ("Total URLs: " , len (urls ))
6073 for i < len (urls ) {
74+ //TODO 老代码
75+ //for t := 0; t < k; t++ {
76+ // if i == len(urls) {
77+ // break
78+ // }
79+ // if urls[i] != "" {
80+ // log.Debugln("Running attack on: ", urls[i])
81+ // // 通道通信 发送url 并且 i++
82+ // c := make(chan int)
83+ // wg.Add(1)
84+ // go func() {
85+ // log.Debugf("Running go func() %d", t)
86+ // Start(urls[i], hashmap, i, c) // Start k goroutines
87+ // wg.Done()
88+ // }()
89+ // i = <-c
90+ // } else {
91+ // wg.Wait()
92+ // i++
93+ // break
94+ // }
95+ //}
96+
6197 for t := 0 ; t < k ; t ++ {
62- if i == len (urls ) {
98+ if i == len (urls )- 1 {
6399 break
64100 }
65101 if urls [i ] != "" {
66- log .Debugln ("Running attack on: " , urls [i ])
67102 // 通道通信 发送url 并且 i++
68- c := make (chan int )
103+ //c := make(chan int)
104+ log .Debugf ("Now Threads: %d" , t )
69105 wg .Add (1 )
70- go func () {
71- log .Debugf ("Running go func() % d" , t )
72- Start (urls [i ], hashmap , i , c ) // Start k goroutines
106+ err := pool . Submit ( func () {
107+ log .Debugf ("Running Submit %d url is %s % d" , t , urls [ i ], i )
108+ Start2 (urls [i ], hashmap , i ) // Start k goroutines
73109 wg .Done ()
74- }()
75- i = <- c
110+ })
111+ i ++
112+ if err != nil {
113+ log .Error ("Error submitting job " + urls [i ])
114+ log .Error (err )
115+ }
116+ //i = <-c
76117 } else {
77- wg .Wait ()
78118 i ++
79- break
119+ wg . Wait ()
80120 }
81121 }
122+
82123 }
83124
84125}
85126
86127func Start (u string , hashmap map [string ]interface {}, i int , c chan int ) {
87128 log .Info ("Runner started" )
88- log .Infoln ("testing URL: " , u )
129+ log .Infoln ("Pen- testing URL: " , u )
89130 //for k, v := range hashmap {
90131 // log.Debugln("key: ", k, " value: ", v)
91132 //}
@@ -111,3 +152,32 @@ func Start(u string, hashmap map[string]interface{}, i int, c chan int) {
111152 c <- i + 1
112153
113154}
155+
156+ func Start2 (u string , hashmap map [string ]interface {}, i int ) {
157+ log .Infof ("%s Runner started" , u )
158+ //log.Infoln("testing URL: ", u)
159+ //for k, v := range hashmap {
160+ // log.Debugln("key: ", k, " value: ", v)
161+ //}
162+ defer func () {
163+ if errs := recover (); errs != nil {
164+ log .Debug ("Runner panic: " , errs )
165+ }
166+ }()
167+
168+ r , err := url .Parse (u )
169+ if err != nil {
170+ log .Info ("URL parse error" )
171+ log .Errorln (err )
172+ return
173+ }
174+ var target string
175+ if r .Path == "" {
176+ target = r .Scheme + "://" + r .Host + "/"
177+ } else {
178+ target = r .Scheme + "://" + r .Host + r .Path
179+ }
180+ attack .Sevice (target , hashmap )
181+ log .Infof ("%s Runner finished" , u )
182+
183+ }
0 commit comments