色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

電子發(fā)燒友App

硬聲App

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示
創(chuàng)作
電子發(fā)燒友網(wǎng)>電子資料下載>電子資料>x-crack弱口令掃描器

x-crack弱口令掃描器

2022-05-07 | zip | 0.05 MB | 次下載 | 免費(fèi)

資料介紹

授權(quán)協(xié)議 未知
開(kāi)發(fā)語(yǔ)言 Google Go
操作系統(tǒng) 跨平臺(tái)
軟件類型 開(kāi)源軟件

軟件簡(jiǎn)介

我們?cè)谧銎髽I(yè)安全時(shí),弱口令檢測(cè)是系統(tǒng)/網(wǎng)絡(luò)安全的最基礎(chǔ)的部分之一,根據(jù)經(jīng)驗(yàn),經(jīng)常會(huì)出現(xiàn)弱口令的服務(wù)如下:

  • FTP
  • SSH
  • SMB
  • MYSQL
  • MSSQL
  • POSTGRESQL
  • REDIS
  • MONGODB
  • ELASTICSEARCH

那咱們就一起用GO來(lái)寫一款常見(jiàn)服務(wù)的弱口令掃描器,且支持以插件的形式增加新的服務(wù)掃描模塊。我們的教程暫定為只掃以上服務(wù)。

給掃描器啟一個(gè)屌炸天的名字x-crack,在$GOPATH/src/中建立一個(gè)x-crack項(xiàng)目后開(kāi)始擼碼,不要給我說(shuō)什么底層原理、框架內(nèi)核,老夫敲代碼就是一把梭。

?

開(kāi)工

數(shù)據(jù)結(jié)構(gòu)定義

  • 掃描模塊的輸入內(nèi)容為為IP、端口及協(xié)議的列表,我們需要定義一個(gè)IpAddr的數(shù)據(jù)結(jié)構(gòu);
  • 每個(gè)服務(wù)的每次掃描需要傳入的參數(shù)為IP、端口、協(xié)議、用戶名和密碼,需要定義一個(gè)Service結(jié)構(gòu)來(lái)包括這些內(nèi)容;
  • 每條Service的記錄在掃描模塊進(jìn)行嘗試后,會(huì)得出掃描結(jié)果成功與否,我們?cè)俣x一個(gè)ScanResult數(shù)據(jù)結(jié)構(gòu)。

按照開(kāi)發(fā)規(guī)范,數(shù)據(jù)結(jié)構(gòu)的定義統(tǒng)一放到models目錄中,全部的數(shù)據(jù)結(jié)構(gòu)定義如下:

package models

type Service struct {
	Ip       string
	Port     int
	Protocol string
	Username string
	Password string
}

type ScanResult struct {
	Service Service
	Result  bool
}

type IpAddr struct {
	Ip       string
	Port     int
	Protocol string
}

FTP掃描模塊

go語(yǔ)言有現(xiàn)成的FTP模塊,我們找一個(gè)star數(shù)最多的直接go get安裝一下即可使用了:

go get -u github.com/jlaffaye/ftp

我們把所有的掃描模塊放到plugins目錄中,F(xiàn)TP協(xié)議的掃描插件如下所示:

package plugins

import (
	"github.com/jlaffaye/ftp"

	"x-crack/models"
	"x-crack/vars"


	"fmt"
)

func ScanFtp(s models.Service) (err error, result models.ScanResult) {
	result.Service = s
	conn, err := ftp.DialTimeout(fmt.Sprintf("%v:%v", s.Ip, s.Port), vars.TimeOut)
	if err == nil {
		err = conn.Login(s.Username, s.Password)
		if err == nil {
			defer conn.Logout()
			result.Result = true
		}
	}
	return err, result
}

每個(gè)連接需要設(shè)置超時(shí)時(shí)間,防止因網(wǎng)絡(luò)問(wèn)題導(dǎo)致的阻塞,我們打算通過(guò)程序的命令行來(lái)控制超時(shí)時(shí)間,所以定義了一個(gè)全局變量TimeOut。 放在vars模塊中的原因是防止放在這個(gè)模塊中后會(huì)和其他模塊互相調(diào)用導(dǎo)致的循環(huán)import

