Windows-Gast-Agent: vm.port_scan-Handler (Get-NetTCPConnection/UDP) — #16-Shape spiegeln #27

Closed
opened 2026-06-01 21:07:05 +00:00 by chinux · 0 comments
Owner

Ziel

Windows-VM-Ports lokal im Gast scannen — analog zu #16 (Linux ss, jetzt drin mit VM-Guest-Agent 1.7.0). Statt externem nmap vom Node liefert der Windows-Gast seine lauschenden Ports inkl. Prozess & Exposure.

Wichtig: #16 ist command-getrieben (nicht im periodischen Frame)

Der Linux-Agent beantwortet einen vm.port_scan-Command (VM-Guest-Agent/src/main.rs:448):

"vm.port_scan" => {
    let ports = collect_ports().await;
    send(&cw, json!({
        "type":"command_result","id":cmd_id,"status":"ok",
        "data": {"scanner":"ss","ports":ports},
    })).await;
}

Entry-Shape (aus VM-Guest-Agent/src/collect/linux.rs:299), sortiert nach (protocol, port):

{ "protocol":"tcp", "port":3389, "address":"0.0.0.0", "process":"svchost", "exposure":"public", "state":"open" }

exposure_for (collect/mod.rs:118): 127.0.0.1/::1"local", alles andere → "public".

