自主研究新发现

前言

这里记录一些在做题过程中自己的思考和研究出来的新发现。希望能一直有下去

无参数rce新姿势

xyctf2024的pharme中,有一个在类中的rce

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
class evil{
    public $cmd;
    public $a;
    public function __destruct(){
        if('ch3nx1' === preg_replace('/;+/','ch3nx1',preg_replace('/[A-Za-z_\(\)]+/','',$this->cmd))){
            eval($this->cmd.'isbigvegetablechicken!');
        } else {
            echo 'nonono';
        }
    }
}

这里绕过其实就是判断你的cmd中是否只有字母、下划线和括号

也就是无参数rce。

这里在看wp的时候发现有师傅用eval(end(getallheaders()));的写法进行写shell,之后只要在http头里的最后一个位置写一个cmd: phpinfo();就行

(大致意思为获取所有http头,然后返回最后一个http头给eval函数,妙啊。)

然后我马不停蹄的去ctfshow中做实验,但是结果却透心凉

1
2
3
4
5
6
7
8
9
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/[0-9]|\~|\`|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\=|\+|\{|\[|\]|\}|\:|\'|\"|\,|\<|\.|\>|\/|\?|\\\\/i", $c)){
        eval($c);
    }
        
}else{
    highlight_file(__FILE__);
}

因为end() 的参数是按引用传参,只能接收“变量”。把函数返回值直接丢给 end()(比如 end(getallheaders()))会报 “Only variables should be passed by reference”,从而拿不到值;而你又被正则拦了 $,没法先赋给变量。

也就是说,不能用end()

但是我们可以利用不按引用取值的聚合函数,Max()等,从http头里选一个出来

c=eval(max(getallheaders()));再在http头里添加X-CMD: ~0;phpinfo();

0在php中是合法的表达式,而且的ascii码值大于z,基本上一定会被Max()选中

结果如下

image-20250907225428027

也不是什么很nb的东西,而且也不是靠自己发现的,几乎都是ai说的,但是也很有成就感。

内网穿透反弹shell

这是在无参数rce之前研究的东西,不过那时候不太完善。

在xyctf2024的ez?Make题目中,用的是反弹shell的方法绕过。本来想用自己研究出来的内网穿透反弹shell来解决,但是我的内网穿透软件cpolar穿透后的公网ip是带cpolar这个字符的,然后a又是被ban的字母。。。。

然后这也不是第一次遇到这种问题,很多题目都有一些绕过,反弹shell不是纯数字都很有可能被ban。

一度觉得研究出来的这东西没啥作用。。

但是转折点就在写这道题ez?Make的过程中,我突发奇想,有域名应该就有ip地址啊,有ip不就可以弹shell了?!

然后就抓紧去找了一个域名查ip的网址

域名反查IP工具 - 域名IP查询 - 站查查

image-20250908161202541

然后抓紧去试了一下

image-20250908161241872

真的成功了!

所以之后反弹shell再也不需要vps,不知道无回显xxe或者wget那种涉及到vps上的文件的这种反弹shell能不能成功,这里还需要再多做尝试。不过也算是一个重大突破(实际上就是吧域名换成ip了。。。。。)

总结一下,内网穿透反弹shell,首先需要你有一个Linux虚拟机,然后有一个可以进行内网穿透软件(cpolar、花生壳等等)

在linux命令行开一个ifconfig,看一下虚拟机的ip,然后在内网穿透软件中选用tcp,调好端口

image-20250908162152594

然后用公网域名在域名解析网站换成ip地址,

这样就可以进行反弹shell了

解决连接openvpn之后不好与kali交互导致CS无法上线的问题

问题

在打cyberstrikelab的靶场的时候,需要连接openvpn

openvpn只能连接一个机子(连了主机就无法连虚拟机)

但是可以通过虚拟机的net模式使虚拟机通过主机访问到openvpn的靶机

但是问题就在于,主机连了openvpn之后,网络结构发生变化,导致无法与虚拟机通讯。

然后CS的服务端需要linux系统,也就是说,我需要靶场能够访问到我的kali虚拟机。但是openvpn是连接在主机上的,靶场只能连接到我的主机,我的主机还连接不到虚拟机

解决

首先虚拟机可以开一个新的网卡(仅主机模式)

image-20260121000704292

这样在主机连接openvpn的情况下也能与虚拟机通信

然后进行端口转发(记得查看kali仅主机模式网卡的ip)

1
2
3
4
5
6
7
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=50050 connectaddress=192.168.111.129 connectport=50050

netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=50051 connectaddress=192.168.111.129 connectport=50051

多开几个ip当监听器

netsh interface portproxy show all  

image-20260121000834816

然后在kali中运行

1
2
3
./teamserver 172.16.233.2 123456

#这一步的ip是openvpn连接后给的ip,因为最后是需要靶机访问这个ip的

主机启动CS,这里启动CS就是开在自己主机的,也可以连接虚拟机ip

image-20260121001149700

然后就可以在有openvpn靶场中上线CS

image-20260121001831263

也可以使用工具转发端口

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计