Skip to content

Commit

Permalink
[*]优化目录结构
Browse files Browse the repository at this point in the history
  • Loading branch information
lcvvvv committed Mar 23, 2022
1 parent e40ee1f commit 2c0e476
Show file tree
Hide file tree
Showing 5 changed files with 204 additions and 127 deletions.
164 changes: 45 additions & 119 deletions core/fofa/fofa.go
Original file line number Diff line number Diff line change
@@ -1,96 +1,72 @@
package fofa

import (
"encoding/json"
"fmt"
"io/ioutil"
"kscan/app"
"kscan/core/slog"
"kscan/lib/color"
"kscan/lib/fofa"
"kscan/lib/misc"
"net/http"
"reflect"
"strconv"
"strings"
)

type Fofa struct {
email, key string
baseUrl, loginPath, searchPath string
fieldList []string

keywordArr []string
size int

results []Result
var this *fofa.Fofa
var keywordSlice []string

func Init(email, key string) {
//设置日志输出器
fofa.SetLogger(slog.DebugLogger())
//初始化fofa模块
this = fofa.New(email, key)
this.SetSize(app.Setting.FofaSize)
//获取所有关键字
keywordSlice = makeKeywordSlice()
}

type ResponseJson struct {
Error bool `json:"error"`
Mode string `json:"mode"`
Page int `json:"page"`
Query string `json:"query"`
Results [][]string `json:"results"`
Size int `json:"size"`
func Run() {
//对每个关键字进行查询
for _, keyword := range keywordSlice {
slog.Warningf("本次搜索关键字为:%v", keyword)
size, results := this.Search(keyword)
displayResponse(results)
slog.Infof("本次搜索,返回结果总条数为:%d,此次返回条数为:%d", size, len(results))
}
}

func New(email, key string) *Fofa {
f := &Fofa{
email: email,
key: key,
baseUrl: "https://fofa.info",
searchPath: "/api/v1/search/all",
loginPath: "/api/v1/info/my",
fieldList: []string{
"host", "title", "ip", "domain", "port", "country", "province",
"city", "country_name", "header", "server", "protocol", "banner",
"cert", "isp", "as_organization",
},
func makeKeywordSlice() []string {
var keywordSlice []string
if app.Setting.FofaFixKeyword == "" {
keywordSlice = app.Setting.Fofa
} else {
for _, keyword := range app.Setting.Fofa {
keyword = strings.ReplaceAll(app.Setting.FofaFixKeyword, "{}", keyword)
keywordSlice = append(keywordSlice, keyword)
}
}
return f
return keywordSlice
}

func (f *Fofa) LoadArgs() {
f.loadKeywordArr()
f.size = app.Setting.FofaSize
func GetUrlTarget() []string {
var strSlice []string
for _, result := range this.Results() {
strSlice = append(strSlice, result.Host)
}
strSlice = misc.RemoveDuplicateElement(strSlice)
return strSlice
}

func (f *Fofa) SearchAll() {
for _, keyword := range f.keywordArr {
slog.Warningf("本次搜索关键字为:%v", keyword)

f.Search(keyword)
func GetHostTarget() []string {
var strSlice []string
for _, result := range this.Results() {
strSlice = append(strSlice, result.Ip)
}
strSlice = misc.RemoveDuplicateElement(strSlice)
return strSlice
}

func (f *Fofa) Search(keyword string) *ResponseJson {
url := f.baseUrl + f.searchPath
req, _ := http.NewRequest(http.MethodGet, url, nil)
q := req.URL.Query()
q.Add("qbase64", misc.Base64Encode(keyword))
q.Add("email", f.email)
q.Add("key", f.key)
q.Add("page", "1")
q.Add("fields", strings.Join(f.fieldList, ","))
q.Add("size", strconv.Itoa(f.size))
q.Add("full", "false")
req.URL.RawQuery = q.Encode()
resp, err := http.DefaultClient.Do(req)
if err != nil {
slog.Error(err)
}
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
slog.Error(err)
}
var responseJson ResponseJson
if err = json.Unmarshal(body, &responseJson); err != nil {
slog.Error(body, err)
}
r := f.makeResult(responseJson)
f.results = append(f.results, r...)
//输出扫描结果
for _, row := range r {
func displayResponse(results []fofa.Result) {
for _, row := range results {
m := row.Map()
m["Header"] = ""
m["Cert"] = ""
Expand All @@ -114,54 +90,4 @@ func (f *Fofa) Search(keyword string) *ResponseJson {
)
slog.Data(line)
}
slog.Infof("本次搜索,返回结果总条数为:%d,此次返回条数为:%d", responseJson.Size, len(responseJson.Results))
return &responseJson
}

func (f *Fofa) makeResult(responseJson ResponseJson) []Result {
var results []Result
var result Result

for _, row := range responseJson.Results {
m := reflect.ValueOf(&result).Elem()
for index, f := range f.fieldList {
f = misc.First2Upper(f)
m.FieldByName(f).SetString(row[index])
}
result.Fix()
results = append(results, result)
}
return results
}

func (f *Fofa) loadKeywordArr() {
if app.Setting.FofaFixKeyword == "" {
f.keywordArr = app.Setting.Fofa
} else {
for _, keyword := range app.Setting.Fofa {
keyword = strings.ReplaceAll(app.Setting.FofaFixKeyword, "{}", keyword)
f.keywordArr = append(f.keywordArr, keyword)
}
}
}

func (f *Fofa) Check() {
var strArr []string
for _, result := range f.results {
strArr = append(strArr, result.Host)
}
app.Setting.UrlTarget = strArr
}

func (f *Fofa) Scan() {
var ipArr []string
var hostArr []string
for _, result := range f.results {
ipArr = append(ipArr, result.Ip)
hostArr = append(hostArr, result.Host)
}
ipArr = misc.RemoveDuplicateElement(ipArr)
hostArr = misc.RemoveDuplicateElement(hostArr)
app.Setting.HostTarget = ipArr
app.Setting.UrlTarget = hostArr
}
7 changes: 4 additions & 3 deletions core/fofa/fofa_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package fofa

import (
"fmt"
"kscan/lib/fofa"
"kscan/lib/misc"
"os"
"strconv"
Expand All @@ -12,12 +13,12 @@ import (
func TestGetPortMap(t *testing.T) {
email := os.Getenv("FOFA_EMAIL")
key := os.Getenv("FOFA_KEY")
f := New(email, key)
f := fofa.New(email, key)
var fileSlice []string
for i := 1; i <= 65535; i++ {
keyword := "port=" + strconv.Itoa(i)
responseJson := f.Search(keyword)
row := fmt.Sprintf("%d\t%d", i, responseJson.Size)
size, _ := f.Search(keyword)
row := fmt.Sprintf("%d\t%d", i, size)
fmt.Println(row)
fileSlice = append(fileSlice, row)
}
Expand Down
10 changes: 5 additions & 5 deletions kscan.go
Original file line number Diff line number Diff line change
Expand Up @@ -212,19 +212,19 @@ func InitFofa() {
slog.Warning("使用-f/-fofa参数前请先配置环境变量:FOFA_EMAIL、FOFA_KEY")
slog.Error("如果你是想从文件导入端口扫描任务,请使用-t file:/path/to/file")
}
f := fofa.New(email, key)
f.LoadArgs()
f.SearchAll()
fofa.Init(email, key)
fofa.Run()
if app.Setting.Check == false && app.Setting.Scan == false {
slog.Warning("可以使用--check参数对fofa扫描结果进行存活性及指纹探测,也可以使用--scan参数对fofa扫描结果进行端口扫描")
}
if app.Setting.Check == true {
app.Setting.UrlTarget = fofa.GetUrlTarget()
slog.Warning("check参数已启用,现在将对fofa扫描结果进行存活性及指纹探测")
f.Check()
}
if app.Setting.Scan == true {
app.Setting.UrlTarget = fofa.GetUrlTarget()
app.Setting.HostTarget = fofa.GetHostTarget()
slog.Warning("scan参数已启用,现在将对fofa扫描结果进行端口扫描及指纹探测")
f.Scan()
}
}

Expand Down
107 changes: 107 additions & 0 deletions lib/fofa/fofa.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
package fofa

import (
"encoding/json"
"io"
"io/ioutil"
"kscan/lib/misc"
"log"
"net/http"
"reflect"
"strconv"
"strings"
)

var logger = log.New(io.Discard, "", log.Ldate|log.Ltime)

type Fofa struct {
email, key string
baseUrl, loginPath, searchPath string
fieldList []string

size int

results []Result
}

type ResponseJson struct {
Error bool `json:"error"`
Mode string `json:"mode"`
Page int `json:"page"`
Query string `json:"query"`
Results [][]string `json:"results"`
Size int `json:"size"`
}

func New(email, key string) *Fofa {
f := &Fofa{
email: email,
key: key,
baseUrl: "https://fofa.info",
searchPath: "/api/v1/search/all",
loginPath: "/api/v1/info/my",
fieldList: []string{
"host", "title", "ip", "domain", "port", "country", "province",
"city", "country_name", "header", "server", "protocol", "banner",
"cert", "isp", "as_organization",
},
}
return f
}

func (f *Fofa) SetSize(i int) {
f.size = i
}

func (f *Fofa) Search(keyword string) (int, []Result) {
url := f.baseUrl + f.searchPath
req, _ := http.NewRequest(http.MethodGet, url, nil)
q := req.URL.Query()
q.Add("qbase64", misc.Base64Encode(keyword))
q.Add("email", f.email)
q.Add("key", f.key)
q.Add("page", "1")
q.Add("fields", strings.Join(f.fieldList, ","))
q.Add("size", strconv.Itoa(f.size))
q.Add("full", "false")
req.URL.RawQuery = q.Encode()
resp, err := http.DefaultClient.Do(req)
if err != nil {
logger.Println(err)
}
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
logger.Println(err)
}
var responseJson ResponseJson
if err = json.Unmarshal(body, &responseJson); err != nil {
logger.Println(body, err)
}
r := f.makeResult(responseJson)
f.results = append(f.results, r...)
return responseJson.Size, r
}

func (f *Fofa) makeResult(responseJson ResponseJson) []Result {
var results []Result
var result Result

for _, row := range responseJson.Results {
m := reflect.ValueOf(&result).Elem()
for index, f := range f.fieldList {
f = misc.First2Upper(f)
m.FieldByName(f).SetString(row[index])
}
result.Fix()
results = append(results, result)
}
return results
}

func (f *Fofa) Results() []Result {
return f.results
}

func SetLogger(log *log.Logger) {
logger = log
}
43 changes: 43 additions & 0 deletions lib/fofa/type-result.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package fofa

import (
"fmt"
"kscan/lib/misc"
"reflect"
"regexp"
"strings"
)

type Result struct {
Host, Title, Ip, Domain, Port, Country string
Province, City, Country_name, Protocol string
Server, Banner, Isp, As_organization string
Header, Cert string
}

func (r *Result) Fix() {
if r.Protocol != "" {
r.Host = fmt.Sprintf("%s://%s:%s", r.Protocol, r.Ip, r.Port)
}
if regexp.MustCompile("http([s]?)://.*").MatchString(r.Host) == false && r.Protocol == "" {
r.Host = "http://" + r.Host
}
if r.Title == "" && r.Protocol != "" {
r.Title = strings.ToUpper(r.Protocol)
}

r.Title = misc.FixLine(r.Title)

}

func (r Result) Map() map[string]string {
t := reflect.TypeOf(r)
v := reflect.ValueOf(r)
m := make(map[string]string)
for k := 0; k < t.NumField(); k++ {
key := t.Field(k).Name
value := v.Field(k).String()
m[key] = value
}
return m
}

0 comments on commit 2c0e476

Please sign in to comment.