mirror of
https://github.com/shadow1ng/fscan.git
synced 2026-09-24 20:21:52 +08:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c27eccbcc9 | ||
|
|
90b848a3dc | ||
|
|
767fff84ed | ||
|
|
b4fb1efb3a | ||
|
|
c4d1cd950a | ||
|
|
818102a814 | ||
|
|
b00a5d4403 | ||
|
|
f638d3a1e2 | ||
|
|
8ca4d2c89a | ||
|
|
13a3cacd93 | ||
|
|
3282f4abcb | ||
|
|
0cff8351ac | ||
|
|
cd29281e72 | ||
|
|
db028ba0cc |
+49
-67
@@ -2,7 +2,6 @@ package Plugins
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"encoding/binary"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"net"
|
"net"
|
||||||
"os"
|
"os"
|
||||||
@@ -14,17 +13,9 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
var icmp ICMP
|
|
||||||
|
|
||||||
var AliveHosts []string
|
var AliveHosts []string
|
||||||
|
|
||||||
type ICMP struct {
|
var SysInfo = GetSys()
|
||||||
Type uint8
|
|
||||||
Code uint8
|
|
||||||
Checksum uint16
|
|
||||||
Identifier uint16
|
|
||||||
SequenceNum uint16
|
|
||||||
}
|
|
||||||
|
|
||||||
type SystemInfo struct {
|
type SystemInfo struct {
|
||||||
OS string
|
OS string
|
||||||
@@ -56,38 +47,30 @@ func GetSys() SystemInfo {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func isping(ip string) bool {
|
func isping(ip string) bool {
|
||||||
icmp.Type = 8
|
IcmpByte := []byte{8, 0, 247, 255, 0, 0, 0, 0}
|
||||||
icmp.Code = 0
|
|
||||||
icmp.Checksum = 0
|
|
||||||
icmp.Identifier = 0
|
|
||||||
icmp.SequenceNum = 0
|
|
||||||
|
|
||||||
recvBuf := make([]byte, 32)
|
|
||||||
var buffer bytes.Buffer
|
|
||||||
|
|
||||||
binary.Write(&buffer, binary.BigEndian, icmp)
|
|
||||||
icmp.Checksum = CheckSum(buffer.Bytes())
|
|
||||||
|
|
||||||
buffer.Reset()
|
|
||||||
binary.Write(&buffer, binary.BigEndian, icmp)
|
|
||||||
|
|
||||||
Time, _ := time.ParseDuration("3s")
|
Time, _ := time.ParseDuration("3s")
|
||||||
conn, err := net.DialTimeout("ip4:icmp", ip, Time)
|
conn, err := net.DialTimeout("ip4:icmp", ip, Time)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
_, err = conn.Write(buffer.Bytes())
|
defer conn.Close()
|
||||||
if err != nil {
|
_, err = conn.Write(IcmpByte)
|
||||||
return false
|
|
||||||
}
|
|
||||||
conn.SetReadDeadline(time.Now().Add(time.Second * 3))
|
|
||||||
num, err := conn.Read(recvBuf)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
conn.SetReadDeadline(time.Time{})
|
if err := conn.SetReadDeadline(time.Now().Add(time.Second * 3)); err != nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
recvBuf := make([]byte, 40)
|
||||||
|
num, err := conn.Read(recvBuf[0:40])
|
||||||
|
if err != nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
if err := conn.SetReadDeadline(time.Time{}); err != nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
if string(recvBuf[0:num]) != "" {
|
if string(recvBuf[0:num]) != "" {
|
||||||
fmt.Printf("(ICMP) Target '%s' is alive\n", ip)
|
fmt.Printf("(ICMP) Target '%s' is alive\n", ip)
|
||||||
return true
|
return true
|
||||||
@@ -96,32 +79,13 @@ func isping(ip string) bool {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func CheckSum(data []byte) uint16 {
|
|
||||||
var (
|
|
||||||
sum uint32
|
|
||||||
length int = len(data)
|
|
||||||
index int
|
|
||||||
)
|
|
||||||
for length > 1 {
|
|
||||||
sum += uint32(data[index])<<8 + uint32(data[index+1])
|
|
||||||
index += 2
|
|
||||||
length -= 2
|
|
||||||
}
|
|
||||||
if length > 0 {
|
|
||||||
sum += uint32(data[index])
|
|
||||||
}
|
|
||||||
sum += (sum >> 16)
|
|
||||||
|
|
||||||
return uint16(^sum)
|
|
||||||
}
|
|
||||||
|
|
||||||
func IcmpCheck(hostslist []string, IcmpThreads int) {
|
func IcmpCheck(hostslist []string, IcmpThreads int) {
|
||||||
var wg sync.WaitGroup
|
var wg sync.WaitGroup
|
||||||
mutex := &sync.Mutex{}
|
mutex := &sync.Mutex{}
|
||||||
limiter := make(chan int, IcmpThreads)
|
limiter := make(chan struct{}, IcmpThreads)
|
||||||
for _, host := range hostslist {
|
for _, host := range hostslist {
|
||||||
wg.Add(1)
|
wg.Add(1)
|
||||||
limiter <- 1
|
limiter <- struct{}{}
|
||||||
go func(host string) {
|
go func(host string) {
|
||||||
defer wg.Done()
|
defer wg.Done()
|
||||||
if isping(host) {
|
if isping(host) {
|
||||||
@@ -136,20 +100,25 @@ func IcmpCheck(hostslist []string,IcmpThreads int) {
|
|||||||
wg.Wait()
|
wg.Wait()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
func ExecCommandPing(ip string, bsenv string) bool {
|
func ExecCommandPing(ip string, bsenv string) bool {
|
||||||
command := exec.Command(bsenv, "-c", "ping -c 1 -w 1 "+ip+" >/dev/null && echo true || echo false") //ping -c 1 -i 0.5 -t 4 -W 2 -w 5 "+ip+" >/dev/null && echo true || echo false"
|
var command *exec.Cmd
|
||||||
|
if SysInfo.OS == "windows" {
|
||||||
|
command = exec.Command("cmd", "/c", "ping -n 1 -w 1 "+ip+" && echo true || echo false") //ping -c 1 -i 0.5 -t 4 -W 2 -w 5 "+ip+" >/dev/null && echo true || echo false"
|
||||||
|
} else if SysInfo.OS == "linux" {
|
||||||
|
command = exec.Command(bsenv, "-c", "ping -c 1 -w 1 "+ip+" >/dev/null && echo true || echo false") //ping -c 1 -i 0.5 -t 4 -W 2 -w 5 "+ip+" >/dev/null && echo true || echo false"
|
||||||
|
} else if SysInfo.OS == "darwin" {
|
||||||
|
command = exec.Command(bsenv, "-c", "ping -c 1 -W 1 "+ip+" >/dev/null && echo true || echo false") //ping -c 1 -i 0.5 -t 4 -W 2 -w 5 "+ip+" >/dev/null && echo true || echo false"
|
||||||
|
}
|
||||||
outinfo := bytes.Buffer{}
|
outinfo := bytes.Buffer{}
|
||||||
command.Stdout = &outinfo
|
command.Stdout = &outinfo
|
||||||
err := command.Start()
|
err := command.Start()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
if err = command.Wait(); err != nil {
|
if err = command.Wait(); err != nil {
|
||||||
return false
|
return false
|
||||||
} else {
|
} else {
|
||||||
if(strings.Contains(outinfo.String(), "true")) {
|
if strings.Contains(outinfo.String(), "true") {
|
||||||
return true
|
return true
|
||||||
} else {
|
} else {
|
||||||
return false
|
return false
|
||||||
@@ -177,24 +146,37 @@ func PingCMDcheck(hostslist []string,bsenv string) {
|
|||||||
}
|
}
|
||||||
wg.Wait()
|
wg.Wait()
|
||||||
}
|
}
|
||||||
|
func ICMPRun(hostslist []string, IcmpThreads int, Ping bool) []string {
|
||||||
|
|
||||||
func ICMPRun(hostslist []string,IcmpThreads int) []string{
|
if SysInfo.OS == "windows" {
|
||||||
var sysinfo SystemInfo
|
if Ping == false {
|
||||||
sysinfo = GetSys()
|
|
||||||
|
|
||||||
if sysinfo.OS == "windows" {
|
|
||||||
IcmpCheck(hostslist, IcmpThreads)
|
IcmpCheck(hostslist, IcmpThreads)
|
||||||
}else if sysinfo.OS == "linux" {
|
} else {
|
||||||
if (sysinfo.Groupid == "0" || sysinfo.Userid == "0" || sysinfo.Username == "root") {
|
PingCMDcheck(hostslist, "")
|
||||||
|
}
|
||||||
|
} else if SysInfo.OS == "linux" {
|
||||||
|
if SysInfo.Groupid == "0" || SysInfo.Userid == "0" || SysInfo.Username == "root" {
|
||||||
|
if Ping == false {
|
||||||
IcmpCheck(hostslist, IcmpThreads)
|
IcmpCheck(hostslist, IcmpThreads)
|
||||||
} else {
|
} else {
|
||||||
PingCMDcheck(hostslist, "/bin/bash")
|
PingCMDcheck(hostslist, "/bin/bash")
|
||||||
}
|
}
|
||||||
}else if sysinfo.OS == "darwin" {
|
} else {
|
||||||
if (sysinfo.Groupid == "0" || sysinfo.Userid == "0" || sysinfo.Username == "root") {
|
fmt.Println("The current user permissions unable to send icmp packets")
|
||||||
|
fmt.Println("start ping")
|
||||||
|
PingCMDcheck(hostslist, "/bin/bash")
|
||||||
|
}
|
||||||
|
} else if SysInfo.OS == "darwin" {
|
||||||
|
if SysInfo.Groupid == "0" || SysInfo.Userid == "0" || SysInfo.Username == "root" {
|
||||||
|
if Ping == false {
|
||||||
IcmpCheck(hostslist, IcmpThreads)
|
IcmpCheck(hostslist, IcmpThreads)
|
||||||
} else {
|
} else {
|
||||||
PingCMDcheck(hostslist,"/usr/local/bin/bash")
|
PingCMDcheck(hostslist, "/bin/bash")
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
fmt.Println("The current user permissions unable to send icmp packets")
|
||||||
|
fmt.Println("start ping")
|
||||||
|
PingCMDcheck(hostslist, "/bin/bash")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return AliveHosts
|
return AliveHosts
|
||||||
|
|||||||
+5
-21
@@ -35,12 +35,9 @@ func ParsePort(ports string) []int {
|
|||||||
return scanPorts
|
return scanPorts
|
||||||
}
|
}
|
||||||
|
|
||||||
func ProbeHosts(host string, ports <-chan int, respondingHosts chan<- string, done chan<- bool, model string, adjustedTimeout int) {
|
func ProbeHosts(host string, ports <-chan int, respondingHosts chan<- string, done chan<- bool, adjustedTimeout int) {
|
||||||
Timeout := time.Duration(adjustedTimeout) * time.Second
|
|
||||||
for port := range ports {
|
for port := range ports {
|
||||||
start := time.Now()
|
|
||||||
con, err := net.DialTimeout("tcp4", fmt.Sprintf("%s:%d", host, port), time.Duration(adjustedTimeout)*time.Second)
|
con, err := net.DialTimeout("tcp4", fmt.Sprintf("%s:%d", host, port), time.Duration(adjustedTimeout)*time.Second)
|
||||||
duration := time.Now().Sub(start)
|
|
||||||
if err == nil {
|
if err == nil {
|
||||||
defer con.Close()
|
defer con.Close()
|
||||||
address := host + ":" + strconv.Itoa(port)
|
address := host + ":" + strconv.Itoa(port)
|
||||||
@@ -48,21 +45,17 @@ func ProbeHosts(host string, ports <-chan int, respondingHosts chan<- string, do
|
|||||||
common.LogSuccess(result)
|
common.LogSuccess(result)
|
||||||
respondingHosts <- address
|
respondingHosts <- address
|
||||||
}
|
}
|
||||||
if duration < Timeout {
|
|
||||||
difference := Timeout - duration
|
|
||||||
Timeout = Timeout - (difference / 2)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
done <- true
|
done <- true
|
||||||
}
|
}
|
||||||
|
|
||||||
func ScanAllports(address string, probePorts []int, threads int, timeout time.Duration, model string, adjustedTimeout int) ([]string, error) {
|
func ScanAllports(address string, probePorts []int, threads int, adjustedTimeout int) ([]string, error) {
|
||||||
ports := make(chan int, 20)
|
ports := make(chan int, 20)
|
||||||
results := make(chan string, 10)
|
results := make(chan string, 10)
|
||||||
done := make(chan bool, threads)
|
done := make(chan bool, threads)
|
||||||
|
|
||||||
for worker := 0; worker < threads; worker++ {
|
for worker := 0; worker < threads; worker++ {
|
||||||
go ProbeHosts(address, ports, results, done, model, adjustedTimeout)
|
go ProbeHosts(address, ports, results, done, adjustedTimeout)
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, port := range probePorts {
|
for _, port := range probePorts {
|
||||||
@@ -80,13 +73,11 @@ func ScanAllports(address string, probePorts []int, threads int, timeout time.Du
|
|||||||
if threads == 0 {
|
if threads == 0 {
|
||||||
return responses, nil
|
return responses, nil
|
||||||
}
|
}
|
||||||
case <-time.After(timeout):
|
|
||||||
return responses, nil
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TCPportScan(hostslist []string, ports string, model string, timeout int) ([]string, []string) {
|
func TCPportScan(hostslist []string, ports string, timeout int) ([]string, []string) {
|
||||||
var AliveAddress []string
|
var AliveAddress []string
|
||||||
var aliveHosts []string
|
var aliveHosts []string
|
||||||
probePorts := ParsePort(ports)
|
probePorts := ParsePort(ports)
|
||||||
@@ -119,18 +110,12 @@ func TCPportScan(hostslist []string, ports string, model string, timeout int) ([
|
|||||||
var wg sync.WaitGroup
|
var wg sync.WaitGroup
|
||||||
mutex := &sync.Mutex{}
|
mutex := &sync.Mutex{}
|
||||||
limiter := make(chan struct{}, lm)
|
limiter := make(chan struct{}, lm)
|
||||||
aliveHost := make(chan string, lm/2)
|
|
||||||
go func() {
|
|
||||||
for s := range aliveHost {
|
|
||||||
fmt.Println(s)
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
for _, host := range hostslist {
|
for _, host := range hostslist {
|
||||||
wg.Add(1)
|
wg.Add(1)
|
||||||
limiter <- struct{}{}
|
limiter <- struct{}{}
|
||||||
go func(host string) {
|
go func(host string) {
|
||||||
defer wg.Done()
|
defer wg.Done()
|
||||||
if aliveAdd, err := ScanAllports(host, probePorts, thread, 5*time.Second, model, timeout); err == nil && len(aliveAdd) > 0 {
|
if aliveAdd, err := ScanAllports(host, probePorts, thread, timeout); err == nil && len(aliveAdd) > 0 {
|
||||||
mutex.Lock()
|
mutex.Lock()
|
||||||
aliveHosts = append(aliveHosts, host)
|
aliveHosts = append(aliveHosts, host)
|
||||||
for _, addr := range aliveAdd {
|
for _, addr := range aliveAdd {
|
||||||
@@ -142,6 +127,5 @@ func TCPportScan(hostslist []string, ports string, model string, timeout int) ([
|
|||||||
}(host)
|
}(host)
|
||||||
}
|
}
|
||||||
wg.Wait()
|
wg.Wait()
|
||||||
close(aliveHost)
|
|
||||||
return aliveHosts, AliveAddress
|
return aliveHosts, AliveAddress
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-8
@@ -15,10 +15,8 @@ func scan_func(m map[string]interface{}, name string, infos ...interface{}) (res
|
|||||||
f := reflect.ValueOf(m[name])
|
f := reflect.ValueOf(m[name])
|
||||||
if len(infos) != f.Type().NumIn() {
|
if len(infos) != f.Type().NumIn() {
|
||||||
err = errors.New("The number of infos is not adapted.")
|
err = errors.New("The number of infos is not adapted.")
|
||||||
if err != nil {
|
|
||||||
fmt.Println(err.Error())
|
fmt.Println(err.Error())
|
||||||
}
|
}
|
||||||
}
|
|
||||||
in := make([]reflect.Value, len(infos))
|
in := make([]reflect.Value, len(infos))
|
||||||
for k, info := range infos {
|
for k, info := range infos {
|
||||||
in[k] = reflect.ValueOf(info)
|
in[k] = reflect.ValueOf(info)
|
||||||
@@ -39,10 +37,10 @@ func Scan(info common.HostInfo) {
|
|||||||
fmt.Println("scan start")
|
fmt.Println("scan start")
|
||||||
Hosts, _ := common.ParseIP(info.Host, info.HostFile)
|
Hosts, _ := common.ParseIP(info.Host, info.HostFile)
|
||||||
if info.Isping == false {
|
if info.Isping == false {
|
||||||
Hosts = ICMPRun(Hosts, info.IcmpThreads)
|
Hosts = ICMPRun(Hosts, info.IcmpThreads, info.Ping)
|
||||||
fmt.Println("icmp alive hosts len is:", len(Hosts))
|
fmt.Println("icmp alive hosts len is:", len(Hosts))
|
||||||
}
|
}
|
||||||
_, AlivePorts := TCPportScan(Hosts, info.Ports, "icmp", 3) //return AliveHosts,AlivePorts
|
_, AlivePorts := TCPportScan(Hosts, info.Ports, 3) //return AliveHosts,AlivePorts
|
||||||
var severports []string //severports := []string{"21","22","135"."445","1433","3306","5432","6379","9200","11211","27017"...}
|
var severports []string //severports := []string{"21","22","135"."445","1433","3306","5432","6379","9200","11211","27017"...}
|
||||||
for _, port := range common.PORTList {
|
for _, port := range common.PORTList {
|
||||||
severports = append(severports, strconv.Itoa(port))
|
severports = append(severports, strconv.Itoa(port))
|
||||||
@@ -54,12 +52,12 @@ func Scan(info common.HostInfo) {
|
|||||||
for _, targetIP := range AlivePorts {
|
for _, targetIP := range AlivePorts {
|
||||||
scan_ip, scan_port := strings.Split(targetIP, ":")[0], strings.Split(targetIP, ":")[1]
|
scan_ip, scan_port := strings.Split(targetIP, ":")[0], strings.Split(targetIP, ":")[1]
|
||||||
info.Host = scan_ip
|
info.Host = scan_ip
|
||||||
|
info.Ports = scan_port
|
||||||
if info.Scantype == "all" {
|
if info.Scantype == "all" {
|
||||||
if IsContain(severports, scan_port) {
|
if IsContain(severports, scan_port) {
|
||||||
AddScan(scan_port, info, ch, &wg)
|
AddScan(scan_port, info, ch, &wg)
|
||||||
} else {
|
} else {
|
||||||
if !IsContain(severports1, scan_port) {
|
if !IsContain(severports1, scan_port) {
|
||||||
info.Ports = scan_port
|
|
||||||
AddScan("1000003", info, ch, &wg) //webtitle
|
AddScan("1000003", info, ch, &wg) //webtitle
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -78,9 +76,6 @@ func Scan(info common.HostInfo) {
|
|||||||
|
|
||||||
func AddScan(scantype string, info common.HostInfo, ch chan int, wg *sync.WaitGroup) {
|
func AddScan(scantype string, info common.HostInfo, ch chan int, wg *sync.WaitGroup) {
|
||||||
wg.Add(1)
|
wg.Add(1)
|
||||||
if info.Scantype == "webtitle" {
|
|
||||||
scantype = "1000003"
|
|
||||||
}
|
|
||||||
go scan_func(PluginList, scantype, &info, ch, wg)
|
go scan_func(PluginList, scantype, &info, ch, wg)
|
||||||
ch <- 1
|
ch <- 1
|
||||||
}
|
}
|
||||||
|
|||||||
+10
-4
@@ -27,7 +27,7 @@ Loop:
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func SmblConn(info *common.HostInfo, user string, pass string) (flag bool, err error) {
|
func SmblConn(info *common.HostInfo, user string, pass string, Domain string) (flag bool, err error) {
|
||||||
flag = false
|
flag = false
|
||||||
Host, Port, Username, Password := info.Host, common.PORTList["smb"], user, pass
|
Host, Port, Username, Password := info.Host, common.PORTList["smb"], user, pass
|
||||||
options := smb.Options{
|
options := smb.Options{
|
||||||
@@ -35,7 +35,7 @@ func SmblConn(info *common.HostInfo, user string, pass string) (flag bool, err e
|
|||||||
Port: 445,
|
Port: 445,
|
||||||
User: Username,
|
User: Username,
|
||||||
Password: Password,
|
Password: Password,
|
||||||
Domain: "",
|
Domain: Domain,
|
||||||
Workstation: "",
|
Workstation: "",
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -43,7 +43,13 @@ func SmblConn(info *common.HostInfo, user string, pass string) (flag bool, err e
|
|||||||
if err == nil {
|
if err == nil {
|
||||||
defer session.Close()
|
defer session.Close()
|
||||||
if session.IsAuthenticated {
|
if session.IsAuthenticated {
|
||||||
result := fmt.Sprintf("SMB:%v:%v:%v %v", Host, Port, Username, Password)
|
var result string
|
||||||
|
if Domain != "" {
|
||||||
|
result = fmt.Sprintf("SMB:%v:%v:%v\\%v %v", Host, Port, Domain, Username, Password)
|
||||||
|
} else {
|
||||||
|
result = fmt.Sprintf("SMB:%v:%v:%v %v", Host, Port, Username, Password)
|
||||||
|
}
|
||||||
|
|
||||||
common.LogSuccess(result)
|
common.LogSuccess(result)
|
||||||
flag = true
|
flag = true
|
||||||
}
|
}
|
||||||
@@ -56,7 +62,7 @@ func doWithTimeOut(info *common.HostInfo, user string, pass string) (flag bool,
|
|||||||
defer cancel()
|
defer cancel()
|
||||||
signal := make(chan int, 1)
|
signal := make(chan int, 1)
|
||||||
go func() {
|
go func() {
|
||||||
flag, err = SmblConn(info, user, pass)
|
flag, err = SmblConn(info, user, pass, info.Domain)
|
||||||
signal <- 1
|
signal <- 1
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
|||||||
+1
-3
@@ -4,13 +4,12 @@ import (
|
|||||||
"crypto/tls"
|
"crypto/tls"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/shadow1ng/fscan/WebScan"
|
"github.com/shadow1ng/fscan/WebScan"
|
||||||
|
"github.com/shadow1ng/fscan/common"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"net/http"
|
"net/http"
|
||||||
"regexp"
|
"regexp"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/shadow1ng/fscan/common"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func WebTitle(info *common.HostInfo, ch chan int, wg *sync.WaitGroup) (err error, result string) {
|
func WebTitle(info *common.HostInfo, ch chan int, wg *sync.WaitGroup) (err error, result string) {
|
||||||
@@ -33,7 +32,6 @@ func WebTitle(info *common.HostInfo, ch chan int, wg *sync.WaitGroup) (err error
|
|||||||
|
|
||||||
func geturl(info *common.HostInfo) (err error, result string) {
|
func geturl(info *common.HostInfo) (err error, result string) {
|
||||||
url := info.Url
|
url := info.Url
|
||||||
info.Timeout = 20
|
|
||||||
tr := &http.Transport{
|
tr := &http.Transport{
|
||||||
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
|
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,6 +14,9 @@
|
|||||||
因为用习惯了f-scrack,习惯一条命令跑完所有模块,省去一个个模块单独调用的时间,当然我附加了-m 指定模块的功能。
|
因为用习惯了f-scrack,习惯一条命令跑完所有模块,省去一个个模块单独调用的时间,当然我附加了-m 指定模块的功能。
|
||||||
|
|
||||||
## 最近更新
|
## 最近更新
|
||||||
|
[+] 2020/12/6 优化icmp模块,新增-domain 参数(用于smb爆破模块,适用于域用户)
|
||||||
|
[+] 2020/12/03 优化ip段处理模块、icmp、端口扫描模块。新增支持192.168.1.1-192.168.255.255。
|
||||||
|
[+] 2020/11/17 增加-ping 参数,作用是存活探测模块用ping代替icmp发包。
|
||||||
[+] 2020/11/17 增加WebScan模块,新增shiro简单识别。https访问时,跳过证书认证。将服务模块和web模块的超时分开,增加-wt 参数(WebTimeout)。
|
[+] 2020/11/17 增加WebScan模块,新增shiro简单识别。https访问时,跳过证书认证。将服务模块和web模块的超时分开,增加-wt 参数(WebTimeout)。
|
||||||
[+] 2020/11/16 对icmp模块进行优化,增加-it 参数(IcmpThreads),默认11000,适合扫B段
|
[+] 2020/11/16 对icmp模块进行优化,增加-it 参数(IcmpThreads),默认11000,适合扫B段
|
||||||
[+] 2020/11/15 支持ip以文件导入,-hs ip.txt,并对去重做了处理
|
[+] 2020/11/15 支持ip以文件导入,-hs ip.txt,并对去重做了处理
|
||||||
@@ -46,7 +49,7 @@ fscan.exe -h 192.168.1.1/24 -m ms17010 (指定模块)
|
|||||||
-hf string
|
-hf string
|
||||||
host file, -hs ip.txt
|
host file, -hs ip.txt
|
||||||
-it int
|
-it int
|
||||||
Icmp Threads nums (default 3000)
|
Icmp Threads nums (default 11000)
|
||||||
-m string
|
-m string
|
||||||
Select scan type ,as: -m ssh (default "all")
|
Select scan type ,as: -m ssh (default "all")
|
||||||
-no
|
-no
|
||||||
@@ -57,6 +60,8 @@ fscan.exe -h 192.168.1.1/24 -m ms17010 (指定模块)
|
|||||||
Outputfile (default "result.txt")
|
Outputfile (default "result.txt")
|
||||||
-p string
|
-p string
|
||||||
Select a port,for example: 22 | 1-65535 | 22,80,3306 (default "21,22,23,80,135,443,445,1433,1521,3306,5432,6379,7001,8080,8089,9000,9200,11211,27017")
|
Select a port,for example: 22 | 1-65535 | 22,80,3306 (default "21,22,23,80,135,443,445,1433,1521,3306,5432,6379,7001,8080,8089,9000,9200,11211,27017")
|
||||||
|
-ping
|
||||||
|
using ping replace icmp
|
||||||
-pwd string
|
-pwd string
|
||||||
password
|
password
|
||||||
-pwdf string
|
-pwdf string
|
||||||
@@ -73,6 +78,8 @@ fscan.exe -h 192.168.1.1/24 -m ms17010 (指定模块)
|
|||||||
username
|
username
|
||||||
-userf string
|
-userf string
|
||||||
username file
|
username file
|
||||||
|
-wt int
|
||||||
|
Set web timeout (default 3)
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
+31
-5
@@ -18,6 +18,7 @@ var ParseIPErr =errors.New("host parsing error\n" +
|
|||||||
"192.168.1.1/16\n" +
|
"192.168.1.1/16\n" +
|
||||||
"192.168.1.1/24\n" +
|
"192.168.1.1/24\n" +
|
||||||
"192.168.1.1,192.168.1.2\n" +
|
"192.168.1.1,192.168.1.2\n" +
|
||||||
|
"192.168.1.1-192.168.255.255\n" +
|
||||||
"192.168.1.1-255")
|
"192.168.1.1-255")
|
||||||
|
|
||||||
func ParseIP(ip string, filename string) (hosts []string, err error) {
|
func ParseIP(ip string, filename string) (hosts []string, err error) {
|
||||||
@@ -76,6 +77,7 @@ func ParseIPone(ip string)([]string,error){
|
|||||||
return []string{ip}, nil
|
return []string{ip}, nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//Parsing CIDR IP
|
//Parsing CIDR IP
|
||||||
func ParseIPA(ip string) ([]string, error) {
|
func ParseIPA(ip string) ([]string, error) {
|
||||||
realIP := ip[:len(ip)-3]
|
realIP := ip[:len(ip)-3]
|
||||||
@@ -105,10 +107,12 @@ func ParseIPB(ip string)([]string,error){
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//Resolving a range of IP,for example: 192.168.111.1-255
|
//Resolving a range of IP,for example: 192.168.111.1-255,192.168.111.1-192.168.112.255
|
||||||
func ParseIPC(ip string) ([]string, error) {
|
func ParseIPC(ip string) ([]string, error) {
|
||||||
IPRange := strings.Split(ip, "-")
|
IPRange := strings.Split(ip, "-")
|
||||||
testIP := net.ParseIP(IPRange[0])
|
testIP := net.ParseIP(IPRange[0])
|
||||||
|
var AllIP []string
|
||||||
|
if len(IPRange[1]) < 4 {
|
||||||
Range, err := strconv.Atoi(IPRange[1])
|
Range, err := strconv.Atoi(IPRange[1])
|
||||||
if testIP == nil || Range > 255 || err != nil {
|
if testIP == nil || Range > 255 || err != nil {
|
||||||
return nil, ParseIPErr
|
return nil, ParseIPErr
|
||||||
@@ -117,13 +121,37 @@ func ParseIPC(ip string)([]string,error){
|
|||||||
ip1, err1 := strconv.Atoi(SplitIP[3])
|
ip1, err1 := strconv.Atoi(SplitIP[3])
|
||||||
ip2, err2 := strconv.Atoi(IPRange[1])
|
ip2, err2 := strconv.Atoi(IPRange[1])
|
||||||
PrefixIP := strings.Join(SplitIP[0:3], ".")
|
PrefixIP := strings.Join(SplitIP[0:3], ".")
|
||||||
var AllIP []string
|
|
||||||
if ip1 > ip2 || err1 != nil || err2 != nil {
|
if ip1 > ip2 || err1 != nil || err2 != nil {
|
||||||
return nil, ParseIPErr
|
return nil, ParseIPErr
|
||||||
}
|
}
|
||||||
for i := ip1; i <= ip2; i++ {
|
for i := ip1; i <= ip2; i++ {
|
||||||
AllIP = append(AllIP, PrefixIP+"."+strconv.Itoa(i))
|
AllIP = append(AllIP, PrefixIP+"."+strconv.Itoa(i))
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
SplitIP1 := strings.Split(IPRange[0], ".")
|
||||||
|
SplitIP2 := strings.Split(IPRange[1], ".")
|
||||||
|
fmt.Println(SplitIP1, SplitIP2, len(SplitIP1), len(SplitIP2))
|
||||||
|
if len(SplitIP1) != 4 || len(SplitIP2) != 4 {
|
||||||
|
return nil, ParseIPErr
|
||||||
|
}
|
||||||
|
start, end := [4]int{}, [4]int{}
|
||||||
|
for i := 0; i < 4; i++ {
|
||||||
|
ip1, err1 := strconv.Atoi(SplitIP1[i])
|
||||||
|
ip2, err2 := strconv.Atoi(SplitIP2[i])
|
||||||
|
if ip1 > ip2 || err1 != nil || err2 != nil {
|
||||||
|
return nil, ParseIPErr
|
||||||
|
}
|
||||||
|
start[i], end[i] = ip1, ip2
|
||||||
|
}
|
||||||
|
startNum := (start[0]<<24 | start[1]<<16 | start[2]<<8 | start[3])
|
||||||
|
endNum := (end[0]<<24 | end[1]<<16 | end[2]<<8 | end[3])
|
||||||
|
fmt.Println(startNum, endNum)
|
||||||
|
for num := startNum; num < endNum; num++ {
|
||||||
|
ip := (strconv.Itoa((num>>24)&0xff) + "." + strconv.Itoa((num>>16)&0xff) + "." + strconv.Itoa((num>>8)&0xff) + "." + strconv.Itoa((num)&0xff))
|
||||||
|
AllIP = append(AllIP, ip)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return AllIP, nil
|
return AllIP, nil
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -184,8 +212,7 @@ func Readipfile(filename string)([]string,error){
|
|||||||
return content, nil
|
return content, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func RemoveDuplicate(old []string) []string {
|
||||||
func RemoveDuplicate(old []string) ([]string) {
|
|
||||||
result := make([]string, 0, len(old))
|
result := make([]string, 0, len(old))
|
||||||
temp := map[string]struct{}{}
|
temp := map[string]struct{}{}
|
||||||
for _, item := range old {
|
for _, item := range old {
|
||||||
@@ -196,4 +223,3 @@ func RemoveDuplicate(old []string) ([]string) {
|
|||||||
}
|
}
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+4
-4
@@ -1,4 +1,5 @@
|
|||||||
package common
|
package common
|
||||||
|
|
||||||
//fscan version 1.3
|
//fscan version 1.3
|
||||||
var Userdict = map[string][]string{
|
var Userdict = map[string][]string{
|
||||||
"ftp": {"www", "admin", "root", "db", "wwwroot", "data", "web", "ftp"},
|
"ftp": {"www", "admin", "root", "db", "wwwroot", "data", "web", "ftp"},
|
||||||
@@ -52,17 +53,18 @@ var PORTList_bak = map[string]int{
|
|||||||
var Outputfile = "result.txt"
|
var Outputfile = "result.txt"
|
||||||
var IsSave = true
|
var IsSave = true
|
||||||
|
|
||||||
var DefaultPorts = "21,22,23,80,135,443,445,1433,1521,3306,5432,6379,7001,8080,8089,9000,9200,11211,27017"
|
var DefaultPorts = "21,22,80,81,135,443,445,1433,1521,3306,5432,6379,7001,8000,8080,8089,11211,27017"
|
||||||
|
|
||||||
|
|
||||||
type HostInfo struct {
|
type HostInfo struct {
|
||||||
Host string
|
Host string
|
||||||
HostFile string
|
HostFile string
|
||||||
Ports string
|
Ports string
|
||||||
|
Domain string
|
||||||
Url string
|
Url string
|
||||||
Timeout int64
|
Timeout int64
|
||||||
WebTimeout int64
|
WebTimeout int64
|
||||||
Scantype string
|
Scantype string
|
||||||
|
Ping bool
|
||||||
Isping bool
|
Isping bool
|
||||||
Threads int
|
Threads int
|
||||||
IcmpThreads int
|
IcmpThreads int
|
||||||
@@ -78,5 +80,3 @@ type HostInfo struct {
|
|||||||
RedisFile string
|
RedisFile string
|
||||||
RedisShell string
|
RedisShell string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+2
-3
@@ -16,9 +16,6 @@ func Banner(){
|
|||||||
print(banner)
|
print(banner)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
func Flag(Info *HostInfo) {
|
func Flag(Info *HostInfo) {
|
||||||
Banner()
|
Banner()
|
||||||
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.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")
|
||||||
@@ -28,7 +25,9 @@ func Flag(Info *HostInfo) {
|
|||||||
flag.IntVar(&Info.Threads, "t", 200, "Thread nums")
|
flag.IntVar(&Info.Threads, "t", 200, "Thread nums")
|
||||||
flag.IntVar(&Info.IcmpThreads, "it", 11000, "Icmp Threads nums")
|
flag.IntVar(&Info.IcmpThreads, "it", 11000, "Icmp Threads nums")
|
||||||
flag.BoolVar(&Info.Isping, "np", false, "not to ping")
|
flag.BoolVar(&Info.Isping, "np", false, "not to ping")
|
||||||
|
flag.BoolVar(&Info.Ping, "ping", false, "using ping replace icmp")
|
||||||
flag.BoolVar(&Info.IsSave, "no", false, "not to save output log")
|
flag.BoolVar(&Info.IsSave, "no", false, "not to save output log")
|
||||||
|
flag.StringVar(&Info.Domain, "domain", "", "smb domain")
|
||||||
flag.StringVar(&Info.Username, "user", "", "username")
|
flag.StringVar(&Info.Username, "user", "", "username")
|
||||||
flag.StringVar(&Info.Userfile, "userf", "", "username file")
|
flag.StringVar(&Info.Userfile, "userf", "", "username file")
|
||||||
flag.StringVar(&Info.Password, "pwd", "", "password")
|
flag.StringVar(&Info.Password, "pwd", "", "password")
|
||||||
|
|||||||
Reference in New Issue
Block a user