寫代碼雖然可以一把梭,但是不能等著洋洋灑灑地把幾萬(wàn)行都寫完再運(yùn)行,比如我們的目標(biāo)是造一輛豪車,不能等著所有零件設(shè)計(jì)好,都裝上去再發(fā)動(dòng)車測(cè)試,正確的開(kāi)發(fā)流程是把寫邊測(cè),不要等輪子造出來(lái),而是在螺絲、齒輪階段就測(cè)試。

以下為FTP掃描插件這個(gè)齒輪的測(cè)試代碼及結(jié)果。

package plugins_test

import (
	"x-crack/models"
	"x-crack/plugins"

	"testing"
)

func TestScanFtp(t *testing.T) {
	s := models.Service{Ip: "127.0.0.1", Port: 21, Protocol: "ftp", Username: "ftp", Password: "ftp"}
	t.Log(plugins.ScanFtp(s))
}

測(cè)試結(jié)果滿足預(yù)期,說(shuō)明我們這個(gè)零件不是次品,可以繼續(xù)再造其他零件了。

$ go test -v plugins/ftp_test.go
=== RUN   TestScanFtp
--- PASS: TestScanFtp (0.00s)
	ftp_test.go:36: dial tcp 127.0.0.1:21: getsockopt: connection refused {{127.0.0.1 21 ftp ftp ftp} false}
PASS
ok  	command-line-arguments	0.025s

SSH掃描模塊

go的標(biāo)準(zhǔn)庫(kù)中自帶了ssh包,直接調(diào)用即可,完整代碼如下:

package plugins

import (
	"golang.org/x/crypto/ssh"

	"x-crack/models"
	"x-crack/vars"

	"fmt"
	"net"
)

func ScanSsh(s models.Service) (err error, result models.ScanResult) {
	result.Service = s
	config := &ssh.ClientConfig{
		User: s.Username,
		Auth: []ssh.AuthMethod{
			ssh.Password(s.Password),
		},
		Timeout: vars.TimeOut,
		HostKeyCallback: func(hostname string, remote net.Addr, key ssh.PublicKey) error {
			return nil
		},
	}

	client, err := ssh.Dial("tcp", fmt.Sprintf("%v:%v", s.Ip, s.Port), config)
	if err == nil {
		defer client.Close()
		session, err := client.NewSession()
		errRet := session.Run("echo xsec")
		if err == nil && errRet == nil {
			defer session.Close()
			result.Result = true
		}
	}
	return err, result
}
 

同樣,每個(gè)子模塊寫好后都需要先用go test跑一下看是否滿足預(yù)期,測(cè)試代碼如下:

package plugins_test

import (
	"x-crack/models"
	"x-crack/plugins"

	"testing"
)

func TestScanSsh(t *testing.T) {
	s := models.Service{Ip: "127.0.0.1", Port: 22, Username: "root", Password: "123456", Protocol: "ssh"}
	t.Log(plugins.ScanSsh(s))
} 

測(cè)試結(jié)果如下:

$ go test -v plugins/ssh_test.go
=== RUN   TestScanSsh
--- PASS: TestScanSsh (0.00s)
	ssh_test.go:36: dial tcp 127.0.0.1:22: getsockopt: connection refused {{127.0.0.1 22 ssh root 123456} false}
PASS
ok  	command-line-arguments	0.026s

SMB掃描模塊

SMB弱口令的掃描插件,我們使用了github.com/stacktitan/smb/smb包,同樣直接go get安裝一下即可拿來(lái)使用。 代碼如下:

package plugins

import (
	"github.com/stacktitan/smb/smb"

	"x-crack/models"
)

