fscan/Plugins/portscan.go

124 lines
2.6 KiB
Go
Raw Normal View History

2020-12-29 17:17:10 +08:00
package Plugins
import (
"fmt"
"sort"
2020-12-29 17:17:10 +08:00
"strconv"
"sync"
"time"
2023-06-05 19:02:55 +03:00
"github.com/shadow1ng/fscan/common"
2020-12-29 17:17:10 +08:00
)
2021-03-08 10:00:56 +08:00
type Addr struct {
ip string
port int
2020-12-29 17:17:10 +08:00
}
2023-06-09 08:13:56 -04:00
func PortScan(hostslist []string, ports string, flags common.Flags) []string {
2021-03-08 10:00:56 +08:00
var AliveAddress []string
probePorts := common.ParsePort(ports)
2023-06-09 08:13:56 -04:00
noPorts := common.ParsePort(flags.NoPorts)
2021-05-06 11:37:29 +08:00
if len(noPorts) > 0 {
temp := map[int]struct{}{}
2021-05-06 11:37:29 +08:00
for _, port := range probePorts {
temp[port] = struct{}{}
2021-05-06 11:37:29 +08:00
}
for _, port := range noPorts {
delete(temp, port)
}
var newDatas []int
2023-06-05 19:02:55 +03:00
for port := range temp {
newDatas = append(newDatas, port)
}
probePorts = newDatas
sort.Ints(probePorts)
2021-05-06 11:37:29 +08:00
}
2023-06-09 08:13:56 -04:00
workers := flags.Threads
2021-05-29 15:55:05 +08:00
Addrs := make(chan Addr, len(hostslist)*len(probePorts))
results := make(chan string, len(hostslist)*len(probePorts))
2021-03-08 10:00:56 +08:00
var wg sync.WaitGroup
2020-12-29 17:17:10 +08:00
2023-06-05 19:02:55 +03:00
// receive result
2021-03-08 10:00:56 +08:00
go func() {
for found := range results {
AliveAddress = append(AliveAddress, found)
2021-04-22 12:06:03 +08:00
wg.Done()
2020-12-29 17:17:10 +08:00
}
2021-03-08 10:00:56 +08:00
}()
2020-12-29 17:17:10 +08:00
2023-06-05 19:02:55 +03:00
// multithreaded scan
2021-03-08 10:00:56 +08:00
for i := 0; i < workers; i++ {
go func() {
for addr := range Addrs {
2023-06-09 08:13:56 -04:00
PortConnect(addr, common.Socks5{Address: flags.Socks5Proxy}, results, flags.Timeout, &wg)
2021-03-08 10:00:56 +08:00
wg.Done()
}
}()
2020-12-29 17:17:10 +08:00
}
2023-06-05 19:02:55 +03:00
// add scan target
2021-03-08 10:16:21 +08:00
for _, port := range probePorts {
for _, host := range hostslist {
2021-03-08 10:00:56 +08:00
wg.Add(1)
2021-04-22 12:06:03 +08:00
Addrs <- Addr{host, port}
2021-03-08 10:00:56 +08:00
}
2020-12-29 17:17:10 +08:00
}
2023-06-05 19:02:55 +03:00
2020-12-29 17:17:10 +08:00
wg.Wait()
2023-06-05 19:02:55 +03:00
2021-03-08 10:00:56 +08:00
close(Addrs)
close(results)
2023-06-05 19:02:55 +03:00
2020-12-29 17:17:10 +08:00
return AliveAddress
}
2021-03-08 10:00:56 +08:00
2023-06-09 08:13:56 -04:00
func PortConnect(addr Addr, socks5Proxy common.Socks5, respondingHosts chan<- string, adjustedTimeout int64, wg *sync.WaitGroup) {
2021-03-08 10:00:56 +08:00
host, port := addr.ip, addr.port
2023-06-09 08:13:56 -04:00
conn, err := common.WrapperTcpWithTimeout("tcp4", fmt.Sprintf("%s:%v", host, port), socks5Proxy, time.Duration(adjustedTimeout)*time.Second)
2021-09-10 20:32:51 +08:00
defer func() {
2021-09-13 17:19:36 +08:00
if conn != nil {
2021-09-10 20:32:51 +08:00
conn.Close()
}
}()
2021-03-08 10:00:56 +08:00
if err == nil {
address := host + ":" + strconv.Itoa(port)
result := fmt.Sprintf("%s open", address)
common.LogSuccess(result)
2021-04-22 12:06:03 +08:00
wg.Add(1)
2021-09-10 20:32:51 +08:00
respondingHosts <- address
2021-03-08 10:00:56 +08:00
}
}
2023-06-09 08:13:56 -04:00
func NoPortScan(hostslist []string, ports string, flags common.Flags) (AliveAddress []string) {
probePorts := common.ParsePort(ports)
2023-06-09 08:13:56 -04:00
noPorts := common.ParsePort(flags.NoPorts)
if len(noPorts) > 0 {
temp := map[int]struct{}{}
for _, port := range probePorts {
temp[port] = struct{}{}
}
for _, port := range noPorts {
delete(temp, port)
}
var newDatas []int
2023-06-05 19:02:55 +03:00
for port := range temp {
newDatas = append(newDatas, port)
}
probePorts = newDatas
sort.Ints(probePorts)
}
2023-06-05 19:02:55 +03:00
for _, port := range probePorts {
for _, host := range hostslist {
address := host + ":" + strconv.Itoa(port)
AliveAddress = append(AliveAddress, address)
}
}
return
}