@@ -6,27 +6,90 @@ import (
66 "github.com/bufsnake/blueming/config"
77 "github.com/bufsnake/blueming/internal/core"
88 "github.com/bufsnake/blueming/pkg/log"
9+ "golang.org/x/text/encoding/simplifiedchinese"
910 "io/ioutil"
11+ "math"
1012 "net/url"
1113 "os"
14+ "os/exec"
15+ "runtime"
1216 "strings"
17+ "sync"
18+ "syscall"
1319 "time"
1420)
1521
1622func main () {
1723 conf := config.Config {}
18- flag .IntVar (& conf .Thread , "t" , 10 , "set thread" )
24+ flag .IntVar (& conf .Thread , "t" , 100 , "set thread" )
1925 flag .IntVar (& conf .Timeout , "s" , 10 , "set timeout" )
2026 flag .StringVar (& conf .Url , "u" , "" , "set url" )
2127 flag .StringVar (& conf .Urlfile , "f" , "" , "set url file" )
2228 flag .StringVar (& conf .Loglevel , "l" , log .DEBUG , "set log level(trace,debug,info,warn,fatal)" )
2329 flag .StringVar (& conf .Wordlist , "w" , "" , "set wordlist" )
24- flag .StringVar (& conf .Index , "i" , "" , "set wordlist index(ex: test.php)" )
25- flag .StringVar (& conf .Proxy , "p" , "" , "set download proxy" )
26- flag .StringVar (& conf .ExcludeStatus , "es" , "404" , "dirscan filter status(200,206,301,302,307,400,401,402,403,404,405,406,424,500,501,502,503,504,600,etc.)" )
27- flag .StringVar (& conf .ResultFile , "rf" , "" , "parse result file" )
30+ flag .StringVar (& conf .Index , "i" , "" , "set wordlist index(exp: test.php)" )
31+ flag .StringVar (& conf .Proxy , "p" , "" , "set proxy, support http proxy(exp: http://localhost:8080)" )
32+ flag .StringVar (& conf .Listen , "listen" , "127.0.0.1:9099" , "listen to scan dir" )
33+ flag .StringVar (& conf .URLStrs , "urls" , "" , "set url file" )
34+ flag .StringVar (& conf .Cert , "crt" , "ca.crt" , "listen cert" )
35+ flag .StringVar (& conf .Key , "key" , "ca.key" , "listen key" )
36+ flag .BoolVar (& conf .FilterOutput , "b" , false , "filter output data" )
37+ // 暂不考虑
38+ //flag.StringVar(&conf.ResultFile, "rf", "", "parse result file")
2839 flag .Parse ()
40+ // 开启多核模式
41+ runtime .GOMAXPROCS (runtime .NumCPU () * 3 / 4 )
42+ // 关闭 GIN Debug模式
43+ // 设置工具可打开的文件描述符
44+ var rLimit syscall.Rlimit
45+ rLimit .Max = 999999
46+ rLimit .Cur = 999999
47+ if runtime .GOOS == "darwin" {
48+ rLimit .Cur = 10240
49+ }
50+ err := syscall .Setrlimit (syscall .RLIMIT_NOFILE , & rLimit )
51+ if err != nil {
52+ fmt .Println (err )
53+ os .Exit (1 )
54+ }
55+ _ = syscall .Getrlimit (syscall .RLIMIT_NOFILE , & rLimit )
2956 log .SetLevel (conf .Loglevel )
57+ if conf .FilterOutput {
58+ // 获取 output 下的所有文件 不包含文件夹
59+ allfiles , _ := ioutil .ReadDir ("./output" )
60+ for _ ,f := range allfiles {
61+ if ! f .IsDir () {
62+ if f .Size () <= 1048576 {
63+ err = os .Remove ("./output/" + f .Name ())
64+ if err != nil {
65+ log .Fatal (err )
66+ }
67+ }
68+ }
69+ }
70+
71+ wait := sync.WaitGroup {}
72+ files , _ := ioutil .ReadDir ("./output" )
73+ fmt .Println ("current exist" , len (files ), "files" )
74+ go func () {
75+ for {
76+ fmt .Printf ("\r %.2f%%" , math .Trunc (((increase / float64 (len (files )))* 100 )* 1e2 )* 1e-2 )
77+ time .Sleep (1 * time .Second / 10 )
78+ }
79+ }()
80+ for _ , f := range files {
81+ if ! f .IsDir () {
82+ wait .Add (1 )
83+ go filter (& wait , strings .ReplaceAll ("./output/" + f .Name (), " " , ` ` ), float64 (len (files )))
84+ } else {
85+ increaseAdd ()
86+ fmt .Printf ("\r %.2f%%" , math .Trunc (((increase / float64 (len (files )))* 100 )* 1e2 )* 1e-2 )
87+ }
88+ }
89+ wait .Wait ()
90+ // function filter { if [[ $(file $1 | grep $1": data") == "" && $(file $1 | grep "image data") == "" && $(file $1 | grep "HTML") == "" && $(file $1 | grep "empty") == "" && $(file $1 | grep "JSON") == "" && $(file $1 | grep "text") == "" ]]; then file $1; else rm -rf $1; fi } && filter logs/data.tar.gz
91+ os .Exit (1 )
92+ }
3093 urls := []string {}
3194 if conf .Url != "" {
3295 urls = append (urls , conf .Url )
@@ -88,12 +151,43 @@ func main() {
88151 }
89152 }
90153 return
154+ } else if conf .Listen != "" {
155+ if conf .Wordlist == "" {
156+ log .Fatal ("If passive scanning is started, a dictionary must be specified" )
157+ }
158+ if conf .URLStrs == "" {
159+ log .Fatal ("urls must be specified" )
160+ }
161+ passive := core .NewPassive (conf )
162+ err = passive .Start ()
163+ if err != nil {
164+ log .Fatal (err )
165+ }
91166 } else {
92167 flag .Usage ()
93168 return
94169 }
170+ // 判断 output 文件夹是否存在
171+ if ! exists ("./output" ) {
172+ log .Info ("create output file path" )
173+ err := os .Mkdir ("./output/" , os .ModePerm )
174+ if err != nil {
175+ log .Warn ("create output file path error" , err )
176+ os .Exit (1 )
177+ }
178+ }
179+ // 创建 Log 文件夹
180+ if ! exists ("./logs" ) {
181+ log .Info ("create logs file path" )
182+ err := os .Mkdir ("./logs/" , os .ModePerm )
183+ if err != nil {
184+ log .Warn ("create logs file path error" , err )
185+ os .Exit (1 )
186+ }
187+ }
188+
95189 log .Info (len (urls ), "个URL," , conf .Thread , "线程," , conf .Timeout , "超时" )
96- config .LogFileName = "Log-" + time .Now ().Format ("2006-01-02 15:04:05" )
190+ config .LogFileName = "./logs/ Log-" + time .Now ().Format ("2006-01-02 15:04:05" )
97191 create , err := os .Create (config .LogFileName )
98192 if err != nil {
99193 log .Warn (err )
@@ -105,3 +199,43 @@ func main() {
105199 newCore := core .NewCore (urls , conf )
106200 newCore .Core ()
107201}
202+
203+ func exists (path string ) bool {
204+ _ , err := os .Stat (path ) //os.Stat获取文件信息
205+ if err != nil {
206+ if os .IsExist (err ) {
207+ return true
208+ }
209+ return false
210+ }
211+ return true
212+ }
213+
214+ var increase float64 = 0
215+ var inc_l sync.Mutex
216+
217+ func increaseAdd () {
218+ inc_l .Lock ()
219+ defer inc_l .Unlock ()
220+ increase ++
221+ }
222+
223+ func filter (wait * sync.WaitGroup , filename string , totalcount float64 ) {
224+ defer wait .Done ()
225+ bin := []string {"-c" , "function filter { if [[ $(file $1 | grep $1\" : data\" ) == \" \" && $(file $1 | grep \" image data\" ) == \" \" && $(file $1 | grep \" HTML\" ) == \" \" && $(file $1 | grep \" empty\" ) == \" \" && $(file $1 | grep \" JSON\" ) == \" \" && $(file $1 | grep \" text\" ) == \" \" ]]; then file $1; else rm -rf $1; fi } && filter '" + filename + "'" }
226+ // 其他的shell环境太烦了
227+ run := exec .Command ("/bin/zsh" , bin ... )
228+ output , err := run .Output ()
229+ if err != nil {
230+ log .Fatal (err )
231+ }
232+ output , err = simplifiedchinese .GB18030 .NewDecoder ().Bytes (output )
233+ if err != nil {
234+ log .Fatal (err )
235+ }
236+ if len (output ) != 0 {
237+ fmt .Print ("\r " + string (output ))
238+ }
239+ increaseAdd ()
240+ fmt .Printf ("\r %.2f%%" , math .Trunc (((increase / totalcount )* 100 )* 1e2 )* 1e-2 )
241+ }
0 commit comments