func ScanSmb(s models.Service) (err error, result models.ScanResult) {
	result.Service = s
	options := smb.Options{
		Host:        s.Ip,
		Port:        s.Port,
		User:        s.Username,
		Password:    s.Password,
		Domain:      "",
		Workstation: "",
	}

	session, err := smb.NewSession(options, false)
	if err == nil {
		session.Close()
		if session.IsAuthenticated {
			result.Result = true
		}
	}
	return err, result
}

同樣也先寫測(cè)試用例來(lái)測(cè)試一下,測(cè)試代碼如下:

package plugins_test

import (
	"x-crack/models"
	"x-crack/plugins"

	"testing"
)

func TestScanSmb(t *testing.T) {
	s := models.Service{Ip: "share.xsec.io", Port: 445, Protocol: "smb", Username: "xsec", Password: "fsafffdsfdsa"}
	t.Log(plugins.ScanSmb(s))
}

測(cè)試結(jié)果:

hartnett at hartnettdeMacBook-Pro in /data/code/golang/src/x-crack (master)
$ go test -v plugins/smb_test.go
=== RUN   TestScanSmb
--- PASS: TestScanSmb (0.04s)
	smb_test.go:36: NT Status Error: Logon failed
		 {{share.xsec.io 445 smb xsec fsafffdsfdsa} false}
PASS
ok  	command-line-arguments	0.069s

MYSQL、MSSQL和POSTGRESQL掃描模塊

MYSQL、MSSQL和POSTGRESQL的掃描模塊,我使用了第三方的ORM?xorm,當(dāng)然也可以直接使用原生的sql driver來(lái)實(shí)現(xiàn),我們這里圖方便用xorm一把梭了。 對(duì)于xorm來(lái)說(shuō),這3個(gè)掃描插件的實(shí)現(xiàn)方法大同小異,為了節(jié)約篇幅,咱們只看mysql掃描插件的實(shí)現(xiàn),其他2個(gè)插件可以參考github中的完整源碼。 首先還是先go get要用到的包:

go get github.com/netxfly/mysql
go get github.com/go-xorm/xorm
github.com/go-xorm/core

接下來(lái)我們把需要驗(yàn)證的IP、port、username、password組成datasource傳遞給xorm,完整代碼如下:

package plugins

import (
	_ "github.com/netxfly/mysql"
	"github.com/go-xorm/xorm"
	"github.com/go-xorm/core"

	"x-crack/models"

	"fmt"
)

func ScanMysql(service models.Service) (err error, result models.ScanResult) {
	result.Service = service

	dataSourceName := fmt.Sprintf("%v:%v@tcp(%v:%v)/%v?charset=utf8", service.Username,
		service.Password, service.Ip, service.Port, "mysql")
	Engine, err := xorm.NewEngine("mysql", dataSourceName)

	if err == nil {
		Engine.SetLogLevel(core.LOG_OFF)
		// fix "[mysql] packets.go:33: unexpected EOF" error
		Engine.SetMaxIdleConns(0)
		// Engine.SetConnMaxLifetime(time.Second * 30)
		defer Engine.Close()
		err = Engine.Ping()
		if err == nil {
			result.Result = true
		}
	}
	return err, result
}

眼尖的同學(xué)也許發(fā)現(xiàn)了,上面?github.com/netxfly/mysql?這個(gè)mysql包是放在筆者的github下的,這是為什么呢?

因?yàn)橹苯佑胢ysql這個(gè)包的話,在掃描的過(guò)程中會(huì)遇到[mysql] packets.go:33: unexpected EOF" error的異常輸出,影響了我們程序在掃描過(guò)程中輸出UI的美觀性,這對(duì)于帥氣的我是無(wú)法接受的,通過(guò)設(shè)置參數(shù)的方法無(wú)法解決,最后只好直接fork了一份mysql的包,把打印這個(gè)異常的語(yǔ)句注釋掉再提交上去直接使用了。

測(cè)試代碼:

package plugins_test

import (
	"testing"

	"x-crack/plugins"
	"x-crack/models"
)

func TestScanMysql(t *testing.T) {
	service := models.Service{Ip: "10.10.10.10", Port: 3306, Protocol: "mysql", Username: "root", Password: "123456"}
	t.Log(plugins.ScanMysql(service))
}