Der Backend-Ingest + das Senden des vm.port_scan-Commands existieren bereits (durch #16). Der Windows-Agent hat aber keinen vm.port_scan-Arm (Windows-VM-Guest-Agent/src/main.rs:264 match, fällt in _ => bei Z. 335) → liefert keine Ports. Kein Backend-Change nötig.

Soll (reiner Windows-Agent)

1. Windows-VM-Guest-Agent/src/collect.rs: collect_ports()

Neue pub async fn collect_ports() -> Value via run_ps, exakt dieselbe Entry-Shape wie Linux. PowerShell:

$tcp = Get-NetTCPConnection -State Listen -ErrorAction SilentlyContinue | ForEach-Object {
  $p=(Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue).ProcessName
  [pscustomobject]@{ protocol='tcp'; port=$_.LocalPort; address=$_.LocalAddress; process=$p }
}
$udp = Get-NetUDPEndpoint -ErrorAction SilentlyContinue | ForEach-Object {
  $p=(Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue).ProcessName
  [pscustomobject]@{ protocol='udp'; port=$_.LocalPort; address=$_.LocalAddress; process=$p }
}
@($tcp + $udp) | ConvertTo-Json -Compress

In Rust parsen, je Entry exposure ableiten (127.0.0.1/::1local, sonst public — identisch zu exposure_for) und "state":"open" setzen, nach (protocol, port) deduplizieren + sortieren. Rückgabe Value::Array.

2. Windows-VM-Guest-Agent/src/main.rs: vm.port_scan-Arm

Im match action.as_str() (Z. 264) vor _ => (Z. 335) ergänzen — 1:1 wie Linux, nur scanner:"powershell":

"vm.port_scan" => {
    let ports = collect_ports().await;
    send(&cw, json!({
        "type":"command_result","id":cmd_id,"status":"ok",
        "data": {"scanner":"powershell","ports":ports},
    })).await;
}

collect_ports zum Import (Z. 18) hinzufügen.

Akzeptanz

  • Backend sendet vm.port_scan an einen Windows-Gast → Antwort enthält data.ports in der #16-Shape (protocol/port/address/process/exposure/state).
  • Port-UI zeigt für Windows-VMs die agent-gemeldeten Ports identisch zu Linux.
  • cargo build für den Windows-Target grün — vor Merge bauen (hier nicht kompiliert).

Branch

feat/win-agent-portscan

## Ziel Windows-VM-Ports lokal **im Gast** scannen — analog zu #16 (Linux `ss`, jetzt drin mit VM-Guest-Agent **1.7.0**). Statt externem nmap vom Node liefert der Windows-Gast seine lauschenden Ports inkl. Prozess & Exposure. ## Wichtig: #16 ist command-getrieben (nicht im periodischen Frame) Der Linux-Agent beantwortet einen **`vm.port_scan`-Command** (`VM-Guest-Agent/src/main.rs:448`): ```rust "vm.port_scan" => { let ports = collect_ports().await; send(&cw, json!({ "type":"command_result","id":cmd_id,"status":"ok", "data": {"scanner":"ss","ports":ports}, })).await; } ``` Entry-Shape (aus `VM-Guest-Agent/src/collect/linux.rs:299`), sortiert nach (protocol, port): ```json { "protocol":"tcp", "port":3389, "address":"0.0.0.0", "process":"svchost", "exposure":"public", "state":"open" } ``` `exposure_for` (`collect/mod.rs:118`): `127.0.0.1`/`::1` → `"local"`, alles andere → `"public"`. **Der Backend-Ingest + das Senden des `vm.port_scan`-Commands existieren bereits (durch #16).** Der Windows-Agent hat aber **keinen `vm.port_scan`-Arm** (`Windows-VM-Guest-Agent/src/main.rs:264` match, fällt in `_ =>` bei Z. 335) → liefert keine Ports. **Kein Backend-Change nötig.** ## Soll (reiner Windows-Agent) ### 1. `Windows-VM-Guest-Agent/src/collect.rs`: `collect_ports()` Neue `pub async fn collect_ports() -> Value` via `run_ps`, **exakt dieselbe Entry-Shape** wie Linux. PowerShell: ```powershell $tcp = Get-NetTCPConnection -State Listen -ErrorAction SilentlyContinue | ForEach-Object { $p=(Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue).ProcessName [pscustomobject]@{ protocol='tcp'; port=$_.LocalPort; address=$_.LocalAddress; process=$p } } $udp = Get-NetUDPEndpoint -ErrorAction SilentlyContinue | ForEach-Object { $p=(Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue).ProcessName [pscustomobject]@{ protocol='udp'; port=$_.LocalPort; address=$_.LocalAddress; process=$p } } @($tcp + $udp) | ConvertTo-Json -Compress ``` In Rust parsen, je Entry `exposure` ableiten (`127.0.0.1`/`::1` → `local`, sonst `public` — identisch zu `exposure_for`) und `"state":"open"` setzen, nach (protocol, port) deduplizieren + sortieren. Rückgabe `Value::Array`. ### 2. `Windows-VM-Guest-Agent/src/main.rs`: `vm.port_scan`-Arm Im `match action.as_str()` (Z. 264) vor `_ =>` (Z. 335) ergänzen — 1:1 wie Linux, nur `scanner:"powershell"`: ```rust "vm.port_scan" => { let ports = collect_ports().await; send(&cw, json!({ "type":"command_result","id":cmd_id,"status":"ok", "data": {"scanner":"powershell","ports":ports}, })).await; } ``` `collect_ports` zum Import (Z. 18) hinzufügen. ## Akzeptanz - Backend sendet `vm.port_scan` an einen Windows-Gast → Antwort enthält `data.ports` in der #16-Shape (protocol/port/address/process/exposure/state). - Port-UI zeigt für Windows-VMs die agent-gemeldeten Ports identisch zu Linux. - `cargo build` für den Windows-Target grün — **vor Merge bauen** (hier nicht kompiliert). ## Branch `feat/win-agent-portscan`
chinux changed title from Windows Agent - Port Scan auf Agent umstellen to Windows-Gast-Agent: lokalen Port-Scan (Get-NetTCPConnection/UDP + Prozess) statt externem nmap 2026-06-01 21:09:56 +00:00
chinux changed title from Windows-Gast-Agent: lokalen Port-Scan (Get-NetTCPConnection/UDP + Prozess) statt externem nmap to Windows-Gast-Agent: vm.port_scan-Handler (Get-NetTCPConnection/UDP) — #16-Shape spiegeln 2026-06-01 21:12:47 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
chinux/theProx#27
No description provided.