首页  编辑  

Powershell简单的后门/服务器监听程序

Tags: /计算机文档/脚本,批处理/   Date Created:
下面是一个简单的Powershell实现的端口监听程序,可以稍微改造一下变成一个后门:
# 每次运行脚本时重置 keepRunning 变量
$global:keepRunning = $true
$listener = $null

# 定义异常处理,捕获 Ctrl+C
trap {
    Write-Host "`nCtrl+C pressed, stopping server..."

    # 尝试关闭监听器并释放端口
    if ($listener -ne $null -and $listener.Server.Connected) {
        $listener.Stop()
        Write-Host "Listener stopped, port 8080 freed."
    }

    $global:keepRunning = $false
    continue
}

# 启动 TCP 监听器并监听 8080 端口
try {
    $listener = [System.Net.Sockets.TcpListener]::new(8080)
    $listener.Start()
    Write-Host "Server is listening on port 8080..."

    # 无限循环以接受多个客户端连接
    while ($global:keepRunning) {
        if ($listener.Pending()) {
            # 接受客户端连接
            $client = $listener.AcceptTcpClient()
            Write-Host "Client connected from $($client.Client.RemoteEndPoint)"

            # 创建新的 Runspace 来处理客户端连接
            $runspace = [powershell]::Create().AddScript({
                param ($client, $consoleUI)

                function Handle-Client {
                    param ($client, $consoleUI)

                    # 获取网络流
                    $stream = $client.GetStream()
                    $reader = New-Object System.IO.StreamReader($stream)
                    $writer = New-Object System.IO.StreamWriter($stream)
                    $writer.AutoFlush = $true # 自动刷新输出流

                    $consoleUI.WriteLine("Client handler started for $($client.Client.RemoteEndPoint)")

                    try {
                        while ($true) {
                            # 尝试读取数据
                            if ($stream.DataAvailable) {
                                $data = $reader.ReadLine()

                                # 如果客户端断开连接或读取到空数据,退出循环
                                if ([string]::IsNullOrEmpty($data)) {
                                    $consoleUI.WriteLine("Client disconnected or sent empty data.")
                                    break
                                }

                                $consoleUI.WriteLine("Received from client: $data")
                                $writer.WriteLine("Echo: $data")
                            } else {
                                Start-Sleep -Milliseconds 100
                            }
                        }
                    } catch {
                        $consoleUI.WriteLine("Error while handling client: $_")
                    } finally {
                        # 确保关闭客户端连接
                        if ($client.Connected) {
                            $client.Close()
                        }
                        $consoleUI.WriteLine("Client disconnected.")
                    }
                }

                # 调用 Handle-Client
                Handle-Client $client $consoleUI
            }).AddArgument($client).AddArgument($Host.UI)  # 传递主线程的 Host.UI 对象

            # 启动 Runspace
            $runspace.BeginInvoke() | Out-Null
        } else {
            Start-Sleep -Milliseconds 100  # 如果没有客户端连接,避免 CPU 占用过高
        }
    }

} catch {
    Write-Host "Server encountered an error: $_"
} finally {
    if ($listener -ne $null) {
        $listener.Stop()
        Write-Host "Listener stopped, port 8080 freed."
    }
}

Write-Host "Server stopped."