測(cè)試結(jié)果:

go test -v plugins/mysql_test.go
=== RUN   TestScanMysql
--- PASS: TestScanMysql (0.02s)
	mysql_test.go:36: Error 1045: Access denied for user 'root'@'10.10.10.100' (using password: YES) {{10.10.10.10 3306 mysql root 123456} false}
PASS
ok  	command-line-arguments	0.041s

Redis掃描模塊

go get安裝第三方包github.com/go-redis/redis,完整代碼如下:

package plugins

import (
	"github.com/go-redis/redis"

	"x-crack/models"
	"x-crack/vars"

	"fmt"
)

func ScanRedis(s models.Service) (err error, result models.ScanResult) {
	result.Service = s
	opt := redis.Options{Addr: fmt.Sprintf("%v:%v", s.Ip, s.Port),
		Password: s.Password, DB: 0, DialTimeout: vars.TimeOut}
	client := redis.NewClient(&opt)
	defer client.Close()
	_, err = client.Ping().Result()
	if err == nil {
		result.Result = true
	}
	return err, result
}

測(cè)試代碼:

package plugins_test

import (
	"x-crack/models"
	"x-crack/plugins"

	"testing"
)

func TestScanRedis(t *testing.T) {
	s := models.Service{Ip: "127.0.0.1", Port: 6379, Password: "test"}
	t.Log(plugins.ScanRedis(s))
}

測(cè)試結(jié)果:

go test -v plugins/redis_test.go
=== RUN   TestScanRedis
--- PASS: TestScanRedis (0.00s)
	redis_test.go:36: dial tcp 127.0.0.1:6379: getsockopt: connection refused {{127.0.0.1 6379   test} false}
PASS
ok  	command-line-arguments	0.025s

MONGODB掃描模塊

mongodb掃描模塊依賴mgo包,可用go get合令直接安裝。

go get gopkg.in/mgo.v2

完整代碼:

package plugins

import (
	"gopkg.in/mgo.v2"

	"x-crack/models"
	"x-crack/vars"

	"fmt"
)

func ScanMongodb(s models.Service) (err error, result models.ScanResult) {
	result.Service = s
	url := fmt.Sprintf("mongodb://%v:%v@%v:%v/%v", s.Username, s.Password, s.Ip, s.Port, "test")
	session, err := mgo.DialWithTimeout(url, vars.TimeOut)

	if err == nil {
		defer session.Close()
		err = session.Ping()
		if err == nil {
			result.Result = true
		}
	}

	return err, result
}

測(cè)試結(jié)果:

go test -v plugins/mongodb_test.go
=== RUN   TestScanMongodb
--- PASS: TestScanMongodb (3.53s)
	mongodb_test.go:36: no reachable servers {{127.0.0.1 27017 mongodb test test} false}
PASS
ok  	command-line-arguments	3.558s

ELASTICSEARCH掃描模塊

ELASTICSEARCH掃描插件依賴第三方包gopkg.in/olivere/elastic.v3,同樣也是直接go get安裝。 完整代碼如下:

package plugins

import (
	"gopkg.in/olivere/elastic.v3"

	"x-crack/models"
	
	"fmt"
)

func ScanElastic(s models.Service) (err error, result models.ScanResult) {
	result.Service = s
	client, err := elastic.NewClient(elastic.SetURL(fmt.Sprintf("http://%v:%v", s.Ip, s.Port)),
		elastic.SetMaxRetries(3),
		elastic.SetBasicAuth(s.Username, s.Password),
	)
	if err == nil {
		_, _, err = client.Ping(fmt.Sprintf("http://%v:%v", s.Ip, s.Port)).Do()
		if err == nil {
			result.Result = true
		}
	}
	return err, result
}

測(cè)試代碼:

package plugins_test

import (
	"x-crack/models"
	"x-crack/plugins"

	"testing"
)

