mirror of
https://github.com/pewdiepie-archdaemon/odysseus.git
synced 2026-06-21 20:25:23 -04:00
59 lines
2.4 KiB
Python
59 lines
2.4 KiB
Python
import shlex
|
|
from pathlib import Path
|
|
|
|
|
|
ROOT = Path(__file__).resolve().parents[1]
|
|
RUNNING_JS = ROOT / "static" / "js" / "cookbookRunning.js"
|
|
|
|
|
|
def _between(source, start, end):
|
|
start_idx = source.index(start)
|
|
end_idx = source.index(end, start_idx)
|
|
return source[start_idx:end_idx]
|
|
|
|
|
|
def test_windows_graceful_kill_reuses_recursive_stop_tree_helper():
|
|
source = RUNNING_JS.read_text(encoding="utf-8")
|
|
wrapper = _between(source, "function _winPowerShellCmd(task, ps)", "function _winSessionStopTreePs(task)")
|
|
helper = _between(source, "function _winSessionStopTreePs(task)", "function _tmuxGracefulKill(task)")
|
|
graceful = _between(source, "function _tmuxGracefulKill(task)", "function _shQuote(value)")
|
|
win_session = _between(source, "function _winSessionCmd(task, tmuxArgs)", "function _winPowerShellCmd(task, ps)")
|
|
|
|
assert "function Stop-Tree([int]$Id)" in helper
|
|
assert "('ParentProcessId = ' + $Id)" in helper
|
|
assert "Stop-Tree ([int]$p)" in helper
|
|
assert "${_shQuote(command)}" in wrapper
|
|
assert "_winSessionStopTreePs(task)" in win_session
|
|
assert "_winPowerShellCmd(task, ps)" in win_session
|
|
assert "_winSessionStopTreePs(task)" in graceful
|
|
assert "_winPowerShellCmd(task, ps)" in graceful
|
|
assert "Stop-Process -Id $p -Force" not in graceful
|
|
assert '-Filter "ParentProcessId = $Id"' not in helper
|
|
assert 'powershell -Command \\\\"${ps}\\\\"' not in source
|
|
|
|
|
|
def _posix_quote(value):
|
|
return "'" + value.replace("'", "'\\''") + "'"
|
|
|
|
|
|
def test_remote_windows_stop_tree_payload_survives_shell_parsing():
|
|
ps = (
|
|
"function Stop-Tree([int]$Id) { "
|
|
"Get-CimInstance Win32_Process -Filter ('ParentProcessId = ' + $Id) "
|
|
"-ErrorAction SilentlyContinue | ForEach-Object { Stop-Tree ([int]$_.ProcessId) }; "
|
|
"Stop-Process -Id $Id -Force -ErrorAction SilentlyContinue }; "
|
|
"$p = Get-Content '$env:TEMP\\odysseus-sessions\\serve_abc.pid' "
|
|
"-ErrorAction SilentlyContinue; "
|
|
"if ($p -match '^\\d+$') { Stop-Tree ([int]$p) }"
|
|
)
|
|
remote_command = f'powershell -Command "{ps}"'
|
|
shell_command = f"ssh -p 2222 winbox {_posix_quote(remote_command)}"
|
|
|
|
argv = shlex.split(shell_command)
|
|
|
|
assert argv == ["ssh", "-p", "2222", "winbox", remote_command]
|
|
assert "$Id" in argv[-1]
|
|
assert "$_.ProcessId" in argv[-1]
|
|
assert "$env:TEMP" in argv[-1]
|
|
assert "$p" in argv[-1]
|