mirror of
https://github.com/shadow1ng/fscan.git
synced 2026-09-25 20:51:52 +08:00
update
This commit is contained in:
+117
@@ -0,0 +1,117 @@
|
||||
package common
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"flag"
|
||||
"fmt"
|
||||
"os"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func Parse(Info *HostInfo){
|
||||
ParseUser(Info)
|
||||
ParsePass(Info)
|
||||
ParseInput(Info)
|
||||
ParseScantype(Info)
|
||||
}
|
||||
|
||||
|
||||
|
||||
func ParseUser(Info *HostInfo){
|
||||
if Info.Username!=""{
|
||||
uesrs := strings.Split(Info.Username, ",")
|
||||
for _,uesr := range uesrs{
|
||||
if uesr !=""{
|
||||
Info.Usernames = append(Info.Usernames,uesr)
|
||||
}
|
||||
}
|
||||
for name := range Userdict{
|
||||
Userdict[name] = Info.Usernames
|
||||
}
|
||||
}
|
||||
if Info.Userfile!=""{
|
||||
uesrs,err := Readfile(Info.Userfile)
|
||||
if err == nil {
|
||||
for _, uesr := range uesrs {
|
||||
if uesr != "" {
|
||||
Info.Usernames = append(Info.Usernames, uesr)
|
||||
}
|
||||
}
|
||||
for name := range Userdict {
|
||||
Userdict[name] = Info.Usernames
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func ParsePass(Info *HostInfo){
|
||||
if Info.Password!=""{
|
||||
passs := strings.Split(Info.Password, ",")
|
||||
for _,pass := range passs{
|
||||
if pass !=""{
|
||||
Info.Passwords = append(Info.Passwords,pass)
|
||||
}
|
||||
}
|
||||
Passwords = Info.Passwords
|
||||
}
|
||||
if Info.Passfile!=""{
|
||||
passs,err := Readfile(Info.Passfile)
|
||||
if err == nil{
|
||||
for _,pass := range passs{
|
||||
if pass !=""{
|
||||
Info.Passwords = append(Info.Passwords,pass)
|
||||
}
|
||||
}
|
||||
Passwords = Info.Passwords
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func Readfile(filename string)([]string,error){
|
||||
file, err := os.Open(filename)
|
||||
if err!=nil{
|
||||
fmt.Println("Open %s error, %v", filename,err)
|
||||
return nil,err
|
||||
}
|
||||
defer file.Close()
|
||||
var content []string
|
||||
scanner := bufio.NewScanner(file)
|
||||
scanner.Split(bufio.ScanLines)
|
||||
for scanner.Scan() {
|
||||
text := strings.TrimSpace(scanner.Text())
|
||||
if text != "" {
|
||||
content=append(content,scanner.Text())
|
||||
}
|
||||
}
|
||||
return content,nil
|
||||
}
|
||||
|
||||
|
||||
|
||||
func ParseInput(Info *HostInfo){
|
||||
if Info.Host==""{
|
||||
fmt.Println("Host is none")
|
||||
flag.Usage()
|
||||
os.Exit(0)
|
||||
}
|
||||
if Info.Outputfile != ""{
|
||||
Outputfile = Info.Outputfile
|
||||
}
|
||||
if Info.IsSave == true{
|
||||
IsSave = false
|
||||
}
|
||||
}
|
||||
|
||||
func ParseScantype(Info *HostInfo){
|
||||
_,ok:=PORTList[Info.Scantype]
|
||||
if !ok{
|
||||
fmt.Println("The specified scan type does not exist")
|
||||
fmt.Println("-m")
|
||||
for name,_:=range PORTList{
|
||||
fmt.Println(" ["+name+"]")
|
||||
}
|
||||
os.Exit(0)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,131 @@
|
||||
package common
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"net"
|
||||
"regexp"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
var ParseIPErr error =errors.New("host parsing error\n" +
|
||||
"format: \n"+
|
||||
"192.168.1.1/24\n"+
|
||||
"192.168.1.1\n" +
|
||||
"192.168.1.1,192.168.1.2\n" +
|
||||
"192.168.1.1-255")
|
||||
|
||||
func ParseIP(ip string)([]string,error){
|
||||
reg:=regexp.MustCompile(`[a-zA-Z]+`)
|
||||
switch {
|
||||
case strings.Contains(ip[len(ip)-3:len(ip)],"/24"):
|
||||
return ParseIPA(ip)
|
||||
case strings.Contains(ip[len(ip)-3:len(ip)],"/16"):
|
||||
return ParseIPD(ip)
|
||||
case strings.Contains(ip[len(ip)-2:len(ip)],"/8"):
|
||||
return ParseIPE(ip)
|
||||
case strings.Contains(ip,","):
|
||||
return ParseIPB(ip)
|
||||
case strings.Count(ip,"-")==1:
|
||||
return ParseIPC(ip)
|
||||
case reg.MatchString(ip):
|
||||
_, err := net.LookupHost(ip)
|
||||
if err != nil {
|
||||
return nil,err
|
||||
}
|
||||
return []string{ip},nil
|
||||
default:
|
||||
testIP:=net.ParseIP(ip)
|
||||
if testIP==nil{
|
||||
return nil,ParseIPErr
|
||||
}
|
||||
return []string{ip},nil
|
||||
}
|
||||
}
|
||||
|
||||
//Parsing CIDR IP
|
||||
func ParseIPA(ip string)([]string,error){
|
||||
realIP:=ip[:len(ip)-3]
|
||||
testIP:=net.ParseIP(realIP)
|
||||
|
||||
if testIP==nil{
|
||||
return nil,ParseIPErr
|
||||
}
|
||||
IPrange:=strings.Join(strings.Split(realIP,".")[0:3],".")
|
||||
var AllIP []string
|
||||
for i:=0;i<=255;i++{
|
||||
AllIP=append(AllIP,IPrange+"."+strconv.Itoa(i))
|
||||
}
|
||||
return AllIP,nil
|
||||
}
|
||||
|
||||
//Resolving multiple IPS, for example: 192.168.111.1,192.168.111.2
|
||||
func ParseIPB(ip string)([]string,error){
|
||||
IPList:=strings.Split(ip,",")
|
||||
for _,i:=range IPList{
|
||||
testIP:=net.ParseIP(i)
|
||||
if testIP==nil{
|
||||
return nil,ParseIPErr
|
||||
}
|
||||
}
|
||||
return IPList,nil
|
||||
|
||||
}
|
||||
|
||||
//Resolving a range of IP,for example: 192.168.111.1-255
|
||||
func ParseIPC(ip string)([]string,error){
|
||||
IPRange:=strings.Split(ip,"-")
|
||||
testIP:=net.ParseIP(IPRange[0])
|
||||
Range,err:=strconv.Atoi(IPRange[1])
|
||||
if testIP==nil || Range>255 || err!=nil{
|
||||
return nil,ParseIPErr
|
||||
}
|
||||
SplitIP:=strings.Split(IPRange[0],".")
|
||||
ip1,err1:=strconv.Atoi(SplitIP[3])
|
||||
ip2,err2:=strconv.Atoi(IPRange[1])
|
||||
PrefixIP:=strings.Join(SplitIP[0:3],".")
|
||||
var AllIP []string
|
||||
if ip1>ip2 || err1!=nil || err2!=nil{
|
||||
return nil,ParseIPErr
|
||||
}
|
||||
for i:=ip1;i<=ip2;i++{
|
||||
AllIP=append(AllIP,PrefixIP+"."+strconv.Itoa(i))
|
||||
}
|
||||
return AllIP,nil
|
||||
|
||||
}
|
||||
|
||||
func ParseIPD(ip string)([]string,error){
|
||||
realIP:=ip[:len(ip)-3]
|
||||
testIP:=net.ParseIP(realIP)
|
||||
|
||||
if testIP==nil{
|
||||
return nil,ParseIPErr
|
||||
}
|
||||
IPrange:=strings.Join(strings.Split(realIP,".")[0:2],".")
|
||||
var AllIP []string
|
||||
for a:=0;a<=255;a++{
|
||||
for b:=0;b<=255;b++{
|
||||
AllIP=append(AllIP,IPrange+"."+strconv.Itoa(a)+"."+strconv.Itoa(b))
|
||||
}
|
||||
}
|
||||
return AllIP,nil
|
||||
}
|
||||
|
||||
func ParseIPE(ip string)([]string,error){
|
||||
realIP:=ip[:len(ip)-2]
|
||||
testIP:=net.ParseIP(realIP)
|
||||
|
||||
if testIP==nil{
|
||||
return nil,ParseIPErr
|
||||
}
|
||||
IPrange:=strings.Join(strings.Split(realIP,".")[0:1],".")
|
||||
var AllIP []string
|
||||
for a:=0;a<=255;a++{
|
||||
for b:=0;b<=255;b++{
|
||||
AllIP=append(AllIP,IPrange+"."+strconv.Itoa(a)+"."+strconv.Itoa(b)+"."+strconv.Itoa(1))
|
||||
AllIP=append(AllIP,IPrange+"."+strconv.Itoa(a)+"."+strconv.Itoa(b)+"."+strconv.Itoa(254))
|
||||
}
|
||||
}
|
||||
return AllIP,nil
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
package common
|
||||
//
|
||||
//import (
|
||||
// "errors"
|
||||
// "strconv"
|
||||
// "strings"
|
||||
//)
|
||||
//
|
||||
//var ParsePortErr error =errors.New("Port parsing error")
|
||||
//
|
||||
//func ParsePort(port string)([]int,error){
|
||||
// RealPort,err:=strconv.Atoi(port)
|
||||
// switch {
|
||||
// case err==nil && CheckPort(RealPort):
|
||||
// return []int{RealPort},nil
|
||||
// case strings.Contains(port,","):
|
||||
// return ParsePortB(port)
|
||||
// case strings.Count(port,"-")==1:
|
||||
// return ParsePortC(port)
|
||||
// default:
|
||||
// return nil,ParsePortErr
|
||||
// }
|
||||
//}
|
||||
//
|
||||
////Parsing multiple ports, for example: 22,80,3306
|
||||
//func ParsePortB(port string)([]int ,error){
|
||||
// var AllPort []int
|
||||
// port1:=strings.Split(port,",")
|
||||
// for _,p:=range port1{
|
||||
// RealPort,err:=strconv.Atoi(p)
|
||||
// if !CheckPort(RealPort) && err!=nil{
|
||||
// return nil,ParsePortErr
|
||||
// }
|
||||
// AllPort=append(AllPort,RealPort)
|
||||
// }
|
||||
// return AllPort,nil
|
||||
//}
|
||||
//
|
||||
////Parsing a range of port,for example: 22-3306
|
||||
//func ParsePortC(port string)([]int ,error){
|
||||
// var AllPort []int
|
||||
// RangePort:=strings.Split(port,"-")
|
||||
// port1,err1:=strconv.Atoi(RangePort[0])
|
||||
// port2,err2:=strconv.Atoi(RangePort[1])
|
||||
// if port1>port2 || err1!=nil || err2!=nil || !CheckPort(port1) || !CheckPort(port2){
|
||||
// return nil,ParsePortErr
|
||||
// }
|
||||
// for i:=port1;i<=port2;i++{
|
||||
// AllPort=append(AllPort,i)
|
||||
// }
|
||||
// return AllPort,nil
|
||||
//}
|
||||
//
|
||||
//
|
||||
//func CheckPort(port int)bool{
|
||||
// if port<=0 || port >65535{
|
||||
// return false
|
||||
// }
|
||||
// return true
|
||||
//}
|
||||
@@ -0,0 +1,106 @@
|
||||
package common
|
||||
|
||||
var Userdict = map[string][]string{
|
||||
"ftp": {"www","admin","root","db","wwwroot","data","web","ftp"},
|
||||
"mysql": {"root"},
|
||||
"mssql": {"root","sa"},
|
||||
"smb": {"administrator","guest"},
|
||||
"postgresql": {"postgres","admin"},
|
||||
"ssh": {"root","admin"},
|
||||
"mongodb": {"root","admin"},
|
||||
//"telnet": []string{"administrator","admin","root","cisco","huawei","zte"},
|
||||
}
|
||||
|
||||
var Passwords = []string{"admin123A","admin123","123456","admin","root","password","123123","654321","123","1","admin@123","Admin@123","{user}","{user}123","","P@ssw0rd!","qwa123","12345678","test","123qwe!@#","123456789","123321","666666","fuckyou","000000","1234567890","8888888","qwerty","1qaz2wsx","abc123","abc123456","1qaz@WSX","Aa123456","sysadmin","system","huawei"}
|
||||
|
||||
var PORTList = map[string]int{
|
||||
"ftp": 21,
|
||||
"ssh": 22,
|
||||
"mem": 11211,
|
||||
"mgo": 27017,
|
||||
"mssql": 1433,
|
||||
"psql": 5432,
|
||||
"redis": 6379,
|
||||
"mysql": 3306,
|
||||
"smb": 445,
|
||||
"ms17010": 1000001,
|
||||
"cve20200796":1000002,
|
||||
"elastic": 9200,
|
||||
"findnet": 135,
|
||||
"all":0,
|
||||
//"wenscan": 17010,
|
||||
}
|
||||
|
||||
var Outputfile = "result.txt"
|
||||
var IsSave = true
|
||||
|
||||
|
||||
|
||||
type HostInfo struct {
|
||||
Host string
|
||||
Ports string
|
||||
Url string
|
||||
Timeout int64
|
||||
Scantype string
|
||||
Isping bool
|
||||
Threads int
|
||||
Command string
|
||||
Username string
|
||||
Password string
|
||||
Userfile string
|
||||
Passfile string
|
||||
Usernames []string
|
||||
Passwords []string
|
||||
Outputfile string
|
||||
IsSave bool
|
||||
RedisFile string
|
||||
RedisShell string
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//var Passwords = []string{"admin123A","123456","admin","root","password","123123","123","1","{user}","{user}{user}","{user}1","{user}123","{user}2016","{user}2015","{user}!","","P@ssw0rd!!","qwa123","12345678","test","123qwe!@#","123456789","123321","1314520","666666","woaini","fuckyou","000000","1234567890","8888888","qwerty","1qaz2wsx","abc123","abc123456","1q2w3e4r","123qwe","p@ssw0rd","p@55w0rd","password!","p@ssw0rd!","password1","r00t","tomcat","apache","system","huawei","admin123","zte"}
|
||||
//const Username = "admin"
|
||||
//const Password = "123456"
|
||||
//const Timeout = 3 * time.Second
|
||||
//const FTPPORT = 21
|
||||
//const SSHPORT = 22
|
||||
//const MEMCACHEDPORT = 11211
|
||||
//const MONGODBPORT = 27017
|
||||
//const MSSQLPORT = 1433
|
||||
//const OraclePORT = 1433
|
||||
//const PSQLPORT = 5432
|
||||
//const REDISPORT = 6379
|
||||
//const MYSQLPORT = 3306
|
||||
//const SMBPORT = 445
|
||||
//const POSTGRESPORT = 5432
|
||||
|
||||
//var Userdict = map[string][]string{
|
||||
// "ftp": []string{"www","admin","root","db","wwwroot","data","web","ftp"},
|
||||
// "mysql": []string{"root"},
|
||||
// "mssql": []string{"root","sa"},
|
||||
// "smb": []string{"administrator","guest"},
|
||||
// "postgresql": []string{"postgres","admin"},
|
||||
// "ssh": []string{"root","admin"},
|
||||
// "mongodb": []string{"root","admin"},
|
||||
// //"telnet": []string{"administrator","admin","root","cisco","huawei","zte"},
|
||||
//}
|
||||
|
||||
//var PluginList = map[string]interface{}{
|
||||
// "ftp": FtpScan,
|
||||
// "mysql": MysqlScan,
|
||||
// //"mongodb":MgoConn,
|
||||
// "mssql":MssqlScan,
|
||||
// "redis": RedisScan,
|
||||
// //"smb": SmbScan,
|
||||
// "ssh": SshScan,
|
||||
// //"portscan": PortConn,
|
||||
// //"icmp": IcmpConn,
|
||||
// "postgresql": PostgresScan,
|
||||
// //"urlscan":UrlConn,
|
||||
// //"auth":ApacheConn,
|
||||
// //"subdomain":SDConn,
|
||||
// //"memcached":MemConn,
|
||||
//}
|
||||
@@ -0,0 +1,41 @@
|
||||
package common
|
||||
|
||||
import (
|
||||
"flag"
|
||||
)
|
||||
|
||||
func Banner(){
|
||||
banner := `
|
||||
|
||||
___ _
|
||||
/ _ \ ___ ___ _ __ __ _ ___| | __
|
||||
/ /_\/____/ __|/ __| '__/ _`+"`"+` |/ __| |/ /
|
||||
/ /_\\_____\__ \ (__| | | (_| | (__| <
|
||||
\____/ |___/\___|_| \__,_|\___|_|\_\
|
||||
`
|
||||
print(banner)
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
func Flag(Info *HostInfo) {
|
||||
Banner()
|
||||
Ports := "21,22,23,80,135,443,445,1433,1521,3306,5432,6379,7001,8080,8089,9000,9200,11211,27017"
|
||||
flag.StringVar(&Info.Host,"h","","IP address of the host you want to scan,for example: 192.168.11.11 | 192.168.11.11-255 | 192.168.11.11,192.168.11.12")
|
||||
flag.StringVar(&Info.Ports,"p",Ports,"Select a port,for example: 22 | 1-65535 | 22,80,3306")
|
||||
flag.StringVar(&Info.Command,"c","","exec command (ssh)")
|
||||
flag.IntVar(&Info.Threads,"t",100,"Thread nums")
|
||||
flag.BoolVar(&Info.Isping,"np",false,"not to ping")
|
||||
flag.BoolVar(&Info.IsSave,"no",false,"not to save output log")
|
||||
flag.StringVar(&Info.Username,"user","","username")
|
||||
flag.StringVar(&Info.Userfile,"userf","","username file")
|
||||
flag.StringVar(&Info.Password,"pwd","","password")
|
||||
flag.StringVar(&Info.Passfile,"pwdf","","password file")
|
||||
flag.StringVar(&Info.Outputfile,"o","result.txt","Outputfile")
|
||||
flag.Int64Var(&Info.Timeout,"time",3,"Set timeout")
|
||||
flag.StringVar(&Info.Scantype,"m","all","Select scan type ,as: -m ssh")
|
||||
flag.StringVar(&Info.RedisFile,"rf","","redis file to write sshkey file (as: -rf id_rsa.pub) ")
|
||||
flag.StringVar(&Info.RedisFile,"rs","","redis shell to write cron file (as: -rs 127.0.0.1:4444) ")
|
||||
flag.Parse()
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
package common
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"sync"
|
||||
)
|
||||
|
||||
func LogSuccess(result string){
|
||||
mutex := &sync.Mutex{}
|
||||
mutex.Lock()
|
||||
fmt.Println(result)
|
||||
if IsSave {
|
||||
WriteFile(result,Outputfile)
|
||||
}
|
||||
mutex.Unlock()
|
||||
}
|
||||
func WriteFile(result string,filename string) {
|
||||
var text = []byte(result+"\n")
|
||||
fl, err := os.OpenFile(filename, os.O_APPEND|os.O_CREATE, 0777)
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
return
|
||||
}
|
||||
defer fl.Close()
|
||||
_, err = fl.Write(text)
|
||||
if err!= nil{
|
||||
fmt.Println(err)
|
||||
}
|
||||
}
|
||||
//err := ioutil.WriteFile(filename, text, 0666)
|
||||
//if err!= nil{
|
||||
// fmt.Println(err)
|
||||
//}
|
||||
//var f *os.File
|
||||
//var err error
|
||||
//if checkFileIsExist(filename) { //如果文件存在
|
||||
// f, err = os.OpenFile(filename, os.O_APPEND, 0666) //打开文件
|
||||
// fmt.Println("文件存在")
|
||||
//} else {
|
||||
// f, err = os.Create(filename) //创建文件
|
||||
// fmt.Println("文件不存在")
|
||||
//}
|
||||
//func checkFileIsExist(filename string) bool {
|
||||
// var exist = true
|
||||
// if _, err := os.Stat(filename); os.IsNotExist(err) {
|
||||
// exist = false
|
||||
// }
|
||||
// return exist
|
||||
//}
|
||||
Reference in New Issue
Block a user