func TestScanElastic(t *testing.T) {
	s := models.Service{Ip: "127.0.0.1", Port: 9200, Protocol: "elastic", Username: "root", Password: "123456"}
	t.Log(plugins.ScanElastic(s))
}

測(cè)試結(jié)果如下:

go test -v plugins/elastic_test.go
=== RUN   TestScanElastic
--- PASS: TestScanElastic (5.02s)
	elastic_test.go:36: no Elasticsearch node available {{127.0.0.1 9200 elastic root 123456} false}
PASS
ok  	command-line-arguments	5.061s

掃描模塊插件化

前面我們寫好的掃描插件的函數(shù)原始是一致,我們可以將這組函數(shù)放到一個(gè)map中,在掃描的過(guò)程中自動(dòng)化根據(jù)不同的協(xié)議調(diào)用不同的掃描插件。

以后新加的掃描插件,可以按這種方法直接注冊(cè)。

package plugins

import (
	"x-crack/models"
)

type ScanFunc func(service models.Service) (err error, result models.ScanResult)

var (
	ScanFuncMap map[string]ScanFunc
)

func init() {
	ScanFuncMap = make(map[string]ScanFunc)
	ScanFuncMap["FTP"] = ScanFtp
	ScanFuncMap["SSH"] = ScanSsh
	ScanFuncMap["SMB"] = ScanSmb
	ScanFuncMap["MSSQL"] = ScanMssql
	ScanFuncMap["MYSQL"] = ScanMysql
	ScanFuncMap["POSTGRESQL"] = ScanPostgres
	ScanFuncMap["REDIS"] = ScanRedis
	ScanFuncMap["ELASTICSEARCH"] = ScanElastic
	ScanFuncMap["MONGODB"] = ScanMongodb
}

掃描任務(wù)調(diào)度

前面我們寫好了一些常見(jiàn)服務(wù)的弱口令掃描插件,也測(cè)試通過(guò)了。 接下來(lái)我們需要實(shí)現(xiàn)從命令行參數(shù)傳遞iplist、用戶名字典和密碼字典進(jìn)去,并讀取相應(yīng)的信息進(jìn)行掃描調(diào)度的功能,細(xì)分一下,需要做以下幾件事:

  • 讀取iplist列表
  • 讀取用戶名字典
  • 讀取密碼字典
  • 生成掃描任務(wù)
  • 掃描任務(wù)調(diào)度
  • 掃描任務(wù)執(zhí)行
  • 掃描結(jié)果保存
  • 命令行調(diào)用外殼

讀取ip\用戶名和密碼字典

該模塊主要用了標(biāo)準(zhǔn)庫(kù)中的bufio包,逐行讀取文件,進(jìn)行過(guò)濾后直接生成相應(yīng)的slice。其中iplist支持以下格式:

127.0.0.1:3306|mysql
8.8.8.8:22
9.9.9.9:6379
108.61.223.105:2222|ssh

對(duì)于標(biāo)準(zhǔn)的端口,程序可以自動(dòng)判斷其協(xié)議,對(duì)于非標(biāo)準(zhǔn)端口的協(xié)議,需要在后面加一個(gè)字段標(biāo)注一下協(xié)議。

為了防止咱們的程序被腳本小子們?yōu)E用,老夫就不提供端口掃描、協(xié)議識(shí)別等功能了,安全工程師們可以把自己公司的端口掃描器產(chǎn)出的結(jié)果丟到這個(gè)里面來(lái)掃。

package util

import (
	"x-crack/models"
	"x-crack/logger"
	"x-crack/vars"

	"os"
	"bufio"
	"strings"
	"strconv"
)

