linux
文章平均质量分 70
inquisiter
这个作者很懒,什么都没留下…
展开
-
CVE-2021-22555利用过程翻译
原文链接:https://google.github.io/security-research/pocs/linux/cve-2021-22555/writeup.html本文基本属于翻译,原文解释的很清楚,我按自己的理解来记录下。漏洞位于netfilter。原作者利用此漏洞获得了两万美金的奖励。漏洞比较老,存在将近15年之久,从这个漏洞来看,内核其实类似的漏洞应该还有不少。今年貌似爆出了类似的漏洞 https://github.com/Bonfee/CVE-2022-0995 。今天又看到一个:htt翻译 2022-03-30 16:19:54 · 1244 阅读 · 0 评论 -
libmtp关于MTP协议的实现
我这里采用了1.1.7的libmtp。但其实计算机上实现这个协议的服务还有很多,而且还不一样。但理论上原理一样。发送文件的流程继续上一篇的逻辑。我在example里发现发送文件的协议逻辑。int sendfile_function(char * from_path, char *to_path){ filesize = sb.st_size; filename = basename(from_path); parent_id = parse_path (to_path,files,fol原创 2022-01-17 16:29:35 · 1776 阅读 · 3 评论 -
MTP手机端实现过程
上一篇基本把pc端连接mtp协议走的内核路径过了一遍,还有部分细节不完善,但整体流程还是走的usb驱动逻辑。这是后话。简而言之,pc在内核平没有专门为MTP设计什么东西。解析MTP协议的逻辑还是放在了用户态。通过D-bus连通usb驱动,对数据进行mtp协议解析。为了详细了解mtp具体做了什么,我从手机端研究了MTP在内核中的实现。一、/dev/mtp_usb真正意义上的MTP驱动位于手机一侧。注册了 /dev/mtp_usb字符设备。read write 接口实现了控制命令的传输和写入。也就是说当原创 2022-01-14 16:04:51 · 1481 阅读 · 0 评论 -
usb通信的核心原理(mtp 协议部分研究 pc端)
原本以为是用户态的文件系统,不过后来研究是直接利用内核usbfs进行了文件映射。大致在usb_hcd_map_urb_for_dma看了下堆栈的情况:[ 580.372069] ? usb_hcd_map_urb_for_dma+0x5/0x4b0[ 580.372070] ? usb_hcd_submit_urb+0x164/0x2e0[ 580.372072] ? usb_hcd_map_urb_for_dma+0x5/0x4b0[ 580.372074] ? usb_hcd_s原创 2022-01-04 09:54:53 · 1571 阅读 · 0 评论 -
USB设备管理过程
驱动关于usb整体流程时序图:drive device 分别attach到bus总线上,probe用来使drive驱动device可以看到,attach后的device会找到对应的drive,并调用相应的probe函数。关键数据结构代码基于 内核5.11这里以usb设备为代表,但其他总线设备道理类似。device_attach函数中会有一个查找对应驱动的函数,算法大致是遍历总线,然后对device 和 drive对应的数据结构进行对比。通知用户态为了实时的通知用户态内核的设备管理原创 2021-11-29 10:27:16 · 3645 阅读 · 0 评论 -
文件系统和块设备驱动
文件系统和设备驱动的关系块设备驱动应该是除了硬件驱动距离硬件最近的驱动系统,构成了文件系统底层基石。一个基本的块设备驱动包含以下步骤:① 分配、初始化请求队列,绑定请求队列和请求函数。② 分配、初始化gendisk,给gendisk的major、fops、queue等成员赋值,最后添加gendisk。③ 注册块设备驱动。在块设备驱动的模块卸载函数中通常需要与模块加载函数相反的工作:① 清除请求队列。② 删除gendisk和对gendisk的引用。③ 删除对块设备的引用,注销块设备驱动。原创 2020-11-23 15:29:03 · 1513 阅读 · 0 评论 -
CVE-2021-26708 利用四字节释放特定地址,修改内存
看个漏洞吧,挖洞工具还没掌握到精髓。http://www.hackdig.com/04/hack-339887.htm漏洞原因vsock_stream_etssockopt() {struct sock *sk; struct vsock_sock *vsk; const struct vsock_transport *transport; /* ... */ sk = sock->sk; vsk = vsock_sk(sk); trans原创 2021-09-17 16:38:58 · 513 阅读 · 0 评论 -
linux内核泄露地址的方式
早些的时候可以利用dmesg通过缺页错误来泄露内核地址,但新一点的内核把这个修复了。最近看了下,遇到了目前常用的方式,详细分析下。shmat大部分搜到的记录是利用struct shm_file_data { int id; struct ipc_namespace *ns; struct file *file; const struct vm_operations_struct *vm_ops;};#define shm_file_data(file) (*((st原创 2021-09-16 15:54:11 · 497 阅读 · 0 评论 -
kernel exploit 有用的结构体
一、可用于 Leak/AAR/AAW/RIP劫持的结构体说明目前缺少kmalloc-8、kmalloc-16、kmalloc-64、kmalloc-512结构体。shm_file_datasize: 0x20 kmalloc-32内核基址:可泄露。其ns、vm_ops指针可以泄露heap:可泄露。file指向堆区域stack:不能泄露劫持RIP:不能产生:调用shmat()映射共享内存释放:shmctl() ??备注:尝试过重写vm_ops,但是没发现调用fake_vtable函数指转载 2021-09-16 10:54:52 · 593 阅读 · 0 评论 -
syzkaller--->syscalldescription语法
syzkaller本身是个较强大的fuzz工具,使用方法较简单, syz-manager -config my.cfg但难点是编辑特异性的语法魔板,用于特定模块和系统调用的fuzz。公开git上已经包含了说明,但感觉比较晦涩,先按字面意思理一下syscall_descriptions_syntax.md文本1syscall_descriptions_syntax.mdsyscallname "(" [arg ["," arg]*] ")" [type] ["(" attribute*原创 2021-09-15 15:52:08 · 941 阅读 · 0 评论 -
gvisor实现的容器中启动新内核
gvisorgvisor是google发布的安全容器。gVisor 工作的核心,在于它为应用进程(用户容器),启动了一个名叫 Sentry 的进程。 而 Sentry 进程的主要职责,就是提供一个传统的操作系统内核的能力,即:运行用户程序,执行系统调用。所以说,Sentry 并不是使用 Go 语言重新实现了一个完整的 Linux 内核,而只是一个对应用进程“冒充”内核的系统组件。(这段是抄的)作为安全容器,利用容器中的内核来隔离大部分内核攻击,确实是一个不错的想法,然而这个新内核属于定制内核,估计很多原创 2021-08-02 17:27:34 · 656 阅读 · 0 评论 -
perf 性能分析,火焰图简单试用
perf工具perf在内核源码中有包含,位于tool/perf目录下面 make install安装后可用火焰图生成工具git clone https://github.com/brendangregg/FlameGraph.giton-cpu 火焰图用于显示cpu耗时的百分比图谱生成火焰图lier@lier-VM:~/src/perf_t$ sudo perf record -g -F 99 cp -r /home/lier/src/linux-source-5.4.0 /home/lie原创 2021-07-15 19:01:29 · 736 阅读 · 0 评论 -
文件防火墙redirfs
概述文件防火墙可以用来过滤文件操作,包括不限于open read write close等操作,相对于lsm syshook inline hook劫持形成的防火墙稳定性和能力都更为强大,虽然目前驱动好像卸载存在一定问题,但对于文件的操作具有强大的过滤能力。核心原理既然要过滤文件行为,肯定少不了函数劫持。redirfs 采用对于 vfs 和真实文件系统之间嵌入驱动redirfs的方式。简单讲struct inode 、struct dentry、struct file都属于vfs层面的概念,都具有各中原创 2021-07-12 16:06:48 · 915 阅读 · 0 评论 -
linux 内核解压反编译符号恢复
linux内核分析通常需要编译带符号的文件或安装带符号的内核才方便分析,这里记录下直接解压vmlinuz从导入 sudo cat /proc/kallsyms实现二进制分析linux内核解压内核lier@lier-vm:~$ sudo bash//1查找压缩文件位置 位于1f 8b 08root@lier-vm:/home/lier# od -t x1 -A d code/vmlinuz-5.8.0-55-generic | grep "1f 8b 08"0016800 8d 80 00 02原创 2021-06-30 15:24:37 · 500 阅读 · 0 评论 -
selinux概括总结
selinux是利用lsm劫持程序的行为的mac访问审计方式,具体实现原理这里不讨论。核心原理就是主客体通过策略规则限定程序访问范围。安全上下文是整个安全机制的重要概念,分为用户,角色,类型和级别:1、用户(user)unconfiged_u:不受限用户system_u:系统进程在 targeted policy 中 users 不是很重要;在strict policy 中比较重要,所有预设的 SELinux Users 都是以 “_u” 结尾的,root 除外。2、角色(role)O原创 2021-06-18 16:07:32 · 163 阅读 · 0 评论 -
runc rootless模式代码解析---创建dev设备节点文件
runc rootless模式代码解析本来以为user namespace映射了root权限后可以直接mount /proc /dev, 实现容器隔离。但是实际测试发现,/dev 并不能在userns中的root权限mount udev 到自身的/dev。但实际上, docker上是实现了类似的功能的,所以这里研究了相应的功能。docker 启动采用了containerd 和runc交互的形式,实现容器的创建。而runc可以直接启动利用rootless模式启动普通用户映射root权限的能力,并生成/dev原创 2021-03-15 15:37:30 · 520 阅读 · 0 评论 -
AFL模糊测试
一、AFL基于覆盖率, qemu llvm等多项技术的fuzzing工具https://github.com/google/AFL二、使用方法2.1安装makemake install2.2编译目标程序2.2.1 程序是用autoconf构建,那么此时只需要执行如下即可CC=/usr/local/bin/afl-gcc CXX=/usr/local/bin/afl-g++ ./configure --disable-sharedmake cleanmake2.2.2 程序不是用a原创 2021-02-07 16:57:17 · 1009 阅读 · 0 评论 -
sudo CVE-2021-3156 攻击利用
漏洞成因攻击过程 char *LC = calloc(0x3000,1); strcpy(LC, "LC_ALL=C.UTF-8@"); memset(LC+15, 'C', size); envp[envp_pos++] = LC;简单讲,本身entry 和service是连在一起的,但是我们提前构造了0xc0的chunk 。 使entry分配到了oxc0的块上,而service的分配由于oxc0的块用完了会分割原始的chunk. 造成usr_arg和s原创 2021-02-05 17:54:40 · 228 阅读 · 0 评论 -
mnt namespace隔离文件原理
mnt namespace的核心数据结构如图一. 是mnt_namespace隔离文件的核心数据结构(内核3.10.0)。通过对open代码研究,除了对chroot的current->fs->root进行的处理。并没有其他对文件目录的其他修改。那么此处产生的问题在于如何在不同mnt中通过相同的文件名访问位于磁盘不同位置的文件。mount 的思考这要从mount格式化挂载目录开始说起。每个文件系统对应一个super_block。格式化分区意味着用对应的sb dentry innode组织了原创 2021-01-23 16:39:18 · 1066 阅读 · 0 评论 -
Java jvm启动过程 及 如何hook java代码
create_vm函数启动虚拟机add函数,将线程加入到线程队列create函数,创建虚拟机线程“VMTHread”vm_init——globals函数,初始化全局数据结构init_globals函数,初始化全局模块LoadClass函数,加载应用程序主类jni_CallStaticVoidMethod函数,实现对Java应用程序的主方法的调用jni_DetachCurrentThread函数jni_DestroyJavaVM函数,销毁JVM....原创 2021-01-04 11:44:36 · 936 阅读 · 0 评论 -
intel 虚拟化手册解读
进入根模式:原创 2020-12-11 15:50:21 · 290 阅读 · 0 评论 -
namespace的进一步的学习认知及docker逃逸
35C3 CTF这里参照了https://www.secrss.com/articles/15269题目大体意思是,利用nsjail创建沙箱nsa,映射了user到root的ns空间权限。/tmp/flag被以只读挂载到/flag, procfs挂载到读写。原因就是,子ns空间对文件的操作需要重新挂载文件,但权限只能是父进程ns的资源。也就是说,新的沙箱其实可以访问 /flag文件。 但之后有个namespace的文件,执行后会将新进程加入到nsa,并降低了权限到1。[lier@localhost原创 2020-12-11 15:22:34 · 552 阅读 · 0 评论 -
强大的硬件虚拟化
一、vt核心vmcs前几篇介绍了vt强大的无察觉劫持页表hook的能力,kvm的大致原理,但vt的能力远远不止于此。因为实现vt托管的操作系统,将可以做到指令级的管控。甚至直接基于vt形成调试器,如果用来调试内核,将会将会大大提高稳定性。整个vt核心全部位于vmcs的 状态域。根据intel 开发手册第三卷,控制域的核心部分分为1.guest field ,.2 host field , 3.vm-excution control field, 4.vm-Exit control field, 5.vm原创 2020-10-29 17:20:16 · 3258 阅读 · 0 评论 -
硬件虚拟化之vmm接管异常中断
上一篇讲到了虚拟cpu的构建过程,接下来就要利用vmm接管vcpu的中断,异常等行为。一、vcpu退出状态记录struct kvm_vcpu *vcpu_k;kvm_run->exit_reason/* for KVM_RUN, returned by mmap(vcpu_fd, offset=0) */struct kvm_run { /* in */ __u8 request_interrupt_window; __u8 padding1[7]; /* out */原创 2020-09-19 10:55:01 · 725 阅读 · 1 评论 -
KVM 代码详解
struct kvm { struct mutex lock; /* protects the vcpus array and APIC accesses */ spinlock_t mmu_lock; struct rw_semaphore slots_lock; struct mm_struct *mm; /* userspace tied to this vm */ int nmemslots; struct kvm_memory_slot memslots[KVM_MEMORY_SLO.原创 2020-08-26 11:54:21 · 923 阅读 · 0 评论 -
cve-2019-15666 xfrm_policy
这个漏洞比较强,官方说明漏洞只会导致拒绝服务攻击,但实际上利用得当可以实现提权。影响范围3.x-5.x漏洞成因,数组越界。需要需要插入用户定义的 index timer set。XFRM_MSG_NEWSA请求的路劲添加policy。添加policy需要通过verify_newpolicy_info的认证。但漏洞版本认证缺陷。https://duasynt.com/blog/ubuntu-centos-redhat-privesc--- a/net/xfrm/xfrm_user.c+++ b/n原创 2020-09-09 11:38:59 · 1046 阅读 · 4 评论 -
kvm 监控内存,替换页表(linux版的win VT晶核)(这个整复杂了,不用小内核也可以实现,留着吧,主要记录了bootLoad的启动过程)
kvm 监控内存,替换页表等问题一、如何利用kvm 监控整个linux系统# 进入 KVM 代码目录cd /root/kernel-src/kvm-2.6.32/arch/x86/kvm# 开始编译 make -C /lib/modules/`uname -r`/build M=`pwd` cleanmake -C /lib/modules/`uname -r`/build M=`pwd` modules# 拷贝编译结果出来,并使用cp *.ko /root/kvm/tools/.原创 2020-08-17 20:17:24 · 612 阅读 · 5 评论 -
dwarf 栈解析格式小结
eh_frame所有的dwarf都在eh_frame的节当中,具体格式如下:一般一个cie对应多个fde,一个fde对应相应函数的寄存器恢复信息,不仅仅是栈信息。当我们拿到eh_frame后,就需要解析cie和fde.(http://dwarfstd.org/doc/DWARF4.pdf) 官方文档有很详细的东西,不适合入门感觉。根据结尾的例子来分别讲解cie和fde.common information entry encodingcie : common information entr原创 2020-08-04 11:51:01 · 3307 阅读 · 0 评论 -
linux信号处理
linux在构造信号处理过程中面临内核态触发用户态代码的问题。当信号到达内核,内核不可能直接执行用户态的代码。所以,内核利用的方式是将用户态进程的栈帧扩展,然后直接返回用户态,利用伪造的栈信息执行信号量。这是内核给用户态的程序提供的一个接口。arch/arm64/kernel/vdso/vdso.lds.SENTRY(__kernel_rt_sigreturn) .cfi_startproc .cfi_signal_frame .cfi_def_cfa原创 2020-07-01 14:28:53 · 1878 阅读 · 0 评论 -
sudo 控制权限原理
核心在于euid的控制,euid决定于可执行文件创建者的s标志位。如果文件拥有s标志位,那么运行次可执行文件时,此进程的euid将会是创建者的id。如果没有s标志位,那么运行的可执行文件euid将是运行者的id。所以sudo 命令在其他用户登录的时候,就可以利用euid来执行root权限。所以,如果我们伪造一个不用密码的sudo, 是不是就可以直接提权了呢。答案是不可以。伪造的sudo命令必须由root用户创建,所以我们根本没有权限创建。我们需要利用chmod u+s增加文件的属性。还是需要roo原创 2020-06-30 16:45:32 · 661 阅读 · 0 评论 -
VT技术和kvm
最近一直在是看VT和kvm技术相关的问题。在网上查了很多资料。很多直接从代码将,各种流程图和代码贴出来。但突然感觉代码不能直接这样学。应该带着思考来。这里列出几个有疑问的点。VT技术如何实现多个系统直接相互不影响这个应该就是通过vmm在跟模式和非根模式直接切换,对操作系统进行内存IO限定的。windows Hyperplatform 为什么可以实现对PG内存保护的绕过https://bbs.pediy.com/thread-225797.htm我个人的理解在于vm_exit行为上的劫持。两个页面原创 2020-05-31 11:32:42 · 618 阅读 · 0 评论 -
内联jmp使用方法
#include <libunwind.h>#include <stdio.h>void foo() { int b = 3; int c = 4; char *str = "next hello \n"; printf("foo %d %d %s",b ,c ,str);}void bar() { int a=2; char *str="hello world \n"; printf("bar %d %lx %s", a,foo, str);原创 2020-05-25 17:10:35 · 884 阅读 · 0 评论 -
CVE-2019-11815内核竞态漏洞推测
这个本来向看下利用过程,奈何没找到poc. 感觉自己其实也懂不少原理了,来推测下吧。https://www.freebuf.com/vuls/208256.html补丁位置根据官网漏洞信息,可以知道此漏洞大概是个uaf之类的漏洞。static void rds_tcp_kill_sock(struct net *net){ struct rds_tcp_connection *tc,...原创 2020-04-24 15:09:52 · 444 阅读 · 0 评论 -
CVE-2018-18955user_name_space空间越权漏洞
https://www.exploit-db.com/exploits/45886漏洞原理这个洞前前后后看了好几遍,感觉是明白了。大概是在用户命名空间中NS1创建root用户,然后创建嵌套命名空间NS2。在NS2中映射大于5个id0 0 11 1 12 2 13 3 14 4 15 5 995两个原因造成越权。1.sort_idmaps会复制forward map的映射队...原创 2020-04-20 12:06:14 · 1157 阅读 · 0 评论 -
内核漏洞利用方法
堆喷//CVE-2016-8655#define BUFSIZE 1408char exploitbuf[BUFSIZE];void kmalloc(void){ while(1) syscall(__NR_add_key, "user","wtf",exploitbuf,BUFSIZE-24,-2);}原创 2020-04-14 19:32:12 · 266 阅读 · 0 评论 -
elf 格式分析----函数解析
https://github.com/elfmaster/libelfmaster这里是个不错的解析elf的c代码。寻找导出函数对应偏移我感觉文字没有代码明白,看下别人怎么写的,立马明白了。mem指向elf文件加载的地址连续空间。typedef struct{ unsigned char e_ident[EI_NIDENT]; /* Magic number and other i...原创 2020-04-13 17:06:27 · 1500 阅读 · 0 评论 -
linux 进程切换
内核中栈的管理情况如上,tack->pt_regs指向保存的用户态栈信息。thread保存的是内核栈的信息。x86本身设计了自带的tss任务切换方式,管理特权进程的切换。但linux系统采用了新的软件机制。摒弃了大部分tss的用途,设计出了以cpu为基准的tss特权切换方式。每个cpu实现一个tss,当特权切换发生时,大部分寄存器采用软件实现的方式保存和调用。...原创 2020-04-07 11:41:04 · 458 阅读 · 0 评论 -
内核进程管理启动rest_init
pid = kernel_thread(kernel_init, NULL, CLONE_FS);kernel_init/*ramdisk_execute_command a.如果命令行参数中指定了“rdinit=...”,则ramdisk_execute_command等于这个参数指定的程序。 b.否则,如果/init程序存在,ramdisk_execute_command...原创 2020-03-06 17:28:20 · 262 阅读 · 0 评论 -
linux 内核中的Makefile
init-y := $(patsubst %/, %/built-in.o, $(init-y)) ## 表示将$(init-y)列表中"/"替换为"/built-in.o",也就是最终init-y == init/built-in.oinclude $(srctree)/arch/$(SRCARCH)/Makefilevmlinux映像生成的一般规则综述通过以上分析路...原创 2020-03-06 11:06:17 · 379 阅读 · 0 评论 -
linux 内核启动
asmlinkage __visible void __init start_kernel(void){ char *command_line; char *after_dashes; set_task_stack_end_magic(&init_task); smp_setup_processor_id(); debug_objects_early_init(); c...原创 2020-03-05 15:06:41 · 228 阅读 · 0 评论