渗透笔记之unknowndevice64_V2

背景

上次玩了unknowndevice64,后来听说还有V2版本,于是也下载下来玩玩。

本文较为完整地记录了我对其进行渗透的全过程。该靶机较为简单,但由于我误入歧途,所以还是花了几天时间才完成从boot到root。

准备环境

首先下载靶机镜像,得到文件unknowndevice64-V2.0.ova,大小为1.59G。然后在VirtualBox中导入它,观察其配置,发现只有一块虚拟网卡,修改其连接方式为桥接网络。在同一虚拟网络中还有一台IP地址是192.168.1.200的Kali Linux虚拟机(以下简称Kali)作为攻击者。

在Kali中用Nmap扫描192.168.1.0/24网段,确定靶机的IP地址为192.168.1.9。

端口扫描

先用nmap扫描端口,吸取上次的教训,加上参数“-p-”:

root@kali:~# nmap -Pn -n -sV -p- 192.168.1.9

Nmap扫描结果

结果比较诡异,除了6465端口是熟悉的ssh服务外,5555端口和12345端口都是不认识的服务。

习惯性地用浏览器访问5555端口和12345端口,发现12345端口其实是个web服务,如下图所示,需要输入用户名和密码才能打开。

Web界面-需登录

HTTP认证爆破

看到登录框当然想要爆破一下。原本打算用hydra,但不知出了什么bug,总是报错。也许是因为目标采用的是Digest access authentication而不是Basic access authentication。于是改用Kali自带的工具ncrack进行爆破:

root@kali:~# ncrack -v http://192.168.1.9:12345

ncrack输出结果

很幸运地找到了用户名和密码:administrator:password,名副其实的弱密码。

输入正确的用户名和密码后看到如下图所示地页面。

网页内容

照例查看源码等等,没有发现什么。但看到页面有一个图标:

网页图标

下载下来看看,128像素x128像素,却有18K大,很可疑。

隐写破解

联想到unknowndevice64便是通过隐写破解找到ssh登录凭据地,于是很“合理”地怀疑上图所示地图标中也隐藏了信息。尝试破解。

首先有binwalk看看,果然有发现:

root@kali:~/Downloads/unknowndevice64_v2# binwalk index.png

binwalk输出

正常图片的后面是两个Zlib压缩数据。

提取压缩数据到文件中:

root@kali:~/Downloads/unknowndevice64_v2# dd if=index.png of=data1 skip=85 count=2672 bs=1
root@kali:~/Downloads/unknowndevice64_v2# dd if=index.png of=data2 skip=2757 bs=1

提取压缩数据到文件中的命令截图

然后再写一个Python脚本解压它们。Python脚本文件名为unzlib.py,内容如下:

import sys
from zlib import decompress

input_file = sys.argv[1]
output_file = sys.argv[2]

with open(input_file, 'rb') as f:
    input_data = f.read()
output_data = decompress(input_data)
with open(output_file, 'wb') as f:
    f.write(output_data)

用这个脚本解压提取出的数据:

root@kali:~/Downloads/unknowndevice64_v2# python unzlib.py data1 out1
root@kali:~/Downloads/unknowndevice64_v2# python unzlib.py data2 out2

解压提取出的数据

提取成功,感觉胜利就在眼前。查看第一个文件的类型:

root@kali:~/Downloads/unknowndevice64_v2# file out1

file命令输出

发现是一个颜色配置文件,如下图所示:

颜色配置文件

查看第二个文件的类型:

root@kali:~/Downloads/unknowndevice64_v2# file out2
root@kali:~/Downloads/unknowndevice64_v2# strings out2
root@kali:~/Downloads/unknowndevice64_v2# binwalk out2

命令输出

发现是纯数据。

用二进制编辑器查看其内容:

root@kali:~/Downloads/unknowndevice64_v2# hexeditor out2

二进制编辑器查看其内容

有大量的四字节重复,看着像是bmp图片。一个像素点4bit有两种格式:

  • RGBA (4×8-bit pixels, true color with transparency mask)
  • CMYK (4×8-bit pixels, color separation)

在写一个Python将out2转换成bmp图片,脚本名为img.py,内容为:

import struct
from PIL import Image