func ReadIpList(fileName string) (ipList []models.IpAddr) {
	ipListFile, err := os.Open(fileName)
	if err != nil {
		logger.Log.Fatalf("Open ip List file err, %v", err)
	}

	defer ipListFile.Close()

	scanner := bufio.NewScanner(ipListFile)
	scanner.Split(bufio.ScanLines)

	for scanner.Scan() {
		ipPort := strings.TrimSpace(scanner.Text())
		t := strings.Split(ipPort, ":")
		ip := t[0]
		portProtocol := t[1]
		tmpPort := strings.Split(portProtocol, "|")
		// ip列表中指定了端口對(duì)應(yīng)的服務(wù)
		if len(tmpPort) == 2 {
			port, _ := strconv.Atoi(tmpPort[0])
			protocol := strings.ToUpper(tmpPort[1])
			if vars.SupportProtocols[protocol] {
				addr := models.IpAddr{Ip: ip, Port: port, Protocol: protocol}
				ipList = append(ipList, addr)
			} else {
				logger.Log.Infof("Not support %v, ignore: %v:%v", protocol, ip, port)
			}
		} else {
			// 通過(guò)端口查服務(wù)
			port, err := strconv.Atoi(tmpPort[0])
			if err == nil {
				protocol, ok := vars.PortNames[port]
				if ok && vars.SupportProtocols[protocol] {
					addr := models.IpAddr{Ip: ip, Port: port, Protocol: protocol}
					ipList = append(ipList, addr)
				}
			}
		}

	}

	return ipList
}

func ReadUserDict(userDict string) (users []string, err error) {
	file, err := os.Open(userDict)
	if err != nil {
		logger.Log.Fatalf("Open user dict file err, %v", err)
	}

	defer file.Close()

	scanner := bufio.NewScanner(file)
	scanner.Split(bufio.ScanLines)

	for scanner.Scan() {
		user := strings.TrimSpace(scanner.Text())
		if user != "" {
			users = append(users, user)
		}
	}
	return users, err
}

func ReadPasswordDict(passDict string) (password []string, err error) {
	file, err := os.Open(passDict)
	if err != nil {
		logger.Log.Fatalf("Open password dict file err, %v", err)
	}

	defer file.Close()

	scanner := bufio.NewScanner(file)
	scanner.Split(bufio.ScanLines)

	for scanner.Scan() {
		passwd := strings.TrimSpace(scanner.Text())
		if passwd != "" {
			password = append(password, passwd)
		}
	}
	password = append(password, "")
	return password, err
}

IP列表、用戶名字典與密碼字典讀取的測(cè)試代碼:

package util_test

import (
	"x-crack/util"

	"testing"
)

func TestReadIpList(t *testing.T) {
	ipList := "/tmp/iplist.txt"
	t.Log(util.ReadIpList(ipList))
}

func TestReadUserDict(t *testing.T) {
	userDict := "/tmp/user.dic"
	t.Log(util.ReadUserDict(userDict))
}

func TestReadPasswordDict(t *testing.T) {
	passDict := "/tmp/pass.dic"
	t.Log(util.ReadPasswordDict(passDict))
}

這個(gè)模塊的測(cè)試結(jié)果如下:

go test -v util/file_test.go
=== RUN   TestReadIpList
--- PASS: TestReadIpList (0.00s)
	file_test.go:35: [{127.0.0.1 3306 MYSQL} {8.8.8.8 22 SSH} {9.9.9.9 6379 REDIS} {108.61.223.105 2222 SSH}]
=== RUN   TestReadUserDict
--- PASS: TestReadUserDict (0.00s)
	file_test.go:40: [root admin test guest info adm mysql user administrator ftp sa] 
