渗透笔记之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
结果比较诡异,除了6465端口是熟悉的ssh服务外,5555端口和12345端口都是不认识的服务。
习惯性地用浏览器访问5555端口和12345端口,发现12345端口其实是个web服务,如下图所示,需要输入用户名和密码才能打开。
HTTP认证爆破
看到登录框当然想要爆破一下。原本打算用hydra,但不知出了什么bug,总是报错。也许是因为目标采用的是Digest access authentication而不是Basic access authentication。于是改用Kali自带的工具ncrack进行爆破:
root@kali:~# ncrack -v http://192.168.1.9:12345
很幸运地找到了用户名和密码:administrator:password,名副其实的弱密码。
输入正确的用户名和密码后看到如下图所示地页面。
照例查看源码等等,没有发现什么。但看到页面有一个图标:
下载下来看看,128像素x128像素,却有18K大,很可疑。
隐写破解
联想到unknowndevice64便是通过隐写破解找到ssh登录凭据地,于是很“合理”地怀疑上图所示地图标中也隐藏了信息。尝试破解。
首先有binwalk看看,果然有发现:
root@kali:~/Downloads/unknowndevice64_v2# binwalk index.png
正常图片的后面是两个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
发现是一个颜色配置文件,如下图所示:
查看第二个文件的类型:
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"'
找到了三个存在的路径:
- 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探索
但登录成功后的shell却十分奇怪:
x86_64:/data/data/org.galexander.sshd/files $
从没见过这样的shell提示符。输入ls命令后提示:
搜索Dropbear发现是个常用于嵌入式系统的轻量级ssh服务端程序。
输入uname命令,惊奇的发现是个android系统:
x86_64:/data/data/org.galexander.sshd/files $ uname -r
呃,好吧。查看下权限,果然不是root,但尝试用“su root”命令切换为root用户,竟然不用输密码就成功了!这绝对是我见过的最简单的提权了。
搜索flag.txt,成功找到:
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”,才搜到了。平时没有注意这些细节,导致又多费了很多时间。