fscan二开(一)

admin 2025年1月15日18:56:16评论29 views字数 7491阅读24分58秒阅读模式

简介

fscan是一款用go语言编写的开源工具,一款内网综合扫描工具,方便一键自动化、全方位漏扫扫描。

源码下载地址:(https://github.com/shadow1ng/fscan)。

部分代码分析

下载完源码后,查看common/config.go文件,这里写有fscan的部分配置信息。
var Userdict = map[string][]string{"ftp":        {"ftp""admin""www""web""root""db""wwwroot""data"},"mysql":      {"root""mysql"},"mssql":      {"sa""sql"},"smb":        {"administrator""admin""guest"},"rdp":        {"administrator""admin""guest"},"postgresql": {"postgres""admin"},"ssh":        {"root""admin"},"mongodb":    {"root""admin"},"oracle":     {"sys""system""admin""test""web""orcl"},   }
Userdict 是设置fscan进行暴力破解时对应的账号
var Passwords = []string{"123456""admin""admin123""root""""pass123""pass@123""password""123123""654321""111111""123""1""admin@123""Admin@123""admin123!@#""{user}""{user}1""{user}111""{user}123""{user}@123""{user}_123""{user}#123""{user}@111""{user}@2019""{user}@123#4""P@ssw0rd!""P@ssw0rd""Passw0rd""qwe123""12345678""test""test123""123qwe""123qwe!@#""123456789""123321""666666""a123456.""123456~a""123456!a""000000""1234567890""8888888""!QAZ2wsx""1qaz2wsx""abc123""abc123456""1qaz@WSX""a11111""a12345""Aa1234""Aa1234.""Aa12345""a123456""a123123""Aa123123""Aa123456""Aa12345.""sysadmin""system""1qaz!QAZ""2wsx@WSX""qwe123!@#""Aa123456!""A123456s!""sa123456""1q2w3e""Charge123""Aa123456789"}
Passwords 这块是统一的密码字典。可以后续增加一些账号,但不建议增加密码,这样的话爆破时间过长请求流量过大会被检测到
var PortGroup = map[string]string{"ftp":         "21","ssh":         "22","findnet":     "135","netbios":     "139","smb":         "445","mssql":       "1433","oracle":      "1521","mysql":       "3306","rdp":         "3389","psql":        "5432","redis":       "6379","fcgi":        "9000",// 省略部分以简洁展示}
PortGroup是各种服务的字典,如要新增扫描的服务可以在上面添加服务名称及端口,如果需要可在对应的位置增加进行暴力破解的程序(后续会写)。
varOutputfile = "result.txt"varIsSave = truevarWebport = "80,81,82,83,84,85,86,87,88,89,90,91,92,98,99,443,800,801,808,880,888,889,1000,1010,1080,1081,1082,1099,1118,1888,2008,2020,2100,2375,2379,3000,3008,3128,3505,5900,59015555,6080,6648,6868,7000,7001,7002,7003,7004,7005,7007,7008,7070,7071,7074,7078,7080,7088,7200,7680,7687,7688,7777,7890,8000,8001,8002,8003,8004,8006,8008,8009,8010,8011,8012,8016,8018,8020,8028,8030,8038,8042,8044,8046,8048,8053,8060,8069,8070,8080,8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095,8096,8097,8098,8099,8100,8101,8108,8118,8161,8172,8180,8181,8200,8222,8244,8258,8280,8288,8300,8360,8443,8448,8484,8800,8834,8838,8848,8858,8868,8879,8880,8881,8888,8899,8983,8989,9000,9001,9002,9008,9010,9043,9060,9080,9081,9082,9083,9084,9085,9086,9087,9088,9089,9090,9091,9092,9093,9094,9095,9096,9097,9098,9099,9100,9200,9443,9448,9800,9981,9986,9988,9998,9999,10000,10001,10002,10004,10008,10010,10250,12018,12443,14000,16080,18000,18001,18002,18004,18008,18080,18082,18088,18090,18098,19001,20000,20720,21000,21501,21502,28018,20880"varDefaultPorts = "21,22,80,81,135,139,443,445,1433,1521,3306,5432,6379,7001,8000,8080,8089,9000,9200,11211,27017"

Outputfile是导出扫描结果的文件。var IsSave = true是默认扫描时导出扫描的结果。 至于剩下这俩一看就知道是web和各种服务的端口。

var PORTList = map[string]int{     ......    // 省略部分以简洁展示"mem":         11211,"mgo":         27017,"ms17010":     1000001,"cve20200796"1000002,"web":         1000003,"webonly":     1000003,"webpoc":      1000003,"smb2":        1000004,"wmiexec":     1000005,"all":         0,"portscan":    0,"icmp":        0,"main":        0,}

看到这个变量的时候我很诧异,像是端口字典但下面的数值又太大了,于是我查看了一下调用。

fscan二开(一)

发现总共是会被这么几个函数进行调用,这里我们先看scanner.go的后面的咱们再慢慢啃。

打开Plugins/scanner.go 这个文件找到Scan这个函数。

funcScan(info common.HostInfo) {   fmt.Println("start infoscan")   Hosts, err := common.ParseIP(info.Host, common.HostFile, common.NoHosts)if err != nil {      fmt.Println("len(hosts)==0", err)return   }   lib.Inithttp()var ch = make(chanstruct{}, common.Threads)var wg = sync.WaitGroup{}   web := strconv.Itoa(common.PORTList["web"])   ms17010 := strconv.Itoa(common.PORTList["ms17010"])iflen(Hosts) > 0 || len(common.HostPort) > 0 {if common.NoPing == false && len(Hosts) > 1 || common.Scantype == "icmp" {          Hosts = CheckLive(Hosts, common.Ping)          fmt.Println("[*] Icmp alive hosts len is:"len(Hosts))      }if common.Scantype == "icmp" {          common.LogWG.Wait()return   }var AlivePorts []stringif common.Scantype == "webonly" || common.Scantype == "webpoc" {   AlivePorts = NoPortScan(Hosts, common.Ports)   } elseif common.Scantype == "hostname" {         common.Ports = "139"         AlivePorts = NoPortScan(Hosts, common.Ports)   } elseiflen(Hosts) > 0 {         AlivePorts = PortScan(Hosts, common.Ports, common.Timeout)         fmt.Println("[*] alive ports len is:"len(AlivePorts))if common.Scantype == "portscan" {              common.LogWG.Wait()return         }    } iflen(common.HostPort) > 0 {       AlivePorts = append(AlivePorts, common.HostPort...)       AlivePorts = common.RemoveDuplicate(AlivePorts)       common.HostPort = nil       fmt.Println("[*] AlivePorts len is:"len(AlivePorts))   }

这段函数是设置扫描的,根据ip数量来进行不同的扫描以及ip探活和端口扫描。然后我们看一下这里

web := strconv.Itoa(common.PORTList["web"])ms17010 := strconv.Itoa(common.PORTList["ms17010"])
设置webms17010变量并将PORTList里的webms17010的值赋值过去
var severports []string //severports := []string{"21","22","135"."445","1433","3306","5432","6379","9200","11211","27017"...}for _, port := range common.PORTList {       severports = append(severports, strconv.Itoa(port))   }   fmt.Println("start vulscan")for _, targetIP := range AlivePorts {       info.Host, info.Ports = strings.Split(targetIP, ":")[0], strings.Split(targetIP, ":")[1]if common.Scantype == "all" || common.Scantype == "main" {           switch {case info.Ports == "135":               AddScan(info.Ports, info, &ch, &wg) //findnetif common.IsWmi {                   AddScan("1000005", info, &ch, &wg) //wmiexec               }case info.Ports == "445":               AddScan(ms17010, info, &ch, &wg) //ms17010               //AddScan(info.Ports, info, ch, &wg)  //smb               //AddScan("1000002", info, ch, &wg) //smbghostcase info.Ports == "9000":               AddScan(web, info, &ch, &wg)        //http               AddScan(info.Ports, info, &ch, &wg) //fcgiscancase IsContain(severports, info.Ports):               AddScan(info.Ports, info, &ch, &wg) //plugins scan           default:               AddScan(web, info, &ch, &wg) //webtitle               }       } else {           scantype := strconv.Itoa(common.PORTList[common.Scantype])           AddScan(scantype, info, &ch, &wg)           }      }  }for _, url := range common.Urls {      info.Url = url      AddScan(web, info, &ch, &wg)  }  wg.Wait()  common.LogWG.Wait()  close(common.Results)  fmt.Printf("已完成 %v/%vn", common.End, common.Num)}
这一段里的switch函数就是根据扫描到的端口进行漏洞扫描。
fscan二开(一)
例如这里就是扫描到445端口然后把参数传输到addscan函数,这里的addscan函数就是用来漏洞扫描的。
再看一下AddScan函数,根据之前的调用这里假设我们传参是445的,这里scantype的值就是msf17010然后根据运行顺序,将scantype的值传输到ScanFunc函数。再跟进一下这个函数。
funcAddScan(scantype string, info common.HostInfo, ch *chanstruct{}, wg *sync.WaitGroup) {   *ch <- struct{}{}   wg.Add(1)gofunc() {       Mutex.Lock()       common.Num += 1       Mutex.Unlock()       ScanFunc(&scantype, &info)       Mutex.Lock()       common.End += 1       Mutex.Unlock()       wg.Done()       <-*ch   }()}
这里是通过namePluginList里找到对应的值再将info转换类型并封装
funcScanFunc(name *string, info *common.HostInfo) {    f := reflect.ValueOf(PluginList[*name])    in := []reflect.Value{reflect.ValueOf(info)}    f.Call(in)}
根据这些来看,我个人感觉PORTList里部分数值应该是设置的编号,然后根据编号指定到PluginList找对应的文件进行扫描。查看Plugins/base.go 中的PluginList函数。
var PluginList = map[string]interface{}{   ......   // 省略部分以简洁展示"9000":    FcgiScan,"11211":   MemcachedScan,"27017":   MongodbScan,"1000001": MS17010,"1000002": SmbGhost,"1000003": WebTitle,"1000004": SmbScan2,"1000005": WmiExec,}
在依据该文件夹下的其他文件,咱们打开ftp.go这个文件。
fscan二开(一)
发现有ftp的匿名登录和根据之前说的用户名字典和密码字典进行破解的。由此可以得知PORTList是用于根据指定端口和编号分配到指定文件然后进行对应的暴力破解和漏洞扫描的。
fscan二开(一)
这下咱就把一个大体的流程给整明白了,后面咱们就针对性的增加一些功能或更改为可免杀的。到时候研究时间可能会有点长望谅解,毕竟哥们这水平有限给求诸位师傅给哥们点时间orz。

上述内容仅为个人拙见,如有问题敬请斧正。

原文始发于微信公众号(FTC安全):fscan二开(一)

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年1月15日18:56:16
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   fscan二开(一)https://cn-sec.com/archives/3633254.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息