=== RUN   TestReadPasswordDict
--- PASS: TestReadPasswordDict (0.00s)
	file_test.go:45: [1314520520 135246 135246789 135792468 1357924680 147258369 1472583690 1qaz2wsx 5201314 54321 55555 654321 789456123 88888 888888 88888888 987654321 9876543210 ^%$#@~! a123123 a123456 a12345678 a123456789 aa123456 aa123456789 aaa123456 aaaaa aaaaaa aaaaaaaa abc123 abc123456 abc123456789 abcd123 abcd1234 abcd123456 admin admin888 ] 
PASS
ok  	command-line-arguments	0.022s

其中iplist在加載的過(guò)程中不是無(wú)腦全部讀進(jìn)去的,在正式掃描前會(huì)先過(guò)濾一次,把不通的ip和端口對(duì)剔除掉,以免影響掃描效率,代碼如下:

package util

import (
	"gopkg.in/cheggaaa/pb.v2"

	"x-crack/models"
	"x-crack/logger"
	"x-crack/vars"

	"net"
	"sync"
	"fmt"
)

var (
	AliveAddr []models.IpAddr
	mutex     sync.Mutex
)

func init() {
	AliveAddr = make([]models.IpAddr, 0)
}

func CheckAlive(ipList []models.IpAddr) ([]models.IpAddr) {
	logger.Log.Infoln("checking ip active")
	
	var wg sync.WaitGroup
	wg.Add(len(ipList))

	for _, addr := range ipList {
		go func(addr models.IpAddr) {
			defer wg.Done()
			SaveAddr(check(addr))
		}(addr)
	}
	wg.Wait()
	vars.ProcessBarActive.Finish()

	return AliveAddr
}

func check(ipAddr models.IpAddr) (bool, models.IpAddr) {
	alive := false
	_, err := net.DialTimeout("tcp", fmt.Sprintf("%v:%v", ipAddr.Ip, ipAddr.Port), vars.TimeOut)
	if err == nil {
		alive = true
	}
	vars.ProcessBarActive.Increment()
	return alive, ipAddr
}

func SaveAddr(alive bool, ipAddr models.IpAddr) {
	if alive {
		mutex.Lock()
		AliveAddr = append(AliveAddr, ipAddr)
		mutex.Unlock()
	}
}

通過(guò)標(biāo)準(zhǔn)端口查詢對(duì)應(yīng)服務(wù)的功能在vars包中定義了,為了避免多個(gè)包之間的循環(huán)導(dǎo)入,我們把所有的全局變量都集中到了一個(gè)獨(dú)立的vars包中。

PortNamesmap為標(biāo)準(zhǔn)端口對(duì)應(yīng)的服務(wù),在加了新的掃描插件后,也需要更新這個(gè)map的內(nèi)容。

package vars

import (
	"github.com/patrickmn/go-cache"

	"gopkg.in/cheggaaa/pb.v2"

	"sync"
	"time"
	"strings"
)

var (
	IpList     = "iplist.txt"
	ResultFile = "x_crack.txt"

	UserDict = "user.dic"
	PassDict = "pass.dic"

	TimeOut = 3 * time.Second
	ScanNum = 5000

	DebugMode bool

	StartTime time.Time

	ProgressBar      *pb.ProgressBar
	ProcessBarActive *pb.ProgressBar
)

var (
	CacheService *cache.Cache
	Mutex        sync.Mutex

	PortNames = map[int]string{
		21:    "FTP",
		22:    "SSH",
		445:   "SMB",
		1433:  "MSSQL",
		3306:  "MYSQL",
		5432:  "POSTGRESQL",
		6379:  "REDIS",
		9200:  "ELASTICSEARCH",
		27017: "MONGODB",
	}

	// 標(biāo)記特定服務(wù)的特定用戶是否破解成功,成功的話不再嘗試破解該用戶
	SuccessHash map[string]bool

	SupportProtocols map[string]bool
)

func init() {
	SuccessHash = make(map[string]bool)
	CacheService = cache.New(cache.NoExpiration, cache.DefaultExpiration)

	SupportProtocols = make(map[string]bool)
	for _, proto := range PortNames {
		SupportProtocols[strings.ToUpper(proto)] = true
	}

}

?


下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評(píng)論

查看更多

下載排行

本周

  1. 1山景DSP芯片AP8248A2數(shù)據(jù)手冊(cè)
  2. 1.06 MB  |  532次下載  |  免費(fèi)
  3. 2RK3399完整板原理圖(支持平板,盒子VR)
  4. 3.28 MB  |  339次下載  |  免費(fèi)
  5. 3TC358743XBG評(píng)估板參考手冊(cè)
  6. 1.36 MB  |  330次下載  |  免費(fèi)
  7. 4DFM軟件使用教程
  8. 0.84 MB  |  295次下載  |  免費(fèi)
  9. 5元宇宙深度解析—未來(lái)的未來(lái)-風(fēng)口還是泡沫
  10. 6.40 MB  |  227次下載  |  免費(fèi)
  11. 6迪文DGUS開(kāi)發(fā)指南
  12. 31.67 MB  |  194次下載  |  免費(fèi)
  13. 7元宇宙底層硬件系列報(bào)告
  14. 13.42 MB  |  182次下載  |  免費(fèi)
  15. 8FP5207XR-G1中文應(yīng)用手冊(cè)
  16. 1.09 MB  |  178次下載  |  免費(fèi)

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234315次下載  |  免費(fèi)
  3. 2555集成電路應(yīng)用800例(新編版)
  4. 0.00 MB  |  33566次下載  |  免費(fèi)
  5. 3接口電路圖大全
  6. 未知  |  30323次下載  |  免費(fèi)
  7. 4開(kāi)關(guān)電源設(shè)計(jì)實(shí)例指南
  8. 未知  |  21549次下載  |  免費(fèi)
  9. 5電氣工程師手冊(cè)免費(fèi)下載(新編第二版pdf電子書)
  10. 0.00 MB  |  15349次下載  |  免費(fèi)
  11. 6數(shù)字電路基礎(chǔ)pdf(下載)
  12. 未知  |  13750次下載  |  免費(fèi)
  13. 7電子制作實(shí)例集錦 下載
  14. 未知  |  8113次下載  |  免費(fèi)
  15. 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德?tīng)栔?/a>
  16. 0.00 MB  |  6656次下載  |  免費(fèi)

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935054次下載  |  免費(fèi)
  3. 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
  4. 78.1 MB  |  537798次下載  |  免費(fèi)
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420027次下載  |  免費(fèi)
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234315次下載  |  免費(fèi)
  9. 5Altium DXP2002下載入口
  10. 未知  |  233046次下載  |  免費(fèi)
  11. 6電路仿真軟件multisim 10.0免費(fèi)下載
  12. 340992  |  191187次下載  |  免費(fèi)
  13. 7十天學(xué)會(huì)AVR單片機(jī)與C語(yǔ)言視頻教程 下載
  14. 158M  |  183279次下載  |  免費(fèi)
  15. 8proe5.0野火版下載(中文版免費(fèi)下載)
  16. 未知  |  138040次下載  |  免費(fèi)
