执行过程大体如下:runC启动并加入到容器的命名空间,接着以自身("/proc/self/exe")为范本启动一个子进程,最后通过exec系统调用执行用户指定的二进制程序。...4. upload_runtime通过/proc/self/exe读取runC二进制文件,并将其发送给远程服务器。...用户在启动容器时应调用一个指向/proc/self/exe的进程(如docker exec whoc_ctr/proc/self/exe),使runC在容器内重新执行自己。...3. upload_runtime会通过/proc/self/exe获取runC二进制文件并将其发送至远程服务器。.../self/exe */ /* 作为运行时进程的动态链接时,可以通过/proc/self/exe访问到文件描述符 */ runtime_fd =open("/proc/self
except psutil.NoSuchProcess: pass sleep(15) 使用while是因为不用的话,进程会自己结束,然后就没有然后了。...', 'QQMusic.exe', 'QQImage.exe'} #List里面无法直接变成小写,具体可以Google while active == 1 : for proc in psutil.process_iter...): self.active = False self.processes_to_kill = {'AdobeARM.exe', 'acrotray.exe', 'CoreSync...proc in psutil.process_iter(): try: if proc.name() in self.processes_to_kill...for proc in psutil.process_iter(): try: if proc.name() in self.processes_to_kill
/proc/self/exe,这样的话,当某个程序调用/bin/sh的时候,就会调用自身 // First we overwrite /bin/sh with the /proc/self/exe interpreter.../proc/self/exe") err = fd.Close() if err !.../self/exe lrwxrwxrwx 1 root root 0 Jun 19 15:30 /proc/self/exe -> /bin/ls* 步骤2:寻找runc的pid // Loop through.../10/exe lrwxrwxrwx 1 root root 0 Jun 19 15:18 /proc/10/exe -> /bin/bash* 步骤4:当用户调用docker exec的时候,相当于.../proc/self/exe,即runc运行自身,而runc自身也被我们修改了,所以相当于runc执行了我们的代码 Reference https://thinkycx.me/posts/2019-05
若规则过严,会导致大量误报,影响业务运行;若规则过宽,则会漏过真正的攻击。缺乏上下文感知的行为分析,使得防御系统在面对高度模仿正常行为的攻击时显得捉襟见肘。...他们缺乏对“软件使用场景”风险的认知,不理解合法的工具在错误的配置或被恶意引导下同样具有破坏力。这种认知盲区使得用户在面对精心伪装的钓鱼邮件时,极易主动配合攻击者完成入侵过程。..."anydesk.exe", "teamviewer.exe", "psexec.exe" ] # 定义可疑命令行特征 (正则) self.suspicious_patterns...return self.process_cache[pid] for proc in self.c.Win32_Process(ProcessId=pid): ...parent_id = proc.ParentProcessId for p_proc in self.c.Win32_Process(ProcessId=parent_id
还一个 /proc/pid/exe 文件,这个文件指向进程本身的可执行文件。而/proc/self目录则是读取进程本身的信息接口,是一个link,链接到当前正在运行的进程。...我们需要特别注意的是,在execve()替换旧的进程时,是不会修改/proc/pid/fd目录中的文件描述符的,新的可执行文件会继承原进程的文件描述符,包括打开的文件。...所以我们如果想要覆写exe这个可执行文件就必须等到runc运行结束。什么时候会结束呢?当我们运行execve()去运行新的可执行文件时。...中寻找pid[runc] --> 通过 open(/proc/pid[runc]/exe)获取可执行文件的fd --> 与此同时在/proc/self/fd中会生成并保留该可执行文件的fd --> 等待执行新的文件导致.../proc/self/exe")err = fd.Close()if err !
): try: Free = subprocess.Popen("engine.exe -s {} -p {} -k vfs.fs.size[/,pfree]".format(self.addr...try: command = "get.exe -s {0} -p {1} -k {2}".format(self.address,self.port,key)....: Command = "get.exe -s {} -p {} -k system.hostname".format(self.addr,self.port)...: return 0 def GetCPUInfo(self): try: Command = "get.exe -s {} -p...{} -k system.cpu.util".format(self.addr, self.port) proc = subprocess.Popen(Command, shell
self....stdout = proc.stdout stderr = proc.stderr tasks = [None, None, None]...上面的代码在实际使用中发现,对于很快执行完的命令,如:ifconfig等,使用上没什么问题,但是如果输入python命令进入交互式界面,就会卡住没有任务输入。...= cmdline[0] if exe[0] !...return await self.
运行机制 根据漏洞CVE-2019-5736的描述,传统的Linux容器运行时环境会将自身通过/proc/self/exe运行的这一个情况暴露给容器,让容器所知晓。...1、whoc镜像入口点设置为/proc/self/exe,镜像的动态链接器ld.so会被upload_runtime替换。 2、当镜像开始运行之后,容器运行时会在容器内进行重新执行。...4、upload_runtime将通过/proc/self/exe读取运行时代码,并将其发送至配置好的远程服务器。...2、用户需要在whoc容器中执行,并调用一个指向/proc/self/exe的文件(例如“docker exec whoc_ctr /proc/self/exe”)。...4、upload_runtime通过/proc/$runtime-pid/exe读取运行时代码,并将其发送至配置好的远程服务器。
执行过程大体如下:runC启动,加入到容器的命名空间,接着以自身/proc/self/exe为范本启动一个子进程,最后执行用户指定的二进制程序。.../self/exe init 24 root 0:00 ps aux shell1[ctr]# ls /proc/18/fd -la total 0 # 省略... lr-x----...然而,在runc init执行execve重新执行/proc/self/exe(自身)后,non-dumpable的属性被去掉,从这里开始,容器内的攻击者便可以利用/proc/[runc-PID]/exe...方案二对于用户空间尝试修改runC的行为是有效的,然而,由于容器内/proc/self/exe依然指向宿主机上的runC程序,且内核漏洞DirtyPipe并未受到前述只读挂载的限制,容器内攻击者就可以利用...下面是进行ELF文件注入的代码示例,该示例将载荷注入到了原ELF文件程序入口地址(Entrypoint,下文简称EP)的位置: runc_fd_read = open("/proc/self/exe",
那有什么办法呢? 看来只能把 /proc/self/exe 这个神器请出来了。...对于 /proc/self ,当进程访问这个神奇的符号链接时,可以解析到进程自己的 /proc/[pid] 目录。...合起来就是,当进程访问 /proc/self/exe 时,可以运行一个对应进程自身的二进制文件。 这有什么用呢?...同样当执行 go run main.go run echo hello 时,会创建出 main 进程, main 进程内执行 /proc/self/exe child echo hello 命令创建出一个新的...也就是说,exe 进程可以拥有和 main 进程不同的主机名,彼此互不干扰。 进程访问 /proc/self/exe 代表着运行对应进程自身的二进制文件。
在 Linux 系统中,/proc//exe 文件是一个特殊的符号链接文件,它指向当前正在运行的进程所执行的可执行文件。...cp /proc//exe /tmp/recovered_bin 恢复已删除的进程的实践 下面以sleep命令来模拟一个已从磁盘中删除的进程。.../13499/exe lrwxrwxrwx 1 root root 0 7月 21 16:39 /proc/13499/exe -> '/tmp/x (deleted)' # root @ ubuntu...in /tmp [16:39:20] $ ls /tmp/x ls: cannot access '/tmp/x': No such file or directory 我们用cp恢复 cp /proc...不要急于行动,因为这样会破坏关键数据。
当一个进程运行时,它自己可以通过/proc/self/exe得到指向自己的链接,也可以进一步在/proc目录下找到自己的 fd。...一个恶意构建的镜像可以将自己的入口改成/proc/self/exe,由于容器入口需要通过 runc 来 clone+execve 启动,这样就使得一个普通的用户容器,访问并执行了主机上的 runc。...环境变量,迫使 runc 优先使用改造过的.so文件,而这个.so的作用,就是改写/proc/self/exe指向的文件,即主机上的 runc。...在这个漏洞中,我们可以看到它需要满足几个条件: 容器能够通过入口/proc/self/exe指向主机中的 runc 容器允许用户自行任意指定,将其中的恶意代码伪装成普通文件 容器中的用户 UID 在主机中的映射...clone,避免了/proc/self/exe指向主机 runc 的问题。
/self/exe,他始终指向当前正在运行的进程,所以可以很方便的使用它来愉快的套娃了。...在上边的UTS namespace中我们有使用到/proc/self/exe,它指向的是我们当前的运行进程。为了更方便的进行下面的pid介绍,先简单介绍下linux的/proc目录和pid是什么。...pid,而/proc/self指向的就是当前运行的进程!.../exe、我们的容器、zsh、和当前的ps,让我们来尝试一下PID namespace,预期中exe会变成我们的init进程(pid = 1)。...[容器] func run() { fmt.Printf("Running run %v\n", os.Args[2:]) cmd := exec.Command("/proc/self/exe",
同时,我们还能直接使用PyInstaller、Nuitka、cx_Freeze等Python第三方程序打包模块,将编写好桌面图形界面程序打包为各个平台的二进制可执行程序文件,比如Windows下的exe...通常我们会将程序按需打包为单个的exe可执行文件或包含整个文件夹的可执行文件。 程序更新 随着版本的迭代和功能的优化,我们编写的程序会需要进行更新。...程序文件的下载,我们可以直接使用requests模块,示例代码如下所示: def work(self): # 新建一个文件对象 temp_file = os.path.join(self.download_path...chunk in f.iter_content(chunk_size=self.buffer): if not chunk: break self.fileobj.seek...for proc in psutil.process_iter(): if proc.name() == 'xxx.exe': proc.kill()
然后,/proc/$pid/exe句柄可用于覆盖主机二进制文件,具体见CVE-2019-5736。...攻击方式3a是攻击方式1的变种,区别在于覆盖主机二进制文件,其中设置了一个恶意镜像来执行/proc/self/fd/7……/bin/bash,运行shell脚本覆盖/proc/self/exe,重写/bin.../$pid/exe以访问主机二进制文件并覆盖它。...具体来说,在容器启动过程中,runC会设置容器的Cgroup信息,runC run 命令会创建一个用于操作 Cgroup 的接口类型对象 cgroups.Manager,根据runC 操作 Cgroup...在容器中会产生当前工作目录(cwd)形如 /proc/self/fd/ 的进程。 2.
: def init(self): uname = os.uname() if uname[0] == "FreeBSD": self.proc...= '/compat/linux/proc' else: self.proc = '/proc' def path(self, *args): return...os.path.join(self.proc, *(str(a) for a in args)) def open(self, *args): try: return open...= os.path.basename(path) cmd = proc.open(pid, 'status').readline()[6:-1] if exe.startswith(cmd):...= 2: sys.exit(1) def get_memory_usage( pids_to_show, split_args, include_self=False, only_self
/proc/[PID]/exe:它是一种特殊的符号链接,又被称为magic links(为什么将这类符号链接叫做magic links呢?.../proc/self/exe; 2 持续遍历容器内/proc目录,读取每一个/proc/[PID]/cmdline,对"runc"做字符串匹配,直到找到runc进程号; 3 以只读方式打开/proc/[.../proc/self/exe,因此实际上将执行宿主机上的runc,而runc也已经在第4部中被我们覆盖掉了。...附录:为什么将/proc下的符号链接称为magic links? ? 我们知道,/proc目录下有许多符号链接,例如/proc/[PID]/exe和/proc/[PID]/cwd。...如上图,我们创建了一个普通符号链接,可以看到它的文件长度为目标文件名的长度,即6;但/proc/self/exe的长度却是0,而非其所指目标文件/bin/ls名称的长度。
MAX_PATH]; GetModuleFileNameA(NULL, module_name, MAX_PATH); 以项目D:/test为例,则调用该接口后module_name存储的是text.exe...文件的绝对路径:module_name="D:/test/Debug/test.exe" Linux系统 Linux系统中有个符号链接:/proc/self/exe,它代表当前程序。...调用示例: char link[MAX_PATH]; readlink("/proc/self/exe", link, MAX_PATH); link存储当前进程的绝对路径。