借极客RCE ME理解劫持共享so库(webpwn初探)

借极客RCE ME理解劫持共享so库(webpwn初探)

[极客大挑战 2019]RCE ME**

前言:极客rce提供两种方法

记述

昨晚写完网鼎杯的wp;早上起床闲来没事。看到有个极客大挑战没做;就先做了一把;发个博客;理解理解;

第一种

打开网页熟悉的过滤一看就是无数字和字母的rce了;不管那么多,直接写马;

${%fe%fe%fe%fe^%a1%b9%bb%aa}[_](${%fe%fe%fe%fe^%a1%b9%bb%aa}[__]);&_=assert&__=eval($_POST[%27s1mple%27])

先来看看phpinfo;

借极客RCE ME理解劫持共享so库(webpwn初探)_第1张图片

发现有很多函数被禁止了,几乎所有的命令执行都被ban了;蚁剑链接;发现根目录有个flag;读取发现无果;然后有个/readflag,打开发现是二进制文件,需要执行;但是这里我们发现很多的命令执行函数都给ban了;这里我们利用蚁剑的扩展库;进行绕过;

借极客RCE ME理解劫持共享so库(webpwn初探)_第2张图片

刚开始发现我们无法进行目录读取;我们利用扩展库;进行bypass;然后执行/readflag就可以;

借极客RCE ME理解劫持共享so库(webpwn初探)_第3张图片

第二种 利用环境变量 LD_preload + mail劫持共享so(值得深究)【important】webpwn理解初步

第一种走的捷径,其实是非预期解;学到也没有太的意义;接下来分享正解;

蚁剑下载/readflag进行反编译;

借极客RCE ME理解劫持共享so库(webpwn初探)_第4张图片

看到这里有个执行;那就是实锤了就是需要调用/readflag进行文件读取;现在就是绕过限制的问题;LD_PRELOAD是Unix中的一个环境变量,用于定义在程序运行前优先加载的动态链接库,LD和动态库有关,PRELOAD表示预加载,结合起来就是预先加载的动态库。通过这个环境变量,可以覆盖正常的函数库中的函数。也就是说当系统试图调用某函数时,该函数位于特定的共享库(xxx.so)。因此,系统在调用之前将加载xxx.so。换句话说,如果我们可以创建一个xxxxx.so有了同名的函数,就能将其覆盖之。

所以我们率先写入C代码;如下图;

借极客RCE ME理解劫持共享so库(webpwn初探)_第5张图片

将其scp到我们的vps上进行gcc将其生成一个so文件;具体命令gcc -shared -fPIC s1mple.c -o s1mple.so这里的-fPIC 作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code), 则产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加载器加载到内存的任意 位置,都可以正确的执行。这正是共享库所要求的,共享库被加载时,在内存的位置不是固定的;至于__attribute__是C中的一种写法;其语法格式为__attribute__ ((attribute-list))若函数被设定为constructor属性,则该函数会在main()函数执行之前被自动的执行。类似的,若函数被设定为destructor属性,则该函数会在main()函数执行之后或者exit()被调用后被自动的执行

生成之后反下载到本地;然后利用蚁剑上传,linux或者unix默认的上传权限目录是tmp目录,所以我们只能传到这个目录之下;接着我们写入php代码;

借极客RCE ME理解劫持共享so库(webpwn初探)_第6张图片

这里分析一下我们的php代码内容;简单来讲就是get进去三个参数,使服务器可以接收到我们的参数;putenv函数可以设置一个环境变量,仅存活于当前请求期间。 在请求结束时环境会恢复到初始状态。

putenv(string $setting) : bool 如 putenv("LD_PRELOAD"=/tmp/xxxx.so);这就会设置好我们预定的环境变量;我们看到我们的php代码里还有一个mail函数这个函数也很关键;它可以重新启动一个新进程并且运载我们自定义的so库;并且达到覆盖原有共享库函数的目的;这里我的理解和文件上传的.htaccess攻击差不多,都是覆盖了原有的;接着下面就是file_get_contents进行文件内容读取了;这很明显了;nl2br方法是在新行之前加上换行符‘\n’;上传完成之后我们便可以使用include进行文件包含;包含/tmp/s1mple.php文件,让服务器运载,然后我们get进去三个参数;cmd是我们要执行的命令;outputs是我们输出的路径;sopath是我们的自定义的so库;让服务器预运载so库以达到利用so库中的system方法去执行我们cmd传入的/readflag然后/readflag进行其自身的system读取flag并且输出到output(我们自定义的路径);然后我们的php代码会file_get_contents并且echo出来;实践效果;

借极客RCE ME理解劫持共享so库(webpwn初探)_第7张图片

你可能感兴趣的:(借极客RCE ME理解劫持共享so库(webpwn初探))