mirror of
https://github.com/shadow1ng/fscan.git
synced 2025-09-14 14:06:44 +08:00
refactor: 重构Memcached和RabbitMQ插件使用统一发包控制
- 修改Memcached插件,在TCP连接和服务识别中添加发包控制 - 修改RabbitMQ插件,在AMQP连接、HTTP连接和管理接口中添加发包控制 - 统一包计数逻辑,确保TCP连接成功和失败都正确计数 - 保持现有缓存服务和消息队列检测功能
This commit is contained in:
parent
98a9a4e1c2
commit
36f0e5076d
@ -59,12 +59,21 @@ func (p *MemcachedPlugin) Scan(ctx context.Context, info *common.HostInfo) *Scan
|
||||
|
||||
func (p *MemcachedPlugin) connectToMemcached(ctx context.Context, info *common.HostInfo) net.Conn {
|
||||
target := fmt.Sprintf("%s:%s", info.Host, info.Ports)
|
||||
|
||||
// 检查发包限制
|
||||
if canSend, reason := common.CanSendPacket(); !canSend {
|
||||
common.LogError(fmt.Sprintf("Memcached连接 %s 受限: %s", target, reason))
|
||||
return nil
|
||||
}
|
||||
|
||||
timeout := time.Duration(common.Timeout) * time.Second
|
||||
|
||||
conn, err := net.DialTimeout("tcp", target, timeout)
|
||||
if err != nil {
|
||||
common.IncrementTCPFailedPacketCount()
|
||||
return nil
|
||||
}
|
||||
common.IncrementTCPSuccessPacketCount()
|
||||
|
||||
conn.SetDeadline(time.Now().Add(timeout))
|
||||
|
||||
@ -100,6 +109,16 @@ func (p *MemcachedPlugin) testBasicCommand(conn net.Conn) bool {
|
||||
func (p *MemcachedPlugin) identifyService(ctx context.Context, info *common.HostInfo) *ScanResult {
|
||||
target := fmt.Sprintf("%s:%s", info.Host, info.Ports)
|
||||
|
||||
// 检查发包限制
|
||||
if canSend, reason := common.CanSendPacket(); !canSend {
|
||||
common.LogError(fmt.Sprintf("Memcached识别 %s 受限: %s", target, reason))
|
||||
return &ScanResult{
|
||||
Success: false,
|
||||
Service: "memcached",
|
||||
Error: fmt.Errorf("发包受限: %s", reason),
|
||||
}
|
||||
}
|
||||
|
||||
conn := p.connectToMemcached(ctx, info)
|
||||
if conn == nil {
|
||||
return &ScanResult{
|
||||
|
@ -90,15 +90,27 @@ func (p *RabbitMQPlugin) Scan(ctx context.Context, info *common.HostInfo) *plugi
|
||||
func (p *RabbitMQPlugin) testAMQPProtocol(ctx context.Context, info *common.HostInfo) *plugins.Result {
|
||||
target := fmt.Sprintf("%s:%s", info.Host, info.Ports)
|
||||
|
||||
// 检查发包限制
|
||||
if canSend, reason := common.CanSendPacket(); !canSend {
|
||||
common.LogError(fmt.Sprintf("RabbitMQ AMQP连接 %s 受限: %s", target, reason))
|
||||
return &plugins.Result{
|
||||
Success: false,
|
||||
Service: "rabbitmq",
|
||||
Error: fmt.Errorf("发包受限: %s", reason),
|
||||
}
|
||||
}
|
||||
|
||||
// 连接到AMQP端口
|
||||
conn, err := net.DialTimeout("tcp", target, time.Duration(common.Timeout)*time.Second)
|
||||
if err != nil {
|
||||
common.IncrementTCPFailedPacketCount()
|
||||
return &plugins.Result{
|
||||
Success: false,
|
||||
Service: "rabbitmq",
|
||||
Error: err,
|
||||
}
|
||||
}
|
||||
common.IncrementTCPSuccessPacketCount()
|
||||
defer conn.Close()
|
||||
|
||||
// 设置超时
|
||||
@ -174,6 +186,12 @@ func min(a, b int) int {
|
||||
}
|
||||
|
||||
func (p *RabbitMQPlugin) testCredential(ctx context.Context, info *common.HostInfo, cred plugins.Credential) bool {
|
||||
// 检查发包限制
|
||||
if canSend, reason := common.CanSendPacket(); !canSend {
|
||||
common.LogError(fmt.Sprintf("RabbitMQ HTTP连接 %s:%s 受限: %s", info.Host, info.Ports, reason))
|
||||
return false
|
||||
}
|
||||
|
||||
baseURL := fmt.Sprintf("http://%s:%s", info.Host, info.Ports)
|
||||
|
||||
client := &http.Client{
|
||||
@ -190,8 +208,10 @@ func (p *RabbitMQPlugin) testCredential(ctx context.Context, info *common.HostIn
|
||||
|
||||
resp, err := client.Do(req)
|
||||
if err != nil {
|
||||
common.IncrementTCPFailedPacketCount()
|
||||
return false
|
||||
}
|
||||
common.IncrementTCPSuccessPacketCount()
|
||||
defer resp.Body.Close()
|
||||
|
||||
return resp.StatusCode == 200
|
||||
@ -217,6 +237,17 @@ func (p *RabbitMQPlugin) identifyService(ctx context.Context, info *common.HostI
|
||||
// testManagementInterface 检测RabbitMQ管理界面
|
||||
func (p *RabbitMQPlugin) testManagementInterface(ctx context.Context, info *common.HostInfo) *plugins.Result {
|
||||
target := fmt.Sprintf("%s:%s", info.Host, info.Ports)
|
||||
|
||||
// 检查发包限制
|
||||
if canSend, reason := common.CanSendPacket(); !canSend {
|
||||
common.LogError(fmt.Sprintf("RabbitMQ管理接口 %s 受限: %s", target, reason))
|
||||
return &plugins.Result{
|
||||
Success: false,
|
||||
Service: "rabbitmq",
|
||||
Error: fmt.Errorf("发包受限: %s", reason),
|
||||
}
|
||||
}
|
||||
|
||||
baseURL := fmt.Sprintf("http://%s:%s", info.Host, info.Ports)
|
||||
|
||||
client := &http.Client{
|
||||
@ -234,12 +265,14 @@ func (p *RabbitMQPlugin) testManagementInterface(ctx context.Context, info *comm
|
||||
|
||||
resp, err := client.Do(req)
|
||||
if err != nil {
|
||||
common.IncrementTCPFailedPacketCount()
|
||||
return &plugins.Result{
|
||||
Success: false,
|
||||
Service: "rabbitmq",
|
||||
Error: err,
|
||||
}
|
||||
}
|
||||
common.IncrementTCPSuccessPacketCount()
|
||||
defer resp.Body.Close()
|
||||
|
||||
var banner string
|
||||
|
Loading…
Reference in New Issue
Block a user