概述
WSL概念最初以Astoria项目和Drawbridge项目开始,旨在在Windows系统上运行本机Android应用程序
WSL
Windows体系架构
在设计之初,微软允许u类似于Win32这种子系统运行于Windows NT内核之上,它可以为上层应用提供编程接口,同时避免应用去实现内核里的一些调用细节。NT内核的设计在最开始就可以支持POSIX,OS/2和Win32子系统。
初期的子系统都是用户态模块的实现,封装了NT系统的系统调用为应用程序提供编程接口,所有的应用程序都是PE/COFF(一些子系统封装NT系统调用的库和服务)可执行,当一个用户态的程序启动的时候,启动器就会基于可执行的头部去引用适当的子系统来满足应用程序的依赖。
后面的版本子系统替换掉POSIX层,由用户态组件提供了Subsystem for Unix-based Application(SUA),满足:
- 进程和信号管理
- 终端管理
- 系统服务请求和进程间通信
SUA的主要目的是为了鼓励应用程序移植到Windows而不会重写,这是通过POSIX用户模式的API来实现,鉴于这些组件是以用户模式构建的,因此对于fork()这样的内核模式系统调用拥有语义和性能奇偶性是很困难的。该模式需要持续的功能移植,程序就需要重新编译,维护负担大
后演变为Windows Subsystem for Linux
WSL不是一个Linux 的Bash外壳,它包含了用户模式和内核模式组件,它们共同创建一个完整的兼容性底层,用于运行和Linux类似的行为环境,且无需启动任何虚拟机。
WSL是一些组件的集合,允许原生的ELF64二进制文件在Windows上运行,它包含用户模式和内核模式组件,主要包括:
- 处理Linux实例生命周期的用户模式会话管理服务
- 根据Pico提供驱动程序,翻译Linux调用,模拟Linux内核
- Pico 进程管理原生的用户态Linux(比如/bin/bash)
Pico进程是最小进程的一种,Pico的意思是微小,常常出现在容器技术中,它的特点是有一个驱动程序与其关联,当这个进程内发生系统调用时,内核会把系统调用转给这个驱动,这个驱动被称为Pico Provider,这样的进程被称为Pico进程.小进程是Windows 8.1引入的,代表一个最小化的进程对象,它具有名字、令牌、保护级别等基本属性,但是进程空间是空的,没有PEB,也没有NTDLL,也没有句柄表。EPROCESS结构体中的Minimal为1代表该进程是最小进程。
微软为了在隔离环境中运行程序,减少开销,在单个进程的用户模式的地址空间中运行目标应用程序和操作系统,引入Pico进程。Pico进程是允许在Windows OS上运行ELF二进制文件的容器。
Windows NT系统的三种进程:
当用户以用户模式启动bash.exe时,会同时启动相关服务以及LX会话管理,该服务在用户通过命令提示符输入的bash命令和待执行的相关原生ELF64二进制程序之间承担了中介的角色。此处的Linux二进制程序是Canonical提供的用户模式Ubuntu系统的组成部分,以Pico进程的形式启动并在用户模式下运行。(未修改的Linux二进制文件放于Pico进程中)Linux系统调用就导入到Windows内核中,lxss.sys
和lxcore.sys
驱动程序负责模拟Linux内核并拦截系统调用,大多情况下,将Linux系统调用映射为NT API。例如前文提到的fork()没有对等调用
安装
每个子系统通常都有一个子系统服务进程和一个内核态驱动,对于Windows子系统,分别是著名的CSRSS.exe和Win32K.sys。对于WSL,它的组成主要有以下几个部分: 以系统服务形式运行的子系统服务进程LxssManager。
在服务管理器里,可以看到这个服务。服务的描述信息很详实,不妨引用一下:LXSS Manager服务支持运行本机ELF二进制文件。该服务提供在Windows上运行ELF二进制文件所需的基础结构。如果停止或禁用该服务,这些二进制文件将不再运行。LxssManager的核心代码是一个DLL,位于system32lxss子目录下。它使用svchost.exe作为宿主运行。
运行在内核空间的Linux子系统驱动,有两个,一个文件名叫lxss.sys,另一个叫LxCore.sys,都位于system32drivers目录中 安装Windows10,在本地直接运行bash.exe安装,速度非常慢。
先下载好trusty-server-cloudimg-amd64-root.tar.gz:https://pan.baidu.com/s/1o7BYHEq 密码: ha3w
然后使用Fiddler代理。
在tool -> options -> https 中开启HTTPS代理:
运行bash.exe,出现了:
然后在Fiddler右边窗口,点击AutoResponder 勾选下面的 Enable rules 、 Unmatched requests passthrough、Enable Latency 。 点击Add Rule 选择刚才下载的镜像文件trusty-server-cloudimg-amd64-root.tar.gz
,构造规则成功之后,再次运行bash.exe,直接读取下载好的Linux子系统:
WSL 安装成功。
BASHWARE
通过Windows10新的功能Windows Subsystem for Linux(WSL),规避杀软检测执行的恶意软件称为Bashware。很多AV并未对WSL执行恶意软件进行防护,所以该方法目前说是很可靠的攻击手法。
Bashware技术利用Windows Subsystem for Linux(WSL)的底层机制,WSL允许本机Linux ELF二进制文件在Windows上运行。该技术的关键在于Pico进程,该进程没有Windows一般进程的特性,并且具有相同功能,会造成很大的危害:
Bashware加载恶意程序的四个步骤:
加载WSL组件
Bashware入侵,首先得检查WSL特性开启与否,这个可以通过检查Pico驱动程序的状态来实现(即检查lxcore.sys
和lxss.sys
在windows磁盘存在路径)。在该功能被禁用的情况下,Bashware可使用DISM程序加载驱动程序,该方法简单,且通过后台静默运行单个命令行,用户不可见。
当Bashware加载WSL组件成功,就可以进入下一步
开启开发人员模式
开启WSL需要手动设置开发者模式,但是手动设置也就是打开注册表项:
HKLM SOFTWARE Microsoft Windows CurrentVersion AppModelUnlock AllowAllTrustedApps
HKLM SOFTWARE Microsoft Windows CurrentVersion AppModelUnlock AllowDevelopmentWithoutDevLicense
安装Linux
这时候,Bashware开启WSL,并进入了开发人员模式,但这时候Linux不包含文件系统。此时需要从微软服务器下载并解压Linux文件系统。
Lxrun.exe
是管理和维护WSL的工具程序,添加/install
参数可以安装,然后默默运行安装
Wine
攻击的方向是从Linux实例运行恶意软件攻击Windows系统,可以使用Winehq进行。Wine不是一个模拟器,而是将Windows API调用转换成POSIX(便携式操作系统接口)。Bashware使用Winehq,并预先将Wine安装到WSL中。
接下来,EXE格式需要由Wine转换,将其NT系统调用转化为POSIX系统调用,之后Pico提供的进程(lxcore.sys)会将这些POSIX系统调用回调到NT系统调用,将lxcore转换为这个过程的实际调用者。这样Windows OS就可以通过Linux执行任何恶意的payload。
攻击WSL
在WSL安装过程中,LxRun.exe
负责从微软的服务器下载和解压缩Linux文件系统,在执行下载之后,文件将被保存在%APPDAT
目录下的隐藏文件,然后继续LxRun.exe
将其解压到同一目录,任务完成之后,隐藏的文件夹包含完整的Linux系统供WSL使用。
WSL运行后,NTFS分区自动安装在Linux环境中的/mnt
中,并具有从WSL内读写和执行NTFS的能力
若是利用管理员启动Bash.exe,那么Bash.exe和其运行的子程序将按照管理员权限执行,就可以绕过UAC,通过Linux执行Windows恶意程序
最后
以上就是明理百褶裙为你收集整理的WSL体系架构的全部内容,希望文章能够帮你解决WSL体系架构所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复