def byte2int(byte):
    return struct.unpack('>HH', b'\x00' + byte + b'\x01\x01')[0]


def save_img(width):
    with open('out2', 'rb') as f:
        data = f.read()
    length = len(data)

    im = Image.new('RGBA', (width, length//width//4+1))    # or CMYK

    n = 0
    w = 0
    r = 0
    while True:
        if n+4 > length:
            break
        p = (byte2int(data[n]), byte2int(data[n+1]), byte2int(data[n+2]), byte2int(data[n+3]))
        im.putpixel((w, r), p)
        n += 4
        w += 1
        if w % width == 0:
            w = 0
            r += 1

    im.save('out_{}.png'.format(width), 'PNG')

save_img(126)    # 边长126是猜测

用此脚本将out2转换为bmp图片:

root@kali:~/Documents/unknowndevice64_v2# python img.py

转换成功,然后结果却如下图所示,没有任何用处。

提取出的图片

Web目录爆破

最后实在没辙了,只好重新开始信息收集。

考虑进行Web目录爆破。由于需要认证,所以开始爆破前现在浏览器中登录一次,提取出HTTP请求头中的登录凭据,然后再用dirb进行爆破,并用“-H”参数添加登录凭据:

root@kali:~# dirb http://192.168.1.9:12345/ -H 'Authorization: Digest username="administrator", realm="Secret Zone", nonce="6fOzh9JwfhAuPld55TEUkdYPW+U4u0Z6Bnvz+HZmVNU", uri="/robots.txt", algorithm=MD5, response="4e43458ad13f181568f2c4709d216773", qop=auth, nc=00000005, cnonce="c1e850a15732739b"'

dirb命令输出

找到了三个存在的路径:

  • http://192.168.1.9:12345/index.html (CODE:200|SIZE:28577)
  • http://192.168.1.9:12345/info.php (CODE:200|SIZE:2310)
  • http://192.168.1.9:12345/robots.txt (CODE:200|SIZE:34)

其中/index.html是首页已经看过了,/robots.txt的内容是:

User-agent: *
Disallow: /info.php

看来关键就在/info.php了。

info.php

在浏览器中访问http://192.168.1.9:12345/info.php,结果直接将文件下载下来了。查看其内容为:

<?php                                                           
echo "ssh";                                                     

print "                                                         

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,66DC76DE3D5936CDE0A0B5F853493E33

91untRTob5/z64lo3dtMF55jWzXR/ctWMlt6GRJsRhhPsHSiaJjxwL+/5wUvLM/K
YM9IwB3bT3eYHZ4UP2I0qjDuJxK+6scMZvdpJh7KKeql8AJh1TpZrsSvbXkSIDHo
C8Lp+w26LQMhCAw9LgT0BO9qEL1ebC9zzbqTr0/fnzeq12ZDfHCdvkieenLF9VUk
UUsRyytoOgOrG0wb5uKi0hGEZTgVVwfiE/wyxSi3JIonzqcipOCnCEv3qsGq5ep/
/6oALAS2DZt9fGbtvhHsz/YxP7uGxKswMPTF5NB5rWaZ7K39CJNsKDawyivmjLtx
RiTPR7oVkRUZssmL4r5cHFaKQlNw9yqcBo/Nnt3dU/W9q4eSyKrzfeMWizVhEtkG
QataheYvz+XOJo0HMzhnkoomXZ8Zx/vbg0FKm4u67gF4bzqD88vDLkT+mclxPl8J
4fASLyij+Ry9C/k+a62bWHtk/317jqXsdBY3IIC4BeoDnMDBlduB1P19YiI9q9fI
iQymoK47ebtXw2sk5ghjOfFqjxTDwPx1Qqiz5K5Sk4n2n+09OxBzXan3dslqBDt4
dUoCYBYFkGNkZnQO0cvPsqsNj/7awGmvpol71KU/CK1mt71dAPForfhf/1sm5DcX
AhPXXhDjUMKXn0gQXdeHYWiN9UJFN1lxOAWdQMgO6QMXzM9xlIFw+XrPERR0jl5c
f97YlNVydNnVZFNpAOkbWMl9KJu7EwGEQzAK3WaDiP5FA4YljUOwITvZ8wB17Kv6
aF67UzZbowOAOzmVQxrDBPn2MssKWGCm5H9lZLrt9jvS39oT97H5/o/Tq7tSGflh
4F/RKeUMxv060ETLwaYywtHR2qP2EM2Ixc3jcXxkHdJzb1R6q5cAAsnZAWe/B/7F
q5R3B4593leDyEO/12mEaAnioCNa14cEBDF2CYDFfSr/YD4kfJ0mLYJHTA/10acb
UNgvvrT390pi/ESpHKkobE8+qf7w/zp8F4pGAw7rJmmC4YCXFeMQkHsHW5wjYb/o
yzjW1OpW468xcIKNhhnrMiP4ot1awCsmMoEb9VYhpAxIGtTbON+6x680cCRSLP3r
+2AqrAnXSYJmNPrLJVhZLFouXAmok5U4CPJ0JVspH8tkSwMbIJc9rUWtFfZqUjdF
1GpjnoT12F+GmtBAyXCrP0SuDMvO3xa7A62LIETC8IqET7Yo1VpOhsYzlwpQ1698
Gf8HbTdw/2lYedN0xCv4f1qHxVHnTv1E5nDR28eUGjlYNFo5u3R6XVQUuJqg+MCl
7tdLDisXfDuwz0r4FGLGKIhqZqC9zOKn/p5t4h+hanX6Sh6ATw3RsN5aSXERrbJP
UppqiARYZkHzxlubVGK2nAyKTEF9musc4airNDxs3Dfb75OKDbGbhVyFcuNxES5r
W0N0b3gKSxGgqczFG5wZhdHwUIpi1ueNFNBtoHyqd21JPg3aCoYI8XiGRGYxGpnl
JWhnQuu53DzZVcxeBy+LTL42VKafjUUA1OCIX9cAg2Vz8RYxrV8yy0d9R6uA7ByZ
G1uunv0K+QCNzHjyoc6FnGwTi4rTWh9o074XbqswOcdWNRitBDvg+9diBgKvvUw4
-----END RSA PRIVATE KEY-----                                                                

";                                                              

//unkn0wnd3v1c3-64 

?>

竟然是一个私钥,还有一个看上去像是密码的东西“unkn0wnd3v1c3-64”。将私钥保存到文件~/.ssh/id_rsa中,并且设置该文件的权限为0600,然后用ssh登录目标主机,果然需要输入私钥的解密口令,尝试输入“nkn0wnd3v1c3-64”,登录成功,如下图所示。

ssh登录

SSH探索

但登录成功后的shell却十分奇怪:

x86_64:/data/data/org.galexander.sshd/files $ 

从没见过这样的shell提示符。输入ls命令后提示:

ls命令输出

搜索Dropbear发现是个常用于嵌入式系统的轻量级ssh服务端程序。

输入uname命令,惊奇的发现是个android系统:

x86_64:/data/data/org.galexander.sshd/files $ uname -r

uname命令输出

呃,好吧。查看下权限,果然不是root,但尝试用“su root”命令切换为root用户,竟然不用输密码就成功了!这绝对是我见过的最简单的提权了。

whoami命令输出

搜索flag.txt,成功找到:

拿到flag

flag中的两句话也很有趣:

It is fairly open secret that almost all system can be hacked, somehow.
It is a less spoken that such HACKING has actually gone quite main stream.

总结

隐写破解

开始时以为“Zlib compressed data”就是zip文件的意思,便用unzip解压提取出的加密数据,怎么解压都不成功。为此花了很多时间研究zip格式,没有任何用处。到第二天,才忽然开悟,“Zlib compressed data”只是单纯对数据的压缩,直接解压缩就行。

信息收集

如果是按照渗透测试的步骤,先进行扎实的信息收集,就不会陷入到隐写破解的歧途中而浪费很多时间了。

此外看了Walkthrough才知道5555端口是Android的调试端口,Nmap并没有能够准确地识别出来。我过于依赖工具了。

find命令的-name参数是做全匹配搜索的。一开始以为是模糊匹配,搜索“flag”,怎么也搜不到,后来搜索“flag.txt”,才搜到了。平时没有注意这些细节,导致又多费了很多时间。

发表评论

电子邮件地址不会被公开。 必填项已用*标注