主站蜘蛛池模板: 色男人的天堂久久综合| 亚洲国产精品高清在线| 中文文字幕文字幕亚洲色| 国产成人在线视频网站| 母狗黄淑珍| 影音先锋av333资源网| 国产在线视频在线观看| 吻嘴胸全身好爽床大全| 国产高清视频在线观看97| 四虎影视国产精品亚洲精品| 伊人国产在线观看| 好硬好湿好爽再深一点视频 | 国产亚洲精品品视频在线| 天天噜日日噜夜夜噜| 抽插内射高潮呻吟爆乳| 青青青久久久| 高h辣h双处全是肉一对一| 三级貂蝉艳史 在线观看| 国产精品99久久久久久人韩国| 色偷偷超碰97人人澡人人| 国产成人无码视频一区二区三区| 特级毛片内射WWW无码| 国产人A片在线乱码视频| 亚洲精品视频久久| 久久精品国产亚洲精品2020| 在线观看免费亚洲| 免费看黄的片多多APP下载| 办公室日本肉丝OL在线| 桃花色影院| 久久精品AV一区二区无码| 97 sese| 热久久综合这里只有精品电影| 阿娇和冠希13分钟在线观看| 久久麻豆国产国产AV| 7777色鬼xxxx欧美色夫| 琪琪伦伦影院理论片| 富婆找黑人老外泻火在线播放| 亚洲XXX午休国产熟女屁| 擼擼擼麻豆密臀AV| 动漫美女3d被爆漫画| 亚洲视频精选|