mirror of
https://github.com/shadow1ng/fscan.git
synced 2025-07-13 21:02:44 +08:00
fix: 修复了RDP的一个死锁问题
This commit is contained in:
parent
df4d39fb1f
commit
d13e1952e9
@ -38,38 +38,84 @@ func RdpScan(info *Common.HostInfo) (tmperr error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
wg sync.WaitGroup
|
wg sync.WaitGroup
|
||||||
signal bool
|
num = 0
|
||||||
num = 0
|
all = len(Common.Userdict["rdp"]) * len(Common.Passwords)
|
||||||
all = len(Common.Userdict["rdp"]) * len(Common.Passwords)
|
mutex sync.Mutex
|
||||||
mutex sync.Mutex
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// 创建任务通道
|
// 创建任务通道和结果通道
|
||||||
brlist := make(chan Brutelist)
|
brlist := make(chan Brutelist)
|
||||||
|
resultChan := make(chan bool)
|
||||||
|
|
||||||
port, _ := strconv.Atoi(info.Ports)
|
port, _ := strconv.Atoi(info.Ports)
|
||||||
|
|
||||||
// 启动工作协程
|
// 启动工作协程
|
||||||
for i := 0; i < Common.BruteThreads; i++ {
|
for i := 0; i < Common.BruteThreads; i++ {
|
||||||
wg.Add(1)
|
wg.Add(1)
|
||||||
go worker(info.Host, Common.Domain, port, &wg, brlist, &signal, &num, all, &mutex, Common.Timeout)
|
go func() {
|
||||||
|
defer wg.Done()
|
||||||
|
for one := range brlist {
|
||||||
|
select {
|
||||||
|
case <-resultChan: // 检查是否已经找到有效凭据
|
||||||
|
return
|
||||||
|
default:
|
||||||
|
}
|
||||||
|
|
||||||
|
mutex.Lock()
|
||||||
|
num++
|
||||||
|
mutex.Unlock()
|
||||||
|
|
||||||
|
user, pass := one.user, one.pass
|
||||||
|
flag, err := RdpConn(info.Host, Common.Domain, user, pass, port, Common.Timeout)
|
||||||
|
|
||||||
|
if flag && err == nil {
|
||||||
|
// 连接成功
|
||||||
|
var result string
|
||||||
|
if Common.Domain != "" {
|
||||||
|
result = fmt.Sprintf("[+] RDP %v:%v:%v\\%v %v", info.Host, port, Common.Domain, user, pass)
|
||||||
|
} else {
|
||||||
|
result = fmt.Sprintf("[+] RDP %v:%v:%v %v", info.Host, port, user, pass)
|
||||||
|
}
|
||||||
|
Common.LogSuccess(result)
|
||||||
|
select {
|
||||||
|
case resultChan <- true: // 通知其他goroutine找到了有效凭据
|
||||||
|
default:
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// 连接失败
|
||||||
|
errlog := fmt.Sprintf("[-] (%v/%v) RDP %v:%v %v %v %v", num, all, info.Host, port, user, pass, err)
|
||||||
|
Common.LogError(errlog)
|
||||||
|
}
|
||||||
|
}()
|
||||||
}
|
}
|
||||||
|
|
||||||
// 分发扫描任务
|
// 分发扫描任务
|
||||||
for _, user := range Common.Userdict["rdp"] {
|
go func() {
|
||||||
for _, pass := range Common.Passwords {
|
for _, user := range Common.Userdict["rdp"] {
|
||||||
pass = strings.Replace(pass, "{user}", user, -1)
|
for _, pass := range Common.Passwords {
|
||||||
brlist <- Brutelist{user, pass}
|
pass = strings.Replace(pass, "{user}", user, -1)
|
||||||
|
select {
|
||||||
|
case <-resultChan: // 如果已经找到有效凭据,停止分发任务
|
||||||
|
return
|
||||||
|
case brlist <- Brutelist{user, pass}:
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
close(brlist)
|
||||||
close(brlist)
|
}()
|
||||||
|
|
||||||
// 等待所有任务完成
|
// 等待任务完成或找到有效凭据
|
||||||
go func() {
|
go func() {
|
||||||
wg.Wait()
|
wg.Wait()
|
||||||
signal = true
|
close(resultChan)
|
||||||
}()
|
}()
|
||||||
for !signal {
|
|
||||||
|
// 等待结果
|
||||||
|
if <-resultChan {
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
return tmperr
|
return tmperr
|
||||||
|
Loading…
Reference in New Issue
Block a user