2018年的第一天,祝大家365天元气满满!
话不多说,先打响新年第一炮(不好意思,我又污了=.=)
***本系列内容仅用于技术分享,请勿对号入座***
之前有讲过要分享一些云平台渗透的经验,其中最有意思的就属这个python shell了。
首先经过fuzzing发现了这样一个console口:
根据路径判断,这个应该是python的交互式shell,也就是我们平时在cmd命令行敲“python”之后出来的一个console,试了一下,果然是:
但是执行系统命令的时候就返回不正常了,要么是0,要么是256,这里如果为0就是执行成功了,如果是256则对应LINUX的错误码1,其含义是:
这里简单说一下python中的os.system(cmd)的返回值与linux命令返回值的关系:
大家都习惯用os.systemv()函数执行linux命令,该函数的返回值十进制数(分别对应一个16位的二进制数)。
该函数的返回值与linux命令返回值两者的转换关系为:该函数的返回值(十进制)转化成16二进制数,截取其高八位(如果低位数是0的情况下,有关操作系统的错误码共131个,所以低位都是零),然后转乘十进制数即为 linux命令返回值0。
例如:
os.system()返回值为0àlinux命令返回值也为0.
os.system()返回值为256,十六位二进制数示为:00000001,00000000,高八位转乘十进制为 1à对应linux命令返回值 1
os.system()返回值为512,十六位二进制数示为:00000010,00000000,高八位转乘十进制为 2à对应linux命令返回值 2
......
os.system()返回值为32512,十六位二进制数示为:01111111,00000000,高八位转乘十进制为 127à对应linux命令返回值 127
........
或者简单说,linux命令返回码 左移8位,然后转换成十进制就变成了os.system()函数的返回值了。
此外关于linux的错误返回码(不含0,0表示成功)代表的含义,可以参照文末最后的附表。
下面重点来了,能不能通过移位的方式来获取可见的返回值呢,这里大家可以自己去尝试,涉及到进制转换以及移位操作,在此不再赘述。
但是除此之外还有其他办法吗?答案是肯定的。话不多说,直接上:subprocess
关于这个模块,可以参考python2.7官方的说明:
https://docs.python.org/2.7/library/subprocess.html
我们来看下官方对于这模块是怎么说的:
首先,subprocess允许我们新开一个进程,并且是可以替代os.system的!那么就尝试一下:
成功了!由此我们得到了一个带回显的交互式python shell,而且权限是root,省去了不少提权的工作:
细心的朋友会发现,我自己电脑上用os.system执行命令,都是直接回显的哇,确实是:
在这里我想说的是渗透领域的经典逻辑:一切漏洞看场景。
我猜测的原因是这样的,云平台的这个系统考虑到了debug接口可能造成的远程命令执行的危害,于是在服务器端限制了该模块的执行权限,所以我们在执行一些敏感命令的时候返回的是不被允许。
当然绝对不止着一种原因,如果你在其他环境中找到了类似的情况,并寻觅到了原因,也可以反馈给我,我们一起探讨。
附表:linux错误码含义
领取专属 10元无门槛券
私享最新 技术干货